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