mirror of
				https://github.com/Ysurac/openmptcprouter-feeds.git
				synced 2025-03-09 15:40:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			151 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
#!/bin/sh /etc/rc.common
 | 
						|
 | 
						|
START=4
 | 
						|
USE_PROCD=1
 | 
						|
 | 
						|
_setup_macaddr() {
 | 
						|
	uci -q get "network.$1_dev.macaddr" >/dev/null && return
 | 
						|
	uci -q set "network.$1_dev.macaddr=$2"
 | 
						|
}
 | 
						|
 | 
						|
_save_macaddr() {
 | 
						|
	local _ifname
 | 
						|
	local _macaddr
 | 
						|
	uci -q get "network.$1_dev.ifname" >/dev/null && {
 | 
						|
		_ifname=$(uci -q get "network.$1.ifname")
 | 
						|
		if [ -n "$(uci -q get network.$1.macaddr)" ] &&  [ "$(uci -q get network.$1.macaddr)" != "$(uci -q get network.$1_dev.macaddr)" ]; then
 | 
						|
			uci -q set network.$1_dev.macaddr="$(uci -q get network.$1.macaddr)"
 | 
						|
		else
 | 
						|
			_macaddr=$(ip link show dev $_ifname 2>/dev/null | grep link | awk '{print $2}')
 | 
						|
			[ -n "$_macaddr" ] && {
 | 
						|
				uci -q set network.$1_dev.macaddr=$_macaddr
 | 
						|
				uci -q set network.$1.macaddr=$_macaddr
 | 
						|
			}
 | 
						|
		fi
 | 
						|
	}
 | 
						|
	[ -z "$(uci -q get network.$1.macaddr)" ] && {
 | 
						|
		_ifname=$(uci -q get "network.$1.ifname")
 | 
						|
		[ -n "$_ifname" ] && {
 | 
						|
			_macaddr=$(ip link show dev $_ifname 2>/dev/null | grep link | awk '{print $2}')
 | 
						|
			[ -n "$_macaddr" ] && {
 | 
						|
				uci -q set network.$1.macaddr=$_macaddr
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
_create_interface() {
 | 
						|
	local _masterifname
 | 
						|
	local _ifname=$1
 | 
						|
	config_get _masterifname "$1" ifname
 | 
						|
	uci batch <<-EOF
 | 
						|
		set network.$_ifname=interface
 | 
						|
		set network.$_ifname.type=macvlan
 | 
						|
		set network.$_ifname.proto=static
 | 
						|
		set network.$_ifname.masterintf=$_masterifname
 | 
						|
	EOF
 | 
						|
}
 | 
						|
 | 
						|
# Configuration by interface
 | 
						|
_setup_interface() {
 | 
						|
	local _ifname
 | 
						|
	config_get _ifname "$1" ifname
 | 
						|
	#[ -z "$_ifname" ] && config_get _ifname "$1" ifname
 | 
						|
	# do not create macvlan for vlan
 | 
						|
	#case "$_ifname" in
 | 
						|
	#	eth*.*) return ;;
 | 
						|
	#esac
 | 
						|
	local _type
 | 
						|
	config_get _type "$1" type
 | 
						|
 | 
						|
	[ "$_type" = "macvlan" ] && [ "$(uci -q get macvlan.$1)" = "" ] && {
 | 
						|
		uci -q batch <<-EOF
 | 
						|
			delete network.$1
 | 
						|
			delete network.$1_dev
 | 
						|
			commit network
 | 
						|
		EOF
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	[ "$(echo $1 | grep _dev)" != "" ] && {
 | 
						|
		local _intfdev=$(sed 's/_dev//' $1)
 | 
						|
		uci -q get "network.$_intfdev.ifname" >/dev/null || {
 | 
						|
			logger -t "macvlan" "Remove network.$1"
 | 
						|
			uci -q batch <<-EOF
 | 
						|
			delete network.$1
 | 
						|
			commit network
 | 
						|
			delete macvlan.$1
 | 
						|
			commit macvlan
 | 
						|
			EOF
 | 
						|
		}
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	#_type="$(uci -q get network.$1.type)
 | 
						|
	if [ "$(uci -q get macvlan.$1)" != "" ]; then
 | 
						|
		_type="macvlan"
 | 
						|
	fi
 | 
						|
 | 
						|
	uci -q get "network.$1_dev.ifname" >/dev/null && {
 | 
						|
		uci -q set network.$1_dev.mtu=$(uci -q get network.$1.mtu)
 | 
						|
		[ -n "$(uci -q get macvlan.$1.ifname)" ] && uci -q set network.$1_dev.ifname=$(uci -q get macvlan.$1.ifname)
 | 
						|
		[ -z "$(uci -q get network.$1.masterintf)" ] && uci -q set network.$1.masterintf=$(uci -q get network.$1_dev.ifname)
 | 
						|
		[ -n "$(uci -q get network.$1.masterintf)" ] && uci -q set network.$1_dev.ifname=$(uci -q get network.$1.masterintf)
 | 
						|
		[ -z "$(uci -q get network.$1.macaddr)" ] && uci -q set network.$1_dev.macaddr=$(uci -q get network.$1.macaddr)
 | 
						|
		[ "$_type" = "macvlan" ] || {
 | 
						|
			logger -t "macvlan" "Remove network.$1_dev"
 | 
						|
			uci -q batch <<-EOF
 | 
						|
			delete network.$1_dev
 | 
						|
			EOF
 | 
						|
		}
 | 
						|
		[ "$_type" = "macvlan" ] && {
 | 
						|
			local interface
 | 
						|
			config_get _interface "$1" interface
 | 
						|
			[ -n "$_interface" ] && {
 | 
						|
				logger -t "macvlan" "Remove network.$1_dev"
 | 
						|
				uci -q batch <<-EOF
 | 
						|
				delete network.$1
 | 
						|
				set network.$1_dev.ifname=$_interface
 | 
						|
				EOF
 | 
						|
			}
 | 
						|
		}
 | 
						|
		uci -q commit network
 | 
						|
		return 0
 | 
						|
	}
 | 
						|
	
 | 
						|
	[ "$_type" = "macvlan" ] || return 0
 | 
						|
	[ -z "$_ifname" ] && _ifname=$(uci -q get macvlan.$1.ifname)
 | 
						|
	uci -q batch <<-EOF
 | 
						|
	set network.$1_dev=device
 | 
						|
	set network.$1_dev.name=$1
 | 
						|
	set network.$1_dev.type=macvlan
 | 
						|
	set network.$1_dev.ifname=$_ifname
 | 
						|
	set network.$1.ifname=$1
 | 
						|
	set network.$1.masterintf=$_ifname
 | 
						|
	set network.$1.type=macvlan
 | 
						|
	set network.$1.defaultroute=0
 | 
						|
	EOF
 | 
						|
	
 | 
						|
	_macaddr=$(uci -q get "network.$1.macaddr")
 | 
						|
	_setup_macaddr "$1" "${_macaddr:-auto$(date +%s)}"
 | 
						|
	uci -q set network.$1_dev.mtu=$(uci -q get network.$1.mtu)
 | 
						|
	uci -q commit network
 | 
						|
}
 | 
						|
 | 
						|
start_service() {
 | 
						|
	. /lib/functions.sh
 | 
						|
	config_load macvlan
 | 
						|
	config_foreach _create_interface macvlan
 | 
						|
	config_load network
 | 
						|
	config_foreach _setup_interface interface
 | 
						|
	config_foreach _save_macaddr interface
 | 
						|
	uci -q commit network
 | 
						|
}
 | 
						|
 | 
						|
reload_service() {
 | 
						|
	start
 | 
						|
}
 | 
						|
 | 
						|
service_triggers() {
 | 
						|
	procd_add_reload_trigger network macvlan
 | 
						|
}
 |