feat(6_core_config.sh): improve UI/UX

This commit is contained in:
sofia-riese
2026-01-28 22:22:40 +08:00
parent a5c2dcd482
commit 44907fb3a2
2 changed files with 283 additions and 191 deletions

View File

@@ -6,17 +6,17 @@ __IS_MODULE_6_CORECONFIG_LOADED=1
if echo "$crashcore" | grep -q 'singbox'; then if echo "$crashcore" | grep -q 'singbox'; then
CONFIG_PATH="$CRASHDIR"/jsons/config.json CONFIG_PATH="$CRASHDIR"/jsons/config.json
CORE_TYPE=singbox CORE_TYPE=singbox
else else
CONFIG_PATH="$CRASHDIR"/yamls/config.yaml CONFIG_PATH="$CRASHDIR"/yamls/config.yaml
CORE_TYPE=clash CORE_TYPE=clash
fi fi
URI_EXP='ss|vmess|vless|trojan|tuic|anytls|shadowtls|hysteria(2)?' URI_EXP='ss|vmess|vless|trojan|tuic|anytls|shadowtls|hysteria(2)?'
# 配置文件主界面 # 配置文件主界面
set_core_config() { set_core_config() {
while true; do while true; do
list=$(cat "$CRASHDIR"/configs/providers.cfg "$CRASHDIR"/configs/providers_uri.cfg 2>/dev/null | list=$(cat "$CRASHDIR"/configs/providers.cfg "$CRASHDIR"/configs/providers_uri.cfg 2>/dev/null |
LC_ALL=C awk '{ LC_ALL=C awk '{
f1 = $1 f1 = $1
f2 = $2 f2 = $2
@@ -30,17 +30,18 @@ set_core_config() {
comp_box "\033[30;47m配置文件管理\033[0m" comp_box "\033[30;47m配置文件管理\033[0m"
[ -n "$list" ] && { [ -n "$list" ] && {
content_line "\033[36m输入数字可管理对应提供者\033[0m" content_line "\033[36m输入数字可管理对应提供者\033[0m"
list_box "$list" content_line ""
list_box "$list"
separator_line "-" separator_line "-"
} }
content_line "a) \033[32m添加提供者\033[0m(支持订阅/分享链接及本地文件)" content_line "a) \033[32m添加提供者\033[0m支持订阅分享链接及本地文件"
content_line "b) \033[36m本地生成配置文件\033[0m(By Providers,推荐!)" content_line "b) \033[36m本地生成配置文件\033[0mBy Providers推荐!"
content_line "c) \033[33m在线生成配置文件\033[0m(By Subconverter)" content_line "c) \033[33m在线生成配置文件\033[0mBy Subconverter"
content_line "d) \033[31m清空提供者列表\033[0m" content_line "d) \033[31m清空提供者列表\033[0m"
content_line "e) \033[36m自定义配置文件\033[0m" content_line "e) \033[36m自定义配置文件\033[0m"
content_line ""
common_back common_back
read -r -p "$COMMON_INPUT_L > " num read -r -p "$COMMON_INPUT_L> " num
case "$num" in case "$num" in
"" | 0) "" | 0)
break break
@@ -58,7 +59,7 @@ set_core_config() {
. "$CRASHDIR"/menus/providers.sh . "$CRASHDIR"/menus/providers.sh
providers providers
else else
msg_alert "\033[33m仅限Mihomo/singboxr内核使用,请更换内核!\033[0m" msg_alert "\033[33m仅限Mihomosingboxr内核使用请更换内核!\033[0m"
fi fi
else else
msg_alert "请先添加提供者!" msg_alert "请先添加提供者!"
@@ -73,10 +74,12 @@ set_core_config() {
fi fi
;; ;;
d) d)
separator_line "=" comp_box "\033[33m警告这将删除所有提供者且无法还原\033[0m" \
content_line "\033[33m警告这将删除所有提供者且无法还原\033[0m" "" \
separator_line "-" "是否确认清空提供者列表:"
read -r -p "确认清空提供者列表?(1/0) > " res btm_box "1) 是" \
"0) 否,返回上级菜单"
read -r -p "$COMMON_INPUT> " res
[ "$res" = 1 ] && { [ "$res" = 1 ] && {
rm -f "$CRASHDIR"/configs/providers.cfg rm -f "$CRASHDIR"/configs/providers.cfg
rm -f "$CRASHDIR"/configs/providers_uri.cfg rm -f "$CRASHDIR"/configs/providers_uri.cfg
@@ -84,26 +87,26 @@ set_core_config() {
} }
;; ;;
e) e)
checkcfg=$(cat $CFG_PATH) checkcfg=$(cat "$CFG_PATH")
. "$CRASHDIR"/menus/override.sh && override . "$CRASHDIR"/menus/override.sh && override
if [ -n "$PID" ]; then if [ -n "$PID" ]; then
checkcfg_new=$(cat $CFG_PATH) checkcfg_new=$(cat "$CFG_PATH")
[ "$checkcfg" != "$checkcfg_new" ] && checkrestart [ "$checkcfg" != "$checkcfg_new" ] && checkrestart
fi fi
;; ;;
*) *)
error_letter error_letter
break
;; ;;
esac esac
done done
} }
# 添加/管理提供者 # 添加/管理提供者
setproviders() { setproviders() {
case "$(echo "$@" | cut -d ' ' -f 2)" in case "$(echo "$@" | cut -d ' ' -f 2)" in
http* | ./providers*) http* | ./providers*)
set -- $@ set -- "$@"
name=$1 name=$1
link=$2 link=$2
interval=$3 interval=$3
@@ -113,36 +116,39 @@ setproviders() {
include_w=${7#\#} include_w=${7#\#}
;; ;;
*://*) *://*)
set -- $line set -- "$line"
name=$1 name=$1
link_uri=$2 link_uri=$2
;; ;;
*) *)
unset name link link_uri interval interval2 ua exclude_w include_w unset name link link_uri interval interval2 ua exclude_w include_w
;; ;;
esac esac
last_name="$name" last_name="$name"
[ -z "$interval" ] && interval=3 [ -z "$interval" ] && interval=3
[ -z "$interval2" ] && interval2=12 [ -z "$interval2" ] && interval2=12
[ -z "$ua" ] && ua='clash.meta' [ -z "$ua" ] && ua='clash.meta'
while true; do while true; do
link_info=$(echo "$link$link_uri" | cut -c 1-30) link_info=$(echo "$link$link_uri" | cut -c 1-30)
comp_box "\033[36m支持添加订阅链接/分享链接/本地文件作为提供者\033[0m" comp_box "\033[36m支持添加订阅链接/分享链接/本地文件作为提供者\033[0m"
content_line "1) 设置\033[36m名称或代号\033[0m \033[32m$name\033[0m" content_line "1) 设置\033[36m名称或代号\033[0m \033[32m$name\033[0m"
content_line "2) 设置\033[32m链接或路径\033[0m \033[36m$link_info...\033[0m" content_line "2) 设置\033[32m链接或路径\033[0m \033[36m$link_info\033[0m"
[ -n "$link" ] && [ -n "$link" ] &&
content_line "3) 设置\033[33m本地生成覆写\033[0m" content_line "3) 设置\033[33m本地生成覆写\033[0m"
separator_line "-" content_line ""
content_line "a) \033[36m保存此提供者\033[0m" content_line "a) \033[36m保存此提供者\033[0m"
[ -n "$link" ] && [ -n "$link" ] &&
content_line "b) \033[32m本地生成\033[0m仅包含此提供者的配置文件" content_line "b) \033[32m本地生成\033[0m仅包含此提供者的配置文件"
echo "$link$link_uri" | grep -q '://' && echo "$link$link_uri" | grep -q '://' &&
content_line "c) \033[33m在线生成\033[0m仅包含此提供者的配置文件" content_line "c) \033[33m在线生成\033[0m仅包含此提供者的配置文件"
echo "$link" | grep -q '^http' && echo "$link" | grep -q '^http' &&
content_line "e) 从此订阅链接直接拉取配置文件(不经过订阅转换)" content_line "e) 从此订阅链接直接拉取配置文件不经过订阅转换"
echo "$link" | grep -q '^./providers' && echo "$link" | grep -q '^./providers' &&
content_line "e) 直接使用此文件作为配置文件(不经过本地生成)" content_line "e) 直接使用此文件作为配置文件不经过本地生成"
content_line "d) \033[31m删除此提供者\033[0m" content_line "d) \033[31m删除此提供者\033[0m"
content_line ""
common_back common_back
read -r -p "请输入对应字母或数字> " input read -r -p "请输入对应字母或数字> " input
case "$input" in case "$input" in
@@ -150,71 +156,89 @@ setproviders() {
break break
;; ;;
1) 1)
separator_line "=" while true; do
content_line "注意:不可重复,不支持纯数字,且不要超过4个汉字" comp_box "\033[33m注意\n名称或代号不可重复不支持纯数字且不要超过4个汉字\033[0m"
separator_line "-" btm_box "\033[36m请直接输入具体名称或代号\033[0m" \
read -r -p "输入具体名称或代号 > " text "输入 0 返回上级菜单"
text=$(printf "%.12s" "$text" | sed 's/ //g') #截断12字符+去空格 read -r -p "请输入> " text
if [ -n "$text" ] && [ -z "$(echo "$text" | grep -E '^[0-9]+$')" ] && ! grep -q "^$text " "$CRASHDIR"/configs/providers.cfg; then text=$(printf "%.12s" "$text" | sed 's/ //g') # 截断12字符+去空格
name="$text" if [ "$text" = 0 ]; then
else break
error_input elif [ -n "$text" ] && [ -z "$(echo "$text" | grep -E '^[0-9]+$')" ] && ! grep -q "^$text " "$CRASHDIR"/configs/providers.cfg; then
fi name="$text"
common_success
break
else
error_input
fi
done
;; ;;
2) 2)
separator_line "=" while true; do
content_line "\033[33m订阅链接\033[0m: https/http开头的clash配置文件订阅链接" comp_box "\033[33m订阅链接\033[0m\nhttps/http开头的clash配置文件订阅链接" \
content_line "\033[36m分享链接\033[0m: $URI_EXP" "" \
content_line "\033[33m本地文件\033[0m: 必须放在此目录下:\033[32m$CRASHDIR/providers\033[0m" "\033[36m分享链接\033[0m\n$URI_EXP" \
content_line "\033[36m Base64 \033[0m: 请直接写入本地文件" "" \
separator_line "-" "\033[33m本地文件\033[0m\n必须放在\033[32m$CRASHDIR/providers\033[0m目录下" \
list=$( "" \
for f in "$CRASHDIR"/providers/*; do "\033[36mBase64 \033[0m\n请直接写入本地文件"
[ "$f" = "$CRASHDIR"/providers/uri_group ] && continue list=$(
[ -f "$f" ] || continue for f in "$CRASHDIR"/providers/*; do
printf '%s\n' "${f##*/}" [ "$f" = "$CRASHDIR"/providers/uri_group ] && continue
done | sort [ -f "$f" ] || continue
) printf '%s\n' "${f##*/}"
if [ -n "$list" ];then done | sort
list_box "$list" )
separator_line "-" if [ -n "$list" ]; then
read -r -p "请选择对应文件或输入具体链接 > " text list_box "$list"
else btm_box "" \
read -r -p "输入具体链接 > " text "输入 0 返回上级菜单"
fi read -r -p "请选择对应文件或输入具体链接> " text
text=$(echo "$text" | sed 's/ //g') #去空格 else
case "$text" in btm_box "\033[36m请直接输入具体链接\033[0m" \
http*) "或输入 0 返回上级菜单"
#处理订阅链接 read -r -p "请输入> " text
text=$(echo "$text" | sed 's/ *(.*)//g; s/#.*//g') #处理注释及超链接 fi
link="$text" text=$(echo "$text" | sed 's/ //g') # 去空格
link_uri='' case "$text" in
common_success 0)
;; break
[1-9] | [1-9][0-9]) ;;
#处理本地文件 http*)
file=$(printf '%s\n' "$list" | sed -n "${text}p") # 处理订阅链接
if [ -s "$CRASHDIR/providers/$file" ]; then text=$(echo "$text" | sed 's/ *(.*)//g; s/#.*//g') # 处理注释及超链接
link="./providers/$file" link="$text"
[ -z "$name" ] && name="_$(printf "%.12s" "$file" | sed 's/ //g')" link_uri=''
link_uri='' common_success
common_success break
else ;;
errornum [1-9] | [1-9][0-9])
fi # 处理本地文件
;; file=$(printf '%s\n' "$list" | sed -n "${text}p")
*) if [ -s "$CRASHDIR/providers/$file" ]; then
#处理分享链接 link="./providers/$file"
if [ -n "$(echo $text | grep -E "^$URI_EXP")" ]; then [ -z "$name" ] && name="_$(printf "%.12s" "$file" | sed 's/ //g')"
link_uri=$(echo "$text" | sed 's/#.*//g') # 删除注释 link_uri=''
link='' common_success
[ -z "$name" ] && name=$(printf '%b' "$(printf '%s' "$text" | sed 's/+/ /g; s/%/\\x/g')" | sed 's/.*#//') break
common_success else
else errornum
error_input fi
fi ;;
;; *)
esac # 处理分享链接
if [ -n "$(echo "$text" | grep -E "^$URI_EXP")" ]; then
link_uri=$(echo "$text" | sed 's/#.*//g') # 删除注释
link=''
[ -z "$name" ] && name=$(printf '%b' "$(printf '%s' "$text" | sed 's/+/ /g; s/%/\\x/g')" | sed 's/.*#//')
common_success
break
else
error_input
fi
;;
esac
done
;; ;;
3) 3)
custproviders custproviders
@@ -229,45 +253,47 @@ setproviders() {
. "$CRASHDIR/menus/providers_$CORE_TYPE.sh" . "$CRASHDIR/menus/providers_$CORE_TYPE.sh"
gen_providers "$name" "$link" "$interval" "$interval2" "$ua" "#$exclude_w" "#$include_w" gen_providers "$name" "$link" "$interval" "$interval2" "$ua" "#$exclude_w" "#$include_w"
else else
content_line "\033[31m$请先完成必填选项!\033[0m" msg_alert "\033[31m$请先完成必填选项!\033[0m"
fi fi
;; ;;
c) c)
if [ -n "$name" ] && [ -n "$link$link_uri" ]; then if [ -n "$name" ] && [ -n "$link$link_uri" ]; then
saveproviders saveproviders
[ -n "$link" ] && Url="$link" [ -n "$link" ] && Url="$link"
[ -n "$link_uri" ] && Url=$(echo "$name $link_uri" |awk '{ print ($1=="vmess" ? $2 : $2 "#" $1) }') [ -n "$link_uri" ] && Url=$(echo "$name $link_uri" | awk '{ print ($1=="vmess" ? $2 : $2 "#" $1) }')
Https='' Https=''
setconfig Url "'$Url'" setconfig Url "'$Url'"
setconfig Https setconfig Https
# 获取在线文件 # 获取在线文件
jump_core_config jump_core_config
else else
content_line "\033[31m请先完成必填选项\033[0m" msg_alert "\033[31m请先完成必填选项\033[0m"
fi fi
;; ;;
d) d)
if [ -n "$name" ] && [ -n "$link" ]; then if [ -n "$name" ] && [ -n "$link" ]; then
sed -i "/^$name /d" "$CRASHDIR"/configs/providers.cfg sed -i "/^$name /d" "$CRASHDIR"/configs/providers.cfg
content_line "\033[32m$COMMON_SUCCESS\033[0m" msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
elif [ -n "$name" ] && [ -n "$link_uri" ]; then elif [ -n "$name" ] && [ -n "$link_uri" ]; then
sed -i "/^$name /d" "$CRASHDIR"/configs/providers_uri.cfg sed -i "/^$name /d" "$CRASHDIR"/configs/providers_uri.cfg
content_line "\033[32m$COMMON_SUCCESS\033[0m" msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
fi fi
break break
;; ;;
e) e)
if [ -n "$link" ]; then if [ -n "$link" ]; then
content_line "注意:\033[31m此功能不兼容“跳过证书验证”功能\033[0m" comp_box "\033[31m注意:\n此功能不兼容“跳过证书验证”功能\033[0m" \
content_line "\033[31m请确认你完全理解自己在做什么\033[0m" "\033[31m请确认你完全理解自己在做什么\033[0m"
read -p "我确认遇到问题可以自行解决(1/0) > " res btm_box "1) 我确认遇到问题可以自行解决" \
"0) 返回上级菜单"
read -r -p "$COMMON_INPUT> " res
[ "$res" = "1" ] && { [ "$res" = "1" ] && {
file=$(echo "$CRASHDIR/$link" | sed 's|\./||') file=$(echo "$CRASHDIR/$link" | sed 's|\./||')
if [ -f "$file" ]; then if [ -f "$file" ]; then
[ -n "$name" ] && saveproviders [ -n "$name" ] && saveproviders
ln -sf "$file" "$CONFIG_PATH" ln -sf "$file" "$CONFIG_PATH"
common_success common_success
break break
elif echo "$link" | grep -q '^http'; then elif echo "$link" | grep -q '^http'; then
[ -n "$name" ] && saveproviders [ -n "$name" ] && saveproviders
Https="$link" Https="$link"
@@ -276,24 +302,23 @@ setproviders() {
setconfig Url setconfig Url
# 获取在线文件 # 获取在线文件
jump_core_config jump_core_config
break break
else else
content_line "\033[31m请先完成必填选项\033[0m" msg_alert "\033[31m请先完成必填选项\033[0m"
fi fi
} }
else else
content_line "\033[31m请先完成必填选项\033[0m" msg_alert "\033[31m请先完成必填选项\033[0m"
sleep 1
fi fi
;; ;;
*) *)
error_letter error_letter
break
;; ;;
esac esac
done done
} }
#保存
# 保存
saveproviders() { saveproviders() {
[ -n "$name" ] && { [ -n "$name" ] && {
[ -s "$CRASHDIR"/configs/providers.cfg ] && sed -i "/^$last_name /d" "$CRASHDIR"/configs/providers.cfg [ -s "$CRASHDIR"/configs/providers.cfg ] && sed -i "/^$last_name /d" "$CRASHDIR"/configs/providers.cfg
@@ -310,87 +335,156 @@ saveproviders() {
return 1 return 1
fi fi
} }
#本地生成覆写
# 本地生成覆写
custproviders() { custproviders() {
while true; do while true; do
separator_line '-' line_break
content_line "1) 设置\033[33m健康检查间隔\033[0m\t\033[47;30m$interval\033[0m" separator_line "="
content_line "2) 设置\033[36m自动更新间隔\033[0m\t\033[47;30m$interval2\033[0m" content_line "1) 设置\033[33m健康检查间隔\033[0m\t\033[47;30m$interval\033[0m 分钟"
echo "$link" | grep -q '^http' && content_line "2) 设置\033[36m自动更新间隔\033[0m\t\033[47;30m$interval2\033[0m 小时"
content_line "3) 设置\033[33m虚拟浏览器UA\033[0m\t\033[47;30m$ua\033[0m" echo "$link" | grep -q '^http' &&
content_line "4) 设置\033[31m排除节点正则\033[0m\t\033[47;30m$exclude_w\033[0m" content_line "3) 设置\033[33m虚拟浏览器UA\033[0m\t\033[47;30m$ua\033[0m"
content_line "5) 设置\033[32m包含节点正则\033[0m\t\033[47;30m$include_w\033[0m" content_line "4) 设置\033[31m排除节点正则\033[0m\t\033[47;30m$exclude_w\033[0m"
common_back content_line "5) 设置\033[32m包含节点正则\033[0m\t\033[47;30m$include_w\033[0m"
read -r -p "请输入对应数字> " num content_line ""
case "$num" in common_back
"" | 0) read -r -p "请输入对应数字> " num
break case "$num" in
;; "" | 0)
1) break
read -p "请输入健康检查间隔(单位:分钟) > " num ;;
if [ -n "$num" ]; then 1)
interval="$num" while true; do
else comp_box "当前健康检查间隔:$interval 分钟"
errornum btm_box "\033[36m请直接健康检查间隔单位分钟\033[0m" \
fi "或输入 r 重置健康检查间隔为默认值3 分钟)" \
;; "或输入 0 返回上级菜单"
2) read -r -p "请输入> " num
read -p "请输入自动更新间隔(单位:小时) > " num if [ "$num" = "r" ]; then
if [ -n "$num" ]; then interval=3
interval2="$num" elif [ -n "$num" ] && [ "$num" -eq "$num" ] 2>/dev/null; then
else interval="$num"
errornum else
fi errornum
;; continue
3) fi
read -p "请输入浏览器UA(输入0重置) > " text common_success
case "$text" in break
0) done
include_w='clash.meta' ;;
;; 2)
*) while true; do
include_w="$text" comp_box "当前健康检查间隔:$interval 分钟"
;; btm_box "\033[36m请直接输入自动更新间隔单位小时\033[0m" \
esac "或输入 r 重置自动更新间隔为默认值12 小时)" \
"或输入 0 返回上级菜单"
read -r -p "请输入> " num
if [ "$num" = "r" ]; then
interval2=12
elif [ -n "$num" ] && [ "$num" -eq "$num" ] 2>/dev/null; then
interval2="$num"
else
errornum
continue
fi
common_success
break
done
;;
3)
if [ -z "$ua" ]; then
comp_box "当前浏览器UA无"
else
comp_box "当前浏览器UA$ua"
fi
btm_box "\033[36m请直接输入浏览器UA\033[0m" \
"或输入 r 重置浏览器UA为默认值clash.meta" \
"或输入 0 返回上级菜单"
read -r -p "请输入> " text
case "$text" in
0)
continue
;;
r)
ua='clash.meta'
;;
*)
ua="$text"
;;
esac
common_success
;;
4)
if [ -z "$exclude_w" ]; then
comp_box "当前排除规则:无"
else
comp_box "当前排除规则:$exclude_w"
fi
btm_box "\033[36m请直接输入需要排除的节点关键字支持正则不支持空格\033[0m" \
"或输入 c 清空排除规则" \
"或输入 0 返回上级菜单"
read -r -p "请输入> " text
text=$(echo "$text" | sed 's/ //g') # 去空格
case "$text" in
0)
continue
;;
c)
exclude_w=''
;;
*)
exclude_w="$text"
;;
esac
common_success
;;
5)
if [ -z "$include_w" ]; then
comp_box "当前包含规则:无"
else
comp_box "当前包含规则:$include_w"
fi
btm_box "\033[36m请直接输入需要包含的节点关键字支持正则不支持空格\033[0m" \
"或输入 c 清空包含规则" \
"或输入 0 返回上级菜单"
read -r -p "请输入> " text
text=$(echo "$text" | sed 's/ //g') # 去空格
case "$text" in
0)
continue
;;
c)
include_w=''
;;
*)
include_w="$text"
;;
esac
common_success
;; ;;
4)
read -p "请输入需要排除的节点关键字(支持正则,不支持空格,输入0删除) > " text
text=$(echo "$text" | sed 's/ //g') #去空格
case "$text" in
0)
exclude_w=''
;;
*)
exclude_w="$text"
;;
esac
;;
5)
read -p "请输入需要筛选使用的节点关键字(支持正则,不支持空格,输入0删除) > " text
text=$(echo "$text" | sed 's/ //g') #去空格
case "$text" in
0)
include_w=''
;;
*)
include_w="$text"
;;
esac
;;
*) *)
error_letter error_letter
break
;; ;;
esac esac
done done
} }
# 调用工具在线获取配置文件 # 调用工具在线获取配置文件
jump_core_config() { jump_core_config() {
. "$CRASHDIR"/starts/core_config.sh && get_core_config . "$CRASHDIR"/starts/core_config.sh && get_core_config
if [ "$?" = 0 ]; then if [ "$?" = 0 ]; then
if [ "$inuserguide" != 1 ]; then if [ "$inuserguide" != 1 ]; then
read -p "是否启动服务以使配置文件生效(1/0) > " res comp_box "是否启动服务以使配置文件生效"
[ "$res" = 1 ] && start_core || main_menu btm_box "1) 是" \
"0) 否"
read -r -p "$COMMON_INPUT> " res
if [ "$res" = 1 ]; then
start_core
else
main_menu
fi
exit exit
fi fi
fi fi

View File

@@ -42,12 +42,12 @@ btm_box() {
separator_line "=" separator_line "="
} }
list_box () { list_box() {
i=1 i=1
printf '%s\n' "$1" | while IFS= read -r f; do printf '%s\n' "$1" | while IFS= read -r f; do
content_line "$i) $f$2" content_line "$i) $f$2"
i=$(( i + 1 )) i=$((i + 1))
done done
} }
# ================================================= # =================================================
@@ -80,7 +80,5 @@ cancel_back() {
} }
common_success() { common_success() {
separator_line "-" msg_alert "\033[32m$COMMON_SUCCESS\033[0m"
content_line "\033[32m$COMMON_SUCCESS\033[0m"
sleep 1
} }