luci add syncdial: muilti-wan syncdial version

This commit is contained in:
coolsnowwolf 2018-11-29 22:09:18 +08:00
parent 12b6db77eb
commit 1f2a40fe9f
6 changed files with 300 additions and 103 deletions

View File

@ -1,25 +1,14 @@
--[[
Sync Dial Luci configuration page.
Copyright (C) 2015 GuoGuo <gch981213@gmail.com>
]]--
module("luci.controller.syncdial", package.seeall)
module("luci.controller.syncdial",package.seeall)
function index()
if not nixio.fs.access("/etc/config/syncdial") then
return
end
local page
page = entry({"admin", "network", "syncdial"}, cbi("syncdial"), _("虚拟WAN"))
page.dependent = true
page = entry({"admin", "network", "macvlan_redial"}, call("redial"), nil)
page.leaf = true
if not nixio.fs.access("/etc/config/syncdial")then
return
end
local e
e=entry({"admin","network","syncdial"},cbi("syncdial"),_("多线多拨"),103)
e.dependent=true
e=entry({"admin","network","macvlan_redial"},call("redial"),nil)
e.leaf=true
end
function redial()
os.execute("killall -9 pppd")
os.execute("killall -9 pppd")
end

View File

@ -1,37 +1,62 @@
--[[
Sync Dial Luci configuration page.
Copyright (C) 2015 GuoGuo <gch981213@gmail.com>
]]--
local fs = require "nixio.fs"
local cmd = "mwan3 status | grep -c \"is online and tracking is active\""
local shellpipe = io.popen(cmd,"r")
local ifnum = shellpipe:read("*a")
shellpipe:close()
m = Map("syncdial", translate("创建虚拟WAN接口"),
translatef("使用macvlan驱动创建多个虚拟WAN口。<br />当前在线接口数量:")..ifnum)
s = m:section(TypedSection, "syncdial", translate(" "))
s.anonymous = true
switch = s:option(Flag, "enabled", "启用")
switch.rmempty = false
--s:option(Flag, "force_redial", "强制全部重拨", "如果有接口掉线则强制所有接口下线重拨。").rmempty = false
wannum = s:option(Value, "wannum", "虚拟WAN接口数量")
wannum.datatype = "range(0,20)"
wannum.optional = false
s:option(Flag, "old_frame", "使用旧的macvlan创建方式").rmempty = false
o = s:option(DummyValue, "_redial", "重新并发拨号")
o.template = "syncdial/redial_button"
o.width = "10%"
local e=require"nixio.fs"
require("luci.tools.webadmin")
local e="mwan3 status | grep -c \"is online and tracking is active\""
local e=io.popen(e,"r")
local t=e:read("*a")
e:close()
m=Map("syncdial",translate("多线多拨"),
translate("使用macvlan驱动创建多个虚拟WAN口支持并发多拨 <br />当前在线接口数量:")..t)
s=m:section(TypedSection,"syncdial",translate(" "))
s.anonymous=true
o=s:option(Flag,"enabled","启用")
o.rmempty=false
o=s:option(Flag,"syncon","启用并发多拨")
o.rmempty=false
o=s:option(ListValue,"dial_type",translate("多拨类型"))
o:value("1",translate("单线多拨"))
o:value("2",translate("双线多拨"))
o.rmempty=false
o=s:option(Value,"wanselect",translate("选择外网接口"),translate("指定要多拨的外网接口如wan"))
luci.tools.webadmin.cbi_add_networks(o)
o.optional=false
o.rmempty=false
o=s:option(Value,"wannum","虚拟WAN接口数量")
o.datatype="range(0,249)"
o.optional=false
o.default=1
o=s:option(Flag,"bindwan","绑定物理接口")
o.rmempty=false
o=s:option(Value,"wanselect2",translate("选择第二个外网接口"),translate("<font color=\"red\">指定要多拨的第二个外网接口如wan2</font>"))
luci.tools.webadmin.cbi_add_networks(o)
o.optional=false
o:depends("dial_type","2")
o=s:option(Value,"wannum2",translate("第二条线虚拟WAN接口数量"),translate("设置第二条线的拨号数"))
o.datatype="range(0,249)"
o.optional=false
o.default=1
o:depends("dial_type","2")
o=s:option(Flag,"bindwan2","绑定物理接口","第二条线生成的虚拟接口绑定当前物理接口")
o.rmempty=false
o:depends("dial_type","2")
o=s:option(Flag,"dialchk","启用掉线检测")
o.rmempty=false
o=s:option(Value,"dialnum","最低在线接口数量","如果在线接口数量小于这个值则重拨。")
o.datatype="range(0,248)"
o.optional=false
o.default=2
o=s:option(Value,"dialnum2","第二条线最低在线接口数量","如果第二条线在线接口数量小于这个值则重拨。")
o.datatype="range(0,248)"
o.optional=false
o.default=2
o:depends("dial_type","2")
o=s:option(Value,"dialwait","重拨等待时间","重拨时,接口全部下线后下一次拨号前的等待时间。单位:秒 最小值5秒")
o.datatype="and(uinteger,min(5))"
o.optional=false
o=s:option(Flag,"old_frame","使用旧的macvlan创建方式")
o.rmempty=false
o=s:option(Flag,"nomwan","不自动配置MWAN3负载均衡","需要自定义负载均衡设置或者要使用策略路由的用户选择")
o.rmempty=false
o=s:option(DummyValue,"_redial","重新并发拨号")
o.template="syncdial/redial_button"
o.width="10%"
return m

