307 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			307 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| . /etc/rc.conf
 | |
| . /etc/rc.d/functions
 | |
| 
 | |
| for s in wireless bonding bridges dhcpcd; do
 | |
| 	[[ -f /etc/conf.d/$s ]] && . "/etc/conf.d/$s"
 | |
| done
 | |
| 
 | |
| # helper function to determine if legacy network support is needed
 | |
| need_legacy() {
 | |
| 	# complain when `interface' is unset and `INTERFACES' has profiles enabled
 | |
| 	if [[ -z $interface && ${INTERFACES[@]##!*} ]]; then
 | |
| 		return 0 # need legacy
 | |
| 	fi
 | |
| 
 | |
| 	return 1 # enough present for iproute2 support
 | |
| }
 | |
| 
 | |
| deprecated() {
 | |
| 	print_depr "The legacy network settings format" "rc.conf(5)"
 | |
| }
 | |
| 
 | |
| network_up() {
 | |
| 	if [[ $address ]]; then
 | |
| 		ip link set dev $interface up || return 1
 | |
| 		ip addr add $address/${netmask:-24} broadcast ${broadcast:-+} dev $interface || return 1
 | |
| 		[[ $gateway ]] && { ip route add default via $gateway || return 1; }
 | |
| 	else
 | |
| 		dhcpcd $DHCPCD_ARGS $interface || return 1
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| network_down() {
 | |
| 	if [[ ! -n $interface ]]; then
 | |
| 		if [[ -f /run/dhcpcd.pid ]]; then
 | |
| 			dhcpcd -qk || return 1
 | |
| 		fi
 | |
| 	else
 | |
| 		if [[ ! -n $address && -f /run/dhcpcd-$interface.pid ]]; then
 | |
| 			dhcpcd -qk $interface || return 1
 | |
| 		else
 | |
| 			ip addr flush dev $interface || return 1
 | |
| 		fi
 | |
| 		ip link set dev $interface down || return 1
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| ifup() {
 | |
| 	local ifcfg=${!1}
 | |
| 
 | |
| 	if [[ ! $1 ]]; then
 | |
| 		echo "usage: $0 ifup <interface_name>"
 | |
| 		return 1
 | |
| 	fi
 | |
| 
 | |
| 	# Get the name of the interface from the first token in the string
 | |
| 	if [[ $ifcfg = dhcp ]]; then
 | |
| 		ifname=$1
 | |
| 	else
 | |
| 		ifname=${ifcfg%% *}
 | |
| 	fi
 | |
| 
 | |
| 	ifconfig $ifname up
 | |
| 
 | |
| 	wi_up $1 || return 1
 | |
| 
 | |
| 	if [[ $ifcfg = dhcp ]]; then
 | |
| 		# remove the .pid file if it exists
 | |
| 		rm -f /run/dhcpcd-${1}.pid >/dev/null 2>&1
 | |
| 		rm -f /run/dhcpcd-${1}.cache >/dev/null 2>&1
 | |
| 		dhcpcd $DHCPCD_ARGS ${1}
 | |
| 	else
 | |
| 		ifconfig $ifcfg
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| wi_up() {
 | |
| 	local iwcfg=wlan_$1
 | |
| 
 | |
| 	[[ ${!iwcfg} ]] || return 0
 | |
| 
 | |
| 	iwconfig ${!iwcfg}
 | |
| 	[[ $WIRELESS_TIMEOUT ]] || WIRELESS_TIMEOUT=2
 | |
| 	sleep $WIRELESS_TIMEOUT
 | |
| 
 | |
| 	bssid=$(iwgetid $1 -ra)
 | |
| 	if [[ $bssid = 00:00:00:00:00:00 ]]; then
 | |
| 		printhl "Could not associate $1 - try increasing WIRELESS_TIMEOUT and check network is WEP or has no security"
 | |
| 		return 1
 | |
| 	fi
 | |
| 	return 0
 | |
| }
 | |
| 
 | |
| ifdown() {
 | |
| 	local ifcfg=${!1}
 | |
| 
 | |
| 	if [[ ! $1 ]]; then
 | |
| 		echo "usage: $0 ifdown <interface_name>"
 | |
| 		return 1
 | |
| 	fi
 | |
| 
 | |
| 	if [[ $ifcfg = dhcp && -f /run/dhcpcd-${1}.pid ]]; then
 | |
| 		dhcpcd -k ${1} >/dev/null 2>&1
 | |
| 	fi
 | |
| 	# Always bring the interface itself down
 | |
| 	ifconfig ${1} down >/dev/null 2>&1
 | |
| }
 | |
| 
 | |
| iflist() {
 | |
| 	for ifline in ${INTERFACES[@]}; do
 | |
| 		if [[ $ifline = ${ifline#!} ]]; then
 | |
| 			printf " $ifline:\t"
 | |
| 		else
 | |
| 			printf "$ifline:\t"
 | |
| 		fi
 | |
| 		echo ${!ifline#!}
 | |
| 	done
 | |
| }
 | |
| 
 | |
| rtup() {
 | |
| 	local routecfg=${!1}
 | |
| 
 | |
| 	if [[ ! $1 ]]; then
 | |
| 		echo "usage: $0 rtup <route_name>"
 | |
| 		return 1
 | |
| 	fi
 | |
| 
 | |
| 	if [[ $routecfg =~ :: ]]; then
 | |
| 		route -A inet6 add $routecfg
 | |
| 	else
 | |
| 		route add $routecfg
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| rtdown() {
 | |
| 	local routecfg=${!1}
 | |
| 
 | |
| 	if [[ ! $1 ]]; then
 | |
| 		echo "usage: $0 rtdown <route_name>"
 | |
| 		return 1
 | |
| 	fi
 | |
| 
 | |
| 	if [[ $routecfg =~ :: ]]; then
 | |
| 		route -A inet6 del $routecfg
 | |
| 	else
 | |
| 		route del $routecfg
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| rtlist() {
 | |
| 	for rtline in ${ROUTES[@]}; do
 | |
| 		if [[ $rtline = ${rtline#!} ]]; then
 | |
| 			printf " $rtline:\t"
 | |
| 		else
 | |
| 			printf "$rtline:\t"
 | |
| 		fi
 | |
| 		echo ${!rtline#!}
 | |
| 	done
 | |
| }
 | |
| 
 | |
| bond_up() {
 | |
| 	for ifline in ${BOND_INTERFACES[@]}; do
 | |
| 		if [[ $ifline = ${ifline#!} ]]; then
 | |
| 			bondcfg="bond_$ifline"
 | |
| 			if [[ ${!bondcfg} ]]; then
 | |
| 				ifenslave $ifline ${!bondcfg} || error=1
 | |
| 			fi
 | |
| 		fi
 | |
| 	done
 | |
| }
 | |
| 
 | |
| bond_down() {
 | |
| 	for ifline in ${BOND_INTERFACES[@]}; do
 | |
| 		if [[ $ifline = ${ifline#!} ]]; then
 | |
| 			bondcfg="bond_$ifline"
 | |
| 			ifenslave -d $ifline ${!bondcfg} || error=1
 | |
| 		fi
 | |
| 	done
 | |
| }
 | |
| 
 | |
| bridge_up() {
 | |
| 	for br in ${BRIDGE_INTERFACES[@]}; do
 | |
| 		if [[ $br = ${br#!} ]]; then
 | |
| 			# if the bridge already exists, remove it
 | |
| 			if [[ $(ifconfig $br 2>/dev/null) ]]; then
 | |
| 				ifconfig $br down
 | |
| 				brctl delbr $br
 | |
| 			fi
 | |
| 			brctl addbr $br
 | |
| 			brifs="bridge_$br"
 | |
| 			for brif in ${!brifs}; do
 | |
| 				if [[ $brif = ${brif#!} ]]; then
 | |
| 					for ifline in ${BOND_INTERFACES[@]}; do
 | |
| 						if [[ $brif = $ifline && $ifline = ${ifline#!} ]]; then
 | |
| 							ifup $ifline
 | |
| 							bondcfg="bond_$ifline"
 | |
| 							ifenslave $ifline ${!bondcfg} || error=1
 | |
| 							unset bond_$ifline
 | |
| 						fi
 | |
| 					done
 | |
| 
 | |
| 					brctl addif $br $brif || error=1
 | |
| 				fi
 | |
| 			done
 | |
| 		fi
 | |
| 	done
 | |
| }
 | |
| 
 | |
| bridge_down() {
 | |
| 	for br in ${BRIDGE_INTERFACES[@]}; do
 | |
| 		if [[ $br = ${br#!} ]]; then
 | |
| 			brctl delbr $br
 | |
| 		fi
 | |
| 	done
 | |
| }
 | |
| 
 | |
| 
 | |
| case "$1" in
 | |
| 	start)
 | |
| 		# deprecation check
 | |
| 		need_legacy && deprecated
 | |
| 		if ! ck_daemon network; then
 | |
| 			echo "Network is already running. Try 'rc.d restart network'"
 | |
| 			exit
 | |
| 		fi
 | |
| 		stat_busy "Starting network"
 | |
| 		error=0
 | |
| 		if need_legacy; then
 | |
| 			# bring up bridge interfaces
 | |
| 			bridge_up
 | |
| 			# bring up Ethernet interfaces
 | |
| 			for ifline in ${INTERFACES[@]}; do
 | |
| 				if [[ $ifline = ${ifline#!} ]]; then
 | |
| 					ifup $ifline || error=1
 | |
| 				fi
 | |
| 			done
 | |
| 			# bring up bond interfaces
 | |
| 			bond_up
 | |
| 			# bring up routes
 | |
| 			for rtline in "${ROUTES[@]}"; do
 | |
| 				if [ "$rtline" = "${rtline#!}" ]; then
 | |
| 					rtup $rtline || error=1
 | |
| 				fi
 | |
| 			done
 | |
| 		else
 | |
| 			network_up
 | |
| 		fi
 | |
| 		if (( ! error )); then
 | |
| 			add_daemon network
 | |
| 			stat_done
 | |
| 		else
 | |
| 			stat_fail
 | |
| 		fi
 | |
| 		;;
 | |
| 	stop)
 | |
| 		# deprecation check
 | |
| 		need_legacy && deprecated
 | |
| 		if [[ $NETWORK_PERSIST =~ yes|YES && $RUNLEVEL == [06] ]]; then
 | |
| 			status "Skipping network shutdown" true
 | |
| 			exit 0
 | |
| 		fi
 | |
| 
 | |
| 		stat_busy "Stopping network"
 | |
| 		rm_daemon network
 | |
| 		error=0
 | |
| 		if need_legacy; then
 | |
| 			for rtline in "${ROUTES[@]}"; do
 | |
| 				if [[ $rtline = ${rtline#!} ]]; then
 | |
| 					rtdown $rtline || error=1
 | |
| 				fi
 | |
| 			done
 | |
| 			# bring down bond interfaces
 | |
| 			bond_down
 | |
| 			for ifline in ${INTERFACES[@]}; do
 | |
| 				if [[ $ifline = ${ifline#!} ]]; then
 | |
| 					ifdown $ifline || error=1
 | |
| 				fi
 | |
| 			done
 | |
| 			# bring down bridge interfaces
 | |
| 			bridge_down
 | |
| 		else
 | |
| 			network_down
 | |
| 		fi
 | |
| 		if (( ! error )); then
 | |
| 			stat_done
 | |
| 		else
 | |
| 			stat_fail
 | |
| 		fi
 | |
| 		;;
 | |
| 	restart)
 | |
| 		$0 stop
 | |
| 		sleep 2
 | |
| 		$0 start
 | |
| 		;;
 | |
| 	ifup|ifdown|iflist|rtup|rtdown|rtlist)
 | |
| 		# deprecation check
 | |
| 		deprecated
 | |
| 		$1 $2
 | |
| 		;;
 | |
| 	*)
 | |
| 		echo "usage: $0 {start|stop|restart}"
 | |
| 		echo "       $0 {ifup|ifdown|iflist|rtup|rtdown|rtlist}";;
 | |
| esac
 | |
| 
 | |
| # vim: set ts=2 sw=2 noet:
 |