Skip to content

Commit 3812694

Browse files
committed
用内核原生持久化替代 web_save, cache.db cp 同步
启用 mihomo profile.store-selected 与 singbox cache_file, cache.db 运行于 tmpfs(bbolt 依赖 mmap, 持久分区 jffs2/ubifs 不支持): - mihomo cache.db 路径不可配(-d $BINDIR), bfstart 启动前软链 $BINDIR/cache.db 到 $TMPDIR; 小内存模式($BINDIR=$TMPDIR)守卫跳过防自指 - singbox 直接 cache_file.path 指向 $TMPDIR/cache.db web_save/web_restore 保留原函数名与 hook 位置(向后兼容旧 crontab), 内部改为 cache.db cp 同步: - start.sh stop 调 web_save 备份(kill 前) - bfstart 调 web_restore 启动前恢复(仅 tmpfs 无时恢复, 防覆盖更新) - task 106 web_save_auto 每10分钟定时备份 - 小内存模式 web_save 守卫跳过(与软链守卫一致) 解决面板配置丢失类 issue #1264 #1276 #998close #1296
1 parent 732d170 commit 3812694

9 files changed

Lines changed: 230 additions & 245 deletions

File tree

scripts/init.sh

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
#特殊固件识别及标记
55
[ -f "/etc/storage/started_script.sh" ] && { #老毛子固件
6-
systype=Padavan
6+
systype=Padavan
77
initdir='/etc/storage/started_script.sh'
88
}
99
[ -d "/jffs" ] && { #华硕固件
@@ -83,8 +83,8 @@ done
8383
setconfig versionsh_l $version
8484
#生成用于执行启动服务的变量文件
8585
[ ! -f "$CRASHDIR"/configs/command.env ] && {
86-
echo 'TMPDIR=/tmp/ShellCrash' > "$CRASHDIR"/configs/command.env
87-
echo "BINDIR=$CRASHDIR" >> "$CRASHDIR"/configs/command.env
86+
echo 'TMPDIR=/tmp/ShellCrash' >"$CRASHDIR"/configs/command.env
87+
echo "BINDIR=$CRASHDIR" >>"$CRASHDIR"/configs/command.env
8888
}
8989
if [ -n "$(grep 'crashcore=singbox' "$CFG_PATH")" ]; then
9090
COMMAND='"$TMPDIR/CrashCore run -D $BINDIR -C $TMPDIR/jsons"'
@@ -102,7 +102,7 @@ grep -q 'firewall_mod' "$CRASHDIR/configs/ShellClash.cfg" 2>/dev/null || {
102102
[ -n "$url" ] && setconfig update_url "$url"
103103
[ -n "$release_type" ] && setconfig release_type "$release_type"
104104
#设置语言
105-
[ -n "$language" ] && echo "$language" > "$CRASHDIR/configs/i18n.cfg"
105+
[ -n "$language" ] && echo "$language" >"$CRASHDIR/configs/i18n.cfg"
106106
#设置环境变量
107107
[ -w /opt/etc/profile ] && [ "$systype" = "Padavan" ] && profile=/opt/etc/profile
108108
[ -w /jffs/configs/profile.add ] && profile=/jffs/configs/profile.add
@@ -130,11 +130,11 @@ fi
130130
#镜像化OpenWrt(snapshot)额外设置
131131
if [ "$systype" = "mi_snapshot" -o "$systype" = "ng_snapshot" ]; then
132132
chmod 755 "$CRASHDIR"/starts/snapshot_init.sh
133-
if [ "$systype" = "mi_snapshot" ];then
133+
if [ "$systype" = "mi_snapshot" ]; then
134134
path="/data/shellcrash_init.sh"
135135
sed -i "s#^CRASHDIR=.*#CRASHDIR=$CRASHDIR#" "$CRASHDIR"/starts/snapshot_init.sh
136136
mv -f "$CRASHDIR"/starts/snapshot_init.sh "$path"
137-
[ ! -f /data/auto_start.sh ] && echo '#用于自定义需要开机启动的功能或者命令,会在开机后自动运行' > /data/auto_start.sh
137+
[ ! -f /data/auto_start.sh ] && echo '#用于自定义需要开机启动的功能或者命令,会在开机后自动运行' >/data/auto_start.sh
138138
else
139139
path="$CRASHDIR"/starts/snapshot_init.sh
140140
fi
@@ -166,14 +166,14 @@ fi
166166
setconfig firewall_mod 'nftables'
167167
setconfig release_type 'master'
168168
setconfig start_old 'OFF'
169-
echo "$CRASHDIR/menu.sh" >> /etc/profile
170-
cat > /usr/bin/crash <<'EOF'
169+
echo "$CRASHDIR/menu.sh" >>/etc/profile
170+
cat >/usr/bin/crash <<'EOF'
171171
#!/bin/sh
172172
CRASHDIR=${CRASHDIR:-/etc/ShellCrash}
173173
export CRASHDIR
174174
exec "$CRASHDIR/menu.sh" "$@"
175175
EOF
176-
chmod 755 /usr/bin/crash
176+
chmod 755 /usr/bin/crash
177177
}
178178
setconfig systype $systype
179179
#删除临时文件
@@ -189,7 +189,7 @@ for file in config.yaml.bak user.yaml proxies.yaml proxy-groups.yaml rules.yaml
189189
mv -f "$CRASHDIR"/"$file" "$CRASHDIR"/yamls/"$file" 2>/dev/null
190190
done
191191
[ ! -L "$CRASHDIR"/config.yaml ] && mv -f "$CRASHDIR"/config.yaml "$CRASHDIR"/yamls/config.yaml 2>/dev/null
192-
for file in fake_ip_filter mac web_save servers_chs.list servers_en.list fake_ip_filter.list singbox_providers.list clash_providers.list; do
192+
for file in fake_ip_filter mac servers_chs.list servers_en.list fake_ip_filter.list singbox_providers.list clash_providers.list; do
193193
mv -f "$CRASHDIR"/"$file" "$CRASHDIR"/configs/"$file" 2>/dev/null
194194
done
195195
#迁移任务状态文件到新目录
@@ -239,7 +239,7 @@ sed -i "s/redir_mod=Tun模式/redir_mod=Tun/g" "$CFG_PATH"
239239
sed -i "s/redir_mod=混合模式/redir_mod=Mix/g" "$CFG_PATH"
240240
sed -i "s/redir_mod=纯净模式/firewall_area=4/g" "$CFG_PATH"
241241
#变量统一使用ON/OFF
242-
sed -i 's/=\(已启用\|已开启\)$/=ON/' "$CFG_PATH"
242+
sed -i 's/=\(已启用\|已开启\)$/=ON/' "$CFG_PATH"
243243
sed -i 's/=\(未启用\|未开启\)$/=OFF/' "$CFG_PATH"
244244

245245
printf '\033[32m脚本初始化完成,请输入\033[30;47m %s \033[0;33m命令开始使用!\033[0m\n' "$my_alias"

scripts/libs/web_restore.sh

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
#
32
put_save() { #推送面板选择
43
[ -z "$3" ] && request_type=PUT || request_type=$3
@@ -8,13 +7,6 @@ put_save() { #推送面板选择
87
wget -q --method="$request_type" --header="Authorization: Bearer $secret" --header="Content-Type:application/json" --body-data="$2" "$1" >/dev/null
98
fi
109
}
11-
web_restore() { #还原面板选择
12-
num=$(cat "$CRASHDIR"/configs/web_save | wc -l)
13-
i=1
14-
while [ "$i" -le "$num" ]; do
15-
group_name=$(awk -F ',' 'NR=="'${i}'" {print $1}' "$CRASHDIR"/configs/web_save | sed 's/ /%20/g')
16-
now_name=$(awk -F ',' 'NR=="'${i}'" {print $2}' "$CRASHDIR"/configs/web_save)
17-
put_save "http://127.0.0.1:${db_port}/proxies/${group_name}" "{\"name\":\"${now_name}\"}"
18-
i=$((i + 1))
19-
done
10+
web_restore() { #还原面板配置(恢复 cache.db 到 $TMPDIR;tmpfs 已有则跳过,避免覆盖更新的)
11+
[ ! -f "$TMPDIR"/cache.db ] && [ -s "$BINDIR"/configs/cache.db ] && cp -f "$BINDIR"/configs/cache.db "$TMPDIR"/cache.db
2012
}

scripts/libs/web_save.sh

Lines changed: 21 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,24 @@
11
get_save() { #获取面板信息并内部处理所有异常
2-
local response exit_code
3-
if curl --version >/dev/null 2>&1; then
4-
response=$(curl -sf -H "Authorization: Bearer ${secret}" -H "Content-Type:application/json" "$1" 2>&1)
5-
exit_code=$?
6-
[ $exit_code -eq 0 ] && [ -n "$response" ] && [ "$response" != "{}" ] && {
7-
echo "$response"
8-
return 0
9-
}
10-
return 1
11-
elif [ -n "$(wget --help 2>&1 | grep '\-\-method')" ]; then
12-
response=$(wget -q --header="Authorization: Bearer ${secret}" --header="Content-Type:application/json" -O - "$1" 2>&1)
13-
exit_code=$?
14-
[ $exit_code -eq 0 ] && [ -n "$response" ] && [ "$response" != "{}" ] && {
15-
echo "$response"
16-
return 0
17-
}
18-
return 1
19-
fi
20-
return 1
2+
local response exit_code
3+
if curl --version >/dev/null 2>&1; then
4+
response=$(curl -sf -H "Authorization: Bearer ${secret}" -H "Content-Type:application/json" "$1" 2>&1)
5+
exit_code=$?
6+
[ $exit_code -eq 0 ] && [ -n "$response" ] && [ "$response" != "{}" ] && {
7+
echo "$response"
8+
return 0
9+
}
10+
return 1
11+
elif [ -n "$(wget --help 2>&1 | grep '\-\-method')" ]; then
12+
response=$(wget -q --header="Authorization: Bearer ${secret}" --header="Content-Type:application/json" -O - "$1" 2>&1)
13+
exit_code=$?
14+
[ $exit_code -eq 0 ] && [ -n "$response" ] && [ "$response" != "{}" ] && {
15+
echo "$response"
16+
return 0
17+
}
18+
return 1
19+
fi
20+
return 1
2121
}
22-
23-
web_save() { #最小化保存面板节点选择
24-
#使用get_save获取面板节点设置,失败自动退出
25-
response=$(get_save "http://127.0.0.1:${db_port}/proxies") || return 1
26-
27-
echo "$response" | sed 's/{}//g' | sed 's/:{/\
28-
/g' | grep -aE '"Selector"' >"$TMPDIR"/web_proxies
29-
30-
>"$TMPDIR"/web_save
31-
[ -s "$TMPDIR"/web_proxies ] && while read line; do
32-
def=$(echo "$line" | grep -oE '"all".*",' | awk -F "[\"]" '{print $4}')
33-
now=$(echo "$line" | grep -oE '"now".*",' | awk -F "[\"]" '{print $4}')
34-
[ "$def" != "$now" ] && {
35-
name=$(echo "$line" | grep -oE '"name".*",' | awk -F "[\"]" '{print $4}')
36-
echo "${name},${now}" >>"$TMPDIR"/web_save
37-
}
38-
done <"$TMPDIR"/web_proxies
39-
rm -f "$TMPDIR"/web_proxies
40-
. "$CRASHDIR"/libs/compare.sh && compare "$TMPDIR"/web_save "$CRASHDIR"/configs/web_save
41-
[ "$?" = 0 ] && rm -f "$TMPDIR"/web_save || mv -f "$TMPDIR"/web_save "$CRASHDIR"/configs/web_save
22+
web_save() { #保存面板配置(备份 cache.db 到 $BINDIR/configs;小内存模式跳过)
23+
[ "$BINDIR" != "$TMPDIR" ] && [ -s "$TMPDIR"/cache.db ] && cp -f "$TMPDIR"/cache.db "$BINDIR"/configs/cache.db
4224
}

scripts/menus/task_cmd.sh

Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22
# Copyright (C) Juewuy
33

44
#加载全局变量
5-
[ -z "$CRASHDIR" ] && CRASHDIR=$( cd $(dirname $0);cd ..;pwd)
5+
[ -z "$CRASHDIR" ] && CRASHDIR=$(
6+
cd $(dirname $0)
7+
cd ..
8+
pwd
9+
)
610
. "$CRASHDIR"/libs/get_config.sh
711
#加载工具
812
. "$CRASHDIR"/libs/check_cmd.sh
@@ -14,59 +18,59 @@
1418

1519
load_lang task_cmd
1620

17-
task_logger(){
21+
task_logger() {
1822
[ "$task_push" = 1 ] && push= || push=off
1923
[ -n "$2" -a "$2" != 0 ] && echo -e "\033[$2m$1\033[0m"
2024
[ "$3" = 'off' ] && push=off
21-
echo "$1" |grep -qE "($TASK_CMD_EVERY|$TASK_CMD_HOURLY)([1-9]|[1-9][0-9])$TASK_CMD_MIN" && {
25+
echo "$1" | grep -qE "($TASK_CMD_EVERY|$TASK_CMD_HOURLY)([1-9]|[1-9][0-9])$TASK_CMD_MIN" && {
2226
push=off
2327
cover=on
2428
}
2529
logger "$1" 0 "$push" "$cover"
2630
}
2731

2832
#任务命令
29-
check_update(){ #检查更新工具
33+
check_update() { #检查更新工具
3034
get_bin "$TMPDIR"/crashversion "$1" echooff
3135
[ "$?" = "0" ] && . "$TMPDIR"/crashversion 2>/dev/null
3236
rm -rf "$TMPDIR"/crashversion
3337
}
34-
update_core(){ #自动更新内核
38+
update_core() { #自动更新内核
3539
#检查版本
3640
check_update bin/version
3741
crash_v_new=$(eval echo \$${crashcore}_v)
38-
if [ -z "$crash_v_new" -o "$crash_v_new" = "$core_v" ];then
42+
if [ -z "$crash_v_new" -o "$crash_v_new" = "$core_v" ]; then
3943
task_logger "$TASK_CMD_CORE_SKIP"
4044
return 0
4145
else
4246
. "$CRASHDIR"/libs/core_tools.sh && core_webget #调用下载工具
4347
case "$?" in
44-
0)
45-
task_logger "$TASK_CMD_CORE_DONE"
46-
"$CRASHDIR"/start.sh start
47-
return 0
48-
;;
49-
1)
50-
task_logger "$TASK_CMD_CORE_DL_FAIL"
51-
return 1
52-
;;
53-
*)
54-
task_logger "$TASK_CMD_CORE_VERIFY_FAIL"
55-
"$CRASHDIR"/start.sh start
56-
return 1
57-
;;
48+
0)
49+
task_logger "$TASK_CMD_CORE_DONE"
50+
"$CRASHDIR"/start.sh start
51+
return 0
52+
;;
53+
1)
54+
task_logger "$TASK_CMD_CORE_DL_FAIL"
55+
return 1
56+
;;
57+
*)
58+
task_logger "$TASK_CMD_CORE_VERIFY_FAIL"
59+
"$CRASHDIR"/start.sh start
60+
return 1
61+
;;
5862
esac
5963
fi
6064
}
61-
update_scripts(){ #自动更新脚本
65+
update_scripts() { #自动更新脚本
6266
#检查版本
6367
check_update version
64-
if [ -z "$versionsh" -o "$versionsh" = "versionsh_l" ];then
68+
if [ -z "$versionsh" -o "$versionsh" = "versionsh_l" ]; then
6569
task_logger "$TASK_CMD_SCRIPT_SKIP"
6670
return 0
6771
else
6872
get_bin "$TMPDIR"/ShellCrash.tar.gz "ShellCrash.tar.gz"
69-
if [ "$?" != "0" ];then
73+
if [ "$?" != "0" ]; then
7074
rm -rf "$TMPDIR"/ShellCrash.tar.gz
7175
task_logger "$TASK_CMD_CORE_DL_FAIL"
7276
return 1
@@ -75,7 +79,7 @@ update_scripts(){ #自动更新脚本
7579
"$CRASHDIR"/start.sh stop
7680
#解压
7781
tar -zxf "$TMPDIR"/ShellCrash.tar.gz ${tar_para} -C "$CRASHDIR"/
78-
if [ $? -ne 0 ];then
82+
if [ $? -ne 0 ]; then
7983
rm -rf "$TMPDIR"/ShellCrash.tar.gz
8084
task_logger "$TASK_CMD_SCRIPT_UNZIP_FAIL"
8185
"$CRASHDIR"/start.sh start
@@ -88,19 +92,19 @@ update_scripts(){ #自动更新脚本
8892
fi
8993
fi
9094
}
91-
update_mmdb(){ #自动更新数据库
92-
getgeo(){
95+
update_mmdb() { #自动更新数据库
96+
getgeo() {
9397
#检查版本
9498
check_update bin/version
9599
geo_v="$(echo $2 | awk -F "." '{print $1}')_v" #获取版本号类型比如Country_v
96100
geo_v_new=$GeoIP_v
97101
geo_v_now=$(eval echo \$$geo_v)
98-
if [ -z "$geo_v_new" -o "$geo_v_new" = "$geo_v_now" ];then
102+
if [ -z "$geo_v_new" -o "$geo_v_new" = "$geo_v_now" ]; then
99103
task_logger "$TASK_CMD_DB_SKIP_PREFIX$2$TASK_CMD_DB_SKIP_SUFFIX"
100104
else
101105
#更新文件
102106
get_bin "$TMPDIR"/$1 "bin/geodata/$2"
103-
if [ "$?" != "0" ];then
107+
if [ "$?" != "0" ]; then
104108
task_logger "$TASK_CMD_DB_DL_FAIL_PREFIX$2$TASK_CMD_DB_DL_FAIL_SUFFIX"
105109
rm -rf "$TMPDIR"/$1
106110
else
@@ -118,24 +122,24 @@ update_mmdb(){ #自动更新数据库
118122
[ -n "${geosite_cn_v}" -a -s "$CRASHDIR"/geosite.db ] && getgeo geosite.db geosite_cn.db
119123
return 0
120124
}
121-
reset_firewall(){ #重设透明路由防火墙
125+
reset_firewall() { #重设透明路由防火墙
122126
"$CRASHDIR"/start.sh stop_firewall
123127
"$CRASHDIR"/start.sh afstart
124128
}
125-
ntp(){
129+
ntp() {
126130
ckcmd ntpd && ntpd -n -q -p 203.107.6.88 >/dev/null 2>&1 || exit 0
127131
}
128-
web_save_auto(){
132+
web_save_auto() {
129133
. "$CRASHDIR"/libs/web_save.sh && web_save
130134
}
131135
update_config() { #更新订阅并重启
132136
. "$CRASHDIR"/starts/core_config.sh && get_core_config && "$CRASHDIR"/start.sh start
133137
}
134138
hotupdate() { #热更新订阅
135139
. "$CRASHDIR"/starts/core_config.sh && get_core_config &&
136-
. "$CRASHDIR"/starts/check_core.sh && check_core &&
137-
. "$CRASHDIR"/starts/"$target"_modify.sh && modify_"$format" && rm -rf "$TMPDIR"/CrashCore &&
138-
. "$CRASHDIR"/libs/web_restore.sh && put_save "http://127.0.0.1:$db_port/configs" "{\"path\":\"$CRASHDIR/config.$format\"}"
140+
. "$CRASHDIR"/starts/check_core.sh && check_core &&
141+
. "$CRASHDIR"/starts/"$target"_modify.sh && modify_"$format" && rm -rf "$TMPDIR"/CrashCore &&
142+
. "$CRASHDIR"/libs/web_restore.sh && put_save "http://127.0.0.1:$db_port/configs" "{\"path\":\"$CRASHDIR/config.$format\"}"
139143
exit $?
140144
}
141145

@@ -146,8 +150,8 @@ case "$1" in
146150
#task_logger "任务$task_name 开始执行"
147151
eval $task_command && task_res="$TASK_CMD_RES_OK" || task_res="$TASK_CMD_RES_FAIL"
148152
task_logger "$TASK_CMD_EXEC_PREFIX$2$TASK_CMD_EXEC_MID$task_res"
149-
;;
153+
;;
150154
*)
151155
"$1"
152-
;;
156+
;;
153157
esac

0 commit comments

Comments
 (0)