Add a new init script - network
This simply assigns static addresses and an optional default route. It's possible to add external commands as well, so to create a bonded interface. Hopefully we can add a few examples to satisfy most of the old net.lo, which is no longer installed into boot by default.
This commit is contained in:
		@@ -1,5 +1,7 @@
 | 
			
		||||
DIR=	${CONFDIR}
 | 
			
		||||
CONF=	bootmisc fsck hostname local localmount net urandom
 | 
			
		||||
CONF=	bootmisc fsck hostname local localmount network urandom
 | 
			
		||||
 | 
			
		||||
CLEANFILES+=	network
 | 
			
		||||
 | 
			
		||||
MK=	../mk
 | 
			
		||||
include ${MK}/os.mk
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +1,4 @@
 | 
			
		||||
CONF+=	ipfw moused powerd rarpd savecore syscons
 | 
			
		||||
 | 
			
		||||
network:
 | 
			
		||||
	cp network.in network
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +1,5 @@
 | 
			
		||||
CONF+=	consolefont dmesg hwclock keymaps modules
 | 
			
		||||
 | 
			
		||||
network:
 | 
			
		||||
	cp network.in network
 | 
			
		||||
	cat network.Linux >> network
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +1,4 @@
 | 
			
		||||
CONF+=	moused rarpd savecore
 | 
			
		||||
 | 
			
		||||
network:
 | 
			
		||||
	cp network.in network
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								conf.d/network.Linux
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								conf.d/network.Linux
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
# ifconfig under Linux is not that powerful and doesn't easily handle
 | 
			
		||||
# multiple addresses
 | 
			
		||||
# On the other hand, ip (iproute2) is quite powerful and is also supported
 | 
			
		||||
# ip_eth0="192.168.0.10/24; 192.168.10.10/24"
 | 
			
		||||
 | 
			
		||||
# Create a bonded interface
 | 
			
		||||
# interfaces="bond0"
 | 
			
		||||
# ifup_bond0="modprobe bonding; ifconfig bond0 up; ifenslave bond0 bge0"
 | 
			
		||||
# ifconfig_bond0="192.168.0.10/24"
 | 
			
		||||
# ifdown_bond0="rmmod bonding"
 | 
			
		||||
							
								
								
									
										10
									
								
								conf.d/network.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								conf.d/network.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
# Assign static IP addresses and run custom scripts per interface
 | 
			
		||||
# Seperate commands with ;
 | 
			
		||||
# Prefix with ! to run a shell script
 | 
			
		||||
# ifconfig_eth0="up; 192.168.0.10 netmask 255.255.255.0; ! echo up"
 | 
			
		||||
 | 
			
		||||
# You also have ifup_eth0 and ifdown_eth0 to run other commands when
 | 
			
		||||
# eth0 is started and stopped.
 | 
			
		||||
# Lastly, the interfaces variable pulls in virtual interfaces that cannot
 | 
			
		||||
# be automatically detected.
 | 
			
		||||
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
DIR=	${INITDIR}
 | 
			
		||||
SRCS=	bootmisc.in fsck.in hostname.in local.in localmount.in \
 | 
			
		||||
	netmount.in root.in savecache.in swap.in sysctl.in urandom.in
 | 
			
		||||
SRCS=	bootmisc.in fsck.in hostname.in local.in localmount.in netmount.in \
 | 
			
		||||
	network.in root.in savecache.in swap.in sysctl.in urandom.in
 | 
			
		||||
BIN=	${OBJS}
 | 
			
		||||
 | 
			
		||||
INSTALLAFTER=	_installafter
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										226
									
								
								init.d/network.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								init.d/network.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,226 @@
 | 
			
		||||
#!@PREFIX@/sbin/runscript
 | 
			
		||||
# Copyright 2009 Roy Marples <roy@marples.name>
 | 
			
		||||
# All rights reserved. Released under the 2-clause BSD license.
 | 
			
		||||
 | 
			
		||||
description="Configures network interfaces."
 | 
			
		||||
