diff --git a/scripts/libs/logger.sh b/scripts/libs/logger.sh index f35faa4b..84b5c87b 100644 --- a/scripts/libs/logger.sh +++ b/scripts/libs/logger.sh @@ -4,15 +4,16 @@ __IS_LIB_LOGGER=1 #日志工具 . "$CRASHDIR"/libs/web_json.sh -#$1日志内容$2显示颜色$3是否推送 +#$1日志内容$2显示颜色$3是否推送$4是否覆盖上一条 logger() { TMPDIR=/tmp/ShellCrash [ -n "$2" -a "$2" != 0 ] && printf "\033[%sm%s\033[0m\n" "$2" "$1" log_text="$(date "+%G-%m-%d_%H:%M:%S")~$1" + [ "$4" = on ] && sed -i "/$1/d" "$TMPDIR"/ShellCrash.log echo "$log_text" >>"$TMPDIR"/ShellCrash.log [ "$(wc -l "$TMPDIR"/ShellCrash.log | awk '{print $1}')" -gt 199 ] && sed -i '1,20d' "$TMPDIR"/ShellCrash.log #推送远程日志 - [ -z "$3" ] && { + [ "$3" != off ] && { [ -n "$device_name" ] && log_text="$log_text($device_name)" [ -n "$push_TG" ] && { url="https://api.telegram.org/bot${push_TG}/sendMessage" diff --git a/scripts/libs/set_cron.sh b/scripts/libs/set_cron.sh index a38feb0a..e74cc18d 100644 --- a/scripts/libs/set_cron.sh +++ b/scripts/libs/set_cron.sh @@ -1,27 +1,38 @@ -crondir="$(crond -h 2>&1 | grep -oE 'Default:.*' | awk -F ":" '{print $2}')" +crondir="$(crond -h 2>&1 | grep -oE 'Default:.*' | awk -F ":" '{print $2}'| tr -d ' ')" [ ! -w "$crondir" ] && crondir="/etc/storage/cron/crontabs" [ ! -w "$crondir" ] && crondir="/var/spool/cron/crontabs" [ ! -w "$crondir" ] && crondir="/var/spool/cron" +[ -z "$USER" ] && USER=$(whoami 2>/dev/null) tmpcron=/tmp/cron_tmp touch "$tmpcron" -croncmd() { #定时任务工具 - if [ -w "$crondir" ] && [ -n "$USER" ];then - [ "$1" = "-l" ] && cat "$crondir"/"$USER" 2>/dev/null - [ -f "$1" ] && cat "$1" >"$crondir"/"$USER" - killall -HUP crond 2>/dev/null - elif [ -n "$(crontab -h 2>&1 | grep '\-l')" ]; then +cronadd() { #定时任务工具 + if crontab -h 2>&1 | grep -q '\-l'; then crontab "$1" + else + cat "$1" >"$crondir"/"$USER" && cru a REFRESH "0 0 1 1 * /bin/true" 2>/dev/null + fi +} +cronload() { #定时任务工具 + if [ -f "$crondir/$USER" ];then + cat "$crondir"/"$USER" 2>/dev/null + elif crontab -h 2>&1 | grep -q '\-l'; then + crontab -l else echo "找不到可用的crond或者crontab应用!No available crond or crontab application can be found!" fi } cronset() { #定时任务设置 # 参数1代表要移除的关键字,参数2代表要添加的任务语句 - croncmd -l >"$tmpcron" - sed -i "/$1/d" "$tmpcron" - echo "$2" >>"$tmpcron" - croncmd "$tmpcron" - rm -f "$tmpcron" + cronload | grep -v '^$' | grep -vF "$1" >"$tmpcron" + [ -n "$2" ] && echo "$2" >>"$tmpcron" + cronadd "$tmpcron" + #华硕/Padavan固件存档在本地,其他则删除 + if [ -d /jffs ] || [ -d /etc/storage/ShellCrash ];then + mv -f "$tmpcron" "$CRASHDIR"/task/cron + else + rm -f "$tmpcron" + fi + sleep 1 } diff --git a/scripts/libs/web_get.sh b/scripts/libs/web_get.sh index 51ccb5df..c05f7f4b 100644 --- a/scripts/libs/web_get.sh +++ b/scripts/libs/web_get.sh @@ -13,18 +13,26 @@ webget(){ #参数【$1】代表下载目录,【$2】代表在线地址 #参数【$3】代表输出显示,【$4】不启用重定向 #参数【$5】代表验证证书,【$6】使用自定义UA - [ -n "$6" ] && agent="--user-agent \"$6\"" + [ -n "$6" ] && agent="--user-agent $6" if wget --help 2>&1 | grep -q 'show-progress' >/dev/null 2>&1; then [ "$3" = "echooff" ] && progress='-q' || progress='-q --show-progress' [ "$4" = "rediroff" ] && redirect='--max-redirect=0' || redirect='' - [ "$5" = "skipceroff" ] && certificate='' || certificate='--no-check-certificate' + if [ "$5" = "skipceroff" ] || [ "$skip_cert" = OFF ];then + certificate='' + else + certificate='--no-check-certificate' + fi wget -Y on $agent $progress $redirect $certificate --timeout=3 -O "$1" "$url" && return 0 #成功则退出否则重试 wget -Y off $agent $progress $redirect $certificate --timeout=5 -O "$1" "$2" return $? elif curl --version >/dev/null 2>&1; then [ "$3" = "echooff" ] && progress='-s' || progress='-#' [ "$4" = "rediroff" ] && redirect='' || redirect='-L' - [ "$5" = "skipceroff" ] && certificate='' || certificate='-k' + if [ "$5" = "skipceroff" ] || [ "$skip_cert" = OFF ];then + certificate='' + else + certificate='-k' + fi if curl --version | grep -q '^curl 8.' && ckcmd base64; then auth_b64=$(printf '%s' "$authentication" | base64) result=$(curl $agent -w '%{http_code}' --connect-timeout 3 --proxy-header "Proxy-Authorization: Basic $auth_b64" $progress $redirect $certificate -o "$1" "$url") diff --git a/scripts/menus/5_task.sh b/scripts/menus/5_task.sh index 9f186589..68850718 100644 --- a/scripts/menus/5_task.sh +++ b/scripts/menus/5_task.sh @@ -187,9 +187,7 @@ task_add() { # 任务删除 task_del() { # 删除定时任务 - croncmd -l >"$TMPDIR"/cron - sed -i "/$1/d" "$TMPDIR"/cron && croncmd "$TMPDIR"/cron - rm -f "$TMPDIR"/cron + cronset "$1" # 删除条件任务 sed -i "/$1/d" "$CRASHDIR"/task/cron 2>/dev/null sed -i "/$1/d" "$CRASHDIR"/task/bfstart 2>/dev/null @@ -312,7 +310,7 @@ task_manager() { line_break separator_line "=" # 抽取并生成临时列表 - croncmd -l >"$TMPDIR"/task_cronlist + 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 2>/dev/null | sort -u | grep -oE " #.*" | grep -v "守护" | awk -F '#' '{print "0 旧版任务-"$2}' >>"$TMPDIR"/task_list @@ -368,9 +366,8 @@ task_manager() { read -r -p "请输入对应标号> " res if [ "$res" = 1 ]; then cronname=$(echo "$task_txt" | awk -F '-' '{print $2}') - croncmd -l >"$TMPDIR"/conf && sed -i "/$cronname/d" "$TMPDIR"/conf && croncmd "$TMPDIR"/conf - sed -i "/$cronname/d" $clashdir/tools/cron 2>/dev/null - rm -f "$TMPDIR"/conf + cronset "$cronname" + sed -i "/$cronname/d" "$CRASHDIR"/task/cron 2>/dev/null break fi diff --git a/scripts/menus/bot_tg_service.sh b/scripts/menus/bot_tg_service.sh index ecc07793..d686d337 100644 --- a/scripts/menus/bot_tg_service.sh +++ b/scripts/menus/bot_tg_service.sh @@ -2,7 +2,6 @@ . "$CRASHDIR"/libs/set_cron.sh bot_tg_start(){ - bot_tg_stop . "$CRASHDIR"/starts/start_legacy.sh start_legacy "$CRASHDIR/menus/bot_tg.sh" 'bot_tg' bot_tg_cron diff --git a/scripts/menus/task_cmd.sh b/scripts/menus/task_cmd.sh index 5913f0fd..4e39bd25 100644 --- a/scripts/menus/task_cmd.sh +++ b/scripts/menus/task_cmd.sh @@ -14,7 +14,11 @@ task_logger(){ [ "$task_push" = 1 ] && push= || push=off [ -n "$2" -a "$2" != 0 ] && echo -e "\033[$2m$1\033[0m" [ "$3" = 'off' ] && push=off - echo "$1" |grep -qE '(每隔|时每)([1-9]|[1-9][0-9])分钟' || logger "$1" 0 "$push" + echo "$1" |grep -qE '(每隔|时每)([1-9]|[1-9][0-9])分钟' && { + push=off + cover=on + } + logger "$1" 0 "$push" "$cover" } #任务命令 @@ -31,7 +35,7 @@ update_core(){ #自动更新内核 task_logger "任务【自动更新内核】中止-未检测到版本更新" return 0 else - . "$CRASHDIR"/libs/core_webget.sh && core_webget #调用下载工具 + . "$CRASHDIR"/libs/core_tools.sh && core_webget #调用下载工具 case "$?" in 0) task_logger "任务【自动更新内核】下载完成,正在重启服务!" @@ -57,18 +61,18 @@ update_scripts(){ #自动更新脚本 task_logger "任务【自动更新脚本】中止-未检测到版本更新" return 0 else - get_bin "$TMPDIR"/clashfm.tar.gz "bin/update.tar.gz" + get_bin "$TMPDIR"/ShellCrash.tar.gz "ShellCrash.tar.gz" if [ "$?" != "0" ];then - rm -rf "$TMPDIR"/clashfm.tar.gz + rm -rf "$TMPDIR"/ShellCrash.tar.gz task_logger "任务【自动更新内核】出错-下载失败!" return 1 else #停止服务 "$CRASHDIR"/start.sh stop #解压 - tar -zxf "$TMPDIR"/clashfm.tar.gz ${tar_para} -C "$CRASHDIR"/ + tar -zxf "$TMPDIR"/ShellCrash.tar.gz ${tar_para} -C "$CRASHDIR"/ if [ $? -ne 0 ];then - rm -rf "$TMPDIR"/clashfm.tar.gz + rm -rf "$TMPDIR"/ShellCrash.tar.gz task_logger "任务【自动更新内核】出错-解压失败!" "$CRASHDIR"/start.sh start return 1 @@ -115,7 +119,7 @@ reset_firewall(){ #重设透明路由防火墙 "$CRASHDIR"/start.sh afstart } ntp(){ - [ "$crashcore" != singbox ] && ckcmd ntpd && ntpd -n -q -p 203.107.6.88 >/dev/null 2>&1 || exit 0 + ckcmd ntpd && ntpd -n -q -p 203.107.6.88 >/dev/null 2>&1 || exit 0 } web_save_auto(){ . "$CRASHDIR"/libs/web_save.sh && web_save diff --git a/scripts/starts/afstart.sh b/scripts/starts/afstart.sh index 504289e6..6a493e63 100644 --- a/scripts/starts/afstart.sh +++ b/scripts/starts/afstart.sh @@ -33,14 +33,12 @@ if [ -n "$test" -o -n "$(pidof CrashCore)" ]; then sleep 5 logger ShellCrash服务已启动! } & - ckcmd mtd_storage.sh && mtd_storage.sh save >/dev/null 2>&1 & #Padavan保存/etc/storage + ckcmd mtd_storage.sh && mtd_storage.sh save >/dev/null 2>&1 #Padavan保存/etc/storage #加载定时任务 - [ -s "$CRASHDIR"/task/cron ] && croncmd "$CRASHDIR"/task/cron + [ -s "$CRASHDIR"/task/cron ] && cronadd "$CRASHDIR"/task/cron [ -s "$CRASHDIR"/task/running ] && { cronset '运行时每' - while read line; do - cronset '2fjdi124dd12s' "$line" - done <"$CRASHDIR"/task/running + cronadd "$CRASHDIR"/task/running } [ "$start_old" = "ON" ] && cronset '保守模式守护进程' "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh shellcrash #ShellCrash保守模式守护进程" #加载条件任务 @@ -48,7 +46,7 @@ if [ -n "$test" -o -n "$(pidof CrashCore)" ]; then [ -s "$CRASHDIR"/task/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\\. $CRASHDIR/task/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 } & diff --git a/scripts/starts/core_config.sh b/scripts/starts/core_config.sh index b89427c8..1edeb645 100644 --- a/scripts/starts/core_config.sh +++ b/scripts/starts/core_config.sh @@ -66,7 +66,7 @@ get_core_config() { #下载内核配置文件 exit 1 else retry=$((retry + 1)) - logger "配置文件获取失败!" 31 + logger "配置文件获取失败!" 31 off on if [ "$retry" = 1 ]; then echo -e "\033[32m尝试更新服务器列表并使用其他服务器获取配置!\033[0m" update_servers diff --git a/scripts/starts/general_init.sh b/scripts/starts/general_init.sh index 5f547800..8a8bcde4 100644 --- a/scripts/starts/general_init.sh +++ b/scripts/starts/general_init.sh @@ -23,7 +23,7 @@ fi #写入环境变量 set_profile "$profile" #启动进程或删除守护进程 -if [ -f "$CRASHDIR"/.dis_startup ];then +if [ -f "$CRASHDIR"/.dis_startup ] || [ -f "$CRASHDIR"/.start_error ];then cronset "保守模式守护进程" else "$CRASHDIR"/start.sh start diff --git a/scripts/starts/snapshot_init.sh b/scripts/starts/snapshot_init.sh index da012fa1..b21107bd 100644 --- a/scripts/starts/snapshot_init.sh +++ b/scripts/starts/snapshot_init.sh @@ -71,11 +71,11 @@ auto_start(){ set_profile '/etc/profile' } #启动服务 - if [ ! -f "$CRASHDIR"/.dis_startup ]; then + if [ ! -f "$CRASHDIR"/.dis_startup ] && [ ! -f "$CRASHDIR"/.start_error ]; then #AX6S/AX6000修复tun功能 [ -s "$CRASHDIR"/tools/tun.ko ] && tunfix #小米7000/小米万兆修复tproxy - [ -f /etc/init.d/qca-nss-ecm ] && [ "$redir_mod" = 'Tproxy' ] && tproxyfix + [ -f /etc/init.d/qca-nss-ecm ] && echo "$redir_mod" | grep -q 'Tproxy' && tproxyfix #自动覆盖根证书文件 [ -s "$CRASHDIR"/tools/ca-certificates.crt ] && cp -f "$CRASHDIR"/tools/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt #启动服务 diff --git a/scripts/starts/start_legacy_wd.sh b/scripts/starts/start_legacy_wd.sh index 277fa838..281540d1 100644 --- a/scripts/starts/start_legacy_wd.sh +++ b/scripts/starts/start_legacy_wd.sh @@ -4,7 +4,7 @@ PIDFILE="/tmp/ShellCrash/$1.pid" if [ -f "$PIDFILE" ]; then PID="$(cat "$PIDFILE")" - if [ -n "$PID" ] && kill -0 "$PID" 2>/dev/null; then + if [ -n "$PID" ] && [ -d "/proc/$PID" ]; then return 0 fi fi