luci-app-modem: add mwan3 quick config

This commit is contained in:
fujr 2024-05-21 12:40:02 +08:00
parent 12d039cbc5
commit 86b5c73cab
6 changed files with 348 additions and 1 deletions

View File

@ -13,7 +13,8 @@ function index()
end end
entry({"admin", "network", "modem"}, alias("admin", "network", "modem", "modem_info"), translate("Modem"), 100).dependent = true entry({"admin", "network", "modem"}, alias("admin", "network", "modem", "modem_info"), translate("Modem"), 100).dependent = true
--mwan配置
entry({"admin", "network", "modem", "mwan_config"}, cbi("modem/mwan_config"), translate("Mwan Config"), 1).leaf = true
--模块信息 --模块信息
entry({"admin", "network", "modem", "modem_info"}, template("modem/modem_info"), translate("Modem Information"),10).leaf = true entry({"admin", "network", "modem", "modem_info"}, template("modem/modem_info"), translate("Modem Information"),10).leaf = true
entry({"admin", "network", "modem", "get_at_port"}, call("getATPort"), nil).leaf = true entry({"admin", "network", "modem", "get_at_port"}, call("getATPort"), nil).leaf = true

View File

@ -0,0 +1,89 @@
local d = require "luci.dispatcher"
local uci = luci.model.uci.cursor()
local sys = require "luci.sys"
local script_path="/usr/share/modem/"
m = Map("modem_mwan")
m.title = translate("Mwan Config")
m.description = translate("Check and modify the mwan configuration")
s = m:section(NamedSection, "global", "global", translate("gloal Config"))
s.anonymous = true
s.addremove = false
enable_mwan = s:option(Flag, "enable_mwan", translate("Enable MWAN"))
sticky = s:option(Flag,"sticky_mode",translate("sticky mode"))
sticky.default = 0
sticky.description = translate("same source ip address will always use the same wan interface")
sticky_timeout = s:option(Value,"sticky_timeout",translate("sticky timeout"))
sticky_timeout.default = 300
sticky_timeout.datatype = "uinteger"
sticky_timeout:depends("sticky_mode",1)
s = m:section(NamedSection, "ipv4", "ipv4", translate("IPV4 Config"))
s.anonymous = true
s.addremove = false
--设置mwan策略 0:不使用 1:使用(作为后备) 2:使用(作为主要) 3:使用(作为负载均衡)
o = s:option(ListValue, "mwan_policy", translate("MWAN Policy"))
o:value("0", translate("Not Use"))
o:value("1", translate("Use(WWAN As Backup)"))
o:value("2", translate("Use(WWAN As Main)"))
o:value("3", translate("Use(WWAN For Load Balance)"))
--设置mwan 有线wan端口
o = s:option(Value, "wan_ifname", translate("WAN Interface"))
o.rmempty = ture
o.description = translate("Please enter the WAN interface name")
o.template = "cbi/network_netlist"
o.widget = "optional"
o.nocreate = true
o.unspecified = true
--设置mwan wwan端口
o = s:option(Value, "wwan_ifname", translate("WWAN Interface"))
o.rmempty = ture
o.description = translate("Please enter the WWAN interface name")
o.template = "cbi/network_netlist"
o.widget = "optional"
o.nocreate = true
o.unspecified = true
o = s:option(DynamicList, 'track_ip', translate('track_ip'))
o.datatype = 'host'
-- m.title = translate("Mwan Config")
-- m.description = translate("Check and modify the mwan configuration")
-- s = m:section(NamedSection, "ipv6", "ipv6", translate("IPV6 Config"))
-- s.anonymous = true
-- s.addremove = false
-- --设置mwan策略 0:不使用 1:使用(作为后备) 2:使用(作为主要) 3:使用(作为负载均衡)
-- o = s:option(ListValue, "mwan_policy", translate("MWAN Policy"))
-- o:value("0", translate("Not Use"))
-- o:value("1", translate("Use(WWAN As Backup)"))
-- o:value("2", translate("Use(WWAN As Main)"))
-- o:value("3", translate("Use(WWAN For Load Balance)"))
-- --设置mwan 有线wan端口
-- o = s:option(Value, "wan_ifname", translate("WAN Interface"))
-- o.rmempty = ture
-- o.description = translate("Please enter the WAN interface name")
-- o.template = "cbi/network_netlist"
-- o.widget = "optional"
-- o.nocreate = true
-- o.unspecified = true
-- --设置mwan wwan端口
-- o = s:option(Value, "wwan_ifname", translate("WWAN Interface"))
-- o.rmempty = ture
-- o.description = translate("Please enter the WWAN interface name")
-- o.template = "cbi/network_netlist"
-- o.widget = "optional"
-- o.nocreate = true
-- o.unspecified = true
-- o = s:option(DynamicList, 'track_ip', translate('track_ip'))
-- o.datatype = 'host'
return m

View File

@ -0,0 +1,10 @@
config ipv4 'ipv4'
option wan_ifname 'wan'
option wwan_ifname 'wwan_5g_0'
list track_ip 'test.ustc.edu.cn'
list track_ip 'cip.cc'
list track_ip '208.67.222.222'
list track_ip '208.67.220.220'
config global 'global'
option enable_mwan '0'

View File

@ -0,0 +1,53 @@
#!/bin/sh /etc/rc.common
USE_PROCD=1
START=30
set_rule()
{
proto=$1
policy=$2
case $policy in
0)
cmd="stop"
;;
1)
cmd="wan"
;;
2)
cmd="wwan"
;;
3)
cmd="lb"
;;
*)
cmd="stop"
;;
esac
logger -t modem_mwan "before set $proto $cmd"
/usr/share/modem/modem_mwan.sh $proto $cmd
logger -t modem_mwan "set $proto $cmd"
}
start_service() {
logger -t modem_mwan "start modem_mwan"
config_load modem_mwan
config_get enable global enable_mwan 0
if [ "$enable" = "0" ]; then
stop_service
fi
config_get v4 ipv4 mwan_policy 0
set_rule ipv4 $v4
}
stop_service() {
/usr/share/modem/modem_mwan.sh ipv4 stop
/usr/share/modem/modem_mwan.sh ipv4 disable
}
service_triggers() {
procd_add_reload_trigger 'modem_mwan'
}

