refactor: 重构项目结构,提取公共函数库,删除无用文件和Docker功能

主要变更:
- 创建 lib/lib-common.sh 公共函数库,减少约2300行重复代码
- 重构所有机型脚本,改为从远程加载公共库
- 删除 Docker 安装功能(路由器运行Docker不稳定)
- 删除无用文件:reinstall_istore.sh、try.sh、index.html、docker目录
- 修改 AdGuardHome 函数为操作提示
- 更新 README.md,添加项目结构说明
This commit is contained in:
2026-06-22 08:42:26 +08:00
parent d632df7d52
commit 41b72b6e54
14 changed files with 1410 additions and 3959 deletions

View File

@@ -23,7 +23,42 @@ sh -c "$(curl -fsSL https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main/main.sh)"
sh -c "$(curl -fsSL https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main/gl-inet.sh)"
```
### MT3000 如果你升级到 原厂4.8.3-op24 强烈建议把默认软件源 替换为阿里云 因为op官网的源容易下载失败 影响任何软件的安装
#### MT3000 / MT6000 (OP24固件)
```bash
sh -c "$(curl -fsSL https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main/gl-inet-op24.sh)"
```
#### BE6500
```bash
sh -c "$(curl -fsSL https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main/be6500.sh)"
```
#### BE3600
```bash
sh -c "$(curl -fsSL https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main/be3600.sh)"
```
#### MT-3600BE
```bash
sh -c "$(curl -fsSL https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main/mt3600.sh)"
```
#### MT-5000
```bash
sh -c "$(curl -fsSL https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main/mt5000.sh)"
```
#### MT-3000 换分区助手 (U盘扩容)
```bash
sh -c "$(curl -fsSL https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main/mt-3000/mt3000.sh)"
```
---
## 📝 MT3000 OP24固件软件源配置
如果你升级到原厂4.8.3-op24建议把默认软件源替换为阿里云
```
src/gz core https://fw.gl-inet.cn/releases/v24.x/24.10.4/mediatek/filogic
src/gz base https://mirrors.aliyun.com/openwrt/releases/24.10.4/packages/aarch64_cortex-a53/base
@@ -33,31 +68,28 @@ src/gz routing https://mirrors.aliyun.com/openwrt/releases/24.10.4/packages/aarc
src/gz telephony https://mirrors.aliyun.com/openwrt/releases/24.10.4/packages/aarch64_cortex-a53/telephony
```
## 新增 兼容原厂op24固件luci 24.10.4)的脚本 (MT3000/6000)
```bash
sh -c "$(curl -fsSL https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main/gl-inet-op24.sh)"
---
## 📁 项目结构
```
#### 新增 BE6500脚本 (GL-BE6500) ❤️
```bash
sh -c "$(curl -fsSL https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main/be6500.sh)"
```
#### 新增 BE3600脚本 (GL-BE3600)
```bash
sh -c "$(curl -fsSL https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main/be3600.sh)"
gl/
├── main.sh # 主入口脚本
├── lib/
│ └── lib-common.sh # 公共函数库
├── be6500.sh # BE6500专用脚本
├── be3600.sh # BE3600专用脚本
├── mt5000.sh # MT5000专用脚本
├── mt3600.sh # MT3600专用脚本
├── gl-inet.sh # MT2500/3000/6000通用脚本
├── gl-inet-op24.sh # OP24固件专用脚本
└── mt-3000/
└── mt3000.sh # MT3000换分区助手
```
#### ❤️新增 MT-3600BE脚本 (GL-MT3600BE)
```bash
sh -c "$(curl -fsSL https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main/mt3600.sh)"
---
```
## 🔗 相关链接
#### ❤️新增 MT-5000脚本 (GL-MT5000)
```bash
sh -c "$(curl -fsSL https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main/mt5000.sh)"
```
- 作者导航站https://tvhelper.cpolar.cn
- 项目赞助https://wkdaily.cpolar.cn/01

580
be3600.sh
View File

@@ -1,486 +1,128 @@
#!/bin/sh
# 定义颜色输出函数
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"; }
third_party_source="https://istore.linkease.com/repo/all/nas_luci"
# GL-iNet BE3600 一键iStoreOS风格化脚本
# by @wukongdaily
HTTP_HOST="https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main"
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
green "安装完毕请使用8080端口访问luci界面http://192.168.8.1:8080"
green "作者更多动态务必收藏https://tvhelper.cpolar.cn/"
LIB_COMMON="/tmp/lib-common.sh"
# 下载并加载公共库
load_common_lib() {
if [ ! -f "$LIB_COMMON" ]; then
wget -O "$LIB_COMMON" "$HTTP_HOST/lib/lib-common.sh" 2>/dev/null || {
echo "下载公共库失败"
exit 1
}
fi
. "$LIB_COMMON"
}
## 安装应用商店和主题
# BE3600 专用64位架构配置
add_arch_64bit() {
if ! wget -O /etc/opkg/arch.conf $HTTP_HOST/64bit/arch.conf; then
echo "下载 arch.conf 失败,脚本终止。"
exit 1
fi
}
# 安装应用商店和主题
install_istore_os_style() {
##设置Argon 紫色主题
do_install_argon_skin
#增加终端
opkg install luci-i18n-ttyd-zh-cn
#默认安装必备工具SFTP 方便下载文件 比如finalshell等工具可以直接浏览路由器文件
opkg install openssh-sftp-server
#默认使用体积很小的文件传输:系统——文件传输
do_install_filetransfer
FILE_PATH="/etc/openwrt_release"
NEW_DESCRIPTION="Openwrt like iStoreOS Style by wukongdaily"
CONTENT=$(cat $FILE_PATH)
UPDATED_CONTENT=$(echo "$CONTENT" | sed "s/DISTRIB_DESCRIPTION='[^']*'/DISTRIB_DESCRIPTION='$NEW_DESCRIPTION'/")
echo "$UPDATED_CONTENT" >$FILE_PATH
}
# 安装iStore
do_istore() {
echo "do_istore 64bit ==================>"
opkg update
# 定义目标 URL 和本地目录
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
# 安装所有下载的 .ipk 包
opkg install ./*.ipk
#调整a53架构优先级
add_arch_64bit
do_install_argon_skin
opkg install luci-i18n-ttyd-zh-cn
opkg install openssh-sftp-server
do_install_filetransfer
FILE_PATH="/etc/openwrt_release"
NEW_DESCRIPTION="Openwrt like iStoreOS Style by wukongdaily"
CONTENT=$(cat $FILE_PATH)
UPDATED_CONTENT=$(echo "$CONTENT" | sed "s/DISTRIB_DESCRIPTION='[^']*'/DISTRIB_DESCRIPTION='$NEW_DESCRIPTION'/")
echo "$UPDATED_CONTENT" >$FILE_PATH
}
# 首页和网络向导
do_quickstart() {
download_lib_quickstart
download_luci_quickstart
opkg install /tmp/ipk_downloads/*.ipk
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/"
download_lib_quickstart
download_luci_quickstart
opkg install /tmp/ipk_downloads/*.ipk
do_install_new_quickstart
}
download_luci_quickstart() {
# 目标目录
REPO_URL="https://repo.istoreos.com/repo/all/nas_luci/"
DOWNLOAD_DIR="/tmp/ipk_downloads"
# 创建下载目录
mkdir -p "$DOWNLOAD_DIR"
# 获取目录索引并筛选 quickstart ipk 链接
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"
# 获取目录索引并筛选 quickstart ipk 链接
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"
}
# 判断系统是否为iStoreOS
is_iStoreOS() {
DISTRIB_ID=$(cat /etc/openwrt_release | grep "DISTRIB_ID" | cut -d "'" -f 2)
# 检查DISTRIB_ID的值是否等于'iStoreOS'
if [ "$DISTRIB_ID" = "iStoreOS" ]; then
return 0 # true
else
return 1 # false
fi
}
## 去除opkg签名
remove_check_signature_option() {
local opkg_conf="/etc/opkg.conf"
sed -i '/option check_signature/d' "$opkg_conf"
}
## 添加opkg签名
add_check_signature_option() {
local opkg_conf="/etc/opkg.conf"
echo "option check_signature 1" >>"$opkg_conf"
}
#设置第三方软件源
setup_software_source() {
## 传入0和1 分别代表原始和第三方软件源
if [ "$1" -eq 0 ]; then
echo "# add your custom package feeds here" >/etc/opkg/customfeeds.conf
##如果是iStoreOS系统,还原软件源之后,要添加签名
if is_iStoreOS; then
add_check_signature_option
else
echo
fi
# 还原软件源之后更新
opkg update
elif [ "$1" -eq 1 ]; then
#传入1 代表设置第三方软件源 先要删掉签名
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
}
# 添加主机名映射(解决安卓原生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
else
echo
fi
}
#添加出处信息
add_author_info() {
uci set system.@system[0].description='wukongdaily'
uci set system.@system[0].notes='文档说明:
https://tvhelper.cpolar.cn/'
uci commit system
}
##获取软路由型号信息
get_router_name() {
model_info=$(cat /tmp/sysinfo/model)
echo "$model_info"
}
get_router_hostname() {
hostname=$(uci get system.@system[0].hostname)
echo "$hostname 路由器"
}
# 安装体积非常小的文件传输软件 默认上传位置/tmp/upload/
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
}
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主题......."
#下载和安装argon的依赖
do_install_depends_ipk
# bug fix 由于2.3.1 最新版的luci-argon-theme 登录按钮没有中文匹配,而2.3版本字体不对。
# 所以这里安装上一个版本2.2.9,考虑到主题皮肤并不需要长期更新,因此固定版本没问题
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
}
recovery() {
echo "⚠️ 警告:此操作将恢复出厂设置,所有配置将被清除!"
echo "⚠️ 请确保已备份必要数据。"
read -p "是否确定执行恢复出厂设置?(yes/[no]): " confirm
if [ "$confirm" = "yes" ]; then
echo "正在执行恢复出厂设置..."
# 安静执行 firstboot不显示其内部的提示信息
firstboot -y >/dev/null 2>&1
echo "操作完成,正在重启设备..."
reboot
else
echo "操作已取消。"
fi
}
add_arch_64bit() {
if ! wget -O /etc/opkg/arch.conf $HTTP_HOST/64bit/arch.conf; then
echo "下载 arch.conf 失败,脚本终止。"
exit 1
fi
}
# 防止误操作 隐藏首页无用的元素
hide_ui_elements() {
TARGET="/www/luci-static/quickstart/style.css"
MARKER="/* hide custom luci elements */"
# 如果没有追加过,就添加
if ! grep -q "$MARKER" "$TARGET"; then
cat <<EOF >>"$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
}
#自定义风扇开始工作的温度
set_glfan_temp() {
is_integer() {
if [[ $1 =~ ^[0-9]+$ ]]; then
return 0 # 是整数
else
return 1 # 不是整数
fi
}
echo "兼容带风扇机型的GL-iNet路由器"
echo "请输入风扇开始工作的温度(建议40-70之间的整数):"
read temp
if is_integer "$temp"; 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
}
toggle_adguardhome() {
status=$(uci get adguardhome.config.enabled)
if [ "$status" -eq 1 ]; then
echo "Disabling AdGuardHome..."
uci set adguardhome.config.enabled='0' >/dev/null 2>&1
uci commit adguardhome >/dev/null 2>&1
/etc/init.d/adguardhome disable >/dev/null 2>&1
/etc/init.d/adguardhome stop >/dev/null 2>&1
green "AdGuardHome 已关闭"
else
echo "Enabling AdGuardHome..."
uci set adguardhome.config.enabled='1' >/dev/null 2>&1
uci commit adguardhome >/dev/null 2>&1
/etc/init.d/adguardhome enable >/dev/null 2>&1
/etc/init.d/adguardhome start >/dev/null 2>&1
green "AdGuardHome 已开启 访问 http://192.168.8.1:3000"
fi
}
# 安装[官方辅助UI]插件 by 论坛 iBelieve
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
}
# ============================================================================
# 主程序
# ============================================================================
load_common_lib
while true; do
clear
gl_name=$(get_router_name)
result="GL-iNet Be3600 一键iStoreOS风格化"
echo "***********************************************************************"
echo "* 一键安装工具箱(for gl-inet be3600) by @wukongdaily 20251118 "
echo "**********************************************************************"
echo "*******支持的机型列表***************************************************"
green "*******GL-iNet BE-3600********"
green "请确保您的固件版本在4.7.2以上"
echo
clear
gl_name=$(get_router_name)
result="GL-iNet Be3600 一键iStoreOS风格化(64位)"
echo "***********************************************************************"
echo "* 一键安装工具箱(for gl-inet be3600) by @wukongdaily"
echo "**********************************************************************"
echo "*******支持的机型列表***************************************************"
green "*******GL-iNet BE-3600********"
green "请确保您的固件版本在4.7.2以上"
echo
light_magenta " 1. $result (64位)"
echo
light_magenta " 2. 安装argon紫色主题"
echo
light_magenta " 3. 单独安装iStore商店"
echo
light_magenta " 4. 隐藏首页格式化按钮"
echo
light_magenta " 6. 启用或关闭AdGuardHome广告拦截"
echo
light_magenta " 7. 安装个性化UI辅助插件(by VMatrices)"
echo
light_magenta " 8. 安装高级卸载插件"
echo
light_magenta " 9. 恢复出厂设置/重置路由器"
echo
echo " Q. 退出本程序"
echo
read -p "请选择一个选项: " choice
light_magenta " 1. $result"
echo
light_magenta " 2. 安装argon紫色主题"
echo
light_magenta " 3. 单独安装iStore商店"
echo
light_magenta " 4. 隐藏首页格式化按钮"
echo
light_magenta " 5. 设置风扇工作温度"
echo
light_magenta " 6. 启用或关闭AdGuardHome广告拦截"
echo
light_magenta " 7. 安装个性化UI辅助插件(by VMatrices)"
echo
light_magenta " 8. 安装高级卸载插件"
echo
light_magenta " 9. 恢复出厂设置/重置路由器"
echo
echo " Q. 退出本程序"
echo
read -p "请选择一个选项: " choice
case $choice in
case $choice in
1)
install_istore_os_style
setup_base_init
do_istore
do_quickstart
;;
2)
do_install_argon_skin
;;
3)
do_istore
;;
4)
hide_ui_elements
;;
5)
set_glfan_temp
;;
6)
toggle_adguardhome
;;
7)
do_install_ui_helper
;;
8)
advanced_uninstall
;;
9)
recovery
;;
q | Q)
echo "退出"
exit 0
;;
*)
echo "无效选项,请重新选择。"
;;
esac
1)
#安装iStore风格
install_istore_os_style
#基础必备设置
setup_base_init
#安装iStore商店
do_istore
#安装首页和网络向导
do_quickstart
;;
2)
do_install_argon_skin
;;
3)
do_istore
;;
4)
hide_ui_elements
;;
5)
set_glfan_temp
;;
6)
toggle_adguardhome
;;
7)
do_install_ui_helper
;;
8)
advanced_uninstall
;;
9)
recovery
;;
q | Q)
echo "退出"
exit 0
;;
*)
echo "无效选项,请重新选择。"
;;
esac
read -p "按 Enter 键继续..."
read -p "按 Enter 键继续..."
done

583
be6500.sh
View File

@@ -1,490 +1,127 @@
#!/bin/sh
# 定义颜色输出函数
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"; }
third_party_source="https://istore.linkease.com/repo/all/nas_luci"
# GL-iNet BE6500 一键iStoreOS风格化脚本
# by @wukongdaily
HTTP_HOST="https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main"
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
green "安装完毕请使用8080端口访问luci界面http://192.168.8.1:8080"
green "作者更多动态务必收藏https://tvhelper.cpolar.cn/"
LIB_COMMON="/tmp/lib-common.sh"
# 下载并加载公共库
load_common_lib() {
if [ ! -f "$LIB_COMMON" ]; then
wget -O "$LIB_COMMON" "$HTTP_HOST/lib/lib-common.sh" 2>/dev/null || {
echo "下载公共库失败"
exit 1
}
fi
. "$LIB_COMMON"
}
## 安装应用商店和主题
# BE6500 专用64位架构配置
add_arch_64bit() {
if ! wget -O /etc/opkg/arch.conf $HTTP_HOST/64bit/arch.conf; then
echo "下载 arch.conf 失败,脚本终止。"
exit 1
fi
}
# 安装应用商店和主题
install_istore_os_style() {
##设置Argon 紫色主题
do_install_argon_skin
#增加终端
opkg install luci-i18n-ttyd-zh-cn
#默认安装必备工具SFTP 方便下载文件 比如finalshell等工具可以直接浏览路由器文件
opkg install openssh-sftp-server
#默认使用体积很小的文件传输:系统——文件传输
do_install_filetransfer
FILE_PATH="/etc/openwrt_release"
NEW_DESCRIPTION="Openwrt like iStoreOS Style by wukongdaily"
CONTENT=$(cat $FILE_PATH)
UPDATED_CONTENT=$(echo "$CONTENT" | sed "s/DISTRIB_DESCRIPTION='[^']*'/DISTRIB_DESCRIPTION='$NEW_DESCRIPTION'/")
echo "$UPDATED_CONTENT" >$FILE_PATH
}
# 安装iStore
do_istore() {
echo "do_istore 64bit ==================>"
opkg update
# 定义目标 URL 和本地目录
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
# 安装所有下载的 .ipk 包
opkg install ./*.ipk
#调整a53架构优先级
add_arch_64bit
do_install_argon_skin
opkg install luci-i18n-ttyd-zh-cn
opkg install openssh-sftp-server
do_install_filetransfer
FILE_PATH="/etc/openwrt_release"
NEW_DESCRIPTION="Openwrt like iStoreOS Style by wukongdaily"
CONTENT=$(cat $FILE_PATH)
UPDATED_CONTENT=$(echo "$CONTENT" | sed "s/DISTRIB_DESCRIPTION='[^']*'/DISTRIB_DESCRIPTION='$NEW_DESCRIPTION'/")
echo "$UPDATED_CONTENT" >$FILE_PATH
}
# 首页和网络向导
do_quickstart() {
download_lib_quickstart
download_luci_quickstart
opkg install /tmp/ipk_downloads/*.ipk
do_install_new_quickstart
download_lib_quickstart
download_luci_quickstart
opkg install /tmp/ipk_downloads/*.ipk
do_install_new_quickstart
}
download_luci_quickstart() {
# 目标目录
REPO_URL="https://repo.istoreos.com/repo/all/nas_luci/"
DOWNLOAD_DIR="/tmp/ipk_downloads"
# 创建下载目录
mkdir -p "$DOWNLOAD_DIR"
# 获取目录索引并筛选 quickstart ipk 链接
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"
# 获取目录索引并筛选 quickstart ipk 链接
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"
}
# 判断系统是否为iStoreOS
is_iStoreOS() {
DISTRIB_ID=$(cat /etc/openwrt_release | grep "DISTRIB_ID" | cut -d "'" -f 2)
# 检查DISTRIB_ID的值是否等于'iStoreOS'
if [ "$DISTRIB_ID" = "iStoreOS" ]; then
return 0 # true
else
return 1 # false
fi
}
## 去除opkg签名
remove_check_signature_option() {
local opkg_conf="/etc/opkg.conf"
sed -i '/option check_signature/d' "$opkg_conf"
}
## 添加opkg签名
add_check_signature_option() {
local opkg_conf="/etc/opkg.conf"
echo "option check_signature 1" >>"$opkg_conf"
}
#设置第三方软件源
setup_software_source() {
## 传入0和1 分别代表原始和第三方软件源
if [ "$1" -eq 0 ]; then
echo "# add your custom package feeds here" >/etc/opkg/customfeeds.conf
##如果是iStoreOS系统,还原软件源之后,要添加签名
if is_iStoreOS; then
add_check_signature_option
else
echo
fi
# 还原软件源之后更新
opkg update
elif [ "$1" -eq 1 ]; then
#传入1 代表设置第三方软件源 先要删掉签名
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
}
# 添加主机名映射(解决安卓原生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
else
echo
fi
}
#添加出处信息
add_author_info() {
uci set system.@system[0].description='wukongdaily'
uci set system.@system[0].notes='文档说明:
https://tvhelper.cpolar.cn/'
uci commit system
}
##获取软路由型号信息
get_router_name() {
model_info=$(cat /tmp/sysinfo/model)
echo "$model_info"
}
get_router_hostname() {
hostname=$(uci get system.@system[0].hostname)
echo "$hostname 路由器"
}
# 安装体积非常小的文件传输软件 默认上传位置/tmp/upload/
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
}
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主题......."
#下载和安装argon的依赖
do_install_depends_ipk
# bug fix 由于2.3.1 最新版的luci-argon-theme 登录按钮没有中文匹配,而2.3版本字体不对。
# 所以这里安装上一个版本2.2.9,考虑到主题皮肤并不需要长期更新,因此固定版本没问题
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
}
recovery() {
echo "⚠️ 警告:此操作将恢复出厂设置,所有配置将被清除!"
echo "⚠️ 请确保已备份必要数据。"
read -p "是否确定执行恢复出厂设置?(yes/[no]): " confirm
if [ "$confirm" = "yes" ]; then
echo "正在执行恢复出厂设置..."
# 安静执行 firstboot不显示其内部的提示信息
firstboot -y >/dev/null 2>&1
echo "操作完成,正在重启设备..."
reboot
else
echo "操作已取消。"
fi
}
add_arch_64bit() {
if ! wget -O /etc/opkg/arch.conf $HTTP_HOST/64bit/arch.conf; then
echo "下载 arch.conf 失败,脚本终止。"
exit 1
fi
}
# 防止误操作 隐藏首页无用的元素
hide_ui_elements() {
TARGET="/www/luci-static/quickstart/style.css"
MARKER="/* hide custom luci elements */"
# 如果没有追加过,就添加
if ! grep -q "$MARKER" "$TARGET"; then
cat <<EOF >>"$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
}
#自定义风扇开始工作的温度
set_glfan_temp() {
is_integer() {
if [[ $1 =~ ^[0-9]+$ ]]; then
return 0 # 是整数
else
return 1 # 不是整数
fi
}
echo "兼容带风扇机型的GL-iNet路由器"
echo "请输入风扇开始工作的温度(建议40-70之间的整数):"
read temp
if is_integer "$temp"; 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
}
toggle_adguardhome() {
status=$(uci get adguardhome.config.enabled)
if [ "$status" -eq 1 ]; then
echo "Disabling AdGuardHome..."
uci set adguardhome.config.enabled='0' >/dev/null 2>&1
uci commit adguardhome >/dev/null 2>&1
/etc/init.d/adguardhome disable >/dev/null 2>&1
/etc/init.d/adguardhome stop >/dev/null 2>&1
green "AdGuardHome 已关闭"
else
echo "Enabling AdGuardHome..."
uci set adguardhome.config.enabled='1' >/dev/null 2>&1
uci commit adguardhome >/dev/null 2>&1
/etc/init.d/adguardhome enable >/dev/null 2>&1
/etc/init.d/adguardhome start >/dev/null 2>&1
green "AdGuardHome 已开启 访问 http://192.168.8.1:3000"
fi
}
# 安装[官方辅助UI]插件 by 论坛 iBelieve
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
}
# 安装新首页风格
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/"
}
# ============================================================================
# 主程序
# ============================================================================
load_common_lib
while true; do
clear
gl_name=$(get_router_name)
result="GL-iNet Be6500 一键iStoreOS风格化(新版)"
echo "***********************************************************************"
echo "* 一键安装工具箱(for gl-inet be6500) by @wukongdaily "
echo "**********************************************************************"
echo "*******支持的机型列表***************************************************"
green "*******GL-iNet BE-6500********"
green "请确保您的固件版本在4.7.2以上"
echo
clear
gl_name=$(get_router_name)
result="GL-iNet Be6500 一键iStoreOS风格化(新版)"
echo "***********************************************************************"
echo "* 一键安装工具箱(for gl-inet be6500) by @wukongdaily"
echo "**********************************************************************"
echo "*******支持的机型列表***************************************************"
green "*******GL-iNet BE-6500********"
green "请确保您的固件版本在4.7.2以上"
echo
light_magenta " 1. $result"
echo
light_magenta " 2. 安装argon紫色主题"
echo
light_magenta " 3. 单独安装iStore商店"
echo
light_magenta " 4. 隐藏首页无用元素"
echo
light_magenta " 6. 安装个性化UI辅助插件(by VMatrices)"
echo
light_magenta " 7. 安装高级卸载插件"
echo
light_magenta " 8. 安装新首页"
echo
light_magenta " 9. 恢复出厂设置"
echo
echo " Q. 退出本程序"
echo
read -p "请选择一个选项: " choice
light_magenta " 1. $result"
echo
light_magenta " 2. 安装argon紫色主题"
echo
light_magenta " 3. 单独安装iStore商店"
echo
light_magenta " 4. 隐藏首页无用元素"
echo
light_magenta " 5. 设置风扇工作温度"
echo
light_magenta " 6. 安装个性化UI辅助插件(by VMatrices)"
echo
light_magenta " 7. 安装高级卸载插件"
echo
light_magenta " 8. 安装新首页"
echo
light_magenta " 9. 恢复出厂设置"
echo
echo " Q. 退出本程序"
echo
read -p "请选择一个选项: " choice
case $choice in
case $choice in
1)
install_istore_os_style
setup_base_init
do_istore
;;
2)
do_install_argon_skin
;;
3)
do_istore
;;
4)
hide_ui_elements
;;
5)
set_glfan_temp
;;
6)
do_install_ui_helper
;;
7)
advanced_uninstall
;;
8)
do_install_new_quickstart
;;
9)
recovery
;;
q | Q)
echo "退出"
exit 0
;;
*)
echo "无效选项,请重新选择。"
;;
esac
1)
#安装iStore风格
install_istore_os_style
#基础必备设置
setup_base_init
#安装iStore商店
do_istore
#安装首页和网络向导 不适合6500和9300 因为mdadm组件不兼容
#do_quickstart
;;
2)
do_install_argon_skin
;;
3)
do_istore
;;
4)
hide_ui_elements
;;
5)
set_glfan_temp
;;
6)
do_install_ui_helper
;;
7)
advanced_uninstall
;;
8)
do_install_new_quickstart
;;
9)
recovery
;;
q | Q)
echo "退出"
exit 0
;;
*)
echo "无效选项,请重新选择。"
;;
esac
read -p "按 Enter 键继续..."
read -p "按 Enter 键继续..."
done

View File

@@ -1,220 +0,0 @@
#!/bin/sh
# 定义颜色输出函数
red() { echo -e "\033[31m\033[01m[WARNING] $1\033[0m"; }
green() { echo -e "\033[32m\033[01m[INFO] $1\033[0m"; }
yellow() { echo -e "\033[33m\033[01m[NOTICE] $1\033[0m"; }
blue() { echo -e "\033[34m\033[01m[MESSAGE] $1\033[0m"; }
light_magenta() { echo -e "\033[95m\033[01m[NOTICE] $1\033[0m"; }
light_yellow() { echo -e "\033[93m\033[01m[NOTICE] $1\033[0m"; }
# 获取路由器型号信息
get_router_name() {
cat /tmp/sysinfo/model
}
# 安装依赖应用
install_depends_apps() {
blue "正在安装部署环境的所需要的工具 lsblk 和 fdisk ..."
router_name=$(get_router_name)
case "$router_name" in
*2500* | *3000*)
opkg update >/dev/null 2>&1
if opkg install lsblk fdisk >/dev/null 2>&1; then
green "$router_name 的 lsblk fdisk 工具 安装成功。"
else
red "安装失败。"
exit 1
fi
;;
*6000*)
red "由于 mt6000 的软件源中没有找到 lsblk 和 fdisk ..."
yellow "因此先借用 mt3000 的软件源来安装 lsblk 和 fdisk 工具"
# 备份 /etc/opkg/distfeeds.conf
cp /etc/opkg/distfeeds.conf /etc/opkg/distfeeds.conf.backup
# 先替换为 mt3000 的软件源来安装 lsblk 和 fdisk 工具
mt3000_opkg="https://cafe.cpolar.top/wkdaily/gl-inet-onescript/raw/branch/master/mt-3000/distfeeds.conf"
wget -O /etc/opkg/distfeeds.conf ${mt3000_opkg}
green "正在更新为 mt3000 的软件源"
cat /etc/opkg/distfeeds.conf
opkg update
green "再次尝试安装 lsblk 和 fdisk 工具"
if opkg install fdisk lsblk; then
green "$router_name 的 lsblk fdisk 工具 安装成功。"
# 还原软件源
cp /etc/opkg/distfeeds.conf.backup /etc/opkg/distfeeds.conf
else
red "安装失败。"
# 还原软件源
cp /etc/opkg/distfeeds.conf.backup /etc/opkg/distfeeds.conf
exit 1
fi
;;
*)
echo "Router name does not contain '3000', '6000', or '2500'."
;;
esac
}
# 准备USB设备
prepare_usb_device() {
green "现在开始查找USB设备分区请稍后......"
local usb_disk=$(lsblk -dn -o NAME,RM,TYPE | awk '$2=="1" && $3=="disk" {print "/dev/"$1; exit}')
if [ -z "$usb_disk" ]; then
red "未找到USB磁盘。"
exit 1
fi
yellow "找到USB磁盘$usb_disk"
# 清零磁盘开始部分以清除分区表和文件系统签名
dd if=/dev/zero of=$usb_disk bs=1M count=10
sync
# 卸载所有与该磁盘相关的挂载点
unmount_usb_device "$usb_disk"
red "正在重新分区并格式化$usb_disk..."
create_and_format_partition "$usb_disk"
}
# 卸载USB设备
unmount_usb_device() {
for mount in $(mount | grep "$1" | awk '{print $3}'); do
yellow "正在尝试卸载U盘挂载点$mount"
umount $mount || {
red "警告:无法卸载挂载点 $mount。可能有文件正在被访问或权限不足。"
exit 1
}
green "U盘挂载点 $mount 卸载成功。"
done
}
# 创建并格式化分区
create_and_format_partition() {
{
echo o # 创建一个新的空DOS分区表
echo n # 添加一个新分区
echo p # 主分区
echo 1 # 分区号1
echo # 第一个可用扇区(默认)
echo # 最后一个扇区(默认,使用剩余空间)
echo w # 写入并退出
} | fdisk $1 >/dev/null 2>&1
sleep 5
local new_partition="${1}1"
red "正在将U盘 $new_partition 格式化为EXT4文件系统..."
mkfs.ext4 -F $new_partition >/dev/null 2>&1
green "$new_partition 已成功格式化为EXT4文件系统。"
configure_and_start_docker $new_partition
}
# 配置并启动Docker
configure_and_start_docker() {
local new_partition="$1"
local usb_mount_point="/mnt/upan_data"
local docker_root="$usb_mount_point/docker"
mkdir -p $docker_root
green "将U盘 挂载到 $usb_mount_point..."
mount -t ext4 $new_partition $usb_mount_point
if [ $? -ne 0 ]; then
red "挂载失败,脚本退出。"
exit 1
fi
green "U盘挂载成功啦\n"
green "正在创建 Docker 配置文件 /etc/docker/daemon.json"
mkdir -p /etc/docker
echo '{
"bridge": "docker0",
"storage-driver": "overlay2",
"data-root": "'$docker_root'"
}' >/etc/docker/daemon.json
install_docker
configure_docker_to_start_on_boot "$new_partition" "$usb_mount_point"
}
# 安装 Docker 和 dockerd
install_docker() {
green "正在更新 OPKG 软件包..."
opkg update >/dev/null 2>&1
green "正在安装 Docker 及相关服务...请耐心等待一会...大约需要1分钟\n"
opkg install luci-app-dockerman >/dev/null 2>&1
opkg install luci-i18n-dockerman-zh-cn >/dev/null 2>&1
opkg install dockerd --force-depends >/dev/null 2>&1
# 修改 /etc/config/dockerd 文件中的 data_root 配置
sed -i "/option data_root/c\ option data_root '/mnt/upan_data/docker/'" /etc/config/dockerd
}
# 配置 Docker 开机启动
configure_docker_to_start_on_boot() {
local new_partition="$1"
local usb_mount_point="$2"
# 创建并配置启动脚本
green "正在设置 Docker 跟随系统启动的文件:/etc/init.d/docker"
cat <<EOF >/etc/init.d/docker
#!/bin/sh /etc/rc.common
START=99
USE_PROCD=1
PROG="/usr/bin/dockerd"
start_service() {
procd_open_instance
procd_set_param command \$PROG --config-file /etc/docker/daemon.json
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
}
stop_service() {
killall dockerd
}
restart() {
stop
start
}
EOF
chmod +x /etc/init.d/docker
/etc/init.d/docker enable
green "正在设置开机启动顺序的配置\n\n先挂载U盘,再启动Docker 修改/etc/rc.local后如下\n"
# 首先,备份 /etc/rc.local
cp /etc/rc.local /etc/rc.local.backup
# glinet系统重启后的 USB自动挂载点
SYSTEM_USB_AUTO_MOUNTPOINT="/tmp/mountd/disk1_part1"
# 卸载USB自动挂载点 挂载自定义挂载点 /mnt/upan_data
if ! grep -q "umount $SYSTEM_USB_AUTO_MOUNTPOINT" /etc/rc.local; then
sed -i '/exit 0/d' /etc/rc.local
# 将新的命令添加到 /etc/rc.local然后再加上 exit 0
{
echo "umount $SYSTEM_USB_AUTO_MOUNTPOINT || true"
echo "mount $new_partition $usb_mount_point || true"
echo "/etc/init.d/docker start || true"
echo "exit 0"
} >>/etc/rc.local
fi
cat /etc/rc.local
green "Docker 运行环境部署完成 重启后生效\n"
red "是否立即重启?(y/n)"
read -r answer
if [ "$answer" = "y" ] || [ -z "$answer" ]; then
red "正在重启..."
reboot
else
yellow "您选择了不重启"
fi
}
# START
install_depends_apps
prepare_usb_device

View File

@@ -1,644 +1,183 @@
#!/bin/sh
# 定义颜色输出函数
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"; }
third_party_source="https://istore.linkease.com/repo/all/nas_luci"
# GL-iNet MT-3000/MT-6000 OP24固件专用脚本
# by @wukongdaily
HTTP_HOST="https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main"
LIB_COMMON="/tmp/lib-common.sh"
# 设置全局命令 g
cp -f "$0" /usr/bin/g
chmod +x /usr/bin/g
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
## 设置防火墙wan 打开,方便主路由访问
uci set firewall.@zone[1].input='ACCEPT'
uci commit firewall
# 下载并加载公共库
load_common_lib() {
if [ ! -f "$LIB_COMMON" ]; then
wget -O "$LIB_COMMON" "$HTTP_HOST/lib/lib-common.sh" 2>/dev/null || {
echo "下载公共库失败"
exit 1
}
fi
. "$LIB_COMMON"
}
# 调整架构 兼容aarch64_generic
# MT系列专用架构配置
add_arch() {
if ! wget -O /etc/opkg/arch.conf $HTTP_HOST/mtarch/arch.conf; then
echo "下载 arch.conf 失败,脚本终止。"
exit 1
fi
}
# 切换到阿里云软件源 适用于MT3000 OP24固件
change_opkg_source() {
if [[ "$gl_name" == *3000* ]]; then
if ! wget -O /etc/opkg/distfeeds.conf $HTTP_HOST/mt-3000/distfeeds-24.conf; then
echo "换源失败,脚本终止。"
exit 1
fi
fi
}
## 安装应用商店和主题
install_istore_os_style() {
##设置Argon 紫色主题
do_install_argon_skin
#增加首页终端图标
opkg install ttyd
#默认使用体积很小的文件传输:系统——文件传输
do_install_filetransfer
#默认安装必备工具SFTP 方便下载文件 比如finalshell等工具可以直接浏览路由器文件
is-opkg install app-meta-sftp
is-opkg install 'app-meta-ddnsto'
# 安装磁盘管理
is-opkg install 'app-meta-diskman'
FILE_PATH="/etc/openwrt_release"
NEW_DESCRIPTION="Openwrt like iStoreOS Style by wukongdaily"
CONTENT=$(cat $FILE_PATH)
UPDATED_CONTENT=$(echo "$CONTENT" | sed "s/DISTRIB_DESCRIPTION='[^']*'/DISTRIB_DESCRIPTION='$NEW_DESCRIPTION'/")
echo "$UPDATED_CONTENT" >$FILE_PATH
}
# 安装iStore 参考 https://github.com/linkease/istore
do_istore() {
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 install taskd
/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
}
#设置风扇工作温度
setup_cpu_fans() {
#设定温度阀值,cpu高于48度,则风扇开始工作
uci set glfan.@globals[0].temperature=50
uci set glfan.@globals[0].warn_temperature=50
uci set glfan.@globals[0].integration=4
uci set glfan.@globals[0].differential=20
uci commit glfan
/etc/init.d/gl_fan restart
}
# 判断系统是否为iStoreOS
is_iStoreOS() {
DISTRIB_ID=$(cat /etc/openwrt_release | grep "DISTRIB_ID" | cut -d "'" -f 2)
# 检查DISTRIB_ID的值是否等于'iStoreOS'
if [ "$DISTRIB_ID" = "iStoreOS" ]; then
return 0 # true
else
return 1 # false
fi
}
## 去除opkg签名
remove_check_signature_option() {
local opkg_conf="/etc/opkg.conf"
sed -i '/option check_signature/d' "$opkg_conf"
}
## 添加opkg签名
add_check_signature_option() {
local opkg_conf="/etc/opkg.conf"
echo "option check_signature 1" >>"$opkg_conf"
}
#设置第三方软件源
setup_software_source() {
## 传入0和1 分别代表原始和第三方软件源
if [ "$1" -eq 0 ]; then
echo "# add your custom package feeds here" >/etc/opkg/customfeeds.conf
##如果是iStoreOS系统,还原软件源之后,要添加签名
if is_iStoreOS; then
add_check_signature_option
else
echo
fi
# 还原软件源之后更新
opkg update
elif [ "$1" -eq 1 ]; then
#传入1 代表设置第三方软件源 先要删掉签名
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
}
# 添加主机名映射(解决安卓原生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
else
echo
fi
}
#添加出处信息
add_author_info() {
uci set system.@system[0].description='wukongdaily'
uci set system.@system[0].notes='文档说明:
https://tvhelper.cpolar.cn/'
uci commit system
}
##获取软路由型号信息
get_router_name() {
model_info=$(cat /tmp/sysinfo/model)
echo "$model_info"
}
get_router_hostname() {
hostname=$(uci get system.@system[0].hostname)
echo "$hostname 路由器"
}
add_custom_feed() {
# 先清空配置
echo "# add your custom package feeds here" >/etc/opkg/customfeeds.conf
# Prompt the user to enter the feed URL
echo "请输入自定义软件源的地址(通常是https开头 aarch64_cortex-a53 结尾):"
read feed_url
if [ -n "$feed_url" ]; then
echo "src/gz custom_feed $feed_url" >>/etc/opkg/customfeeds.conf
opkg update
if [ $? -eq 0 ]; then
echo "已添加并更新列表."
else
echo "已添加但更新失败,请检查网络或重试."
fi
else
echo "Error: Feed URL not provided. No changes were made."
fi
}
remove_custom_feed() {
echo "# add your custom package feeds here" >/etc/opkg/customfeeds.conf
opkg update
if [ $? -eq 0 ]; then
echo "已删除并更新列表."
else
echo "已删除了自定义软件源但更新失败,请检查网络或重试."
fi
}
# 检查是否安装了 whiptail
check_whiptail_installed() {
if [ -e /usr/bin/whiptail ]; then
return 0
else
return 1
fi
}
# 执行重启操作
do_reboot() {
reboot
}
#自定义风扇开始工作的温度
set_glfan_temp() {
is_integer() {
if [[ $1 =~ ^[0-9]+$ ]]; then
return 0 # 是整数
else
return 1 # 不是整数
fi
}
echo "兼容带风扇机型的GL-iNet路由器"
echo "请输入风扇开始工作的温度(建议40-70之间的整数):"
read temp
if is_integer "$temp"; 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
}
recovery_opkg_settings() {
echo "# add your custom package feeds here" >/etc/opkg/customfeeds.conf
mt3000_opkg="$HTTP_HOST/mt-3000/distfeeds-24.conf"
wget -O /etc/opkg/distfeeds.conf ${mt3000_opkg}
}
update_opkg_config() {
kernel_version=$(uname -r)
echo "MT-6000 kernel version: $kernel_version"
case $kernel_version in
5.4*)
mt6000_opkg="$HTTP_HOST/mt-6000/distfeeds-5.4.conf"
wget -O /etc/opkg/distfeeds.conf ${mt6000_opkg}
# 更换5.4.238 内核之后 缺少的依赖
mkdir -p /tmp/mt6000
wget --user-agent="Mozilla/5.0" -O /tmp/mt6000/script-utils.ipk "$HTTP_HOST/mt-6000/script-utils.ipk"
wget --user-agent="Mozilla/5.0" -O /tmp/mt6000/mdadm.ipk "$HTTP_HOST/mt-6000/mdadm.ipk"
wget --user-agent="Mozilla/5.0" -O /tmp/mt6000/lsblk.ipk "$HTTP_HOST/mt-6000/lsblk.ipk"
opkg update
if [ -f "/tmp/mt6000/lsblk.ipk" ]; then
# 先卸载之前安装过的lsblk,确保使用的是正确的lsblk
opkg remove lsblk
fi
opkg install /tmp/mt6000/*.ipk
;;
5.15*)
mt6000_opkg="$HTTP_HOST/mt-6000/distfeeds.conf"
wget -O /etc/opkg/distfeeds.conf ${mt6000_opkg}
;;
*)
echo "Unsupported kernel version: $kernel_version"
return 1
;;
esac
}
do_luci_app_wireguard() {
setup_software_source 0
opkg install luci-app-wireguard
opkg install luci-i18n-wireguard-zh-cn
echo "请访问 http://"$(uci get network.lan.ipaddr)"/cgi-bin/luci/admin/status/wireguard 查看状态 "
echo "也可以去接口中 查看是否增加了新的wireguard 协议的选项 "
}
update_luci_app_quickstart() {
if [ -f "/bin/is-opkg" ]; then
# 如果 /bin/is-opkg 存在,则执行 is-opkg update
is-opkg update
is-opkg install luci-i18n-quickstart-zh-cn --force-depends >/dev/null 2>&1
opkg install iptables-mod-tproxy
opkg install iptables-mod-socket
opkg install iptables-mod-iprange
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
yellow "恭喜您!现在你的路由器已经变成iStoreOS风格啦!"
green "现在您可以访问8080端口 查看是否生效 http://192.168.8.1:8080"
green "更多up主项目和动态 请务必收藏我的导航站 https://tvhelper.cpolar.cn "
green "赞助本项目作者 https://wkdaily.cpolar.cn/01 "
addr_hostname=$(uci get system.@system[0].hostname)
else
red "请先执行第一项 一键iStoreOS风格化"
fi
}
# 安装体积非常小的文件传输软件 默认上传位置/tmp/upload/
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
}
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"
wget --user-agent="Mozilla/5.0" -O "/tmp/luci-compat.ipk" "$HTTP_HOST/theme/luci-compat.ipk"
opkg install "/tmp/luci-lua-runtime_all.ipk"
opkg install "/tmp/libopenssl3.ipk"
opkg install "/tmp/luci-compat.ipk"
}
#单独安装argon主题
do_install_argon_skin() {
echo "正在尝试安装argon主题......."
wget "$HTTP_HOST/theme/argon-2.4.3.run" -O /tmp/argon.run
sh /tmp/argon.run
# 检查上一个命令的返回值
if [ $? -eq 0 ]; then
echo "argon主题 安装成功"
# 设置主题和语言
uci set luci.main.mediaurlbase='/luci-static/argon'
uci set luci.main.lang='zh_cn'
uci commit
echo "重新登录web页面后, 查看新主题 "
else
echo "argon主题 安装失败! 建议再执行一次!再给我一个机会!事不过三!"
fi
}
#单独安装文件管理器
do_install_filemanager() {
echo "为避免bug,安装文件管理器之前,需要先iStore商店"
do_istore
echo "接下来 尝试安装文件管理器......."
is-opkg install 'app-meta-linkease'
echo "重新登录web页面,然后您可以访问: http://192.168.8.1/cgi-bin/luci/admin/services/linkease/file/?path=/root"
}
#更新脚本
update_myself() {
wget -O gl-inet.sh "$HTTP_HOST/gl-inet.sh" && chmod +x gl-inet.sh
echo "脚本已更新并保存在当前目录 gl-inet.sh,现在将执行新脚本。"
./gl-inet.sh
exit 0
}
#根据release地址和命名前缀获取apk地址
get_docker_compose_url() {
if [ $# -eq 0 ]; then
echo "需要提供GitHub releases页面的URL作为参数。"
return 1
fi
local releases_url=$1
# 使用curl获取重定向的URL
latest_url=$(curl -Ls -o /dev/null -w "%{url_effective}" "$releases_url")
# 使用sed从URL中提取tag值,并保留前导字符'v'
tag=$(echo $latest_url | sed 's|.*/v|v|')
# 检查是否成功获取到tag
if [ -z "$tag" ]; then
echo "未找到最新的release tag。"
return 1
fi
# 拼接docker-compose下载链接
local repo_path=$(echo "$releases_url" | sed -n 's|https://github.com/\(.*\)/releases/latest|\1|p')
docker_compose_download_url="https://github.com/${repo_path}/releases/download/${tag}/docker-compose-linux-aarch64"
echo "$docker_compose_download_url"
}
# 下载并安装Docker Compose
do_install_docker_compose() {
# https://github.com/docker/compose/releases/download/v2.26.0/docker-compose-linux-aarch64
# 检查/usr/bin/docker是否存在并且可执行
if [ -f "/usr/bin/docker" ] && [ -x "/usr/bin/docker" ]; then
echo "Docker is installed and has execute permissions."
else
red "警告 您还没有安装Docker"
exit 1
fi
if [[ "$gl_name" == *3000* ]]; then
red "警告 docker-compose 组件的大小将近60MB,请谨慎安装"
yellow "确定要继续安装吗(y|n)"
read -r answer
if [ "$answer" = "y" ] || [ -z "$answer" ]; then
green "正在获取最新版docker-compose下载地址"
else
yellow "已退出docker-compose安装流程"
exit 1
fi
fi
local github_releases_url="https://github.com/docker/compose/releases/latest"
local docker_compose_url=$(get_docker_compose_url "$github_releases_url")
echo "最新版docker-compose 地址:$docker_compose_url"
wget -O /usr/bin/docker-compose $docker_compose_url
if [ $? -eq 0 ]; then
green "docker-compose下载并安装成功,你可以使用啦"
chmod +x /usr/bin/docker-compose
else
red "安装失败,请检查网络连接.或者手动下载到 /usr/bin/docker-compose 记得赋予执行权限"
yellow "刚才使用的地址是:$docker_compose_url"
exit 1
fi
}
#mt3000更换分区
mt3000_overlay_changed() {
wget -O mt3000.sh "$HTTP_HOST/mt-3000/mt3000.sh" && chmod +x mt3000.sh
sh mt3000.sh
}
# 防止误操作 隐藏首页无用的元素
hide_ui_elements() {
TARGET="/www/luci-static/quickstart/style.css"
MARKER="/* hide custom luci elements */"
# 如果没有追加过,就添加
if ! grep -q "$MARKER" "$TARGET"; then
cat <<EOF >>"$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 "⚠️ 无需重复操作"
if ! wget -O /etc/opkg/arch.conf $HTTP_HOST/mtarch/arch.conf; then
echo "下载 arch.conf 失败,脚本终止。"
exit 1
fi
}
# 启用adguardhome
toggle_adguardhome() {
status=$(uci get adguardhome.config.enabled)
if [ "$status" -eq 1 ]; then
echo "Disabling AdGuardHome..."
uci set adguardhome.config.enabled='0' >/dev/null 2>&1
uci commit adguardhome >/dev/null 2>&1
/etc/init.d/adguardhome disable >/dev/null 2>&1
/etc/init.d/adguardhome stop >/dev/null 2>&1
green "AdGuardHome 已关闭"
else
echo "Enabling AdGuardHome..."
uci set adguardhome.config.enabled='1' >/dev/null 2>&1
uci commit adguardhome >/dev/null 2>&1
/etc/init.d/adguardhome enable >/dev/null 2>&1
/etc/init.d/adguardhome start >/dev/null 2>&1
green "AdGuardHome 已开启 访问 http://192.168.8.1:3000"
fi
# OP24专用切换到阿里云软件源
change_opkg_source() {
if [[ "$gl_name" == *3000* ]]; then
if ! wget -O /etc/opkg/distfeeds.conf $HTTP_HOST/mt-3000/distfeeds-24.conf; then
echo "换源失败,脚本终止。"
exit 1
fi
fi
}
# 安装[官方辅助UI]插件 by 论坛 iBelieve
do_install_ui_helper() {
echo "⚠️ 请您确保当前固件版本大于 4.7.0,若低于此版本建议先升级。"
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"
# 安装应用商店和主题
install_istore_os_style() {
do_install_argon_skin
opkg install ttyd
do_install_filetransfer
is-opkg install app-meta-sftp
is-opkg install 'app-meta-ddnsto'
is-opkg install 'app-meta-diskman'
FILE_PATH="/etc/openwrt_release"
NEW_DESCRIPTION="Openwrt like iStoreOS Style by wukongdaily"
CONTENT=$(cat $FILE_PATH)
UPDATED_CONTENT=$(echo "$CONTENT" | sed "s/DISTRIB_DESCRIPTION='[^']*'/DISTRIB_DESCRIPTION='$NEW_DESCRIPTION'/")
echo "$UPDATED_CONTENT" >$FILE_PATH
}
#高级卸载
advanced_uninstall(){
echo "📥 正在下载 高级卸载插件..."
wget -O /tmp/advanced_uninstall.ipk $HTTP_HOST/uninstall/advanced_uninstall.ipk
opkg update
opkg install /tmp/advanced_uninstall.ipk
# 设置风扇工作温度
setup_cpu_fans() {
uci set glfan.@globals[0].temperature=50
uci set glfan.@globals[0].warn_temperature=50
uci set glfan.@globals[0].integration=4
uci set glfan.@globals[0].differential=20
uci commit glfan
/etc/init.d/gl_fan restart
}
# 恢复原厂OPKG配置
recovery_opkg_settings() {
echo "# add your custom package feeds here" >/etc/opkg/customfeeds.conf
mt3000_opkg="$HTTP_HOST/mt-3000/distfeeds-24.conf"
wget -O /etc/opkg/distfeeds.conf ${mt3000_opkg}
}
# 更新首页风格
update_luci_app_quickstart() {
if [ -f "/bin/is-opkg" ]; then
is-opkg update
is-opkg install luci-i18n-quickstart-zh-cn --force-depends >/dev/null 2>&1
opkg install iptables-mod-tproxy
opkg install iptables-mod-socket
opkg install iptables-mod-iprange
do_install_new_quickstart
yellow "恭喜您!现在你的路由器已经变成iStoreOS风格啦!"
green "现在您可以访问8080端口 查看是否生效 http://192.168.8.1:8080"
green "更多up主项目和动态 请务必收藏我的导航站 https://tvhelper.cpolar.cn"
else
red "请先执行第一项 一键iStoreOS风格化"
fi
}
# 安装文件管理器
do_install_filemanager() {
echo "为避免bug,安装文件管理器之前,需要先iStore商店"
do_istore_generic
echo "接下来尝试安装文件管理器..."
is-opkg install 'app-meta-linkease'
echo "重新登录web页面,然后您可以访问: http://192.168.8.1/cgi-bin/luci/admin/services/linkease/file/?path=/root"
}
# ============================================================================
# 主程序
# ============================================================================
load_common_lib
while true; do
clear
gl_name=$(get_router_name)
result=$gl_name"一键iStoreOS风格化(新版)"
result=$(echo "$result" | sed 's/ like iStoreOS//')
echo "***********************************************************************"
echo "* 一键安装工具箱(for gl-inet Router)"
echo "* 20260109 by @wukongdaily "
echo "**********************************************************************"
echo "* 当前的路由器型号: "$gl_name | sed 's/ like iStoreOS//'
echo
echo "********仅支持op24固件的机型*********************************************"
green "*******GL-iNet MT-3000 op24 "
green "*******GL-iNet MT-6000 op24"
echo "******************下次调用 直接输入快捷键 g *****************************"
echo
light_magenta " 1. $result"
echo
echo " 2. 设置风扇开始工作的温度(仅限MT3000)"
echo " 3. 安装Argon紫色主题"
echo " 4. 安装文件管理器"
light_magenta " 5. 隐藏首页非必要UI元素"
light_magenta " 6. 安装个性化UI辅助插件(by VMatrices)"
light_magenta " 7. 安装高级卸载插件"
echo
echo " Q. 退出本程序"
echo
read -p "请选择一个选项: " choice
clear
gl_name=$(get_router_name)
result=$gl_name"一键iStoreOS风格化(新版)"
result=$(echo "$result" | sed 's/ like iStoreOS//')
echo "***********************************************************************"
echo "* 一键安装工具箱(for gl-inet Router)"
echo "* OP24固件专用 by @wukongdaily"
echo "**********************************************************************"
echo "* 当前的路由器型号: $gl_name" | sed 's/ like iStoreOS//'
echo
echo "********仅支持op24固件的机型*********************************************"
green "*******GL-iNet MT-3000 op24"
green "*******GL-iNet MT-6000 op24"
echo "******************下次调用 直接输入快捷键 g *****************************"
echo
light_magenta " 1. $result"
echo
echo " 2. 设置风扇开始工作的温度(仅限MT3000)"
echo " 3. 安装Argon紫色主题"
echo " 4. 安装文件管理器"
light_magenta " 5. 隐藏首页非必要UI元素"
light_magenta " 6. 安装个性化UI辅助插件(by VMatrices)"
light_magenta " 7. 安装高级卸载插件"
echo
echo " Q. 退出本程序"
echo
read -p "请选择一个选项: " choice
case $choice in
case $choice in
1)
add_arch
change_opkg_source
if [[ "$gl_name" == *3000* ]]; then
setup_cpu_fans
fi
do_istore_generic
install_istore_os_style
update_luci_app_quickstart
setup_base_init
advanced_uninstall
do_install_ui_helper
;;
2)
case "$gl_name" in
*3000*)
set_glfan_temp
;;
*)
echo "当前的路由器型号: $gl_name" | sed 's/ like iStoreOS//'
echo "并非MT3000 它没有风扇 无需设置"
;;
esac
;;
3)
do_install_argon_skin
;;
4)
do_install_filemanager
;;
5)
hide_ui_elements
;;
6)
do_install_ui_helper
;;
7)
advanced_uninstall
;;
q | Q)
echo "退出"
exit 0
;;
*)
echo "无效选项,请重新选择。"
;;
esac
1)
add_arch
change_opkg_source
if [[ "$gl_name" == *3000* ]]; then
# 设置风扇工作温度
setup_cpu_fans
fi
#先安装istore商店
do_istore
#安装iStore风格
install_istore_os_style
#安装iStore首页风格
update_luci_app_quickstart
#基础必备设置
setup_base_init
advanced_uninstall
do_install_ui_helper
;;
2)
case "$gl_name" in
*3000*)
set_glfan_temp
;;
*)
echo "* 当前的路由器型号: "$gl_name | sed 's/ like iStoreOS//'
echo "并非MT3000 它没有风扇 无需设置"
;;
esac
;;
3)
do_install_argon_skin
;;
4)
do_install_filemanager
;;
5)
hide_ui_elements
;;
6)
do_install_ui_helper
;;
7)
advanced_uninstall
;;
q | Q)
echo "退出"
exit 0
;;
*)
echo "无效选项,请重新选择。"
;;
esac
read -p "按 Enter 键继续..."
read -p "按 Enter 键继续..."
done

1002
gl-inet.sh

File diff suppressed because it is too large Load Diff

View File

@@ -1,26 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>mt3000备用脚本</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify/lib/themes/vue.css">
</head>
<body>
<div id="app">加载中...</div>
<script>
window.$docsify = {
name: 'mt3000备用脚本',
repo: '',
// 自动跳转的首页内容(默认就是 README.md
loadSidebar: true, // 启用侧边栏
loadNavbar: true, // 启用顶部导航栏
subMaxLevel: 2, // 支持多级标题
}
</script>
<script src="//cdn.jsdelivr.net/npm/docsify/lib/docsify.min.js"></script>
</body>
</html>

410
lib/lib-common.sh Normal file
View File

@@ -0,0 +1,410 @@
#!/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
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 <<EOF >>"$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
}

View File

@@ -96,7 +96,6 @@ select_model() {
green " 9. GL-iNet MT-6000 (OP24固件)"
echo
green "10. MT-3000 换分区助手 (U盘扩容)"
green "11. MT-3000 Docker安装"
echo
echo " Q. 退出"
echo
@@ -124,9 +123,6 @@ select_model() {
10)
download_and_run_script "mt-3000/mt3000.sh"
;;
11)
download_and_run_script "docker/do_docker.sh"
;;
q | Q)
echo "退出"
exit 0

View File

@@ -1,18 +1,15 @@
#!/bin/sh
# MT-3000 软件包更换分区助手
# by @wukongdaily
# 定义颜色输出函数
red() { echo -e "\033[31m\033[01m$1\033[0m"; }
green() { echo -e "\033[32m\033[01m$1\033[0m"; }
greeninfo() { echo -e "\033[32m\033[01m[INFO] $1\033[0m"; }
blueinfo() { 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"; }
purple() { echo -e "\033[38;5;141m$1\033[0m"; }
cyan() { echo -e "\033[38;2;0;255;255m$1\033[0m"; }
install_depends_apps() {
cyan "正在安装必备工具...."
cyan "正在安装必备工具..."
opkg update >/dev/null 2>&1
for pkg in lsblk fdisk; do
if opkg list-installed | grep -qw "$pkg"; then
@@ -36,13 +33,12 @@ unmount_usb_device() {
red "警告:无法卸载挂载点 $mount。可能有文件正在被访问或权限不足。"
exit 1
}
blueinfo "U盘挂载点 $mount 卸载成功。"
green "U盘挂载点 $mount 卸载成功。"
done
}
create_and_format_partitions() {
local device=$1
# 使用fdisk -l获取设备的总容量以字节为单位并转换为GB
local total_bytes=$(fdisk -l $device | grep "Disk $device:" | awk '{print $5}')
local total_gb=$(echo "$total_bytes" | awk '{print int($1/(1024*1024*1024))}')
@@ -50,83 +46,69 @@ create_and_format_partitions() {
part1_gb=$CUSTOM_OPKG_SIZE
yellow "U盘总容量约为 $total_gb GB,您设置的自定义软件包大小为 ${part1_gb}GB。"
else
# 计算10%的大小以GB为单位
part1_gb=$((total_gb / 10))
yellow "U盘总容量约为 $total_gb GB,第一分区大小设置为U盘容量的10% 即 ${part1_gb}GB。"
fi
green "计划将第一分区分配给软件包 其大小为 ${part1_gb}GB"
cyan "没错~你没有看错,让我们任性的告别 容 量 焦 虑!"
# 创建分区并分配空间
cyan "没错~你没有看错,让我们任性的告别容量焦虑!"
{
echo g # 创建一个新的空DOS分区表
echo n # 添加一个新分区
echo p # 主分区
echo 1 # 分区号1
echo # 第一个可用扇区(默认)
echo +${part1_gb}G # 为第一个分区分配计算出的GB数
echo n # 添加第二个新分区
echo p # 主分区
echo 2 # 分区号2
echo # 第一个可用扇区(默认,自动)
echo # 最后一个扇区(默认,使用剩余空间)
echo w # 写入并退出
echo g
echo n
echo p
echo 1
echo
echo +${part1_gb}G
echo n
echo p
echo 2
echo
echo
echo w
} | fdisk $device >/dev/null 2>&1
# 给系统一点时间来识别新分区
sleep 5
# 格式化第一个分区为EXT4
local new_partition1="${device}1"
cyan "正在将 $new_partition1 格式化为EXT4文件系统..."
mkfs.ext4 -F $new_partition1 >/dev/null 2>&1
cyan "$new_partition1 已成功格式化为EXT4文件系统。"
green "第2分区 ${device}2 暂不格式化,未来您可分配给docker使用"
green "$new_partition1 已成功格式化为EXT4文件系统。"
yellow "第2分区 ${device}2 暂不格式化,未来您可自行分配使用"
}
# 换区到U盘
change_overlay_usb() {
install_depends_apps
blueinfo "现在开始查找USB设备分区 请稍后......"
cyan "现在开始查找USB设备分区 请稍后..."
local USB_PARTITION=$(lsblk -dn -o NAME,TRAN | awk '$2=="usb" {print "/dev/"$1; exit}')
if [ -z "$USB_PARTITION" ]; then
red "未找到USB磁盘。"
exit 1
fi
yellow "找到USB磁盘 $USB_PARTITION"
# 清零磁盘开始部分以清除分区表和文件系统签名
dd if=/dev/zero of=$USB_PARTITION bs=1M count=10
sync
# 卸载所有与该磁盘相关的挂载点
unmount_usb_device "$USB_PARTITION"
red "正在将U盘${USB_PARTITION}分为2个区 ..."
red "正在将U盘${USB_PARTITION}分为2个区..."
create_and_format_partitions "$USB_PARTITION"
# U盘分区的挂载点
MOUNT_POINT="/mnt/usb_overlay"
# 临时目录用于复制数据
TMP_DIR="/tmp/overlay_backup"
# 创建挂载点目录
mkdir -p $MOUNT_POINT
# 挂载U盘分区
cyan "重新挂载第一分区 ${USB_PARTITION}1 到 $MOUNT_POINT"
cyan "重新挂载第一分区 ${USB_PARTITION}1 到 $MOUNT_POINT"
mount ${USB_PARTITION}1 $MOUNT_POINT >/dev/null 2>&1
# 创建临时目录用于备份overlay数据
mkdir -p $TMP_DIR
# 复制当前overlay到临时目录
cp -a /overlay/. $TMP_DIR
# 将临时目录的数据复制到U盘
blueinfo "正在拷贝 当前系统文件到U盘"
green "正在拷贝当前系统文件到U盘"
cp -a $TMP_DIR/. $MOUNT_POINT
# 更新fstab配置以便在启动时自动挂载U盘为overlay
blueinfo "正在更新启动时的配置文件"
cyan "正在更新启动时的配置文件"
uci set fstab.overlay=mount
uci set fstab.overlay.uuid="$(blkid -o value -s UUID ${USB_PARTITION}1)"
uci set fstab.overlay.target="/overlay"
uci commit fstab
# 清理临时目录
rm -rf $TMP_DIR
cp /etc/config/fstab $MOUNT_POINT/fstab.bak
cyan "overlay更换分区完成 重启验证是否成功."
green "overlay更换分区完成 重启验证是否成功"
red "是否立即重启?(y/n)"
read -r answer
if [ "$answer" = "y" ] || [ -z "$answer" ]; then
@@ -137,47 +119,15 @@ change_overlay_usb() {
fi
}
check_overlay_size() {
# 使用df命令获取/overlay分区的总大小以1K块为单位
OVERLAY_SIZE=$(df /overlay | awk '/\/overlay/{print $2}')
# 将1GB转换为1K块单位即1GB = 1*1024*1024 1K块
ONE_GB_IN_1K_BLOCKS=$((1024 * 1024))
# 比较/overlay分区的大小是否大于1GB
if [ "$OVERLAY_SIZE" -gt "$ONE_GB_IN_1K_BLOCKS" ]; then
yellow "检测到您已经换区到U盘啦,可以继续"
else
echo "您还没有换区到U盘,请先执行选项1."
exit 1
fi
}
# 安装 Docker 和 dockerd
install_docker() {
check_overlay_size
green "正在更新 OPKG 软件包..."
opkg update >/dev/null 2>&1
cyan "正在安装 Docker 及相关服务...请耐心等待一会...大约需要1-2分钟\n"
opkg install luci-app-dockerman >/dev/null 2>&1
opkg install luci-i18n-dockerman-zh-cn >/dev/null 2>&1
opkg install dockerd --force-depends >/dev/null 2>&1
cyan "Docker 运行环境部署完成 重启后生效\n"
red "正在重启..."
reboot
}
# 重新绑定
rebind_usb_overlay() {
cyan "正在重新绑定U盘设备...."
if opkg list-installed | grep -qw "lsblk"; then
echo
else
cyan "正在重新绑定U盘设备..."
if ! opkg list-installed | grep -qw "lsblk"; then
opkg update >/dev/null 2>&1
if opkg install "lsblk" >/dev/null 2>&1; then
echo
else
red "$pkg 安装失败。"
opkg install "lsblk" >/dev/null 2>&1 || {
red "lsblk 安装失败。"
exit 1
fi
}
fi
local USB_DEVICE=$(lsblk -dn -o NAME,RM,TYPE | awk '$2=="1" && $3=="disk" {print "/dev/"$1; exit}')
if [ -z "$USB_DEVICE" ]; then
@@ -188,23 +138,21 @@ rebind_usb_overlay() {
uci set fstab.overlay.uuid="$(blkid -o value -s UUID ${USB_DEVICE}1)"
uci set fstab.overlay.target="/overlay"
uci commit fstab
green "重新绑定成功! 重启后生效"
green "重新绑定成功!重启后生效"
red "正在重启..."
reboot
}
#自定义软件包的大小
#默认为U盘容量的10%
# 自定义软件包的大小默认为U盘容量的10%
custom_package_size() {
while :; do
echo "请输入想分配的软件包的大小(数字,单位:GB):"
read size
# 检查输入是否为数字
if [[ $size =~ ^[0-9]+$ ]]; then
CUSTOM_OPKG_SIZE=$size
yellow "已设置软件包大小为:$CUSTOM_OPKG_SIZE GB"
green "接下来,您可以执行第一项啦"
break # 跳出循环
break
else
red "错误: 请输入一个有效的数字。"
fi
@@ -214,13 +162,12 @@ custom_package_size() {
while true; do
clear
echo "***********************************************************************"
green " MT-3000 软件包更换分区助手 "
green " MT-3000 软件包更换分区助手"
echo "**********************************************************************"
echo
cyan " 1. MT-3000 一键更换overlay分区到U盘"
cyan " 2. MT-3000 安装Docker"
cyan " 3. 自定义设置软件包大小(GB)"
light_yellow " 4. 重新绑定U盘"
cyan " 2. 自定义设置软件包大小(GB)"
yellow " 3. 重新绑定U盘"
echo
echo " Q. 退出本程序"
echo
@@ -228,20 +175,15 @@ while true; do
echo
case $choice in
1)
change_overlay_usb
;;
2)
install_docker
;;
3)
custom_package_size
;;
4)
3)
rebind_usb_overlay
;;
q | Q)
echo "退出"
exit 0

541
mt3600.sh
View File

@@ -1,442 +1,143 @@
#!/bin/sh
# 定义颜色输出函数
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"; }
third_party_source="https://istore.linkease.com/repo/all/nas_luci"
# GL-iNet MT3600 一键iStoreOS风格化脚本
# by @wukongdaily
HTTP_HOST="https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main"
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
LIB_COMMON="/tmp/lib-common.sh"
# 下载并加载公共库
load_common_lib() {
if [ ! -f "$LIB_COMMON" ]; then
wget -O "$LIB_COMMON" "$HTTP_HOST/lib/lib-common.sh" 2>/dev/null || {
echo "下载公共库失败"
exit 1
}
fi
. "$LIB_COMMON"
}
## 安装应用商店和主题
# MT3600 专用:架构配置
add_arch() {
if ! wget -O /etc/opkg/arch.conf $HTTP_HOST/mtarch/arch.conf; then
echo "下载 arch.conf 失败,脚本终止。"
exit 1
fi
}
# 安装应用商店和主题
install_istore_os_style() {
##设置Argon 紫色主题
do_install_argon_skin
#增加终端
opkg install luci-i18n-ttyd-zh-cn
#默认安装必备工具SFTP 方便下载文件 比如finalshell等工具可以直接浏览路由器文件
opkg install openssh-sftp-server
#默认使用体积很小的文件传输:系统——文件传输
do_install_filetransfer
FILE_PATH="/etc/openwrt_release"
NEW_DESCRIPTION="Openwrt like iStoreOS Style by wukongdaily"
CONTENT=$(cat $FILE_PATH)
UPDATED_CONTENT=$(echo "$CONTENT" | sed "s/DISTRIB_DESCRIPTION='[^']*'/DISTRIB_DESCRIPTION='$NEW_DESCRIPTION'/")
echo "$UPDATED_CONTENT" >$FILE_PATH
}
# 安装iStore
do_istore() {
echo "do_istore 64bit ==================>"
opkg update
# 定义目标 URL 和本地目录
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
# 安装所有下载的 .ipk 包
opkg install ./*.ipk
do_install_argon_skin
opkg install luci-i18n-ttyd-zh-cn
opkg install openssh-sftp-server
do_install_filetransfer
FILE_PATH="/etc/openwrt_release"
NEW_DESCRIPTION="Openwrt like iStoreOS Style by wukongdaily"
CONTENT=$(cat $FILE_PATH)
UPDATED_CONTENT=$(echo "$CONTENT" | sed "s/DISTRIB_DESCRIPTION='[^']*'/DISTRIB_DESCRIPTION='$NEW_DESCRIPTION'/")
echo "$UPDATED_CONTENT" >$FILE_PATH
}
# 首页和网络向导
do_quickstart() {
download_lib_quickstart
download_luci_quickstart
opkg install /tmp/ipk_downloads/*.ipk
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
#安装高级卸载
advanced_uninstall
do_auto_install_ui_helper
green "首页风格安装完毕请使用8080端口访问luci界面http://192.168.8.1:8080"
green "作者更多动态务必收藏https://tvhelper.cpolar.cn/"
download_lib_quickstart
download_luci_quickstart
opkg install /tmp/ipk_downloads/*.ipk
do_install_new_quickstart
advanced_uninstall
do_install_ui_helper_silent
}
download_luci_quickstart() {
# 目标目录
REPO_URL="https://repo.istoreos.com/repo/all/nas_luci/"
DOWNLOAD_DIR="/tmp/ipk_downloads"
# 自动安装UI辅助插件
do_install_ui_helper_silent() {
local ipk_file="/tmp/glinjector_3.0.5-6_all.ipk"
local sha_file="${ipk_file}.sha256"
# 创建下载目录
mkdir -p "$DOWNLOAD_DIR"
wget -O "$sha_file" "$HTTP_HOST/ui/glinjector_3.0.5-6_all.ipk.sha256" || return 1
wget --user-agent="Mozilla/5.0" -O "$ipk_file" "$HTTP_HOST/ui/glinjector_3.0.5-6_all.ipk" || return 1
# 获取目录索引并筛选 quickstart ipk 链接
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
cd "$(dirname "$ipk_file")"
sha256sum -c "$sha_file" || {
rm -f "$ipk_file"
return 1
}
echo "✅ 所有 quickstart 相关 IPK 文件已下载到: $DOWNLOAD_DIR"
opkg update
opkg install "$ipk_file"
}
download_lib_quickstart() {
# 目标目录
REPO_URL="https://repo.istoreos.com/repo/aarch64_cortex-a53/nas/"
DOWNLOAD_DIR="/tmp/ipk_downloads"
# 创建下载目录
mkdir -p "$DOWNLOAD_DIR"
# 获取目录索引并筛选 quickstart ipk 链接
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"
}
# 判断系统是否为iStoreOS
is_iStoreOS() {
DISTRIB_ID=$(cat /etc/openwrt_release | grep "DISTRIB_ID" | cut -d "'" -f 2)
# 检查DISTRIB_ID的值是否等于'iStoreOS'
if [ "$DISTRIB_ID" = "iStoreOS" ]; then
return 0 # true
else
return 1 # false
fi
}
## 去除opkg签名
remove_check_signature_option() {
local opkg_conf="/etc/opkg.conf"
sed -i '/option check_signature/d' "$opkg_conf"
}
## 添加opkg签名
add_check_signature_option() {
local opkg_conf="/etc/opkg.conf"
echo "option check_signature 1" >>"$opkg_conf"
}
#设置第三方软件源
setup_software_source() {
## 传入0和1 分别代表原始和第三方软件源
if [ "$1" -eq 0 ]; then
echo "# add your custom package feeds here" >/etc/opkg/customfeeds.conf
##如果是iStoreOS系统,还原软件源之后,要添加签名
if is_iStoreOS; then
add_check_signature_option
else
echo
fi
# 还原软件源之后更新
opkg update
elif [ "$1" -eq 1 ]; then
#传入1 代表设置第三方软件源 先要删掉签名
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
}
# 添加主机名映射(解决安卓原生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
else
echo
fi
}
#添加出处信息
add_author_info() {
uci set system.@system[0].description='wukongdaily'
uci set system.@system[0].notes='文档说明:
https://tvhelper.cpolar.cn/'
uci commit system
}
##获取软路由型号信息
get_router_name() {
model_info=$(cat /tmp/sysinfo/model)
echo "$model_info"
}
get_router_hostname() {
hostname=$(uci get system.@system[0].hostname)
echo "$hostname 路由器"
}
# 安装体积非常小的文件传输软件 默认上传位置/tmp/upload/
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
}
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主题......."
#下载和安装argon的依赖
do_install_depends_ipk
# bug fix 由于2.3.1 最新版的luci-argon-theme 登录按钮没有中文匹配,而2.3版本字体不对。
# 所以这里安装上一个版本2.2.9,考虑到主题皮肤并不需要长期更新,因此固定版本没问题
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
}
recovery() {
echo "⚠️ 警告:此操作将恢复出厂设置,所有配置将被清除!"
echo "⚠️ 请确保已备份必要数据。"
read -p "是否确定执行恢复出厂设置?(yes/[no]): " confirm
if [ "$confirm" = "yes" ]; then
echo "正在执行恢复出厂设置..."
# 安静执行 firstboot不显示其内部的提示信息
firstboot -y >/dev/null 2>&1
echo "操作完成,正在重启设备..."
reboot
else
echo "操作已取消。"
fi
}
# 调整架构 兼容aarch64_generic
add_arch() {
if ! wget -O /etc/opkg/arch.conf $HTTP_HOST/mtarch/arch.conf; then
echo "下载 arch.conf 失败,脚本终止。"
exit 1
fi
}
# 防止误操作 隐藏首页无用的元素
hide_ui_elements() {
TARGET="/www/luci-static/quickstart/style.css"
MARKER="/* hide custom luci elements */"
# 如果没有追加过,就添加
if ! grep -q "$MARKER" "$TARGET"; then
cat <<EOF >>"$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
}
#自定义风扇开始工作的温度
set_glfan_temp() {
echo "请安装 个性化辅助UI"
echo "来解锁风扇温度自定义功能"
}
# 安装[官方辅助UI]插件 by 论坛 iBelieve
do_install_ui_helper() {
echo "⚠️ 请您确保当前固件版本大于 4.7.2,若低于此版本建议先升级。"
read -p "👉 如果您已确认,请按 [回车] 继续;否则按 Ctrl+C 或输入任意内容后回车退出:" user_input
if [ -n "$user_input" ]; then
echo "🚫 用户取消安装。"
return 1
fi
do_auto_install_ui_helper
}
#自动安装[官方辅助UI]
do_auto_install_ui_helper() {
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
}
# ============================================================================
# 主程序
# ============================================================================
load_common_lib
while true; do
clear
gl_name=$(get_router_name)
result="GL-iNet MT3600BE 一键iStoreOS风格化"
echo "***********************************************************************"
echo "* 一键安装工具箱(for gl-inet MT3600BE) by @wukongdaily 20251220 "
echo "**********************************************************************"
echo "*******支持的机型列表***************************************************"
green "*******GL-iNet MT3600BE********"
echo
clear
gl_name=$(get_router_name)
result="GL-iNet MT3600BE 一键iStoreOS风格化"
echo "***********************************************************************"
echo "* 一键安装工具箱(for gl-inet MT3600BE) by @wukongdaily"
echo "**********************************************************************"
echo "*******支持的机型列表***************************************************"
green "*******GL-iNet MT3600BE********"
echo
light_magenta " 1. $result"
echo
light_magenta " 2. 安装argon紫色主题"
echo
light_magenta " 3. 单独安装iStore商店"
echo
light_magenta " 4. 隐藏首页格式化按钮"
echo
light_magenta " 6. 安装个性化UI辅助插件(by VMatrices)"
echo
light_magenta " 7. 安装高级卸载插件"
echo
light_magenta " 8. 恢复出厂设置/重置路由器"
echo
echo " Q. 退出本程序"
echo
read -p "请选择一个选项: " choice
light_magenta " 1. $result"
echo
light_magenta " 2. 安装argon紫色主题"
echo
light_magenta " 3. 单独安装iStore商店"
echo
light_magenta " 4. 隐藏首页格式化按钮"
echo
light_magenta " 5. 设置风扇工作温度"
echo
light_magenta " 6. 安装个性化UI辅助插件(by VMatrices)"
echo
light_magenta " 7. 安装高级卸载插件"
echo
light_magenta " 8. 恢复出厂设置/重置路由器"
echo
echo " Q. 退出本程序"
echo
read -p "请选择一个选项: " choice
case $choice in
case $choice in
1)
add_arch
install_istore_os_style
setup_base_init
do_istore
do_quickstart
;;
2)
do_install_argon_skin
;;
3)
do_istore
;;
4)
hide_ui_elements
;;
5)
set_glfan_temp
;;
6)
do_install_ui_helper
;;
7)
advanced_uninstall
;;
8)
recovery
;;
q | Q)
echo "退出"
exit 0
;;
*)
echo "无效选项,请重新选择。"
;;
esac
1)
add_arch
#安装iStore风格
install_istore_os_style
#基础必备设置
setup_base_init
#安装iStore商店
do_istore
#安装首页和网络向导
do_quickstart
;;
2)
do_install_argon_skin
;;
3)
do_istore
;;
4)
hide_ui_elements
;;
5)
set_glfan_temp
;;
6)
do_install_ui_helper
;;
7)
advanced_uninstall
;;
8)
recovery
;;
q | Q)
echo "退出"
exit 0
;;
*)
echo "无效选项,请重新选择。"
;;
esac
read -p "按 Enter 键继续..."
read -p "按 Enter 键继续..."
done

541
mt5000.sh
View File

@@ -1,442 +1,143 @@
#!/bin/sh
# 定义颜色输出函数
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"; }
third_party_source="https://istore.linkease.com/repo/all/nas_luci"
# GL-iNet MT5000 一键iStoreOS风格化脚本
# by @wukongdaily
HTTP_HOST="https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main"
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
LIB_COMMON="/tmp/lib-common.sh"
# 下载并加载公共库
load_common_lib() {
if [ ! -f "$LIB_COMMON" ]; then
wget -O "$LIB_COMMON" "$HTTP_HOST/lib/lib-common.sh" 2>/dev/null || {
echo "下载公共库失败"
exit 1
}
fi
. "$LIB_COMMON"
}
## 安装应用商店和主题
# MT5000 专用:架构配置
add_arch() {
if ! wget -O /etc/opkg/arch.conf $HTTP_HOST/mtarch/arch.conf; then
echo "下载 arch.conf 失败,脚本终止。"
exit 1
fi
}
# 安装应用商店和主题
install_istore_os_style() {
##设置Argon 紫色主题
do_install_argon_skin
#增加终端
opkg install luci-i18n-ttyd-zh-cn
#默认安装必备工具SFTP 方便下载文件 比如finalshell等工具可以直接浏览路由器文件
opkg install openssh-sftp-server
#默认使用体积很小的文件传输:系统——文件传输
do_install_filetransfer
FILE_PATH="/etc/openwrt_release"
NEW_DESCRIPTION="Openwrt like iStoreOS Style by wukongdaily"
CONTENT=$(cat $FILE_PATH)
UPDATED_CONTENT=$(echo "$CONTENT" | sed "s/DISTRIB_DESCRIPTION='[^']*'/DISTRIB_DESCRIPTION='$NEW_DESCRIPTION'/")
echo "$UPDATED_CONTENT" >$FILE_PATH
}
# 安装iStore
do_istore() {
echo "do_istore 64bit ==================>"
opkg update
# 定义目标 URL 和本地目录
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
# 安装所有下载的 .ipk 包
opkg install ./*.ipk
do_install_argon_skin
opkg install luci-i18n-ttyd-zh-cn
opkg install openssh-sftp-server
do_install_filetransfer
FILE_PATH="/etc/openwrt_release"
NEW_DESCRIPTION="Openwrt like iStoreOS Style by wukongdaily"
CONTENT=$(cat $FILE_PATH)
UPDATED_CONTENT=$(echo "$CONTENT" | sed "s/DISTRIB_DESCRIPTION='[^']*'/DISTRIB_DESCRIPTION='$NEW_DESCRIPTION'/")
echo "$UPDATED_CONTENT" >$FILE_PATH
}
# 首页和网络向导
do_quickstart() {
download_lib_quickstart
download_luci_quickstart
opkg install /tmp/ipk_downloads/*.ipk
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
#安装高级卸载
advanced_uninstall
do_auto_install_ui_helper
green "首页风格安装完毕请使用8080端口访问luci界面http://192.168.8.1:8080"
green "作者更多动态务必收藏https://tvhelper.cpolar.cn/"
download_lib_quickstart
download_luci_quickstart
opkg install /tmp/ipk_downloads/*.ipk
do_install_new_quickstart
advanced_uninstall
do_install_ui_helper_silent
}
download_luci_quickstart() {
# 目标目录
REPO_URL="https://repo.istoreos.com/repo/all/nas_luci/"
DOWNLOAD_DIR="/tmp/ipk_downloads"
# 自动安装UI辅助插件
do_install_ui_helper_silent() {
local ipk_file="/tmp/glinjector_3.0.5-6_all.ipk"
local sha_file="${ipk_file}.sha256"
# 创建下载目录
mkdir -p "$DOWNLOAD_DIR"
wget -O "$sha_file" "$HTTP_HOST/ui/glinjector_3.0.5-6_all.ipk.sha256" || return 1
wget --user-agent="Mozilla/5.0" -O "$ipk_file" "$HTTP_HOST/ui/glinjector_3.0.5-6_all.ipk" || return 1
# 获取目录索引并筛选 quickstart ipk 链接
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
cd "$(dirname "$ipk_file")"
sha256sum -c "$sha_file" || {
rm -f "$ipk_file"
return 1
}
echo "✅ 所有 quickstart 相关 IPK 文件已下载到: $DOWNLOAD_DIR"
opkg update
opkg install "$ipk_file"
}
download_lib_quickstart() {
# 目标目录
REPO_URL="https://repo.istoreos.com/repo/aarch64_cortex-a53/nas/"
DOWNLOAD_DIR="/tmp/ipk_downloads"
# 创建下载目录
mkdir -p "$DOWNLOAD_DIR"
# 获取目录索引并筛选 quickstart ipk 链接
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"
}
# 判断系统是否为iStoreOS
is_iStoreOS() {
DISTRIB_ID=$(cat /etc/openwrt_release | grep "DISTRIB_ID" | cut -d "'" -f 2)
# 检查DISTRIB_ID的值是否等于'iStoreOS'
if [ "$DISTRIB_ID" = "iStoreOS" ]; then
return 0 # true
else
return 1 # false
fi
}
## 去除opkg签名
remove_check_signature_option() {
local opkg_conf="/etc/opkg.conf"
sed -i '/option check_signature/d' "$opkg_conf"
}
## 添加opkg签名
add_check_signature_option() {
local opkg_conf="/etc/opkg.conf"
echo "option check_signature 1" >>"$opkg_conf"
}
#设置第三方软件源
setup_software_source() {
## 传入0和1 分别代表原始和第三方软件源
if [ "$1" -eq 0 ]; then
echo "# add your custom package feeds here" >/etc/opkg/customfeeds.conf
##如果是iStoreOS系统,还原软件源之后,要添加签名
if is_iStoreOS; then
add_check_signature_option
else
echo
fi
# 还原软件源之后更新
opkg update
elif [ "$1" -eq 1 ]; then
#传入1 代表设置第三方软件源 先要删掉签名
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
}
# 添加主机名映射(解决安卓原生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
else
echo
fi
}
#添加出处信息
add_author_info() {
uci set system.@system[0].description='wukongdaily'
uci set system.@system[0].notes='文档说明:
https://tvhelper.cpolar.cn/'
uci commit system
}
##获取软路由型号信息
get_router_name() {
model_info=$(cat /tmp/sysinfo/model)
echo "$model_info"
}
get_router_hostname() {
hostname=$(uci get system.@system[0].hostname)
echo "$hostname 路由器"
}
# 安装体积非常小的文件传输软件 默认上传位置/tmp/upload/
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
}
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主题......."
#下载和安装argon的依赖
do_install_depends_ipk
# bug fix 由于2.3.1 最新版的luci-argon-theme 登录按钮没有中文匹配,而2.3版本字体不对。
# 所以这里安装上一个版本2.2.9,考虑到主题皮肤并不需要长期更新,因此固定版本没问题
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
}
recovery() {
echo "⚠️ 警告:此操作将恢复出厂设置,所有配置将被清除!"
echo "⚠️ 请确保已备份必要数据。"
read -p "是否确定执行恢复出厂设置?(yes/[no]): " confirm
if [ "$confirm" = "yes" ]; then
echo "正在执行恢复出厂设置..."
# 安静执行 firstboot不显示其内部的提示信息
firstboot -y >/dev/null 2>&1
echo "操作完成,正在重启设备..."
reboot
else
echo "操作已取消。"
fi
}
# 调整架构 兼容aarch64_generic
add_arch() {
if ! wget -O /etc/opkg/arch.conf $HTTP_HOST/mtarch/arch.conf; then
echo "下载 arch.conf 失败,脚本终止。"
exit 1
fi
}
# 防止误操作 隐藏首页无用的元素
hide_ui_elements() {
TARGET="/www/luci-static/quickstart/style.css"
MARKER="/* hide custom luci elements */"
# 如果没有追加过,就添加
if ! grep -q "$MARKER" "$TARGET"; then
cat <<EOF >>"$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
}
#自定义风扇开始工作的温度
set_glfan_temp() {
echo "请安装 个性化辅助UI"
echo "来解锁风扇温度自定义功能"
}
# 安装[官方辅助UI]插件 by 论坛 iBelieve
do_install_ui_helper() {
echo "⚠️ 请您确保当前固件版本大于 4.7.2,若低于此版本建议先升级。"
read -p "👉 如果您已确认,请按 [回车] 继续;否则按 Ctrl+C 或输入任意内容后回车退出:" user_input
if [ -n "$user_input" ]; then
echo "🚫 用户取消安装。"
return 1
fi
do_auto_install_ui_helper
}
#自动安装[官方辅助UI]
do_auto_install_ui_helper() {
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
}
# ============================================================================
# 主程序
# ============================================================================
load_common_lib
while true; do
clear
gl_name=$(get_router_name)
result="GL-iNet MT5000 一键iStoreOS风格化"
echo "***********************************************************************"
echo "* 一键安装工具箱(for gl-inet MT5000) by @wukongdaily 20260116 "
echo "**********************************************************************"
echo "*******支持的机型列表***************************************************"
green "*******GL-iNet MT5000********"
echo
clear
gl_name=$(get_router_name)
result="GL-iNet MT5000 一键iStoreOS风格化"
echo "***********************************************************************"
echo "* 一键安装工具箱(for gl-inet MT5000) by @wukongdaily"
echo "**********************************************************************"
echo "*******支持的机型列表***************************************************"
green "*******GL-iNet MT5000********"
echo
light_magenta " 1. $result"
echo
light_magenta " 2. 安装argon紫色主题"
echo
light_magenta " 3. 单独安装iStore商店"
echo
light_magenta " 4. 隐藏首页格式化按钮"
echo
light_magenta " 6. 安装个性化UI辅助插件(by VMatrices)"
echo
light_magenta " 7. 安装高级卸载插件"
echo
light_magenta " 8. 恢复出厂设置/重置路由器"
echo
echo " Q. 退出本程序"
echo
read -p "请选择一个选项: " choice
light_magenta " 1. $result"
echo
light_magenta " 2. 安装argon紫色主题"
echo
light_magenta " 3. 单独安装iStore商店"
echo
light_magenta " 4. 隐藏首页格式化按钮"
echo
light_magenta " 5. 设置风扇工作温度"
echo
light_magenta " 6. 安装个性化UI辅助插件(by VMatrices)"
echo
light_magenta " 7. 安装高级卸载插件"
echo
light_magenta " 8. 恢复出厂设置/重置路由器"
echo
echo " Q. 退出本程序"
echo
read -p "请选择一个选项: " choice
case $choice in
case $choice in
1)
add_arch
install_istore_os_style
setup_base_init
do_istore
do_quickstart
;;
2)
do_install_argon_skin
;;
3)
do_istore
;;
4)
hide_ui_elements
;;
5)
set_glfan_temp
;;
6)
do_install_ui_helper
;;
7)
advanced_uninstall
;;
8)
recovery
;;
q | Q)
echo "退出"
exit 0
;;
*)
echo "无效选项,请重新选择。"
;;
esac
1)
add_arch
#安装iStore风格
install_istore_os_style
#基础必备设置
setup_base_init
#安装iStore商店
do_istore
#安装首页和网络向导
do_quickstart
;;
2)
do_install_argon_skin
;;
3)
do_istore
;;
4)
hide_ui_elements
;;
5)
set_glfan_temp
;;
6)
do_install_ui_helper
;;
7)
advanced_uninstall
;;
8)
recovery
;;
q | Q)
echo "退出"
exit 0
;;
*)
echo "无效选项,请重新选择。"
;;
esac
read -p "按 Enter 键继续..."
read -p "按 Enter 键继续..."
done

View File

@@ -1,27 +0,0 @@
#!/bin/sh
## 安装iStore 参考 https://github.com/linkease/istore
opkg update
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 install taskd
/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

432
try.sh
View File

@@ -1,432 +0,0 @@
#!/bin/sh
# 定义颜色输出函数
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"; }
third_party_source="https://istore.linkease.com/repo/all/nas_luci"
HTTP_HOST="https://cafe.cpolar.cn/wkdaily/gl/raw/branch/main"
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
}
## 安装应用商店和主题
install_istore_os_style() {
##设置Argon 紫色主题
do_install_argon_skin
#增加终端
opkg install luci-i18n-ttyd-zh-cn
#默认安装必备工具SFTP 方便下载文件 比如finalshell等工具可以直接浏览路由器文件
opkg install openssh-sftp-server
#默认使用体积很小的文件传输:系统——文件传输
do_install_filetransfer
FILE_PATH="/etc/openwrt_release"
NEW_DESCRIPTION="Openwrt like iStoreOS Style by wukongdaily"
CONTENT=$(cat $FILE_PATH)
UPDATED_CONTENT=$(echo "$CONTENT" | sed "s/DISTRIB_DESCRIPTION='[^']*'/DISTRIB_DESCRIPTION='$NEW_DESCRIPTION'/")
echo "$UPDATED_CONTENT" >$FILE_PATH
}
# 安装iStore
do_istore() {
echo "do_istore 64bit ==================>"
opkg update
# 定义目标 URL 和本地目录
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
# 安装所有下载的 .ipk 包
opkg install ./*.ipk
}
# 首页和网络向导
do_quickstart() {
download_lib_quickstart
download_luci_quickstart
opkg install /tmp/ipk_downloads/*.ipk
hide_ui_elements
#安装高级卸载
advanced_uninstall
do_auto_install_ui_helper
green "首页风格安装完毕请使用8080端口访问luci界面http://192.168.8.1:8080"
green "作者更多动态务必收藏https://tvhelper.cpolar.cn/"
}
download_luci_quickstart() {
# 目标目录
REPO_URL="https://repo.istoreos.com/repo/all/nas_luci/"
DOWNLOAD_DIR="/tmp/ipk_downloads"
# 创建下载目录
mkdir -p "$DOWNLOAD_DIR"
# 获取目录索引并筛选 quickstart ipk 链接
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"
# 获取目录索引并筛选 quickstart ipk 链接
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"
}
# 判断系统是否为iStoreOS
is_iStoreOS() {
DISTRIB_ID=$(cat /etc/openwrt_release | grep "DISTRIB_ID" | cut -d "'" -f 2)
# 检查DISTRIB_ID的值是否等于'iStoreOS'
if [ "$DISTRIB_ID" = "iStoreOS" ]; then
return 0 # true
else
return 1 # false
fi
}
## 去除opkg签名
remove_check_signature_option() {
local opkg_conf="/etc/opkg.conf"
sed -i '/option check_signature/d' "$opkg_conf"
}
## 添加opkg签名
add_check_signature_option() {
local opkg_conf="/etc/opkg.conf"
echo "option check_signature 1" >>"$opkg_conf"
}
#设置第三方软件源
setup_software_source() {
## 传入0和1 分别代表原始和第三方软件源
if [ "$1" -eq 0 ]; then
echo "# add your custom package feeds here" >/etc/opkg/customfeeds.conf
##如果是iStoreOS系统,还原软件源之后,要添加签名
if is_iStoreOS; then
add_check_signature_option
else
echo
fi
# 还原软件源之后更新
opkg update
elif [ "$1" -eq 1 ]; then
#传入1 代表设置第三方软件源 先要删掉签名
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
}
# 添加主机名映射(解决安卓原生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
else
echo
fi
}
#添加出处信息
add_author_info() {
uci set system.@system[0].description='wukongdaily'
uci set system.@system[0].notes='文档说明:
https://tvhelper.cpolar.cn/'
uci commit system
}
##获取软路由型号信息
get_router_name() {
model_info=$(cat /tmp/sysinfo/model)
echo "$model_info"
}
get_router_hostname() {
hostname=$(uci get system.@system[0].hostname)
echo "$hostname 路由器"
}
# 安装体积非常小的文件传输软件 默认上传位置/tmp/upload/
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
}
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主题......."
#下载和安装argon的依赖
do_install_depends_ipk
# bug fix 由于2.3.1 最新版的luci-argon-theme 登录按钮没有中文匹配,而2.3版本字体不对。
# 所以这里安装上一个版本2.2.9,考虑到主题皮肤并不需要长期更新,因此固定版本没问题
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
}
recovery() {
echo "⚠️ 警告:此操作将恢复出厂设置,所有配置将被清除!"
echo "⚠️ 请确保已备份必要数据。"
read -p "是否确定执行恢复出厂设置?(yes/[no]): " confirm
if [ "$confirm" = "yes" ]; then
echo "正在执行恢复出厂设置..."
# 安静执行 firstboot不显示其内部的提示信息
firstboot -y >/dev/null 2>&1
echo "操作完成,正在重启设备..."
reboot
else
echo "操作已取消。"
fi
}
# 调整架构 兼容aarch64_generic
add_arch() {
if ! wget -O /etc/opkg/arch.conf $HTTP_HOST/mtarch/arch.conf; then
echo "下载 arch.conf 失败,脚本终止。"
exit 1
fi
}
# 防止误操作 隐藏首页无用的元素
hide_ui_elements() {
TARGET="/www/luci-static/quickstart/style.css"
MARKER="/* hide custom luci elements */"
# 如果没有追加过,就添加
if ! grep -q "$MARKER" "$TARGET"; then
cat <<EOF >>"$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
}
#自定义风扇开始工作的温度
set_glfan_temp() {
echo "请安装 个性化辅助UI"
echo "来解锁风扇温度自定义功能"
}
# 安装[官方辅助UI]插件 by 论坛 iBelieve
do_install_ui_helper() {
echo "⚠️ 请您确保当前固件版本大于 4.7.2,若低于此版本建议先升级。"
read -p "👉 如果您已确认,请按 [回车] 继续;否则按 Ctrl+C 或输入任意内容后回车退出:" user_input
if [ -n "$user_input" ]; then
echo "🚫 用户取消安装。"
return 1
fi
do_auto_install_ui_helper
}
#自动安装[官方辅助UI]
do_auto_install_ui_helper() {
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.run $HTTP_HOST/luci-app-uninstall.run && chmod +x /tmp/advanced_uninstall.run
sh /tmp/advanced_uninstall.run
}
while true; do
clear
gl_name=$(get_router_name)
result="GL-iNet MT3600BE 一键iStoreOS风格化"
echo "***********************************************************************"
echo "* 一键安装工具箱(for gl-inet MT3600BE) by @wukongdaily 20251220 "
echo "**********************************************************************"
echo "*******支持的机型列表***************************************************"
green "*******GL-iNet MT3600BE********"
echo
light_magenta " 1. $result"
echo
light_magenta " 2. 安装argon紫色主题"
echo
light_magenta " 3. 单独安装iStore商店"
echo
light_magenta " 4. 隐藏首页格式化按钮"
echo
light_magenta " 5. 自定义风扇启动温度"
echo
light_magenta " 6. 安装个性化UI辅助插件(by VMatrices)"
echo
light_magenta " 7. 安装高级卸载插件"
echo
light_magenta " 8. 恢复出厂设置/重置路由器"
echo
echo " Q. 退出本程序"
echo
read -p "请选择一个选项: " choice
case $choice in
1)
add_arch
#安装iStore风格
install_istore_os_style
#基础必备设置
setup_base_init
#安装iStore商店
do_istore
#安装首页和网络向导
do_quickstart
;;
2)
do_install_argon_skin
;;
3)
do_istore
;;
4)
hide_ui_elements
;;
5)
set_glfan_temp
;;
6)
do_install_ui_helper
;;
7)
advanced_uninstall
;;
8)
recovery
;;
q | Q)
echo "退出"
exit 0
;;
*)
echo "无效选项,请重新选择。"
;;
esac
read -p "按 Enter 键继续..."
done