2018-11-29 22:09:18 +08:00

279 lines
8.4 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/sh
#macvlan及PPPoE拨号接口配置批量自动生成脚本
#Copyright (C) 2016
. /lib/functions.sh
#检测IP列表
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:接口名称
mwan_cfg_add() {
#gen mwan3_interface
uci set mwan3.${1}=interface
uci set mwan3.${1}.enabled=1
uci set mwan3.${1}.count=2
uci set mwan3.${1}.timeout=2
uci set mwan3.${1}.interval=5
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}
uci set mwan3.${1}_m1_w1.metric=1
uci set mwan3.${1}_m1_w1.weight=1
#gen mwan3_policy
uci add_list mwan3.balanced.use_member=${1}_m1_w1
}
#删除MWAN负载均衡相关配置
#$1:接口名称
mwan_cfg_del() {
uci del mwan3.${1}
uci del mwan3.${1}_m1_w1
uci del_list mwan3.balanced.use_member=${1}_m1_w1
}
#添加macvlan设备
#$1:设虚拟备名称 $2:原始设备名称
macvlan_dev_add() {
uci set network.macvlandev_${1}=device
uci set network.macvlandev_${1}.name=${1}
uci set network.macvlandev_${1}.ifname=${2}
uci set network.macvlandev_${1}.type=macvlan
}
#添加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}
uci set network.${1}.proto=pppoe
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
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 &
logger -t Syncppp "Apply syncdial configuaration."
ifup wan &
killall pppconnectcheck
}
general_config_load() {
config_load 'syncdial'
config_get_bool enabled 'config' 'enabled'
config_get_bool old_frame 'config' 'old_frame'
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
fi
config_load 'network'
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() {
local devcfg=${1}
[ ${devcfg::11} == 'macvlandev_' ] && uci del network.${devcfg}
}
check_remove_interface() {
local ifcfg=${1}
[ ${ifcfg::4} == 'vwan' ] && {
uci del network.${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'
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
}
}
[ -z "$norun" ] && uci set syncdial.config.devbackup="$origfirewall" && uci commit syncdial
general_config_remove
general_config_load
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
[ "$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
}
orig_firewall_add
apply_cfg
return 0