Files
op-packages/luci-app-wizard/root/etc/init.d/wizard
T

151 lines
4.7 KiB
Bash
Executable File

#!/bin/sh /etc/rc.common
START=99
USE_PROCD=1
# 清理历史已生成的快捷方式(防止改名或删除后遗留失效条目)
clean_shortcuts() {
local sec
# 清理 nginx 中由 wizard 生成的 _sc_* server 节
for sec in $(uci -q show nginx 2>/dev/null | sed -n 's/^nginx\.\(_sc_[^=.]*\)=server$/\1/p'); do
uci -q delete nginx."$sec"
done
# 清理 dhcp (dnsmasq) 中由 wizard 生成的 _sc_* domain 节
for sec in $(uci -q show dhcp 2>/dev/null | sed -n 's/^dhcp\.\(_sc_[^=.]*\)=domain$/\1/p'); do
uci -q delete dhcp."$sec"
done
}
# 处理单条 shortcut 节
process_shortcut() {
local shortcut to_url comments lanaddr
local cfg="$1"
# 获取当前 LAN 口 IP,支持 DSA 列表与 CIDR 掩码剔除
lanaddr="$(uci -q get network.lan.ipaddr | tr ' ' '\n' | head -n1)"
lanaddr="${lanaddr%%/*}"
[ -z "$lanaddr" ] && lanaddr="10.0.0.1"
config_get shortcut "$cfg" shortcut
config_get to_url "$cfg" to_url
config_get comments "$cfg" comments
# 校验必要参数
if [ -z "$shortcut" ] || [ -z "$to_url" ]; then
return 0
fi
# 1. 配置 Nginx 302 重定向 (仅在存在 /etc/nginx/uci.conf 时配置,仅监听80,禁止未配证书监听443)
if [ -f /etc/nginx/uci.conf ]; then
uci -q set nginx._sc_$shortcut=server
uci -q set nginx._sc_$shortcut.server_name="$shortcut"
uci -q add_list nginx._sc_$shortcut.listen="80"
uci -q set nginx._sc_$shortcut.return="302 $to_url"
# 2. 配置 Dnsmasq (DHCP) 本地域名劫持
uci -q set dhcp._sc_$shortcut=domain
uci -q set dhcp._sc_$shortcut.name="$shortcut"
uci -q set dhcp._sc_$shortcut.ip="$lanaddr"
[ -n "$comments" ] && uci -q set dhcp._sc_$shortcut.comments="$comments"
fi
}
# 配置 HTTPS 访问重定向 (适配 Nginx / Lighttpd / uHTTPd)
sethttps() {
local cfg="${1:-default}"
local https
config_get https "$cfg" https 0
if [ -x /etc/init.d/nginx ] && [ -f /etc/nginx/uci.conf ]; then
if [ "x${https}" = "x1" ]; then
if [ -z "$(uci -q get nginx._redirect2ssl)" ]; then
uci -q set nginx._redirect2ssl=server
uci -q set nginx._redirect2ssl.server_name='_redirect2ssl'
uci -q set nginx._redirect2ssl.return='302 https://$host$request_uri'
uci -q set nginx._redirect2ssl.access_log='off; # logd openwrt'
fi
uci -q del nginx.default_server.listen
uci -q add_list nginx.default_server.listen='80'
uci -q add_list nginx.default_server.listen='[::]:80'
uci -q del nginx._redirect2ssl.listen
uci -q add_list nginx._redirect2ssl.listen='80 default_server'
uci -q add_list nginx._redirect2ssl.listen='[::]:80 default_server'
else
uci -q delete nginx._redirect2ssl
uci -q del nginx.default_server.listen
uci -q add_list nginx.default_server.listen='80 default_server'
uci -q add_list nginx.default_server.listen='[::]:80 default_server'
fi
uci -q commit nginx
/etc/init.d/nginx reload >/dev/null 2>&1
elif [ -x /etc/init.d/lighttpd ] && [ -f /etc/lighttpd/conf.d/82-https.conf ]; then
if [ "x${https}" = "x1" ]; then
sed -i "s/^[ \t]*#*[ \t]*url\.redirect[ \t]*=.*/\turl.redirect =/" /etc/lighttpd/conf.d/82-https.conf 2>/dev/null
else
sed -i "s/^[ \t]*url\.redirect[ \t]*=.*/\t# url.redirect =/" /etc/lighttpd/conf.d/82-https.conf 2>/dev/null
fi
/etc/init.d/lighttpd reload >/dev/null 2>&1
elif [ -x /etc/init.d/uhttpd ]; then
if [ "x${https}" = "x1" ]; then
uci -q set uhttpd.main.redirect_https='1'
else
uci -q set uhttpd.main.redirect_https='0'
fi
uci -q commit uhttpd
/etc/init.d/uhttpd reload >/dev/null 2>&1
fi
}
# 提交配置并平滑重载底层服务
reload_services() {
uci -q commit dhcp
if [ -x /etc/init.d/dnsmasq ]; then
/etc/init.d/dnsmasq reload >/dev/null 2>&1
fi
if [ -f /etc/nginx/uci.conf ] && [ -x /etc/init.d/nginx ]; then
uci -q commit nginx
/etc/init.d/nginx reload >/dev/null 2>&1
fi
}
start_service() {
config_load wizard
# 1. 开机 CoreMark 跑分处理 (后台异步执行,杜绝阻塞系统启动与前端保存卡死)
local coremark
config_get coremark default coremark 0
if [ "$coremark" = "1" ] && [ -x /bin/coremark ] && && [ -x /sbin/coremark ][ ! -f /etc/bench.log ] && [ ! -f /var/lock/opkg.lock ]; then
(sleep 5;/sbin/coremark >/dev/null 2>&1) &
fi
# 2. 持久 Cookie 会话配置同步到 LuCI 底层系统
local cookie_p
config_get cookie_p default persistent_cookies 1
if [ -n "$cookie_p" ]; then
[ -z "$(uci -q get luci.sgi)" ] && uci -q set luci.sgi=sgi
uci -q set luci.sgi.persistent_cookies="$cookie_p"
uci -q commit luci
fi
# 3. 清理并重新配置所有 Shortcuts
clean_shortcuts
config_foreach process_shortcut shortcuts
# 4. 设置 HTTPS 重定向
sethttps default
# 5. 提交并重载生效服务
reload_services
}
stop_service() {
clean_shortcuts
reload_services
}
service_triggers() {
procd_add_reload_trigger "wizard"
}