mirror of
https://github.com/juewuy/ShellCrash.git
synced 2026-04-25 20:10:42 +00:00
Compare commits
14 Commits
b9c50e825d
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1e10113665 | ||
|
|
aa21581057 | ||
|
|
04503ab921 | ||
|
|
13ed653c2e | ||
|
|
8e5ac1dce5 | ||
|
|
309b77ac35 | ||
|
|
0f712fd69f | ||
|
|
accc20ff7c | ||
|
|
85733ebf9d | ||
|
|
438611f27a | ||
|
|
791b83ab85 | ||
|
|
75b3baa5d9 | ||
|
|
950432aebc | ||
|
|
8e95c6a292 |
10
.github/workflows/bin_update.yml
vendored
10
.github/workflows/bin_update.yml
vendored
@@ -17,6 +17,10 @@ jobs:
|
||||
fetch-depth: 1
|
||||
persist-credentials: false # 禁用默认凭据(我们用 token push)
|
||||
|
||||
- name: Fetch master and dev refs
|
||||
run: |
|
||||
git fetch origin master dev
|
||||
|
||||
- name: Apt Update & Update CA
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
@@ -136,6 +140,12 @@ jobs:
|
||||
sed -i "s/GeoIP_v=.*/GeoIP_v=$(date '+%Y%m%d')/" version
|
||||
echo 数据库及根证书文件更新完成!
|
||||
|
||||
- name: Sync master/dev files into update branch
|
||||
run: |
|
||||
# 只同步文件内容,不带任何 git 状态
|
||||
git archive --format=tar origin/master ShellCrash.tar.gz version | tar -x -C .
|
||||
git archive --format=tar origin/dev install.sh install_en.sh public rules | tar -x -C .
|
||||
|
||||
- name: Rebuild update branch with no history
|
||||
run: |
|
||||
# 彻底删除历史记录
|
||||
|
||||
Binary file not shown.
@@ -1,4 +1,4 @@
|
||||
meta_v=v1.19.17
|
||||
singboxr_v=1.13.0-alpha.27
|
||||
versionsh=1.9.5alpha13
|
||||
versionsh=1.9.5alpha14
|
||||
GeoIP_v=20251205
|
||||
|
||||
@@ -22,8 +22,10 @@ grep -qE '/(docker|lxc|kubepods|crio|containerd)/' /proc/1/cgroup 2>/dev/null ||
|
||||
[ "$systype" = 'container' ] && CRASHDIR='/etc/ShellCrash'
|
||||
[ -z "$CRASHDIR" ] && [ -n "$clashdir" ] && CRASHDIR="$clashdir"
|
||||
[ -z "$CRASHDIR" ] && [ -d /tmp/SC_tmp ] && . /tmp/SC_tmp/menus/set_crashdir.sh && set_crashdir
|
||||
TASKCFGDIR="$CRASHDIR"/configs/task
|
||||
#移动文件
|
||||
mkdir -p "$CRASHDIR"
|
||||
mkdir -p "$TASKCFGDIR"
|
||||
rm -rf /tmp/SC_tmp/menus/set_crashdir.sh
|
||||
mv -f /tmp/SC_tmp/* "$CRASHDIR" 2>/dev/null
|
||||
##############################
|
||||
@@ -190,6 +192,15 @@ done
|
||||
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
|
||||
mv -f "$CRASHDIR"/"$file" "$CRASHDIR"/configs/"$file" 2>/dev/null
|
||||
done
|
||||
#迁移任务状态文件到新目录
|
||||
for file in cron bfstart afstart running affirewall task.user; do
|
||||
mv -f "$CRASHDIR"/"$file" "$TASKCFGDIR"/"$file" 2>/dev/null
|
||||
mv -f "$CRASHDIR"/task/"$file" "$TASKCFGDIR"/"$file" 2>/dev/null
|
||||
done
|
||||
#修正旧版防火墙注入路径
|
||||
for file in /etc/init.d/firewall /etc/init.d/firewall.bak; do
|
||||
[ -f "$file" ] && sed -i "s#$CRASHDIR/task/affirewall#$TASKCFGDIR/affirewall#g" "$file" 2>/dev/null
|
||||
done
|
||||
#配置文件改名
|
||||
mv -f "$CRASHDIR"/configs/ShellClash.cfg "$CFG_PATH" 2>/dev/null
|
||||
#数据库改名
|
||||
|
||||
@@ -89,6 +89,7 @@ UPG_CUSTOM_CORE_MENU_MULTI="多版本内核"
|
||||
UPG_CUSTOM_CORE_LINK_HINT="请输入自定义内核的链接地址"
|
||||
UPG_CUSTOM_CORE_LINK_HINT2="(必须是以.tar.gz、.upx或.gz结尾的压缩文件)"
|
||||
UPG_CUSTOM_CORE_LINK_HINT3="或者输入 0 返回上级菜单"
|
||||
UPG_CUSTOM_CORE_LINK_MENU="使用自定义内核链接"
|
||||
UPG_ZIPTYPE_TITLE="请选择内核分支及压缩方式:"
|
||||
UPG_ZIPTYPE_1="1) \033[36m最简编译release版本,upx压缩\033[0m"
|
||||
UPG_ZIPTYPE_1_HINT="不支持Gvisor、Tailscale、Wireguard、NaiveProxy"
|
||||
|
||||
@@ -42,7 +42,8 @@ DNS_ADV_SINGBOX_LIMIT="注意:SingBox内核仅加载第一个DNS"
|
||||
|
||||
DNS_ADV_EDIT_DIRECT="修改DIRECT-DNS"
|
||||
DNS_ADV_EDIT_PROXY="修改PROXY-DNS(该DNS查询会经过节点)"
|
||||
DNS_ADV_EDIT_DEFAULT="修改DEFAULT-DNS(必须是IP,用于解析其他DNS)"
|
||||
DNS_ADV_EDIT_RESOLVER="修改DEFAULT-DNS(必须是IP,用于解析其他DNS)"
|
||||
DNS_ADV_EDIT_PROXY_SERVER="修改PROXY-SERVER-DNS(必须是IP,用于解析节点域名)"
|
||||
DNS_ADV_AUTO_ENCRYPT="一键配置加密DNS"
|
||||
DNS_ADV_RESET="重置默认DNS配置"
|
||||
|
||||
@@ -61,12 +62,6 @@ DNS_CONFIRM_ADD="请确认需要添加的地址:"
|
||||
DNS_CONFIRM_OK="确认无误"
|
||||
DNS_ADD_OK="添加成功"
|
||||
DNS_ADD_FAIL="添加失败"
|
||||
DNS_DIRECT_NOW="当前DIRECT-DNS:"
|
||||
DNS_PROXY_NOW="当前PROXY-DNS:"
|
||||
DNS_DEFAULT_NOW="当前DEFAULT-DNS:"
|
||||
DNS_INPUT_DIRECT_NEW="请直接输入新的DIRECT-DNS地址"
|
||||
DNS_INPUT_DIRECT_RESET="或输入 r 重置DIRECT-DNS地址"
|
||||
DNS_INPUT_PROXY_NEW="请直接输入新的PROXY-DNS地址"
|
||||
DNS_INPUT_PROXY_RESET="或输入 r 重置PROXY-DNS地址"
|
||||
DNS_INPUT_DEFAULT_NEW="请直接输入新的DEFAULT-DNS地址"
|
||||
DNS_INPUT_DEFAULT_RESET="或输入 r 重置DEFAULT-DNS地址"
|
||||
DNS_NOW="当前DNS:"
|
||||
DNS_INPUT_NEW="请直接输入新的DNS地址"
|
||||
DNS_INPUT_RESET="或输入 r 重置DNS地址"
|
||||
|
||||
@@ -13,7 +13,7 @@ UPG_MENU_DB="Install/Update local "
|
||||
UPG_MENU_DB_NAME="Dashboard"
|
||||
UPG_MENU_CRT="Install/Update local "
|
||||
UPG_MENU_CRT_NAME="certificates"
|
||||
UPG_MENU_PAC=" proxy view"
|
||||
UPG_MENU_PAC="Auto proxy view"
|
||||
UPG_MENU_SOURCE="Switch "
|
||||
UPG_MENU_SOURCE_NAME="source and branch"
|
||||
UPG_MENU_UNINSTALL="Uninstall ShellCrash"
|
||||
@@ -89,6 +89,7 @@ UPG_CUSTOM_CORE_MENU_MULTI=" multi-version core"
|
||||
UPG_CUSTOM_CORE_LINK_HINT="Please enter the custom core URL"
|
||||
UPG_CUSTOM_CORE_LINK_HINT2="(must end with .tar.gz, .upx, or .gz)"
|
||||
UPG_CUSTOM_CORE_LINK_HINT3="Or enter 0 to return to the previous menu"
|
||||
UPG_CUSTOM_CORE_LINK_MENU="Use custom core URL"
|
||||
UPG_ZIPTYPE_TITLE="Please choose the core branch and compression method:"
|
||||
UPG_ZIPTYPE_1="1) \033[36mMinimal release build, upx compressed\033[0m"
|
||||
UPG_ZIPTYPE_1_HINT="Gvisor, Tailscale, Wireguard, and NaiveProxy are not supported"
|
||||
@@ -174,8 +175,8 @@ UPG_CRT_WARN="This device may not have openssl installed, so certificate files c
|
||||
UPG_SOURCE_CUR="Current version: "
|
||||
UPG_SOURCE_CUR2="Current source: "
|
||||
UPG_SOURCE_TITLE="Switch ShellCrash version and update source"
|
||||
UPG_SOURCE_SWITCH_STABLE="a) Switch to \033[32mstable-stable\033[0m"
|
||||
UPG_SOURCE_SWITCH_MASTER="b) Switch to \033[36mmaster\033[0m"
|
||||
UPG_SOURCE_SWITCH_STABLE="a) Switch to \033[32mstable\033[0m"
|
||||
UPG_SOURCE_SWITCH_MASTER="b) Switch to \033[36mpublic beta-master\033[0m"
|
||||
UPG_SOURCE_SWITCH_DEV="c) Switch to \033[33mdev\033[0m"
|
||||
UPG_SOURCE_CUSTOM="d) Custom source URL (for local or self-hosted sources)"
|
||||
UPG_SOURCE_ROLLBACK="e) \033[31mVersion rollback\033[0m"
|
||||
|
||||
@@ -43,7 +43,8 @@ DNS_ADV_SINGBOX_LIMIT="Note: SingBox core only loads the first DNS entry"
|
||||
|
||||
DNS_ADV_EDIT_DIRECT="Edit DIRECT-DNS"
|
||||
DNS_ADV_EDIT_PROXY="Edit PROXY-DNS (queries go through the proxy)"
|
||||
DNS_ADV_EDIT_DEFAULT="Edit DEFAULT-DNS (must be an IP, used to resolve other DNS servers)"
|
||||
DNS_ADV_EDIT_RESOLVER="Edit DEFAULT-DNS (must be an IP, used to resolve other DNS servers)"
|
||||
DNS_ADV_EDIT_PROXY_SERVER="Edit PROXY-SERVER-DNS (must be an IP, used to resolve proxy hostnames)"
|
||||
DNS_ADV_AUTO_ENCRYPT="Auto-configure Encrypted DNS"
|
||||
DNS_ADV_RESET="Reset to default DNS configuration"
|
||||
|
||||
@@ -63,12 +64,6 @@ DNS_CONFIRM_ADD="Please confirm the address to add: "
|
||||
DNS_CONFIRM_OK="Confirm"
|
||||
DNS_ADD_OK="Added successfully"
|
||||
DNS_ADD_FAIL="Add failed"
|
||||
DNS_DIRECT_NOW="Current DIRECT-DNS: "
|
||||
DNS_PROXY_NOW="Current PROXY-DNS: "
|
||||
DNS_DEFAULT_NOW="Current DEFAULT-DNS: "
|
||||
DNS_INPUT_DIRECT_NEW="Please input new DIRECT-DNS"
|
||||
DNS_INPUT_DIRECT_RESET="or input r to reset DIRECT-DNS"
|
||||
DNS_INPUT_PROXY_NEW="Please input new PROXY-DNS"
|
||||
DNS_INPUT_PROXY_RESET="or input r to reset PROXY-DNS"
|
||||
DNS_INPUT_DEFAULT_NEW="Please input new DEFAULT-DNS"
|
||||
DNS_INPUT_DEFAULT_RESET="or input r to reset DEFAULT-DNS"
|
||||
DNS_NOW="Current DNS: "
|
||||
DNS_INPUT_NEW="Please input a new DNS address"
|
||||
DNS_INPUT_RESET="or input r to reset the DNS address"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
# 检查配置文件
|
||||
[ -z "$TASKCFGDIR" ] && TASKCFGDIR="$CRASHDIR"/configs/task
|
||||
[ -f "$CRASHDIR"/configs/ShellCrash.cfg ] || . "$CRASHDIR"/init.sh >/dev/null 2>&1
|
||||
. "$CRASHDIR"/configs/command.env >/dev/null 2>&1
|
||||
. "$CRASHDIR"/configs/ShellCrash.cfg
|
||||
@@ -20,3 +21,4 @@ routing_mark=$((fwmark + 2))
|
||||
}
|
||||
[ -z "$dns_fallback" ] && dns_fallback="1.1.1.1, 8.8.8.8"
|
||||
[ -z "$dns_resolver" ] && dns_resolver="223.5.5.5, 2400:3200::1"
|
||||
[ -z "$dns_proxy_server" ] && dns_proxy_server="$dns_resolver"
|
||||
|
||||
@@ -4,6 +4,7 @@ crondir="$(crond -h 2>&1 | grep -oE 'Default:.*' | awk -F ":" '{print $2}'| tr -
|
||||
[ ! -w "$crondir" ] && crondir="/var/spool/cron/crontabs"
|
||||
[ ! -w "$crondir" ] && crondir="/var/spool/cron"
|
||||
[ -z "$USER" ] && USER=$(whoami 2>/dev/null)
|
||||
[ -z "$TASKCFGDIR" ] && TASKCFGDIR="$CRASHDIR"/configs/task
|
||||
tmpcron=/tmp/cron_tmp
|
||||
touch "$tmpcron"
|
||||
|
||||
@@ -32,7 +33,8 @@ cronset() { #定时任务设置
|
||||
cronadd "$tmpcron"
|
||||
#华硕/Padavan固件存档在本地,其他则删除
|
||||
if [ -d /jffs ] || [ -d /etc/storage/ShellCrash ];then
|
||||
mv -f "$tmpcron" "$CRASHDIR"/task/cron
|
||||
mkdir -p "$TASKCFGDIR"
|
||||
mv -f "$tmpcron" "$TASKCFGDIR"/cron
|
||||
else
|
||||
rm -f "$tmpcron"
|
||||
fi
|
||||
|
||||
@@ -7,9 +7,9 @@ get_bin() { #专用于项目内部文件的下载
|
||||
echo "$2" | grep -q '^bin/' && rt=update #/bin文件改为在update分支下载
|
||||
echo "$2" | grep -qE '^public/|^rules/' && rt=dev #/public和/rules文件改为在dev分支下载
|
||||
if [ "$url_id" = 101 -o "$url_id" = 104 ]; then
|
||||
bin_url="$(grep "$url_id" "$CRASHDIR"/configs/servers.list | awk '{print $3}')@$rt/$2" #jsdelivr特殊处理
|
||||
bin_url="$(grep "$url_id" "$CRASHDIR"/configs/servers_chs.list | awk '{print $3}')@$rt/$2" #jsdelivr特殊处理
|
||||
else
|
||||
bin_url="$(grep "$url_id" "$CRASHDIR"/configs/servers.list | awk '{print $3}')/$rt/$2"
|
||||
bin_url="$(grep "$url_id" "$CRASHDIR"/configs/servers_chs.list | awk '{print $3}')/$rt/$2"
|
||||
fi
|
||||
else
|
||||
bin_url="$update_url/$2"
|
||||
|
||||
@@ -203,8 +203,8 @@ settings() {
|
||||
exit 0
|
||||
;;
|
||||
b)
|
||||
comp_box "1) $SET_LANG_ZH" \
|
||||
"2) $SET_LANG_EN" \
|
||||
comp_box "1) 简体中文" \
|
||||
"2) English" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
|
||||
@@ -7,6 +7,7 @@ __IS_MODULE_5_TASK_LOADED=1
|
||||
# 通用工具
|
||||
. "$CRASHDIR"/libs/set_config.sh
|
||||
. "$CRASHDIR"/libs/set_cron.sh
|
||||
[ -z "$TASKCFGDIR" ] && TASKCFGDIR="$CRASHDIR"/configs/task
|
||||
|
||||
load_lang 5_task
|
||||
|
||||
@@ -32,7 +33,8 @@ set_cron() {
|
||||
|
||||
set_service() {
|
||||
# 参数1代表要任务类型,参数2代表任务ID,参数3代表任务描述,参数4代表running任务cron时间
|
||||
task_file="$CRASHDIR"/task/$1
|
||||
mkdir -p "$TASKCFGDIR"
|
||||
task_file="$TASKCFGDIR"/$1
|
||||
[ -s "$task_file" ] && sed -i "/$3/d" "$task_file"
|
||||
# 运行时每分钟执行的任务特殊处理
|
||||
if [ "$1" = "running" ]; then
|
||||
@@ -53,7 +55,7 @@ task_user_add() {
|
||||
while true; do
|
||||
comp_box "\033[33m$TASK5_USER_ADD_HINT1\033[0m" \
|
||||
"\033[36m$TASK5_USER_ADD_HINT2\033[0m" \
|
||||
"$TASK5_USER_ADD_HINT3\033[32m${CRASHDIR}/task/task.user\033[0m$TASK5_USER_ADD_HINT4"
|
||||
"$TASK5_USER_ADD_HINT3\033[32m${TASKCFGDIR}/task.user\033[0m$TASK5_USER_ADD_HINT4"
|
||||
btm_box "\033[36m$TASK5_INPUT_CMD\033[0m" \
|
||||
"$TASK5_OR_BACK"
|
||||
read -r -p "$TASK5_INPUT> " script
|
||||
@@ -63,12 +65,12 @@ task_user_add() {
|
||||
task_command=$script
|
||||
comp_box "$TASK5_CHECK_INPUT\033[32m$task_command\033[0m"
|
||||
# 获取本任务ID
|
||||
task_max_id=$(awk -F '#' '{print $1}' "$CRASHDIR"/task/task.user 2>/dev/null | sort -n | tail -n 1)
|
||||
task_max_id=$(awk -F '#' '{print $1}' "$TASKCFGDIR"/task.user 2>/dev/null | sort -n | tail -n 1)
|
||||
[ -z "$task_max_id" ] && task_max_id=200
|
||||
task_id=$((task_max_id + 1))
|
||||
read -r -p "$TASK5_INPUT_REMARK> " txt
|
||||
[ -n "$txt" ] && task_name=$txt || task_name="$TASK5_CUSTOM_TASK$task_id"
|
||||
echo "$task_id#$task_command#$task_name" >>"$CRASHDIR"/task/task.user
|
||||
echo "$task_id#$task_command#$task_name" >>"$TASKCFGDIR"/task.user
|
||||
msg_alert "\033[32m$TASK5_CUSTOM_ADDED\033[0m"
|
||||
break
|
||||
else
|
||||
@@ -80,10 +82,10 @@ task_user_add() {
|
||||
# 自定义命令删除
|
||||
task_user_del() {
|
||||
while true; do
|
||||
if grep -Evq '^#' "$CRASHDIR/task/task.user" 2>/dev/null; then
|
||||
if grep -Evq '^#' "$TASKCFGDIR/task.user" 2>/dev/null; then
|
||||
comp_box "$TASK5_USER_DEL_HINT1" \
|
||||
"$TASK5_USER_DEL_HINT2\033[32m${CRASHDIR}/task/task.user\033[0m"
|
||||
grep -Ev '^#' "$CRASHDIR/task/task.user" 2>/dev/null |
|
||||
"$TASK5_USER_DEL_HINT2\033[32m${TASKCFGDIR}/task.user\033[0m"
|
||||
grep -Ev '^#' "$TASKCFGDIR/task.user" 2>/dev/null |
|
||||
awk -F '#' '{print $1") "$3}' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
@@ -94,7 +96,7 @@ task_user_del() {
|
||||
if [ "$num" = 0 ]; then
|
||||
break
|
||||
elif [ -n "$num" ]; then
|
||||
sed -i "/^$num#/d" "$CRASHDIR"/task/task.user 2>/dev/null
|
||||
sed -i "/^$num#/d" "$TASKCFGDIR"/task.user 2>/dev/null
|
||||
common_success
|
||||
else
|
||||
msg_alert "\033[31m$TASK5_INPUT_ERROR\033[0m"
|
||||
@@ -111,7 +113,7 @@ task_add() {
|
||||
while true; do
|
||||
comp_box "\033[36m$TASK5_SELECT_ADD\033[0m"
|
||||
# 输出任务列表
|
||||
list=$(cat "$CRASHDIR"/task/task_${i18n}.list "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | awk -F '#' '{print $3}')
|
||||
list=$(cat "$CRASHDIR"/task/task_${i18n}.list "$TASKCFGDIR"/task.user 2>/dev/null | grep -Ev '^(#|$)' | awk -F '#' '{print $3}')
|
||||
list_box "$list"
|
||||
btm_box "" \
|
||||
"0) $COMMON_BACK"
|
||||
@@ -122,8 +124,8 @@ task_add() {
|
||||
;;
|
||||
[1-9] | [1-9][0-9])
|
||||
if [ "$num" -le "$(echo "$list" | wc -l)" ]; then
|
||||
task_id=$(cat "$CRASHDIR"/task/task_${i18n}.list "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | sed -n "$num p" | awk -F '#' '{print $1}')
|
||||
task_name=$(cat "$CRASHDIR"/task/task_${i18n}.list "$CRASHDIR"/task/task.user 2>/dev/null | grep -Ev '^(#|$)' | sed -n "$num p" | awk -F '#' '{print $3}')
|
||||
task_id=$(cat "$CRASHDIR"/task/task_${i18n}.list "$TASKCFGDIR"/task.user 2>/dev/null | grep -Ev '^(#|$)' | sed -n "$num p" | awk -F '#' '{print $1}')
|
||||
task_name=$(cat "$CRASHDIR"/task/task_${i18n}.list "$TASKCFGDIR"/task.user 2>/dev/null | grep -Ev '^(#|$)' | sed -n "$num p" | awk -F '#' '{print $3}')
|
||||
task_type
|
||||
break
|
||||
else
|
||||
@@ -142,11 +144,11 @@ task_del() {
|
||||
# 删除定时任务
|
||||
cronset "$1"
|
||||
# 删除条件任务
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/cron 2>/dev/null
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/bfstart 2>/dev/null
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/afstart 2>/dev/null
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/running 2>/dev/null
|
||||
sed -i "/$1/d" "$CRASHDIR"/task/affirewall 2>/dev/null
|
||||
sed -i "/$1/d" "$TASKCFGDIR"/cron 2>/dev/null
|
||||
sed -i "/$1/d" "$TASKCFGDIR"/bfstart 2>/dev/null
|
||||
sed -i "/$1/d" "$TASKCFGDIR"/afstart 2>/dev/null
|
||||
sed -i "/$1/d" "$TASKCFGDIR"/running 2>/dev/null
|
||||
sed -i "/$1/d" "$TASKCFGDIR"/affirewall 2>/dev/null
|
||||
}
|
||||
|
||||
# 任务条件选择菜单
|
||||
@@ -244,8 +246,8 @@ task_manager() {
|
||||
while true; do
|
||||
# 抽取并生成临时列表
|
||||
cronload >"$TMPDIR"/task_cronlist
|
||||
cat "$TMPDIR"/task_cronlist "$CRASHDIR"/task/running 2>/dev/null | sort -u | grep -oE "task/task.sh .*" | cut -d ' ' -f 2- >"$TMPDIR"/task_list
|
||||
cat "$CRASHDIR"/task/bfstart "$CRASHDIR"/task/afstart "$CRASHDIR"/task/affirewall 2>/dev/null | cut -d ' ' -f 2- >>"$TMPDIR"/task_list
|
||||
cat "$TMPDIR"/task_cronlist "$TASKCFGDIR"/running 2>/dev/null | sort -u | grep -oE "task/task.sh .*" | cut -d ' ' -f 2- >"$TMPDIR"/task_list
|
||||
cat "$TASKCFGDIR"/bfstart "$TASKCFGDIR"/afstart "$TASKCFGDIR"/affirewall 2>/dev/null | cut -d ' ' -f 2- >>"$TMPDIR"/task_list
|
||||
cat "$TMPDIR"/task_cronlist 2>/dev/null | sort -u | grep -oE " #.*" | grep -v "$TASK5_GUARD_WORD" | awk -F '#' '{print "0 '$TASK5_OLD_PREFIX'"$2}' >>"$TMPDIR"/task_list
|
||||
sed -i '/^ *$/d' "$TMPDIR"/task_list
|
||||
rm -rf "$TMPDIR"/task_cronlist
|
||||
@@ -286,13 +288,13 @@ task_manager() {
|
||||
if [ "$res" = 1 ]; then
|
||||
cronname=$(echo "$task_txt" | awk -F '-' '{print $2}')
|
||||
cronset "$cronname"
|
||||
sed -i "/$cronname/d" "$CRASHDIR"/task/cron 2>/dev/null
|
||||
sed -i "/$cronname/d" "$TASKCFGDIR"/cron 2>/dev/null
|
||||
|
||||
break
|
||||
fi
|
||||
else
|
||||
task_des=$(echo "$task_txt" | awk '{print $2}')
|
||||
task_name=$(cat "$CRASHDIR"/task/task_${i18n}.list "$CRASHDIR"/task/task.user 2>/dev/null | grep "$task_id" | awk -F '#' '{print $3}')
|
||||
task_name=$(cat "$CRASHDIR"/task/task_${i18n}.list "$TASKCFGDIR"/task.user 2>/dev/null | grep "$task_id" | awk -F '#' '{print $3}')
|
||||
comp_box "$TASK5_CURRENT_TASK\033[36m$task_des\033[0m"
|
||||
btm_box "1) $TASK5_EDIT_TASK" \
|
||||
"2) $TASK5_DEL_TASK" \
|
||||
@@ -313,7 +315,7 @@ task_manager() {
|
||||
common_success
|
||||
;;
|
||||
3)
|
||||
task_command=$(cat "$CRASHDIR"/task/task_${i18n}.list "$CRASHDIR"/task/task.user 2>/dev/null | grep "$task_id" | awk -F '#' '{print $2}')
|
||||
task_command=$(cat "$CRASHDIR"/task/task_${i18n}.list "$TASKCFGDIR"/task.user 2>/dev/null | grep "$task_id" | awk -F '#' '{print $2}')
|
||||
eval "$task_command" && task_res="$TASK5_RUN_OK" || task_res="$TASK5_RUN_FAIL"
|
||||
msg_alert "\033[33m$TASK5_TASK_PREFIX$task_des】$task_res\033[0m"
|
||||
;;
|
||||
@@ -367,7 +369,8 @@ task_recom() {
|
||||
task_menu() {
|
||||
while true; do
|
||||
# 检测并创建自定义任务文件
|
||||
[ -f "$CRASHDIR"/task/task.user ] || echo "$TASK5_USER_FILE_HEADER" >"$CRASHDIR"/task/task.user
|
||||
mkdir -p "$TASKCFGDIR"
|
||||
[ -f "$TASKCFGDIR"/task.user ] || echo "$TASK5_USER_FILE_HEADER" >"$TASKCFGDIR"/task.user
|
||||
comp_box "\033[30;47m$TASK5_MENU_TITLE\033[0m"
|
||||
btm_box "1) $TASK5_MENU_1" \
|
||||
"2) $TASK5_MENU_2" \
|
||||
|
||||
@@ -409,7 +409,7 @@ setcustcore() {
|
||||
"3) \033[36mSagerNet/sing-box\033[32m@release\033[0m$UPG_CUSTOM_CORE_MENU_OFFICIAL" \
|
||||
"4) \033[36mDustinWin/mihomo\033[0m$UPG_CUSTOM_CORE_MENU_MULTI" \
|
||||
"5) \033[36mDustinWin/sing-boxr\033[0m$UPG_CUSTOM_CORE_MENU_MULTI" \
|
||||
"$UPG_CORE_MENU_9" \
|
||||
"9) $UPG_CUSTOM_CORE_LINK_MENU" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
|
||||
@@ -185,13 +185,17 @@ set_dns_adv() {
|
||||
"PROXY-DNS:" \
|
||||
"\033[36m$dns_fallback\033[0m" \
|
||||
"" \
|
||||
"DEFAULT-DNS:" \
|
||||
"RESOLVER-DNS:" \
|
||||
"\033[33m$dns_resolver\033[0m" \
|
||||
"" \
|
||||
"PROXY-SERVER-DNS:" \
|
||||
"\033[33m$dns_proxy_server\033[0m" \
|
||||
""
|
||||
btm_box "1) $DNS_ADV_EDIT_DIRECT" \
|
||||
"2) $DNS_ADV_EDIT_PROXY" \
|
||||
"3) $DNS_ADV_EDIT_DEFAULT" \
|
||||
"4) \033[32m$DNS_ADV_AUTO_ENCRYPT\033[0m" \
|
||||
"3) $DNS_ADV_EDIT_RESOLVER" \
|
||||
"4) $DNS_ADV_EDIT_PROXY_SERVER" \
|
||||
"5) \033[32m$DNS_ADV_AUTO_ENCRYPT\033[0m" \
|
||||
"9) \033[33m$DNS_ADV_RESET\033[0m" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
@@ -201,9 +205,9 @@ set_dns_adv() {
|
||||
break
|
||||
;;
|
||||
1)
|
||||
comp_box "$DNS_DIRECT_NOW\033[32m$dns_nameserver\033[0m"
|
||||
btm_box "\033[36m$DNS_INPUT_DIRECT_NEW\033[0m" \
|
||||
"$DNS_INPUT_DIRECT_RESET" \
|
||||
comp_box "$DNS_NOW\033[32m$dns_nameserver\033[0m"
|
||||
btm_box "\033[36m$DNS_INPUT_NEW\033[0m" \
|
||||
"$DNS_INPUT_RESET" \
|
||||
"$DNS_INPUT_REDIR_BACK"
|
||||
read -r -p "$DNS_INPUT> " res
|
||||
case "$res" in
|
||||
@@ -227,9 +231,9 @@ set_dns_adv() {
|
||||
esac
|
||||
;;
|
||||
2)
|
||||
comp_box "$DNS_PROXY_NOW\033[32m$dns_fallback\033[0m"
|
||||
btm_box "\033[36m$DNS_INPUT_PROXY_NEW\033[0m" \
|
||||
"$DNS_INPUT_PROXY_RESET" \
|
||||
comp_box "$DNS_NOW\033[32m$dns_fallback\033[0m"
|
||||
btm_box "\033[36m$DNS_INPUT_NEW\033[0m" \
|
||||
"$DNS_INPUT_RESET" \
|
||||
"$DNS_INPUT_REDIR_BACK"
|
||||
read -r -p "$DNS_INPUT> " res
|
||||
case "$res" in
|
||||
@@ -253,9 +257,9 @@ set_dns_adv() {
|
||||
esac
|
||||
;;
|
||||
3)
|
||||
comp_box "$DNS_DEFAULT_NOW\033[32m$dns_resolver\033[0m"
|
||||
btm_box "\033[36m$DNS_INPUT_DEFAULT_NEW\033[0m" \
|
||||
"$DNS_INPUT_DEFAULT_RESET" \
|
||||
comp_box "$DNS_NOW\033[32m$dns_resolver\033[0m"
|
||||
btm_box "\033[36m$DNS_INPUT_NEW\033[0m" \
|
||||
"$DNS_INPUT_RESET" \
|
||||
"$DNS_INPUT_REDIR_BACK"
|
||||
separator_line "="
|
||||
read -r -p "$DNS_INPUT> " res
|
||||
@@ -266,7 +270,7 @@ set_dns_adv() {
|
||||
"r")
|
||||
dns_resolver="223.5.5.5, 2400:3200::1"
|
||||
setconfig dns_resolver "'$dns_resolver'"
|
||||
common_failed
|
||||
common_success
|
||||
;;
|
||||
*)
|
||||
if echo "$res" | grep -qE '://.*::'; then
|
||||
@@ -280,6 +284,33 @@ set_dns_adv() {
|
||||
esac
|
||||
;;
|
||||
4)
|
||||
comp_box "$DNS_NOW\033[32m$dns_proxy_server\033[0m"
|
||||
btm_box "\033[36m$DNS_INPUT_NEW\033[0m" \
|
||||
"$DNS_INPUT_RESET" \
|
||||
"$DNS_INPUT_REDIR_BACK"
|
||||
separator_line "="
|
||||
read -r -p "$DNS_INPUT> " res
|
||||
case "$res" in
|
||||
0)
|
||||
continue
|
||||
;;
|
||||
"r")
|
||||
dns_proxy_server="$dns_resolver"
|
||||
setconfig dns_proxy_server "'$dns_proxy_server'"
|
||||
common_success
|
||||
;;
|
||||
*)
|
||||
if echo "$res" | grep -qE '://.*::'; then
|
||||
msg_alert "\033[31m$DNS_IPV6_NOT_SUPPORT\033[0m"
|
||||
else
|
||||
dns_proxy_server=$(echo "$res" | sed 's#|#,\ #g')
|
||||
setconfig dns_proxy_server "'$dns_proxy_server'"
|
||||
msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
5)
|
||||
line_break
|
||||
separator_line "="
|
||||
if echo "$crashcore" | grep -qE 'meta|singbox'; then
|
||||
|
||||
@@ -117,7 +117,6 @@ EOF
|
||||
fi
|
||||
# 通用部分生成
|
||||
[ "$skip_cert" != "OFF" ] && override_tls='true' || override_tls='false'
|
||||
[ -n "$(echo "$2" | grep 'oics.net')" ] && domain_resolver='dns_oix' || domain_resolver='dns_resolver'
|
||||
cat >>"$TMPDIR"/providers/providers.json <<EOF
|
||||
"health_check": {
|
||||
"enabled": true,
|
||||
@@ -126,7 +125,7 @@ EOF
|
||||
"timeout": "3s"
|
||||
},
|
||||
"override_dialer": {
|
||||
"domain_resolver": "$domain_resolver"
|
||||
"domain_resolver": "$dns_proxy_server"
|
||||
},
|
||||
"override_tls": {
|
||||
"enabled": true,
|
||||
|
||||
@@ -124,7 +124,7 @@ gen_link_config() {
|
||||
content_line ""
|
||||
common_back
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
totalnum=$(grep -acE '^5' "$CRASHDIR"/configs/servers.list)
|
||||
totalnum=$(grep -acE '^5' "$CRASHDIR"/configs/servers_"$i18n".list)
|
||||
if [ -z "$num" ] || [ "$num" -gt "$totalnum" ]; then
|
||||
errornum
|
||||
elif [ "$num" = 0 ]; then
|
||||
@@ -153,7 +153,7 @@ gen_link_server() {
|
||||
content_line ""
|
||||
common_back
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
totalnum=$(grep -acE '^3|^4' "$CRASHDIR"/configs/servers.list)
|
||||
totalnum=$(grep -acE '^3|^4' "$CRASHDIR"/configs/servers_"$i18n".list)
|
||||
if [ -z "$num" ] || [ "$num" -gt "$totalnum" ]; then
|
||||
errornum
|
||||
elif [ "$num" = 0 ]; then
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
. "$CRASHDIR"/libs/web_get_bin.sh
|
||||
. "$CRASHDIR"/libs/logger.sh
|
||||
. "$CRASHDIR"/libs/i18n.sh
|
||||
[ -z "$TASKCFGDIR" ] && TASKCFGDIR="$CRASHDIR"/configs/task
|
||||
|
||||
load_lang task_cmd
|
||||
|
||||
@@ -140,8 +141,8 @@ hotupdate() { #热更新订阅
|
||||
|
||||
case "$1" in
|
||||
[1-9][0-9][0-9])
|
||||
task_command=$(cat "$CRASHDIR"/task/task_${i18n}.list "$CRASHDIR"/task/task.user 2>/dev/null | grep "$1" | awk -F '#' '{print $2}')
|
||||
task_name=$(cat "$CRASHDIR"/task/task_${i18n}.list "$CRASHDIR"/task/task.user 2>/dev/null | grep "$1" | awk -F '#' '{print $3}')
|
||||
task_command=$(cat "$CRASHDIR"/task/task_${i18n}.list "$TASKCFGDIR"/task.user 2>/dev/null | grep "$1" | awk -F '#' '{print $2}')
|
||||
task_name=$(cat "$CRASHDIR"/task/task_${i18n}.list "$TASKCFGDIR"/task.user 2>/dev/null | grep "$1" | awk -F '#' '{print $3}')
|
||||
#task_logger "任务$task_name 开始执行"
|
||||
eval $task_command && task_res="$TASK_CMD_RES_OK" || task_res="$TASK_CMD_RES_FAIL"
|
||||
task_logger "$TASK_CMD_EXEC_PREFIX$2$TASK_CMD_EXEC_MID$task_res"
|
||||
|
||||
@@ -4,7 +4,26 @@
|
||||
[ -n "$__IS_MODULE_USERGUIDE_LOADED" ] && return
|
||||
__IS_MODULE_USERGUIDE_LOADED=1
|
||||
|
||||
load_lang userguide
|
||||
. "$CRASHDIR"/libs/check_dir_avail.sh
|
||||
|
||||
select_lang() {
|
||||
line_break
|
||||
comp_box "1) 简体中文" \
|
||||
"2) English"
|
||||
read -r -p "请选择语言 Please choose your language > " num
|
||||
case "$num" in
|
||||
1)
|
||||
echo chs >"$CRASHDIR"/configs/i18n.cfg
|
||||
;;
|
||||
2)
|
||||
echo en >"$CRASHDIR"/configs/i18n.cfg
|
||||
;;
|
||||
esac
|
||||
line_break
|
||||
load_lang menu
|
||||
load_lang common
|
||||
load_lang userguide
|
||||
}
|
||||
|
||||
forwhat() {
|
||||
while true; do
|
||||
@@ -89,7 +108,9 @@ forwhat() {
|
||||
|
||||
# 新手引导
|
||||
userguide() {
|
||||
. "$CRASHDIR"/libs/check_dir_avail.sh
|
||||
|
||||
select_lang
|
||||
|
||||
forwhat
|
||||
|
||||
# 检测小内存模式
|
||||
|
||||
@@ -38,21 +38,21 @@ if [ -n "$test" -o -n "$(pidof CrashCore)" ]; then
|
||||
ckcmd mtd_storage.sh && mtd_storage.sh save >/dev/null 2>&1 #Padavan保存/etc/storage
|
||||
#加载定时任务
|
||||
cronload | grep -v '^$' >"$TMPDIR"/cron_tmp
|
||||
[ -s "$CRASHDIR"/task/cron ] && cat "$CRASHDIR"/task/cron >>"$TMPDIR"/cron_tmp
|
||||
[ -s "$CRASHDIR"/task/running ] && cat "$CRASHDIR"/task/running >>"$TMPDIR"/cron_tmp
|
||||
[ -s "$TASKCFGDIR"/cron ] && cat "$TASKCFGDIR"/cron >>"$TMPDIR"/cron_tmp
|
||||
[ -s "$TASKCFGDIR"/running ] && cat "$TASKCFGDIR"/running >>"$TMPDIR"/cron_tmp
|
||||
[ "$bot_tg_service" = ON ] && echo "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh bot_tg #ShellCrash-TG_BOT守护进程" >>"$TMPDIR"/cron_tmp
|
||||
[ "$start_old" = ON ] && echo "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh shellcrash #ShellCrash保守模式守护进程" >>"$TMPDIR"/cron_tmp
|
||||
awk '!x[$0]++' "$TMPDIR"/cron_tmp >"$TMPDIR"/cron_tmp2 #删除重复行
|
||||
cronadd "$TMPDIR"/cron_tmp2
|
||||
rm -f "$TMPDIR"/cron_tmp "$TMPDIR"/cron_tmp2
|
||||
#加载条件任务
|
||||
[ -s "$CRASHDIR"/task/afstart ] && { . "$CRASHDIR"/task/afstart; } &
|
||||
[ -s "$CRASHDIR"/task/affirewall -a -s /etc/init.d/firewall -a ! -f /etc/init.d/firewall.bak ] && {
|
||||
[ -s "$TASKCFGDIR"/afstart ] && { . "$TASKCFGDIR"/afstart; } &
|
||||
[ -s "$TASKCFGDIR"/affirewall -a -s /etc/init.d/firewall -a ! -f /etc/init.d/firewall.bak ] && {
|
||||
#注入防火墙
|
||||
line=$(grep -En "fw.* restart" /etc/init.d/firewall | cut -d ":" -f 1)
|
||||
sed -i.bak "${line}a\\. $CRASHDIR/task/affirewall" /etc/init.d/firewall
|
||||
sed -i.bak "${line}a\\. $TASKCFGDIR/affirewall" /etc/init.d/firewall
|
||||
line=$(grep -En "fw.* start" /etc/init.d/firewall | cut -d ":" -f 1)
|
||||
sed -i "${line}a\\. $CRASHDIR/task/affirewall" /etc/init.d/firewall
|
||||
sed -i "${line}a\\. $TASKCFGDIR/affirewall" /etc/init.d/firewall
|
||||
} &
|
||||
exit 0
|
||||
else
|
||||
|
||||
@@ -79,7 +79,7 @@ EOF
|
||||
[ ! -d "$BINDIR"/ui ] && mkdir -p "$BINDIR"/ui
|
||||
[ -z "$crashcore" ] && crashcore=meta
|
||||
#执行条件任务
|
||||
[ -s "$CRASHDIR"/task/bfstart ] && . "$CRASHDIR"/task/bfstart
|
||||
[ -s "$TASKCFGDIR"/bfstart ] && . "$TASKCFGDIR"/bfstart
|
||||
#检查内核配置文件
|
||||
if [ ! -f "$core_config" ]; then
|
||||
if [ -n "$Url" -o -n "$Https" ]; then
|
||||
@@ -144,4 +144,3 @@ fi
|
||||
rm -rf /tmp/ShellCrash/debug.log
|
||||
rm -rf "$CRASHDIR"/debug.log
|
||||
exit 0
|
||||
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
#修饰clash配置文件
|
||||
modify_yaml() {
|
||||
prepare_clash_base_config() {
|
||||
##########需要变更的配置###########
|
||||
[ "$ipv6_dns" != "OFF" ] && dns_v6='true' || dns_v6='false'
|
||||
external="external-controller: 0.0.0.0:$db_port"
|
||||
@@ -55,9 +54,7 @@ EOF
|
||||
cat >>"$TMPDIR"/dns.yaml <<EOF
|
||||
respect-rules: true
|
||||
nameserver-policy: {'rule-set:cn': [ $dns_nameserver ]}
|
||||
proxy-server-nameserver : [ $dns_resolver ]
|
||||
proxy-server-nameserver-policy:
|
||||
'*.oix_nodes.com': '124.221.68.73:1053'
|
||||
proxy-server-nameserver : [ $dns_proxy_server ]
|
||||
nameserver: [ $dns_final ]
|
||||
EOF
|
||||
else
|
||||
@@ -69,6 +66,9 @@ EOF
|
||||
#域名嗅探配置
|
||||
[ "$sniffer" = "ON" ] && [ "$crashcore" = "meta" ] && sniffer_set="sniffer: {enable: true, parse-pure-ip: true, skip-domain: ['+.push.apple.com', 'Mijia Cloud'], sniff: {http: {ports: [80, 8080-8880], override-destination: true}, tls: {ports: [443, 8443]}, quic: {ports: [443, 8443]}}}"
|
||||
[ "$crashcore" = "clashpre" ] && [ "$dns_mod" = "redir_host" -o "$sniffer" = "ON" ] && exper="experimental: {ignore-resolve-fail: true, interface-name: en0,sniff-tls-sni: true}"
|
||||
}
|
||||
|
||||
generate_set_and_hosts_yaml() {
|
||||
#生成set.yaml
|
||||
cat >"$TMPDIR"/set.yaml <<EOF
|
||||
mixed-port: $mix_port
|
||||
@@ -114,6 +114,9 @@ EOF
|
||||
echo " '$hosts_domain': $hosts_ip" >>"$TMPDIR"/hosts.yaml
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
split_and_customize_yaml_parts() {
|
||||
#分割配置文件
|
||||
yaml_char='proxies proxy-groups proxy-providers rules rule-providers sub-rules listeners'
|
||||
for char in $yaml_char; do
|
||||
@@ -173,6 +176,9 @@ EOF
|
||||
IFS="$oldIFS"
|
||||
done
|
||||
}
|
||||
}
|
||||
|
||||
add_custom_inbounds_and_rules() {
|
||||
#添加自定义入站
|
||||
[ "$vms_service" = ON ] || [ "$sss_service" = ON ] && {
|
||||
. "$CRASHDIR"/configs/gateway.cfg
|
||||
@@ -193,11 +199,14 @@ EOF
|
||||
cat "$TMPDIR"/rules.yaml >>"$TMPDIR"/rules.add
|
||||
mv -f "$TMPDIR"/rules.add "$TMPDIR"/rules.yaml
|
||||
}
|
||||
}
|
||||
|
||||
merger_yaml() {
|
||||
#mix和route模式生成rule-providers
|
||||
[ "$dns_mod" = "mix" ] || [ "$dns_mod" = "route" ] && ! grep -Eq '^[[:space:]]*cn:' "$TMPDIR"/rule-providers.yaml && ! grep -q '^rule-providers' "$CRASHDIR"/yamls/others.yaml 2>/dev/null && {
|
||||
space=$(sed -n "1p" "$TMPDIR"/rule-providers.yaml | grep -oE '^ *') #获取空格数
|
||||
[ -z "$space" ] && space=' '
|
||||
echo "${space}cn: {type: http, behavior: domain, format: mrs, path: ./ruleset/cn.mrs, url: https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@update/bin/geodata/mrs_geosite_cn.mrs}" >>"$TMPDIR"/rule-providers.yaml
|
||||
echo "${space}cn: {type: http, behavior: domain, format: mrs, path: ./ruleset/cn.mrs, interval: 86400, url: https://testingcf.jsdelivr.net/gh/juewuy/ShellCrash@update/bin/geodata/mrs_geosite_cn.mrs}" >>"$TMPDIR"/rule-providers.yaml
|
||||
}
|
||||
#对齐rules中的空格
|
||||
sed -i 's/^ *-/ -/g' "$TMPDIR"/rules.yaml
|
||||
@@ -222,6 +231,9 @@ EOF
|
||||
done
|
||||
#合并完整配置文件
|
||||
cut -c 1- "$TMPDIR"/set.yaml $yaml_dns $yaml_hosts $yaml_user $yaml_others $yaml_add >"$TMPDIR"/config.yaml
|
||||
}
|
||||
|
||||
test_yaml() {
|
||||
#测试自定义配置文件
|
||||
"$TMPDIR"/CrashCore -t -d "$BINDIR" -f "$TMPDIR"/config.yaml >/dev/null
|
||||
if [ "$?" != 0 ]; then
|
||||
@@ -235,10 +247,24 @@ EOF
|
||||
cut -c 1- "$TMPDIR"/set.yaml $yaml_dns $yaml_add >"$TMPDIR"/config.yaml
|
||||
sed -i "/#自定义/d" "$TMPDIR"/config.yaml
|
||||
fi
|
||||
}
|
||||
|
||||
finalize_clash_yaml() {
|
||||
#建立软连接
|
||||
[ ""$TMPDIR"" = ""$BINDIR"" ] || ln -sf "$TMPDIR"/config.yaml "$BINDIR"/config.yaml 2>/dev/null || cp -f "$TMPDIR"/config.yaml "$BINDIR"/config.yaml
|
||||
#清理缓存
|
||||
for char in $yaml_char set set_bak dns hosts; do
|
||||
rm -f "$TMPDIR"/${char}.yaml
|
||||
done
|
||||
}
|
||||
}
|
||||
|
||||
#修饰clash配置文件
|
||||
modify_yaml() {
|
||||
prepare_clash_base_config
|
||||
generate_set_and_hosts_yaml
|
||||
split_and_customize_yaml_parts
|
||||
add_custom_inbounds_and_rules
|
||||
merger_yaml
|
||||
test_yaml
|
||||
finalize_clash_yaml
|
||||
}
|
||||
|
||||
@@ -7,10 +7,13 @@
|
||||
. "$CRASHDIR"/libs/compare.sh
|
||||
. "$CRASHDIR"/libs/set_config.sh
|
||||
. "$CRASHDIR"/libs/logger.sh
|
||||
. "$CRASHDIR"/libs/i18n.sh
|
||||
|
||||
update_servers() { #更新servers.list
|
||||
get_bin "$TMPDIR"/servers.list public/servers.list
|
||||
[ "$?" = 0 ] && mv -f "$TMPDIR"/servers.list "$CRASHDIR"/configs/servers.list
|
||||
load_lang
|
||||
|
||||
update_servers() { #更新servers_${i18n}.list
|
||||
get_bin "$TMPDIR"/servers_${i18n}.list public/servers_${i18n}.list
|
||||
[ "$?" = 0 ] && mv -f "$TMPDIR"/servers_${i18n}.list "$CRASHDIR"/configs/servers_${i18n}.list
|
||||
}
|
||||
gen_ua(){ #自动生成ua
|
||||
[ -z "$user_agent" -o "$user_agent" = "auto" ] && {
|
||||
@@ -26,10 +29,10 @@ gen_ua(){ #自动生成ua
|
||||
}
|
||||
get_core_config() { #下载内核配置文件
|
||||
[ -z "$rule_link" ] && rule_link=1
|
||||
[ -z "$server_link" ] || [ $server_link -gt $(grep -aE '^4' "$CRASHDIR"/configs/servers.list | wc -l) ] && server_link=1
|
||||
Server=$(grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | sed -n ""$server_link"p" | awk '{print $3}')
|
||||
Server_ua=$(grep -aE '^4' "$CRASHDIR"/configs/servers.list | sed -n ""$server_link"p" | awk '{print $4}')
|
||||
Config=$(grep -aE '^5' "$CRASHDIR"/configs/servers.list | sed -n ""$rule_link"p" | awk '{print $3}')
|
||||
[ -z "$server_link" ] || [ $server_link -gt $(grep -aE '^4' "$CRASHDIR"/configs/servers_${i18n}.list | wc -l) ] && server_link=1
|
||||
Server=$(grep -aE '^3|^4' "$CRASHDIR"/configs/servers_${i18n}.list | sed -n ""$server_link"p" | awk '{print $3}')
|
||||
Server_ua=$(grep -aE '^4' "$CRASHDIR"/configs/servers_${i18n}.list | sed -n ""$server_link"p" | awk '{print $4}')
|
||||
Config=$(grep -aE '^5' "$CRASHDIR"/configs/servers_${i18n}.list | sed -n ""$rule_link"p" | awk '{print $3}')
|
||||
gen_ua
|
||||
#如果传来的是Url链接则合成Https链接,否则直接使用Https链接
|
||||
if [ -z "$Https" ]; then
|
||||
|
||||
@@ -2,16 +2,16 @@ getlanip() { #获取局域网host地址
|
||||
i=1
|
||||
while [ "$i" -le "20" ]; do
|
||||
#ipv4局域网网段
|
||||
host_ipv4=$(ip route show scope link | grep -Ev 'wan|utun|iot|peer|docker|podman|virbr|vnet|ovs|vmbr|veth|vmnic|vboxnet|lxcbr|xenbr|vEthernet' | awk '{print $1}')
|
||||
host_ipv4=$(ip route show scope link | grep -Ev 'wan|utun|iot|peer|docker|podman|virbr|vnet|ovs|vmbr|veth|vmnic|vboxnet|lxcbr|xenbr|vEthernet|wgs|multicast|anycast' | awk '{print $1}')
|
||||
#ipv6局域网网段 - 从IPv4已识别的LAN接口获取全局IPv6前缀
|
||||
[ "$ipv6_redir" = "ON" ] && {
|
||||
lan_ifaces=$(ip route show scope link | grep -Ev 'ppp|wan|utun|iot|peer|docker|podman|virbr|vnet|ovs|vmbr|veth|vmnic|vboxnet|lxcbr|xenbr|vEthernet' | awk '{for(i=1;i<=NF;i++) if($i=="dev") {print $(i+1); break}}' | grep -v '^lo$' | sort -u)
|
||||
lan_ifaces=$(ip route show scope link | grep -Ev 'ppp|wan|utun|iot|peer|docker|podman|virbr|vnet|ovs|vmbr|veth|vmnic|vboxnet|lxcbr|xenbr|vEthernet|wgs|multicast|anycast' | awk '{for(i=1;i<=NF;i++) if($i=="dev") {print $(i+1); break}}' | grep -v '^lo$' | sort -u)
|
||||
host_ipv6=$(
|
||||
for iface in $lan_ifaces; do
|
||||
ip -6 addr show dev $iface 2>/dev/null
|
||||
done | grep 'scope global' | awk '{print $2}' | tr '\n' ' ' | sed 's/ $//'
|
||||
)
|
||||
[ -z "$host_ipv6" ] && host_ipv6=$(ip -6 route show | grep -Ev 'default|unreachable|fe80::/|wan|ppp|utun|iot|peer|docker|podman|virbr|vnet|ovs|vmbr|veth|vmnic|vboxnet|lxcbr|xenbr|vEthernet' | awk '{print $1}' | tr '\n' ' ' | sed 's/ $//')
|
||||
[ -z "$host_ipv6" ] && host_ipv6=$(ip -6 route show | grep -Ev 'default|unreachable|fe80::/|wan|ppp|utun|iot|peer|docker|podman|virbr|vnet|ovs|vmbr|veth|vmnic|vboxnet|lxcbr|xenbr|vEthernet|wgs|multicast|anycast' | awk '{print $1}' | tr '\n' ' ' | sed 's/ $//')
|
||||
}
|
||||
[ -f "$TMPDIR"/ShellCrash.log ] && break
|
||||
[ -n "$host_ipv4" -a "$ipv6_redir" != "ON" ] && break
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#初始化目录
|
||||
[ -z "$CRASHDIR" ] && CRASHDIR=$( cd $(dirname $0);cd ..;pwd)
|
||||
TASKCFGDIR="$CRASHDIR"/configs/task
|
||||
profile=/etc/profile
|
||||
. "$CRASHDIR"/libs/set_profile.sh
|
||||
. "$CRASHDIR"/libs/set_cron.sh
|
||||
|
||||
@@ -41,7 +41,7 @@ parse_singbox_dns() { #dns转换
|
||||
# 输出
|
||||
echo '"type": "'"$type"'", "server": "'"$server"'", "server_port": '"$port"','
|
||||
}
|
||||
modify_json() {
|
||||
extract_base_jsons() {
|
||||
#提取配置文件以获得outbounds.json,providers.json及route.json
|
||||
"$TMPDIR"/CrashCore format -c $core_config >"$TMPDIR"/format.json
|
||||
echo '{' >"$TMPDIR"/jsons/outbounds.json
|
||||
@@ -52,6 +52,9 @@ modify_json() {
|
||||
cat "$TMPDIR"/format.json | sed -n '/^ "providers":/,/^ "[a-z]/p' | sed '$d' >>"$TMPDIR"/jsons/providers.json
|
||||
}
|
||||
cat "$TMPDIR"/format.json | sed -n '/"route":/,/^\( "[a-z]\|}\)/p' | sed '$d' >>"$TMPDIR"/jsons/route.json
|
||||
}
|
||||
|
||||
generate_basic_jsons() {
|
||||
#生成endpoints.json
|
||||
[ "$ts_service" = ON ] || [ "$wg_service" = ON ] && [ "$zip_type" != upx ] && {
|
||||
. "$CRASHDIR"/configs/gateway.cfg
|
||||
@@ -96,6 +99,9 @@ EOF
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
}
|
||||
|
||||
prepare_dns_config() {
|
||||
#生成dns.json
|
||||
[ "$ipv6_dns" != "OFF" ] && strategy='prefer_ipv4' || strategy='ipv4_only'
|
||||
#获取detour出口
|
||||
@@ -131,6 +137,9 @@ EOF
|
||||
}
|
||||
#防泄露设置
|
||||
[ "$dns_protect" = "OFF" ] && sed -i 's/"server": "dns_proxy"/"server": "dns_direct"/g' "$TMPDIR"/jsons/route.json
|
||||
}
|
||||
|
||||
generate_dns_related_jsons() {
|
||||
#生成add_rule_set.json
|
||||
[ "$dns_mod" = "mix" ] || [ "$dns_mod" = "route" ] && ! grep -Eq '"tag" *:[[:space:]]*"cn"' "$CRASHDIR"/jsons/*.json && {
|
||||
[ "$crashcore" = "singboxr" ] && srs_path='"path": "./ruleset/cn.srs",'
|
||||
@@ -180,8 +189,8 @@ EOF
|
||||
"routing_mark": $routing_mark
|
||||
},
|
||||
{
|
||||
"tag": "dns_oix",
|
||||
"type": "udp", "server": "124.221.68.73", "server_port": 1053,
|
||||
"tag": "dns_proxy_server",
|
||||
$(parse_singbox_dns "$dns_proxy_server")
|
||||
"routing_mark": $routing_mark
|
||||
}
|
||||
],
|
||||
@@ -203,6 +212,9 @@ EOF
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
generate_route_and_inbounds_jsons() {
|
||||
#生成add_route.json
|
||||
#域名嗅探配置
|
||||
[ "$sniffer" != OFF ] && sniffer_set='{ "domain_suffix": [ "push.apple.com" ], "rule_set": [ "telegramip" ], "domain": [ "Mijia Cloud" ], "invert": true, "action": "sniff", "timeout": "500ms" },'
|
||||
@@ -292,6 +304,9 @@ EOF
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
}
|
||||
|
||||
generate_outbounds_and_experimental_jsons() {
|
||||
#生成add_outbounds.json
|
||||
grep -qE '"tag": "DIRECT"' "$TMPDIR"/jsons/outbounds.json || add_direct='{ "tag": "DIRECT", "type": "direct" }'
|
||||
grep -qE '"tag": "REJECT"' "$TMPDIR"/jsons/outbounds.json || add_reject='{ "tag": "REJECT", "type": "block" }'
|
||||
@@ -325,6 +340,9 @@ EOF
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
generate_custom_rules_json() {
|
||||
#生成自定义规则文件
|
||||
[ -n "$(grep -Ev ^# "$CRASHDIR"/yamls/rules.yaml 2>/dev/null)" ] && {
|
||||
cat "$CRASHDIR"/yamls/rules.yaml |
|
||||
@@ -348,6 +366,9 @@ EOF
|
||||
sed '$s/,$/ ] } }/' >"$TMPDIR"/jsons/cust_add_rules.json
|
||||
[ ! -s "$TMPDIR"/jsons/cust_add_rules.json ] && rm -rf "$TMPDIR"/jsons/cust_add_rules.json
|
||||
}
|
||||
}
|
||||
|
||||
normalize_and_finalize_jsons() {
|
||||
#清理route.json中的process_name规则以及"auto_detect_interface"
|
||||
sed -i '/"process_name": \[/,/],$/d' "$TMPDIR"/jsons/route.json
|
||||
sed -i '/"process_name": "[^"]*",/d' "$TMPDIR"/jsons/route.json
|
||||
@@ -367,6 +388,9 @@ EOF
|
||||
rm -rf "$TMPDIR"/jsons/${file}.json
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
link_custom_jsons() {
|
||||
#加载自定义配置文件
|
||||
mkdir -p "$TMPDIR"/jsons_base
|
||||
#以下为覆盖脚本的自定义文件
|
||||
@@ -382,6 +406,9 @@ EOF
|
||||
ln -sf "$CRASHDIR"/jsons/${char}.json "$TMPDIR"/jsons/cust_${char}.json
|
||||
}
|
||||
done
|
||||
}
|
||||
|
||||
validate_and_restore_custom_jsons() {
|
||||
#测试自定义配置文件
|
||||
if ! error=$("$TMPDIR"/CrashCore check -D "$BINDIR" -C "$TMPDIR"/jsons 2>&1); then
|
||||
echo $error
|
||||
@@ -393,6 +420,19 @@ EOF
|
||||
rm -rf "$TMPDIR"/jsons/cust_*
|
||||
mv -f "$TMPDIR"/jsons_base/* "$TMPDIR"/jsons 2>/dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
modify_json() {
|
||||
extract_base_jsons
|
||||
generate_basic_jsons
|
||||
prepare_dns_config
|
||||
generate_dns_related_jsons
|
||||
generate_route_and_inbounds_jsons
|
||||
generate_outbounds_and_experimental_jsons
|
||||
generate_custom_rules_json
|
||||
normalize_and_finalize_jsons
|
||||
link_custom_jsons
|
||||
validate_and_restore_custom_jsons
|
||||
#清理缓存
|
||||
rm -rf "$TMPDIR"/*.json
|
||||
rm -rf "$TMPDIR"/jsons_base
|
||||
|
||||
Reference in New Issue
Block a user