Merge pull request #1190 from sofia-riese/redesign-3

feat: improve UI/UX
This commit is contained in:
juewuy
2026-01-31 14:04:40 +08:00
committed by GitHub
5 changed files with 441 additions and 373 deletions

View File

@@ -218,7 +218,7 @@ setrules() {
fi fi
;; ;;
3) 3)
comp_box "是否确认清空全部自定义规则" comp_box "是否确认清空全部自定义规则"
btm_box "1) 是" \ btm_box "1) 是" \
"0) 否,返回上级菜单" "0) 否,返回上级菜单"
read -r -p "$COMMON_INPUT> " res read -r -p "$COMMON_INPUT> " res
@@ -233,10 +233,11 @@ setrules() {
4) 4)
if [ "$proxies_bypass" = "OFF" ]; then if [ "$proxies_bypass" = "OFF" ]; then
comp_box "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量\033[0m" \ comp_box "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量\033[0m" \
"\033[33m请确保下游设备使用的节点与ShellCrash中使用的节点相同否则无法生效\033[0m" "\033[33m请确保下游设备使用的节点与ShellCrash中使用的节点相同否则无法生效\033[0m" \
btm_box "是否启用节点绕过?" \
"" \ "" \
"1) 是" \ "是否启用节点绕过?"
btm_box
"1) 是" \
"0) 否,返回上级菜单" "0) 否,返回上级菜单"
read -r -p "$COMMON_INPUT> " res read -r -p "$COMMON_INPUT> " res
if [ "$res" = "1" ]; then if [ "$res" = "1" ]; then
@@ -503,10 +504,10 @@ setproxies() {
4) 4)
if [ "$proxies_bypass" = "OFF" ]; then if [ "$proxies_bypass" = "OFF" ]; then
comp_box "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量\033[0m" \ comp_box "\033[33m本功能会自动将当前配置文件中的节点域名或IP设置为直连规则以防止出现双重流量\033[0m" \
"\033[33m请确保下游设备使用的节点与ShellCrash中使用的节点相同否则无法生效\033[0m" "\033[33m请确保下游设备使用的节点与ShellCrash中使用的节点相同否则无法生效\033[0m" \
btm_box "是否确定启用节点绕过:" \
"" \ "" \
"1) 是" \ "是否确定启用节点绕过:"
btm_box "1) 是" \
"0) 否,返回上级菜单" "0) 否,返回上级菜单"
read -r -p "$COMMON_INPUT> " res read -r -p "$COMMON_INPUT> " res
if [ "$res" = "1" ]; then if [ "$res" = "1" ]; then

View File

