258 lines
10 KiB
Bash
258 lines
10 KiB
Bash
#!/bin/bash
|
||
|
||
# 彩色输出函数
|
||
color_output() {
|
||
echo -e "$1"
|
||
}
|
||
|
||
# 打印脚本头部,增加美观
|
||
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))
|
||
|
||
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说明:本工具用于配置 OpenWrt-24.10\e[0m"
|
||
color_output "\e[32m博客:https://www.kejizero.online\e[0m"
|
||
color_output "----------------------------------------"
|
||
echo ""
|
||
}
|
||
|
||
# 显示菜单
|
||
show_menu() {
|
||
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. 安装 ShellClash \e[36m┃\e[0m"
|
||
color_output "\e[36m┃\e[0m 7. 检测更新 \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-7]: \e[0m")" choice
|
||
case "$choice" in
|
||
1) change_ip ;;
|
||
2) change_password ;;
|
||
3) change_theme ;;
|
||
4) reset_config ;;
|
||
5) change_source ;;
|
||
6) install_shellclash ;;
|
||
7) check_update ;;
|
||
0) exit 0 ;;
|
||
*) echo "无效选项,请重新输入"; show_menu ;;
|
||
esac
|
||
}
|
||
|
||
# 1. 更换 LAN 口 IP 地址
|
||
change_ip() {
|
||
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
|
||
/etc/init.d/network restart
|
||
color_output "\e[32mLAN 口 IP 已成功更改为 $new_ip\e[0m"
|
||
else
|
||
color_output "\e[31m无效的 IP 地址,操作取消。\e[0m"
|
||
fi
|
||
read -p "按 Enter 键返回菜单..."
|
||
show_menu
|
||
}
|
||
|
||
# 2. 更改管理员密码
|
||
change_password() {
|
||
color_output "\e[34m[更改管理员密码]\e[0m"
|
||
read -p "请输入新的管理员密码: " new_password
|
||
if [[ -n "$new_password" ]]; then
|
||
echo -e "$new_password\n$new_password" | passwd root
|
||
color_output "\e[32m管理员密码已成功更改。\e[0m"
|
||
else
|
||
color_output "\e[31m无效的密码,操作取消。\e[0m"
|
||
fi
|
||
read -p "按 Enter 键返回菜单..."
|
||
show_menu
|
||
}
|
||
|
||
# 3. 切换默认主题
|
||
change_theme() {
|
||
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 键返回菜单..."
|
||
show_menu
|
||
}
|
||
|
||
# 4. 一键重置配置
|
||
reset_config() {
|
||
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
|
||
}
|
||
|
||
# 5. 一键换源
|
||
change_source() {
|
||
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 "0. 返回"
|
||
read -p "请输入您的选择 [0-4]: " source_choice
|
||
|
||
case "$source_choice" in
|
||
1) base_url="https://mirrors.aliyun.com/openwrt/releases/24.10.0-rc4/packages/x86_64" ;;
|
||
2) base_url="https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/24.10.0-rc4/packages/x86_64" ;;
|
||
3) base_url="https://mirrors.ustc.edu.cn/openwrt/releases/24.10.0-rc4/packages/x86_64" ;;
|
||
4) base_url="https://downloads.openwrt.org/releases/24.10.0-rc4/packages/x86_64" ;;
|
||
0) show_menu ; return ;;
|
||
*) color_output "\e[31m无效选项,返回菜单。\e[0m" ; show_menu ; return ;;
|
||
esac
|
||
|
||
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
|
||
EOF
|
||
|
||
color_output "\e[32m软件源已成功切换。\e[0m"
|
||
read -p "按 Enter 键返回菜单..."
|
||
show_menu
|
||
}
|
||
|
||
# 6. 安装 ShellClash
|
||
install_shellclash() {
|
||
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
|
||
|
||
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) show_menu ; return ;;
|
||
*) color_output "\e[31m无效选项,返回菜单。\e[0m" ; show_menu ; return ;;
|
||
esac
|
||
|
||
sh -c "$(curl -kfsSl $url/install.sh)" && source /etc/profile &> /dev/null
|
||
color_output "\e[32mShellClash 已成功安装。\e[0m"
|
||
read -p "按 Enter 键返回菜单..."
|
||
show_menu
|
||
}
|
||
|
||
# 7. 检测更新
|
||
check_update() {
|
||
color_output "\e[34m[检测更新]\e[0m"
|
||
color_output "正在检查更新..."
|
||
|
||
# 检查 wget 是否安装
|
||
if ! command -v wget >/dev/null 2>&1; then
|
||
color_output "\e[33m正在安装 wget...\e[0m"
|
||
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
|
||
color_output "\e[31m无法连接到更新服务器。\e[0m"
|
||
rm -rf "$temp_dir"
|
||
read -p "按 Enter 键返回菜单..."
|
||
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
|
||
color_output "\e[33m发现新版本:$remote_version\e[0m"
|
||
color_output "\e[33m当前版本:$local_version\e[0m"
|
||
read -p "是否更新到最新版本?(y/n): " confirm
|
||
if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then
|
||
color_output "开始下载更新..."
|
||
|
||
# 下载新版本到临时文件
|
||
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
|
||
|
||
color_output "\e[32m更新成功!\e[0m"
|
||
color_output "\e[32m已备份原版本为 /bin/ZeroWrt.bak\e[0m"
|
||
color_output "\e[32m请重新运行脚本以应用更新。\e[0m"
|
||
|
||
# 清理并退出
|
||
rm -rf "$temp_dir"
|
||
exit 0
|
||
else
|
||
color_output "\e[31m下载的文件格式不正确。\e[0m"
|
||
fi
|
||
else
|
||
color_output "\e[31m更新下载失败。\e[0m"
|
||
fi
|
||
else
|
||
color_output "\e[32m已取消更新。\e[0m"
|
||
fi
|
||
else
|
||
color_output "\e[32m当前已是最新版本:$local_version\e[0m"
|
||
fi
|
||
|
||
# 清理临时文件
|
||
rm -rf "$temp_dir"
|
||
read -p "按 Enter 键返回菜单..."
|
||
show_menu
|
||
}
|
||
|
||
# 启动菜单
|
||
print_header
|
||
show_menu |