luci-app-modem: add mwan3 quick config
This commit is contained in:
parent
12d039cbc5
commit
86b5c73cab
@ -13,7 +13,8 @@ function index()
|
||||
end
|
||||
|
||||
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", "get_at_port"}, call("getATPort"), nil).leaf = true
|
||||
|
89
luci-app-modem/luasrc/model/cbi/modem/mwan_config.lua
Normal file
89
luci-app-modem/luasrc/model/cbi/modem/mwan_config.lua
Normal 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
|
10
luci-app-modem/root/etc/config/modem_mwan
Normal file
10
luci-app-modem/root/etc/config/modem_mwan
Normal 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'
|
53
luci-app-modem/root/etc/init.d/modem_mwan
Executable file
53
luci-app-modem/root/etc/init.d/modem_mwan
Executable 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'
|
||||
}
|
@ -16,6 +16,8 @@ uci -q batch <<-EOF >/dev/null
|
||||
delete ucitrack.@modem[-1]
|
||||
add ucitrack modem
|
||||
set ucitrack.@modem[-1].init=modem
|
||||
add ucitrack modem
|
||||
set ucitrack.@modem_mwan[-1].init=modem_mwan
|
||||
commit ucitrack
|
||||
EOF
|
||||
|
||||
|
192
luci-app-modem/root/usr/share/modem/modem_mwan.sh
Executable file
192
luci-app-modem/root/usr/share/modem/modem_mwan.sh
Executable 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
|
Loading…
x
Reference in New Issue
Block a user