@@ -5,86 +5,98 @@
__IS_MODULE_PROVIDERS=1 __IS_MODULE_PROVIDERS=1
if [ "$crashcore" = singboxr ]; then if [ "$crashcore" = singboxr ]; then
CORE_TYPE=singbox CORE_TYPE=singbox
else else
CORE_TYPE=clash CORE_TYPE=clash
fi fi
providers() { providers() {
while true; do while true; do
# 获取模版名称 # 获取模版名称
if [ -z "$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg)" ]; then 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}') provider_temp_des=$(sed -n "1 p" "$CRASHDIR"/configs/"${CORE_TYPE}"_providers.list | awk '{print $1}')
else else
provider_temp_file=$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg | awk -F '=' '{print $2}') 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}') 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 [ -z "$provider_temp_des" ] && provider_temp_des=$provider_temp_file
fi fi
separator_line "-"
content_line "1) \033[32m生成\033[0m包含全部提供者的配置文件" top_box "1) \033[32m生成\033[0m包含全部提供者的配置文件" \
content_line "2) 选择\033[33m规则模版\033[0m \033[32m$provider_temp_des\033[0m" "2) 选择\033[33m规则模版\033[0m \033[32m$provider_temp_des\033[0m" \
content_line "3) \033[33m清理\033[0mproviders目录文件" "3) \033[33m清理\033[0mproviders目录文件" \
separator_line "-" ""
common_back common_back
read -p "请输入对应字母或数字 > " num read -r -p "请输入对应字母或数字> " num
case "$num" in case "$num" in
"" | 0) "" | 0)
break break
;; ;;
1) 1)
separator_line "-"
if [ -s "$CRASHDIR"/configs/providers.cfg ] || [ -s "$CRASHDIR"/configs/providers_uri.cfg ]; then if [ -s "$CRASHDIR"/configs/providers.cfg ] || [ -s "$CRASHDIR"/configs/providers_uri.cfg ]; then
. "$CRASHDIR/menus/providers_$CORE_TYPE.sh" . "$CRASHDIR/menus/providers_$CORE_TYPE.sh"
gen_providers gen_providers
else else
content_line "\033[31m你还未添加链接或本地配置文件请先添加\033[0m" msg_alert "\033[31m你还未添加链接或本地配置文件请先添加\033[0m"
sleep 1
fi fi
;; ;;
2) 2)
list=$(cat "$CRASHDIR/configs/${CORE_TYPE}_providers.list" | awk '{print $1}') list=$(cat "$CRASHDIR/configs/${CORE_TYPE}_providers.list" | awk '{print $1}')
separator_line "-"
content_line "当前规则模版为:\033[32m$provider_temp_des\033[0m" comp_box "当前规则模版为:\033[32m$provider_temp_des\033[0m" \
content_line "\033[33m请选择在线模版\033[0m" "\033[33m请选择在线模版\033[0m"
separator_line "-"
list_box "$list" list_box "$list"
separator_line "-" content_line ""
content_line "a) 使用\033[36m本地模版\033[0m" content_line "a) 使用\033[36m本地模版\033[0m"
content_line ""
common_back common_back
read -p "请输入对应字母或数字 > " num read -r -p "请输入对应字母或数字> " num
case "$num" in case "$num" in
"" | 0) ;; "" | 0) ;;
a) a)
read -p "请输入模版的路径(绝对路径) > " dir echo ""
if [ -s $dir ]; then read -r -p "请输入模版的路径(绝对路径)> " dir
if [ -s "$dir" ]; then
provider_temp_file=$dir provider_temp_file=$dir
setconfig provider_temp_"$CORE_TYPE" "$provider_temp_file" if setconfig provider_temp_"$CORE_TYPE" "$provider_temp_file"; then
content_line "\033[32m设置成功\033[0m" common_success
else
common_failed
fi
else else
content_line "\033[31m输入错误找不到对应模版文件\033[0m" msg_alert "\033[31m输入错误找不到对应模版文件\033[0m"
fi fi
sleep 1
;; ;;
*) *)
provider_temp_file=$(sed -n "$num p" "$CRASHDIR"/configs/${CORE_TYPE}_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 if [ -z "$provider_temp_file" ]; then
errornum errornum
sleep 1
else else
setconfig provider_temp_"$CORE_TYPE" "$provider_temp_file" if setconfig provider_temp_"$CORE_TYPE" "$provider_temp_file"; then
common_success
else
common_failed
fi
fi fi
;; ;;
esac esac
;; ;;
3) 3)
content_line "\033[33m将清空 $CRASHDIR/providers 目录下所有内容\033[0m" comp_box "\033[33m将清空 $CRASHDIR/providers 目录下所有内容\033[0m" \
read -p "是否继续?(1/0) > " res "" \
[ "$res" = "1" ] && rm -rf "$CRASHDIR"/providers && common_success "是否继续?"
btm_box "1) 是" \
"0) 否"
read -r -p "$COMMON_INPUT> " res
if [ "$res" = "1" ]; then
if rm -rf "$CRASHDIR"/providers; then
common_success
else
common_failed
fi
fi
;; ;;
*) *)
errornum errornum
sleep 1
break
;; ;;
esac esac
done done

View File

