summaryrefslogtreecommitdiffstats
path: root/etc/rc.d
diff options
context:
space:
mode:
authormtm <mtm@FreeBSD.org>2003-06-29 05:34:41 +0000
committermtm <mtm@FreeBSD.org>2003-06-29 05:34:41 +0000
commitf9ef847419e515982d648ef72058bb7865bca782 (patch)
tree17fa04e2f7e33b7c1058cd83c70e044bb00232a8 /etc/rc.d
parent39ca7af95e220ebd0c34c3404205708d0099b4ac (diff)
downloadFreeBSD-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-xetc/rc.d/dhclient63
-rw-r--r--etc/rc.d/netif121
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"
OpenPOWER on IntegriCloud