__nl="
 | 
			
		||||
"
 | 
			
		||||
 | 
			
		||||
depend()
 | 
			
		||||
{
 | 
			
		||||
	need localmount
 | 
			
		||||
	after bootmisc
 | 
			
		||||
	provide net
 | 
			
		||||
	keyword nojail noprefix novserver
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interfaces()
 | 
			
		||||
{
 | 
			
		||||
	case "${RC_UNAME}" in
 | 
			
		||||
	Linux)
 | 
			
		||||
		local w= rest= i= cmd=$1
 | 
			
		||||
		while read w rest; do
 | 
			
		||||
			i=${w%%:*}
 | 
			
		||||
			[ "$i" != "$w" ] || continue
 | 
			
		||||
			if [ "$cmd" = u ]; then
 | 
			
		||||
				ifconfig "$i" | grep -q "[ ]*UP" || continue
 | 
			
		||||
			fi
 | 
			
		||||
			printf "%s " "$i"
 | 
			
		||||
		done </proc/net/dev
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		ifconfig -l$1
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uniqify()
 | 
			
		||||
{
 | 
			
		||||
	local result=
 | 
			
		||||
	while [ -n "$1" ]; do
 | 
			
		||||
		case " ${result} " in
 | 
			
		||||
		*" $1 "*);;
 | 
			
		||||
		*) result="${result} $1";;
 | 
			
		||||
		esac
 | 
			
		||||
		shift
 | 
			
		||||
	done
 | 
			
		||||
	echo "${result# *}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dumpargs()
 | 
			
		||||
{
 | 
			
		||||
	local f="$1"
 | 
			
		||||
 | 
			
		||||
	shift
 | 
			
		||||
	case "$@" in
 | 
			
		||||
	'')		cat "$f";;
 | 
			
		||||
	*"$__nl"*)	echo "$@";;
 | 
			
		||||
	*)
 | 
			
		||||
		(
 | 
			
		||||
		 	set -o noglob
 | 
			
		||||
			IFS=';'; set -- $@
 | 
			
		||||
			IFS="$__nl"; echo "$*"
 | 
			
		||||
		);;
 | 
			
		||||
	esac
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
runip()
 | 
			
		||||
{
 | 
			
		||||
	local iface="$1" err=
 | 
			
		||||
 | 
			
		||||
	shift
 | 
			
		||||
	err=$(LC_ALL=C ip address add "$@" dev "$iface" 2>&1)
 | 
			
		||||
	[ -z "$err" ] && return 0
 | 
			
		||||
	if [ "$err" = "RTNETLINK answers: File exists" ]; then
 | 
			
		||||
		ip address del "$@" dev "${iface}" 2>/dev/null
 | 
			
		||||
	fi
 | 
			
		||||
	# Localise the error
 | 
			
		||||
	ip address add "$@" dev "$iface"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
routeflush()
 | 
			
		||||
{
 | 
			
		||||
	if [ "${RC_UNAME}" = Linux ]; then
 | 
			
		||||
		if [ -x /sbin/ip ]; then
 | 
			
		||||
			ip route flush scope global
 | 
			
		||||
		else
 | 
			
		||||
			# Sadly we also delete some link routes, but
 | 
			
		||||
			# this cannot be helped
 | 
			
		||||
			local dest= gate= net= flags= rest=
 | 
			
		||||
			route -n | while read dest gate net flags rest; do
 | 
			
		||||
				[ -z "$net" ] && continue
 | 
			
		||||
				case "$dest" in
 | 
			
		||||
				[0-9]*)	;;
 | 
			
		||||
				*)	continue;;
 | 
			
		||||
				esac
 | 
			
		||||
				local xtra= netmask="netmask $net"
 | 
			
		||||
				case "$flags" in
 | 
			
		||||
				U)	continue;;
 | 
			
		||||
				*H*)	flags=-host; netmask=;;
 | 
			
		||||
				*!*)	flags=-net; xtra=reject;;
 | 
			
		||||
				*)	flags=-net;;
 | 
			
		||||
				esac
 | 
			
		||||
				route del $flags $dest $netmask $xtra
 | 
			
		||||
			done
 | 
			
		||||
		fi
 | 
			
		||||
	else
 | 
			
		||||
		route -qn flush
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
runargs()
 | 
			
		||||
{
 | 
			
		||||
	dumpargs "$@" | while read -r args; do
 | 
			
		||||
		case "$args" in
 | 
			
		||||
		''|"#"*)	;;
 | 
			
		||||
		*)
 | 
			
		||||
				(
 | 
			
		||||
				 	vebegin "${args#*!}"
 | 
			
		||||
					eval "${args#*!}"
 | 
			
		||||
					veend $?
 | 
			
		||||
				);;
 | 
			
		||||
		esac
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start()
 | 
			
		||||
{
 | 
			
		||||
	local cr=0 r= iface= cnf= cmd= args= upcmd=
 | 
			
		||||
	einfo "Starting network"
 | 
			
		||||
	routeflush
 | 
			
		||||
	if [ "${RC_UNAME}" = "Linux" ]; then
 | 
			
		||||
		ifconfig lo 127.0.0.1 netmask 255.0.0.0 || cr=1 
 | 
			
		||||
		route add -net 127.0.0.0 netmask 255.0.0.0 \
 | 
			
		||||
			gw 127.0.0.1 2>/dev/null
 | 
			
		||||
		route add -net 127.0.0.0 netmask 255.0.0.0 \
 | 
			
		||||
			gw 127.0.0.1 reject 2>/dev/null
 | 
			
		||||
	else
 | 
			
		||||
		ifconfig lo0 127.0.0.1 netmask 255.0.0.0 || cr=1
 | 
			
		||||
		route -q add -inet 127.0.0.0 -netmask 255.0.0.0 \
 | 
			
		||||
			127.0.0.1 -reject || cr=1
 | 
			
		||||
	fi
 | 
			
		||||
	eindent
 | 
			
		||||
	for iface in $(uniqify $(interfaces) $interfaces); do
 | 
			
		||||
		local func= cf=
 | 
			
		||||
		eval upcmd=\$ifup_$iface
 | 
			
		||||
		for func in ip ifconfig; do
 | 
			
		||||
			eval cmd=\$${func}_${iface}
 | 
			
		||||
			if [ -n "$cmd" -o -f /etc/"$func.$iface" ]; then
 | 
			
		||||
				cf=/etc/"$func.$iface"
 | 
			
		||||
				break
 | 
			
		||||
			fi
 | 
			
		||||
		done
 | 
			
		||||
		[ -n "$cf" -o -n "$upcmd" -o \
 | 
			
		||||
			-f /etc/ifup."$iface" -o -f "$cf" ] || continue
 | 
			
		||||
		vebegin "$iface"
 | 
			
		||||
		case "$func" in
 | 
			
		||||
		ip)	func=runip;;
 | 
			
		||||
		esac
 | 
			
		||||
		eindent
 | 
			
		||||
		if [ -n "$upcmd" -o -f /etc/ifup."$iface" ]; then
 | 
			
		||||
			runargs /etc/ifup."$iface" "$upcmd"
 | 
			
		||||
		fi
 | 
			
		||||
		r=0
 | 
			
		||||
		dumpargs "$cf" "$cmd" | while read -r args; do
 | 
			
		||||
			case "$args" in
 | 
			
		||||
			''|"#"*)	;;
 | 
			
		||||
			"!"*)
 | 
			
		||||
					(
 | 
			
		||||
					 	vebegin "${args#*!}"
 | 
			
		||||
						eval "${args#*!}"
 | 
			
		||||
						veend $?
 | 
			
		||||
					);;
 | 
			
		||||
			*)
 | 
			
		||||
					(
 | 
			
		||||
					 	set -o noglob
 | 
			
		||||
						eval set -- "$args"
 | 
			
		||||
						vebegin "$@"
 | 
			
		||||
						$func "$iface" "$@"
 | 
			
		||||
						veend $?
 | 
			
		||||
					);;
 | 
			
		||||
			esac
 | 
			
		||||
		done
 | 
			
		||||
		eoutdent
 | 
			
		||||
		veend $? || cr=1
 | 
			
		||||
	done
 | 
			
		||||
	eoutdent
 | 
			
		||||
	eend $cr
 | 
			
		||||
 | 
			
		||||
	if [ -n "$defaultroute" ]; then
 | 
			
		||||
		ebegin "Setting default route $defaultroute"
 | 
			
		||||
		if [ "${RC_UNAME}" = Linux ]; then
 | 
			
		||||
			route add default gw $defaultroute
 | 
			
		||||
		else
 | 
			
		||||
			route add default $defaultroute
 | 
			
		||||
		fi
 | 
			
		||||
		eend $?
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
stop()
 | 
			
		||||
{
 | 
			
		||||
	local cr=0 r= iface= cnf= cmd= args= downcmd=
 | 
			
		||||
	einfo "Stopping network"
 | 
			
		||||
	routeflush
 | 
			
		||||
	eindent
 | 
			
		||||
	for iface in $(uniqify $(interfaces u) $interfaces); do
 | 
			
		||||
		eval downcmd=\$ifdown_$iface
 | 
			
		||||
		eval cmd=\$ip_$iface
 | 
			
		||||
		[ -z "$cmd" ] && eval cmd=\$ifconfig_$iface
 | 
			
		||||
		if [ -n "$cmd" -o -f /etc/ip."$iface" -o \
 | 
			
		||||
			-f /etc/ifconfig."$iface" -o \
 | 
			
		||||
			-n "$downcmd" -o -f /etc/ifdown."$iface" ];
 | 
			
		||||
		then
 | 
			
		||||
			vebegin "$iface"
 | 
			
		||||
			if [ -n "$downcmd" -o -f /etc/ifdown."$iface" ]; then
 | 
			
		||||
				runargs /etc/ifdown."$iface" "$downcmd"
 | 
			
		||||
			fi
 | 
			
		||||
			ifconfig "$iface" down 2>/dev/null
 | 
			
		||||
			veend $?
 | 
			
		||||
		fi
 | 
			
		||||
	done
 | 
			
		||||
	eoutdent
 | 
			
		||||
	eend 0
 | 
			
		||||
}
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
BOOT=		bootmisc fsck hostname localmount \
 | 
			
		||||
