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:
Roy Marples 2009-04-16 23:47:23 +00:00
parent 95d954e7b5
commit 6027b0ed7d
11 changed files with 264 additions and 7 deletions

View File

@ -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

View File

@ -1 +1,4 @@
CONF+= ipfw moused powerd rarpd savecore syscons
network:
cp network.in network

View File

@ -1 +1,5 @@
CONF+= consolefont dmesg hwclock keymaps modules
network:
cp network.in network
cat network.Linux >> network

View File

@ -1 +1,4 @@
CONF+= moused rarpd savecore
network:
cp network.in network

10
conf.d/network.Linux Normal file
View 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
View 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.

View File

@ -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
View 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
}

View File

@ -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 $$?; \

View File

@ -1 +1 @@
BOOT+= hostid net.lo0 newsyslog savecore syslogd swap-blk
BOOT+= hostid newsyslog savecore syslogd swap-blk

View File

@ -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