@@ -6,94 +6,97 @@ __IS_PROVIDERS_CLASH=1
. "$CRASHDIR"/libs/web_get_bin.sh . "$CRASHDIR"/libs/web_get_bin.sh
#生成clash的providers配置文件 # 生成clash的providers配置文件
gen_providers(){ gen_providers() {
if [ -z "$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg)" ];then 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}')" provider_temp_file="$(sed -n "1 p" "$CRASHDIR"/configs/"${CORE_TYPE}"_providers.list | awk '{print $2}')"
else else
provider_temp_file=$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg | awk -F '=' '{print $2}') provider_temp_file=$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg | awk -F '=' '{print $2}')
fi fi
echo "-----------------------------------------------"
if [ -s "$provider_temp_file" ];then if [ -s "$provider_temp_file" ]; then
ln -sf "$provider_temp_file" "$TMPDIR"/provider_temp_file ln -sf "$provider_temp_file" "$TMPDIR"/provider_temp_file
else else
echo -e "\033[33m正在获取在线模版\033[0m" msg_alert "\033[33m正在获取在线模版......\033[0m"
get_bin "$TMPDIR"/provider_temp_file "rules/${CORE_TYPE}_providers/$provider_temp_file" get_bin "$TMPDIR"/provider_temp_file "rules/${CORE_TYPE}_providers/$provider_temp_file"
[ -z "$(grep -o 'rules' "$TMPDIR"/provider_temp_file)" ] && { [ -z "$(grep -o 'rules' "$TMPDIR"/provider_temp_file)" ] && {
echo -e "\033[31m下载失败请尝试更换安装源\033[0m" msg_alert "\033[31m下载失败请尝试更换安装源\033[0m"
. "$CRASHDIR"/menus/9_upgrade.sh && setserver . "$CRASHDIR"/menus/9_upgrade.sh && setserver
setproviders setproviders
} }
fi fi
#生成proxy_providers模块 # 生成proxy_providers模块
mkdir -p "$TMPDIR"/providers mkdir -p "$TMPDIR"/providers
#预创建文件并写入对应文件头 # 预创建文件并写入对应文件头
echo 'proxy-providers:' > "$TMPDIR"/providers/providers.yaml 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 '/^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 sed -n '/^rule/,$p' "$TMPDIR"/provider_temp_file >"$TMPDIR"/providers/rules.yaml
rm -rf "$TMPDIR"/provider_temp_file rm -rf "$TMPDIR"/provider_temp_file
#基于单订阅生成providers模块 # 基于单订阅生成providers模块
if [ -n "$1" ];then if [ -n "$1" ]; then
gen_providers_txt $@ gen_providers_txt "$@"
providers_tags=$1 providers_tags=$1
else else
#基于全部订阅/本地文件生成 # 基于全部订阅/本地文件生成
[ -s "$CRASHDIR"/configs/providers.cfg ] && { [ -s "$CRASHDIR"/configs/providers.cfg ] && {
providers_tags='' providers_tags=''
while read line;do while read -r line; do
gen_providers_txt $line gen_providers_txt $line
providers_tags=$(echo "$providers_tags, $tag" | sed 's/^, //') providers_tags=$(echo "$providers_tags, $tag" | sed 's/^, //')
done < "$CRASHDIR"/configs/providers.cfg done <"$CRASHDIR"/configs/providers.cfg
} }
#基于全部节点分享链接生成 # 基于全部节点分享链接生成
[ -s "$CRASHDIR"/configs/providers_uri.cfg ] && { [ -s "$CRASHDIR"/configs/providers_uri.cfg ] && {
mkdir -p "$CRASHDIR"/providers mkdir -p "$CRASHDIR"/providers
awk '{ print ($1=="vmess" ? $2 : $2 "#" $1) }' "$CRASHDIR"/configs/providers_uri.cfg > "$CRASHDIR"/providers/uri_group 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" gen_providers_txt "Uri_group" "./providers/uri_group" "3" "12"
providers_tags=$(echo "$providers_tags, Uri_group" | sed 's/^, //') providers_tags=$(echo "$providers_tags, Uri_group" | sed 's/^, //')
} }
fi fi
#修饰模版文件并合并 # 修饰模版文件并合并
sed -i "s/{providers_tags}/$providers_tags/g" "$TMPDIR"/providers/proxy-groups.yaml 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 cut -c 1- "$TMPDIR"/providers/providers.yaml "$TMPDIR"/providers/proxy-groups.yaml "$TMPDIR"/providers/rules.yaml >"$TMPDIR"/config.yaml
rm -rf "$TMPDIR"/providers rm -rf "$TMPDIR"/providers
#调用内核测试 # 调用内核测试
. "$CRASHDIR"/starts/check_core.sh && check_core && "$TMPDIR"/CrashCore -t -d "$BINDIR" -f "$TMPDIR"/config.yaml . "$CRASHDIR"/starts/check_core.sh && check_core && "$TMPDIR"/CrashCore -t -d "$BINDIR" -f "$TMPDIR"/config.yaml
if [ "$?" = 0 ];then if [ "$?" = 0 ]; then
echo -e "\033[32m配置文件生成成功\033[0m" msg_alert "\033[32m配置文件生成成功\033[0m"
mkdir -p "$CRASHDIR"/yamls mkdir -p "$CRASHDIR"/yamls
mv -f "$TMPDIR"/config.yaml "$CRASHDIR"/yamls/config.yaml mv -f "$TMPDIR"/config.yaml "$CRASHDIR"/yamls/config.yaml
read -p "是否立即启动/重启服务?(1/0) > " res comp_box "是否立即启动/重启服务?"
[ "$res" = 1 ] && { btm_box "1) 是" \
start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset '更新订阅' "0) 否"
exit read -r -p "$COMMON_INPUT> " res
} [ "$res" = 1 ] && {
else start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset '更新订阅'
rm -rf "$TMPDIR"/CrashCore exit
rm -rf "$TMPDIR"/config.yaml }
echo -e "\033[31m生成配置文件出错请仔细检查输入\033[0m" else
fi rm -rf "$TMPDIR"/CrashCore
rm -rf "$TMPDIR"/config.yaml
msg_alert "\033[31m生成配置文件出错请仔细检查输入\033[0m"
fi
} }
gen_providers_txt(){ gen_providers_txt() {
if [ -n "$(echo $2|grep -E '^./')" ];then if [ -n "$(echo "$2" | grep -E '^./')" ]; then
type=file type=file
path=$2 path=$2
download_url= download_url=
else else
type=http type=http
path="./providers/$1.yaml" path="./providers/$1.yaml"
download_url=$2 download_url=$2
fi fi
tag=$1 tag=$1
interval=${3:-3} interval=${3:-3}
interval2=${4:-12} interval2=${4:-12}
ua=${5:-clash.meta} ua=${5:-clash.meta}
exclude=${6#\#} exclude=${6#\#}
include=${7#\#} include=${7#\#}
cat >> "$TMPDIR"/providers/providers.yaml <<EOF cat >>"$TMPDIR"/providers/providers.yaml <<EOF
${1}: ${1}:
type: $type type: $type
url: "$download_url" url: "$download_url"
@@ -105,9 +108,9 @@ gen_providers_txt(){
url: "https://www.gstatic.com/generate_204" url: "https://www.gstatic.com/generate_204"
interval: $((interval * 60)) interval: $((interval * 60))
EOF EOF
[ "$crashcore" = 'meta' ] && { [ "$crashcore" = 'meta' ] && {
[ "$skip_cert" != "OFF" ] && skip_cert_verify='skip-cert-verify: true' [ "$skip_cert" != "OFF" ] && skip_cert_verify='skip-cert-verify: true'
cat >> "$TMPDIR"/providers/providers.yaml <<EOF cat >>"$TMPDIR"/providers/providers.yaml <<EOF
header: header:
User-Agent: ["$ua"] User-Agent: ["$ua"]
override: override:
@@ -116,8 +119,7 @@ EOF
filter: "$include" filter: "$include"
exclude-filter: "$exclude" exclude-filter: "$exclude"
EOF EOF
} }
#写入提供者 # 写入提供者
echo ' - {name: '"$tag"', type: url-test, tolerance: 100, lazy: true, use: ['"$tag"']}' >> "$TMPDIR"/providers/proxy-groups.yaml echo ' - {name: '"$tag"', type: url-test, tolerance: 100, lazy: true, use: ['"$tag"']}' >>"$TMPDIR"/providers/proxy-groups.yaml
} }

View File

@@ -6,100 +6,102 @@ __IS_PROVIDERS_SINGBOX=1
. "$CRASHDIR"/libs/web_get_bin.sh . "$CRASHDIR"/libs/web_get_bin.sh
#生成singbox的providers配置文件 # 生成singbox的providers配置文件
gen_providers(){ gen_providers() {
if [ -z "$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg)" ];then 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}')" provider_temp_file="$(sed -n "1 p" "$CRASHDIR"/configs/"${CORE_TYPE}"_providers.list | awk '{print $2}')"
else else
provider_temp_file=$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg | awk -F '=' '{print $2}') provider_temp_file=$(grep "provider_temp_${CORE_TYPE}" "$CRASHDIR"/configs/ShellCrash.cfg | awk -F '=' '{print $2}')
fi fi
echo "-----------------------------------------------" if [ -s "$provider_temp_file" ]; then
if [ -s "$provider_temp_file" ];then ln -sf "$provider_temp_file" "$TMPDIR"/provider_temp_file
ln -sf "$provider_temp_file" "$TMPDIR"/provider_temp_file else
else msg_alert "\033[33m正在获取在线模版......\033[0m"
echo -e "\033[33m正在获取在线模版\033[0m" get_bin "$TMPDIR"/provider_temp_file "rules/${CORE_TYPE}_providers/$provider_temp_file"
get_bin "$TMPDIR"/provider_temp_file "rules/${CORE_TYPE}_providers/$provider_temp_file" [ -z "$(grep -o 'route' "$TMPDIR"/provider_temp_file)" ] && {
[ -z "$(grep -o 'route' "$TMPDIR"/provider_temp_file)" ] && { msg_alert "\033[31m下载失败请尝试更换安装源\033[0m"
echo -e "\033[31m下载失败请尝试更换安装源\033[0m" . "$CRASHDIR"/menus/9_upgrade.sh && setserver
. "$CRASHDIR"/menus/9_upgrade.sh && setserver setproviders
setproviders }
} fi
fi # 生成outbound_providers模块
#生成outbound_providers模块 mkdir -p "$TMPDIR"/providers
mkdir -p "$TMPDIR"/providers # 预创建文件并写入对应文件头
#预创建文件并写入对应文件头 cat >"$TMPDIR"/providers/providers.json <<EOF
cat > "$TMPDIR"/providers/providers.json <<EOF
{ {
"providers": [ "providers": [
EOF EOF
cat > "$TMPDIR"/providers/outbounds_add.json <<EOF cat >"$TMPDIR"/providers/outbounds_add.json <<EOF
{ {
"outbounds": [ "outbounds": [
EOF EOF
#基于单订阅生成providers模块 # 基于单订阅生成providers模块
if [ -n "$1" ];then if [ -n "$1" ]; then
gen_providers_txt $@ gen_providers_txt "$@"
providers_tags=\"$1\" providers_tags=\"$1\"
else else
#基于全部订阅/本地文件生成 # 基于全部订阅/本地文件生成
[ -s "$CRASHDIR"/configs/providers.cfg ] && { [ -s "$CRASHDIR"/configs/providers.cfg ] && {
providers_tags='' providers_tags=''
while read line;do while read -r line; do
gen_providers_txt $line gen_providers_txt "$line"
providers_tags=$(echo "$providers_tags, \"$tag\"" | sed 's/^, //') providers_tags=$(echo "$providers_tags, \"$tag\"" | sed 's/^, //')
done < "$CRASHDIR"/configs/providers.cfg done <"$CRASHDIR"/configs/providers.cfg
} }
#基于全部节点分享链接生成 # 基于全部节点分享链接生成
[ -s "$CRASHDIR"/configs/providers_uri.cfg ] && { [ -s "$CRASHDIR"/configs/providers_uri.cfg ] && {
mkdir -p "$CRASHDIR"/providers mkdir -p "$CRASHDIR"/providers
awk '{ print ($1=="vmess" ? $2 : $2 "#" $1) }' "$CRASHDIR"/configs/providers_uri.cfg > "$CRASHDIR"/providers/uri_group 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" gen_providers_txt "Uri_group" "./providers/uri_group" "3" "12"
providers_tags=$(echo "$providers_tags, \"Uri_group\"" | sed 's/^, //') providers_tags=$(echo "$providers_tags, \"Uri_group\"" | sed 's/^, //')
} }
fi fi
#修复文件格式 # 修复文件格式
sed -i '$s/},/}]}/' "$TMPDIR"/providers/outbounds_add.json sed -i '$s/},/}]}/' "$TMPDIR"/providers/outbounds_add.json
sed -i '$s/},/}]}/' "$TMPDIR"/providers/providers.json sed -i '$s/},/}]}/' "$TMPDIR"/providers/providers.json
#使用模版生成outbounds和rules模块 # 使用模版生成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 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 rm -rf "$TMPDIR"/provider_temp_file
#调用内核测试 # 调用内核测试
. "$CRASHDIR"/starts/check_core.sh && check_core && "$TMPDIR"/CrashCore merge "$TMPDIR"/config.json -C "$TMPDIR"/providers . "$CRASHDIR"/starts/check_core.sh && check_core && "$TMPDIR"/CrashCore merge "$TMPDIR"/config.json -C "$TMPDIR"/providers
if [ "$?" = 0 ];then if [ "$?" = 0 ]; then
echo -e "\033[32m配置文件生成成功如果启动超时建议更新里手动安装Singbox-srs数据库常用包\033[0m" msg_alert "\033[32m配置文件生成成功如果启动超时建议更新里手动安装Singbox-srs数据库常用包\033[0m"
mkdir -p "$CRASHDIR"/jsons mkdir -p "$CRASHDIR"/jsons
mv -f "$TMPDIR"/config.json "$CRASHDIR"/jsons/config.json mv -f "$TMPDIR"/config.json "$CRASHDIR"/jsons/config.json
rm -rf "$TMPDIR"/providers rm -rf "$TMPDIR"/providerss
read -p "是否立即启动/重启服务?(1/0) > " res comp_box "是否立即启动/重启服务?"
[ "$res" = 1 ] && { btm_box "1) 是" \
start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset '更新订阅' "0) 否"
exit read -r -p "$COMMON_INPUT> " res
} [ "$res" = 1 ] && {
else start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset '更新订阅'
echo -e "\033[31m生成配置文件出错请仔细检查输入\033[0m" exit
rm -rf "$TMPDIR"/CrashCore }
#rm -rf "$TMPDIR"/providers else
fi rm -rf "$TMPDIR"/CrashCore
msg_alert "\033[31m生成配置文件出错请仔细检查输入\033[0m"
# rm -rf "$TMPDIR"/providers
fi
} }
gen_providers_txt(){ gen_providers_txt() {
tag=$1 tag=$1
interval=${3:-3} interval=${3:-3}
interval2=${4:-12} interval2=${4:-12}
ua=${5:-clash.meta} ua=${5:-clash.meta}
exclude=${6#\#} exclude=${6#\#}
include=${7#\#} include=${7#\#}
[ -n "$exclude" ] && exclude_ele="\"exclude\": \"$exclude\"," [ -n "$exclude" ] && exclude_ele="\"exclude\": \"$exclude\","
[ -n "$include" ] && include_ele="\"include\": \"$include\"," [ -n "$include" ] && include_ele="\"include\": \"$include\","
if [ -n "$(echo $2|grep -E '^./')" ];then if [ -n "$(echo "$2" | grep -E '^./')" ]; then
cat >> "$TMPDIR"/providers/providers.json <<EOF cat >>"$TMPDIR"/providers/providers.json <<EOF
{ {
"tag": "$tag", "tag": "$tag",
"type": "local", "type": "local",
"path": "$2", "path": "$2",
EOF EOF
else else
cat >> "$TMPDIR"/providers/providers.json <<EOF cat >>"$TMPDIR"/providers/providers.json <<EOF
{ {
"tag": "$tag", "tag": "$tag",
"type": "remote", "type": "remote",
@@ -110,10 +112,10 @@ EOF
$exclude_ele $exclude_ele
$include_ele $include_ele
EOF EOF
fi fi
#通用部分生成 # 通用部分生成
[ "$skip_cert" != "OFF" ] && override_tls='true' || override_tls='false' [ "$skip_cert" != "OFF" ] && override_tls='true' || override_tls='false'
cat >> "$TMPDIR"/providers/providers.json <<EOF cat >>"$TMPDIR"/providers/providers.json <<EOF
"health_check": { "health_check": {
"enabled": true, "enabled": true,
"url": "https://www.gstatic.com/generate_204", "url": "https://www.gstatic.com/generate_204",
@@ -126,6 +128,6 @@ EOF
} }
}, },
EOF EOF
#写入提供者 # 写入提供者
echo '{ "tag": "'"$tag"'", "type": "urltest", "tolerance": 100, "providers": ["'"$tag"'"], "include": ".*" },' >> "$TMPDIR"/providers/outbounds_add.json echo '{ "tag": "'"$tag"'", "type": "urltest", "tolerance": 100, "providers": ["'"$tag"'"], "include": ".*" },' >>"$TMPDIR"/providers/outbounds_add.json
} }

View File

@@ -7,171 +7,222 @@ __IS_MODULE_SUBCONVERTER=1
[ -z "$rule_link" ] && rule_link=1 [ -z "$rule_link" ] && rule_link=1
[ -z "$server_link" ] && server_link=1 [ -z "$server_link" ] && server_link=1
#Subconverter在线订阅转换 # Subconverter在线订阅转换
subconverter() { subconverter() {
while true; do while true; do
separator_line "-" [ -z "$exclude" ] && exclude="未设置"
content_line "1) \033[32m生成\033[0m包含全部节点/订阅的配置文件" [ -z "$include" ] && include="未设置"
content_line "2) 设置\033[31m排除节点正则\033[0m \033[47;30m$exclude\033[0m" line_break
content_line "3) 设置\033[32m包含节点正则\033[0m \033[47;30m$include\033[0m" separator_line "="
content_line "4) 选择\033[33m在线规则模版\033[0m" content_line "1) \033[32m生成\033[0m包含全部节点订阅的配置文件"
content_line "5) 选择\033[0mSubconverter服务器\033[0m" content_line "2) 设置\033[31m排除节点正则\033[0m \033[47;30m$exclude\033[0m"
content_line "6) 自定义浏览器UA \033[32m$user_agent\033[0m" content_line "3) 设置\033[32m包含节点正则\033[0m \033[47;30m$include\033[0m"
common_back content_line "4) 选择\033[33m在线规则模版\033[0m"
read -r -p "请输入对应数字 > " num content_line "5) 选择\033[0mSubconverter服务器\033[0m"
case "$num" in content_line "6) 自定义浏览器UA \033[32m$user_agent\033[0m"
"" | 0) content_line ""
break common_back
;; read -r -p "请输入对应数字> " num
1) case "$num" in
providers_link=$(grep -v '\./providers/' "$CRASHDIR"/configs/providers.cfg 2>/dev/null |awk '{print $2}' |paste -sd '|') "" | 0)
uri_link=$(grep -v '^#' "$CRASHDIR"/configs/providers_uri.cfg 2>/dev/null |awk '{ print ($1=="vmess" ? $2 : $2 "#" $1) }' |paste -sd '|') break
Url=$(echo "$providers_link|$uri_link" |sed 's/^|// ; s/|$//') ;;
setconfig Url "'$Url'" 1)
Https='' providers_link=$(grep -v '\./providers/' "$CRASHDIR"/configs/providers.cfg 2>/dev/null | awk '{print $2}' | paste -sd '|')
setconfig Https uri_link=$(grep -v '^#' "$CRASHDIR"/configs/providers_uri.cfg 2>/dev/null | awk '{ print ($1=="vmess" ? $2 : $2 "#" $1) }' | paste -sd '|')
# 获取在线文件 Url=$(echo "$providers_link|$uri_link" | sed 's/^|// ; s/|$//')
jump_core_config setconfig Url "'$Url'"
Https=''
setconfig Https
# 获取在线文件
jump_core_config
;; ;;
2) 2)
gen_link_flt gen_link_flt
;; ;;
3) 3)
gen_link_ele gen_link_ele
;; ;;
4) 4)
gen_link_config gen_link_config
;; ;;
5) 5)
gen_link_server gen_link_server
;; ;;
6) 6)
set_sub_ua set_sub_ua
;; ;;
*) *)
errornum errornum
break ;;
;; esac
esac done
done
} }
gen_link_flt() { # 排除节点正则 # 排除节点正则
[ -z "$exclude" ] && exclude="未设置" gen_link_flt() {
separator_line "-" comp_box "\033[33m当前过滤关键字\033[47;30m$exclude\033[0m" \
content_line "\033[33m当前过滤关键字\033[47;30m$exclude\033[0m" "" \
separator_line "-" "\033[33m匹配关键字的节点会在导入时被【屏蔽】\033[0m" \
content_line "\033[33m匹配关键字的节点会在导入时被【屏蔽】\033[0m" "多个关键字可以用\033[30;47m | \033[0m号分隔" \
content_line "多个关键字可以用\033[30;47m | \033[0m号分隔" "\033[32m支持正则表达式\033[0m空格请使用\033[30;47m + \033[0m号替代"
content_line "\033[32m支持正则表达式\033[0m空格请使用\033[30;47m + \033[0m号替代" btm_box "\033[36m请直接输入节点过滤关键字\033[0m" \
separator_line "-" "或输入 d \033[31m清空\033[0m节点过滤关键字" \
content_line " 000 \033[31m删除\033[0m关键字" "或输入 0 返回上级菜单"
content_line " 回车 取消输入并返回上级菜单" read -r -p "请输入> " res
separator_line "-" case "$res" in
read -r -p "请输入关键字 > " exclude 0)
if [ "$exclude" = '000' ]; then return 0
separator_line "-" ;;
exclude='' d)
content_line "\033[31m 已删除节点过滤关键字!!!\033[0m" exclude=''
fi ;;
setconfig exclude "'$exclude'" *)
exclude="$res"
;;
esac
if setconfig exclude "'$exclude'"; then
common_success
else
common_failed
fi
} }
gen_link_ele() { # 包含节点正则 # 包含节点正则
[ -z "$include" ] && include="未设置" gen_link_ele() {
separator_line "-" comp_box "\033[33m当前筛选关键字\033[47;30m$include\033[0m" \
content_line "\033[33m当前筛选关键字\033[47;30m$include\033[0m" "" \
separator_line "-" "\033[33m仅有匹配关键字的节点才会被【导入】\033[0m" \
content_line "\033[33m仅有匹配关键字的节点才会被【导入】\033[0m" "多个关键字可以用\033[30;47m | \033[0m号分隔" \
content_line "多个关键字可以用\033[30;47m | \033[0m号分隔" "\033[32m支持正则表达式\033[0m空格请使用\033[30;47m + \033[0m号替代"
content_line "\033[32m支持正则表达式\033[0m空格请使用\033[30;47m + \033[0m号替代" btm_box "\033[36m请直接输入节点匹配关键字\033[0m" \
separator_line "-" "或输入 d \033[31m清空\033[0m节点匹配关键字" \
content_line " 000 \033[31m删除\033[0m关键字" "或输入 0 返回上级菜单"
content_line " 回车 取消输入并返回上级菜单" read -r -p "请输入> " res
separator_line "-" case "$res" in
read -r -p "请输入关键字 > " include 0)
if [ "$include" = '000' ]; then return 0
separator_line "-" ;;
include='' d)
content_line "\033[31m 已删除节点匹配关键字!!!\033[0m" include=""
fi ;;
setconfig include "'$include'" *)
include="$res"
;;
esac
if setconfig exclude "'$include'"; then
common_success
else
common_failed
fi
} }
gen_link_config() { #选择在线规则模版 # 选择在线规则模版
list=$(grep -aE '^5' "$CRASHDIR"/configs/servers.list | awk '{print $2$4}') gen_link_config() {
now=$(grep -aE '^5' "$CRASHDIR"/configs/servers.list | sed -n ""$rule_link"p" | awk '{print $2}') list=$(grep -aE '^5' "$CRASHDIR"/configs/servers.list | awk '{print $2$4}')
separator_line "-" now=$(grep -aE '^5' "$CRASHDIR"/configs/servers.list | sed -n ""$rule_link"p" | awk '{print $2}')
content_line "当前使用规则为:\033[33m$now\033[0m" comp_box "当前使用规则为:\033[33m$now\033[0m"
separator_line "-" list_box "$list"
list_box "$list" content_line ""
separator_line "-" common_back
common_back read -r -p "请输入对应数字> " num
read -r -p "请输入对应数字 > " num totalnum=$(grep -acE '^5' "$CRASHDIR"/configs/servers.list)
totalnum=$(grep -acE '^5' "$CRASHDIR"/configs/servers.list ) if [ -z "$num" ] || [ "$num" -gt "$totalnum" ]; then
if [ -z "$num" ] || [ "$num" -gt "$totalnum" ];then errornum
errornum elif [ "$num" = 0 ]; then
elif [ "$num" = 0 ];then echo
echo elif [ "$num" -le "$totalnum" ]; then
elif [ "$num" -le "$totalnum" ];then # 将对应标记值写入配置
#将对应标记值写入配置 rule_link=$num
rule_link=$num if setconfig rule_link "$rule_link"; then
setconfig rule_link $rule_link msg_alert "\033[32m设置成功返回上级菜单\033[0m"
separator_line "-" else
content_line "\033[32m设置成功返回上级菜单\033[0m" common_failed
fi fi
fi
} }
gen_link_server() { #选择Subconverter服务器 # 选择Subconverter服务器
list=$(grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | awk '{print $3" "$2}') gen_link_server() {
now=$(grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | sed -n ""$server_link"p" | awk '{print $3}') list=$(grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | awk '{print $3" "$2}')
separator_line "-" now=$(grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | sed -n ""$server_link"p" | awk '{print $3}')
content_line "\033[36m以下为互联网采集的第三方服务器具体安全性请自行斟酌\033[0m"
content_line "\033[32m感谢以下作者的无私奉献\033[0m" comp_box "\033[36m以下为互联网采集的第三方服务器具体安全性请自行斟酌\033[0m" \
content_line "当前使用后端为:\033[33m$now\033[0m" "\033[32m感谢以下作者的无私奉献\033[0m" \
separator_line "-" "" \
list_box "$list" "当前使用后端为:\033[33m$now\033[0m"
common_back list_box "$list"
read -r -p "请输入对应数字 > " num content_line ""
totalnum=$(grep -acE '^3|^4' "$CRASHDIR"/configs/servers.list ) common_back
if [ -z "$num" ] || [ "$num" -gt "$totalnum" ];then read -r -p "请输入对应数字> " num
errornum totalnum=$(grep -acE '^3|^4' "$CRASHDIR"/configs/servers.list)
elif [ "$num" = 0 ];then if [ -z "$num" ] || [ "$num" -gt "$totalnum" ]; then
echo errornum
elif [ "$num" -le "$totalnum" ];then elif [ "$num" = 0 ]; then
#将对应标记值写入配置 echo
server_link=$num elif [ "$num" -le "$totalnum" ]; then
setconfig server_link $server_link # 将对应标记值写入配置
separator_line "-" server_link=$num
content_line "\033[32m设置成功返回上级菜单\033[0m" if setconfig server_link "$server_link"; then
fi content_line "\033[32m设置成功返回上级菜单\033[0m"
else
common_failed
fi
fi
} }
set_sub_ua() { set_sub_ua() {
separator_line "-" while true; do
content_line "\033[36m无法正确获取配置文件时可尝试使用\033[0m" comp_box "\033[36m无法正确获取配置文件时可尝试使用\033[0m" \
content_line " 1 使用自动UA(默认)" "" \
content_line " 2 不使用UA" "当前UA$user_agent"
content_line " 3 使用自定义UA\033[32m$user_agent\033[0m" content_line "1) 使用自动UA默认"
separator_line "-" content_line "2) 不使用UA"
read -r -p "请输入对应数字 > " num content_line "3) 使用自定义UA"
case "$num" in content_line "4) 清空UA"
0) content_line ""
user_agent='' content_line "0) 返回上级菜单"
;; separator_line "="
1) read -r -p "请输入对应数字> " num
user_agent='auto' case "$num" in
;; 0)
2) break
user_agent='none' ;;
;; 1)
3) user_agent='auto'
read -r -p "请输入自定义UA(不要包含空格和特殊符号!) > " text ;;
[ -n "$text" ] && user_agent="$text" 2)
;; user_agent='none'
*) ;;
errornum 3)
;; comp_box "\033[33m注意\n自定义UA不可包含空格或特殊符号\033[0m"
esac btm_box "\033[36m请直接输入自定义UA\033[0m" \
[ "$num" -le 3 ] && setconfig user_agent "$user_agent" "或输入 0 返回上级菜单"
read -r -p "请输入> " text
if [ "$text" = 0 ]; then
continue
elif [ -n "$text" ]; then
user_agent="$text"
fi
;;
4)
user_agent=''
;;
*)
errornum
continue
;;
esac
if [ "$num" -ge 1 ] && [ "$num" -le 4 ]; then
if setconfig user_agent "$user_agent"; then
common_success
else
common_failed
fi
fi
break
done
} }