mirror of
https://github.com/juewuy/ShellCrash.git
synced 2026-03-11 16:01:28 +00:00
Compare commits
3 Commits
9e78370c5c
...
codex/impl
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
81d6b36c51 | ||
|
|
ed635b871a | ||
|
|
a32b05a391 |
@@ -48,6 +48,5 @@ rules:
|
||||
- GEOIP,private,🔒 私有网络,no-resolve
|
||||
- GEOIP,cn,🀄️ 国内 IP
|
||||
- GEOIP,telegram,📲 电报消息,no-resolve
|
||||
- GEOIP,games,🕹️ 游戏平台
|
||||
- GEOIP,media,🌍 国外媒体
|
||||
- MATCH,🐟 漏网之鱼
|
||||
@@ -44,6 +44,5 @@ rules:
|
||||
- GEOIP,private,🔒 私有网络,no-resolve
|
||||
- GEOIP,cn,🀄️ 国内 IP
|
||||
- GEOIP,telegram,📲 电报消息,no-resolve
|
||||
- GEOIP,games,🕹️ 游戏平台
|
||||
- GEOIP,media,🌍 国外媒体
|
||||
- MATCH,🐟 漏网之鱼
|
||||
@@ -178,14 +178,6 @@ rule-providers:
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/telegramip.mrs"
|
||||
interval: 86400
|
||||
|
||||
gamesip:
|
||||
type: http
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/gamesip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/gamesip.mrs"
|
||||
interval: 86400
|
||||
|
||||
netflixip:
|
||||
type: http
|
||||
behavior: ipcidr
|
||||
@@ -221,7 +213,6 @@ rules:
|
||||
- RULE-SET,privateip,🔒 私有网络,no-resolve
|
||||
- RULE-SET,cnip,🀄️ 国内 IP
|
||||
- RULE-SET,telegramip,📲 电报消息,no-resolve
|
||||
- RULE-SET,gamesip,🕹️ 游戏平台
|
||||
- RULE-SET,netflixip,🎥 奈飞视频
|
||||
- RULE-SET,mediaip,🌍 国外媒体
|
||||
- MATCH,🐟 漏网之鱼
|
||||
|
||||
@@ -167,14 +167,6 @@ rule-providers:
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/telegramip.mrs"
|
||||
interval: 86400
|
||||
|
||||
gamesip:
|
||||
type: http
|
||||
behavior: ipcidr
|
||||
format: mrs
|
||||
path: ./ruleset/gamesip.mrs
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@mihomo-ruleset/gamesip.mrs"
|
||||
interval: 86400
|
||||
|
||||
netflixip:
|
||||
type: http
|
||||
behavior: ipcidr
|
||||
@@ -209,7 +201,6 @@ rules:
|
||||
- RULE-SET,privateip,🔒 私有网络,no-resolve
|
||||
- RULE-SET,cnip,🀄️ 国内 IP
|
||||
- RULE-SET,telegramip,📲 电报消息,no-resolve
|
||||
- RULE-SET,gamesip,🕹️ 游戏平台
|
||||
- RULE-SET,netflixip,🎥 奈飞视频
|
||||
- RULE-SET,mediaip,🌍 国外媒体
|
||||
- MATCH,🐟 漏网之鱼
|
||||
|
||||
@@ -169,13 +169,6 @@ rule-providers:
|
||||
behavior: domain
|
||||
proxy: DIRECT
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/games.mrs"
|
||||
gamesip:
|
||||
type: http
|
||||
format: mrs
|
||||
interval: 86400
|
||||
behavior: ipcidr
|
||||
proxy: DIRECT
|
||||
url: "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@refs/heads/mihomo-ruleset/gamesip.mrs"
|
||||
mediaip:
|
||||
type: http
|
||||
format: mrs
|
||||
@@ -247,7 +240,6 @@ rules:
|
||||
|
||||
- RULE-SET,proxy,🌐 国际流量
|
||||
- RULE-SET,cn,🀄️ 国内流量
|
||||
- RULE-SET,gamesip,🎮 外服游戏
|
||||
- RULE-SET,mediaip,🌍 国际媒体
|
||||
- RULE-SET,cnip,🀄️ 国内流量
|
||||
|
||||
|
||||
@@ -54,7 +54,6 @@
|
||||
|
||||
{ "action": "resolve", "server": "dns_proxy", "strategy": "prefer_ipv4", "match_only": true},
|
||||
{ "rule_set": [ "cnip" ], "outbound": "🀄️ 国内 IP" },
|
||||
{ "rule_set": [ "gamesip" ], "outbound": "🕹️ 游戏平台" },
|
||||
{ "rule_set": [ "netflixip" ], "outbound": "🎥 奈飞视频" },
|
||||
{ "rule_set": [ "mediaip" ], "outbound": "🌍 国外媒体" }
|
||||
],
|
||||
@@ -195,14 +194,6 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/cnip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "gamesip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/gamesip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/gamesip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "netflixip",
|
||||
"type": "remote",
|
||||
|
||||
@@ -51,7 +51,6 @@
|
||||
|
||||
{ "action": "resolve", "server": "dns_proxy", "strategy": "prefer_ipv4", "match_only": true},
|
||||
{ "rule_set": [ "cnip" ], "outbound": "🀄️ 国内 IP" },
|
||||
{ "rule_set": [ "gamesip" ], "outbound": "🕹️ 游戏平台" },
|
||||
{ "rule_set": [ "netflixip" ], "outbound": "🎥 奈飞视频" },
|
||||
{ "rule_set": [ "mediaip" ], "outbound": "🌍 国外媒体" }
|
||||
],
|
||||
@@ -184,14 +183,6 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/cnip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "gamesip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/gamesip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@sing-box-ruleset/gamesip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "netflixip",
|
||||
"type": "remote",
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
{ "tag": "🎬 奈飞视频", "type": "selector", "outbounds": ["🚀 节点选择", "🎬 奈飞节点", "🎯 本地直连", "♻️ 自动选择", "🛠️ 手动切换", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] },
|
||||
{ "tag": "🎬 奈飞节点", "type": "urltest", "use_all_providers": true, "include": "(?i)(NF|奈飞|解锁|Netflix|NETFLIX|Media)" },
|
||||
{ "tag": "▶️ 油管视频", "type": "selector", "outbounds": ["🚀 节点选择", "🎯 本地直连", "♻️ 自动选择", "🛠️ 手动切换", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] },
|
||||
{ "tag": "📢 谷歌推送", "type": "selector", "outbounds": ["🚀 节点选择", "🎯 本地直连", "♻️ 自动选择", "🛠️ 手动切换", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] },
|
||||
{ "tag": "📢 谷歌推送", "type": "selector", "outbounds": ["🚀 节点选择", "🎯 本地直连", "♻️ 自动选择", "🛠️ 手动切换", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] },
|
||||
{ "tag": "📲 电报消息", "type": "selector", "outbounds": ["🚀 节点选择", "🎯 本地直连", "♻️ 自动选择", "🛠️ 手动切换", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] },
|
||||
{ "tag": "🌍 国际媒体", "type": "selector", "outbounds": ["🚀 节点选择", "🎯 本地直连", "♻️ 自动选择", "🛠️ 手动切换", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] },
|
||||
{ "tag": "🌐 国际流量", "type": "selector", "outbounds": ["🚀 节点选择", "🎯 本地直连", "♻️ 自动选择", "🛠️ 手动切换", "🇭🇰 香港节点", "🇹🇼 台湾节点", "🇺🇸 美国节点", "🇯🇵 日本节点", "🇪🇺 欧洲节点", "🇰🇷 韩国节点", "🇸🇬 狮城节点", "👑 高级节点", "📉 省流节点", {providers_tags}] },
|
||||
@@ -77,7 +77,6 @@
|
||||
{ "rule_set": ["telegramip"], "outbound": "📲 电报消息" },
|
||||
|
||||
{ "action": "resolve", "server": "dns_proxy", "strategy": "prefer_ipv4" },
|
||||
{ "rule_set": ["gamesip"], "outbound": "🎮 外服游戏" },
|
||||
{ "rule_set": ["mediaip"], "outbound": "🌍 国际媒体" },
|
||||
{ "rule_set": ["cnip"], "outbound": "🀄️ 国内流量" }
|
||||
],
|
||||
@@ -242,14 +241,6 @@
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@refs/heads/sing-box-ruleset/telegramip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "gamesip",
|
||||
"type": "remote",
|
||||
"format": "binary",
|
||||
"path": "./ruleset/gamesip.srs",
|
||||
"url": "https://testingcf.jsdelivr.net/gh/DustinWin/ruleset_geodata@refs/heads/sing-box-ruleset/gamesip.srs",
|
||||
"download_detour": "DIRECT"
|
||||
},
|
||||
{
|
||||
"tag": "mediaip",
|
||||
"type": "remote",
|
||||
|
||||
68
scripts/lang/chs/bot_tg.lang
Normal file
68
scripts/lang/chs/bot_tg.lang
Normal file
@@ -0,0 +1,68 @@
|
||||
BOT_TG_PRIVATE_HINT="请先通过 \033[32;4mhttps://t.me/BotFather\033[0m 申请TG机器人并获取其\033[36mAPI TOKEN\033[0m"
|
||||
BOT_TG_INPUT_TOKEN="请输入你获取到的API TOKEN"
|
||||
BOT_TG_PRIVATE_TOP="请向\033[32m你申请的机器人\033[33m而不是BotFather!\033[0m"
|
||||
BOT_TG_PUBLIC_HINT="请向机器人:\033[32;4mhttps://t.me/ShellCrashtg_bot\033[0m"
|
||||
BOT_TG_SET_DONE="已完成Telegram日志推送设置!"
|
||||
BOT_TG_CHATID_RETRY_PREFIX="第"
|
||||
BOT_TG_CHATID_RETRY_SUFFIX="次尝试获取对话ID失败,正在重试..."
|
||||
BOT_TG_SEND_KEY="发送此秘钥:"
|
||||
BOT_TG_SENT_CONFIRM="我已经发送完成"
|
||||
BOT_TG_CHATID_FAIL="无法获取对话ID,请返回重新设置或手动输入ChatID!"
|
||||
BOT_TG_CHATID_MANUAL_HINT="通常访问"
|
||||
BOT_TG_CHATID_MANUAL_HINT2="即可看到ChatID"
|
||||
BOT_TG_INPUT_CHATID="请手动输入ChatID"
|
||||
BOT_TG_CHATID_RECONFIG="无法获取对话ID,请重新配置!"
|
||||
BOT_TG_CRON_NAME="TG_BOT守护进程"
|
||||
|
||||
BOT_TG_HELP_GROUP="进群讨论:"
|
||||
BOT_TG_HELP_PROJECT="项目地址:"
|
||||
BOT_TG_HELP_GUIDE="相关教程:"
|
||||
BOT_TG_HELP_COFFEE="请喝咖啡:"
|
||||
BOT_TG_HELP_AIRPORT="友情机场:"
|
||||
BOT_TG_RUN_ON="🟢正在运行"
|
||||
BOT_TG_RUN_OFF="🟡未运行"
|
||||
BOT_TG_WELCOME="欢迎使用ShellCrash!"
|
||||
BOT_TG_SERVICE="服务"
|
||||
BOT_TG_MEM_USED="内存占用:"
|
||||
BOT_TG_RUNNING_TIME="已运行:"
|
||||
BOT_TG_SELECT_ACTION="请选择操作:"
|
||||
BOT_TG_SELECT_FILE="请选择需要上传或下载的具体文件:"
|
||||
BOT_TG_BTN_START="✈️ 启用劫持"
|
||||
BOT_TG_BTN_PURE="💧 纯净模式"
|
||||
BOT_TG_BTN_RESTART="🕹 重启服务"
|
||||
BOT_TG_BTN_LOG="📄 查看日志"
|
||||
BOT_TG_BTN_TRANSFER="🔃 文件传输"
|
||||
BOT_TG_BTN_GET_LOG="📥 下载日志"
|
||||
BOT_TG_BTN_GET_BAK="💾 备份设置"
|
||||
BOT_TG_BTN_GET_CFG="⬇️ 下载配置"
|
||||
BOT_TG_BTN_UP_CORE="🪐 上传内核"
|
||||
BOT_TG_BTN_UP_BAK="🔄 还原设置"
|
||||
BOT_TG_BTN_UP_CFG="⬆️ 上传配置"
|
||||
BOT_TG_NO_CURL="⚠️ 因当前设备缺少curl应用,仅支持上传功能!"
|
||||
BOT_TG_UPLOAD_OK="成功!即将重启服务!"
|
||||
BOT_TG_UPLOAD_FAIL="失败,请仔细检查文件或重试!"
|
||||
BOT_TG_CORE_UPDATE="内核更新"
|
||||
BOT_TG_CFG_RESTORED="配置文件已还原,请手动重启服务!"
|
||||
BOT_TG_RESTORE_FAIL="解压还原失败,请仔细检查文件或重试!"
|
||||
BOT_TG_CFG_UPLOADED="配置文件已上传,请手动重启服务!"
|
||||
BOT_TG_UPLOAD_FAIL2="上传失败,请仔细检查文件或重试!"
|
||||
BOT_TG_NET_UPLOAD_FAIL="网络错误,上传失败!请重试!"
|
||||
BOT_TG_FILE_FORMAT_FAIL="文件格式不匹配,上传失败!"
|
||||
BOT_TG_FW_ENABLED="ShellCrash 透明路由"
|
||||
BOT_TG_FW_ENABLED_SUFFIX="已启用!"
|
||||
BOT_TG_SWITCH_PURE="已切换到纯净模式!"
|
||||
BOT_TG_SERVICE_RESTARTED="ShellCrash 服务已重启!"
|
||||
BOT_TG_UNFINISHED="错误,还未完成的功能!"
|
||||
BOT_TG_SEND_CORE="请发送需要上传的内核,必须是以tar.gz,.gz或.upx结尾的【"
|
||||
BOT_TG_SEND_CORE_SUFFIX="】内核!"
|
||||
BOT_TG_SEND_BAK="请发送需要还原的备份文件,必须是【.tar.gz】格式!"
|
||||
BOT_TG_SEND_CFG="请发送需要上传的配置文件,必须是【"
|
||||
BOT_TG_SEND_CFG_SUFFIX="】格式,支持自定义配置文件"
|
||||
BOT_TG_SWITCH_TO="已切换到"
|
||||
BOT_TG_ALREADY="当前已经是"
|
||||
BOT_TG_ALREADY_PURE="当前已经是纯净模式!"
|
||||
BOT_TG_SERVICE_RESTARTED_SHORT="🔄 服务已重启"
|
||||
BOT_TG_LOG_CONTENT="📄 日志内容如下(已过滤任务日志):"
|
||||
BOT_TG_TASK_WORD="任务"
|
||||
BOT_TG_INPUT_SUB="✏ 请输入新的订阅链接:"
|
||||
BOT_TG_SUB_UPDATED="订阅更新完成:"
|
||||
3
scripts/lang/chs/check_port.lang
Normal file
3
scripts/lang/chs/check_port.lang
Normal file
@@ -0,0 +1,3 @@
|
||||
CHECK_PORT_RANGE_ERR="输入错误!请输入正确的数值(1-65535)!"
|
||||
CHECK_PORT_DUP_ERR="输入错误!请不要输入重复的端口!"
|
||||
CHECK_PORT_OCCUPIED_ERR="当前端口已被其他进程占用,请重新输入!"
|
||||
35
scripts/lang/chs/ddns.lang
Normal file
35
scripts/lang/chs/ddns.lang
Normal file
@@ -0,0 +1,35 @@
|
||||
DDNS_WELCOME="欢迎使用DDNS!"
|
||||
DDNS_ADD_DONE="服务已经添加!"
|
||||
DDNS_INPUT_DOMAIN="请输入你的域名"
|
||||
DDNS_INPUT_USER="请输入用户名或邮箱"
|
||||
DDNS_INPUT_PASS="请输入密码或令牌秘钥"
|
||||
DDNS_INPUT_CHECK_INTERVAL="请输入检测更新间隔(单位:分钟;默认为10)"
|
||||
DDNS_INPUT_FORCE_INTERVAL="请输入强制更新间隔(单位:小时;默认为24)"
|
||||
DDNS_CONFIRM_INFO="请核对如下信息:"
|
||||
DDNS_FIELD_SERVICE="服务商:"
|
||||
DDNS_FIELD_DOMAIN="域名:"
|
||||
DDNS_FIELD_USER="用户名:"
|
||||
DDNS_FIELD_INTERVAL="检测间隔:"
|
||||
DDNS_CONFIRM_ADD="是否确认添加:"
|
||||
DDNS_YES="是"
|
||||
DDNS_REINPUT="否,重新輸入"
|
||||
DDNS_LIST_NOT_FOUND="未找到DDNS列表文件,尝试在线获取……"
|
||||
DDNS_DOWNLOAD_FAILED="下载失败,请重试!"
|
||||
DDNS_SELECT_PROVIDER="请选择服务提供商:"
|
||||
DDNS_INPUT_ERROR="输入错误,请重新输入!"
|
||||
DDNS_SELECT_NETMODE="请选择网络模式:"
|
||||
DDNS_IPV4="IPV4"
|
||||
DDNS_IPV6="IPV6"
|
||||
DDNS_DISABLE="停用"
|
||||
DDNS_ENABLE="启用"
|
||||
DDNS_UPDATE_NOW="立即更新"
|
||||
DDNS_EDIT_CURRENT="编辑当前服务"
|
||||
DDNS_CURRENT_SERVICE="当前服务"
|
||||
DDNS_REMOVE_CURRENT="移除当前服务"
|
||||
DDNS_VIEW_LOG="查看运行日志"
|
||||
DDNS_NOT_SUPPORTED="本脚本依赖OpenWrt内置的DDNS服务,当前设备无法运行,已退出!"
|
||||
DDNS_LIST_HEADER=" 列表 域名 启用 IP地址"
|
||||
DDNS_ADD_SERVICE="添加DDNS服务"
|
||||
DDNS_EXIT="退出"
|
||||
DDNS_INPUT_INDEX="请输入对应序号"
|
||||
DDNS_INPUT_NUM_ERROR="请输入正确数字!"
|
||||
25
scripts/lang/chs/providers.lang
Normal file
25
scripts/lang/chs/providers.lang
Normal file
@@ -0,0 +1,25 @@
|
||||
PROVIDERS_MENU_GEN="生成包含全部提供者的配置文件"
|
||||
PROVIDERS_MENU_TEMPLATE="选择\033[33m规则模版\033[0m"
|
||||
PROVIDERS_MENU_CLEAN="\033[33m清理\033[0mproviders目录文件"
|
||||
PROVIDERS_INPUT="请输入对应字母或数字"
|
||||
|
||||
PROVIDERS_EMPTY_HINT="你还未添加链接或本地配置文件,请先添加!"
|
||||
PROVIDERS_TEMPLATE_CURRENT="当前规则模版为:"
|
||||
PROVIDERS_TEMPLATE_SELECT="请选择在线模版:"
|
||||
PROVIDERS_TEMPLATE_LOCAL="使用\033[36m本地模版\033[0m"
|
||||
PROVIDERS_TEMPLATE_PATH="请输入模版的路径(绝对路径)"
|
||||
PROVIDERS_TEMPLATE_NOT_FOUND="输入错误,找不到对应模版文件!"
|
||||
|
||||
PROVIDERS_CLEAN_WARN="将清空"
|
||||
PROVIDERS_CLEAN_WARN_END="目录下所有内容"
|
||||
PROVIDERS_CLEAN_CONFIRM="是否继续?"
|
||||
|
||||
PROVIDERS_FETCHING_TEMPLATE="正在获取在线模版......"
|
||||
PROVIDERS_DOWNLOAD_FAILED="下载失败,请尝试更换安装源!"
|
||||
PROVIDERS_GEN_OK="配置文件生成成功!"
|
||||
PROVIDERS_GEN_OK_SINGBOX="配置文件生成成功!如果启动超时建议更新里手动安装Singbox-srs数据库常用包!"
|
||||
PROVIDERS_GEN_FAILED="生成配置文件出错,请仔细检查输入!"
|
||||
PROVIDERS_RESTART_ASK="是否立即启动/重启服务?"
|
||||
PROVIDERS_YES="是"
|
||||
PROVIDERS_NO="否"
|
||||
PROVIDERS_CRON_SUB_UPDATE="更新订阅"
|
||||
34
scripts/lang/chs/set_crashdir.lang
Normal file
34
scripts/lang/chs/set_crashdir.lang
Normal file
@@ -0,0 +1,34 @@
|
||||
SCD_SELECT_INSTALL_DIR="请选择安装目录:"
|
||||
SCD_INPUT_NUM="请输入相应数字"
|
||||
SCD_INPUT_ERROR="输入错误!请重新设置!"
|
||||
SCD_XIAOMI_DETECTED="检测到当前设备为小米官方系统,请选择安装位置:"
|
||||
SCD_CUSTOM_DIR_WARN="自定义目录(不推荐,不明勿用!)"
|
||||
SCD_EXIT_INSTALL="退出安装"
|
||||
SCD_SELECT_USB_DIR="请选择U盘目录:"
|
||||
SCD_ASUS_DM_NOT_FOUND="未找到下载大师自启文件:"
|
||||
SCD_CHECK_SETTING="请检查设置!"
|
||||
SCD_ASUS_DETECTED="检测到当前设备为华硕固件,请选择安装方式"
|
||||
SCD_ASUS_INSTALL_DM="基于U盘+下载大师安装(支持所有固件,限ARM设备,须插入U盘或移动硬盘)"
|
||||
SCD_ASUS_INSTALL_SCRIPT="基于自启脚本安装(仅持部分梅林固件)"
|
||||
SCD_ASUS_DM_HINT="请先在路由器网页后台安装下载大师并启用,之后选择外置存储所在目录!"
|
||||
SCD_ASUS_REINSTALL_HINT="如开机无法正常自启,请重新使用U盘+下载大师安装!"
|
||||
SCD_PATH_FORMAT_HINT="路径是必须带 / 的格式,注意写入虚拟内存(/tmp,/opt,/sys...)的文件会在重启后消失!"
|
||||
SCD_PATH_FREE_SPACE="可用路径 剩余空间:"
|
||||
SCD_INPUT_CUSTOM_DIR="请输入自定义路径"
|
||||
SCD_PATH_ERROR="路径错误!请重新设置!"
|
||||
SCD_INSTALL_SPACE_HINT="注意:安装ShellCrash至少需要预留约1MB的磁盘空间"
|
||||
SCD_INSTALL_ETC="在\033[32m/etc目录\033[0m下安装(适合root用户)"
|
||||
SCD_INSTALL_USR="在\033[32m/usr/share目录\033[0m下安装(适合Linux系统)"
|
||||
SCD_INSTALL_HOME="在\033[32m当前用户目录\033[0m下安装(适合非root用户)"
|
||||
SCD_INSTALL_USB="在\033[32m外置存储\033[0m中安装"
|
||||
SCD_INSTALL_MANUAL="手动设置安装目录"
|
||||
SCD_INSTALL_CANCELED="安装已取消"
|
||||
SCD_NO_WRITE_PREFIX="没有"
|
||||
SCD_NO_WRITE_SUFFIX="目录写入权限!请重新设置!"
|
||||
SCD_TARGET_DIR_PREFIX="目标目录"
|
||||
SCD_TARGET_DIR_SPACE="空间剩余:"
|
||||
SCD_CONFIRM_INSTALL="是否确认安装?"
|
||||
SCD_YES="是"
|
||||
SCD_NO="否"
|
||||
SCD_DIR_FREE="目录,剩余空间:"
|
||||
SCD_SOFT_SOLID="(支持软固化功能)"
|
||||
33
scripts/lang/chs/subconverter.lang
Normal file
33
scripts/lang/chs/subconverter.lang
Normal file
@@ -0,0 +1,33 @@
|
||||
SUBCONVERTER_MENU_GEN="生成包含全部节点、订阅的配置文件"
|
||||
SUBCONVERTER_MENU_EXCLUDE="设置\033[31m排除节点正则\033[0m"
|
||||
SUBCONVERTER_MENU_INCLUDE="设置\033[32m包含节点正则\033[0m"
|
||||
SUBCONVERTER_MENU_RULE="选择\033[33m在线规则模版\033[0m"
|
||||
SUBCONVERTER_MENU_SERVER="选择Subconverter服务器"
|
||||
SUBCONVERTER_MENU_UA="自定义浏览器UA"
|
||||
|
||||
SUBCONVERTER_INPUT="请输入"
|
||||
SUBCONVERTER_BACK="或输入 0 返回上级菜单"
|
||||
|
||||
SUBCONVERTER_EXCLUDE_HINT1="匹配关键字的节点会在导入时被【屏蔽】!"
|
||||
SUBCONVERTER_INCLUDE_HINT1="仅有匹配关键字的节点才会被【导入】!!!"
|
||||
SUBCONVERTER_KEYWORD_SPLIT="多个关键字可以用\033[30;47m | \033[0m号分隔"
|
||||
SUBCONVERTER_REGEX_HINT="\033[32m支持正则表达式\033[0m,空格请使用\033[30;47m + \033[0m号替代"
|
||||
SUBCONVERTER_EXCLUDE_INPUT="请直接输入节点过滤关键字"
|
||||
SUBCONVERTER_INCLUDE_INPUT="请直接输入节点匹配关键字"
|
||||
SUBCONVERTER_EXCLUDE_CLEAR="或输入 d \033[31m清空\033[0m节点过滤关键字"
|
||||
SUBCONVERTER_INCLUDE_CLEAR="或输入 d \033[31m清空\033[0m节点匹配关键字"
|
||||
|
||||
SUBCONVERTER_RULE_CURRENT="当前使用规则为:"
|
||||
SUBCONVERTER_SERVER_HINT="以下为互联网采集的第三方服务器,具体安全性请自行斟酌!"
|
||||
SUBCONVERTER_SERVER_THANKS="感谢以下作者的无私奉献!!!"
|
||||
SUBCONVERTER_SERVER_CURRENT="当前使用后端为:"
|
||||
SUBCONVERTER_SET_OK="设置成功!返回上级菜单"
|
||||
|
||||
SUBCONVERTER_UA_HINT="无法正确获取配置文件时可尝试使用"
|
||||
SUBCONVERTER_UA_CURRENT="当前UA:"
|
||||
SUBCONVERTER_UA_AUTO="使用自动UA(默认)"
|
||||
SUBCONVERTER_UA_NONE="不使用UA"
|
||||
SUBCONVERTER_UA_CUSTOM="使用自定义UA"
|
||||
SUBCONVERTER_UA_CLEAR="清空UA"
|
||||
SUBCONVERTER_UA_CUSTOM_WARN="注意:\n自定义UA不可包含空格或特殊符号!"
|
||||
SUBCONVERTER_UA_CUSTOM_INPUT="请直接输入自定义UA"
|
||||
19
scripts/lang/chs/task_cmd.lang
Normal file
19
scripts/lang/chs/task_cmd.lang
Normal file
@@ -0,0 +1,19 @@
|
||||
TASK_CMD_EVERY="每隔"
|
||||
TASK_CMD_HOURLY="时每"
|
||||
TASK_CMD_MIN="分钟"
|
||||
TASK_CMD_CORE_SKIP="任务【自动更新内核】中止-未检测到版本更新"
|
||||
TASK_CMD_CORE_DONE="任务【自动更新内核】下载完成,正在重启服务!"
|
||||
TASK_CMD_CORE_DL_FAIL="任务【自动更新内核】出错-下载失败!"
|
||||
TASK_CMD_CORE_VERIFY_FAIL="任务【自动更新内核】出错-内核校验失败!"
|
||||
TASK_CMD_SCRIPT_SKIP="任务【自动更新脚本】中止-未检测到版本更新"
|
||||
TASK_CMD_SCRIPT_UNZIP_FAIL="任务【自动更新脚本】出错-解压失败!"
|
||||
TASK_CMD_DB_SKIP_PREFIX="任务【自动更新数据库文件】跳过-未检测到"
|
||||
TASK_CMD_DB_SKIP_SUFFIX="版本更新"
|
||||
TASK_CMD_DB_DL_FAIL_PREFIX="任务【自动更新数据库文件】更新【"
|
||||
TASK_CMD_DB_DL_FAIL_SUFFIX="】下载失败!"
|
||||
TASK_CMD_DB_OK_PREFIX="任务【自动更新数据库文件】更新【"
|
||||
TASK_CMD_DB_OK_SUFFIX="】成功!"
|
||||
TASK_CMD_RES_OK="成功"
|
||||
TASK_CMD_RES_FAIL="失败"
|
||||
TASK_CMD_EXEC_PREFIX="任务【"
|
||||
TASK_CMD_EXEC_MID="】执行"
|
||||
13
scripts/lang/chs/uninstall.lang
Normal file
13
scripts/lang/chs/uninstall.lang
Normal file
@@ -0,0 +1,13 @@
|
||||
UNINSTALL_WARN="警告:该操作不可逆!"
|
||||
UNINSTALL_CONFIRM="是否确认卸载ShellCrash?"
|
||||
UNINSTALL_YES="是"
|
||||
UNINSTALL_NO="否"
|
||||
UNINSTALL_KEEP_CONFIRM="是否保留脚本配置及订阅文件?"
|
||||
UNINSTALL_ENV_ERROR="环境变量配置有误,请尝试手动移除安装目录!"
|
||||
UNINSTALL_DONE="已卸载ShellCrash相关文件!有缘再会!"
|
||||
UNINSTALL_CLOSE_HINT="请手动关闭当前窗口以重置环境变量!"
|
||||
UNINSTALL_CANCELED="操作已取消!"
|
||||
UNINSTALL_CRON_CLASH="clash服务"
|
||||
UNINSTALL_CRON_SUB="订阅链接"
|
||||
UNINSTALL_CRON_INIT="ShellCrash初始化"
|
||||
UNINSTALL_SSH_MARK="启用外网访问SSH服务"
|
||||
68
scripts/lang/en/bot_tg.lang
Normal file
68
scripts/lang/en/bot_tg.lang
Normal file
@@ -0,0 +1,68 @@
|
||||
BOT_TG_PRIVATE_HINT="Please apply for a Telegram bot via \033[32;4mhttps://t.me/BotFather\033[0m and get its \033[36mAPI TOKEN\033[0m first"
|
||||
BOT_TG_INPUT_TOKEN="Please enter your API TOKEN"
|
||||
BOT_TG_PRIVATE_TOP="Please send to \033[32myour bot\033[33m, NOT BotFather!\033[0m"
|
||||
BOT_TG_PUBLIC_HINT="Please message the bot: \033[32;4mhttps://t.me/ShellCrashtg_bot\033[0m"
|
||||
BOT_TG_SET_DONE="Telegram log push has been configured!"
|
||||
BOT_TG_CHATID_RETRY_PREFIX="Attempt"
|
||||
BOT_TG_CHATID_RETRY_SUFFIX="to get chat ID failed, retrying..."
|
||||
BOT_TG_SEND_KEY="Send this key:"
|
||||
BOT_TG_SENT_CONFIRM="I have sent it"
|
||||
BOT_TG_CHATID_FAIL="Unable to get chat ID. Please reconfigure or input ChatID manually!"
|
||||
BOT_TG_CHATID_MANUAL_HINT="Usually visit"
|
||||
BOT_TG_CHATID_MANUAL_HINT2="to find ChatID"
|
||||
BOT_TG_INPUT_CHATID="Please input ChatID manually"
|
||||
BOT_TG_CHATID_RECONFIG="Unable to get chat ID. Please reconfigure!"
|
||||
BOT_TG_CRON_NAME="TG_BOT watchdog"
|
||||
|
||||
BOT_TG_HELP_GROUP="Group chat:"
|
||||
BOT_TG_HELP_PROJECT="Project:"
|
||||
BOT_TG_HELP_GUIDE="Guide:"
|
||||
BOT_TG_HELP_COFFEE="Buy me a coffee:"
|
||||
BOT_TG_HELP_AIRPORT="Partner provider:"
|
||||
BOT_TG_RUN_ON="🟢Running"
|
||||
BOT_TG_RUN_OFF="🟡Stopped"
|
||||
BOT_TG_WELCOME="Welcome to ShellCrash!"
|
||||
BOT_TG_SERVICE=" service "
|
||||
BOT_TG_MEM_USED="Memory usage: "
|
||||
BOT_TG_RUNNING_TIME="Running: "
|
||||
BOT_TG_SELECT_ACTION="Please choose:"
|
||||
BOT_TG_SELECT_FILE="Please choose file upload/download action:"
|
||||
BOT_TG_BTN_START="✈️ Enable redirect"
|
||||
BOT_TG_BTN_PURE="💧 Pure mode"
|
||||
BOT_TG_BTN_RESTART="🕹 Restart service"
|
||||
BOT_TG_BTN_LOG="📄 View logs"
|
||||
BOT_TG_BTN_TRANSFER="🔃 File transfer"
|
||||
BOT_TG_BTN_GET_LOG="📥 Download log"
|
||||
BOT_TG_BTN_GET_BAK="💾 Backup settings"
|
||||
BOT_TG_BTN_GET_CFG="⬇️ Download config"
|
||||
BOT_TG_BTN_UP_CORE="🪐 Upload core"
|
||||
BOT_TG_BTN_UP_BAK="🔄 Restore settings"
|
||||
BOT_TG_BTN_UP_CFG="⬆️ Upload config"
|
||||
BOT_TG_NO_CURL="⚠️ curl is missing on this device, only upload is supported!"
|
||||
BOT_TG_UPLOAD_OK="success! Service will restart soon!"
|
||||
BOT_TG_UPLOAD_FAIL="failed, please check file and retry!"
|
||||
BOT_TG_CORE_UPDATE="Core update "
|
||||
BOT_TG_CFG_RESTORED="Config restored, please restart service manually!"
|
||||
BOT_TG_RESTORE_FAIL="Restore failed while extracting backup, please retry!"
|
||||
BOT_TG_CFG_UPLOADED="Config uploaded, please restart service manually!"
|
||||
BOT_TG_UPLOAD_FAIL2="Upload failed, please retry!"
|
||||
BOT_TG_NET_UPLOAD_FAIL="Network error, upload failed! Please retry!"
|
||||
BOT_TG_FILE_FORMAT_FAIL="File format mismatch, upload failed!"
|
||||
BOT_TG_FW_ENABLED="ShellCrash redirect mode "
|
||||
BOT_TG_FW_ENABLED_SUFFIX=" enabled!"
|
||||
BOT_TG_SWITCH_PURE="Switched to pure mode!"
|
||||
BOT_TG_SERVICE_RESTARTED="ShellCrash service restarted!"
|
||||
BOT_TG_UNFINISHED="Error: unfinished feature!"
|
||||
BOT_TG_SEND_CORE="Please send core file ending with tar.gz/.gz/.upx for ["
|
||||
BOT_TG_SEND_CORE_SUFFIX="]"
|
||||
BOT_TG_SEND_BAK="Please send backup file in [.tar.gz] format!"
|
||||
BOT_TG_SEND_CFG="Please send config file in ["
|
||||
BOT_TG_SEND_CFG_SUFFIX="] format, custom config is supported"
|
||||
BOT_TG_SWITCH_TO="Switched to "
|
||||
BOT_TG_ALREADY="Already in "
|
||||
BOT_TG_ALREADY_PURE="Already in pure mode!"
|
||||
BOT_TG_SERVICE_RESTARTED_SHORT="🔄 Service restarted"
|
||||
BOT_TG_LOG_CONTENT="📄 Logs (task logs filtered):"
|
||||
BOT_TG_TASK_WORD="Task"
|
||||
BOT_TG_INPUT_SUB="✏ Please enter new subscription URL:"
|
||||
BOT_TG_SUB_UPDATED="Subscription update finished:"
|
||||
3
scripts/lang/en/check_port.lang
Normal file
3
scripts/lang/en/check_port.lang
Normal file
@@ -0,0 +1,3 @@
|
||||
CHECK_PORT_RANGE_ERR="Invalid input! Please enter a valid value (1-65535)!"
|
||||
CHECK_PORT_DUP_ERR="Invalid input! Please do not enter duplicate ports!"
|
||||
CHECK_PORT_OCCUPIED_ERR="This port is already occupied by another process. Please enter a different one!"
|
||||
35
scripts/lang/en/ddns.lang
Normal file
35
scripts/lang/en/ddns.lang
Normal file
@@ -0,0 +1,35 @@
|
||||
DDNS_WELCOME="Welcome to DDNS!"
|
||||
DDNS_ADD_DONE="Service has been added!"
|
||||
DDNS_INPUT_DOMAIN="Please enter your domain"
|
||||
DDNS_INPUT_USER="Please enter username or email"
|
||||
DDNS_INPUT_PASS="Please enter password or token"
|
||||
DDNS_INPUT_CHECK_INTERVAL="Please enter check interval (minutes, default 10)"
|
||||
DDNS_INPUT_FORCE_INTERVAL="Please enter force update interval (hours, default 24)"
|
||||
DDNS_CONFIRM_INFO="Please confirm the following info:"
|
||||
DDNS_FIELD_SERVICE="Provider:"
|
||||
DDNS_FIELD_DOMAIN="Domain:"
|
||||
DDNS_FIELD_USER="Username:"
|
||||
DDNS_FIELD_INTERVAL="Check interval:"
|
||||
DDNS_CONFIRM_ADD="Confirm add:"
|
||||
DDNS_YES="Yes"
|
||||
DDNS_REINPUT="No, re-enter"
|
||||
DDNS_LIST_NOT_FOUND="DDNS list file not found, trying online update..."
|
||||
DDNS_DOWNLOAD_FAILED="Download failed, please retry!"
|
||||
DDNS_SELECT_PROVIDER="Please select provider:"
|
||||
DDNS_INPUT_ERROR="Invalid input, please retry!"
|
||||
DDNS_SELECT_NETMODE="Please select network mode:"
|
||||
DDNS_IPV4="IPV4"
|
||||
DDNS_IPV6="IPV6"
|
||||
DDNS_DISABLE="Disable"
|
||||
DDNS_ENABLE="Enable"
|
||||
DDNS_UPDATE_NOW="Update now"
|
||||
DDNS_EDIT_CURRENT="Edit current service"
|
||||
DDNS_CURRENT_SERVICE=" current service"
|
||||
DDNS_REMOVE_CURRENT="Remove current service"
|
||||
DDNS_VIEW_LOG="View logs"
|
||||
DDNS_NOT_SUPPORTED="This feature depends on OpenWrt built-in DDNS service; unsupported on current device."
|
||||
DDNS_LIST_HEADER=" List Domain On IP Address"
|
||||
DDNS_ADD_SERVICE="Add DDNS service"
|
||||
DDNS_EXIT="Exit"
|
||||
DDNS_INPUT_INDEX="Please enter index"
|
||||
DDNS_INPUT_NUM_ERROR="Please enter a valid number!"
|
||||
25
scripts/lang/en/providers.lang
Normal file
25
scripts/lang/en/providers.lang
Normal file
@@ -0,0 +1,25 @@
|
||||
PROVIDERS_MENU_GEN="Generate config including all providers"
|
||||
PROVIDERS_MENU_TEMPLATE="Select \033[33mrule template\033[0m"
|
||||
PROVIDERS_MENU_CLEAN="\033[33mClean\033[0m providers directory"
|
||||
PROVIDERS_INPUT="Please enter a letter or number"
|
||||
|
||||
PROVIDERS_EMPTY_HINT="No link or local config file has been added yet. Please add one first!"
|
||||
PROVIDERS_TEMPLATE_CURRENT="Current rule template: "
|
||||
PROVIDERS_TEMPLATE_SELECT="Please select an online template:"
|
||||
PROVIDERS_TEMPLATE_LOCAL="Use \033[36mlocal template\033[0m"
|
||||
PROVIDERS_TEMPLATE_PATH="Please enter template path (absolute path)"
|
||||
PROVIDERS_TEMPLATE_NOT_FOUND="Invalid input, template file not found!"
|
||||
|
||||
PROVIDERS_CLEAN_WARN="This will clear all files under"
|
||||
PROVIDERS_CLEAN_WARN_END=""
|
||||
PROVIDERS_CLEAN_CONFIRM="Continue?"
|
||||
|
||||
PROVIDERS_FETCHING_TEMPLATE="Fetching online template..."
|
||||
PROVIDERS_DOWNLOAD_FAILED="Download failed. Please try switching install source!"
|
||||
PROVIDERS_GEN_OK="Configuration file generated successfully!"
|
||||
PROVIDERS_GEN_OK_SINGBOX="Configuration generated successfully! If startup times out, install the Singbox-srs common database package from Update menu."
|
||||
PROVIDERS_GEN_FAILED="Failed to generate configuration file. Please check your input carefully!"
|
||||
PROVIDERS_RESTART_ASK="Start/Restart service now?"
|
||||
PROVIDERS_YES="Yes"
|
||||
PROVIDERS_NO="No"
|
||||
PROVIDERS_CRON_SUB_UPDATE="Update subscription"
|
||||
34
scripts/lang/en/set_crashdir.lang
Normal file
34
scripts/lang/en/set_crashdir.lang
Normal file
@@ -0,0 +1,34 @@
|
||||
SCD_SELECT_INSTALL_DIR="Please select install directory:"
|
||||
SCD_INPUT_NUM="Please enter a number"
|
||||
SCD_INPUT_ERROR="Invalid input! Please retry!"
|
||||
SCD_XIAOMI_DETECTED="Xiaomi stock firmware detected, select installation location:"
|
||||
SCD_CUSTOM_DIR_WARN="Custom directory (not recommended)"
|
||||
SCD_EXIT_INSTALL="Exit installation"
|
||||
SCD_SELECT_USB_DIR="Please select USB directory:"
|
||||
SCD_ASUS_DM_NOT_FOUND="Download Master startup file not found:"
|
||||
SCD_CHECK_SETTING="please check your settings!"
|
||||
SCD_ASUS_DETECTED="Asus firmware detected, please select installation method"
|
||||
SCD_ASUS_INSTALL_DM="Install via USB + Download Master (all firmwares, ARM only)"
|
||||
SCD_ASUS_INSTALL_SCRIPT="Install via startup script (some Merlin firmwares only)"
|
||||
SCD_ASUS_DM_HINT="Install and enable Download Master in router web UI first, then select external storage directory."
|
||||
SCD_ASUS_REINSTALL_HINT="If boot auto-start fails, please reinstall with USB + Download Master."
|
||||
SCD_PATH_FORMAT_HINT="Path must start with /. Files under virtual memory (/tmp,/opt,/sys...) will be lost after reboot!"
|
||||
SCD_PATH_FREE_SPACE="Available paths free space:"
|
||||
SCD_INPUT_CUSTOM_DIR="Please input custom path"
|
||||
SCD_PATH_ERROR="Invalid path! Please retry!"
|
||||
SCD_INSTALL_SPACE_HINT="Notice: ShellCrash requires at least ~1MB free space"
|
||||
SCD_INSTALL_ETC="Install in \033[32m/etc\033[0m (root users)"
|
||||
SCD_INSTALL_USR="Install in \033[32m/usr/share\033[0m (Linux systems)"
|
||||
SCD_INSTALL_HOME="Install in \033[32mcurrent user dir\033[0m (non-root users)"
|
||||
SCD_INSTALL_USB="Install in \033[32mexternal storage\033[0m"
|
||||
SCD_INSTALL_MANUAL="Set install directory manually"
|
||||
SCD_INSTALL_CANCELED="Installation canceled"
|
||||
SCD_NO_WRITE_PREFIX="No write permission on "
|
||||
SCD_NO_WRITE_SUFFIX=", please retry!"
|
||||
SCD_TARGET_DIR_PREFIX="Target directory "
|
||||
SCD_TARGET_DIR_SPACE=" free space: "
|
||||
SCD_CONFIRM_INSTALL="Confirm installation?"
|
||||
SCD_YES="Yes"
|
||||
SCD_NO="No"
|
||||
SCD_DIR_FREE=" dir, free: "
|
||||
SCD_SOFT_SOLID="(supports soft solidification)"
|
||||
33
scripts/lang/en/subconverter.lang
Normal file
33
scripts/lang/en/subconverter.lang
Normal file
@@ -0,0 +1,33 @@
|
||||
SUBCONVERTER_MENU_GEN="Generate config including all nodes and subscriptions"
|
||||
SUBCONVERTER_MENU_EXCLUDE="Set \033[31mexclude node regex\033[0m"
|
||||
SUBCONVERTER_MENU_INCLUDE="Set \033[32minclude node regex\033[0m"
|
||||
SUBCONVERTER_MENU_RULE="Select \033[33monline rule template\033[0m"
|
||||
SUBCONVERTER_MENU_SERVER="Select Subconverter server"
|
||||
SUBCONVERTER_MENU_UA="Custom browser UA"
|
||||
|
||||
SUBCONVERTER_INPUT="Please enter"
|
||||
SUBCONVERTER_BACK="or enter 0 to return"
|
||||
|
||||
SUBCONVERTER_EXCLUDE_HINT1="Nodes matching keywords will be blocked during import!"
|
||||
SUBCONVERTER_INCLUDE_HINT1="Only nodes matching keywords will be imported!!!"
|
||||
SUBCONVERTER_KEYWORD_SPLIT="Use \033[30;47m | \033[0m to separate multiple keywords"
|
||||
SUBCONVERTER_REGEX_HINT="\033[32mRegex is supported\033[0m. Use \033[30;47m + \033[0m instead of spaces"
|
||||
SUBCONVERTER_EXCLUDE_INPUT="Enter exclude keyword(s) directly"
|
||||
SUBCONVERTER_INCLUDE_INPUT="Enter include keyword(s) directly"
|
||||
SUBCONVERTER_EXCLUDE_CLEAR="or enter d to \033[31mclear\033[0m exclude keywords"
|
||||
SUBCONVERTER_INCLUDE_CLEAR="or enter d to \033[31mclear\033[0m include keywords"
|
||||
|
||||
SUBCONVERTER_RULE_CURRENT="Current rule: "
|
||||
SUBCONVERTER_SERVER_HINT="The following third-party servers are collected from the internet. Please evaluate their security by yourself!"
|
||||
SUBCONVERTER_SERVER_THANKS="Thanks to the contributors below for their great work!!!"
|
||||
SUBCONVERTER_SERVER_CURRENT="Current backend: "
|
||||
SUBCONVERTER_SET_OK="Settings saved. Returning to previous menu"
|
||||
|
||||
SUBCONVERTER_UA_HINT="Try this if the config file cannot be fetched correctly"
|
||||
SUBCONVERTER_UA_CURRENT="Current UA: "
|
||||
SUBCONVERTER_UA_AUTO="Use auto UA (default)"
|
||||
SUBCONVERTER_UA_NONE="Do not use UA"
|
||||
SUBCONVERTER_UA_CUSTOM="Use custom UA"
|
||||
SUBCONVERTER_UA_CLEAR="Clear UA"
|
||||
SUBCONVERTER_UA_CUSTOM_WARN="Note:\nCustom UA cannot contain spaces or special symbols!"
|
||||
SUBCONVERTER_UA_CUSTOM_INPUT="Enter custom UA"
|
||||
19
scripts/lang/en/task_cmd.lang
Normal file
19
scripts/lang/en/task_cmd.lang
Normal file
@@ -0,0 +1,19 @@
|
||||
TASK_CMD_EVERY="every"
|
||||
TASK_CMD_HOURLY="hourly"
|
||||
TASK_CMD_MIN="minute"
|
||||
TASK_CMD_CORE_SKIP="Task [Auto update core] skipped - no new version detected"
|
||||
TASK_CMD_CORE_DONE="Task [Auto update core] download complete, restarting service"
|
||||
TASK_CMD_CORE_DL_FAIL="Task [Auto update core] failed - download error"
|
||||
TASK_CMD_CORE_VERIFY_FAIL="Task [Auto update core] failed - core verification error"
|
||||
TASK_CMD_SCRIPT_SKIP="Task [Auto update script] skipped - no new version detected"
|
||||
TASK_CMD_SCRIPT_UNZIP_FAIL="Task [Auto update script] failed - extract error"
|
||||
TASK_CMD_DB_SKIP_PREFIX="Task [Auto update database] skipped - no new version for "
|
||||
TASK_CMD_DB_SKIP_SUFFIX=""
|
||||
TASK_CMD_DB_DL_FAIL_PREFIX="Task [Auto update database] failed downloading ["
|
||||
TASK_CMD_DB_DL_FAIL_SUFFIX="]"
|
||||
TASK_CMD_DB_OK_PREFIX="Task [Auto update database] updated ["
|
||||
TASK_CMD_DB_OK_SUFFIX="] successfully"
|
||||
TASK_CMD_RES_OK="success"
|
||||
TASK_CMD_RES_FAIL="failed"
|
||||
TASK_CMD_EXEC_PREFIX="Task ["
|
||||
TASK_CMD_EXEC_MID="] result: "
|
||||
13
scripts/lang/en/uninstall.lang
Normal file
13
scripts/lang/en/uninstall.lang
Normal file
@@ -0,0 +1,13 @@
|
||||
UNINSTALL_WARN="Warning: this action is irreversible!"
|
||||
UNINSTALL_CONFIRM="Are you sure you want to uninstall ShellCrash?"
|
||||
UNINSTALL_YES="Yes"
|
||||
UNINSTALL_NO="No"
|
||||
UNINSTALL_KEEP_CONFIRM="Keep script configs and subscription files?"
|
||||
UNINSTALL_ENV_ERROR="Environment variable configuration is incorrect. Please remove the installation directory manually!"
|
||||
UNINSTALL_DONE="ShellCrash related files have been removed. Goodbye!"
|
||||
UNINSTALL_CLOSE_HINT="Please close the current terminal window manually to reset environment variables!"
|
||||
UNINSTALL_CANCELED="Operation canceled!"
|
||||
UNINSTALL_CRON_CLASH="clash service"
|
||||
UNINSTALL_CRON_SUB="subscription link"
|
||||
UNINSTALL_CRON_INIT="ShellCrash initialization"
|
||||
UNINSTALL_SSH_MARK="Enable SSH access from WAN"
|
||||
@@ -4,10 +4,13 @@
|
||||
. "$CRASHDIR"/libs/web_json.sh
|
||||
. "$CRASHDIR"/libs/set_config.sh
|
||||
. "$CRASHDIR"/libs/web_get_lite.sh
|
||||
. "$CRASHDIR"/libs/i18n.sh
|
||||
. "$CRASHDIR"/menus/running_status.sh
|
||||
. "$CRASHDIR"/configs/gateway.cfg
|
||||
. "$CRASHDIR"/configs/ShellCrash.cfg
|
||||
|
||||
load_lang bot_tg
|
||||
|
||||
TMPDIR='/tmp/ShellCrash'
|
||||
API="https://api.telegram.org/bot$TG_TOKEN"
|
||||
STATE_FILE="$TMPDIR/tgbot_state"
|
||||
@@ -32,15 +35,15 @@ send_msg(){
|
||||
}
|
||||
send_help(){
|
||||
TEXT=$(cat <<EOF
|
||||
进群讨论:
|
||||
$BOT_TG_HELP_GROUP
|
||||
https://t.me/+6AElkMDzwPxmMmM1
|
||||
项目地址:
|
||||
$BOT_TG_HELP_PROJECT
|
||||
https://github.com/juewuy/ShellClash
|
||||
相关教程:
|
||||
$BOT_TG_HELP_GUIDE
|
||||
https://juewuy.github.io
|
||||
请喝咖啡:
|
||||
$BOT_TG_HELP_COFFEE
|
||||
https://juewuy.github.io/yOF4Yf06Q/
|
||||
友情机场:
|
||||
$BOT_TG_HELP_AIRPORT
|
||||
https://dler.pro/auth/register?affid=89698
|
||||
https://pub.bigmeok.me?code=2PuWY9I7
|
||||
EOF
|
||||
@@ -51,31 +54,31 @@ send_menu(){
|
||||
#获取运行状态
|
||||
PID=$(pidof CrashCore | awk '{print $NF}')
|
||||
if [ -n "$PID" ]; then
|
||||
run='🟢正在运行'
|
||||
run="$BOT_TG_RUN_ON"
|
||||
running_status
|
||||
else
|
||||
run='🟡未运行'
|
||||
run="$BOT_TG_RUN_OFF"
|
||||
fi
|
||||
corename=$(echo $crashcore | sed 's/singboxr/SingBoxR/' | sed 's/singbox/SingBox/' | sed 's/clash/Clash/' | sed 's/meta/Mihomo/')
|
||||
TEXT=$(cat <<EOF
|
||||
*欢迎使用ShellCrash!*_${versionsh_l}_
|
||||
$corename服务$run
|
||||
【*$redir_mod*】内存占用:$VmRSS
|
||||
已运行:$day$time
|
||||
请选择操作:
|
||||
*$BOT_TG_WELCOME*_${versionsh_l}_
|
||||
$corename$BOT_TG_SERVICE$run
|
||||
【*$redir_mod*】$BOT_TG_MEM_USED$VmRSS
|
||||
$BOT_TG_RUNNING_TIME$day$time
|
||||
$BOT_TG_SELECT_ACTION
|
||||
EOF
|
||||
)
|
||||
MENU=$(cat <<EOF
|
||||
{
|
||||
"inline_keyboard":[
|
||||
[
|
||||
{"text":"✈️ 启用劫持","callback_data":"start_redir"},
|
||||
{"text":"💧 纯净模式","callback_data":"stop_redir"},
|
||||
{"text":"🕹 重启服务","callback_data":"restart"}
|
||||
{"text":"$BOT_TG_BTN_START","callback_data":"start_redir"},
|
||||
{"text":"$BOT_TG_BTN_PURE","callback_data":"stop_redir"},
|
||||
{"text":"$BOT_TG_BTN_RESTART","callback_data":"restart"}
|
||||
],
|
||||
[
|
||||
{"text":"📄 查看日志","callback_data":"readlog"},
|
||||
{"text":"🔃 文件传输","callback_data":"transport"}
|
||||
{"text":"$BOT_TG_BTN_LOG","callback_data":"readlog"},
|
||||
{"text":"$BOT_TG_BTN_TRANSFER","callback_data":"transport"}
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -85,7 +88,7 @@ web_json_post "$API/sendMessage" "{\"chat_id\":\"$TG_CHATID\",\"text\":\"$TEXT\"
|
||||
}
|
||||
### --- 文件传输 --- ###
|
||||
send_transport_menu(){
|
||||
TEXT='请选择需要上传或下载的具体文件:'
|
||||
TEXT="$BOT_TG_SELECT_FILE"
|
||||
if echo "$crashcore" | grep -q 'singbox';then
|
||||
config_type=json
|
||||
else
|
||||
@@ -95,23 +98,23 @@ send_transport_menu(){
|
||||
if curl -h >/dev/null 2>&1;then
|
||||
CURL_KB=$(cat <<EOF
|
||||
[
|
||||
{"text":"📥 下载日志","callback_data":"ts_get_log"},
|
||||
{"text":"💾 备份设置","callback_data":"ts_get_bak"},
|
||||
{"text":"⬇️ 下载配置","callback_data":"ts_get_ccf"}
|
||||
{"text":"$BOT_TG_BTN_GET_LOG","callback_data":"ts_get_log"},
|
||||
{"text":"$BOT_TG_BTN_GET_BAK","callback_data":"ts_get_bak"},
|
||||
{"text":"$BOT_TG_BTN_GET_CFG","callback_data":"ts_get_ccf"}
|
||||
],
|
||||
EOF
|
||||
)
|
||||
else
|
||||
CURL_KB='[{"text":"⚠️ 因当前设备缺少curl应用,仅支持上传功能!","callback_data":"noop"}],'
|
||||
CURL_KB='[{"text":"$BOT_TG_NO_CURL","callback_data":"noop"}],'
|
||||
fi
|
||||
MENU=$(cat <<EOF
|
||||
{
|
||||
"inline_keyboard":[
|
||||
$CURL_KB
|
||||
[
|
||||
{"text":"🪐 上传内核","callback_data":"ts_up_core"},
|
||||
{"text":"🔄 还原设置","callback_data":"ts_up_bak"},
|
||||
{"text":"⬆️ 上传配置","callback_data":"ts_up_ccf"}
|
||||
{"text":"$BOT_TG_BTN_UP_CORE","callback_data":"ts_up_core"},
|
||||
{"text":"$BOT_TG_BTN_UP_BAK","callback_data":"ts_up_bak"},
|
||||
{"text":"$BOT_TG_BTN_UP_CFG","callback_data":"ts_up_ccf"}
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -125,17 +128,17 @@ process_file(){
|
||||
case "$FILE_TYPE" in
|
||||
1)
|
||||
. "$CRASHDIR"/libs/core_tools.sh
|
||||
core_check "$TMPDIR/$FILE_NAME" && res='成功!即将重启服务!' || res='失败,请仔细检查文件或重试!'
|
||||
send_msg "内核更新$res"
|
||||
core_check "$TMPDIR/$FILE_NAME" && res="$BOT_TG_UPLOAD_OK" || res="$BOT_TG_UPLOAD_FAIL"
|
||||
send_msg "$BOT_TG_CORE_UPDATE$res"
|
||||
sleep 2
|
||||
"$CRASHDIR"/start.sh start
|
||||
;;
|
||||
2)
|
||||
tar -zxf "$TMPDIR/$FILE_NAME" -C "$CRASHDIR"/configs && res='配置文件已还原,请手动重启服务!' || res='解压还原失败,请仔细检查文件或重试!'
|
||||
tar -zxf "$TMPDIR/$FILE_NAME" -C "$CRASHDIR"/configs && res="$BOT_TG_CFG_RESTORED" || res="$BOT_TG_RESTORE_FAIL"
|
||||
send_msg "$res"
|
||||
;;
|
||||
3)
|
||||
mv -f "$TMPDIR/$FILE_NAME" "$CRASHDIR/${config_type}s/" && res='配置文件已上传,请手动重启服务!' || res='上传失败,请仔细检查文件或重试!'
|
||||
mv -f "$TMPDIR/$FILE_NAME" "$CRASHDIR/${config_type}s/" && res="$BOT_TG_CFG_UPLOADED" || res="$BOT_TG_UPLOAD_FAIL2"
|
||||
send_msg "$res"
|
||||
;;
|
||||
esac
|
||||
@@ -151,10 +154,10 @@ download_file(){
|
||||
if [ "$?" = 0 ];then
|
||||
process_file
|
||||
else
|
||||
send_msg "网络错误,上传失败!请重试!"
|
||||
send_msg "$BOT_TG_NET_UPLOAD_FAIL"
|
||||
fi
|
||||
else
|
||||
send_msg "文件格式不匹配,上传失败!"
|
||||
send_msg "$BOT_TG_FILE_FORMAT_FAIL"
|
||||
fi
|
||||
}
|
||||
### --- 具体操作函数 --- ###
|
||||
@@ -163,22 +166,22 @@ do_start_fw(){
|
||||
redir_mod=$redir_mod_bf
|
||||
setconfig redir_mod $redir_mod
|
||||
"$CRASHDIR"/start.sh start_firewall
|
||||
echo "ShellCrash 透明路由*$redir_mod_bf*已启用!" > "$LOGFILE"
|
||||
echo "$BOT_TG_FW_ENABLED*$redir_mod_bf*$BOT_TG_FW_ENABLED_SUFFIX" > "$LOGFILE"
|
||||
}
|
||||
do_stop_fw(){
|
||||
redir_mod_bf=$redir_mod
|
||||
firewall_area=4
|
||||
setconfig firewall_area 4
|
||||
"$CRASHDIR"/start.sh stop_firewall
|
||||
echo "ShellCrash 已切换到纯净模式!" > "$LOGFILE"
|
||||
echo "$BOT_TG_SWITCH_PURE" > "$LOGFILE"
|
||||
}
|
||||
do_restart(){
|
||||
"$CRASHDIR"/start.sh restart
|
||||
echo "ShellCrash 服务已重启!" > "$LOGFILE"
|
||||
echo "$BOT_TG_SERVICE_RESTARTED" > "$LOGFILE"
|
||||
}
|
||||
do_set_sub(){
|
||||
#echo "$1" "$2" >> "$CRASHDIR"/configs/providers.cfg
|
||||
echo "错误,还未完成的功能!" > "$LOGFILE"
|
||||
echo "$BOT_TG_UNFINISHED" > "$LOGFILE"
|
||||
|
||||
}
|
||||
transport(){ #文件传输
|
||||
@@ -204,15 +207,15 @@ transport(){ #文件传输
|
||||
;;
|
||||
"ts_up_core")
|
||||
FILE_TYPE=1
|
||||
send_msg "请发送需要上传的内核,必须是以tar.gz,.gz或.upx结尾的【${corename}】内核!"
|
||||
send_msg "$BOT_TG_SEND_CORE ${corename} $BOT_TG_SEND_CORE_SUFFIX"
|
||||
;;
|
||||
"ts_up_bak")
|
||||
FILE_TYPE=2
|
||||
send_msg "请发送需要还原的备份文件,必须是【.tar.gz】格式!"
|
||||
send_msg "$BOT_TG_SEND_BAK"
|
||||
;;
|
||||
"ts_up_ccf")
|
||||
FILE_TYPE=3
|
||||
send_msg "请发送需要上传的配置文件,必须是【.${config_type}】格式,支持自定义配置文件"
|
||||
send_msg "$BOT_TG_SEND_CFG .${config_type} $BOT_TG_SEND_CFG_SUFFIX"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
@@ -246,9 +249,9 @@ polling(){
|
||||
"start_redir")
|
||||
if [ "$firewall_area" = 4 ];then
|
||||
do_start_fw
|
||||
send_msg "已切换到$redir_mod_bf!"
|
||||
send_msg "$BOT_TG_SWITCH_TO$redir_mod_bf!"
|
||||
else
|
||||
send_msg "当前已经是$redir_mod!"
|
||||
send_msg "$BOT_TG_ALREADY$redir_mod!"
|
||||
fi
|
||||
send_menu
|
||||
continue
|
||||
@@ -256,22 +259,22 @@ polling(){
|
||||
"stop_redir")
|
||||
if [ "$firewall_area" != 4 ];then
|
||||
do_stop_fw
|
||||
send_msg "已切换到纯净模式"
|
||||
send_msg "$BOT_TG_SWITCH_PURE"
|
||||
else
|
||||
send_msg "当前已经是纯净模式!"
|
||||
send_msg "$BOT_TG_ALREADY_PURE"
|
||||
fi
|
||||
send_menu
|
||||
continue
|
||||
;;
|
||||
"restart")
|
||||
do_restart
|
||||
send_msg "🔄 服务已重启"
|
||||
send_msg "$BOT_TG_SERVICE_RESTARTED_SHORT"
|
||||
sleep 10
|
||||
send_menu
|
||||
continue
|
||||
;;
|
||||
"readlog")
|
||||
send_msg "📄 日志内容如下(已过滤任务日志):\n\`\`\`$(grep -v '任务' $TMPDIR/ShellCrash.log |tail -n 20)\`\`\`"
|
||||
send_msg "$BOT_TG_LOG_CONTENT\n\`\`\`$(grep -v "$BOT_TG_TASK_WORD" $TMPDIR/ShellCrash.log |tail -n 20)\`\`\`"
|
||||
sleep 3
|
||||
send_menu
|
||||
continue
|
||||
@@ -282,7 +285,7 @@ polling(){
|
||||
;;
|
||||
"set_sub")
|
||||
echo "await_sub" > "$STATE_FILE"
|
||||
send_msg "✏ 请输入新的订阅链接:"
|
||||
send_msg "$BOT_TG_INPUT_SUB"
|
||||
continue
|
||||
;;
|
||||
ts_*)
|
||||
@@ -298,7 +301,7 @@ polling(){
|
||||
if [ "$(cat "$STATE_FILE" 2>/dev/null)" = "await_sub" ]; then
|
||||
echo "" > "$STATE_FILE"
|
||||
do_set_sub "$TEXT"
|
||||
send_msg "订阅更新完成:\n$(cat "$LOGFILE")"
|
||||
send_msg "$BOT_TG_SUB_UPDATED\n$(cat "$LOGFILE")"
|
||||
send_menu
|
||||
continue
|
||||
fi
|
||||
|
||||
@@ -2,16 +2,18 @@
|
||||
|
||||
. "$CRASHDIR"/libs/web_get_lite.sh
|
||||
|
||||
load_lang bot_tg
|
||||
|
||||
private_bot() {
|
||||
comp_box "请先通过 \033[32;4mhttps://t.me/BotFather\033[0m 申请TG机器人并获取其\033[36mAPI TOKEN\033[0m"
|
||||
read -r -p "请输入你获取到的API TOKEN> " TOKEN
|
||||
comp_box "$BOT_TG_PRIVATE_HINT"
|
||||
read -r -p "$BOT_TG_INPUT_TOKEN> " TOKEN
|
||||
url_tg=https://api.telegram.org/bot${TOKEN}/getUpdates
|
||||
|
||||
top_box "请向\033[32m你申请的机器人\033[33m而不是BotFather!\033[0m"
|
||||
top_box "$BOT_TG_PRIVATE_TOP"
|
||||
}
|
||||
|
||||
public_bot() {
|
||||
comp_box "请向机器人:\033[32;4mhttps://t.me/ShellCrashtg_bot\033[0m"
|
||||
comp_box "$BOT_TG_PUBLIC_HINT"
|
||||
TOKEN=publictoken
|
||||
url_tg=https://tgbot.jwsc.eu.org/publictoken/getUpdates
|
||||
}
|
||||
@@ -20,7 +22,7 @@ tg_push_token() {
|
||||
push_TG="$TOKEN"
|
||||
setconfig push_TG "$TOKEN"
|
||||
setconfig chat_ID "$chat_ID"
|
||||
. "$CRASHDIR"/libs/logger.sh && logger "已完成Telegram日志推送设置!" 32
|
||||
. "$CRASHDIR"/libs/logger.sh && logger "$BOT_TG_SET_DONE" 32
|
||||
}
|
||||
|
||||
get_chatid() {
|
||||
@@ -28,7 +30,7 @@ get_chatid() {
|
||||
chat_ID=''
|
||||
while [ $i -le 3 ] && [ -z "$chat_ID" ]; do
|
||||
sleep 1
|
||||
comp_box "\033[33m第 $i 次尝试获取对话ID失败,正在重试...\033[0m"
|
||||
comp_box "\033[33m$BOT_TG_CHATID_RETRY_PREFIX $i $BOT_TG_CHATID_RETRY_SUFFIX\033[0m"
|
||||
chat=$(web_get_lite "$url_tg" 2>/dev/null)
|
||||
if [ -n "$chat" ]; then
|
||||
chat_ID=$(echo "$chat" | sed 's/"update_id":/{\n"update_id":/g' | grep "$public_key" | head -n1 | grep -oE '"id":.*,"is_bot' | sed s'/"id"://' | sed s'/,"is_bot//')
|
||||
@@ -39,19 +41,19 @@ get_chatid() {
|
||||
|
||||
set_bot() {
|
||||
public_key=$(cat /proc/sys/kernel/random/boot_id | sed 's/.*-//')
|
||||
btm_box "发送此秘钥: \033[30;46m$public_key\033[0m"
|
||||
read -r -p "我已经发送完成(1/0)> " res
|
||||
btm_box "$BOT_TG_SEND_KEY \033[30;46m$public_key\033[0m"
|
||||
read -r -p "$BOT_TG_SENT_CONFIRM(1/0)> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
get_chatid
|
||||
[ -z "$chat_ID" ] && [ "$TOKEN" != 'publictoken' ] && {
|
||||
comp_box "\033[31m无法获取对话ID,请返回重新设置或手动输入ChatID!\033[0m" \
|
||||
"通常访问 \033[32;4m$url_tg\033[0m \n\033[36m即可看到ChatID\033[0m"
|
||||
read -r -p "请手动输入ChatID> " chat_ID
|
||||
comp_box "\033[31m$BOT_TG_CHATID_FAIL\033[0m" \
|
||||
"$BOT_TG_CHATID_MANUAL_HINT \033[32;4m$url_tg\033[0m \n\033[36m$BOT_TG_CHATID_MANUAL_HINT2\033[0m"
|
||||
read -r -p "$BOT_TG_INPUT_CHATID> " chat_ID
|
||||
}
|
||||
if echo "$chat_ID" | grep -qE '^[0-9]{8,}$'; then
|
||||
return 0
|
||||
else
|
||||
msg_alert "\033[31m无法获取对话ID,请重新配置!\033[0m"
|
||||
msg_alert "\033[31m$BOT_TG_CHATID_RECONFIG\033[0m"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
|
||||
. "$CRASHDIR"/libs/set_cron.sh
|
||||
|
||||
load_lang bot_tg
|
||||
|
||||
bot_tg_start(){
|
||||
. "$CRASHDIR"/starts/start_legacy.sh
|
||||
start_legacy "$CRASHDIR/menus/bot_tg.sh" 'bot_tg'
|
||||
@@ -12,5 +14,5 @@ bot_tg_stop(){
|
||||
rm -f "$TMPDIR/bot_tg.pid"
|
||||
}
|
||||
bot_tg_cron(){
|
||||
cronset 'TG_BOT守护进程' "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh bot_tg #ShellCrash-TG_BOT守护进程"
|
||||
cronset "$BOT_TG_CRON_NAME" "* * * * * /bin/sh $CRASHDIR/starts/start_legacy_wd.sh bot_tg #$BOT_TG_CRON_NAME"
|
||||
}
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
load_lang check_port
|
||||
|
||||
check_port() {
|
||||
if [ "$1" -gt 65535 ] || [ "$1" -le 1 ]; then
|
||||
msg_alert "\033[31m输入错误!请输入正确的数值(1-65535)!\033[0m"
|
||||
msg_alert "\033[31m$CHECK_PORT_RANGE_ERR\033[0m"
|
||||
return 1
|
||||
elif echo "|$mix_port|$redir_port|$dns_port|$db_port|" | grep -q "|$1|"; then
|
||||
msg_alert "\033[31m输入错误!请不要输入重复的端口!\033[0m"
|
||||
msg_alert "\033[31m$CHECK_PORT_DUP_ERR\033[0m"
|
||||
return 1
|
||||
elif netstat -ntul | grep -q ":$1[[:space:]]"; then
|
||||
msg_alert "\033[31m当前端口已被其他进程占用,请重新输入!\033[0m"
|
||||
msg_alert "\033[31m$CHECK_PORT_OCCUPIED_ERR\033[0m"
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
#! /bin/bash
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
load_lang ddns
|
||||
|
||||
ddns_menu() {
|
||||
top_box "\033[30;46m欢迎使用DDNS!\033[0m"
|
||||
top_box "\033[30;46m$DDNS_WELCOME\033[0m"
|
||||
load_ddns
|
||||
}
|
||||
|
||||
@@ -28,36 +30,36 @@ config service '$service'
|
||||
EOF
|
||||
/usr/lib/ddns/dynamic_dns_updater.sh -S "$service" start >/dev/null 2>&1 &
|
||||
sleep 3
|
||||
msg_alert "服务已经添加!"
|
||||
msg_alert "$DDNS_ADD_DONE"
|
||||
}
|
||||
|
||||
set_ddns() {
|
||||
while true; do
|
||||
line_break
|
||||
read -r -p "请输入你的域名> " str
|
||||
read -r -p "$DDNS_INPUT_DOMAIN> " str
|
||||
[ -z "$str" ] && domain="$domain" || domain="$str"
|
||||
echo ""
|
||||
read -r -p "请输入用户名或邮箱> " str
|
||||
read -r -p "$DDNS_INPUT_USER> " str
|
||||
[ -z "$str" ] && username="$username" || username="$str"
|
||||
echo ""
|
||||
read -r -p "请输入密码或令牌秘钥> " str
|
||||
read -r -p "$DDNS_INPUT_PASS> " str
|
||||
[ -z "$str" ] && password="$password" || password="$str"
|
||||
echo ""
|
||||
read -r -p "请输入检测更新间隔(单位:分钟;默认为10)> " check_interval
|
||||
read -r -p "$DDNS_INPUT_CHECK_INTERVAL> " check_interval
|
||||
[ -z "$check_interval" ] || [ "$check_interval" -lt 1 -o "$check_interval" -gt 1440 ] && check_interval=10
|
||||
echo ""
|
||||
read -r -p "请输入强制更新间隔(单位:小时;默认为24)> " force_interval
|
||||
read -r -p "$DDNS_INPUT_FORCE_INTERVAL> " force_interval
|
||||
[ -z "$force_interval" ] || [ "$force_interval" -lt 1 -o "$force_interval" -gt 240 ] && force_interval=24
|
||||
|
||||
comp_box "请核对如下信息:" \
|
||||
comp_box "$DDNS_CONFIRM_INFO" \
|
||||
"" \
|
||||
"服务商: \033[32m$service\033[0m" \
|
||||
"域名: \033[32m$domain\033[0m" \
|
||||
"用户名: \033[32m$username\033[0m" \
|
||||
"检测间隔: \033[32m$check_interval\033[0m"
|
||||
btm_box "是否确认添加:"
|
||||
btm_box "1) 是" \
|
||||
"0) 否,重新輸入"
|
||||
"$DDNS_FIELD_SERVICE \033[32m$service\033[0m" \
|
||||
"$DDNS_FIELD_DOMAIN \033[32m$domain\033[0m" \
|
||||
"$DDNS_FIELD_USER \033[32m$username\033[0m" \
|
||||
"$DDNS_FIELD_INTERVAL \033[32m$check_interval\033[0m"
|
||||
btm_box "$DDNS_CONFIRM_ADD"
|
||||
btm_box "1) $DDNS_YES" \
|
||||
"0) $DDNS_REINPUT"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = 1 ]; then
|
||||
add_ddns
|
||||
@@ -72,17 +74,17 @@ set_ddns_service() {
|
||||
[ -s "$services_dir" ] || services_dir=/etc/ddns/services
|
||||
[ -s "$services_dir" ] || services_dir=/usr/share/ddns/list
|
||||
[ -s "$services_dir" ] || {
|
||||
msg_alert "\033[33m未找到DDNS列表文件,尝试在线获取……\033[0m"
|
||||
ddns service update >/dev/null || msg_alert "\033[31m下载失败,请重试!\033[0m"
|
||||
msg_alert "\033[33m$DDNS_LIST_NOT_FOUND\033[0m"
|
||||
ddns service update >/dev/null || msg_alert "\033[31m$DDNS_DOWNLOAD_FAILED\033[0m"
|
||||
}
|
||||
comp_box "\033[32m请选择服务提供商:\033[0m"
|
||||
comp_box "\033[32m$DDNS_SELECT_PROVIDER\033[0m"
|
||||
|
||||
list=$(awk '/^#/ || !NF {next} {print $1}' "$services_dir")
|
||||
list_box "$list"
|
||||
|
||||
nr=$(echo "$list" | wc -l)
|
||||
common_back
|
||||
read -r -p "请输入对应数字> " num
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
if [ -z "$num" ] || [ "$num" = 0 ]; then
|
||||
i=
|
||||
break
|
||||
@@ -92,19 +94,19 @@ set_ddns_service() {
|
||||
set_ddns
|
||||
break
|
||||
else
|
||||
msg_alert "\033[33m输入错误,请重新输入!\033[0m"
|
||||
msg_alert "\033[33m$DDNS_INPUT_ERROR\033[0m"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
set_ddns_type() {
|
||||
while true; do
|
||||
comp_box "\033[32m请选择网络模式:\033[0m"
|
||||
btm_box "1) \033[36mIPV4\033[0m" \
|
||||
"2) \033[36mIPV6\033[0m" \
|
||||
comp_box "\033[32m$DDNS_SELECT_NETMODE\033[0m"
|
||||
btm_box "1) \033[36m$DDNS_IPV4\033[0m" \
|
||||
"2) \033[36m$DDNS_IPV6\033[0m" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "请输入对应数字> " num
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
@@ -122,7 +124,7 @@ set_ddns_type() {
|
||||
break
|
||||
;;
|
||||
*)
|
||||
msg_alert "\033[33m输入错误,请重新输入!\033[0m"
|
||||
msg_alert "\033[33m$DDNS_INPUT_ERROR\033[0m"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
@@ -131,15 +133,15 @@ set_ddns_type() {
|
||||
rev_ddns_service() {
|
||||
while true; do
|
||||
enabled=$(uci get ddns."$service".enabled)
|
||||
[ "$enabled" = 1 ] && enabled_b="停用" || enabled_b="启用"
|
||||
comp_box "1) \033[32m立即更新\033[0m" \
|
||||
"2) 编辑当前服务" \
|
||||
"3) $enabled_b当前服务" \
|
||||
"4) 移除当前服务" \
|
||||
"5) 查看运行日志" \
|
||||
[ "$enabled" = 1 ] && enabled_b="$DDNS_DISABLE" || enabled_b="$DDNS_ENABLE"
|
||||
comp_box "1) \033[32m$DDNS_UPDATE_NOW\033[0m" \
|
||||
"2) $DDNS_EDIT_CURRENT" \
|
||||
"3) $enabled_b$DDNS_CURRENT_SERVICE" \
|
||||
"4) $DDNS_REMOVE_CURRENT" \
|
||||
"5) $DDNS_VIEW_LOG" \
|
||||
"" \
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应数字> " num
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
@@ -176,7 +178,7 @@ rev_ddns_service() {
|
||||
break
|
||||
;;
|
||||
*)
|
||||
msg_alert "\033[33m输入错误,请重新输入!\033[0m"
|
||||
msg_alert "\033[33m$DDNS_INPUT_ERROR\033[0m"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
@@ -187,14 +189,14 @@ load_ddns() {
|
||||
ddns_dir=/etc/config/ddns
|
||||
tmp_dir="$TMPDIR"/ddns
|
||||
[ ! -f "$ddns_dir" ] && {
|
||||
btm_box "\033[31m本脚本依赖OpenWrt内置的DDNS服务,当前设备无法运行,已退出!\033[0m"
|
||||
btm_box "\033[31m$DDNS_NOT_SUPPORTED\033[0m"
|
||||
sleep 1
|
||||
return 1
|
||||
}
|
||||
nr=0
|
||||
cat "$ddns_dir" | grep 'config service' | awk '{print $3}' | sed "s/'//g" | sed 's/"//g' >"$tmp_dir"
|
||||
separator_line "="
|
||||
content_line " 列表 域名 启用 IP地址"
|
||||
content_line "$DDNS_LIST_HEADER"
|
||||
content_line ""
|
||||
[ -s "$tmp_dir" ] && for service in $(cat "$tmp_dir"); do
|
||||
# echo $service >>$tmp_dir
|
||||
@@ -204,10 +206,10 @@ load_ddns() {
|
||||
local_ip=$(sed '1!G;h;$!d' /var/log/ddns/"$service".log 2>/dev/null | grep -E 'Registered IP' | tail -1 | awk -F "'" '{print $2}' | tr -d "'\"")
|
||||
content_line "$nr) $domain $enabled $local_ip"
|
||||
done
|
||||
content_line "$((nr + 1))) 添加DDNS服务"
|
||||
content_line "0) 退出"
|
||||
content_line "$((nr + 1))) $DDNS_ADD_SERVICE"
|
||||
content_line "0) $DDNS_EXIT"
|
||||
separator_line "="
|
||||
read -r -p "请输入对应序号> " num
|
||||
read -r -p "$DDNS_INPUT_INDEX> " num
|
||||
if [ -z "$num" ] || [ "$num" = 0 ]; then
|
||||
i=
|
||||
rm -rf "$tmp_dir"
|
||||
@@ -218,7 +220,7 @@ load_ddns() {
|
||||
service=$(cat "$tmp_dir" | sed -n "$num"p)
|
||||
rev_ddns_service
|
||||
else
|
||||
msg_alert "\033[33m请输入正确数字!\033[0m"
|
||||
msg_alert "\033[33m$DDNS_INPUT_NUM_ERROR\033[0m"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
[ -n "$__IS_MODULE_PROVIDERS" ] && return
|
||||
__IS_MODULE_PROVIDERS=1
|
||||
|
||||
load_lang providers
|
||||
|
||||
if [ "$crashcore" = singboxr ]; then
|
||||
CORE_TYPE=singbox
|
||||
else
|
||||
@@ -21,12 +23,12 @@ providers() {
|
||||
[ -z "$provider_temp_des" ] && provider_temp_des=$provider_temp_file
|
||||
fi
|
||||
|
||||
comp_box "1) \033[32m生成\033[0m包含全部提供者的配置文件" \
|
||||
"2) 选择\033[33m规则模版\033[0m \033[32m$provider_temp_des\033[0m" \
|
||||
"3) \033[33m清理\033[0mproviders目录文件" \
|
||||
comp_box "1) \033[32m$PROVIDERS_MENU_GEN\033[0m" \
|
||||
"2) $PROVIDERS_MENU_TEMPLATE \033[32m$provider_temp_des\033[0m" \
|
||||
"3) $PROVIDERS_MENU_CLEAN" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "请输入对应字母或数字> " num
|
||||
read -r -p "$PROVIDERS_INPUT> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
@@ -36,25 +38,25 @@ providers() {
|
||||
. "$CRASHDIR/menus/providers_$CORE_TYPE.sh"
|
||||
gen_providers
|
||||
else
|
||||
msg_alert "\033[31m你还未添加链接或本地配置文件,请先添加!\033[0m"
|
||||
msg_alert "\033[31m$PROVIDERS_EMPTY_HINT\033[0m"
|
||||
fi
|
||||
;;
|
||||
2)
|
||||
list=$(cat "$CRASHDIR/configs/${CORE_TYPE}_providers.list" | awk '{print $1}')
|
||||
|
||||
comp_box "当前规则模版为:\033[32m$provider_temp_des\033[0m" \
|
||||
"\033[33m请选择在线模版:\033[0m"
|
||||
comp_box "$PROVIDERS_TEMPLATE_CURRENT\033[32m$provider_temp_des\033[0m" \
|
||||
"\033[33m$PROVIDERS_TEMPLATE_SELECT\033[0m"
|
||||
list_box "$list"
|
||||
btm_box "" \
|
||||
"a) 使用\033[36m本地模版\033[0m" \
|
||||
"a) $PROVIDERS_TEMPLATE_LOCAL" \
|
||||
"" \
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "请输入对应字母或数字> " num
|
||||
read -r -p "$PROVIDERS_INPUT> " num
|
||||
case "$num" in
|
||||
"" | 0) ;;
|
||||
a)
|
||||
line_break
|
||||
read -r -p "请输入模版的路径(绝对路径)> " dir
|
||||
read -r -p "$PROVIDERS_TEMPLATE_PATH> " dir
|
||||
if [ -s "$dir" ]; then
|
||||
provider_temp_file=$dir
|
||||
if setconfig provider_temp_"$CORE_TYPE" "$provider_temp_file"; then
|
||||
@@ -63,7 +65,7 @@ providers() {
|
||||
common_failed
|
||||
fi
|
||||
else
|
||||
msg_alert "\033[31m输入错误,找不到对应模版文件!\033[0m"
|
||||
msg_alert "\033[31m$PROVIDERS_TEMPLATE_NOT_FOUND\033[0m"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
@@ -81,11 +83,11 @@ providers() {
|
||||
esac
|
||||
;;
|
||||
3)
|
||||
comp_box "\033[33m将清空 $CRASHDIR/providers 目录下所有内容\033[0m" \
|
||||
comp_box "\033[33m$PROVIDERS_CLEAN_WARN $CRASHDIR/providers $PROVIDERS_CLEAN_WARN_END\033[0m" \
|
||||
"" \
|
||||
"是否继续?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
"$PROVIDERS_CLEAN_CONFIRM"
|
||||
btm_box "1) $PROVIDERS_YES" \
|
||||
"0) $PROVIDERS_NO"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = "1" ]; then
|
||||
if rm -rf "$CRASHDIR"/providers; then
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
[ -n "$__IS_PROVIDERS_CLASH" ] && return
|
||||
__IS_PROVIDERS_CLASH=1
|
||||
|
||||
load_lang providers
|
||||
|
||||
. "$CRASHDIR"/libs/web_get_bin.sh
|
||||
|
||||
# 生成clash的providers配置文件
|
||||
@@ -17,10 +19,10 @@ gen_providers() {
|
||||
if [ -s "$provider_temp_file" ]; then
|
||||
ln -sf "$provider_temp_file" "$TMPDIR"/provider_temp_file
|
||||
else
|
||||
msg_alert "\033[33m正在获取在线模版......\033[0m"
|
||||
msg_alert "\033[33m$PROVIDERS_FETCHING_TEMPLATE\033[0m"
|
||||
get_bin "$TMPDIR"/provider_temp_file "rules/${CORE_TYPE}_providers/$provider_temp_file"
|
||||
[ -z "$(grep -o 'rules' "$TMPDIR"/provider_temp_file)" ] && {
|
||||
msg_alert "\033[31m下载失败,请尝试更换安装源!\033[0m"
|
||||
msg_alert "\033[31m$PROVIDERS_DOWNLOAD_FAILED\033[0m"
|
||||
. "$CRASHDIR"/menus/9_upgrade.sh && setserver
|
||||
setproviders
|
||||
}
|
||||
@@ -61,21 +63,21 @@ gen_providers() {
|
||||
# 调用内核测试
|
||||
. "$CRASHDIR"/starts/check_core.sh && check_core && "$TMPDIR"/CrashCore -t -d "$BINDIR" -f "$TMPDIR"/config.yaml
|
||||
if [ "$?" = 0 ]; then
|
||||
msg_alert "\033[32m配置文件生成成功!\033[0m"
|
||||
msg_alert "\033[32m$PROVIDERS_GEN_OK\033[0m"
|
||||
mkdir -p "$CRASHDIR"/yamls
|
||||
mv -f "$TMPDIR"/config.yaml "$CRASHDIR"/yamls/config.yaml
|
||||
comp_box "是否立即启动/重启服务?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
comp_box "$PROVIDERS_RESTART_ASK"
|
||||
btm_box "1) $PROVIDERS_YES" \
|
||||
"0) $PROVIDERS_NO"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
[ "$res" = 1 ] && {
|
||||
start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset '更新订阅'
|
||||
start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset "$PROVIDERS_CRON_SUB_UPDATE"
|
||||
exit
|
||||
}
|
||||
else
|
||||
rm -rf "$TMPDIR"/CrashCore
|
||||
rm -rf "$TMPDIR"/config.yaml
|
||||
msg_alert "\033[31m生成配置文件出错,请仔细检查输入!\033[0m"
|
||||
msg_alert "\033[31m$PROVIDERS_GEN_FAILED\033[0m"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
[ -n "$__IS_PROVIDERS_SINGBOX" ] && return
|
||||
__IS_PROVIDERS_SINGBOX=1
|
||||
|
||||
load_lang providers
|
||||
|
||||
. "$CRASHDIR"/libs/web_get_bin.sh
|
||||
|
||||
# 生成singbox的providers配置文件
|
||||
@@ -16,10 +18,10 @@ gen_providers() {
|
||||
if [ -s "$provider_temp_file" ]; then
|
||||
ln -sf "$provider_temp_file" "$TMPDIR"/provider_temp_file
|
||||
else
|
||||
msg_alert "\033[33m正在获取在线模版......\033[0m"
|
||||
msg_alert "\033[33m$PROVIDERS_FETCHING_TEMPLATE\033[0m"
|
||||
get_bin "$TMPDIR"/provider_temp_file "rules/${CORE_TYPE}_providers/$provider_temp_file"
|
||||
[ -z "$(grep -o 'route' "$TMPDIR"/provider_temp_file)" ] && {
|
||||
msg_alert "\033[31m下载失败,请尝试更换安装源!\033[0m"
|
||||
msg_alert "\033[31m$PROVIDERS_DOWNLOAD_FAILED\033[0m"
|
||||
. "$CRASHDIR"/menus/9_upgrade.sh && setserver
|
||||
setproviders
|
||||
}
|
||||
@@ -65,21 +67,21 @@ EOF
|
||||
# 调用内核测试
|
||||
. "$CRASHDIR"/starts/check_core.sh && check_core && "$TMPDIR"/CrashCore merge "$TMPDIR"/config.json -C "$TMPDIR"/providers
|
||||
if [ "$?" = 0 ]; then
|
||||
msg_alert "\033[32m配置文件生成成功!如果启动超时建议更新里手动安装Singbox-srs数据库常用包!\033[0m"
|
||||
msg_alert "\033[32m$PROVIDERS_GEN_OK_SINGBOX\033[0m"
|
||||
mkdir -p "$CRASHDIR"/jsons
|
||||
mv -f "$TMPDIR"/config.json "$CRASHDIR"/jsons/config.json
|
||||
rm -rf "$TMPDIR"/providerss
|
||||
comp_box "是否立即启动/重启服务?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
comp_box "$PROVIDERS_RESTART_ASK"
|
||||
btm_box "1) $PROVIDERS_YES" \
|
||||
"0) $PROVIDERS_NO"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
[ "$res" = 1 ] && {
|
||||
start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset '更新订阅'
|
||||
start_core && . "$CRASHDIR"/libs/set_cron.sh && cronset "$PROVIDERS_CRON_SUB_UPDATE"
|
||||
exit
|
||||
}
|
||||
else
|
||||
rm -rf "$TMPDIR"/CrashCore
|
||||
msg_alert "\033[31m生成配置文件出错,请仔细检查输入!\033[0m"
|
||||
msg_alert "\033[31m$PROVIDERS_GEN_FAILED\033[0m"
|
||||
# rm -rf "$TMPDIR"/providers
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -3,19 +3,26 @@
|
||||
|
||||
[ -f /tmp/SC_tmp/libs/check_dir_avail.sh ] && . /tmp/SC_tmp/libs/check_dir_avail.sh
|
||||
|
||||
if [ -n "$CRASHDIR" ] && [ -s "$CRASHDIR/libs/i18n.sh" ]; then
|
||||
. "$CRASHDIR/libs/i18n.sh"
|
||||
load_lang set_crashdir
|
||||
elif [ -n "$language" ] && [ -s "/tmp/SC_tmp/lang/$language/set_crashdir.lang" ]; then
|
||||
. "/tmp/SC_tmp/lang/$language/set_crashdir.lang"
|
||||
fi
|
||||
|
||||
set_usb_dir() {
|
||||
while true; do
|
||||
comp_box "请选择安装目录:"
|
||||
comp_box "$SCD_SELECT_INSTALL_DIR"
|
||||
du -hL /mnt |
|
||||
awk '{print NR") "$2 " " $1}' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
separator_line "="
|
||||
read -r -p "请输入相应数字> " num
|
||||
read -r -p "$SCD_INPUT_NUM> " num
|
||||
dir=$(du -hL /mnt | awk '{print $2}' | sed -n "$num"p)
|
||||
if [ -z "$dir" ]; then
|
||||
msg_alert "\033[31m输入错误!请重新设置!\033[0m"
|
||||
msg_alert "\033[31m$SCD_INPUT_ERROR\033[0m"
|
||||
continue
|
||||
fi
|
||||
break 1
|
||||
@@ -23,15 +30,15 @@ set_usb_dir() {
|
||||
}
|
||||
|
||||
set_xiaomi_dir() {
|
||||
comp_box "\033[33m检测到当前设备为小米官方系统,请选择安装位置:\033[0m"
|
||||
[ -d /data ] && content_line "1) /data目录,剩余空间:$(dir_avail /data -h) (支持软固化功能)"
|
||||
[ -d /userdisk ] && content_line "2) /userdisk目录,剩余空间:$(dir_avail /userdisk -h) (支持软固化功能)"
|
||||
[ -d /data/other_vol ] && content_line "3) /data/other_vol目录,剩余空间:$(dir_avail /data/other_vol -h) (支持软固化功能)"
|
||||
content_line "4) 自定义目录(不推荐,不明勿用!)"
|
||||
comp_box "\033[33m$SCD_XIAOMI_DETECTED\033[0m"
|
||||
[ -d /data ] && content_line "1) /data$SCD_DIR_FREE$(dir_avail /data -h) $SCD_SOFT_SOLID"
|
||||
[ -d /userdisk ] && content_line "2) /userdisk$SCD_DIR_FREE$(dir_avail /userdisk -h) $SCD_SOFT_SOLID"
|
||||
[ -d /data/other_vol ] && content_line "3) /data/other_vol$SCD_DIR_FREE$(dir_avail /data/other_vol -h) $SCD_SOFT_SOLID"
|
||||
content_line "4) $SCD_CUSTOM_DIR_WARN"
|
||||
content_line ""
|
||||
content_line "0) 退出安装"
|
||||
content_line "0) $SCD_EXIT_INSTALL"
|
||||
separator_line "="
|
||||
read -r -p "请输入相应数字> " num
|
||||
read -r -p "$SCD_INPUT_NUM> " num
|
||||
case "$num" in
|
||||
1)
|
||||
dir=/data
|
||||
@@ -54,17 +61,17 @@ set_xiaomi_dir() {
|
||||
|
||||
set_asus_usb() {
|
||||
while true; do
|
||||
comp_box "请选择U盘目录:"
|
||||
comp_box "$SCD_SELECT_USB_DIR"
|
||||
du -hL /tmp/mnt |
|
||||
awk -F/ 'NF<=4 {print NR") "$2 " " $1}' |
|
||||
while IFS= read -r line; do
|
||||
content_line "$line"
|
||||
done
|
||||
separator_line "="
|
||||
read -r -p "请输入相应数字> " num
|
||||
read -r -p "$SCD_INPUT_NUM> " num
|
||||
dir=$(du -hL /tmp/mnt | awk -F/ 'NF<=4' | awk '{print $2}' | sed -n "$num"p)
|
||||
if [ ! -f "$dir/asusware.arm/etc/init.d/S50downloadmaster" ]; then
|
||||
msg_alert "\033[31m未找到下载大师自启文件:$dir/asusware.arm/etc/init.d/S50downloadmaster,请检查设置!\033[0m"
|
||||
msg_alert "\033[31m$SCD_ASUS_DM_NOT_FOUND $dir/asusware.arm/etc/init.d/S50downloadmaster,$SCD_CHECK_SETTING\033[0m"
|
||||
else
|
||||
break
|
||||
fi
|
||||
@@ -73,19 +80,19 @@ set_asus_usb() {
|
||||
|
||||
set_asus_dir() {
|
||||
separator_line "="
|
||||
btm_box "\033[33m检测到当前设备为华硕固件,请选择安装方式\033[0m" \
|
||||
"1) 基于U盘+下载大师安装(支持所有固件,限ARM设备,须插入U盘或移动硬盘)" \
|
||||
"2) 基于自启脚本安装(仅持部分梅林固件)" \
|
||||
btm_box "\033[33m$SCD_ASUS_DETECTED\033[0m" \
|
||||
"1) $SCD_ASUS_INSTALL_DM" \
|
||||
"2) $SCD_ASUS_INSTALL_SCRIPT" \
|
||||
"" \
|
||||
"0) 退出安装"
|
||||
read -r -p "请输入相应数字> " num
|
||||
"0) $SCD_EXIT_INSTALL"
|
||||
read -r -p "$SCD_INPUT_NUM> " num
|
||||
case "$num" in
|
||||
1)
|
||||
msg_alert -t 2 "请先在路由器网页后台安装下载大师并启用,之后选择外置存储所在目录!"
|
||||
msg_alert -t 2 "$SCD_ASUS_DM_HINT"
|
||||
set_asus_usb
|
||||
;;
|
||||
2)
|
||||
msg_alert -t 2 "如开机无法正常自启,请重新使用U盘+下载大师安装!"
|
||||
msg_alert -t 2 "$SCD_ASUS_REINSTALL_HINT"
|
||||
dir=/jffs
|
||||
;;
|
||||
*)
|
||||
@@ -97,9 +104,9 @@ set_asus_dir() {
|
||||
|
||||
set_cust_dir() {
|
||||
while true; do
|
||||
comp_box "路径是必须带 / 的格式,注意写入虚拟内存(/tmp,/opt,/sys...)的文件会在重启后消失!" \
|
||||
comp_box "$SCD_PATH_FORMAT_HINT" \
|
||||
"" \
|
||||
"可用路径 剩余空间:"
|
||||
"$SCD_PATH_FREE_SPACE"
|
||||
df -h |
|
||||
awk '{print $6, $4}' |
|
||||
sed '1d' |
|
||||
@@ -107,9 +114,9 @@ set_cust_dir() {
|
||||
content_line "$line"
|
||||
done
|
||||
separator_line "="
|
||||
read -r -p "请输入自定义路径> " dir
|
||||
read -r -p "$SCD_INPUT_CUSTOM_DIR> " dir
|
||||
if [ "$(dir_avail "$dir")" = 0 ] || [ -n "$(echo "$dir" | grep -Eq '^/(tmp|opt|sys)(/|$)')" ]; then
|
||||
msg_alert "\033[31m路径错误!请重新设置!\033[0m"
|
||||
msg_alert "\033[31m$SCD_PATH_ERROR\033[0m"
|
||||
continue
|
||||
fi
|
||||
break 1
|
||||
@@ -118,7 +125,7 @@ set_cust_dir() {
|
||||
|
||||
set_crashdir() {
|
||||
while true; do
|
||||
top_box "\033[33m注意:安装ShellCrash至少需要预留约1MB的磁盘空间\033[0m"
|
||||
top_box "\033[33m$SCD_INSTALL_SPACE_HINT\033[0m"
|
||||
case "$systype" in
|
||||
Padavan)
|
||||
dir=/etc/storage
|
||||
@@ -134,14 +141,14 @@ set_crashdir() {
|
||||
;;
|
||||
*)
|
||||
separator_line "="
|
||||
btm_box "1) 在\033[32m/etc目录\033[0m下安装(适合root用户)" \
|
||||
"2) 在\033[32m/usr/share目录\033[0m下安装(适合Linux系统)" \
|
||||
"3) 在\033[32m当前用户目录\033[0m下安装(适合非root用户)" \
|
||||
"4) 在\033[32m外置存储\033[0m中安装" \
|
||||
"5) 手动设置安装目录" \
|
||||
btm_box "1) $SCD_INSTALL_ETC" \
|
||||
"2) $SCD_INSTALL_USR" \
|
||||
"3) $SCD_INSTALL_HOME" \
|
||||
"4) $SCD_INSTALL_USB" \
|
||||
"5) $SCD_INSTALL_MANUAL" \
|
||||
"" \
|
||||
"0) 退出安装"
|
||||
read -r -p "请输入相应数字> " num
|
||||
"0) $SCD_EXIT_INSTALL"
|
||||
read -r -p "$SCD_INPUT_NUM> " num
|
||||
# 设置目录
|
||||
case "$num" in
|
||||
1)
|
||||
@@ -161,7 +168,7 @@ set_crashdir() {
|
||||
set_cust_dir
|
||||
;;
|
||||
*)
|
||||
msg_alert "安装已取消"
|
||||
msg_alert "$SCD_INSTALL_CANCELED"
|
||||
line_break
|
||||
exit 1
|
||||
;;
|
||||
@@ -170,14 +177,14 @@ set_crashdir() {
|
||||
esac
|
||||
|
||||
if [ ! -w "$dir" ]; then
|
||||
msg_alert "\033[31m没有$dir目录写入权限!请重新设置!\033[0m"
|
||||
msg_alert "\033[31m$SCD_NO_WRITE_PREFIX$dir$SCD_NO_WRITE_SUFFIX\033[0m"
|
||||
else
|
||||
comp_box "目标目录\033[32m$dir\033[0m空间剩余:$(dir_avail "$dir" -h)" \
|
||||
comp_box "$SCD_TARGET_DIR_PREFIX\033[32m$dir\033[0m$SCD_TARGET_DIR_SPACE$(dir_avail "$dir" -h)" \
|
||||
"" \
|
||||
"是否确认安装?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
read -r -p "请输入相应数字> " res
|
||||
"$SCD_CONFIRM_INSTALL"
|
||||
btm_box "1) $SCD_YES" \
|
||||
"0) $SCD_NO"
|
||||
read -r -p "$SCD_INPUT_NUM> " res
|
||||
if [ "$res" = "1" ]; then
|
||||
CRASHDIR="$dir"/ShellCrash
|
||||
break
|
||||
|
||||
@@ -7,18 +7,20 @@ __IS_MODULE_SUBCONVERTER=1
|
||||
[ -z "$rule_link" ] && rule_link=1
|
||||
[ -z "$server_link" ] && server_link=1
|
||||
|
||||
load_lang subconverter
|
||||
|
||||
# Subconverter在线订阅转换
|
||||
subconverter() {
|
||||
while true; do
|
||||
comp_box "1) \033[32m生成\033[0m包含全部节点、订阅的配置文件"\
|
||||
"2) 设置\033[31m排除节点正则\033[0m \033[47;30m$exclude\033[0m"\
|
||||
"3) 设置\033[32m包含节点正则\033[0m \033[47;30m$include\033[0m"\
|
||||
"4) 选择\033[33m在线规则模版\033[0m"\
|
||||
"5) 选择\033[0mSubconverter服务器\033[0m"\
|
||||
"6) 自定义浏览器UA \033[32m$user_agent\033[0m"\
|
||||
comp_box "1) \033[32m$SUBCONVERTER_MENU_GEN\033[0m"\
|
||||
"2) $SUBCONVERTER_MENU_EXCLUDE \033[47;30m$exclude\033[0m"\
|
||||
"3) $SUBCONVERTER_MENU_INCLUDE \033[47;30m$include\033[0m"\
|
||||
"4) $SUBCONVERTER_MENU_RULE"\
|
||||
"5) $SUBCONVERTER_MENU_SERVER"\
|
||||
"6) $SUBCONVERTER_MENU_UA \033[32m$user_agent\033[0m"\
|
||||
""\
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "请输入对应数字> " num
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
case "$num" in
|
||||
"" | 0)
|
||||
break
|
||||
@@ -57,13 +59,13 @@ subconverter() {
|
||||
|
||||
# 排除节点正则
|
||||
gen_link_flt() {
|
||||
comp_box "\033[33m匹配关键字的节点会在导入时被【屏蔽】!\033[0m" \
|
||||
"多个关键字可以用\033[30;47m | \033[0m号分隔" \
|
||||
"\033[32m支持正则表达式\033[0m,空格请使用\033[30;47m + \033[0m号替代"
|
||||
btm_box "\033[36m请直接输入节点过滤关键字\033[0m" \
|
||||
"或输入 d \033[31m清空\033[0m节点过滤关键字" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " res
|
||||
comp_box "\033[33m$SUBCONVERTER_EXCLUDE_HINT1\033[0m" \
|
||||
"$SUBCONVERTER_KEYWORD_SPLIT" \
|
||||
"$SUBCONVERTER_REGEX_HINT"
|
||||
btm_box "\033[36m$SUBCONVERTER_EXCLUDE_INPUT\033[0m" \
|
||||
"$SUBCONVERTER_EXCLUDE_CLEAR" \
|
||||
"$SUBCONVERTER_BACK"
|
||||
read -r -p "$SUBCONVERTER_INPUT> " res
|
||||
case "$res" in
|
||||
0)
|
||||
return 0
|
||||
@@ -85,13 +87,13 @@ gen_link_flt() {
|
||||
|
||||
# 包含节点正则
|
||||
gen_link_ele() {
|
||||
comp_box "\033[33m仅有匹配关键字的节点才会被【导入】!!!\033[0m" \
|
||||
"多个关键字可以用\033[30;47m | \033[0m号分隔" \
|
||||
"\033[32m支持正则表达式\033[0m,空格请使用\033[30;47m + \033[0m号替代"
|
||||
btm_box "\033[36m请直接输入节点匹配关键字\033[0m" \
|
||||
"或输入 d \033[31m清空\033[0m节点匹配关键字" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " res
|
||||
comp_box "\033[33m$SUBCONVERTER_INCLUDE_HINT1\033[0m" \
|
||||
"$SUBCONVERTER_KEYWORD_SPLIT" \
|
||||
"$SUBCONVERTER_REGEX_HINT"
|
||||
btm_box "\033[36m$SUBCONVERTER_INCLUDE_INPUT\033[0m" \
|
||||
"$SUBCONVERTER_INCLUDE_CLEAR" \
|
||||
"$SUBCONVERTER_BACK"
|
||||
read -r -p "$SUBCONVERTER_INPUT> " res
|
||||
case "$res" in
|
||||
0)
|
||||
return 0
|
||||
@@ -115,11 +117,11 @@ gen_link_ele() {
|
||||
gen_link_config() {
|
||||
list=$(grep -aE '^5' "$CRASHDIR"/configs/servers.list | awk '{print $2$4}')
|
||||
now=$(grep -aE '^5' "$CRASHDIR"/configs/servers.list | sed -n ""$rule_link"p" | awk '{print $2}')
|
||||
comp_box "当前使用规则为:\033[33m$now\033[0m"
|
||||
comp_box "$SUBCONVERTER_RULE_CURRENT\033[33m$now\033[0m"
|
||||
list_box "$list"
|
||||
content_line ""
|
||||
common_back
|
||||
read -r -p "请输入对应数字> " num
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
totalnum=$(grep -acE '^5' "$CRASHDIR"/configs/servers.list)
|
||||
if [ -z "$num" ] || [ "$num" -gt "$totalnum" ]; then
|
||||
errornum
|
||||
@@ -129,7 +131,7 @@ gen_link_config() {
|
||||
# 将对应标记值写入配置
|
||||
rule_link=$num
|
||||
if setconfig rule_link "$rule_link"; then
|
||||
msg_alert "\033[32m设置成功!返回上级菜单\033[0m"
|
||||
msg_alert "\033[32m$SUBCONVERTER_SET_OK\033[0m"
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
@@ -141,14 +143,14 @@ gen_link_server() {
|
||||
list=$(grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | awk '{print $3" "$2}')
|
||||
now=$(grep -aE '^3|^4' "$CRASHDIR"/configs/servers.list | sed -n ""$server_link"p" | awk '{print $3}')
|
||||
|
||||
comp_box "\033[36m以下为互联网采集的第三方服务器,具体安全性请自行斟酌!\033[0m" \
|
||||
"\033[32m感谢以下作者的无私奉献!!!\033[0m" \
|
||||
comp_box "\033[36m$SUBCONVERTER_SERVER_HINT\033[0m" \
|
||||
"\033[32m$SUBCONVERTER_SERVER_THANKS\033[0m" \
|
||||
"" \
|
||||
"当前使用后端为:\033[33m$now\033[0m"
|
||||
"$SUBCONVERTER_SERVER_CURRENT\033[33m$now\033[0m"
|
||||
list_box "$list"
|
||||
content_line ""
|
||||
common_back
|
||||
read -r -p "请输入对应数字> " num
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
totalnum=$(grep -acE '^3|^4' "$CRASHDIR"/configs/servers.list)
|
||||
if [ -z "$num" ] || [ "$num" -gt "$totalnum" ]; then
|
||||
errornum
|
||||
@@ -158,7 +160,7 @@ gen_link_server() {
|
||||
# 将对应标记值写入配置
|
||||
server_link=$num
|
||||
if setconfig server_link "$server_link"; then
|
||||
content_line "\033[32m设置成功!返回上级菜单\033[0m"
|
||||
content_line "\033[32m$SUBCONVERTER_SET_OK\033[0m"
|
||||
else
|
||||
common_failed
|
||||
fi
|
||||
@@ -167,16 +169,16 @@ gen_link_server() {
|
||||
|
||||
set_sub_ua() {
|
||||
while true; do
|
||||
comp_box "\033[36m无法正确获取配置文件时可尝试使用\033[0m" \
|
||||
comp_box "\033[36m$SUBCONVERTER_UA_HINT\033[0m" \
|
||||
"" \
|
||||
"当前UA:$user_agent"
|
||||
btm_box "1) 使用自动UA(默认)"\
|
||||
"2) 不使用UA"\
|
||||
"3) 使用自定义UA"\
|
||||
"4) 清空UA"\
|
||||
"$SUBCONVERTER_UA_CURRENT$user_agent"
|
||||
btm_box "1) $SUBCONVERTER_UA_AUTO"\
|
||||
"2) $SUBCONVERTER_UA_NONE"\
|
||||
"3) $SUBCONVERTER_UA_CUSTOM"\
|
||||
"4) $SUBCONVERTER_UA_CLEAR"\
|
||||
""\
|
||||
"0) 返回上级菜单"
|
||||
read -r -p "请输入对应数字> " num
|
||||
"0) $COMMON_BACK"
|
||||
read -r -p "$COMMON_INPUT> " num
|
||||
case "$num" in
|
||||
0)
|
||||
break
|
||||
@@ -188,10 +190,10 @@ set_sub_ua() {
|
||||
user_agent='none'
|
||||
;;
|
||||
3)
|
||||
comp_box "\033[33m注意:\n自定义UA不可包含空格或特殊符号!\033[0m"
|
||||
btm_box "\033[36m请直接输入自定义UA\033[0m" \
|
||||
"或输入 0 返回上级菜单"
|
||||
read -r -p "请输入> " text
|
||||
comp_box "\033[33m$SUBCONVERTER_UA_CUSTOM_WARN\033[0m"
|
||||
btm_box "\033[36m$SUBCONVERTER_UA_CUSTOM_INPUT\033[0m" \
|
||||
"$SUBCONVERTER_BACK"
|
||||
read -r -p "$SUBCONVERTER_INPUT> " text
|
||||
if [ "$text" = 0 ]; then
|
||||
continue
|
||||
elif [ -n "$text" ]; then
|
||||
|
||||
@@ -9,12 +9,15 @@
|
||||
. "$CRASHDIR"/libs/set_config.sh
|
||||
. "$CRASHDIR"/libs/web_get_bin.sh
|
||||
. "$CRASHDIR"/libs/logger.sh
|
||||
. "$CRASHDIR"/libs/i18n.sh
|
||||
|
||||
load_lang task_cmd
|
||||
|
||||
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])分钟' && {
|
||||
echo "$1" |grep -qE "($TASK_CMD_EVERY|$TASK_CMD_HOURLY)([1-9]|[1-9][0-9])$TASK_CMD_MIN" && {
|
||||
push=off
|
||||
cover=on
|
||||
}
|
||||
@@ -32,22 +35,22 @@ update_core(){ #自动更新内核
|
||||
check_update bin/version
|
||||
crash_v_new=$(eval echo \$${crashcore}_v)
|
||||
if [ -z "$crash_v_new" -o "$crash_v_new" = "$core_v" ];then
|
||||
task_logger "任务【自动更新内核】中止-未检测到版本更新"
|
||||
task_logger "$TASK_CMD_CORE_SKIP"
|
||||
return 0
|
||||
else
|
||||
. "$CRASHDIR"/libs/core_tools.sh && core_webget #调用下载工具
|
||||
case "$?" in
|
||||
0)
|
||||
task_logger "任务【自动更新内核】下载完成,正在重启服务!"
|
||||
task_logger "$TASK_CMD_CORE_DONE"
|
||||
"$CRASHDIR"/start.sh start
|
||||
return 0
|
||||
;;
|
||||
1)
|
||||
task_logger "任务【自动更新内核】出错-下载失败!"
|
||||
task_logger "$TASK_CMD_CORE_DL_FAIL"
|
||||
return 1
|
||||
;;
|
||||
*)
|
||||
task_logger "任务【自动更新内核】出错-内核校验失败!"
|
||||
task_logger "$TASK_CMD_CORE_VERIFY_FAIL"
|
||||
"$CRASHDIR"/start.sh start
|
||||
return 1
|
||||
;;
|
||||
@@ -58,13 +61,13 @@ update_scripts(){ #自动更新脚本
|
||||
#检查版本
|
||||
check_update version
|
||||
if [ -z "$versionsh" -o "$versionsh" = "versionsh_l" ];then
|
||||
task_logger "任务【自动更新脚本】中止-未检测到版本更新"
|
||||
task_logger "$TASK_CMD_SCRIPT_SKIP"
|
||||
return 0
|
||||
else
|
||||
get_bin "$TMPDIR"/ShellCrash.tar.gz "ShellCrash.tar.gz"
|
||||
if [ "$?" != "0" ];then
|
||||
rm -rf "$TMPDIR"/ShellCrash.tar.gz
|
||||
task_logger "任务【自动更新内核】出错-下载失败!"
|
||||
task_logger "$TASK_CMD_CORE_DL_FAIL"
|
||||
return 1
|
||||
else
|
||||
#停止服务
|
||||
@@ -73,7 +76,7 @@ update_scripts(){ #自动更新脚本
|
||||
tar -zxf "$TMPDIR"/ShellCrash.tar.gz ${tar_para} -C "$CRASHDIR"/
|
||||
if [ $? -ne 0 ];then
|
||||
rm -rf "$TMPDIR"/ShellCrash.tar.gz
|
||||
task_logger "任务【自动更新内核】出错-解压失败!"
|
||||
task_logger "$TASK_CMD_SCRIPT_UNZIP_FAIL"
|
||||
"$CRASHDIR"/start.sh start
|
||||
return 1
|
||||
else
|
||||
@@ -92,17 +95,17 @@ update_mmdb(){ #自动更新数据库
|
||||
geo_v_new=$GeoIP_v
|
||||
geo_v_now=$(eval echo \$$geo_v)
|
||||
if [ -z "$geo_v_new" -o "$geo_v_new" = "$geo_v_now" ];then
|
||||
task_logger "任务【自动更新数据库文件】跳过-未检测到$2版本更新"
|
||||
task_logger "$TASK_CMD_DB_SKIP_PREFIX$2$TASK_CMD_DB_SKIP_SUFFIX"
|
||||
else
|
||||
#更新文件
|
||||
get_bin "$TMPDIR"/$1 "bin/geodata/$2"
|
||||
if [ "$?" != "0" ];then
|
||||
task_logger "任务【自动更新数据库文件】更新【$2】下载失败!"
|
||||
task_logger "$TASK_CMD_DB_DL_FAIL_PREFIX$2$TASK_CMD_DB_DL_FAIL_SUFFIX"
|
||||
rm -rf "$TMPDIR"/$1
|
||||
else
|
||||
mv -f "$TMPDIR"/$1 "$BINDIR"/$1
|
||||
setconfig $geo_v $GeoIP_v
|
||||
task_logger "任务【自动更新数据库文件】更新【$2】成功!"
|
||||
task_logger "$TASK_CMD_DB_OK_PREFIX$2$TASK_CMD_DB_OK_SUFFIX"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
@@ -140,8 +143,8 @@ case "$1" in
|
||||
task_command=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep "$1" | awk -F '#' '{print $2}')
|
||||
task_name=$(cat "$CRASHDIR"/task/task.list "$CRASHDIR"/task/task.user 2>/dev/null | grep "$1" | awk -F '#' '{print $3}')
|
||||
#task_logger "任务$task_name 开始执行"
|
||||
eval $task_command && task_res=成功 || task_res=失败
|
||||
task_logger "任务【$2】执行$task_res"
|
||||
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"
|
||||
;;
|
||||
*)
|
||||
"$1"
|
||||
|
||||
@@ -1,26 +1,28 @@
|
||||
#!/bin/sh
|
||||
# Copyright (C) Juewuy
|
||||
|
||||
load_lang uninstall
|
||||
|
||||
# 卸载
|
||||
uninstall() {
|
||||
comp_box "\033[31m警告:该操作不可逆!\033[0m" \
|
||||
"是否确认卸载ShellCrash?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
comp_box "\033[31m$UNINSTALL_WARN\033[0m" \
|
||||
"$UNINSTALL_CONFIRM"
|
||||
btm_box "1) $UNINSTALL_YES" \
|
||||
"0) $UNINSTALL_NO"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = '1' ]; then
|
||||
# 停止服务
|
||||
"$CRASHDIR"/start.sh stop 2>/dev/null
|
||||
"$CRASHDIR"/start.sh cronset "clash服务" 2>/dev/null
|
||||
"$CRASHDIR"/start.sh cronset "订阅链接" 2>/dev/null
|
||||
"$CRASHDIR"/start.sh cronset "ShellCrash初始化" 2>/dev/null
|
||||
"$CRASHDIR"/start.sh cronset "$UNINSTALL_CRON_CLASH" 2>/dev/null
|
||||
"$CRASHDIR"/start.sh cronset "$UNINSTALL_CRON_SUB" 2>/dev/null
|
||||
"$CRASHDIR"/start.sh cronset "$UNINSTALL_CRON_INIT" 2>/dev/null
|
||||
"$CRASHDIR"/start.sh cronset "task.sh" 2>/dev/null
|
||||
|
||||
# 移除安装目录
|
||||
if [ -n "$CRASHDIR" ] && [ "$CRASHDIR" != '/' ]; then
|
||||
comp_box "是否保留脚本配置及订阅文件?"
|
||||
btm_box "1) 是" \
|
||||
"0) 否"
|
||||
comp_box "$UNINSTALL_KEEP_CONFIRM"
|
||||
btm_box "1) $UNINSTALL_YES" \
|
||||
"0) $UNINSTALL_NO"
|
||||
read -r -p "$COMMON_INPUT> " res
|
||||
if [ "$res" = '1' ]; then
|
||||
mv -f "$CRASHDIR"/configs /tmp/ShellCrash/configs_bak
|
||||
@@ -34,7 +36,7 @@ uninstall() {
|
||||
rm -rf "$CRASHDIR"
|
||||
fi
|
||||
else
|
||||
msg_alert "\033[31m环境变量配置有误,请尝试手动移除安装目录!\033[0m"
|
||||
msg_alert "\033[31m$UNINSTALL_ENV_ERROR\033[0m"
|
||||
fi
|
||||
|
||||
# 移除其他内容
|
||||
@@ -48,9 +50,9 @@ uninstall() {
|
||||
}
|
||||
sed -i '/all_proxy/'d /etc/profile 2>/dev/null
|
||||
sed -i '/ALL_PROXY/'d /etc/profile 2>/dev/null
|
||||
sed -i "/启用外网访问SSH服务/d" /etc/firewall.user 2>/dev/null
|
||||
sed -i '/ShellCrash初始化/'d /etc/storage/started_script.sh 2>/dev/null
|
||||
sed -i '/ShellCrash初始化/'d /jffs/.asusrouter 2>/dev/null
|
||||
sed -i "/$UNINSTALL_SSH_MARK/d" /etc/firewall.user 2>/dev/null
|
||||
sed -i "/$UNINSTALL_CRON_INIT/d" /etc/storage/started_script.sh 2>/dev/null
|
||||
sed -i "/$UNINSTALL_CRON_INIT/d" /jffs/.asusrouter 2>/dev/null
|
||||
[ "$BINDIR" != "$CRASHDIR" ] && rm -rf "$BINDIR"
|
||||
rm -rf /etc/init.d/shellcrash
|
||||
rm -rf /etc/systemd/system/shellcrash.service
|
||||
@@ -62,12 +64,12 @@ uninstall() {
|
||||
userdel -r shellcrash 2>/dev/null
|
||||
nvram set script_usbmount="" 2>/dev/null
|
||||
nvram commit 2>/dev/null
|
||||
comp_box "\033[36m已卸载ShellCrash相关文件!有缘再会!\033[0m" \
|
||||
"\033[33m请手动关闭当前窗口以重置环境变量!\033[0m"
|
||||
comp_box "\033[36m$UNINSTALL_DONE\033[0m" \
|
||||
"\033[33m$UNINSTALL_CLOSE_HINT\033[0m"
|
||||
line_break
|
||||
sleep 1
|
||||
exit 0
|
||||
else
|
||||
msg_alert "\033[31m操作已取消!\033[0m"
|
||||
msg_alert "\033[31m$UNINSTALL_CANCELED\033[0m"
|
||||
fi
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user