#!/bin/sh # GL-iNet 路由器工具箱公共函数库 # by @wukongdaily # ============================================================================ # 颜色输出函数 # ============================================================================ red() { echo -e "\033[31m\033[01m$1\033[0m"; } green() { echo -e "\033[32m\033[01m$1\033[0m"; } yellow() { echo -e "\033[33m\033[01m$1\033[0m"; } blue() { echo -e "\033[34m\033[01m$1\033[0m"; } light_magenta() { echo -e "\033[95m\033[01m$1\033[0m"; } light_yellow() { echo -e "\033[93m\033[01m$1\033[0m"; } cyan() { echo -e "\033[38;2;0;255;255m$1\033[0m"; } # ============================================================================ # 全局变量 # ============================================================================ HTTP_HOST="https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main" third_party_source="https://istore.linkease.com/repo/all/nas_luci" # ============================================================================ # 路由器信息获取 # ============================================================================ get_router_name() { model_info=$(cat /tmp/sysinfo/model) echo "$model_info" } get_router_hostname() { hostname=$(uci get system.@system[0].hostname) echo "$hostname 路由器" } # ============================================================================ # 系统判断 # ============================================================================ is_iStoreOS() { DISTRIB_ID=$(cat /etc/openwrt_release | grep "DISTRIB_ID" | cut -d "'" -f 2) if [ "$DISTRIB_ID" = "iStoreOS" ]; then return 0 else return 1 fi } # ============================================================================ # OPKG 签名管理 # ============================================================================ remove_check_signature_option() { local opkg_conf="/etc/opkg.conf" sed -i '/option check_signature/d' "$opkg_conf" } add_check_signature_option() { local opkg_conf="/etc/opkg.conf" echo "option check_signature 1" >>"$opkg_conf" } # ============================================================================ # 软件源设置 # ============================================================================ setup_software_source() { if [ "$1" -eq 0 ]; then echo "# add your custom package feeds here" >/etc/opkg/customfeeds.conf if is_iStoreOS; then add_check_signature_option fi opkg update elif [ "$1" -eq 1 ]; then remove_check_signature_option echo "# add your custom package feeds here" >/etc/opkg/customfeeds.conf echo "src/gz third_party_source $third_party_source" >>/etc/opkg/customfeeds.conf opkg update else echo "Invalid option. Please provide 0 or 1." fi } # ============================================================================ # DHCP 域名映射 (解决安卓原生TV首次连不上wifi的问题) # ============================================================================ add_dhcp_domain() { local domain_name="time.android.com" local domain_ip="203.107.6.88" existing_records=$(uci show dhcp | grep "dhcp.@domain\[[0-9]\+\].name='$domain_name'") if [ -z "$existing_records" ]; then uci add dhcp domain uci set "dhcp.@domain[-1].name=$domain_name" uci set "dhcp.@domain[-1].ip=$domain_ip" uci commit dhcp fi } # ============================================================================ # 作者信息添加 # ============================================================================ add_author_info() { uci set system.@system[0].description='wukongdaily' uci set system.@system[0].notes='文档说明: https://tvhelper.cpolar.cn/' uci commit system } # ============================================================================ # 基础初始化 # ============================================================================ setup_base_init() { add_author_info add_dhcp_domain uci set system.@system[0].zonename='Asia/Shanghai' uci set system.@system[0].timezone='CST-8' uci commit system /etc/init.d/system reload } show_completion_message() { green "安装完毕!请使用8080端口访问luci界面:http://192.168.8.1:8080" green "作者更多动态务必收藏:https://tvhelper.cpolar.cn/" } # ============================================================================ # 隐藏首页无用元素 # ============================================================================ hide_ui_elements() { TARGET="/www/luci-static/quickstart/style.css" MARKER="/* hide custom luci elements */" if ! grep -q "$MARKER" "$TARGET"; then cat <>"$TARGET" $MARKER /* 隐藏首页格式化按钮 */ .value-data button { display: none !important; } /* 隐藏网络页的第 3 个 item */ #main > div > div.network-container.align-c > div > div > div:nth-child(3) { display: none !important; } /* 隐藏网络页的第 5 个 item */ #main > div > div.network-container.align-c > div > div > div:nth-child(5) { display: none !important; } /* 隐藏 feature-card.pink */ #main > div > div.card-container > div.feature-card.pink { display: none !important; } EOF echo "✅ 自定义元素已隐藏" else echo "⚠️ 无需重复操作" fi } # ============================================================================ # 文件传输插件安装 # ============================================================================ do_install_filetransfer() { mkdir -p /tmp/luci-app-filetransfer/ cd /tmp/luci-app-filetransfer/ wget --user-agent="Mozilla/5.0" -O luci-app-filetransfer_all.ipk "$HTTP_HOST/luci-app-filetransfer/luci-app-filetransfer_all.ipk" wget --user-agent="Mozilla/5.0" -O luci-lib-fs_1.0-14_all.ipk "$HTTP_HOST/luci-app-filetransfer/luci-lib-fs_1.0-14_all.ipk" opkg install *.ipk --force-depends } # ============================================================================ # Argon 主题依赖安装 # ============================================================================ do_install_depends_ipk() { wget --user-agent="Mozilla/5.0" -O "/tmp/luci-lua-runtime_all.ipk" "$HTTP_HOST/theme/luci-lua-runtime_all.ipk" wget --user-agent="Mozilla/5.0" -O "/tmp/libopenssl3.ipk" "$HTTP_HOST/theme/libopenssl3.ipk" opkg install "/tmp/luci-lua-runtime_all.ipk" opkg install "/tmp/libopenssl3.ipk" } # ============================================================================ # Argon 主题安装 # ============================================================================ do_install_argon_skin() { echo "正在尝试安装argon主题..." do_install_depends_ipk opkg update opkg install luci-lib-ipkg wget --user-agent="Mozilla/5.0" -O "/tmp/luci-theme-argon.ipk" "$HTTP_HOST/theme/luci-theme-argon-master_2.2.9.4_all.ipk" wget --user-agent="Mozilla/5.0" -O "/tmp/luci-app-argon-config.ipk" "$HTTP_HOST/theme/luci-app-argon-config_0.9_all.ipk" wget --user-agent="Mozilla/5.0" -O "/tmp/luci-i18n-argon-config-zh-cn.ipk" "$HTTP_HOST/theme/luci-i18n-argon-config-zh-cn.ipk" cd /tmp/ opkg install luci-theme-argon.ipk luci-app-argon-config.ipk luci-i18n-argon-config-zh-cn.ipk if [ $? -eq 0 ]; then echo "argon主题 安装成功" uci set luci.main.mediaurlbase='/luci-static/argon' uci set luci.main.lang='zh_cn' uci commit sed -i 's/value="<%:Login%>"/value="登录"/' /usr/lib/lua/luci/view/themes/argon/sysauth.htm echo "重新登录web页面后, 查看新主题" else echo "argon主题 安装失败! 建议再执行一次!" fi } # ============================================================================ # iStore 商店安装 (64位) # ============================================================================ do_istore() { echo "do_istore 64bit ==================>" opkg update URL="https://repo.istoreos.com/repo/all/store/" DIR="/tmp/ipk_store" mkdir -p "$DIR" cd "$DIR" || exit 1 for ipk in $(wget -qO- "$URL" | grep -oE 'href="[^"]+\.ipk"' | cut -d'"' -f2); do echo "下载 $ipk" wget -q "${URL}${ipk}" done opkg install ./*.ipk } # ============================================================================ # iStore 商店安装 (通用方法) # ============================================================================ do_istore_generic() { echo "do_istore method==================>" ISTORE_REPO=https://istore.linkease.com/repo/all/store FCURL="curl --fail --show-error" curl -V >/dev/null 2>&1 || { echo "prereq: install curl" opkg info curl | grep -Fqm1 curl || opkg update opkg install curl } IPK=$($FCURL "$ISTORE_REPO/Packages.gz" | zcat | grep -m1 '^Filename: luci-app-store.*\.ipk$' | sed -n -e 's/^Filename: \(.\+\)$/\1/p') [ -n "$IPK" ] || exit 1 $FCURL "$ISTORE_REPO/$IPK" | tar -xzO ./data.tar.gz | tar -xzO ./bin/is-opkg >/tmp/is-opkg [ -s "/tmp/is-opkg" ] || exit 1 chmod 755 /tmp/is-opkg /tmp/is-opkg update /tmp/is-opkg opkg install --force-reinstall luci-lib-taskd luci-lib-xterm /tmp/is-opkg opkg install --force-reinstall luci-app-store || exit $? [ -s "/etc/init.d/tasks" ] || /tmp/is-opkg opkg install --force-reinstall taskd [ -s "/usr/lib/lua/luci/cbi.lua" ] || /tmp/is-opkg opkg install luci-compat >/dev/null 2>&1 } # ============================================================================ # Quickstart 下载 # ============================================================================ download_luci_quickstart() { REPO_URL="https://repo.istoreos.com/repo/all/nas_luci/" DOWNLOAD_DIR="/tmp/ipk_downloads" mkdir -p "$DOWNLOAD_DIR" wget -qO- "$REPO_URL" | grep -oE 'href="[^"]*quickstart[^"]*\.ipk"' | sed 's/href="//;s/"//' | while read -r FILE; do echo "📦 正在下载: $FILE" wget -q -P "$DOWNLOAD_DIR" "$REPO_URL$FILE" done echo "✅ 所有 quickstart 相关 IPK 文件已下载到: $DOWNLOAD_DIR" } download_lib_quickstart() { REPO_URL="https://repo.istoreos.com/repo/aarch64_cortex-a53/nas/" DOWNLOAD_DIR="/tmp/ipk_downloads" mkdir -p "$DOWNLOAD_DIR" wget -qO- "$REPO_URL" | grep -oE 'href="[^"]*quickstart[^"]*\.ipk"' | sed 's/href="//;s/"//' | while read -r FILE; do echo "📦 正在下载: $FILE" wget -q -P "$DOWNLOAD_DIR" "$REPO_URL$FILE" done echo "✅ 所有 quickstart 相关 IPK 文件已下载到: $DOWNLOAD_DIR" } # ============================================================================ # 新首页风格安装 # ============================================================================ do_install_new_quickstart() { green "正在更新到最新版iStoreOS首页风格" TMPATH=/tmp/qstart mkdir -p ${TMPATH} app_aarch64='quickstart_0.11.13-r1_aarch64_generic.ipk' app_ui='luci-app-quickstart_0.12.4-r1_all.ipk' app_lng='luci-i18n-quickstart-zh-cn_25.090.31208-f5bf244_all.ipk' wget $HTTP_HOST/newquickstart/$app_aarch64 -O ${TMPATH}/$app_aarch64 wget $HTTP_HOST/newquickstart/$app_ui -O ${TMPATH}/$app_ui wget $HTTP_HOST/newquickstart/$app_lng -O ${TMPATH}/$app_lng opkg install ${TMPATH}/*.ipk rm -rf ${TMPATH} hide_ui_elements green "首页风格安装完毕!请使用8080端口访问luci界面:http://192.168.8.1:8080" green "作者更多动态务必收藏:https://tvhelper.cpolar.cn/" } # ============================================================================ # UI 辅助插件安装 # ============================================================================ do_install_ui_helper() { echo "⚠️ 请您确保当前固件版本大于 4.7.2,若低于此版本建议先升级。" read -p "👉 如果您已确认,请按 [回车] 继续;否则按 Ctrl+C 或输入任意内容后回车退出:" user_input if [ -n "$user_input" ]; then echo "🚫 用户取消安装。" return 1 fi local ipk_file="/tmp/glinjector_3.0.5-6_all.ipk" local sha_file="${ipk_file}.sha256" echo "📥 正在下载 IPK 及 SHA256 校验文件..." wget -O "$sha_file" "$HTTP_HOST/ui/glinjector_3.0.5-6_all.ipk.sha256" || { echo "❌ 下载 SHA256 文件失败" return 1 } wget --user-agent="Mozilla/5.0" -O "$ipk_file" "$HTTP_HOST/ui/glinjector_3.0.5-6_all.ipk" || { echo "❌ 下载 IPK 文件失败" return 1 } echo "🔐 正在进行 SHA256 校验..." cd "$(dirname "$ipk_file")" sha256sum -c "$sha_file" || { echo "❌ 校验失败:文件已损坏或未完整下载" rm -f "$ipk_file" return 1 } echo "✅ 校验通过,开始安装..." opkg update opkg install "$ipk_file" } # ============================================================================ # 高级卸载插件 # ============================================================================ advanced_uninstall() { echo "📥 正在下载高级卸载插件..." wget -O /tmp/advanced_uninstall.ipk $HTTP_HOST/uninstall/advanced_uninstall.ipk opkg update opkg install /tmp/advanced_uninstall.ipk } # ============================================================================ # 恢复出厂设置 # ============================================================================ recovery() { echo "⚠️ 警告:此操作将恢复出厂设置,所有配置将被清除!" echo "⚠️ 请确保已备份必要数据。" read -p "是否确定执行恢复出厂设置?(yes/[no]): " confirm if [ "$confirm" = "yes" ]; then echo "正在执行恢复出厂设置..." firstboot -y >/dev/null 2>&1 echo "操作完成,正在重启设备..." reboot else echo "操作已取消。" fi } # ============================================================================ # 风扇温度设置 # ============================================================================ set_glfan_temp() { echo "兼容带风扇机型的GL-iNet路由器" echo "请输入风扇开始工作的温度(建议40-70之间的整数):" read temp if [[ $temp =~ ^[0-9]+$ ]]; then uci set glfan.@globals[0].temperature="$temp" uci set glfan.@globals[0].warn_temperature="$temp" uci set glfan.@globals[0].integration=4 uci set glfan.@globals[0].differential=20 uci commit glfan /etc/init.d/gl_fan restart echo "设置成功!稍等片刻,请查看风扇转动情况" else echo "错误: 请输入整数." fi } # ============================================================================ # AdGuardHome 提示 # ============================================================================ toggle_adguardhome() { echo "==========================================" echo " AdGuardHome 广告拦截服务" echo "==========================================" echo yellow "如需管理 AdGuardHome,请在 GL 原厂界面操作:" echo cyan "路径:系统 → 个性化 → 解锁区域限制" echo green "解锁后即可看到 AdGuardHome 菜单" echo echo "访问地址:http://192.168.8.1:3000" echo }