From 26fca6b359e342e62c0c782b496ab460bd332199 Mon Sep 17 00:00:00 2001 From: juewuy Date: Sat, 24 Jan 2026 22:05:49 +0800 Subject: [PATCH] =?UTF-8?q?~=E5=AE=8C=E5=96=84=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD=EF=BC=8C=E7=8E=B0?= =?UTF-8?q?=E5=9C=A8=E6=94=AF=E6=8C=81=EF=BC=9A=20=20=C2=B7=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E7=AE=A1=E7=90=86=E5=90=84=E7=A7=8D=E8=AE=A2=E9=98=85?= =?UTF-8?q?/=E8=8A=82=E7=82=B9=E9=93=BE=E6=8E=A5=EF=BC=8C=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=EF=BC=8C=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0base64=E6=96=87=E4=BB=B6=20=20=C2=B7=E5=8D=95=E7=8B=AC?= =?UTF-8?q?=E8=AE=A2=E9=98=85=E3=80=81=E6=9C=AC=E5=9C=B0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E9=80=9A=E8=BF=87providers=E7=94=9F=E6=88=90=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=20=20=C2=B7=E5=8D=95=E7=8B=AC=E8=AE=A2?= =?UTF-8?q?=E9=98=85=E3=80=81=E8=8A=82=E7=82=B9=E9=80=9A=E8=BF=87Subconver?= =?UTF-8?q?ter=E8=8E=B7=E5=8F=96=E5=9C=A8=E7=BA=BF=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=20=20=C2=B7=E5=8D=95=E7=8B=AC=E8=AE=A2?= =?UTF-8?q?=E9=98=85=E3=80=81=E6=9C=AC=E5=9C=B0=E6=96=87=E4=BB=B6=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E4=BD=9C=E4=B8=BA=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=20=20=C2=B7=E6=9C=AC=E5=9C=B0=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=85=A8=E9=83=A8=E6=8F=90=E4=BE=9B=E8=80=85=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=9C=A8=E7=BA=BF=E7=94=9F=E6=88=90=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E8=AE=A2=E9=98=85=E3=80=81=E5=88=86=E4=BA=AB=E9=93=BE?= =?UTF-8?q?=E6=8E=A5=20=20=C2=B7=E6=9C=AC=E5=9C=B0=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E5=81=A5=E5=BA=B7=E6=A3=80=E6=9F=A5/=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=97=B4=E9=9A=94=E3=80=81=E6=AD=A3=E5=88=99?= =?UTF-8?q?=E7=AD=9B=E9=80=89=E5=8F=8AUA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/lang/chs/common.lang | 2 +- scripts/lang/en/common.lang | 2 +- scripts/menus/1_start.sh | 10 +- scripts/menus/6_core_config.sh | 178 ++++++++++++---------- scripts/menus/common.sh | 4 + scripts/menus/providers.sh | 233 ++--------------------------- scripts/menus/providers_clash.sh | 123 +++++++++++++++ scripts/menus/providers_singbox.sh | 129 ++++++++++++++++ scripts/menus/subconverter.sh | 15 +- scripts/menus/tui_lite.sh | 2 +- scripts/starts/bfstart.sh | 4 + 11 files changed, 394 insertions(+), 308 deletions(-) create mode 100644 scripts/menus/providers_clash.sh create mode 100644 scripts/menus/providers_singbox.sh diff --git a/scripts/lang/chs/common.lang b/scripts/lang/chs/common.lang index 0bdfae85..0895be08 100644 --- a/scripts/lang/chs/common.lang +++ b/scripts/lang/chs/common.lang @@ -9,4 +9,4 @@ COMMON_MOD="模式" COMMON_ERR_NUM="请输入正确的数字!" COMMON_ERR_LETTER="请输入正确的字母或数字!" COMMON_ERR_INPUT="输入错误,请重新输入!" -COMMON_ERR_INPUT="操作已取消!" +COMMON_ERR_CANCEL="操作已取消!" diff --git a/scripts/lang/en/common.lang b/scripts/lang/en/common.lang index 8a089b1e..25d435ee 100644 --- a/scripts/lang/en/common.lang +++ b/scripts/lang/en/common.lang @@ -9,4 +9,4 @@ COMMON_MOD="Mod" COMMON_ERR_NUM="Please enter a valid number!" COMMON_ERR_LETTER="Please enter a valid letter or number!" COMMON_ERR_INPUT="Invalid input, please try again!" -COMMON_ERR_INPUT="Operation cancelled!" +COMMON_ERR_CANCEL="Operation cancelled!" diff --git a/scripts/menus/1_start.sh b/scripts/menus/1_start.sh index 7548dd4e..64371e81 100644 --- a/scripts/menus/1_start.sh +++ b/scripts/menus/1_start.sh @@ -32,10 +32,12 @@ start_core() { fi if [ ! -s "$core_config" ] && [ -s "$CRASHDIR/configs/providers.cfg" ]; then - [ "$crashcore" = singboxr ] && coretype=singbox - [ "$crashcore" = meta -o "$crashcore" = clashpre ] && coretype=clash - - . "$CRASHDIR/menus/6_core_config.sh" && gen_"${coretype}"_providers + if [ "$crashcore" = singboxr ];then + CORE_TYPE=singbox + else + CORE_TYPE=clash + fi + . "$CRASHDIR/menus/providers_$CORE_TYPE.sh" && gen_providers line_break separator_line "=" diff --git a/scripts/menus/6_core_config.sh b/scripts/menus/6_core_config.sh index d3e3d4c6..c19d556b 100644 --- a/scripts/menus/6_core_config.sh +++ b/scripts/menus/6_core_config.sh @@ -5,10 +5,13 @@ __IS_MODULE_6_CORECONFIG_LOADED=1 if echo "$crashcore" | grep -q 'singbox'; then - CONFIG_PATH="$CRASHDIR"/yamls/config.json + CONFIG_PATH="$CRASHDIR"/jsons/config.json + CORE_TYPE=singbox else - CONFIG_PATH="$CRASHDIR"/jsons/config.yaml + CONFIG_PATH="$CRASHDIR"/yamls/config.yaml + CORE_TYPE=clash fi +URI_EXP='ss|vmess|vless|trojan|tuic|anytls|shadowtls|hysteria(2)?' # 配置文件主界面 set_core_config() { @@ -17,15 +20,14 @@ set_core_config() { [ -s "$CRASHDIR"/configs/providers.cfg ] || [ -s "$CRASHDIR"/configs/providers_uri.cfg ] && { echo -e "\033[36m输入数字可管理对应提供者\033[0m" cat "$CRASHDIR"/configs/providers.cfg "$CRASHDIR"/configs/providers_uri.cfg 2>/dev/null | - awk '{print " " NR ") " $1 "\t" substr($2,1,30) "..."}' + awk '{print " " NR ") " $1 " \t\t" substr($2,1,30) "..."}' separator_line "-" } - content_line "a) \033[32m添加提供者\033[0m(支持订阅/节点/本地文件)" - content_line "b) \033[36m本地生成配置文件\033[0m(基于providers,推荐!)" - content_line "c) \033[33m在线生成配置文件\033[0m(Subconverter)" + content_line "a) \033[32m添加提供者\033[0m(支持订阅/分享链接及本地文件)" + content_line "b) \033[36m本地生成配置文件\033[0m(By Providers,推荐!)" + content_line "c) \033[33m在线生成配置文件\033[0m(By Subconverter)" content_line "d) \033[31m清空提供者列表\033[0m" content_line "e) \033[36m自定义配置文件\033[0m" - content_line "f) \033[33m还原配置文件\033[0m" common_back read -r -p "$COMMON_INPUT_L > " num @@ -35,10 +37,9 @@ set_core_config() { ;; [1-9] | [1-9][0-9]) line=$(cat "$CRASHDIR"/configs/providers.cfg "$CRASHDIR"/configs/providers_uri.cfg 2>/dev/null | sed -n "$num p") - setproviders + setproviders "$line" ;; a) - line='' setproviders ;; b) @@ -80,28 +81,6 @@ set_core_config() { [ "$checkcfg" != "$checkcfg_new" ] && checkrestart fi ;; - f) - if [ ! -f "$CONFIG_PATH".bak ]; then - echo "-----------------------------------------------" - content_line "\033[31m没有找到配置文件的备份!\033[0m" - else - echo "-----------------------------------------------" - content_line "备份文件共有\033[32m$(wc -l <$"$CONFIG_PATH".bak)\033[0m行内容" - content_line "当前文件共有\033[32m$(wc -l <$"$CONFIG_PATH")\033[0m行内容" - read -p "确认还原配置文件?此操作不可逆![1/0] > " res - if [ "$res" = '1' ]; then - mv "$CONFIG_PATH".bak "$CONFIG_PATH" - echo "----------------------------------------------" - content_line "\033[32m配置文件已还原!请手动重启服务!\033[0m" - sleep 1 - break - else - echo "-----------------------------------------------" - content_line "\033[31m操作已取消!返回上级菜单!\033[0m" - sleep 1 - fi - fi - ;; *) error_letter @@ -112,23 +91,24 @@ set_core_config() { } setproviders() { - case "$(echo "$line" | cut -d ' ' -f 2)" in + case "$(echo "$@" | cut -d ' ' -f 2)" in http* | ./providers*) - set -- $line + set -- $@ name=$1 link=$2 interval=$3 interval2=$4 ua=$5 - exclude=$6 - include=$7 + exclude_w=${6#\#} + include_w=${7#\#} ;; - *) + *://*) set -- $line name=$1 link_uri=$2 ;; esac + last_name="$name" [ -z "$interval" ] && interval=3 [ -z "$interval2" ] && interval2=12 [ -z "$ua" ] && ua='clash.meta' @@ -141,13 +121,13 @@ setproviders() { separator_line '-' content_line "3) 设置\033[33m健康检查间隔\033[0m:\t\033[47;30m$interval\033[0m" content_line "4) 设置\033[36m自动更新间隔\033[0m:\t\033[47;30m$interval2\033[0m" - content_line "5) 设置\033[31m排除节点正则\033[0m:\t\033[47;30m$exclude\033[0m" - content_line "6) 设置\033[32m包含节点正则\033[0m:\t\033[47;30m$include\033[0m" + content_line "5) 设置\033[31m排除节点正则\033[0m:\t\033[47;30m$exclude_w\033[0m" + content_line "6) 设置\033[32m包含节点正则\033[0m:\t\033[47;30m$include_w\033[0m" echo "$link" | grep -q '^http' && content_line "7) 设置\033[33m虚拟浏览器UA\033[0m:\t\033[47;30m$ua\033[0m" } separator_line "-" - content_line "a) \033[32m添加此提供者\033[0m" + content_line "a) \033[36m保存此提供者\033[0m" [ -n "$link" ] && content_line "b) \033[32m本地生成\033[0m仅包含此提供者的配置文件" echo "$link$link_uri" | grep -q '://' && @@ -175,23 +155,58 @@ setproviders() { ;; 2) separator_line "=" - content_line "订阅链接-支持https/http开头的clash配置文件订阅链接" - content_line "分享链接-支持ss|vmess|vless|trojan|tuic|anytls|shadowtls|hysteria(2)..." - content_line "本地文件-必须放在此目录下:\033[32m$CRASHDIR/providers\033[0m" + content_line "\033[33m订阅链接\033[0m: https/http开头的clash配置文件订阅链接" + content_line "\033[36m分享链接\033[0m: $URI_EXP" + content_line "\033[33m本地文件\033[0m: 必须放在此目录下:\033[32m$CRASHDIR/providers\033[0m" + content_line "\033[36m Base64 \033[0m: 请直接写入本地文件" separator_line "-" - read -p "请输入具体链接或文件名 > " text + list=$( + for f in "$CRASHDIR"/providers/*; do + [ "$f" = "$CRASHDIR"/providers/uri_group ] && continue + [ -f "$f" ] || continue + printf '%s\n' "${f##*/}" + done | sort -V + ) + if [ -n "$list" ];then + i=1 + printf '%s\n' "$list" | while IFS= read -r f; do + content_line "$i) $f" + i=$((i+1)) + done + separator_line "-" + read -r -p "请选择对应文件或输入具体链接 > " text + else + read -r -p "请输入具体链接 > " text + fi text=$(echo "$text" | sed 's/ //g') #去空格 - if echo "$text" | grep -q '^http'; then + case "$text" in + http*) + #处理订阅链接 text=$(echo "$text" | sed 's/ *(.*)//g; s/#.*//g') #处理注释及超链接 link="$text" - elif [ -n "$(echo $text | grep -E '^ss|vmess|vless|trojan|tuic|anytls|shadowtls|hysteria(2)')" ]; then - link_uri=$(echo "$text" | sed 's/#.*//g') # 删除注释 - [ -z "$name" ] && name=$(echo "$text" | grep -o '#.*$' | cut -c2-) - elif [ -f "$CRASHDIR/providers/$text" ]; then - link="./providers/$text" - else - error_input - fi + common_success + ;; + [1-9] | [1-9][0-9]) + #处理本地文件 + file=$(printf '%s\n' "$list" | sed -n "${text}p") + if [ -s "$CRASHDIR/providers/$file" ]; then + link="$file" + common_success + else + errornum + fi + ;; + *) + #处理分享链接 + if [ -n "$(echo $text | grep -E "^$URI_EXP")" ]; then + link_uri=$(echo "$text" | sed 's/#.*//g') # 删除注释 + [ -z "$name" ] && name=$(echo "$text" | grep -o '#.*$' | cut -c2-) + common_success + else + error_input + fi + ;; + esac ;; 3) read -p "请输入健康检查间隔(单位:分钟) > " num @@ -210,38 +225,49 @@ setproviders() { fi ;; 5) - read -p "请输入需要排除的节点关键字(支持正则) > " text - if [ -n "$text" ]; then - exclude="$text" - else - error_input - fi + read -p "请输入需要排除的节点关键字(支持正则,不支持空格,输入0删除) > " text + text=$(echo "$text" | sed 's/ //g') #去空格 + case "$text" in + 0) + exclude_w='' + ;; + *) + exclude_w="$text" + ;; + esac ;; 6) - read -p "请输入需要筛选使用的节点关键字(支持正则) > " text - if [ -n "$text" ]; then - include="$text" - else - error_input - fi + read -p "请输入需要筛选使用的节点关键字(支持正则,不支持空格,输入0删除) > " text + text=$(echo "$text" | sed 's/ //g') #去空格 + case "$text" in + 0) + include_w='' + ;; + *) + include_w="$text" + ;; + esac ;; 7) - read -p "请输入浏览器UA > " text - if [ -n "$text" ]; then - ua="$text" - else - error_input - fi + read -p "请输入浏览器UA(输入0重置) > " text + case "$text" in + 0) + include_w='clash.meta' + ;; + *) + include_w="$text" + ;; + esac ;; a) addproviders && common_success break ;; b) - if echo "$link" | grep -q '^http'; then + if [ -n "$name" ] && [ -n "$link" ]; then addproviders - . "$CRASHDIR"/menus/providers.sh - gen_${coretype}_providers "$name" "$link" "$interval" "$interval2" "$exclude" "$include" + . "$CRASHDIR/menus/providers_$CORE_TYPE.sh" + gen_providers "$name" "$link" "$interval" "$interval2" "$ua" "#$exclude_w" "#$include_w" else content_line "\033[31m$请先完成必填选项!\033[0m" fi @@ -302,11 +328,11 @@ setproviders() { addproviders() { [ -n "$name" ] && { - [ -s "$CRASHDIR"/configs/providers.cfg ] && sed -i "/^$name /d" "$CRASHDIR"/configs/providers.cfg - [ -s "$CRASHDIR"/configs/providers_uri.cfg ] && sed -i "/^$name /d" "$CRASHDIR"/configs/providers_uri.cfg + [ -s "$CRASHDIR"/configs/providers.cfg ] && sed -i "/^$last_name /d" "$CRASHDIR"/configs/providers.cfg + [ -s "$CRASHDIR"/configs/providers_uri.cfg ] && sed -i "/^$last_name /d" "$CRASHDIR"/configs/providers_uri.cfg } if [ -n "$name" ] && [ -n "$link" ]; then - echo "$name $link $interval $interval2 $ua $exclude $include" >>"$CRASHDIR"/configs/providers.cfg + echo "$name $link $interval $interval2 $ua #$exclude_w #$include_w" >>"$CRASHDIR"/configs/providers.cfg return 0 elif [ -n "$name" ] && [ -n "$link_uri" ]; then echo "$name $link_uri" >>"$CRASHDIR"/configs/providers_uri.cfg diff --git a/scripts/menus/common.sh b/scripts/menus/common.sh index 5d38b815..55c8aeb6 100644 --- a/scripts/menus/common.sh +++ b/scripts/menus/common.sh @@ -32,6 +32,10 @@ error_input() { error_report "\033[31m$COMMON_ERR_INPUT\033[0m" } +error_cancel() { + error_report "\033[31m$COMMON_ERR_CANCEL\033[0m" +} + cancel_back() { separator_line "-" content_line "$COMMON_CANCEL" diff --git a/scripts/menus/providers.sh b/scripts/menus/providers.sh index 5a981454..cc657967 100644 --- a/scripts/menus/providers.sh +++ b/scripts/menus/providers.sh @@ -5,220 +5,23 @@ __IS_MODULE_PROVIDERS=1 if [ "$crashcore" = singboxr ]; then - coretype=singbox + CORE_TYPE=singbox else - coretype=clash + CORE_TYPE=clash fi -gen_clash_providers(){ #生成clash的providers配置文件 - gen_clash_providers_txt(){ - if [ -n "$(echo $2|grep -E '^./')" ];then - local type=file - local path=$2 - local download_url= - else - local type=http - local path="./providers/${1}.yaml" - local download_url=$2 - fi - cat >> $TMPDIR/providers/providers.yaml <> $TMPDIR/providers/providers.yaml < "$TMPDIR"/providers/providers.yaml - #切割模版文件 - sed -n '/^proxy-groups:/,/^[a-z]/ { /^rule/d; p; }' "$TMPDIR"/provider_temp_file > "$TMPDIR"/providers/proxy-groups.yaml - sed -n '/^rule/,$p' "$TMPDIR"/provider_temp_file > "$TMPDIR"/providers/rules.yaml - rm -rf "$TMPDIR"/provider_temp_file - #生成providers模块 - if [ -n "$2" ];then - gen_clash_providers_txt $1 $2 - providers_tags=$1 - echo ' - {name: '${1}', type: url-test, tolerance: 100, lazy: true, use: ['${1}']}' >> "$TMPDIR"/providers/proxy-groups.yaml - else - providers_tags='' - while read line;do - tag=$(echo $line | awk '{print $1}') - url=$(echo $line | awk '{print $2}') - providers_tags=$(echo "$providers_tags, $tag" | sed 's/^, //') - gen_clash_providers_txt $tag $url - echo ' - {name: '${tag}', type: url-test, tolerance: 100, lazy: true, use: ['${tag}']}' >> "$TMPDIR"/providers/proxy-groups.yaml - done < "$CRASHDIR"/configs/providers.cfg - fi - #修饰模版文件并合并 - sed -i "s/{providers_tags}/$providers_tags/g" "$TMPDIR"/providers/proxy-groups.yaml - cut -c 1- "$TMPDIR"/providers/providers.yaml "$TMPDIR"/providers/proxy-groups.yaml "$TMPDIR"/providers/rules.yaml > "$TMPDIR"/config.yaml - rm -rf "$TMPDIR"/providers - #调用内核测试 - . "$CRASHDIR"/starts/check_core.sh && check_core && "$TMPDIR"/CrashCore -t -d "$BINDIR" -f "$TMPDIR"/config.yaml - if [ "$?" = 0 ];then - echo -e "\033[32m配置文件生成成功!\033[0m" - mkdir -p "$CRASHDIR"/yamls - mv -f "$TMPDIR"/config.yaml "$CRASHDIR"/yamls/config.yaml - read -p "是否立即启动/重启服务?(1/0) > " res - [ "$res" = 1 ] && { - start_core && cronset '更新订阅' - exit - } - else - rm -rf "$TMPDIR"/CrashCore - rm -rf "$TMPDIR"/config.yaml - echo -e "\033[31m生成配置文件出错,请仔细检查输入!\033[0m" - fi -} -gen_singbox_providers(){ #生成singbox的providers配置文件 - gen_singbox_providers_txt(){ - if [ -n "$(echo $2|grep -E '^./')" ];then - cat >> "$TMPDIR"/providers/providers.json <> "$TMPDIR"/providers/providers.json <> "$TMPDIR"/providers/providers.json < "$TMPDIR"/providers/providers.json < "$TMPDIR"/providers/outbounds_add.json <> "$TMPDIR"/providers/outbounds_add.json - else - providers_tags='' - while read line;do - tag=$(echo $line | awk '{print $1}') - url=$(echo $line | awk '{print $2}') - providers_tags=$(echo "$providers_tags, \"$tag\"" | sed 's/^, //') - gen_singbox_providers_txt $tag $url - echo '{ "tag": "'${tag}'", "type": "urltest", "tolerance": 100, "providers": ["'${tag}'"], "include": ".*" },' >> "$TMPDIR"/providers/outbounds_add.json - done < "$CRASHDIR"/configs/providers.cfg - fi - #修复文件格式 - sed -i '$s/},/}]}/' "$TMPDIR"/providers/outbounds_add.json - sed -i '$s/},/}]}/' "$TMPDIR"/providers/providers.json - #使用模版生成outbounds和rules模块 - cat "$TMPDIR"/provider_temp_file | sed "s/{providers_tags}/$providers_tags/g" | sed "s/\"providers_tags\"/$providers_tags/g" > "$TMPDIR"/providers/outbounds.json - rm -rf "$TMPDIR"/provider_temp_file - #调用内核测试 - . "$CRASHDIR"/starts/check_core.sh && check_core && "$TMPDIR"/CrashCore merge "$TMPDIR"/config.json -C "$TMPDIR"/providers - if [ "$?" = 0 ];then - echo -e "\033[32m配置文件生成成功!如果启动超时建议更新里手动安装Singbox-srs数据库常用包!\033[0m" - mkdir -p "$CRASHDIR"/jsons - mv -f "$TMPDIR"/config.json "$CRASHDIR"/jsons/config.json - rm -rf "$TMPDIR"/providers - read -p "是否立即启动/重启服务?(1/0) > " res - [ "$res" = 1 ] && { - start_core && cronset '更新订阅' - exit - } - else - echo -e "\033[31m生成配置文件出错,请仔细检查输入!\033[0m" - rm -rf "$TMPDIR"/CrashCore - rm -rf "$TMPDIR"/providers - fi -} - -#providers providers() { - . "$CRASHDIR"/libs/web_get_bin.sh while true; do # 获取模版名称 - if [ -z "$(grep "provider_temp_${coretype}" "$CRASHDIR"/configs/ShellCrash.cfg)" ]; then - provider_temp_des=$(sed -n "1 p" "$CRASHDIR"/configs/${coretype}_providers.list | awk '{print $1}') + if [ -z "$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg)" ]; then + provider_temp_des=$(sed -n "1 p" "$CRASHDIR"/configs/${CORE_TYPE}_providers.list | awk '{print $1}') else - provider_temp_file=$(grep "provider_temp_${coretype}" "$CRASHDIR"/configs/ShellCrash.cfg | awk -F '=' '{print $2}') - provider_temp_des=$(grep "$provider_temp_file" "$CRASHDIR"/configs/${coretype}_providers.list | awk '{print $1}') + provider_temp_file=$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg | awk -F '=' '{print $2}') + provider_temp_des=$(grep "$provider_temp_file" "$CRASHDIR"/configs/${CORE_TYPE}_providers.list | awk '{print $1}') [ -z "$provider_temp_des" ] && provider_temp_des=$provider_temp_file fi + echo "-----------------------------------------------" + echo -e "\033[33msingboxr与mihomo内核的providers配置文件不互通!\033[0m" echo "-----------------------------------------------" echo -e " 1 \033[32m生成\033[0m包含全部节点/订阅的配置文件" echo -e " 2 选择\033[33m规则模版\033[0m \033[32m$provider_temp_des\033[0m" @@ -232,13 +35,9 @@ providers() { ;; 1) echo "-----------------------------------------------" - if [ -s "$CRASHDIR"/configs/providers.cfg ]; then - echo -e "\033[33msingboxr与mihomo内核的providers配置文件不互通!\033[0m" - echo "-----------------------------------------------" - read -p "确认生成${coretype}配置文件?(1/0) > " res - [ "$res" = "1" ] && { - gen_${coretype}_providers - } + if [ -s "$CRASHDIR"/configs/providers.cfg ] || [ -s "$CRASHDIR"/configs/providers_uri.cfg ]; then + . "$CRASHDIR/menus/providers_$CORE_TYPE.sh" + gen_providers else echo -e "\033[31m你还未添加链接或本地配置文件,请先添加!\033[0m" sleep 1 @@ -249,7 +48,7 @@ providers() { echo -e "当前规则模版为:\033[32m$provider_temp_des\033[0m" echo -e "\033[33m请选择在线模版:\033[0m" echo "-----------------------------------------------" - cat "$CRASHDIR"/configs/${coretype}_providers.list | awk '{print " "NR" "$1}' + cat "$CRASHDIR/configs/$CORE_TYPE_providers.list" | awk '{print " "NR" "$1}' echo "-----------------------------------------------" echo -e " a 使用\033[36m本地模版\033[0m" echo "-----------------------------------------------" @@ -260,7 +59,7 @@ providers() { read -p "请输入模版的路径(绝对路径) > " dir if [ -s $dir ]; then provider_temp_file=$dir - setconfig provider_temp_${coretype} $provider_temp_file + setconfig provider_temp_"$CORE_TYPE" "$provider_temp_file" echo -e "\033[32m设置成功!\033[0m" else echo -e "\033[31m输入错误,找不到对应模版文件!\033[0m" @@ -268,12 +67,12 @@ providers() { sleep 1 ;; *) - provider_temp_file=$(sed -n "$num p" "$CRASHDIR"/configs/${coretype}_providers.list 2>/dev/null | awk '{print $2}') + provider_temp_file=$(sed -n "$num p" "$CRASHDIR"/configs/${CORE_TYPE}_providers.list 2>/dev/null | awk '{print $2}') if [ -z "$provider_temp_file" ]; then errornum sleep 1 else - setconfig provider_temp_${coretype} $provider_temp_file + setconfig provider_temp_"$CORE_TYPE" "$provider_temp_file" fi ;; esac @@ -281,7 +80,7 @@ providers() { 3) echo -e "\033[33m将清空 $CRASHDIR/providers 目录下所有内容\033[0m" read -p "是否继续?(1/0) > " res - [ "$res" = "1" ] && rm -rf "$CRASHDIR"/providers + [ "$res" = "1" ] && rm -rf "$CRASHDIR"/providers && common_success ;; *) errornum diff --git a/scripts/menus/providers_clash.sh b/scripts/menus/providers_clash.sh new file mode 100644 index 00000000..689905b7 --- /dev/null +++ b/scripts/menus/providers_clash.sh @@ -0,0 +1,123 @@ +#!/bin/sh +# Copyright (C) Juewuy + +[ -n "$__IS_PROVIDERS_CLASH" ] && return +__IS_PROVIDERS_CLASH=1 + +. "$CRASHDIR"/libs/web_get_bin.sh + +#生成clash的providers配置文件 +gen_providers(){ + if [ -z "$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg)" ];then + provider_temp_file="$(sed -n "1 p" "$CRASHDIR"/configs/${CORE_TYPE}_providers.list | awk '{print $2}')" + else + provider_temp_file=$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg | awk -F '=' '{print $2}') + fi + echo "-----------------------------------------------" + if [ -s "$provider_temp_file" ];then + ln -sf "$provider_temp_file" "$TMPDIR"/provider_temp_file + else + echo -e "\033[33m正在获取在线模版!\033[0m" + get_bin "$TMPDIR"/provider_temp_file "rules/${CORE_TYPE}_providers/$provider_temp_file" + [ -z "$(grep -o 'rules' "$TMPDIR"/provider_temp_file)" ] && { + echo -e "\033[31m下载失败,请尝试更换安装源!\033[0m" + . "$CRASHDIR"/menus/9_upgrade.sh && setserver + setproviders + } + fi + #生成proxy_providers模块 + mkdir -p "$TMPDIR"/providers + #预创建文件并写入对应文件头 + echo 'proxy-providers:' > "$TMPDIR"/providers/providers.yaml + #切割模版文件 + sed -n '/^proxy-groups:/,/^[a-z]/ { /^rule/d; p; }' "$TMPDIR"/provider_temp_file > "$TMPDIR"/providers/proxy-groups.yaml + sed -n '/^rule/,$p' "$TMPDIR"/provider_temp_file > "$TMPDIR"/providers/rules.yaml + rm -rf "$TMPDIR"/provider_temp_file + #基于单订阅生成providers模块 + if [ -n "$1" ];then + gen_providers_txt $@ + providers_tags=$1 + else + #基于全部订阅/本地文件生成 + [ -s "$CRASHDIR"/configs/providers.cfg ] && { + providers_tags='' + while read line;do + gen_providers_txt $line + providers_tags=$(echo "$providers_tags, $tag" | sed 's/^, //') + done < "$CRASHDIR"/configs/providers.cfg + } + #基于全部节点分享链接生成 + [ -s "$CRASHDIR"/configs/providers_uri.cfg ] && { + mkdir -p "$CRASHDIR"/providers + awk '{ print ($1=="vmess" ? $2 : $2 "#" $1) }' "$CRASHDIR"/configs/providers_uri.cfg > "$CRASHDIR"/providers/uri_group + gen_providers_txt "Uri_group" "./providers/uri_group" "3" "12" + providers_tags=$(echo "$providers_tags, Uri_group" | sed 's/^, //') + } + fi + #修饰模版文件并合并 + sed -i "s/{providers_tags}/$providers_tags/g" "$TMPDIR"/providers/proxy-groups.yaml + cut -c 1- "$TMPDIR"/providers/providers.yaml "$TMPDIR"/providers/proxy-groups.yaml "$TMPDIR"/providers/rules.yaml > "$TMPDIR"/config.yaml + rm -rf "$TMPDIR"/providers + #调用内核测试 + . "$CRASHDIR"/starts/check_core.sh && check_core && "$TMPDIR"/CrashCore -t -d "$BINDIR" -f "$TMPDIR"/config.yaml + if [ "$?" = 0 ];then + echo -e "\033[32m配置文件生成成功!\033[0m" + mkdir -p "$CRASHDIR"/yamls + mv -f "$TMPDIR"/config.yaml "$CRASHDIR"/yamls/config.yaml + read -p "是否立即启动/重启服务?(1/0) > " res + [ "$res" = 1 ] && { + start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset '更新订阅' + exit + } + else + rm -rf "$TMPDIR"/CrashCore + rm -rf "$TMPDIR"/config.yaml + echo -e "\033[31m生成配置文件出错,请仔细检查输入!\033[0m" + fi +} + +gen_providers_txt(){ + if [ -n "$(echo $2|grep -E '^./')" ];then + type=file + path=$2 + download_url= + else + type=http + path="./providers/$1.yaml" + download_url=$2 + fi + tag=$1 + interval=${3:-3} + interval2=${4:-12} + ua=${5:-clash.meta} + exclude=${6#\#} + include=${7#\#} + + cat >> "$TMPDIR"/providers/providers.yaml <> "$TMPDIR"/providers/providers.yaml <> "$TMPDIR"/providers/proxy-groups.yaml +} + \ No newline at end of file diff --git a/scripts/menus/providers_singbox.sh b/scripts/menus/providers_singbox.sh new file mode 100644 index 00000000..c3e06a0a --- /dev/null +++ b/scripts/menus/providers_singbox.sh @@ -0,0 +1,129 @@ +#!/bin/sh +# Copyright (C) Juewuy + +[ -n "$__IS_PROVIDERS_SINGBOX" ] && return +__IS_PROVIDERS_SINGBOX=1 + +. "$CRASHDIR"/libs/web_get_bin.sh + +#生成singbox的providers配置文件 +gen_providers(){ + if [ -z "$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg)" ];then + provider_temp_file="$(sed -n "1 p" "$CRASHDIR"/configs/${CORE_TYPE}_providers.list | awk '{print $2}')" + else + provider_temp_file=$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg | awk -F '=' '{print $2}') + fi + echo "-----------------------------------------------" + if [ -s "$provider_temp_file" ];then + ln -sf "$provider_temp_file" "$TMPDIR"/provider_temp_file + else + echo -e "\033[33m正在获取在线模版!\033[0m" + get_bin "$TMPDIR"/provider_temp_file "rules/${CORE_TYPE}_providers/$provider_temp_file" + [ -z "$(grep -o 'route' "$TMPDIR"/provider_temp_file)" ] && { + echo -e "\033[31m下载失败,请尝试更换安装源!\033[0m" + . "$CRASHDIR"/menus/9_upgrade.sh && setserver + setproviders + } + fi + #生成outbound_providers模块 + mkdir -p "$TMPDIR"/providers + #预创建文件并写入对应文件头 + cat > "$TMPDIR"/providers/providers.json < "$TMPDIR"/providers/outbounds_add.json < "$CRASHDIR"/providers/uri_group + gen_providers_txt "Uri_group" "./providers/uri_group" "3" "12" + providers_tags=$(echo "$providers_tags, \"Uri_group\"" | sed 's/^, //') + } + fi + #修复文件格式 + sed -i '$s/},/}]}/' "$TMPDIR"/providers/outbounds_add.json + sed -i '$s/},/}]}/' "$TMPDIR"/providers/providers.json + #使用模版生成outbounds和rules模块 + cat "$TMPDIR"/provider_temp_file | sed "s/{providers_tags}/$providers_tags/g" | sed "s/\"providers_tags\"/$providers_tags/g" > "$TMPDIR"/providers/outbounds.json + rm -rf "$TMPDIR"/provider_temp_file + #调用内核测试 + . "$CRASHDIR"/starts/check_core.sh && check_core && "$TMPDIR"/CrashCore merge "$TMPDIR"/config.json -C "$TMPDIR"/providers + if [ "$?" = 0 ];then + echo -e "\033[32m配置文件生成成功!如果启动超时建议更新里手动安装Singbox-srs数据库常用包!\033[0m" + mkdir -p "$CRASHDIR"/jsons + mv -f "$TMPDIR"/config.json "$CRASHDIR"/jsons/config.json + rm -rf "$TMPDIR"/providers + read -p "是否立即启动/重启服务?(1/0) > " res + [ "$res" = 1 ] && { + start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset '更新订阅' + exit + } + else + echo -e "\033[31m生成配置文件出错,请仔细检查输入!\033[0m" + rm -rf "$TMPDIR"/CrashCore + #rm -rf "$TMPDIR"/providers + fi +} + +gen_providers_txt(){ + tag=$1 + interval=${3:-3} + interval2=${4:-12} + ua=${5:-clash.meta} + exclude=${6#\#} + include=${7#\#} + if [ -n "$(echo $2|grep -E '^./')" ];then + cat >> "$TMPDIR"/providers/providers.json <> "$TMPDIR"/providers/providers.json <> "$TMPDIR"/providers/providers.json <> "$TMPDIR"/providers/outbounds_add.json +} diff --git a/scripts/menus/subconverter.sh b/scripts/menus/subconverter.sh index ce2cbd3d..04e15560 100644 --- a/scripts/menus/subconverter.sh +++ b/scripts/menus/subconverter.sh @@ -11,12 +11,12 @@ __IS_MODULE_SUBCONVERTER=1 subconverter() { while true; do separator_line "-" - content_line " 1 \033[36m开始生成配置文件\033[0m" - content_line " 2 设置\033[31m排除节点正则\033[0m \033[47;30m$exclude\033[0m" - content_line " 3 设置\033[32m包含节点正则\033[0m \033[47;30m$include\033[0m" - content_line " 4 选择\033[33m在线规则模版\033[0m" - content_line " 5 选择\033[0mSubconverter服务器\033[0m" - content_line " 6 自定义浏览器UA \033[32m$user_agent\033[0m" + content_line "1) \033[36m开始生成配置文件\033[0m" + content_line "2) 设置\033[31m排除节点正则\033[0m \033[47;30m$exclude\033[0m" + content_line "3) 设置\033[32m包含节点正则\033[0m \033[47;30m$include\033[0m" + content_line "4) 选择\033[33m在线规则模版\033[0m" + content_line "5) 选择\033[0mSubconverter服务器\033[0m" + content_line "6) 自定义浏览器UA \033[32m$user_agent\033[0m" common_back read -r -p "请输入对应数字 > " num case "$num" in @@ -124,8 +124,7 @@ gen_link_server() { #选择Subconverter服务器 content_line "\033[32m感谢以下作者的无私奉献!!!\033[0m" echo 当前使用后端为:$(grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | sed -n ""$server_link"p" | awk '{print $3}') grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | awk '{print " "NR" "$3" "$2}' - separator_line "-" - echo 0 返回上级菜单 + common_back read -r -p "请输入对应数字 > " num totalnum=$(grep -acE '^3|^4' "$CRASHDIR"/configs/servers.list ) if [ -z "$num" ] || [ "$num" -gt "$totalnum" ];then diff --git a/scripts/menus/tui_lite.sh b/scripts/menus/tui_lite.sh index 093afbcf..dfd0c816 100644 --- a/scripts/menus/tui_lite.sh +++ b/scripts/menus/tui_lite.sh @@ -1,6 +1,6 @@ content_line() { - printf '%b' "$1\n" + printf '%b' " $1\n" } sub_content_line() { diff --git a/scripts/starts/bfstart.sh b/scripts/starts/bfstart.sh index 09060756..b2af8ea0 100644 --- a/scripts/starts/bfstart.sh +++ b/scripts/starts/bfstart.sh @@ -97,6 +97,10 @@ fi [ ! -s "$BINDIR"/ui/index.html ] && makehtml #如没有面板则创建跳转界面 catpac #生成pac文件 #内核及内核配置文件检查 +[ "$CRASHDIR" != "$BINDIR" ] && { + mkdir -p "$BINDIR"/providers + ln -sf "$CRASHDIR"/providers/* "$BINDIR"/providers/ +} if echo "$crashcore" | grep -q 'singbox'; then . "$CRASHDIR"/starts/singbox_check.sh && singbox_check [ -d "$TMPDIR"/jsons ] && rm -rf "$TMPDIR"/jsons/* || mkdir -p "$TMPDIR"/jsons #准备目录