files/bin/ZeroWrt
zhao 866cb1ddfe 更新 bin/ZeroWrt
Signed-off-by: zhao <zj18139624826@gmail.com>
2025-05-31 09:48:35 +08:00

1554 lines
74 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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请选择语言 [0-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 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://opkg.cooluc.com/openwrt-24.10/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://opkg.cooluc.com/openwrt-24.10/aarch64_generic"
;;
*)
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
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-PostgreSQL \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. Gitea-PostgreSQL \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-PostgreSQL]\e[0m"
else
color_output "\e[34m[Deploy Gitea-PostgreSQL]\e[0m"
fi
# 检查 Gitea 容器是否已存在
if docker ps -a | grep -q "gitea"; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33mGitea-PostgreSQL 已经部署过,跳过部署!\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 和 PostgreSQL...\e[0m"
else
color_output "\e[33mDeploying Gitea and PostgreSQL...\e[0m"
fi
# 创建目录
mkdir -p /opt/Gitea
# 下载 Docker Compose 文件到 /opt/gitea
curl -L https://git.kejizero.online/zhao/docker-compose/raw/branch/main/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 和 PostgreSQL
cd /opt/Gitea
docker-compose up -d
if docker ps | grep -q "gitea"; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32mGitea-PostgreSQL 部署成功!\e[0m"
else
color_output "\e[32mGitea-PostgreSQL deployed successfully!\e[0m"
fi
else
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31mGitea-PostgreSQL 部署失败!\e[0m"
else
color_output "\e[31mGitea-PostgreSQL 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/docker-compose/raw/branch/main/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. 加载驱动
# 7. 一键加载所有驱动
Load_driver() {
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. 高通/Atheros (无线 Wi-Fi 芯片)              \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m  2. 博通/Cypress (无线 Wi-Fi 芯片)              \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m  3. 英特尔 (无线 Wi-Fi 芯片)                    \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m  4. 联发科 (无线 Wi-Fi 芯片)                    \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m  5. 瑞昱 (无线/有线网卡芯片)                    \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m  6. USB/文件系统及其他通用驱动                  \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")" driver_category_choice
else
color_output "\e[34m[One-click Driver Loading]\e[0m"
color_output "\e[36m┏━━━━━━━━━━━━━━━ DRIVER CATEGORIES (BY BRAND) ━━━━━━━━━━━┓\e[0m"
color_output "\e[36m┃                                                        ┃\e[0m"
color_output "\e[36m┃\e[0m  1. Qualcomm/Atheros (Wireless Wi-Fi Chips)            \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m  2. Broadcom/Cypress (Wireless Wi-Fi Chips)            \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m  3. Intel (Wireless Wi-Fi Chips)                       \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m  4. MediaTek (Wireless Wi-Fi Chips)                    \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m  5. Realtek (Wireless/Wired NIC Chips)                 \e[36m┃\e[0m"
color_output "\e[36m┃\e[0m  6. USB/File Systems & Other General Drivers           \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[33mSelect driver category to install [0-6]: \e[0m")" driver_category_choice
fi
local drivers_to_install=()
case "$driver_category_choice" in
1) # 高通/Atheros (无线 Wi-Fi 芯片)
drivers_to_install=(
ath10k-firmware-qca4019
ath10k-firmware-qca6174
ath10k-firmware-qca9377
ath10k-firmware-qca9887
ath10k-firmware-qca9888
ath10k-firmware-qca988x
ath10k-firmware-qca9984
ath10k-firmware-qca99x0
ath11k-firmware-ipq8074
ath11k-firmware-qca6390
ath11k-firmware-qcn9074
ath11k-firmware-wcn6750
ath11k-firmware-wcn6855
ath12k-firmware-wcn7850
ath6k-firmware
ath9k-htc-firmware
kmod-ath10k
kmod-ath11k
kmod-ath11k-pci
kmod-ath12k
kmod-ath5k
kmod-ath6kl
kmod-ath6kl-sdio
kmod-ath6kl-usb
kmod-ath9k-common
kmod-alx
kmod-atl1
kmod-atl1c
kmod-atl1e
kmod-atl2
)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33m提示此类别包含高通和Atheros无线芯片组的驱动和固件。请根据您的设备芯片型号选择。\e[0m"
else
color_output "\e[33mNote: This category includes drivers and firmware for Qualcomm and Atheros wireless chipsets. Please choose based on your device's chip model.\e[0m"
fi
;;
2) # 博通/Cypress (无线 Wi-Fi 芯片)
drivers_to_install=(
brcmfmac-firmware-43430a0-sdio
brcmfmac-firmware-43455-sdio
brcmfmac-firmware-43602a1-pcie
brcmfmac-firmware-4366b1-pcie
brcmfmac-firmware-4366c0-pcie
brcmfmac-firmware-usb
brcmfmac-nvram-43430-sdio
brcmfmac-nvram-43455-sdio
brcmsmac-firmware
cypress-firmware-43430-sdio
cypress-firmware-43455-sdio
cypress-firmware-4354-sdio
cypress-firmware-4356-pcie
cypress-firmware-4356-sdio
cypress-firmware-4373-pcie
cypress-firmware-4373-sdio
kmod-b43
kmod-b44
kmod-bcma
kmod-brcmfmac
kmod-brcmutil
kmod-be2net
kmod-ssb
kmod-tg3
)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33m提示此类别包含博通和Cypress无线芯片组的驱动和固件。请根据您的设备芯片型号选择。\e[0m"
else
color_output "\e[33mNote: This category includes drivers and firmware for Broadcom and Cypress wireless chipsets. Please choose based on your device's chip model.\e[0m"
fi
;;
3) # 英特尔 (无线 Wi-Fi 芯片)
drivers_to_install=(
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-iwl8260c
iwlwifi-firmware-iwl8265
iwlwifi-firmware-iwl9000
iwlwifi-firmware-iwl9260
kmod-iwlwifi
kmod-e1000e
)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33m提示此类别包含英特尔无线芯片组的驱动和固件。请根据您的设备芯片型号选择。\e[0m"
else
color_output "\e[33mNote: This category includes drivers and firmware for Intel wireless chipsets. Please choose based on your device's chip model.\e[0m"
fi
;;
4) # 联发科 (无线 Wi-Fi 芯片)
drivers_to_install=(
mt7601u-firmware
mt7622bt-firmware
mt7921bt-firmware
mt7922bt-firmware
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-mt76-core
kmod-mt76x0e
kmod-mt76x2-common
kmod-mt7915e
kmod-mt7925e
kmod-mt7925-firmware
kmod-rt2800-lib
kmod-rt2800-pci
kmod-rt2800-usb
kmod-rt2x00-lib
kmod-rt2x00-pci
kmod-rt2x00-usb
)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33m提示此类别包含联发科无线芯片组的驱动和固件。Ralink旧型号也在此处。\e[0m"
else
color_output "\e[33mNote: This category includes drivers and firmware for MediaTek wireless chipsets. Older Ralink models are also here.\e[0m"
fi
;;
5) # 瑞昱 (无线/有线网卡芯片)
drivers_to_install=(
r8152-firmware
r8169-firmware
rtl8188eu-firmware
rtl8192ce-firmware
rtl8192cu-firmware
rtl8192eu-firmware
rtl8192se-firmware
rtl8723au-firmware
rtl8723bu-firmware
rtl8821ae-firmware
rtl8821ce-firmware
rtl8822be-firmware
rtl8822ce-firmware
kmod-r8169
kmod-rtl8192c-common
kmod-rtl8192ce
kmod-rtl8192cu
kmod-rtl8192de
kmod-rtl8192se
kmod-rtl8723bs
kmod-rtl8821ae
kmod-rtl8xxxu
kmod-rtlwifi
kmod-rtlwifi-pci
kmod-rtlwifi-usb
kmod-rtw88
kmod-rtw88-8723de
kmod-rtw88-8821ce
kmod-rtw88-8822be
kmod-rtw88-8822ce
kmod-phy-realtek
)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33m提示此类别包含瑞昱无线和有线网卡芯片的驱动和固件。\e[0m"
else
color_output "\e[33mNote: This category includes drivers and firmware for Realtek wireless and wired network card chipsets.\e[0m"
fi
;;
6) # USB/文件系统及其他通用驱动 (非特定品牌)
drivers_to_install=(
kmod-usb-core
kmod-usb-ohci
kmod-usb-uhci
kmod-usb2
kmod-usb3
kmod-usb-net
kmod-usb-net-cdc-ether
kmod-usb-storage
kmod-fs-ext4
kmod-fs-ntfs
kmod-fs-vfat
kmod-fs-exfat
kmod-fs-cifs
kmod-mac80211
kmod-phy-broadcom
kmod-phylib-broadcom
kmod-phy-marvell-10g
kmod-phy-microchip
kmod-phy-smsc
kmod-sfp
kmod-swconfig
kmod-thermal
kmod-mdio-gpio
kmod-mii
kmod-phy-airoha-en8811h
kmod-phy-aquantia
kmod-phy-at803x
)
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33m提示此类别包含USB、文件系统以及其他不属于特定网络芯片品牌的通用驱动和固件。\e[0m"
else
color_output "\e[33mNote: This category includes USB, file system, and other general drivers/firmware not tied to specific network chip brands.\e[0m"
fi
;;
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
continue
;;
esac
if [ ${#drivers_to_install[@]} -eq 0 ]; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31m未选择任何驱动进行安装。\e[0m"
else
color_output "\e[31mNo drivers selected for installation.\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即将安装以下驱动\e[0m"
for d in "${drivers_to_install[@]}"; do
color_output " - $d"
done
read -p "确定要开始安装吗?(y/n): " confirm_install
else
color_output "\e[33mAbout to install the following drivers:\e[0m"
for d in "${drivers_to_install[@]}"; do
color_output " - $d"
done
read -p "Are you sure you want to start installation? (y/n): " confirm_install
fi
if [[ "$confirm_install" == "y" || "$confirm_install" == "Y" ]]; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33m正在更新软件包列表并安装驱动...\e[0m"
else
color_output "\e[33mUpdating package list and installing drivers...\e[0m"
fi
opkg update
local all_success=true
for driver in "${drivers_to_install[@]}"; do
if opkg install "$driver"; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32m驱动 $driver 已成功安装。\e[0m"
else
color_output "\e[32mDriver $driver installed successfully.\e[0m"
fi
else
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31m驱动 $driver 安装失败或已存在。请检查驱动名称和您的ZeroWrt版本。\e[0m"
else
color_output "\e[31mDriver $driver installation failed or already exists. Please check the driver name and your ZeroWrt version.\e[0m"
fi
all_success=false
fi
done
if $all_success; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32m所选驱动已全部安装完成。\e[0m"
else
color_output "\e[32mAll selected drivers installed successfully.\e[0m"
fi
else
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[31m部分驱动安装失败请查看上方日志。\e[0m"
else
color_output "\e[31mSome drivers failed to install, please check the log above.\e[0m"
fi
fi
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33m部分驱动可能需要重启后才能完全生效。\e[0m"
read -p "是否立即重启?(y/n): " reboot_confirm
else
color_output "\e[33mSome drivers may require a reboot to take full effect.\e[0m"
read -p "Reboot now? (y/n): " reboot_confirm
fi
if [[ "$reboot_confirm" == "y" || "$reboot_confirm" == "Y" ]]; then
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[33m设备将在 5 秒钟后重启...\e[0m"
else
color_output "\e[33mDevice will reboot in 5 seconds...\e[0m"
fi
sleep 5
reboot
fi
else
if [[ "$LANG_CHOICE" == "zh" ]]; then
color_output "\e[32m驱动安装操作已取消。\e[0m"
else
color_output "\e[32mDriver installation operation cancelled.\e[0m"
fi
fi
read -p "$([[ "$LANG_CHOICE" == "zh" ]] && echo "按 Enter 键返回菜单..." || echo "Press Enter to return to menu...")"
show_menu
done
}
# 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/3] 正在安装 iStore 商店...\e[0m"
else
color_output "\e[34m[1/3] Installing iStore App Store...\e[0m"
fi
wget -qO install.sh https://git.kejizero.online/zhao/iStoreOS/raw/branch/main/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/3] 正在安装网络向导和首页...\e[0m"
else
color_output "\e[34m[2/3] 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[3/3] 正在风格化...\e[0m"
else
color_output "\e[34m[3/3] 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
sed -i 's|https://www.istoreos.com/|https://www.kejizero.online/|' /www/luci-static/quickstart/index.js
sed -i 's/iStoreOS/探索无限/' /www/luci-static/quickstart/index.js
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