View File

@ -1,5 +1,5 @@
<%+cbi/valueheader%>
<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
<script type="text/javascript" src="<%=resource%>/cbi.js?v=git-17.110.13538-6360059"></script>
<script type="text/javascript">//<![CDATA[
function do_macvlan_redial()

View File

@ -1,11 +1,34 @@
#!/bin/sh
#macvlan及PPPoE拨号接口配置批量自动生成脚本
#Copyright (C) 2015 GuoGuo<gch981213@gmail.com>
#Copyright (C) 2016
. /lib/functions.sh
#检测IP列表
chk_ip_list="$(cat /tmp/resolv.conf.auto | grep nameserver | cut -d' ' -f2 | sort -u | tr '\n' ' ') 115.239.210.27 115.239.211.112 220.181.112.244 220.181.111.188 114.114.114.114 114.114.115.115"
fw_str="wan wan6"
chk_ip_list="www.baidu.com 114.114.114.114 119.29.29.29"
origfirewall=$(uci get firewall.@zone[1].network)
backupdev=$(uci get syncdial.config.devbackup)
norun=$(echo $origfirewall|grep vwan)
nomwan=$(uci get syncdial.config.nomwan)
wanselect=$(uci get syncdial.config.wanselect)
wannum=$(uci get syncdial.config.wannum)
oldframe=$(uci get syncdial.config.old_frame)
bindwan=$(uci -q get syncdial.config.bindwan)
dial_type=$(uci get syncdial.config.dial_type)
[ "$dial_type" -eq 2 ] && {
wanselect2=$(uci get syncdial.config.wanselect2)
[ $? -ne 0 ] && {
logger -t Syncppp "You must select another pppoe interface ! 启用双线多拨必须同时选择第二个外网接口!"
return 0
}
wannum2=$(uci get syncdial.config.wannum2)
[ $? -ne 0 ] && {
logger -t Syncppp "When dualdial is enabled, the number of the second virtual WAN cannot be blank! 启用双线多拨时第二个虚拟WAN接口数不能为空"
return 0
}
bindwan2=$(uci -q get syncdial.config.bindwan2)
}
#添加MWAN负载均衡相关配置
#$1:接口名称
@ -13,16 +36,23 @@ mwan_cfg_add() {
#gen mwan3_interface
uci set mwan3.${1}=interface
uci set mwan3.${1}.enabled=1
uci set mwan3.${1}.count=1
uci set mwan3.${1}.count=2
uci set mwan3.${1}.timeout=2
uci set mwan3.${1}.interval=5
uci set mwan3.${1}.down=3
uci set mwan3.${1}.up=2
uci set mwan3.${1}.down=4
uci set mwan3.${1}.up=1
for i in $chk_ip_list
do
uci add_list mwan3.${1}.track_ip="$i"
done
uci set mwan3.${1}.reliability=1
uci set mwan3.${1}.initial_state=online
uci set mwan3.${1}.family=ipv4
uci set mwan3.${1}.track_method=ping
uci set mwan3.${1}.size=56
uci set mwan3.${1}.failure_interval=5
uci set mwan3.${1}.recovery_interval=5
uci set mwan3.${1}.flush_conntrack=never
#gen mwan3_member
uci set mwan3.${1}_m1_w1=member
uci set mwan3.${1}_m1_w1.interface=${1}
@ -52,6 +82,8 @@ macvlan_dev_add() {
#添加PPPoE接口
#$1:接口名称 $2:设备名称 $3:账户 $4:密码 $5:网关跃点
pppoe_if_add() {
#gen vwan macaddr
NEW_MACADDR=$(openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/.$//')
#gen wan if
uci set network.${1}=interface
uci set network.${1}.ifname=${2}
@ -59,33 +91,61 @@ pppoe_if_add() {
uci set network.${1}.username=${3}
uci set network.${1}.password=${4}
uci set network.${1}.metric=${5}
uci set network.${1}.macaddr=$NEW_MACADDR
#gen firewall
fw_str="${fw_str} ${1}"
uci add_list firewall.@zone[1].network=${1}
}
orig_firewall_add() {
need_del_rule=`uci -q get firewall.@zone[1].network | awk -F"'" '{print $2}'`
uci del_list firewall.@zone[1].network="$need_del_rule"
for k in $( seq 1 250 )
do
origdev=$(echo $origfirewall | cut -d " " -f$k)
if [ -z "$origdev" ]; then
break
fi
[ -z "$(uci get firewall.@zone[1].network | grep -w $origdev)" ] && uci add_list firewall.@zone[1].network=$origdev
done
}
apply_cfg() {
uci commit
/etc/init.d/network restart
#/etc/init.d/network restart &
logger -t Syncppp "Apply syncdial configuaration."
ifup wan &
killall pppconnectcheck
/etc/init.d/firewall restart
mwan3 restart
}
general_config_load() {
config_load 'syncdial'
config_get_bool enabled 'config' 'enabled'
config_get_bool old_frame 'config' 'old_frame'
[ $enabled -eq 0 ] && {
congig_get_bool dial_type 'config' 'dial_type'
if [ "$enabled" -eq 0 ]; then
if [ "$old_frame" -eq 1 ]; then
mwan_cfg_add $wanselect
if [ "$dial_type" -eq 2 ]; then
mwan_cfg_add $wanselect2
fi
fi
echo "Disabled.Exit now."
apply_cfg
exit 1
}
config_get wannum 'config' 'wannum'
fi
config_load 'network'
config_get pppoe_user 'wan' 'username'
config_get pppoe_password 'wan' 'password'
pppoe_ifname=$(uci get network.wan.ifname)
config_get pppoe_user $wanselect 'username'
config_get pppoe_password $wanselect 'password'
pppoe_ifname=$(uci get network.$wanselect.ifname)
[ "$dial_type" -eq 2 ] && {
config_get pppoe_user2 $wanselect2 'username'
config_get pppoe_password2 $wanselect2 'password'
pppoe_ifname2=$(uci get network.$wanselect2.ifname)
}
}
check_remove_device() {
@ -97,47 +157,122 @@ check_remove_interface() {
local ifcfg=${1}
[ ${ifcfg::4} == 'vwan' ] && {
uci del network.${ifcfg}
mwan_cfg_del ${ifcfg}
uci del_list firewall.@zone[1].network=${ifcfg}
[ "$nomwan" -ne 1 ] && mwan_cfg_del ${ifcfg}
}
uci set firewall.@zone[1].network="$backupdev"
}
general_config_remove() {
config_load network
config_foreach check_remove_device 'device'
config_foreach check_remove_interface 'interface'
[ $(uci get network.wan.proto) == "none" ] && {
uci set network.wan.proto=pppoe
all_macvlans=`ip link show |grep macvlan | awk -F":" '{print $2}' | awk -F"@" '{print $1}'`
[ -n "$all_macvlans" ] && {
for macvlan in $all_macvlans
do
ip link delete $macvlan
done
}
[ "$(uci get network.$wanselect.proto)" == "none" ] && {
uci set network.$wanselect.proto=pppoe
}
if [ "$oldframe" -eq 0 ]; then
[ "$wanselect" != "$(echo $(uci get syncdial.config.devbackup)| cut -d " " -f1)" ] && \
[ "$wanselect" != "$(echo $(uci get syncdial.config.devbackup)| cut -d " " -f2)" ] && \
[ "$nomwan" -ne 1 ] && mwan_cfg_del $wanselect
else
[ "$nomwan" -ne 1 ] && mwan_cfg_del $wanselect
fi
[ "$dial_type" -eq 2 ] && {
[ $(uci get network.$wanselect2.proto) == "none" ] && {
uci set network.$wanselect2.proto=pppoe
}
if [ "$oldframe" -eq 0 ]; then
[ "$wanselect2" != "$(echo $(uci get syncdial.config.devbackup)| cut -d " " -f1)" ] && \
[ "$wanselect2" != "$(echo $(uci get syncdial.config.devbackup)| cut -d " " -f2)" ] && \
[ "$nomwan" -ne 1 ] && mwan_cfg_del $wanselect2
else
[ "$nomwan" -ne 1 ] && mwan_cfg_del $wanselect2
fi
}
mwan_cfg_del 'wan'
uci set firewall.@zone[1].network="wan wan6"
}
[ -z "$norun" ] && uci set syncdial.config.devbackup="$origfirewall" && uci commit syncdial
general_config_remove
general_config_load
uci set network.wan.metric=40
[ $old_frame -eq 1 ] && {
uci set network.wan.proto=none
ifname=$(uci get network.wan.ifname)
uci set network.$wanselect.metric=40
if [ "$wannum" -gt 0 ]; then
[ "$old_frame" -eq 1 ] && {
uci set network.$wanselect.proto=none
ifname=$(uci get network.$wanselect.ifname)
for i in $(seq 1 $wannum)
do
ip link add link $ifname name macvlan$i type macvlan
ifconfig macvlan$i hw ether $(echo $(cat /sys/class/net/$ifname/address|awk -F ":" '{print $1":"$2":"$3":"$4":"$5":" }')$(echo "" | awk -F ":" '{printf("%X\n", 16+i);}' i=$i))
ifconfig macvlan$i up
done
}
[ "$wanselect" != "$(echo $(uci get syncdial.config.devbackup)| cut -d " " -f1)" ] && \
[ "$wanselect" != "$(echo $(uci get syncdial.config.devbackup)| cut -d " " -f2)" ] && \
[ "$old_frame" -eq 0 -a "$nomwan" -ne 1 ] && mwan_cfg_add $wanselect
for i in $(seq 1 $wannum)
do
ip link add link $ifname name macvlan$i type macvlan
ifconfig macvlan$i hw ether $(echo $(cat /sys/class/net/$ifname/address|awk -F ":" '{print $1":"$2":"$3":"$4":"$5":" }')$(echo "" | awk -F ":" '{printf("%X\n", 16+i);}' i=$i))
ifconfig macvlan$i up
[ "$old_frame" -eq 0 ] && macvlan_dev_add macvlan$i $pppoe_ifname
if [ "$bindwan" != "" -a "$bindwan" == "1" ]; then
pppoe_if_add vwan$i $pppoe_ifname $pppoe_user $pppoe_password $((40+$i))
else
pppoe_if_add vwan$i macvlan$i $pppoe_user $pppoe_password $((40+$i))
fi
[ "$nomwan" -ne 1 ] && mwan_cfg_add vwan$i
done
else
[ "$nomwan" -ne 1 ] && mwan_cfg_add $wanselect
fi
###dualdial configuration
[ "$(uci -q get syncdial.config.dial_type)" = "2" ] && {
uci set network.$wanselect2.metric=60
if [ "$wannum2" -gt 0 ]; then
[ "$old_frame" -eq 1 ] && {
uci set network.$wanselect2.proto=none
ifname2=$(uci get network.$wanselect2.ifname)
for i in $(seq 1 $wannum2)
do
ip link add link $ifname2 name macvlan$(($wannum+$i)) type macvlan
ifconfig macvlan$(($wannum+$i)) hw ether $(echo $(cat /sys/class/net/$ifname2/address|awk -F ":" '{print $1":"$2":"$3":"$4":"$5":" }')$(echo "" | awk -F ":" '{printf("%X\n", 16+i);}' i=$i))
ifconfig macvlan$(($wannum+$i)) up
done
}
[ "$wanselect2" != "$(echo $(uci get syncdial.config.devbackup)| cut -d " " -f1)" ] && \
[ "$wanselect2" != "$(echo $(uci get syncdial.config.devbackup)| cut -d " " -f2)" ] && \
[ "$old_frame" -eq 0 -a "$nomwan" -ne 1 ] && mwan_cfg_add $wanselect2
for i in $(seq 1 $wannum2)
do
[ "$old_frame" -eq 0 ] && macvlan_dev_add macvlan$(($wannum+$i)) $pppoe_ifname2
if [ "$bindwan2" != "" -a "$bindwan2" == "1" ]; then
pppoe_if_add vwan$(($wannum+$i)) $pppoe_ifname2 $pppoe_user2 $pppoe_password2 $((60+$i))
else
pppoe_if_add vwan$(($wannum+$i)) macvlan$(($wannum+$i)) $pppoe_user2 $pppoe_password2 $((60+$i))
fi
[ "$nomwan" -ne 1 ] && mwan_cfg_add vwan$(($wannum+$i))
done
else
[ "$nomwan" -ne 1 ] && mwan_cfg_add $wanselect2
fi
}
[ $old_frame -eq 0 ] && mwan_cfg_add wan
for i in $(seq 1 $wannum)
do
[ $old_frame -eq 0 ] && macvlan_dev_add macvlan$i $pppoe_ifname
pppoe_if_add vwan$i macvlan$i $pppoe_user $pppoe_password $((40+$i))
mwan_cfg_add vwan$i
done
uci set firewall.@zone[1].network="$fw_str"
orig_firewall_add
apply_cfg
return 0

View File

@ -1,7 +1,19 @@
config syncdial 'config'
option 'enabled' '0'
option 'wannum' '2'
option 'dialchk' '0'
option 'dialnum' '1'
option 'dialwait' '25'
option 'old_frame' '1'
option syncon '1'
option dialwait '25'
option dialchk '1'
option nomwan '0'
option wanselect 'wan'
option dial_type '2'
option wannum '3'
option wanselect2 'wan2'
option wannum2 '2'
option dialnum '3'
option dialnum2 '2'
option old_frame '1'
option devbackup 'wan wan6 wan2'
option bindwan '0'
option bindwan2 '0'
option enabled '0'

View File

@ -0,0 +1,36 @@
#!/bin/sh
[ "$ACTION" = "ifdown" ] && pppconnectcheck &
wanselect=$(uci get syncdial.config.wanselect)
[ "$(uci get syncdial.config.dial_type)" = "2" ] && {
wanselect2=$(uci get syncdial.config.wanselect2)
}
[ "$(uci get syncdial.config.enabled)" = "1" ] && \
[ "$(uci get syncdial.config.old_frame)" = "1" ] && \
[ "$DEVICE" = "$(uci get network.$wanselect.ifname)" ] && \
[ "$ACTION" = "ifup" ] && {
ifname=$(uci get network.$wanselect.ifname)
wannum=$(uci get syncdial.config.wannum)
for i in $(seq 1 $wannum)
do
[ -d /sys/class/net/macvlan$i ] || {
ip link add link $ifname name macvlan$i type macvlan
ifconfig macvlan$i hw ether $(echo $(cat /sys/class/net/$ifname/address|awk -F ":" '{print $1":"$2":"$3":"$4":"$5":" }')$(echo "" | awk -F ":" '{printf("%X\n", 16+i);}' i=$i))
ifconfig macvlan$i up
}
done
[ "$(uci get syncdial.config.dial_type)" = "2" ] && {
ifname2=$(uci get network.$wanselect2.ifname)
wannum2=$(uci get syncdial.config.wannum2)
for i in $(seq 1 $wannum2)
do
[ -d /sys/class/net/macvlan$(($wannum+$i)) ] || {
ip link add link $ifname2 name macvlan$(($wannum+$i)) type macvlan
ifconfig macvlan$(($wannum+$i)) hw ether $(echo $(cat /sys/class/net/$ifname2/address|awk -F ":" '{print $1":"$2":"$3":"$4":"$5":" }')$(echo "" | awk -F ":" '{printf("%X\n", 16+i);}' i=$i))
ifconfig macvlan$(($wannum+$i)) up
}
done
}
}