View File

@ -16,6 +16,8 @@ uci -q batch <<-EOF >/dev/null
delete ucitrack.@modem[-1] delete ucitrack.@modem[-1]
add ucitrack modem add ucitrack modem
set ucitrack.@modem[-1].init=modem set ucitrack.@modem[-1].init=modem
add ucitrack modem
set ucitrack.@modem_mwan[-1].init=modem_mwan
commit ucitrack commit ucitrack
EOF EOF

View File

@ -0,0 +1,192 @@
#! /bin/sh
. /lib/functions.sh
family=$1
config_load modem_mwan
config_get wan "$family" wan_ifname
config_get wwan "$family" wwan_ifname
config_get track_ip "$family" track_ip
config_get sticky_mode global sticky_mode
config_get sticky_timeout global sticky_timeout
append_if(){
interface=$1
track_ip=$2
uci batch <<EOF
set mwan3.$interface=interface
set mwan3.$interface.enabled=1
set mwan3.$interface.family="$family"
set mwan3.$interface.track_method=ping
set mwan3.$interface.reliability='1'
set mwan3.$interface.count='1'
set mwan3.$interface.size='56'
set mwan3.$interface.max_ttl='60'
set mwan3.$interface.timeout='4'
set mwan3.$interface.interval='10'
set mwan3.$interface.failure_interval='5'
set mwan3.$interface.recovery_interval='5'
set mwan3.$interface.down='5'
set mwan3.$interface.up='5'
set mwan3.$interface.add_by=modem
delete mwan3.$interface.track_ip
EOF
if [ -n "$track_ip" ]; then
for ip in $track_ip; do
uci add_list mwan3.$interface.track_ip=$ip
done
fi
}
add_mwan3_member()
{
interface=$1
metric=$2
weight=$3
member_name="${interface}_m_${metric}_w_${weight}"
uci batch <<EOF
set mwan3.$member_name=member
set mwan3.$member_name.interface=$interface
set mwan3.$member_name.metric=$metric
set mwan3.$member_name.weight=$weight
set mwan3.$member_name.add_by=modem
EOF
}
remove_member()
{
config_load mwan3
config_foreach remove_member_cb member
}
remove_member_cb()
{
local add_by
config_get add_by $1 add_by
if [ "$add_by" = "modem" ]; then
uci delete mwan3.$1
fi
}
add_mwan3_policy()
{
policy_name=$1
use_member=$2
uci batch <<EOF
set mwan3.$policy_name=policy
set mwan3.$policy_name.last_resort='default'
set mwan3.$policy_name.add_by=modem
delete mwan3.$policy_name.use_member
EOF
for member in $use_member; do
uci add_list mwan3.$policy_name.use_member=$member
done
}
flush_config(){
config_load mwan3
config_foreach remove_cb interface
config_foreach remove_cb member
config_foreach remove_cb policy
config_foreach remove_cb rule
}
remove_cb(){
local add_by
config_get add_by $1 add_by
if [ "$add_by" = "modem" ]; then
uci delete mwan3.$1
fi
}
add_balance_policy()
{
add_mwan3_member $wan 1 1
add_mwan3_member $wwan 1 1
add_mwan3_policy lb_${family} "${wan}_m_1_w_1 ${wwan}_m_1_w_1"
}
add_wan_prefer_policy()
{
config_load modem_mwan
config_get wan "$family" wan_ifname
config_get wwan "$family" wwan_ifname
config_get track_ip "$family" track_ip
add_mwan3_member $wan 1 1
add_mwan3_member $wwan 2 1
add_mwan3_policy preferwan_${family} "${wan}_w_1_m_1 ${wwan}_w_2_m_1"
}
add_wwan_prefer_policy()
{
add_mwan3_member $wan 2 1
add_mwan3_member $wwan 1 1
add_mwan3_policy preferwwan_${family} "${wan}_w_2_m_1 ${wwan}_w_1_m_1"
}
set_if()
{
family=$1
append_if $wan "$track_ip"
append_if $wwan "$track_ip"
}
gen_if()
{
append_if $wan "$track_ip"
append_if $wwan "$track_ip"
}
gen_rule()
{
use_policy=$1
rule_name=${family}_rule
uci batch <<EOF
set mwan3.$rule_name=rule
set mwan3.$rule_name.family="$family"
set mwan3.$rule_name.sticky=$sticky_mode
set mwan3.$rule_name.proto='all'
set mwan3.$rule_name.use_policy=$use_policy
set mwan3.$rule_name.add_by=modem
EOF
if [ -n "$sticky_timeout" ]; then
uci set mwan3.$rule_name.timeout=$sticky_timeout
fi
}
/etc/init.d/mwan3 stop
case $2 in
"lb")
set_if $family
add_balance_policy
gen_rule lb_${family}
start=start
;;
"wan")
set_if $family
add_wan_prefer_policy
gen_rule preferwan_${family}
start=start
;;
"wwan")
set_if $family
add_wwan_prefer_policy
gen_rule preferwwan_${family}
start=start
;;
"disable")
/etc/init.d/mwan3 stop
flush_config
;;
"stop")
rule_name=${family}_rule
uci delete mwan3.$rule_name
;;
esac
uci commit mwan3
/etc/init.d/mwan3 $start