1+ #! /bin/bash
2+
3+ # ==========================================
4+ # 主控脚本
5+ # ==========================================
6+
7+ # --- 1. 路径定义 ---
8+ BASE_DIR=$( cd $( dirname $0 ) ; pwd)
9+ SRC_DIR=" $BASE_DIR /src"
10+ CONFIG_FILE=" $BASE_DIR /config.toml"
11+ LOG_FILE=" $BASE_DIR /service.log"
12+
13+ # 日志
14+ log () {
15+ echo " [$( date ' +%Y-%m-%d %H:%M:%S' ) ] $1 " | tee -a " $LOG_FILE "
16+ }
17+
18+ trap " log '服务停止'; exit" SIGTERM SIGINT
19+
20+ # 依赖检查和安装
21+ check_and_install_dependencies () {
22+ local dependencies=(" curl" " jq" " bc" )
23+ local missing_packages=()
24+
25+ for pkg in " ${dependencies[@]} " ; do
26+ if ! command -v " $pkg " & > /dev/null; then
27+ missing_packages+=(" $pkg " )
28+ fi
29+ done
30+
31+ if [ ${# missing_packages[@]} -eq 0 ]; then
32+ log " 环境检查通过: 依赖已就绪。"
33+ return 0
34+ fi
35+
36+ log " 检测到缺失依赖: ${missing_packages[*]} ,尝试自动安装..."
37+
38+ local install_cmd=" "
39+ if command -v apt-get & > /dev/null; then
40+ install_cmd=" apt-get update && apt-get install -y"
41+ elif command -v yum & > /dev/null; then
42+ install_cmd=" yum install -y"
43+ elif command -v dnf & > /dev/null; then
44+ install_cmd=" dnf install -y"
45+ elif command -v apk & > /dev/null; then
46+ install_cmd=" apk add --no-cache"
47+ else
48+ log " 无法自动安装,请手动安装: ${missing_packages[*]} "
49+ exit 1
50+ fi
51+
52+ if [ " $EUID " -ne 0 ] && command -v sudo & > /dev/null; then
53+ install_cmd=" sudo $install_cmd "
54+ fi
55+
56+ # 这里也将安装日志通过管道传递给 log 函数,保持日志格式统一
57+ eval " $install_cmd ${missing_packages[*]} " 2>&1 | while IFS= read -r line; do
58+ log " [依赖安装] $line "
59+ done
60+
61+ # 二次检查
62+ for pkg in " ${missing_packages[@]} " ; do
63+ if ! command -v " $pkg " & > /dev/null; then
64+ log " 依赖 $pkg 安装失败,请检查网络或源。"
65+ exit 1
66+ fi
67+ done
68+ log " 依赖安装完成。"
69+ }
70+
71+ # 配置文件生成与检查
72+ check_and_create_config () {
73+ if [ ! -f " $CONFIG_FILE " ]; then
74+ log " 配置文件不存在,正在生成默认配置..."
75+ cat > " $CONFIG_FILE " << EOF
76+ # ==========================================
77+ # OUCShell配置文件
78+ # ==========================================
79+
80+ [Global]
81+ # 接收通知的邮箱
82+ TargetEmail = "your_email@example.com"
83+
84+ [SMTP]
85+ # 发件人邮箱服务器配置
86+ Host = "smtp.qq.com"
87+ Port = "465"
88+ User = "your_smtp_email@qq.com"
89+ Password = "your_smtp_auth_code"
90+
91+ # 电费提醒模块
92+ [Electricity]
93+ Enabled = true # 是否启用本模块
94+ Campus = "xha" # 校区选择
95+ # xha = 西海岸
96+
97+ [Electricity.xha]
98+ StudentID = "XXX" # 学号
99+ Token = "9f7c6e76979c4cb9dd3828f8cc44a5ef" # MD5(Sd1234) 居然加密这么简单吗?
100+ # [照明警戒值, 空调警戒值]
101+ RemindTime = [30.0, 30.0]
102+
103+ # 网费提醒模块
104+ [Internet]
105+ Enabled = true # 是否启用本模块
106+ Campus = "xha" # 校区选择
107+ # xha = 西海岸
108+
109+ [Internet.xha]
110+ StudentID = "XXX" # 学号
111+ # [最低余额, 触发天数]
112+ # 触发天数: 离下个月1号还有几天时开始检测。
113+ # e.g.
114+ # 填 -1 表示忽略日期,只要余额低就提醒。
115+ # 填 5 表示只有余额低 且 离月底少于5天时才提醒。
116+ RemindTime = [10, -1]
117+ EOF
118+ log " 配置文件已生成: $CONFIG_FILE "
119+ log " 检测到第一次运行,脚本将自动退出,请编辑配置文件后重新启动"
120+ exit 0
121+ else
122+ log " 加载配置文件: $CONFIG_FILE "
123+ fi
124+ }
125+
126+ # 主函数
127+
128+ log " 服务启动..."
129+
130+ check_and_install_dependencies
131+ check_and_create_config
132+
133+ # 电费提醒任务间隔 (秒)
134+ INTERVAL_ELEC=7200 # 2小时
135+ LAST_RUN_ELEC=0
136+
137+ # 网费提醒任务间隔 (秒)
138+ INTERVAL_NET=43200 # 半天
139+ LAST_RUN_NET=0
140+
141+ log " 进入循环调度模式..."
142+
143+ while true ; do
144+ CURRENT_TIME=$( date +%s)
145+
146+ # 电费监控
147+
148+ # 计算时间差
149+ TIME_DIFF=$(( CURRENT_TIME - LAST_RUN_ELEC))
150+
151+ if [ $TIME_DIFF -ge $INTERVAL_ELEC ]; then
152+ SCRIPT_PATH=" $SRC_DIR /elec_monitor.sh"
153+
154+ if [ -f " $SCRIPT_PATH " ]; then
155+ chmod +x " $SCRIPT_PATH "
156+ log " 调度任务: 电费监控..."
157+
158+ /bin/bash " $SCRIPT_PATH " " $CONFIG_FILE " 2>&1 | while IFS= read -r line; do
159+ log " [elec_monitor] $line "
160+ done
161+
162+ log " 任务结束: 电费监控"
163+ else
164+ log " 警告: 找不到脚本 $SCRIPT_PATH "
165+ fi
166+
167+ LAST_RUN_ELEC=$( date +%s)
168+ fi
169+
170+ # 网费监控
171+
172+ # 计算时间差
173+ TIME_DIFF=$(( CURRENT_TIME - LAST_RUN_NET))
174+
175+ if [ $TIME_DIFF -ge $INTERVAL_NET ]; then
176+ SCRIPT_PATH=" $SRC_DIR /internet_monitor.sh"
177+
178+ if [ -f " $SCRIPT_PATH " ]; then
179+ chmod +x " $SCRIPT_PATH "
180+ log " 调度任务: 网费监控..."
181+
182+ /bin/bash " $SCRIPT_PATH " " $CONFIG_FILE " 2>&1 | while IFS= read -r line; do
183+ log " [net_monitor] $line "
184+ done
185+
186+ log " 任务结束: 网费监控"
187+ else
188+ log " 警告: 找不到脚本 $SCRIPT_PATH "
189+ fi
190+
191+ LAST_RUN_NET=$( date +%s)
192+ fi
193+
194+ # 其他任务(预留)
195+ # TODO
196+
197+ sleep 60
198+ done
0 commit comments