diff options
author | mtm <mtm@FreeBSD.org> | 2003-04-18 17:51:54 +0000 |
---|---|---|
committer | mtm <mtm@FreeBSD.org> | 2003-04-18 17:51:54 +0000 |
commit | 70cccaca8387a83c2d2dc478226f5764a07652c9 (patch) | |
tree | 015043790910e3724ed648425db7068d5e2c72a4 /etc | |
parent | 05b93dc7b7b61e5c9e7357375f36285a82061e27 (diff) | |
download | FreeBSD-src-70cccaca8387a83c2d2dc478226f5764a07652c9.zip FreeBSD-src-70cccaca8387a83c2d2dc478226f5764a07652c9.tar.gz |
Break out and rewrite the network setup scripts.
o /etc/network.subr contains common subroutines used for seting
up network interfaces
o rc.d/hostname sets the hostname if not already set
o rc.d/nisdomain sets the nis domain *after* rpcbind but
before the yp* daemons. This fixes issues with temporary
hangs when looking up informaion in nis before it's ready.
o rc.d/netif brings network interfaces (minus dhcp) up.
o rc.d/network1 has been disabled and will be retired before
RELENG_5. It will be replaced by rc.d/netif
Approved by: markm (mentor)
Diffstat (limited to 'etc')
-rw-r--r-- | etc/Makefile | 2 | ||||
-rw-r--r-- | etc/network.subr | 330 | ||||
-rw-r--r-- | etc/rc.d/hostname | 51 | ||||
-rw-r--r-- | etc/rc.d/netif | 89 | ||||
-rw-r--r-- | etc/rc.d/network1 | 2 | ||||
-rw-r--r-- | etc/rc.d/nisdomain | 119 |
6 files changed, 420 insertions, 173 deletions
diff --git a/etc/Makefile b/etc/Makefile index 6140f7f..e3803d2 100644 --- a/etc/Makefile +++ b/etc/Makefile @@ -10,7 +10,7 @@ BIN1= amd.map apmd.conf auth.conf \ devd.conf dhclient.conf disktab fbtab ftpusers gettytab group \ hosts hosts.allow hosts.equiv hosts.lpd \ inetd.conf login.access login.conf \ - mac.conf motd netconfig networks newsyslog.conf \ + mac.conf motd netconfig network.subr networks newsyslog.conf \ phones printcap profile protocols \ rc rc.atm rc.devfs rc.diskless1 rc.diskless2 rc.firewall rc.firewall6 \ rc.network rc.network6 rc.pccard rc.sendmail rc.serial rc.shutdown \ diff --git a/etc/network.subr b/etc/network.subr index 4887042..2b7b8f4 100644 --- a/etc/network.subr +++ b/etc/network.subr @@ -1,67 +1,121 @@ -#!/bin/sh -x +# +# Copyright (c) 2003 The FreeBSD Project. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. # # $FreeBSD$ # -# PROVIDE: network1 -# REQUIRE: atm1 ipfilter mountcritlocal pccard serial sppp sysctl tty -# KEYWORD: FreeBSD +# +# Subroutines commonly used from network startup scripts. +# Requires that rc.conf be loaded first. +# -. /etc/rc.subr +# ifconfig_up if +# Evaluate ifconfig(8) arguments for interface $if and +# run ifconfig(8) with those arguments. It returns 0 if +# arguments were found and executed or 1 if the interface +# had no arguments. +# +ifconfig_up() +{ + eval ifconfig_args=\$ifconfig_$1 + if [ -n "${ifconfig_args}" ]; then + ifconfig $1 ${ifconfig_args} + return 0 + fi + return 1 +} -name="network1" -start_cmd="network_start" -stop_cmd="network_stop" +# ifalias_up if +# Configure aliases for network interface $if. +# It returns 0 if at least one alias was configured or +# 1 if there were none. +# +ifalias_up() +{ + _ret=1 + alias=0 + while : ; do + eval ifconfig_args=\$ifconfig_$1_alias${alias} + if [ -n "${ifconfig_args}" ]; then + ifconfig $1 ${ifconfig_args} alias + alias=$((${alias} + 1)) + _ret=0 + else + break + fi + done + return $_ret +} -convert_host_conf() +# ifscript_up if +# Evaluate a startup script for the $if interface. +# It returns 0 if a script was found and processed or +# 1 if no script was found. +# +ifscript_up() { - host_conf=$1; shift; - nsswitch_conf=$1; shift; - awk ' \ - /^[:blank:]*#/ { next } \ - /(hosts|local|file)/ { nsswitch[c] = "files"; c++; next } \ - /(dns|bind)/ { nsswitch[c] = "dns"; c++; next } \ - /nis/ { nsswitch[c] = "nis"; c++; next } \ - { printf "Warning: unrecognized line [%s]", $0 > "/dev/stderr" } \ - END { \ - printf "hosts: "; \ - for (i in nsswitch) printf "%s ", nsswitch[i]; \ - printf "\n"; \ - }' < $host_conf > $nsswitch_conf + if [ -r /etc/start_if.$1 ]; then + . /etc/start_if.$1 + return 0 + fi + return 1 } -generate_host_conf() +# Create cloneable interfaces. +# +clone_up() { - nsswitch_conf=$1; shift; - host_conf=$1; shift; + _prefix= + _list= + for ifn in ${cloned_interfaces}; do + ifconfig ${ifn} create + if $? ; then + _list="${_list}${_prefix}${ifn}" + [ -z "$_prefix" ] && _prefix=' ' + fi + done + debug "Cloned: ${_list}" +} - awk ' - BEGIN { - xlat["files"] = "hosts"; - xlat["dns"] = "bind"; - xlat["nis"] = "nis"; - cont = 0; - } - sub(/^[\t ]*hosts:/, "") || cont { - if (!cont) - srcs = "" - sub(/#.*/, "") - gsub(/[][]/, " & ") - cont = sub(/\\$/, "") - srcs = srcs " " $0 - } - END { - print "# Auto-generated from nsswitch.conf, do not edit" - ns = split(srcs, s) - for (n = 1; n <= ns; ++n) { - if (s[n] in xlat) - print xlat[s[n]] - } - } - ' <$nsswitch_conf >$host_conf +# Destroy cloned interfaces. Destroyed interfaces are echoed +# to standard output. +# +clone_down() +{ + _prefix= + _list= + for ifn in ${cloned_interfaces}; do + ifconfig ${ifn} destroy + if $? ; then + _list="${_list}${_prefix}${ifn}" + [ -z "$_prefix" ] && _prefix=' ' + fi + done + debug "Destroyed clones: ${_list}" } -network_gif_setup() { +gif_up() { case ${gif_interfaces} in [Nn][Oo] | '') ;; @@ -83,144 +137,78 @@ network_gif_setup() { esac } -network_start() +# +# ipx_up ifn +# Configure any IPX addresses for interface $ifn. Returns 0 if IPX +# arguments were found and configured; returns 1 otherwise. +# +ipx_up() { - # set hostname, turn on network - # - echo -n "Doing initial network setup:" - - # Generate host.conf for compatibility - # - if [ -f "/etc/nsswitch.conf" ]; then - echo -n ' host.conf' - generate_host_conf /etc/nsswitch.conf /etc/host.conf - fi - - # Convert host.conf to nsswitch.conf if necessary - # - if [ -f "/etc/host.conf" -a ! -f "/etc/nsswitch.conf" ]; then - echo '' - echo 'Warning: /etc/host.conf is no longer used' - echo ' /etc/nsswitch.conf will be created for you' - convert_host_conf /etc/host.conf /etc/nsswitch.conf + ifn="$1" + eval ifconfig_args=\$ifconfig_${ifn}_ipx + if [ -n "${ifconfig_args}" ]; then + ifconfig ${ifn} ${ifconfig_args} + return 0 fi + return 1 +} - # Set the host name if it is not already set - # - if [ -z "`hostname -s`" ]; then - hostname ${hostname} - echo -n ' hostname' - fi - - # Set the domainname if we're using NIS - # - case ${nisdomainname} in - [Nn][Oo]|'') - ;; - *) - domainname ${nisdomainname} - echo -n ' domain' - ;; - esac - - echo '.' - - # Attempt to create cloned interfaces. - for ifn in ${cloned_interfaces}; do - ifconfig ${ifn} create - done - - # gifconfig - network_gif_setup +# +# list_net_interfaces type +# List all network interfaces. The type of interface returned +# can be controlled by the type argument. The type +# argument can be any of the following: +# nodhcp - all interfaces, excluding DHCP configured interfaces +# dhcp - list only DHCP configured interfaces +# If no argument is specified all network interfaces are output. +# Note that the list always includes cloned interfaces. +# +list_net_interfaces() +{ + type=$1 - # Set up all the network interfaces, calling startup scripts if needed + # Get a list of ALL the interfaces # case ${network_interfaces} in [Aa][Uu][Tt][Oo]) - network_interfaces="`ifconfig -l`" + _tmplist="`ifconfig -l`" ;; *) - network_interfaces="${network_interfaces} ${cloned_interfaces}" + _tmplist="${network_interfaces}" ;; esac + _tmplist="${_tmplist} ${cloned_interfaces}" - dhcp_interfaces="" - for ifn in ${network_interfaces}; do - if [ -r /etc/start_if.${ifn} ]; then - . /etc/start_if.${ifn} - eval showstat_$ifn=1 - fi - - # Do the primary ifconfig if specified - # - eval ifconfig_args=\$ifconfig_${ifn} + if [ -z "$type" ]; then + echo $_tmplist + return 0 + fi - case ${ifconfig_args} in - '') - ;; + # Separate out dhcp and non-dhcp intefraces + # + _aprefix= + _brefix= + for _if in ${_tmplist} ; do + eval _ifarg="\$ifconfig_${_if}" + case "$_ifarg" in [Dd][Hh][Cc][Pp]) - # DHCP inits are done all in one go below - dhcp_interfaces="$dhcp_interfaces $ifn" - eval showstat_$ifn=1 + _dhcplist="${_dhcplist}${_aprefix}${_if}" + [ -z "$_aprefix" ] && _aprefix=' ' ;; - *) - ifconfig ${ifn} ${ifconfig_args} - eval showstat_$ifn=1 + ''|*) + _nodhcplist="${_nodhcplist}${_bprefix}${_if}" + [ -z "$_bprefix" ] && _bprefix=' ' ;; esac done - if [ ! -z "${dhcp_interfaces}" ]; then - ${dhcp_program:-/sbin/dhclient} ${dhcp_flags} ${dhcp_interfaces} - fi - - for ifn in ${network_interfaces}; do - # Check to see if aliases need to be added - # - alias=0 - while : ; do - eval ifconfig_args=\$ifconfig_${ifn}_alias${alias} - if [ -n "${ifconfig_args}" ]; then - ifconfig ${ifn} ${ifconfig_args} alias - eval showstat_$ifn=1 - alias=$((${alias} + 1)) - else - break; - fi - done - - # Do ipx address if specified - # - eval ifconfig_args=\$ifconfig_${ifn}_ipx - if [ -n "${ifconfig_args}" ]; then - ifconfig ${ifn} ${ifconfig_args} - eval showstat_$ifn=1 - fi - done - - # Display ifconfiged interfaces - for ifn in ${network_interfaces}; do - eval showstat=\$showstat_${ifn} - if [ ! -z ${showstat} ]; then - ifconfig ${ifn} - fi - done - - # Resync ipfilter - /etc/rc.d/ipfilter resync -} - -network_stop() -{ - echo -n "Stopping network:" - - # flush routes - # - echo -n " flush routes" - route -n flush - - echo '.' + case "$type" in + nodhcp) + echo $_nodhcplist + ;; + dhcp) + echo $_dhcplist + ;; + esac + return 0 } - -load_rc_config $name -run_rc_command "$1" diff --git a/etc/rc.d/hostname b/etc/rc.d/hostname new file mode 100644 index 0000000..3a54a2d --- /dev/null +++ b/etc/rc.d/hostname @@ -0,0 +1,51 @@ +#!/bin/sh +# +# Copyright (c) 2003 The FreeBSD Project. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ +# + +# PROVIDE: hostname +# REQUIRE: mountcritlocal sysctl tty +# BEFORE: netif +# KEYWORD: FreeBSD + +. /etc/rc.subr + +name="hostname" +start_cmd="hostname_start" +stop_cmd=":" + +hostname_start() +{ + # Set the host name if it is not already set + # + if [ -z "`hostname -s`" ]; then + hostname ${hostname} + echo "Setting hostname: `hostname`." + fi +} + +load_rc_config $name +run_rc_command "$1" diff --git a/etc/rc.d/netif b/etc/rc.d/netif new file mode 100644 index 0000000..bfc9f81 --- /dev/null +++ b/etc/rc.d/netif @@ -0,0 +1,89 @@ +#!/bin/sh +# +# Copyright (c) 2003 The FreeBSD Project. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE PROJECT ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE PROJECT BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# $FreeBSD$ +# + +# PROVIDE: netif +# REQUIRE: atm1 ipfilter mountcritlocal pccard serial sppp sysctl tty +# KEYWORD: FreeBSD + +. /etc/rc.subr +. /etc/network.subr + +name="network" +start_cmd="network_start" +stop_cmd="network_stop" +cloneup_cmd="clone_up" +clonedown_cmd="clone_down" +extra_commands="cloneup clonedown" + +network_start() +{ + # Create cloned interfaces + clone_up + + # Create IPv6<-->IPv4 tunnels + gif_up + + # Get a list of network interfaces. Do not include dhcp interfaces. + _ifn_list="`list_net_interfaces nodhcp`" + + # Setup the supplied network interfaces including startup + # scripts, if they exist. + # + for ifn in ${_ifn_list}; do + ifscript_up ${ifn} && eval showstat_$ifn=1 + + ifconfig_up ${ifn} && eval showstat_$ifn=1 + + ifalias_up ${ifn} && eval showstat_$ifn=1 + + ipx_up ${ifn} && eval showstat_$ifn=1 + done + + # Display interfaces configured by this script + # + for ifn in ${_ifn_list}; do + eval showstat=\$showstat_${ifn} + if [ ! -z ${showstat} ]; then + ifconfig ${ifn} + fi + done + + # Resync ipfilter + /etc/rc.d/ipfilter resync +} + +network_stop() +{ + echo -n "Stopping network:" + + # flush routes + route -n flush + echo '.' +} + +load_rc_config $name +run_rc_command "$1" diff --git a/etc/rc.d/network1 b/etc/rc.d/network1 index 4887042..e9b03f0 100644 --- a/etc/rc.d/network1 +++ b/etc/rc.d/network1 @@ -5,7 +5,7 @@ # PROVIDE: network1 # REQUIRE: atm1 ipfilter mountcritlocal pccard serial sppp sysctl tty -# KEYWORD: FreeBSD +# KEYWORD: FreeBSD nostart . /etc/rc.subr diff --git a/etc/rc.d/nisdomain b/etc/rc.d/nisdomain new file mode 100644 index 0000000..4866f4d --- /dev/null +++ b/etc/rc.d/nisdomain @@ -0,0 +1,119 @@ +#!/bin/sh +# +# Copyright (c) 1993 - 2003 The FreeBSD Project. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ +# + +# PROVIDE: nisdomain +# REQUIRE: SERVERS rpcbind +# BEFORE: ypbind ypserv ypxfrd +# KEYWORD: FreeBSD + +. /etc/rc.subr + +name="nisdomain" +start_cmd="nisdomain_start" +stop_cmd=":" + +convert_host_conf() +{ + host_conf=$1; shift; + nsswitch_conf=$1; shift; + awk ' \ + /^[:blank:]*#/ { next } \ + /(hosts|local|file)/ { nsswitch[c] = "files"; c++; next } \ + /(dns|bind)/ { nsswitch[c] = "dns"; c++; next } \ + /nis/ { nsswitch[c] = "nis"; c++; next } \ + { printf "Warning: unrecognized line [%s]", $0 > "/dev/stderr" } \ + END { \ + printf "hosts: "; \ + for (i in nsswitch) printf "%s ", nsswitch[i]; \ + printf "\n"; \ + }' < $host_conf > $nsswitch_conf +} + +generate_host_conf() +{ + nsswitch_conf=$1; shift; + host_conf=$1; shift; + + awk ' +BEGIN { + xlat["files"] = "hosts"; + xlat["dns"] = "bind"; + xlat["nis"] = "nis"; + cont = 0; +} +sub(/^[\t ]*hosts:/, "") || cont { + if (!cont) + srcs = "" + sub(/#.*/, "") + gsub(/[][]/, " & ") + cont = sub(/\\$/, "") + srcs = srcs " " $0 +} +END { + print "# Auto-generated from nsswitch.conf, do not edit" + ns = split(srcs, s) + for (n = 1; n <= ns; ++n) { + if (s[n] in xlat) + print xlat[s[n]] + } +} +' <$nsswitch_conf >$host_conf +} + +nisdomain_start() +{ + # Generate host.conf for compatibility + # + if [ -f "/etc/nsswitch.conf" ]; then + echo 'Generating host.conf.' + generate_host_conf /etc/nsswitch.conf /etc/host.conf + fi + + # Convert host.conf to nsswitch.conf if necessary + # + if [ -f "/etc/host.conf" -a ! -f "/etc/nsswitch.conf" ]; then + echo '' + echo 'Warning: /etc/host.conf is no longer used' + echo ' /etc/nsswitch.conf will be created for you' + convert_host_conf /etc/host.conf /etc/nsswitch.conf + fi + + # Set the domainname if we're using NIS + # + case ${nisdomainname} in + [Nn][Oo]|'') + ;; + *) + domainname ${nisdomainname} + echo "Setting NIS domain: `/bin/domainname`." + ;; + esac +} + +load_rc_config $name +run_rc_command "$1" |