vp-build/templates/initscripts/files/rc.d/network
Juan RP d7c27e8ab2 initscripts: depend on dhcpcd and use it if requested.
--HG--
extra : convert_revision : 49f1ce13ae5f51c0d4348500915069e8077aa355
2009-03-06 08:19:05 +01:00

228 lines
5.9 KiB
Bash
Executable File

#!/bin/sh
#
# $NetBSD: network,v 1.57 2008/10/11 17:28:03 christos Exp $
#
# PROVIDE: network
# REQUIRE: mountfs sysclock
# BEFORE: NETWORKING
$_rc_subr_loaded . /etc/rc.subr
name="network"
start_cmd="network_start"
stop_cmd="network_stop"
required_dirs="/sys/class/net/lo"
nl='
' # a newline
network_start()
{
# set hostname, turn on network
#
echo "=> Starting network."
# If $hostname is set, use it for my Internet name,
# otherwise use /etc/myname
#
if [ -z "$hostname" ] && [ -f /etc/myname ]; then
hostname=$(cat /etc/myname)
fi
if [ -n "$hostname" ]; then
echo "=> Setting hostname: $hostname."
hostname $hostname
fi
# Set the address for the first loopback interface, so that the
# auto-route from a newly configured interface's address to lo0
# works correctly.
#
# NOTE: obscure networking problems will occur if lo0 isn't configured.
#
ifconfig lo 127.0.0.1 up
# Configure all of the network interfaces listed in $net_interfaces;
# if $auto_ifconfig is YES, grab all interfaces from ifconfig.
# In the following, "xxN" stands in for interface names, like "le0".
#
# For any interfaces that has an $ifconfig_xxN variable
# associated, we break it into lines using ';' as a separator,
# then process it just like the contents of an /etc/ifconfig.xxN
# file.
#
# For each line from the $ifconfig_xxN variable or the
# /etc/ifconfig.xxN file, we ignore comments and blank lines,
# treat lines beginning with "!" as commands to execute, treat
# "dhcp" as a special case to invoke dhcpcd, and for any other
# line we run "ifconfig xxN", using each line of the file as the
# arguments for a separate "ifconfig" invocation.
#
# In order to configure an interface reasonably, you at the very least
# need to specify "[addr_family] [hostname]" (e.g "inet my.domain.org"),
# and probably a netmask (as in "netmask 0xffffffe0"). You will
# frequently need to specify a media type, as in "media UTP", for
# interface cards with multiple media connections that do not
# autoconfigure. See the ifconfig manual page for details.
#
# Note that /etc/ifconfig.xxN takes multiple lines. The following
# configuration is possible:
# inet 10.1.1.1 netmask 0xffffff00
# inet 10.1.1.2 netmask 0xffffff00 alias
# inet6 2001:db8::1 prefixlen 64 alias
#
# You can put shell script fragment into /etc/ifconfig.xxN by
# starting a line with "!". Refer to ifconfig.if(5) for details.
#
if [ "$net_interfaces" != NO ]; then
if checkyesno auto_ifconfig; then
tmp=$(/sbin/ifconfig -l)
for cloner in $(ls /sys/class/net/eth* 2>/dev/null); do
for int in /etc/ifconfig.${cloner}[0-9]*; do
[ ! -f $int ] && break
tmp="$tmp ${int##*.}"
done
done
else
tmp="$net_interfaces"
fi
echo -n '=> Configuring network interfaces:'
for int in ${tmp}; do
eval argslist=\$ifconfig_$int
# Skip interfaces that do not have explicit
# configuration information. If auto_ifconfig is
# false then also warn about such interfaces.
#
if [ -z "$argslist" ] && ! [ -f /etc/ifconfig.$int ]
then
if ! checkyesno auto_ifconfig; then
echo
warn \
"/etc/ifconfig.$int missing and ifconfig_$int not set;"
warn "interface $int not configured."
fi
continue
fi
echo -n " $int"
# If $ifconfig_xxN is empty, then use
# /etc/ifconfig.xxN, which we know exists due to
# an earlier test.
#
# If $ifconfig_xxN is non-empty and contains a
# newline, then just use it as is. (This allows
# semicolons through unmolested.)
#
# If $ifconfig_xxN is non-empty and does not
# contain a newline, then convert all semicolons
# to newlines.
#
case "$argslist" in
'')
cat /etc/ifconfig.$int
;;
*"${nl}"*)
echo "$argslist"
;;
*)
(
set -o noglob
IFS=';'; set -- $argslist
#echo >&2 "[$#] [$1] [$2] [$3] [$4]"
IFS="$nl"; echo "$*"
)
;;
esac |
while read -r args; do
case "$args" in
''|"#"*|create)
;;
"!"*)
# Run arbitrary command in a subshell.
( eval "${args#*!}" )
;;
dhcp)
dhcpcd -n ${dhcpcd_flags} $int
;;
*)
# Pass args to ifconfig. Note
# that args may contain embedded
# shell metacharacters, such as
# "ssid 'foo;*>bar'". We eval
# one more time so that things
# like ssid "Columbia University" work.
(
set -o noglob
eval set -- $args
#echo >&2 "[$#] [$1] [$2] [$3]"
ifconfig $int "$@"
)
;;
esac
done
configured_interfaces="$configured_interfaces $int"
done
echo "."
fi
# Check $defaultroute, then /etc/mygate, for the name or address
# of my IPv4 gateway host. If using a name, that name must be in
# /etc/hosts.
#
if [ -z "$defaultroute" ] && [ -f /etc/mygate ]; then
defaultroute=$(cat /etc/mygate)
fi
if [ -n "$defaultroute" ]; then
route add default gw $defaultroute
fi
# Check $defaultroute6, then /etc/mygate6, for the name or address
# of my IPv6 gateway host. If using a name, that name must be in
# /etc/hosts. Note that the gateway host address must be a link-local
# address if it is not using an stf* interface.
#
if [ -z "$defaultroute6" ] && [ -f /etc/mygate6 ]; then
defaultroute6=$(cat /etc/mygate6)
fi
if [ -n "$defaultroute6" ]; then
if [ "$ip6mode" = "autohost" ]; then
echo
warn \
"ip6mode is set to 'autohost' and a v6 default route is also set."
fi
route -A inet6 add $defaultroute6
fi
}
network_stop()
{
echo "=> Stopping network."
# down interfaces
#
echo -n '=> Downing network interfaces:'
if [ "$net_interfaces" != NO ]; then
if checkyesno auto_ifconfig; then
tmp=$(ls /sys/class/net/eth*)
else
tmp="$net_interfaces"
fi
for int in $tmp; do
eval args=\$ifconfig_$int
if [ -n "$args" ] || [ -f /etc/ifconfig.$int ]; then
echo -n " $int"
dhcpcd -k $int 2> /dev/null
ifconfig $int down
fi
done
echo "."
fi
}
load_rc_config $name
run_rc_command "$1"