files/bin/ZeroWrt
zhao 2195c984c9 更新 bin/ZeroWrt
Signed-off-by: zhao <zhao@noreply.localhost>
2025-05-21 01:11:21 +08:00

1205 lines
64 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 初始化语言变量
LANG_CHOICE=""
AGREED="no"
# 彩色输出函数
color_output() {
echo -e "$1"
}
# 显示语言选择菜单
select_language() {
clear
color_output "\e[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\e[0m"
color_output "\e[36m┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┃ \e[33m请选择语言/Select Language\e[36m ┃\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\e[0m"
color_output "\e[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\e[0m"
color_output ""
color_output "1. 中文"
color_output "2. English"
color_output "0. 退出/Exit"
color_output ""
color_output "\e[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\e[0m"
while [[ -z "$LANG_CHOICE" ]]; do
read -p "$(color_output "\e[33m请选择语言 [1-2]: \e[0m")" LANG_CHOICE
case "$LANG_CHOICE" in
1) LANG_CHOICE="zh";;
2) LANG_CHOICE="en";;
0) exit 0 ;;
*)
color_output "\e[31m无效选择请重新输入\e[0m"
LANG_CHOICE=""
;;
esac
done
}
# 显示用户协议
show_agreement() {
clear
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\e[0m"
color_output "\e[36m┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\e[0m"
color_output "\e[36m┃ \e[33mZeroWrt 配置工具用户协议\e[36m ┃\e[0m"
color_output "\e[36m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\e[0m"
color_output "\e[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\e[0m"
color_output ""
color_output "1. 本工具仅用于学习和研究目的,不得用于非法用途。"
color_output "2. 使用本工具可能会修改您的路由器配置,请谨慎操作。"
color_output "3. 作者不对使用本工具造成的任何损失负责。"
color_output "4. 继续使用表示您同意以上条款。"
color_output ""
color_output "\e[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\e[0m"
while [[ "$AGREED" != "yes" ]]; do
read -p "$(color_output "\e[33m您是否同意上述条款(yes/no): \e[0m")" AGREED
case "$AGREED" in
yes|YES|y|Y)
AGREED="yes"
;;
no|NO|n|N)
color_output "\e[31m您必须同意条款才能使用本工具。\e[0m"
exit 1
;;
*)
color_output "\e[31m请输入yes或no\e[0m"
;;
esac
done
else
color_output "\e[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\e[0m"
color_output "\e[36m┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\e[0m"
color_output "\e[36m┃ \e[33mZeroWrt Config Tool User Agreement\e[36m ┃\e[0m"
color_output "\e[36m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\e[0m"
color_output "\e[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\e[0m"
color_output ""
color_output "1. This tool is for learning and research only, not for illegal use."
color_output "2. Using this tool may modify your router settings, use with caution."
color_output "3. The author is not responsible for any damage caused by this tool."
color_output "4. Continuing to use means you agree to these terms."
color_output ""
color_output "\e[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\e[0m"
while [[ "$AGREED" != "yes" ]]; do
read -p "$(color_output "\e[33mDo you agree to these terms? (yes/no): \e[0m")" AGREED
case "$AGREED" in
yes|YES|y|Y)
AGREED="yes"
;;
no|NO|n|N)
color_output "\e[31mYou must agree to the terms to use this tool.\e[0m"
exit 1
;;
*)
color_output "\e[31mPlease enter yes or no\e[0m"
;;
esac
done
fi
}
# 打印脚本头部,增加美观
print_header() {
clear
# 获取系统信息
local model=$(cat /tmp/sysinfo/model 2>/dev/null || echo "未知设备")
# 使用更可靠的方式获取 CPU 使用率
local cpu_usage=$(grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {printf "%.1f%%", usage}')
local mem_total=$(free | grep Mem | awk '{print $2}')
local mem_used=$(free | grep Mem | awk '{print $3}')
local mem_usage=$((mem_used * 100 / mem_total))
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\e[0m"
color_output "\e[36m┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┃ \e[33m欢迎使用 ZeroWrt 配置工具\e[36m ┃\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\e[0m"
color_output "\e[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\e[0m"
color_output ""
color_output "\e[34m系统信息\e[0m"
color_output "----------------------------------------"
color_output " 设备型号: $model"
color_output " CPU 占用: $cpu_usage"
color_output " 内存占用: ${mem_usage}%"
color_output "----------------------------------------"
color_output "\e[32m说明本工具用于配置 ZeroWrt \e[0m"
color_output "\e[32m博客https://www.kejizero.online\e[0m"
color_output "----------------------------------------"
else
color_output "\e[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\e[0m"
color_output "\e[36m┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┃ \e[33mWelcome to ZeroWrt Config Tool\e[36m ┃\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\e[0m"
color_output "\e[36m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\e[0m"
color_output ""
color_output "\e[34mSystem Information\e[0m"
color_output "----------------------------------------"
color_output " Device Model: $model"
color_output " CPU Usage: $cpu_usage"
color_output " Memory Usage: ${mem_usage}%"
color_output "----------------------------------------"
color_output "\e[32mDescription: This tool configures ZeroWrt\e[0m"
color_output "\e[32mBlog: https://www.kejizero.online\e[0m"
color_output "----------------------------------------"
fi
echo ""
}
# 显示菜单
show_menu() {
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[36m┏━━━━━━━━━━━━━━━ 功能菜单 ━━━━━━━━━━━━━━━┓\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┃\e[0m 1. 更改 LAN 口 IP 地址 \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 2. 更改管理员密码 \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 3. 切换默认主题 \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 4. 恢复出厂设置 \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 5. 一键换源 \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 6. 一键部署 \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 7. 一键加载所有驱动 \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 8. IPv6 开关 (仅适用于主路由) \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 9. iStoreOS 风格化 \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 10. 检测更新 \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 0. 退出 \e[36m┃\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\e[0m"
read -p "$(color_output "\e[33m请输入您的选择 [0-10]: \e[0m")" choice
else
color_output "\e[36m┏━━━━━━━━━━━━━━━ MENU ━━━━━━━━━━━━━━━━━━┓\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┃\e[0m 1. Change LAN IP Address \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 2. Change Admin Password \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 3. Switch Default Theme \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 4. Factory Reset \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 5. Change Software Sources \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 6. One-click Deployment \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 7. One-click loading of all drivers \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 8. IPv6 Toggle (Main Router Only) \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 9. iStoreOS Styling \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 10. Check for Updates \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 0. Exit \e[36m┃\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\e[0m"
read -p "$(color_output "\e[33mEnter your choice [0-10]: \e[0m")" choice
fi
case "$choice" in
1) change_ip ;;
2) change_password ;;
3) change_theme ;;
4) reset_config ;;
5) change_source ;;
6) install_apps ;;
7) Load_driver ;;
8) configure_ipv6 ;;
9) istore_style ;;
10) check_update ;;
0) exit 0 ;;
*)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31m无效选项请重新输入\e[0m"
else
color_output "\e[31mInvalid option, please try again\e[0m"
fi
show_menu
;;
esac
}
# 1. 更换 LAN 口 IP 地址
change_ip() {
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[更改 LAN 口 IP 地址]\e[0m"
read -p "请输入新的 LAN 口 IP 地址(如 192.168.1.2: " new_ip
if [[ -n "$new_ip" ]]; then
uci set network.lan.ipaddr="$new_ip"
uci commit network
color_output "\e[32mLAN 口 IP 已成功更改为 $new_ip\e[0m"
color_output "\e[33m系统将在 10 秒后自动重启,请使用新的 IP 地址重新连接。\e[0m"
sleep 10
reboot
else
color_output "\e[31m无效的 IP 地址,操作取消。\e[0m"
read -p "按 Enter 键返回菜单..."
show_menu
fi
else
color_output "\e[34m[Change LAN IP Address]\e[0m"
read -p "Enter new LAN IP address (e.g. 192.168.1.2): " new_ip
if [[ -n "$new_ip" ]]; then
uci set network.lan.ipaddr="$new_ip"
uci commit network
color_output "\e[32mLAN IP successfully changed to $new_ip\e[0m"
color_output "\e[33mSystem will reboot in 10 seconds, please reconnect using the new IP.\e[0m"
sleep 10
reboot
else
color_output "\e[31mInvalid IP address, operation cancelled.\e[0m"
read -p "Press Enter to return to menu..."
show_menu
fi
fi
}
# 2. 更改管理员密码
change_password() {
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[更改管理员密码]\e[0m"
read -p "请输入新的管理员密码: " new_password
if [[ -n "$new_password" ]]; then
# 使用 openssl 生成密码哈希,使用 -1 参数生成 MD5 格式的密码哈希
password_hash=$(openssl passwd -1 "$new_password")
# 获取当前 shadow 文件的其他行
tail -n +2 /etc/shadow > /tmp/shadow.tmp
# 创建新的 root 行
echo "root:$password_hash:0:0:99999:7:::" > /etc/shadow
# 添加其他行
cat /tmp/shadow.tmp >> /etc/shadow
# 清理临时文件
rm -f /tmp/shadow.tmp
color_output "\e[32m管理员密码已成功更改。\e[0m"
else
color_output "\e[31m无效的密码操作取消。\e[0m"
fi
read -p "按 Enter 键返回菜单..."
else
color_output "\e[34m[Change Admin Password]\e[0m"
read -p "Enter new admin password: " new_password
if [[ -n "$new_password" ]]; then
# 使用 openssl 生成密码哈希,使用 -1 参数生成 MD5 格式的密码哈希
password_hash=$(openssl passwd -1 "$new_password")
# 获取当前 shadow 文件的其他行
tail -n +2 /etc/shadow > /tmp/shadow.tmp
# 创建新的 root 行
echo "root:$password_hash:0:0:99999:7:::" > /etc/shadow
# 添加其他行
cat /tmp/shadow.tmp >> /etc/shadow
# 清理临时文件
rm -f /tmp/shadow.tmp
color_output "\e[32mAdmin password changed successfully.\e[0m"
else
color_output "\e[31mInvalid password, operation cancelled.\e[0m"
fi
read -p "Press Enter to return to menu..."
fi
show_menu
}
# 3. 切换默认主题
change_theme() {
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[切换默认主题]\e[0m"
uci set luci.main.mediaurlbase='/luci-static/bootstrap'
uci commit luci
color_output "\e[32m主题已成功切换为默认主题。\e[0m"
read -p "按 Enter 键返回菜单..."
else
color_output "\e[34m[Switch Default Theme]\e[0m"
uci set luci.main.mediaurlbase='/luci-static/bootstrap'
uci commit luci
color_output "\e[32mTheme successfully switched to default.\e[0m"
read -p "Press Enter to return to menu..."
fi
show_menu
}
# 4. 一键重置配置
reset_config() {
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31m[恢复出厂设置]\e[0m"
color_output "\e[31m警告此操作将清除所有设置\e[0m"
read -p "确定要继续吗?(y/n): " confirm
if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then
echo "恢复出厂设置中..."
firstboot -y
color_output "\e[33m设备将在 5 秒钟后重启...\e[0m"
sleep 5
reboot
else
color_output "\e[32m操作已取消\e[0m"
read -p "按 Enter 键返回菜单..."
show_menu
fi
else
color_output "\e[31m[Factory Reset]\e[0m"
color_output "\e[31mWarning: This will erase all settings!\e[0m"
read -p "Are you sure you want to continue? (y/n): " confirm
if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then
echo "Resetting to factory defaults..."
firstboot -y
color_output "\e[33mDevice will reboot in 5 seconds...\e[0m"
sleep 5
reboot
else
color_output "\e[32mOperation cancelled\e[0m"
read -p "Press Enter to return to menu..."
show_menu
fi
fi
}
# 5. 一键换源
change_source() {
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[更换软件源]\e[0m"
color_output "\e[36m请选择要使用的源\e[0m"
color_output "1. 阿里源"
color_output "2. 清华源"
color_output "3. 中科大源"
color_output "4. 高校联合镜像站"
color_output "5. 南方科技大学"
color_output "6. 官方源"
color_output "0. 返回"
read -p "请输入您的选择 [0-6]: " source_choice
else
color_output "\e[34m[Change Software Sources]\e[0m"
color_output "\e[36mSelect source to use:\e[0m"
color_output "1. Aliyun Mirror"
color_output "2. Tsinghua Mirror"
color_output "3. USTC Mirror"
color_output "4. University Union Mirror"
color_output "5. SUSTech Mirror"
color_output "6. Official Source"
color_output "0. Back"
read -p "Enter your choice [0-6]: " source_choice
fi
# 仅支持 x86_64 和 aarch64 架构
arch=$(uname -m)
case "$arch" in
"x86_64")
arch_name="x86_64"
target_core_url="https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/24.10.1/targets/x86/64/kmods/6.6.86-1-af351158cfb5febf5155a3aa53785982"
extras_url="https://clone.kejizero.online/raw.githubusercontent.com/oppen321/openwrt_extras/main/x86_64"
;;
"aarch64")
arch_name="aarch64_generic"
target_core_url="https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/24.10.1/targets/rockchip/armv8/kmods/6.6.86-1-a8e18e0ecc66cc99303d258424ec0db8"
extras_url="https://clone.kejizero.online/raw.githubusercontent.com/oppen321/openwrt_extras/main/aarch64"
;;
*)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31m仅支持 x86_64 和 aarch64 架构,当前架构为:$arch\e[0m"
else
color_output "\e[31mOnly x86_64 and aarch64 are supported, current arch: $arch\e[0m"
fi
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键返回菜单..." || echo "Press Enter to return to menu...")"
show_menu
return
;;
esac
# 镜像站选择
case "$source_choice" in
1) base_url="https://mirrors.aliyun.com/openwrt/releases/24.10.0/packages/$arch_name" ;;
2) base_url="https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/24.10.0/packages/$arch_name" ;;
3) base_url="https://mirrors.ustc.edu.cn/openwrt/releases/24.10.0/packages/$arch_name" ;;
4) base_url="https://mirrors.xjtu.edu.cn/openwrt/releases/24.10.0/packages/$arch_name" ;;
5) base_url="https://mirrors.sustech.edu.cn/openwrt/releases/24.10.0/packages/$arch_name" ;;
6) base_url="https://downloads.openwrt.org/releases/24.10.0/packages/$arch_name" ;;
0) show_menu; return ;;
*)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31m无效选项返回菜单。\e[0m"
else
color_output "\e[31mInvalid option, returning to menu.\e[0m"
fi
show_menu; return
;;
esac
# 生成 distfeeds.conf 文件
cat <<EOF > /etc/opkg/distfeeds.conf
src/gz openwrt_base $base_url/base
src/gz openwrt_luci $base_url/luci
src/gz openwrt_packages $base_url/packages
src/gz openwrt_routing $base_url/routing
src/gz openwrt_telephony $base_url/telephony
src/gz openwrt_core $target_core_url
src/gz openwrt_extras $extras_url/package
src/gz openwrt_helloworld $extras_url/helloworld
EOF
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32m软件源已成功切换并追加自定义源。\e[0m"
read -p "按 Enter 键返回菜单..."
else
color_output "\e[32mSoftware sources changed successfully with custom sources added.\e[0m"
read -p "Press Enter to return to menu..."
fi
show_menu
}
# 6. 一键部署
install_apps() {
while true; do
clear
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[一键部署]\e[0m"
color_output "\e[36m┏━━━━━━━━━━━━━━━ 部署选项 ━━━━━━━━━━━━━━━┓\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┃\e[0m 1. 部署 ShellClash \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 2. 部署 小雅 Alist \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 3. 部署 Subconverter \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 4. 部署 AdGuardhome \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 5. 部署 Gitea-MySQL \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 6. 部署 SunPanel导航页 \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 0. 返回主菜单 \e[36m┃\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\e[0m"
read -p "$(color_output "\e[33m请输入您的选择 [0-6]: \e[0m")" app_choice
else
color_output "\e[34m[One-click Deployment]\e[0m"
color_output "\e[36m┏━━━━━━━━━━━━━━━ DEPLOYMENT ━━━━━━━━━━━━━━━┓\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┃\e[0m 1. Deploy ShellClash \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 2. Deploy XiaoYa Alist \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 3. Deploy Subconverter \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 4. Deploy AdGuardhome \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 5. Deploy Gitea-MySQL \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 6. Deploy SunPanel \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 0. Back to Main Menu \e[36m┃\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\e[0m"
read -p "$(color_output "\e[33mEnter your choice [0-6]: \e[0m")" app_choice
fi
case "$app_choice" in
1)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[部署 ShellClash]\e[0m"
color_output "\e[36m请选择 ShellClash 的安装源:\e[0m"
color_output "1. GitHub 源"
color_output "2. jsDelivr CDN 源"
color_output "0. 返回"
read -p "请输入您的选择 [0-2]: " install_choice
else
color_output "\e[34m[Deploy ShellClash]\e[0m"
color_output "\e[36mSelect installation source:\e[0m"
color_output "1. GitHub Source"
color_output "2. jsDelivr CDN Source"
color_output "0. Back"
read -p "Enter your choice [0-2]: " install_choice
fi
case "$install_choice" in
1) export url='https://raw.githubusercontent.com/juewuy/ShellCrash/master' ;;
2) export url='https://fastly.jsdelivr.net/gh/juewuy/ShellCrash@master' ;;
0) continue ;;
*)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31m无效选项\e[0m"
else
color_output "\e[31mInvalid option\e[0m"
fi
sleep 2
continue
;;
esac
if [ "$install_choice" != "0" ]; then
sh -c "$(curl -kfsSl $url/install.sh)" && source /etc/profile &> /dev/null
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32mShellClash 已成功安装。\e[0m"
else
color_output "\e[32mShellClash installed successfully.\e[0m"
fi
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键继续..." || echo "Press Enter to continue...")"
fi
;;
2)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[部署小雅 Alist]\e[0m"
color_output "\e[33m正在部署小雅 Alist...\e[0m"
else
color_output "\e[34m[Deploy XiaoYa Alist]\e[0m"
color_output "\e[33mDeploying XiaoYa Alist...\e[0m"
fi
bash -c "$(curl --insecure -fsSL https://ddsrem.com/xiaoya_install.sh)"
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32m小雅 Alist 安装完成。\e[0m"
else
color_output "\e[32mXiaoYa Alist installed successfully.\e[0m"
fi
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键继续..." || echo "Press Enter to continue...")"
;;
3)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[部署 Subconverter]\e[0m"
else
color_output "\e[34m[Deploy Subconverter]\e[0m"
fi
# 检查 Docker 是否已安装
if ! command -v docker &> /dev/null; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33m未检测到 Docker正在安装...\e[0m"
else
color_output "\e[33mDocker not found, installing...\e[0m"
fi
opkg update && opkg install docker
fi
# 检查 Subconverter 是否已运行
if docker ps | grep -q "subconverter"; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32mSubconverter 已经在运行\e[0m"
else
color_output "\e[32mSubconverter is already running\e[0m"
fi
# 获取本机 IP 地址
local_ip=$(ip addr show br-lan | grep -w inet | awk '{print $2}' | cut -d/ -f1)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[36m┏━━━━━━━━━━━━━━━ 配置模板 ━━━━━━━━━━━━━━━┓\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┃\e[0m 1. ACL4SSR_Online_Mini.ini \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 2. ACL4SSR_Online_Full.ini \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 3. ACL4SSR_Online.ini \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 0. 返回上一级 \e[36m┃\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\e[0m"
read -p "$(color_output "\e[33m请输入选择 [0-3]: \e[0m")" template_choice
else
color_output "\e[36m┏━━━━━━━━━━━━━━━ CONFIG TEMPLATE ━━━━━━━━━━━━━━━┓\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┃\e[0m 1. ACL4SSR_Online_Mini.ini \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 2. ACL4SSR_Online_Full.ini \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 3. ACL4SSR_Online.ini \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m 0. Back \e[36m┃\e[0m"
color_output "\e[36m┃ ┃\e[0m"
color_output "\e[36m┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\e[0m"
read -p "$(color_output "\e[33mEnter your choice [0-3]: \e[0m")" template_choice
fi
case "$template_choice" in
1) config_url="https://git.kejizero.online/zhao/rule/raw/branch/main/mihomo/ACL4SSR_Online_Mini.ini" ;;
2) config_url="https://git.kejizero.online/zhao/rule/raw/branch/main/mihomo/ACL4SSR_Online_Full.ini" ;;
3) config_url="https://git.kejizero.online/zhao/rule/raw/branch/main/mihomo/ACL4SSR_Online.ini" ;;
0) continue ;; # 返回上一级
*)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31m无效选择\e[0m"
else
color_output "\e[31mInvalid choice\e[0m"
fi
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键继续..." || echo "Press Enter to continue...")"
continue
;;
esac
# 获取订阅链接
if [[ "$LANG_CHOICE" == "zh" ]]; then
read -p "请输入订阅链接: " sub_url
else
read -p "Enter subscription URL: " sub_url
fi
if [ -n "$sub_url" ]; then
# 生成完整的转换链接
convert_url="http://${local_ip}:25500/sub?target=clash&insert=true&new_name=true&scv=true&url=${sub_url}&config=${config_url}"
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32m转换链接已生成\e[0m"
else
color_output "\e[32mConversion URL generated:\e[0m"
fi
color_output "\e[33m${convert_url}\e[0m"
else
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31m订阅链接不能为空\e[0m"
else
color_output "\e[31mSubscription URL cannot be empty\e[0m"
fi
fi
else
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33m正在部署 Subconverter...\e[0m"
else
color_output "\e[33mDeploying Subconverter...\e[0m"
fi
if docker run -d --restart=always -p 25500:25500 tindy2013/subconverter:latest; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32mSubconverter 部署成功!\e[0m"
else
color_output "\e[32mSubconverter deployed successfully!\e[0m"
fi
else
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31mSubconverter 部署失败\e[0m"
else
color_output "\e[31mSubconverter deployment failed\e[0m"
fi
fi
fi
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键返回..." || echo "Press Enter to return...")"
;;
4)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[部署 AdGuardHome]\e[0m"
else
color_output "\e[34m[Deploy AdGuardHome]\e[0m"
fi
# 检查 Docker 是否已安装
if ! command -v docker &> /dev/null; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33m未检测到 Docker正在安装...\e[0m"
else
color_output "\e[33mDocker not found, installing...\e[0m"
fi
opkg update && opkg install docker
fi
# 获取本机 IP 地址
local_ip=$(ip addr show br-lan | grep -w inet | awk '{print $2}' | cut -d/ -f1)
# 检查 AdGuardHome 是否已运行
if docker ps | grep -q "adguardhome"; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32mAdGuardHome 已经在运行!\e[0m"
color_output "\e[33m请使用浏览器访问\e[0m"
else
color_output "\e[32mAdGuardHome is already running!\e[0m"
color_output "\e[33mAccess it at:\e[0m"
fi
color_output "\e[32mhttp://${local_ip}:3000\e[0m"
else
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33m正在部署 AdGuardHome...\e[0m"
else
color_output "\e[33mDeploying AdGuardHome...\e[0m"
fi
# 创建配置目录
mkdir -p /root/adguardhome/work /root/adguardhome/conf
# 部署 AdGuardHome
if docker run -d \
--name adguardhome \
-v /root/adguardhome/work:/opt/adguardhome/work \
-v /root/adguardhome/conf:/opt/adguardhome/conf \
-p 3000:3000 \
--restart always \
adguard/adguardhome; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32m\nAdGuardHome 部署成功!\e[0m"
color_output "\e[33m请使用浏览器访问以下地址进行配置\e[0m"
else
color_output "\e[32m\nAdGuardHome deployed successfully!\e[0m"
color_output "\e[33mAccess the following URL to configure:\e[0m"
fi
color_output "\e[32mhttp://${local_ip}:3000\e[0m"
else
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31mAdGuardHome 部署失败\e[0m"
else
color_output "\e[31mAdGuardHome deployment failed\e[0m"
fi
fi
fi
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键返回..." || echo "Press Enter to return...")"
;;
5)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[部署 Gitea-MySQL]\e[0m"
else
color_output "\e[34m[Deploy Gitea-MySQL]\e[0m"
fi
# 检查 Gitea 容器是否已存在
if docker ps -a | grep -q "gitea"; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33mGitea-MySQL 已经部署过,跳过部署!\e[0m"
else
color_output "\e[33mGitea-MySQL already deployed, skipping!\e[0m"
fi
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键返回..." || echo "Press Enter to return...")"
continue
fi
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33m正在部署 Gitea 和 MySQL...\e[0m"
else
color_output "\e[33mDeploying Gitea and MySQL...\e[0m"
fi
# 创建目录
mkdir -p /opt/Gitea
mkdir -p /opt/MySQL
# 下载 Docker Compose 文件到 /opt/gitea
curl -L https://git.kejizero.online/zhao/files/raw/branch/main/docker-compose/Gitea -o /opt/Gitea/docker-compose.yml
# 检查是否下载成功
if [ -f "/opt/Gitea/docker-compose.yml" ]; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32mDocker Compose 文件下载成功!\e[0m"
else
color_output "\e[32mDocker Compose file downloaded successfully!\e[0m"
fi
else
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31mDocker Compose 文件下载失败!\e[0m"
else
color_output "\e[31mDocker Compose file download failed!\e[0m"
fi
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键返回..." || echo "Press Enter to return...")"
continue
fi
# 部署 Gitea 和 MySQL
cd /opt/Gitea
docker-compose up -d
if docker ps | grep -q "gitea"; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32mGitea-MySQL 部署成功!\e[0m"
else
color_output "\e[32mGitea-MySQL deployed successfully!\e[0m"
fi
else
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31mGitea-MySQL 部署失败!\e[0m"
else
color_output "\e[31mGitea-MySQL deployment failed!\e[0m"
fi
fi
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键返回..." || echo "Press Enter to return...")"
;;
6)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[部署 sun-panel]\e[0m"
else
color_output "\e[34m[Deploy sun-panel]\e[0m"
fi
# 检查 SunPanel 容器是否已存在
if docker ps -a --filter "name=sun-panel" | grep -q "sun-panel"; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33msun-panel 已经部署过,跳过部署!\e[0m"
else
color_output "\e[33msun-panel already deployed, skipping!\e[0m"
fi
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键返回..." || echo "Press Enter to return...")"
continue
fi
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33m正在部署 SunPanel...\e[0m"
else
color_output "\e[33mDeploying SunPanel...\e[0m"
fi
# 创建目录
mkdir -p /opt/sunpanel
# 下载 Docker Compose 文件到 /opt/sunpanel
curl -v -L https://git.kejizero.online/zhao/files/raw/branch/main/docker-compose/SunPanel -o /opt/sunpanel/docker-compose.yml
# 检查是否下载成功
if [ -f "/opt/sunpanel/docker-compose.yml" ]; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32mDocker Compose 文件下载成功!\e[0m"
else
color_output "\e[32mDocker Compose file downloaded successfully!\e[0m"
fi
else
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31mDocker Compose 文件下载失败!\e[0m"
else
color_output "\e[31mDocker Compose file download failed!\e[0m"
fi
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键返回..." || echo "Press Enter to return...")"
continue
fi
# 部署 SunPanel
cd /opt/sunpanel
docker-compose up -d
if docker ps | grep -q "sun-panel"; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32msun-panel 部署成功!\e[0m"
else
color_output "\e[32msun-panel deployed successfully!\e[0m"
fi
else
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31msun-panel 部署失败!\e[0m"
else
color_output "\e[31msun-panel deployment failed!\e[0m"
fi
docker logs $(docker ps -a -q --filter "name=sun-panel") # 查看失败的容器日志
fi
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键返回..." || echo "Press Enter to return...")"
;;
0)
show_menu
return
;;
*)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31m无效选项请重新选择\e[0m"
else
color_output "\e[31mInvalid option, please try again\e[0m"
fi
sleep 2
;;
esac
done
}
# 7. 加载驱动
Load_driver() {
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[加载所有驱动]\e[0m"
else
color_output "\e[34m[Load all drivers]\e[0m"
fi
opkg update && opkg install aircard-pcmcia-firmware ar3k-firmware ath10k-board-qca4019 ath10k-board-qca9377 ath10k-board-qca9887 ath10k-board-qca9888 ath10k-board-qca988x ath10k-board-qca9984 ath10k-board-qca99x0 ath10k-firmware-qca4019 ath10k-firmware-qca4019-ct ath10k-firmware-qca4019-ct-full-htt ath10k-firmware-qca4019-ct-htt ath10k-firmware-qca6174 ath10k-firmware-qca9377 ath10k-firmware-qca9887 ath10k-firmware-qca9887-ct ath10k-firmware-qca9887-ct-full-htt ath10k-firmware-qca9888 ath10k-firmware-qca9888-ct ath10k-firmware-qca9888-ct-full-htt ath10k-firmware-qca9888-ct-htt ath10k-firmware-qca988x ath10k-firmware-qca988x-ct ath10k-firmware-qca988x-ct-full-htt ath10k-firmware-qca9984 ath10k-firmware-qca9984-ct ath10k-firmware-qca9984-ct-full-htt ath10k-firmware-qca9984-ct-htt ath10k-firmware-qca99x0 ath10k-firmware-qca99x0-ct ath10k-firmware-qca99x0-ct-full-htt ath10k-firmware-qca99x0-ct-htt ath11k-firmware-ipq8074 ath11k-firmware-qca6390 ath11k-firmware-qcn9074 ath11k-firmware-wcn6750 ath11k-firmware-wcn6855 ath12k-firmware-wcn7850 ath6k-firmware ath9k-htc-firmware brcmfmac-firmware-4329-sdio brcmfmac-firmware-4339-sdio brcmfmac-firmware-43430a0-sdio brcmfmac-firmware-43456-sdio brcmfmac-firmware-4356-sdio brcmfmac-firmware-43602a1-pcie brcmfmac-firmware-4366b1-pcie brcmfmac-firmware-4366c0-pcie-k3 brcmfmac-firmware-43752-sdio brcmfmac-firmware-usb brcmfmac-nvram-43430-sdio brcmfmac-nvram-43455-sdio brcmfmac-nvram-43456-sdio brcmfmac-nvram-4356-sdio brcmfmac-nvram-43752-sdio brcmsmac-firmware broadcom-4306-sprom broadcom-43112-sprom broadcom-43131-sprom broadcom-4313-sprom broadcom-4318-sprom broadcom-43217-sprom broadcom-4321-sprom broadcom-43222-sprom broadcom-43224-sprom broadcom-43225-sprom broadcom-43226-sprom broadcom-43227-sprom broadcom-43228-sprom broadcom-4322-sprom broadcom-4331-sprom broadcom-43428-sprom broadcom-4360-sprom broadcom-6362-sprom carl9170-firmware cypress-firmware-43012-sdio cypress-firmware-43340-sdio cypress-firmware-43362-sdio cypress-firmware-4339-sdio cypress-firmware-43430-sdio cypress-firmware-43439-sdio cypress-firmware-43455-sdio cypress-firmware-4354-sdio cypress-firmware-4356-pcie cypress-firmware-4356-sdio cypress-firmware-43570-pcie cypress-firmware-4373-pcie cypress-firmware-4373-sdio cypress-firmware-4373-usb cypress-firmware-54591-pcie cypress-firmware-54591-sdio cypress-firmware-55560-pcie cypress-firmware-55572-pcie cypress-firmware-55572-sdio cypress-nvram-4339-sdio dvb-firmware e100-firmware edgeport-firmware eip197-mini-firmware ibt-firmware iwl3945-firmware iwl4965-firmware iwlwifi-firmware-ax200 iwlwifi-firmware-ax210 iwlwifi-firmware-iwl1000 iwlwifi-firmware-iwl100 iwlwifi-firmware-iwl105 iwlwifi-firmware-iwl135 iwlwifi-firmware-iwl2000 iwlwifi-firmware-iwl2030 iwlwifi-firmware-iwl3160 iwlwifi-firmware-iwl3168 iwlwifi-firmware-iwl5000 iwlwifi-firmware-iwl5150 iwlwifi-firmware-iwl6000g2 iwlwifi-firmware-iwl6000g2a iwlwifi-firmware-iwl6000g2b iwlwifi-firmware-iwl6050 iwlwifi-firmware-iwl7260 iwlwifi-firmware-iwl7265 iwlwifi-firmware-iwl7265d iwlwifi-firmware-iwl8260c iwlwifi-firmware-iwl8265 iwlwifi-firmware-iwl9000 iwlwifi-firmware-iwl9260 kmod-3c59x kmod-6lowpan kmod-ag71xx kmod-alx kmod-ar5523 kmod-at86rf230 kmod-ath10k kmod-ath10k-ct kmod-ath10k-ct-smallbuffers kmod-ath10k-sdio kmod-ath10k-smallbuffers kmod-ath11k kmod-ath11k-pci kmod-ath12k kmod-ath5k kmod-ath6kl kmod-ath6kl-sdio kmod-ath6kl-usb kmod-ath9k-common kmod-atl1 kmod-atl1c kmod-atl1e kmod-atl2 kmod-atm kmod-atusb kmod-b43 kmod-b44 kmod-bcma kmod-be2net kmod-bnxt-en kmod-brcmfmac kmod-brcmsmac kmod-brcmutil kmod-ca8210 kmod-carl9170 kmod-cc2520 kmod-cfg80211 kmod-crypto-michael-mic kmod-dm9000 kmod-dummy kmod-e100 kmod-eeprom-93cx6 kmod-et131x kmod-ethoc kmod-fakelb kmod-fixed-phy kmod-hfcmulti kmod-hfcpci kmod-ieee802154 kmod-ieee802154-6lowpan kmod-ifb kmod-ipvlan kmod-iwlwifi kmod-lan743x kmod-lib-cordic kmod-lib-crc8 kmod-lib-crc-itu-t kmod-mac80211 kmod-mac80211-hwsim kmod-mac802154 kmod-mdio-gpio kmod-mhi-net kmod-mhi-wwan-ctrl kmod-mhi-wwan-mbim kmod-misdn kmod-mrf24j40 kmod-mt7601u kmod-mt7603 kmod-mt7615-common kmod-mt7615e kmod-mt7615-firmware kmod-mt7622-firmware kmod-mt7663-firmware-ap kmod-mt7663-firmware-sta kmod-mt7663s kmod-mt7663u kmod-mt7663-usb-sdio kmod-mt76-core kmod-mt76x0e kmod-mt76x2-common kmod-mt7915e kmod-mt7925e kmod-mt7925-firmware kmod-mt7925u kmod-mt7992-23-firmware kmod-mt7992-firmware kmod-mt7996-233-firmware kmod-mt7996e kmod-mt7996-firmware-common kmod-mtk-t7xx kmod-mwifiex-pcie kmod-mwifiex-sdio kmod-mwl8k kmod-natsemi kmod-ne2k-pci kmod-niu kmod-owl-loader kmod-phy-airoha-en8811h kmod-phy-aquantia kmod-phy-at803x kmod-phy-bcm84881 kmod-phy-broadcom kmod-phylib-broadcom kmod-phy-marvell-10g kmod-phy-microchip kmod-phy-realtek kmod-phy-smsc kmod-qlcnic kmod-r6040 kmod-regmap-spi kmod-rmnet kmod-rsi91x kmod-rsi91x-sdio kmod-rsi91x-usb kmod-rt2800-lib kmod-rt2800-mmio kmod-rt2800-pci kmod-rt2800-usb kmod-rt2x00-lib kmod-rt2x00-mmio kmod-rt2x00-pci kmod-rt2x00-usb kmod-rt61-pci kmod-rt73-usb kmod-rtl8192c-common kmod-rtl8192ce kmod-rtl8192cu kmod-rtl8192de kmod-rtl8192se kmod-rtl8723bs kmod-rtl8812au-ct kmod-rtl8821ae kmod-rtl8xxxu kmod-rtlwifi kmod-rtlwifi-btcoexist kmod-rtlwifi-pci kmod-rtlwifi-usb kmod-rtw88 kmod-rtw88-8723de kmod-rtw88-8723ds kmod-rtw88-8723du kmod-rtw88-8812au kmod-rtw88-8821au kmod-rtw88-8821ce kmod-rtw88-8821cu kmod-rtw88-8822be kmod-rtw88-8822bu kmod-rtw88-8822ce kmod-rtw88-8822cu kmod-rtw89-8851be kmod-rtw89-8852ae kmod-rtw89-8852be kmod-rtw89-8852ce kmod-rtw89-8922ae kmod-sfc kmod-sfc-falcon kmod-sfp kmod-siit kmod-sis190 kmod-sis900 kmod-skge kmod-sky2 kmod-solos-pci kmod-spi-ks8995 kmod-ssb kmod-swconfig kmod-switch-ip17xx kmod-switch-rtl8306 kmod-thermal kmod-usb-atm kmod-usb-atm-cxacru kmod-usb-atm-speedtouch kmod-usb-atm-ueagle kmod-usb-cm109 kmod-usb-hid-cp2112 kmod-usb-net-dm9601-ether kmod-usb-net-mcs7830 kmod-usb-net-smsc95xx kmod-usb-net-sr9700 kmod-via-rhine kmod-wil6210 kmod-wl12xx kmod-wl18xx kmod-wlcore libertas-sdio-firmware libertas-spi-firmware libertas-usb-firmware midisport-firmware mt7601u-firmware mt7622bt-firmware mt7921bt-firmware mt7922bt-firmware mt7981-wo-firmware mt7986-wo-firmware mwifiex-pcie-firmware mwifiex-sdio-firmware mwl8k-firmware p54-pci-firmware p54-spi-firmware p54-usb-firmware r8152-firmware r8169-firmware radeon-firmware rs9113-firmware rt2800-pci-firmware rt2800-usb-firmware rt61-pci-firmware rt73-usb-firmware rtl8188eu-firmware rtl8192ce-firmware rtl8192cu-firmware rtl8192de-firmware rtl8192eu-firmware rtl8192se-firmware rtl8723au-firmware rtl8723bu-firmware rtl8761a-firmware rtl8761b-firmware rtl8761bu-firmware rtl8821ae-firmware rtl8821ce-firmware rtl8822be-firmware rtl8822ce-firmware ti-3410-firmware ti-5052-firmware wil6210-firmware wl12xx-firmware wl18xx-firmware wpad-openssl --force-depends
clear
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键返回主菜单..." || echo "Press Enter to return to main menu...")"
show_menu
}
# 8. IPv6 开关
configure_ipv6() {
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[IPv6 设置]\e[0m"
else
color_output "\e[34m[IPv6 Settings]\e[0m"
fi
# 检查是否为 PPPoE 模式
local wan_proto=$(uci -q get network.wan.proto)
if [ "$wan_proto" != "pppoe" ]; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31m错误: 无法开启 IPv6\e[0m"
color_output "\e[31m当前上网方式为: $wan_proto\e[0m"
color_output "\e[31m请先切换为 PPPoE 模式\e[0m"
else
color_output "\e[31mError: Cannot enable IPv6\e[0m"
color_output "\e[31mCurrent connection type: $wan_proto\e[0m"
color_output "\e[31mPlease switch to PPPoE mode first\e[0m"
fi
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键返回菜单..." || echo "Press Enter to return to menu...")"
show_menu
return
fi
# 检查当前状态
local current_ra=$(uci -q get dhcp.lan.ra)
local current_dhcpv6=$(uci -q get dhcp.lan.dhcpv6)
local current_ndp=$(uci -q get dhcp.lan.ndp)
local current_filter_aaaa=$(uci -q get dhcp.@dnsmasq[0].filter_aaaa)
if [ "$current_ra" = "server" ] && [ "$current_dhcpv6" = "server" ]; then
status_text=$([[ "$LANG_CHOICE" == "zh" ]] && echo "已开启" || echo "Enabled")
else
status_text=$([[ "$LANG_CHOICE" == "zh" ]] && echo "已关闭" || echo "Disabled")
fi
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[36m当前 IPv6 状态: $status_text\e[0m"
color_output "\e[36m请选择操作\e[0m"
color_output "1. 开启 IPv6"
color_output "2. 关闭 IPv6"
color_output "0. 返回主菜单"
else
color_output "\e[36mCurrent IPv6 Status: $status_text\e[0m"
color_output "\e[36mSelect operation:\e[0m"
color_output "1. Enable IPv6"
color_output "2. Disable IPv6"
color_output "0. Back to Main Menu"
fi
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "请输入选择 [0-2]: " || echo "Enter your choice [0-2]: ")" ipv6_choice
case "$ipv6_choice" in
1)
# 开启 IPv6
# RA 服务设置为服务模式
uci set dhcp.lan.ra='server'
# DHCPv6 服务设置为服务模式
uci set dhcp.lan.dhcpv6='server'
# IPv6 分配长度设置为64
uci set dhcp.lan.ndp='64'
# 取消过滤 IPv6 AAAA 记录
uci set dhcp.@dnsmasq[0].filter_aaaa='0'
# 保存设置
uci commit dhcp
# 重启相关服务(重定向输出)
/etc/init.d/odhcpd restart >/dev/null 2>&1
/etc/init.d/dnsmasq restart >/dev/null 2>&1
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32mIPv6 已开启!\e[0m"
color_output "\e[32m- RA 服务: 服务模式\e[0m"
color_output "\e[32m- DHCPv6 服务: 服务模式\e[0m"
color_output "\e[32m- IPv6 分配长度: 64\e[0m"
color_output "\e[32m- IPv6 AAAA 记录过滤: 已关闭\e[0m"
else
color_output "\e[32mIPv6 enabled!\e[0m"
color_output "\e[32m- RA Service: server\e[0m"
color_output "\e[32m- DHCPv6 Service: server\e[0m"
color_output "\e[32m- IPv6 Prefix Length: 64\e[0m"
color_output "\e[32m- IPv6 AAAA Filtering: disabled\e[0m"
fi
;;
2)
# 关闭 IPv6
# RA 服务设置为已禁用
uci set dhcp.lan.ra='disabled'
# DHCPv6 服务设置为已禁用
uci set dhcp.lan.dhcpv6='disabled'
# IPv6 分配长度设置为已禁用
uci set dhcp.lan.ndp='disabled'
# 开启过滤 IPv6 AAAA 记录
uci set dhcp.@dnsmasq[0].filter_aaaa='1'
# 保存设置
uci commit dhcp
# 重启相关服务(重定向输出)
/etc/init.d/odhcpd restart >/dev/null 2>&1
/etc/init.d/dnsmasq restart >/dev/null 2>&1
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32mIPv6 已关闭!\e[0m"
color_output "\e[32m- RA 服务: 已禁用\e[0m"
color_output "\e[32m- DHCPv6 服务: 已禁用\e[0m"
color_output "\e[32m- IPv6 分配长度: 已禁用\e[0m"
color_output "\e[32m- IPv6 AAAA 记录过滤: 已开启\e[0m"
else
color_output "\e[32mIPv6 disabled!\e[0m"
color_output "\e[32m- RA Service: disabled\e[0m"
color_output "\e[32m- DHCPv6 Service: disabled\e[0m"
color_output "\e[32m- IPv6 Prefix Length: disabled\e[0m"
color_output "\e[32m- IPv6 AAAA Filtering: enabled\e[0m"
fi
;;
0)
show_menu
return
;;
*)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31m无效选择\e[0m"
else
color_output "\e[31mInvalid choice\e[0m"
fi
;;
esac
sleep 2
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键返回菜单..." || echo "Press Enter to return to menu...")"
show_menu
}
# 9. iStoreOS 风格化
istore_style() {
clear
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[开始安装 iStoreOS 风格化]\e[0m"
else
color_output "\e[34m[Installing iStoreOS Styling]\e[0m"
fi
# 安装 iStore 商店
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[1/2] 正在安装 iStore 商店...\e[0m"
else
color_output "\e[34m[1/2] Installing iStore App Store...\e[0m"
fi
wget -qO install.sh https://git.kejizero.online/zhao/files/raw/branch/main/%20Script/iStoreOS/install.sh && chmod +x install.sh && ./install.sh
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32miStore 商店安装完成\e[0m"
else
color_output "\e[32miStore App Store installed\e[0m"
fi
# 安装网络向导和首页
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[2/2] 正在安装网络向导和首页...\e[0m"
else
color_output "\e[34m[2/2] Installing QuickStart and Homepage...\e[0m"
fi
is-opkg install luci-i18n-quickstart-zh-cn
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32m网络向导和首页安装完成\e[0m"
color_output "\e[32m所有组件安装完成\e[0m"
else
color_output "\e[32mQuickStart and Homepage installed\e[0m"
color_output "\e[32mAll components installed successfully!\e[0m"
fi
# 风格化
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[2/2] 正在风格化...\e[0m"
else
color_output "\e[34m[2/2] Stylizing...\e[0m"
fi
curl -o /www/luci-static/argon/iconfont.ttf https://script.kejizero.online/Customize/argon/iconfont.ttf
curl -o /www/luci-static/argon/iconfont.woff https://script.kejizero.online/Customize/argon/iconfont.woff
curl -o /www/luci-static/argon/iconfont.woff2 https://script.kejizero.online/Customize/argon/iconfont.woff2
chmod -R 777 /www/luci-static/argon/iconfont.ttf
chmod -R 777 /www/luci-static/argon/iconfont.woff
chmod -R 777 /www/luci-static/argon/iconfont.woff2
curl -s https://script.kejizero.online/Customize/argon/easeicon.css >> /www/luci-static/argon/css/cascade.css
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键返回主菜单..." || echo "Press Enter to return to main menu...")"
show_menu
}
# 10. 检测更新
check_update() {
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[34m[检测更新]\e[0m"
color_output "正在检查更新..."
else
color_output "\e[34m[Check for Updates]\e[0m"
color_output "Checking for updates..."
fi
# 检查 wget 是否安装
if ! command -v wget >/dev/null 2>&1; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33m正在安装 wget...\e[0m"
else
color_output "\e[33mInstalling wget...\e[0m"
fi
opkg update && opkg install wget
fi
# 创建临时目录
local temp_dir="/tmp/zerowrt_update"
mkdir -p "$temp_dir"
# 下载远程版本文件
if ! wget -q "https://git.kejizero.online/zhao/files/raw/branch/main/bin/version.txt" -O "$temp_dir/version.txt"; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31m无法连接到更新服务器。\e[0m"
else
color_output "\e[31mFailed to connect to update server.\e[0m"
fi
rm -rf "$temp_dir"
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键返回菜单..." || echo "Press Enter to return to menu...")"
show_menu
return
fi
# 获取本地版本和远程版本
local_version=$(cat /root/version.txt 2>/dev/null || echo "0")
remote_version=$(cat "$temp_dir/version.txt" 2>/dev/null || echo "0")
# 比较版本
if [ "$local_version" != "$remote_version" ]; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33m发现新版本$remote_version\e[0m"
color_output "\e[33m当前版本$local_version\e[0m"
read -p "是否更新到最新版本?(y/n): " confirm
else
color_output "\e[33mNew version available: $remote_version\e[0m"
color_output "\e[33mCurrent version: $local_version\e[0m"
read -p "Update to the latest version? (y/n): " confirm
fi
if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "开始下载更新..."
else
color_output "Downloading update..."
fi
# 下载新版本到临时文件
if wget -q "https://git.kejizero.online/zhao/files/raw/branch/main/bin/ZeroWrt" -O "$temp_dir/ZeroWrt.new"; then
# 检查文件是否为有效的 shell 脚本
if head -n1 "$temp_dir/ZeroWrt.new" | grep -q "^#!/bin/bash"; then
# 备份当前版本
cp /bin/ZeroWrt /bin/ZeroWrt.bak 2>/dev/null
# 安装新版本
mv "$temp_dir/ZeroWrt.new" /bin/ZeroWrt
chmod +x /bin/ZeroWrt
# 更新版本文件
echo "$remote_version" > /root/version.txt
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32m更新成功\e[0m"
color_output "\e[32m已备份原版本为 /bin/ZeroWrt.bak\e[0m"
color_output "\e[32m请重新运行脚本以应用更新。\e[0m"
else
color_output "\e[32mUpdate successful!\e[0m"
color_output "\e[32mOriginal version backed up as /bin/ZeroWrt.bak\e[0m"
color_output "\e[32mPlease rerun the script to apply updates.\e[0m"
fi
# 清理并退出
rm -rf "$temp_dir"
exit 0
else
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31m下载的文件格式不正确。\e[0m"
else
color_output "\e[31mDownloaded file is not a valid script.\e[0m"
fi
fi
else
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31m更新下载失败。\e[0m"
else
color_output "\e[31mUpdate download failed.\e[0m"
fi
fi
else
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32m已取消更新。\e[0m"
else
color_output "\e[32mUpdate cancelled.\e[0m"
fi
fi
else
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32m当前已是最新版本$local_version\e[0m"
else
color_output "\e[32mAlready up to date: $local_version\e[0m"
fi
fi
# 清理临时文件
rm -rf "$temp_dir"
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键返回菜单..." || echo "Press Enter to return to menu...")"
show_menu
}
# 主程序
select_language
show_agreement
print_header
show_menu