diff options
author | mtm <mtm@FreeBSD.org> | 2003-06-29 05:34:41 +0000 |
---|---|---|
committer | mtm <mtm@FreeBSD.org> | 2003-06-29 05:34:41 +0000 |
commit | f9ef847419e515982d648ef72058bb7865bca782 (patch) | |
tree | 17fa04e2f7e33b7c1058cd83c70e044bb00232a8 /etc/rc.d | |
parent | 39ca7af95e220ebd0c34c3404205708d0099b4ac (diff) | |
download | FreeBSD-src-f9ef847419e515982d648ef72058bb7865bca782.zip FreeBSD-src-f9ef847419e515982d648ef72058bb7865bca782.tar.gz |
Implement individual operations on static and dhcp interfaces. Previously
network interfaces could only be turned on and off as a group (all
static interfaces or all dhcp interfaces).
When used to start the interface a 'long form' ifconfig output is
used to show the status of the interface, but when stopping an interface
the script will simply output the name of the interface. This is simply my
personal preference. Hopefully as this functionality matures we can
stabilize on a prefered form of output for these scripts.
A stop command to the dhclient script now explicitly releases the dhcp lease.
Behaviour at system shutdown; however, is unchanged since dhclient is not,
by default, run at that time. The client will not release its lease
at shutdown.
Diffstat (limited to 'etc/rc.d')
-rwxr-xr-x | etc/rc.d/dhclient | 63 | ||||
-rw-r--r-- | etc/rc.d/netif | 121 |
2 files changed, 158 insertions, 26 deletions
diff --git a/etc/rc.d/dhclient b/etc/rc.d/dhclient index 160b9b2..71d7c41 100755 --- a/etc/rc.d/dhclient +++ b/etc/rc.d/dhclient @@ -23,6 +23,9 @@ FreeBSD) rcvar= start_precmd="dhclient_prestart" start_postcmd="dhclient_poststart" + stop_cmd="dhclient_stop" + stop_precmd="dhclient_prestop" + stop_postcmd="dhclient_poststop" ;; NetBSD) rcvar=$name @@ -30,29 +33,81 @@ NetBSD) ;; esac -dhclient_prestart() +dhclient_common() { dhcp_list="`list_net_interfaces dhcp`" if [ -z "$dhcp_list" ]; then return 1 fi - for ifn in ${dhcp_list}; do + # Determine the scope of the command + # + _cooked_list="$dhcp_list" + if [ -n "$_cmdifn" ]; then + eval _cooked_list=\"`expr "$dhcp_list" : ".*\($_cmdifn\).*"`\" + if [ -z "$_cooked_list" ]; then + err "No such network interface: $_cmdifn" + return 1 + fi + fi +} + +dhclient_prestart() +{ + dhclient_common || return 1 + + for ifn in ${_cooked_list}; do ifscript_up ${ifn} done - rc_flags="${rc_flags} ${dhcp_list}" + rc_flags="${rc_flags} ${_cooked_list}" return 0 } dhclient_poststart() { - for ifn in ${dhcp_list}; do + for ifn in ${_cooked_list}; do ifalias_up ${ifn} ipx_up ${ifn} ifconfig ${ifn} done } +dhclient_stop() +{ + echo -n "Releasing DHCP leases:" + for ifn in $_cooked_list ; do + ${command} -r $ifn + if [ $? -eq 0 ]; then + echo -n " $ifn" + else + _fail="$_fail $ifn" + fi + done + echo '.' + debug "The following leases failed to release: $_fail" +} + +dhclient_prestop() +{ + dhclient_common || return 1 + + for ifn in ${_cooked_list}; do + ipx_down ${ifn} + ifalias_down ${ifn} + done +} + +dhclient_poststop() +{ + for ifn in ${_cooked_list}; do + ifscript_down ${ifn} + done +} + +if [ -n "$2" ]; then + _cmdifn="$2" +fi + load_rc_config $name run_rc_command "$1" diff --git a/etc/rc.d/netif b/etc/rc.d/netif index bfc9f81..7c9b2b4 100644 --- a/etc/rc.d/netif +++ b/etc/rc.d/netif @@ -38,52 +38,129 @@ stop_cmd="network_stop" cloneup_cmd="clone_up" clonedown_cmd="clone_down" extra_commands="cloneup clonedown" +_cmdifn= network_start() { - # Create cloned interfaces - clone_up + if [ -z "$_cmdifn" ]; then + # + # We're operating as a general network start routine. + # - # Create IPv6<-->IPv4 tunnels - gif_up + # Create cloned interfaces + clone_up + + # Create IPv6<-->IPv4 tunnels + gif_up + fi + + # Configure the interface(s). + network_common ifn_start verbose + + # Resync ipfilter + /etc/rc.d/ipfilter resync +} + +network_stop() +{ + echo -n "Stopping network:" + + # Deconfigure the interface(s) + network_common ifn_stop + echo '.' +} + +# network_common routine verbose +# Common configuration subroutine for network interfaces. This +# routine takes all the preparatory steps needed for configuriing +# an interface and then calls $routine. If $verbose is specified, +# it will call ifconfig(8) to show, in long format, the configured +# interfaces. If $verbose is not given, it will simply output the +# configured interface(s). +network_common() +{ + _func= + _verbose= + + if [ -z "$1" ]; then + err "network_common(): No function name specified." + else + _func="$1" + fi + [ -n "$2" ] && _verbose=yes # 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. + # Set the scope of the command (all interfaces or just one). # - 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 + _cooked_list="$_ifn_list" + if [ -n "$_cmdifn" ]; then + eval _cooked_list=\"`expr "$_ifn_list" : ".*\($_cmdifn\).*"`\" + if [ -z "$_cooked_list" ]; then + err "No such network interface: $_cmdifn" + return 1 + fi + fi - ipx_up ${ifn} && eval showstat_$ifn=1 + for ifn in ${_cooked_list}; do + if ${_func} ${ifn} ; then + eval showstat_$ifn=1 + else + _fail="$_fail $ifn" + fi done # Display interfaces configured by this script # - for ifn in ${_ifn_list}; do + for ifn in ${_cooked_list}; do eval showstat=\$showstat_${ifn} if [ ! -z ${showstat} ]; then - ifconfig ${ifn} + if [ -n "$_verbose" ]; then + ifconfig ${ifn} + else + echo -n " ${ifn}" + fi fi done + debug "The following interfaces were not configured: $_fail" +} - # Resync ipfilter - /etc/rc.d/ipfilter resync +ifn_start() +{ + local ifn cfg + ifn="$1" + cfg=1 + + [ -z "$ifn" ] && return 1 + + ifscript_up ${ifn} && cfg=0 + ifconfig_up ${ifn} && cfg=0 + ifalias_up ${ifn} && cfg=0 + ipx_up ${ifn} && cfg=0 + + return $cfg } -network_stop() +ifn_stop() { - echo -n "Stopping network:" + local ifn cfg + ifn="$1" + cfg=1 - # flush routes - route -n flush - echo '.' + [ -z "$ifn" ] && return 1 + + ipx_down ${ifn} && cfg=0 + ifalias_down ${ifn} && cfg=0 + ifconfig_down ${ifn} && cfg=0 + ifscript_down ${ifn} && cfg=0 + + return $cfg } +if [ -n "$2" ]; then + _cmdifn="$2" +fi + load_rc_config $name run_rc_command "$1" |