BOOT=		bootmisc fsck hostname localmount network \
 | 
			
		||||
		root swap sysctl urandom
 | 
			
		||||
DEFAULT=	local netmount
 | 
			
		||||
SHUTDOWN=	savecache
 | 
			
		||||
@@ -32,7 +32,6 @@ install:
 | 
			
		||||
		${INSTALL} -d ${BOOTDIR} || exit $$?; \
 | 
			
		||||
		for x in ${BOOT}; do \
 | 
			
		||||
			if test -n "${PREFIX}"; then \
 | 
			
		||||
				test "$$x" = "net.lo" -o "$$x" = "net.lo0" && continue; \
 | 
			
		||||
				grep -q "keyword .*noprefix" ${INITDIR}/"$$x" && continue; \
 | 
			
		||||
			fi; \
 | 
			
		||||
			ln -snf ${PREFIX}/etc/init.d/"$$x" ${BOOTDIR}/"$$x" || exit $$?; \
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +1 @@
 | 
			
		||||
BOOT+=		hostid net.lo0 newsyslog savecore syslogd swap-blk
 | 
			
		||||
BOOT+=		hostid newsyslog savecore syslogd swap-blk
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,3 @@
 | 
			
		||||
SYSINIT+=	devfs dmesg
 | 
			
		||||
BOOT+=		hwclock keymaps modules mtab net.lo procfs termencoding
 | 
			
		||||
BOOT+=		hwclock keymaps modules mtab procfs termencoding
 | 
			
		||||
SHUTDOWN+=	killprocs mount-ro
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user