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/network.subr | |
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/network.subr')
-rw-r--r-- | etc/network.subr | 330 |
1 files changed, 159 insertions, 171 deletions
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" |