]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
Adapt host configuration
authorReto Buerki <reet@codelabs.ch>
Mon, 19 Nov 2012 16:17:38 +0000 (17:17 +0100)
committerTobias Brunner <tobias@strongswan.org>
Tue, 18 Dec 2012 15:00:21 +0000 (16:00 +0100)
Adapt the configuration of the test hosts to the new Debian-based
system.

94 files changed:
testing/hosts/alice/etc/conf.d/hostname [deleted file]
testing/hosts/alice/etc/conf.d/net [deleted file]
testing/hosts/alice/etc/freeradius/clients.conf [new file with mode: 0644]
testing/hosts/alice/etc/freeradius/dictionary [new file with mode: 0644]
testing/hosts/alice/etc/freeradius/radiusd.conf [new file with mode: 0644]
testing/hosts/alice/etc/hostname [new file with mode: 0644]
testing/hosts/alice/etc/init.d/iptables [deleted file]
testing/hosts/alice/etc/init.d/net.eth0 [deleted file]
testing/hosts/alice/etc/init.d/net.eth1 [deleted file]
testing/hosts/alice/etc/init.d/radiusd [deleted file]
testing/hosts/alice/etc/ipsec.conf [changed mode: 0755->0644]
testing/hosts/alice/etc/network/interfaces [new file with mode: 0644]
testing/hosts/alice/etc/runlevels/default/net.eth0 [deleted file]
testing/hosts/bob/etc/conf.d/hostname [deleted file]
testing/hosts/bob/etc/conf.d/net [deleted file]
testing/hosts/bob/etc/hostname [new file with mode: 0644]
testing/hosts/bob/etc/init.d/iptables [deleted file]
testing/hosts/bob/etc/init.d/net.eth0 [deleted file]
testing/hosts/bob/etc/ipsec.conf [changed mode: 0755->0644]
testing/hosts/bob/etc/network/interfaces [new file with mode: 0644]
testing/hosts/bob/etc/runlevels/default/net.eth0 [deleted file]
testing/hosts/carol/etc/conf.d/hostname [deleted file]
testing/hosts/carol/etc/conf.d/net [deleted file]
testing/hosts/carol/etc/hostname [new file with mode: 0644]
testing/hosts/carol/etc/init.d/iptables [deleted file]
testing/hosts/carol/etc/init.d/net.eth0 [deleted file]
testing/hosts/carol/etc/ipsec.conf [changed mode: 0755->0644]
testing/hosts/carol/etc/network/interfaces [new file with mode: 0644]
testing/hosts/carol/etc/runlevels/default/net.eth0 [deleted file]
testing/hosts/dave/etc/conf.d/hostname [deleted file]
testing/hosts/dave/etc/conf.d/net [deleted file]
testing/hosts/dave/etc/hostname [new file with mode: 0644]
testing/hosts/dave/etc/init.d/iptables [deleted file]
testing/hosts/dave/etc/init.d/net.eth0 [deleted file]
testing/hosts/dave/etc/ipsec.conf [changed mode: 0755->0644]
testing/hosts/dave/etc/network/interfaces [new file with mode: 0644]
testing/hosts/dave/etc/runlevels/default/net.eth0 [deleted file]
testing/hosts/default/etc/default/slapd [new file with mode: 0644]
testing/hosts/default/etc/iptables.flush [new file with mode: 0644]
testing/hosts/default/etc/iptables.rules [new file with mode: 0644]
testing/hosts/default/etc/rsyslog.conf [new file with mode: 0644]
testing/hosts/default/etc/security/limits.conf [new file with mode: 0644]
testing/hosts/default/etc/sysctl.conf [new file with mode: 0644]
testing/hosts/moon/etc/conf.d/hostname [deleted file]
testing/hosts/moon/etc/conf.d/net [deleted file]
testing/hosts/moon/etc/hostname [new file with mode: 0644]
testing/hosts/moon/etc/init.d/iptables [deleted file]
testing/hosts/moon/etc/init.d/net.eth0 [deleted file]
testing/hosts/moon/etc/init.d/net.eth1 [deleted file]
testing/hosts/moon/etc/ipsec.conf [changed mode: 0755->0644]
testing/hosts/moon/etc/network/interfaces [new file with mode: 0644]
testing/hosts/moon/etc/runlevels/default/net.eth0 [deleted file]
testing/hosts/moon/etc/runlevels/default/net.eth1 [deleted file]
testing/hosts/ssh_host_rsa_key.pub [deleted file]
testing/hosts/sun/etc/conf.d/hostname [deleted file]
testing/hosts/sun/etc/conf.d/net [deleted file]
testing/hosts/sun/etc/hostname [new file with mode: 0644]
testing/hosts/sun/etc/init.d/iptables [deleted file]
testing/hosts/sun/etc/init.d/net.eth0 [deleted file]
testing/hosts/sun/etc/init.d/net.eth1 [deleted file]
testing/hosts/sun/etc/ipsec.conf [changed mode: 0755->0644]
testing/hosts/sun/etc/network/interfaces [new file with mode: 0644]
testing/hosts/sun/etc/runlevels/default/net.eth0 [deleted file]
testing/hosts/sun/etc/runlevels/default/net.eth1 [deleted file]
testing/hosts/venus/etc/conf.d/hostname [deleted file]
testing/hosts/venus/etc/conf.d/net [deleted file]
testing/hosts/venus/etc/hostname [new file with mode: 0644]
testing/hosts/venus/etc/init.d/iptables [deleted file]
testing/hosts/venus/etc/init.d/net.eth0 [deleted file]
testing/hosts/venus/etc/ipsec.conf [changed mode: 0755->0644]
testing/hosts/venus/etc/network/interfaces [new file with mode: 0644]
testing/hosts/venus/etc/runlevels/default/net.eth0 [deleted file]
testing/hosts/winnetou/etc/apache2/conf.d/testresults-as-text [new file with mode: 0644]
testing/hosts/winnetou/etc/apache2/conf/ssl/ca.crt [deleted file]
testing/hosts/winnetou/etc/apache2/conf/ssl/server.crt [deleted file]
testing/hosts/winnetou/etc/apache2/conf/ssl/server.key [deleted file]
testing/hosts/winnetou/etc/apache2/modules.d/00_mod_mime.conf [deleted file]
testing/hosts/winnetou/etc/apache2/sites-enabled/001-ocsp_vhost [moved from testing/hosts/winnetou/etc/apache2/vhosts.d/01_ocsp_vhost.conf with 98% similarity]
testing/hosts/winnetou/etc/conf.d/hostname [deleted file]
testing/hosts/winnetou/etc/conf.d/net [deleted file]
testing/hosts/winnetou/etc/conf.d/slapd [deleted file]
testing/hosts/winnetou/etc/init.d/apache2 [deleted file]
testing/hosts/winnetou/etc/init.d/net.eth0 [deleted file]
testing/hosts/winnetou/etc/init.d/slapd [deleted file]
testing/hosts/winnetou/etc/ldap/ldif.txt [moved from testing/hosts/winnetou/etc/openldap/ldif.txt with 99% similarity]
testing/hosts/winnetou/etc/ldap/slapd.conf [new file with mode: 0644]
testing/hosts/winnetou/etc/network/interfaces [new file with mode: 0644]
testing/hosts/winnetou/etc/openldap/slapd.conf [deleted file]
testing/hosts/winnetou/etc/openssl/generate-crl
testing/hosts/winnetou/etc/openssl/ocsp/ocsp.cgi
testing/hosts/winnetou/etc/openssl/research/ocsp/ocsp.cgi
testing/hosts/winnetou/etc/openssl/sales/ocsp/ocsp.cgi
testing/hosts/winnetou/etc/runlevels/default/apache2 [deleted file]
testing/hosts/winnetou/etc/runlevels/default/net.eth0 [deleted file]

diff --git a/testing/hosts/alice/etc/conf.d/hostname b/testing/hosts/alice/etc/conf.d/hostname
deleted file mode 100644 (file)
index 2012e04..0000000
+++ /dev/null
@@ -1 +0,0 @@
-HOSTNAME=alice
diff --git a/testing/hosts/alice/etc/conf.d/net b/testing/hosts/alice/etc/conf.d/net
deleted file mode 100644 (file)
index 41e8887..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-# /etc/conf.d/net:
-
-# This is basically the ifconfig argument without the ifconfig $iface
-#
-config_eth0=( "PH_IP_ALICE broadcast 10.1.255.255 netmask 255.255.0.0"
-              "PH_IP6_ALICE/16" )
-config_eth1=( "PH_IP_ALICE1 broadcast 192.168.0.255 netmask 255.255.255.0"
-              "PH_IP6_ALICE1/16" )
-
-# For setting the default gateway
-#
-routes_eth0=( "default via PH_IP_MOON1" )
diff --git a/testing/hosts/alice/etc/freeradius/clients.conf b/testing/hosts/alice/etc/freeradius/clients.conf
new file mode 100644 (file)
index 0000000..5fb47a2
--- /dev/null
@@ -0,0 +1,4 @@
+client 10.1.0.1 {
+  secret    = gv6URkSs
+  shortname = moon
+}
diff --git a/testing/hosts/alice/etc/freeradius/dictionary b/testing/hosts/alice/etc/freeradius/dictionary
new file mode 100644 (file)
index 0000000..59a874b
--- /dev/null
@@ -0,0 +1,32 @@
+#
+#      This is the master dictionary file, which references the
+#      pre-defined dictionary files included with the server.
+#
+#      Any new/changed attributes MUST be placed in this file, as
+#      the pre-defined dictionaries SHOULD NOT be edited.
+#
+#      $Id$
+#
+
+#
+#      The filename given here should be an absolute path.
+#
+$INCLUDE       /usr/local/share/freeradius/dictionary
+
+#
+#      Place additional attributes or $INCLUDEs here.  They will
+#      over-ride the definitions in the pre-defined dictionaries.
+#
+#      See the 'man' page for 'dictionary' for information on
+#      the format of the dictionary files.
+
+#
+#      If you want to add entries to the dictionary file,
+#      which are NOT going to be placed in a RADIUS packet,
+#      add them here.  The numbers you pick should be between
+#      3000 and 4000.
+#
+
+#ATTRIBUTE     My-Local-String         3000    string
+#ATTRIBUTE     My-Local-IPAddr         3001    ipaddr
+#ATTRIBUTE     My-Local-Integer        3002    integer
diff --git a/testing/hosts/alice/etc/freeradius/radiusd.conf b/testing/hosts/alice/etc/freeradius/radiusd.conf
new file mode 100644 (file)
index 0000000..e4f7217
--- /dev/null
@@ -0,0 +1,120 @@
+# radiusd.conf -- FreeRADIUS server configuration file.
+
+prefix = /usr
+exec_prefix = ${prefix}
+sysconfdir = /etc
+localstatedir = /var
+sbindir = ${exec_prefix}/sbin
+logdir = ${localstatedir}/log/freeradius
+raddbdir = ${sysconfdir}/freeradius
+radacctdir = ${logdir}/radacct
+
+#  name of the running server.  See also the "-n" command-line option.
+name = freeradius
+
+#  Location of config and logfiles.
+confdir = ${raddbdir}
+run_dir = ${localstatedir}/run
+
+# Should likely be ${localstatedir}/lib/radiusd
+db_dir = ${raddbdir}
+
+# libdir: Where to find the rlm_* modules.
+libdir = ${exec_prefix}/lib
+
+#  pidfile: Where to place the PID of the RADIUS server.
+pidfile = ${run_dir}/${name}.pid
+
+#  max_request_time: The maximum time (in seconds) to handle a request.
+max_request_time = 30
+
+#  cleanup_delay: The time to wait (in seconds) before cleaning up
+cleanup_delay = 5
+
+#  max_requests: The maximum number of requests which the server keeps
+max_requests = 1024
+
+#  listen: Make the server listen on a particular IP address, and send
+listen {
+  type = auth
+  ipaddr = 10.1.0.10
+  port = 0
+}
+
+#  This second "listen" section is for listening on the accounting
+#  port, too.
+#
+listen {
+  type  = acct
+  ipaddr = 10.1.0.10
+  port = 0
+}
+
+#  hostname_lookups: Log the names of clients or just their IP addresses
+hostname_lookups = no
+
+#  Core dumps are a bad thing.  This should only be set to 'yes'
+allow_core_dumps = no
+
+#  Regular expressions
+regular_expressions = yes
+extended_expressions = yes
+
+#  Logging section.  The various "log_*" configuration items
+log {
+  destination = files
+  file = ${logdir}/radius.log
+  syslog_facility = daemon
+  stripped_names = no
+  auth = yes
+  auth_badpass = yes
+  auth_goodpass = yes
+}
+
+#  The program to execute to do concurrency checks.
+checkrad = ${sbindir}/checkrad
+
+#  Security considerations
+security {
+  max_attributes = 200
+  reject_delay = 1
+  status_server = yes
+}
+
+# PROXY CONFIGURATION
+proxy_requests = yes
+$INCLUDE proxy.conf
+
+# CLIENTS CONFIGURATION
+$INCLUDE clients.conf
+
+# THREAD POOL CONFIGURATION
+thread pool {
+  start_servers = 5
+  max_servers = 32
+  min_spare_servers = 3
+  max_spare_servers = 10
+  max_requests_per_server = 0
+}
+
+# MODULE CONFIGURATION
+modules {
+  $INCLUDE ${confdir}/modules/
+  $INCLUDE eap.conf
+  $INCLUDE sql.conf
+  $INCLUDE sql/mysql/counter.conf
+}
+
+# Instantiation
+instantiate {
+  exec
+  expr
+  expiration
+  logintime
+}
+
+# Policies
+$INCLUDE policy.conf
+
+# Include all enabled virtual hosts
+$INCLUDE sites-enabled/
diff --git a/testing/hosts/alice/etc/hostname b/testing/hosts/alice/etc/hostname
new file mode 100644 (file)
index 0000000..c9fc40b
--- /dev/null
@@ -0,0 +1 @@
+alice
diff --git a/testing/hosts/alice/etc/init.d/iptables b/testing/hosts/alice/etc/init.d/iptables
deleted file mode 100755 (executable)
index 1097ac5..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/sbin/runscript
-# Copyright 1999-2004 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-opts="start stop reload"
-
-depend() {
-       before net
-       need logger
-}
-
-start() {
-       ebegin "Starting firewall"
-
-       # default policy is DROP
-       /sbin/iptables -P INPUT DROP
-       /sbin/iptables -P OUTPUT DROP
-       /sbin/iptables -P FORWARD DROP
-
-       # allow IKE
-        iptables -A INPUT  -i eth0 -p udp --sport 500 --dport 500 -j ACCEPT
-        iptables -A OUTPUT -o eth0 -p udp --dport 500 --sport 500 -j ACCEPT
-                       
-       # allow NAT-T 
-       iptables -A INPUT  -i eth0 -p udp --sport 4500 --dport 4500 -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p udp --dport 4500 --sport 4500 -j ACCEPT
-
-
-       # allow crl fetch from winnetou
-       iptables -A INPUT  -i eth0 -p tcp --sport 80 -s PH_IP_WINNETOU -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p tcp --dport 80 -d PH_IP_WINNETOU -j ACCEPT
-
-       # allow ssh
-       iptables -A INPUT  -p tcp --dport 22 -j ACCEPT
-       iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
-
-       eend $?
-}
-
-stop() {
-       ebegin "Stopping firewall"
-               for a in `cat /proc/net/ip_tables_names`; do
-                       /sbin/iptables -F -t $a
-                       /sbin/iptables -X -t $a
-       
-                       if [ $a == nat ]; then
-                               /sbin/iptables -t nat -P PREROUTING ACCEPT
-                               /sbin/iptables -t nat -P POSTROUTING ACCEPT
-                               /sbin/iptables -t nat -P OUTPUT ACCEPT
-                       elif [ $a == mangle ]; then
-                               /sbin/iptables -t mangle -P PREROUTING ACCEPT
-                               /sbin/iptables -t mangle -P INPUT ACCEPT
-                               /sbin/iptables -t mangle -P FORWARD ACCEPT
-                               /sbin/iptables -t mangle -P OUTPUT ACCEPT
-                               /sbin/iptables -t mangle -P POSTROUTING ACCEPT
-                       elif [ $a == filter ]; then
-                               /sbin/iptables -t filter -P INPUT ACCEPT
-                               /sbin/iptables -t filter -P FORWARD ACCEPT
-                               /sbin/iptables -t filter -P OUTPUT ACCEPT
-                       fi
-               done
-       eend $?
-}
-
-reload() {
-       ebegin "Flushing firewall"
-               for a in `cat /proc/net/ip_tables_names`; do
-                       /sbin/iptables -F -t $a
-                       /sbin/iptables -X -t $a
-               done;
-        eend $?
-       start
-}
-
diff --git a/testing/hosts/alice/etc/init.d/net.eth0 b/testing/hosts/alice/etc/init.d/net.eth0
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
diff --git a/testing/hosts/alice/etc/init.d/net.eth1 b/testing/hosts/alice/etc/init.d/net.eth1
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
diff --git a/testing/hosts/alice/etc/init.d/radiusd b/testing/hosts/alice/etc/init.d/radiusd
deleted file mode 100755 (executable)
index 8334385..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/sbin/runscript
-
-opts="${opts} reload"
-
-depend() {
-       need net
-       use dns
-}
-
-checkconfig() {
-       # set the location of log files
-       if ! cd /var/log/radius ; then
-               eerror "Failed to change current directory to /var/log/radius"
-               return 1
-       fi
-
-       if [ ! -d /var/run/radiusd ] && ! mkdir /var/run/radiusd ; then
-               eerror "Failed to create /var/run/radiusd"
-               return 1
-       fi
-       
-       if [ ! -f /etc/raddb/radiusd.conf ] ; then
-               eerror "No /etc/raddb/radiusd.conf file exists!"
-               return 1
-       fi
-
-       RADIUSD_OPTS="-xx"
-       RADIUSD_USER=`grep '^ *user *=' /etc/raddb/radiusd.conf | cut -d ' ' -f 3`
-       RADIUSD_GROUP=`grep '^ *group *=' /etc/raddb/radiusd.conf | cut -d ' ' -f 3`
-       if [ -n "${RADIUSD_USER}" ] && ! getent passwd ${RADIUSD_USER} > /dev/null ; then
-               eerror "${RADIUSD_USER} user missing!"
-               return 1
-       fi
-       if [ -n "${RADIUSD_GROUP}" ] && ! getent group ${RADIUSD_GROUP} > /dev/null ; then
-               eerror "${RADIUSD_GROUP} group missing!"
-               return 1
-       fi
-
-       # radius.log is created before privileges are dropped - need to set proper permissions on it
-       [ -f radius.log ] || touch radius.log || return 1
-
-       chown -R "${RADIUSD_USER:-root}:${RADIUSD_GROUP:-root}" . /var/run/radiusd && \
-               chmod -R u+rwX,g+rX . /var/run/radiusd || return 1
-}
-
-start() {
-       checkconfig || return 1
-
-       ebegin "Starting radiusd"
-       start-stop-daemon --start --quiet --exec /usr/sbin/radiusd -- ${RADIUSD_OPTS} >/dev/null
-       eend $?
-}
-
-stop () {
-       ebegin "Stopping radiusd"
-       start-stop-daemon --stop --quiet --pidfile=/var/run/radiusd/radiusd.pid
-       eend $?
-}
-
-reload () {
-       ebegin "Reloading radiusd"
-       kill -HUP `</var/run/radiusd/radiusd.pid`
-       eend $?
-}
old mode 100755 (executable)
new mode 100644 (file)
index 0671537..6d8aa62
@@ -13,7 +13,7 @@ conn nat-t
        leftcert=aliceCert.pem
        leftid=alice@strongswan.org
        leftfirewall=yes
-       right=PH_IP_SUN
+       right=192.168.0.2
        rightid=@sun.strongswan.org
        rightsubnet=10.2.0.0/16
        auto=add
diff --git a/testing/hosts/alice/etc/network/interfaces b/testing/hosts/alice/etc/network/interfaces
new file mode 100644 (file)
index 0000000..f9ee562
--- /dev/null
@@ -0,0 +1,20 @@
+auto lo
+iface lo inet loopback
+
+auto eth0
+iface eth0 inet static
+       address PH_IP_ALICE
+       netmask 255.255.0.0
+       broadcast 10.1.255.255
+       gateway 10.1.0.1
+iface eth0 inet6 static
+       address PH_IP6_ALICE
+       netmask 16
+
+iface eth1 inet static
+       address PH_IP_ALICE1
+       netmask 255.255.255.0
+       broadcast 192.168.0.255
+iface eth1 inet6 static
+       address PH_IP6_ALICE1
+       netmask 16
diff --git a/testing/hosts/alice/etc/runlevels/default/net.eth0 b/testing/hosts/alice/etc/runlevels/default/net.eth0
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
diff --git a/testing/hosts/bob/etc/conf.d/hostname b/testing/hosts/bob/etc/conf.d/hostname
deleted file mode 100644 (file)
index bbf5a2e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-HOSTNAME=bob
diff --git a/testing/hosts/bob/etc/conf.d/net b/testing/hosts/bob/etc/conf.d/net
deleted file mode 100644 (file)
index bd0b3a5..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-# /etc/conf.d/net:
-
-# This is basically the ifconfig argument without the ifconfig $iface
-#
-config_eth0=( "PH_IP_BOB broadcast 10.2.255.255 netmask 255.255.0.0"
-              "PH_IP6_BOB/16" )
-
-# For setting the default gateway
-#
-routes_eth0=( "default via PH_IP_SUN1" )
diff --git a/testing/hosts/bob/etc/hostname b/testing/hosts/bob/etc/hostname
new file mode 100644 (file)
index 0000000..696fb6b
--- /dev/null
@@ -0,0 +1 @@
+bob
diff --git a/testing/hosts/bob/etc/init.d/iptables b/testing/hosts/bob/etc/init.d/iptables
deleted file mode 100755 (executable)
index 7b8756b..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/sbin/runscript
-# Copyright 1999-2004 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-opts="start stop reload"
-
-depend() {
-       before net
-       need logger
-}
-
-start() {
-       ebegin "Starting firewall"
-
-       # default policy is DROP
-       /sbin/iptables -P INPUT DROP
-       /sbin/iptables -P OUTPUT DROP
-       /sbin/iptables -P FORWARD DROP
-
-       # allow IKE
-        iptables -A INPUT  -i eth0 -p udp --dport 500 -j ACCEPT
-        iptables -A OUTPUT -o eth0 -p udp --sport 500 -j ACCEPT
-                       
-       # allow NAT-T 
-       iptables -A INPUT  -i eth0 -p udp --dport 4500 -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p udp --sport 4500 -j ACCEPT
-
-
-       # allow crl fetch from winnetou
-       iptables -A INPUT  -i eth0 -p tcp --sport 80 -s PH_IP_WINNETOU -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p tcp --dport 80 -d PH_IP_WINNETOU -j ACCEPT
-
-       # allow ssh
-       iptables -A INPUT  -p tcp --dport 22 -j ACCEPT
-       iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
-
-       eend $?
-}
-
-stop() {
-       ebegin "Stopping firewall"
-               for a in `cat /proc/net/ip_tables_names`; do
-                       /sbin/iptables -F -t $a
-                       /sbin/iptables -X -t $a
-       
-                       if [ $a == nat ]; then
-                               /sbin/iptables -t nat -P PREROUTING ACCEPT
-                               /sbin/iptables -t nat -P POSTROUTING ACCEPT
-                               /sbin/iptables -t nat -P OUTPUT ACCEPT
-                       elif [ $a == mangle ]; then
-                               /sbin/iptables -t mangle -P PREROUTING ACCEPT
-                               /sbin/iptables -t mangle -P INPUT ACCEPT
-                               /sbin/iptables -t mangle -P FORWARD ACCEPT
-                               /sbin/iptables -t mangle -P OUTPUT ACCEPT
-                               /sbin/iptables -t mangle -P POSTROUTING ACCEPT
-                       elif [ $a == filter ]; then
-                               /sbin/iptables -t filter -P INPUT ACCEPT
-                               /sbin/iptables -t filter -P FORWARD ACCEPT
-                               /sbin/iptables -t filter -P OUTPUT ACCEPT
-                       fi
-               done
-       eend $?
-}
-
-reload() {
-       ebegin "Flushing firewall"
-               for a in `cat /proc/net/ip_tables_names`; do
-                       /sbin/iptables -F -t $a
-                       /sbin/iptables -X -t $a
-               done;
-        eend $?
-       start
-}
-
diff --git a/testing/hosts/bob/etc/init.d/net.eth0 b/testing/hosts/bob/etc/init.d/net.eth0
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
old mode 100755 (executable)
new mode 100644 (file)
diff --git a/testing/hosts/bob/etc/network/interfaces b/testing/hosts/bob/etc/network/interfaces
new file mode 100644 (file)
index 0000000..3e50c05
--- /dev/null
@@ -0,0 +1,12 @@
+auto lo
+iface lo inet loopback
+
+auto eth0
+iface eth0 inet static
+       address PH_IP_BOB
+       netmask 255.255.0.0
+       broadcast 10.2.255.255
+       gateway 10.2.0.1
+iface eth0 inet6 static
+       address PH_IP6_BOB
+       netmask 16
diff --git a/testing/hosts/bob/etc/runlevels/default/net.eth0 b/testing/hosts/bob/etc/runlevels/default/net.eth0
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
diff --git a/testing/hosts/carol/etc/conf.d/hostname b/testing/hosts/carol/etc/conf.d/hostname
deleted file mode 100644 (file)
index d5101b9..0000000
+++ /dev/null
@@ -1 +0,0 @@
-HOSTNAME=carol
diff --git a/testing/hosts/carol/etc/conf.d/net b/testing/hosts/carol/etc/conf.d/net
deleted file mode 100644 (file)
index f7f6859..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-# /etc/conf.d/net:
-
-# This is basically the ifconfig argument without the ifconfig $iface
-#
-config_eth0=( "PH_IP_CAROL broadcast 192.168.0.255 netmask 255.255.255.0"
-              "PH_IP6_CAROL/16" )
-
-# For setting the default gateway
-#
-routes_eth0=( "default via 192.168.0.254" )
diff --git a/testing/hosts/carol/etc/hostname b/testing/hosts/carol/etc/hostname
new file mode 100644 (file)
index 0000000..da4b063
--- /dev/null
@@ -0,0 +1 @@
+carol
diff --git a/testing/hosts/carol/etc/init.d/iptables b/testing/hosts/carol/etc/init.d/iptables
deleted file mode 100755 (executable)
index 6ff11a4..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/sbin/runscript
-# Copyright 1999-2004 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-opts="start stop reload"
-
-depend() {
-       before net
-       need logger
-}
-
-start() {
-       ebegin "Starting firewall"
-
-       # default policy is DROP
-       /sbin/iptables -P INPUT DROP
-       /sbin/iptables -P OUTPUT DROP
-       /sbin/iptables -P FORWARD DROP
-
-       # allow esp
-       iptables -A INPUT  -i eth0 -p 50 -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p 50 -j ACCEPT
-
-       # allow IKE
-       iptables -A INPUT  -i eth0 -p udp --sport 500 --dport 500 -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p udp --dport 500 --sport 500 -j ACCEPT
-
-       # allow MobIKE
-       iptables -A INPUT  -i eth0 -p udp --sport 4500 --dport 4500 -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p udp --dport 4500 --sport 4500 -j ACCEPT
-
-       # allow crl fetch from winnetou
-       iptables -A INPUT  -i eth0 -p tcp --sport 80 -s PH_IP_WINNETOU -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p tcp --dport 80 -d PH_IP_WINNETOU -j ACCEPT
-
-       # allow ssh
-       iptables -A INPUT  -p tcp --dport 22 -j ACCEPT
-       iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
-
-       eend $?
-}
-
-stop() {
-       ebegin "Stopping firewall"
-               for a in `cat /proc/net/ip_tables_names`; do
-                       /sbin/iptables -F -t $a
-                       /sbin/iptables -X -t $a
-       
-                       if [ $a == nat ]; then
-                               /sbin/iptables -t nat -P PREROUTING ACCEPT
-                               /sbin/iptables -t nat -P POSTROUTING ACCEPT
-                               /sbin/iptables -t nat -P OUTPUT ACCEPT
-                       elif [ $a == mangle ]; then
-                               /sbin/iptables -t mangle -P PREROUTING ACCEPT
-                               /sbin/iptables -t mangle -P INPUT ACCEPT
-                               /sbin/iptables -t mangle -P FORWARD ACCEPT
-                               /sbin/iptables -t mangle -P OUTPUT ACCEPT
-                               /sbin/iptables -t mangle -P POSTROUTING ACCEPT
-                       elif [ $a == filter ]; then
-                               /sbin/iptables -t filter -P INPUT ACCEPT
-                               /sbin/iptables -t filter -P FORWARD ACCEPT
-                               /sbin/iptables -t filter -P OUTPUT ACCEPT
-                       fi
-               done
-       eend $?
-}
-
-reload() {
-       ebegin "Flushing firewall"
-               for a in `cat /proc/net/ip_tables_names`; do
-                       /sbin/iptables -F -t $a
-                       /sbin/iptables -X -t $a
-               done;
-        eend $?
-       start
-}
-
diff --git a/testing/hosts/carol/etc/init.d/net.eth0 b/testing/hosts/carol/etc/init.d/net.eth0
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
old mode 100755 (executable)
new mode 100644 (file)
index 0848ee7..d2d481b
@@ -9,11 +9,11 @@ conn %default
        keyingtries=1
 
 conn home
-       left=PH_IP_CAROL
+       left=192.168.0.100
        leftcert=carolCert.pem
        leftid=carol@strongswan.org
        leftfirewall=yes
-       right=PH_IP_MOON
+       right=192.168.0.1
        rightsubnet=10.1.0.0/16
        rightid=@moon.strongswan.org
        auto=add
diff --git a/testing/hosts/carol/etc/network/interfaces b/testing/hosts/carol/etc/network/interfaces
new file mode 100644 (file)
index 0000000..3579153
--- /dev/null
@@ -0,0 +1,12 @@
+auto lo
+iface lo inet loopback
+
+auto eth0
+iface eth0 inet static
+       address PH_IP_CAROL
+       netmask 255.255.255.0
+       broadcast 192.168.0.255
+       gateway 192.168.0.254
+iface eth0 inet6 static
+       address PH_IP6_CAROL
+       netmask 16
diff --git a/testing/hosts/carol/etc/runlevels/default/net.eth0 b/testing/hosts/carol/etc/runlevels/default/net.eth0
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
diff --git a/testing/hosts/dave/etc/conf.d/hostname b/testing/hosts/dave/etc/conf.d/hostname
deleted file mode 100644 (file)
index c3fabf3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-HOSTNAME=dave
diff --git a/testing/hosts/dave/etc/conf.d/net b/testing/hosts/dave/etc/conf.d/net
deleted file mode 100644 (file)
index 2b90252..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-# /etc/conf.d/net:
-
-# This is basically the ifconfig argument without the ifconfig $iface
-#
-config_eth0=( "PH_IP_DAVE broadcast 192.168.0.255 netmask 255.255.255.0"
-              "PH_IP6_DAVE/16" )
-
-# For setting the default gateway
-#
-routes_eth0=( "default via 192.168.0.254" )
diff --git a/testing/hosts/dave/etc/hostname b/testing/hosts/dave/etc/hostname
new file mode 100644 (file)
index 0000000..9fcf7b1
--- /dev/null
@@ -0,0 +1 @@
+dave
diff --git a/testing/hosts/dave/etc/init.d/iptables b/testing/hosts/dave/etc/init.d/iptables
deleted file mode 100755 (executable)
index 6ff11a4..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/sbin/runscript
-# Copyright 1999-2004 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-opts="start stop reload"
-
-depend() {
-       before net
-       need logger
-}
-
-start() {
-       ebegin "Starting firewall"
-
-       # default policy is DROP
-       /sbin/iptables -P INPUT DROP
-       /sbin/iptables -P OUTPUT DROP
-       /sbin/iptables -P FORWARD DROP
-
-       # allow esp
-       iptables -A INPUT  -i eth0 -p 50 -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p 50 -j ACCEPT
-
-       # allow IKE
-       iptables -A INPUT  -i eth0 -p udp --sport 500 --dport 500 -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p udp --dport 500 --sport 500 -j ACCEPT
-
-       # allow MobIKE
-       iptables -A INPUT  -i eth0 -p udp --sport 4500 --dport 4500 -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p udp --dport 4500 --sport 4500 -j ACCEPT
-
-       # allow crl fetch from winnetou
-       iptables -A INPUT  -i eth0 -p tcp --sport 80 -s PH_IP_WINNETOU -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p tcp --dport 80 -d PH_IP_WINNETOU -j ACCEPT
-
-       # allow ssh
-       iptables -A INPUT  -p tcp --dport 22 -j ACCEPT
-       iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
-
-       eend $?
-}
-
-stop() {
-       ebegin "Stopping firewall"
-               for a in `cat /proc/net/ip_tables_names`; do
-                       /sbin/iptables -F -t $a
-                       /sbin/iptables -X -t $a
-       
-                       if [ $a == nat ]; then
-                               /sbin/iptables -t nat -P PREROUTING ACCEPT
-                               /sbin/iptables -t nat -P POSTROUTING ACCEPT
-                               /sbin/iptables -t nat -P OUTPUT ACCEPT
-                       elif [ $a == mangle ]; then
-                               /sbin/iptables -t mangle -P PREROUTING ACCEPT
-                               /sbin/iptables -t mangle -P INPUT ACCEPT
-                               /sbin/iptables -t mangle -P FORWARD ACCEPT
-                               /sbin/iptables -t mangle -P OUTPUT ACCEPT
-                               /sbin/iptables -t mangle -P POSTROUTING ACCEPT
-                       elif [ $a == filter ]; then
-                               /sbin/iptables -t filter -P INPUT ACCEPT
-                               /sbin/iptables -t filter -P FORWARD ACCEPT
-                               /sbin/iptables -t filter -P OUTPUT ACCEPT
-                       fi
-               done
-       eend $?
-}
-
-reload() {
-       ebegin "Flushing firewall"
-               for a in `cat /proc/net/ip_tables_names`; do
-                       /sbin/iptables -F -t $a
-                       /sbin/iptables -X -t $a
-               done;
-        eend $?
-       start
-}
-
diff --git a/testing/hosts/dave/etc/init.d/net.eth0 b/testing/hosts/dave/etc/init.d/net.eth0
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
old mode 100755 (executable)
new mode 100644 (file)
index 9650258..5c546e2
@@ -9,11 +9,11 @@ conn %default
        keyingtries=1
 
 conn home
-       left=PH_IP_DAVE
+       left=192.168.0.200
        leftcert=daveCert.pem
        leftid=dave@strongswan.org
        leftfirewall=yes
-       right=PH_IP_MOON
+       right=192.168.0.1
        rightsubnet=10.1.0.0/16
        rightid=@moon.strongswan.org
        auto=add
diff --git a/testing/hosts/dave/etc/network/interfaces b/testing/hosts/dave/etc/network/interfaces
new file mode 100644 (file)
index 0000000..f3a1245
--- /dev/null
@@ -0,0 +1,12 @@
+auto lo
+iface lo inet loopback
+
+auto eth0
+iface eth0 inet static
+       address PH_IP_DAVE
+       netmask 255.255.255.0
+       broadcast 192.168.0.255
+       gateway 192.168.0.254
+iface eth0 inet6 static
+       address PH_IP6_DAVE
+       netmask 16
diff --git a/testing/hosts/dave/etc/runlevels/default/net.eth0 b/testing/hosts/dave/etc/runlevels/default/net.eth0
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
diff --git a/testing/hosts/default/etc/default/slapd b/testing/hosts/default/etc/default/slapd
new file mode 100644 (file)
index 0000000..a4a0a6e
--- /dev/null
@@ -0,0 +1,45 @@
+# Default location of the slapd.conf file or slapd.d cn=config directory. If
+# empty, use the compiled-in default (/etc/ldap/slapd.d with a fallback to
+# /etc/ldap/slapd.conf).
+SLAPD_CONF=/etc/ldap/slapd.conf
+
+# System account to run the slapd server under. If empty the server
+# will run as root.
+SLAPD_USER="openldap"
+
+# System group to run the slapd server under. If empty the server will
+# run in the primary group of its user.
+SLAPD_GROUP="openldap"
+
+# Path to the pid file of the slapd server. If not set the init.d script
+# will try to figure it out from $SLAPD_CONF (/etc/ldap/slapd.conf by
+# default)
+SLAPD_PIDFILE=
+
+# slapd normally serves ldap only on all TCP-ports 389. slapd can also
+# service requests on TCP-port 636 (ldaps) and requests via unix
+# sockets.
+# Example usage:
+# SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"
+SLAPD_SERVICES="ldap:///"
+
+# If SLAPD_NO_START is set, the init script will not start or restart
+# slapd (but stop will still work).  Uncomment this if you are
+# starting slapd via some other means or if you don't want slapd normally
+# started at boot.
+#SLAPD_NO_START=1
+
+# If SLAPD_SENTINEL_FILE is set to path to a file and that file exists,
+# the init script will not start or restart slapd (but stop will still
+# work).  Use this for temporarily disabling startup of slapd (when doing
+# maintenance, for example, or through a configuration management system)
+# when you don't want to edit a configuration file.
+SLAPD_SENTINEL_FILE=/etc/ldap/noslapd
+
+# For Kerberos authentication (via SASL), slapd by default uses the system
+# keytab file (/etc/krb5.keytab).  To use a different keytab file,
+# uncomment this line and change the path.
+#export KRB5_KTNAME=/etc/krb5.keytab
+
+# Additional options to pass to slapd
+SLAPD_OPTIONS=""
diff --git a/testing/hosts/default/etc/iptables.flush b/testing/hosts/default/etc/iptables.flush
new file mode 100644 (file)
index 0000000..b3ab63c
--- /dev/null
@@ -0,0 +1,21 @@
+*filter
+
+-F
+
+-P INPUT ACCEPT
+-P OUTPUT ACCEPT
+-P FORWARD ACCEPT
+
+COMMIT
+
+*nat
+
+-F
+
+COMMIT
+
+*mangle
+
+-F
+
+COMMIT
diff --git a/testing/hosts/default/etc/iptables.rules b/testing/hosts/default/etc/iptables.rules
new file mode 100644 (file)
index 0000000..bc3aa37
--- /dev/null
@@ -0,0 +1,24 @@
+*filter
+
+# default policy is DROP
+-P INPUT DROP
+-P OUTPUT DROP
+-P FORWARD DROP
+
+# allow esp
+-A INPUT  -i eth0 -p 50 -j ACCEPT
+-A OUTPUT -o eth0 -p 50 -j ACCEPT
+
+# allow IKE
+-A INPUT  -i eth0 -p udp --sport 500 --dport 500 -j ACCEPT
+-A OUTPUT -o eth0 -p udp --dport 500 --sport 500 -j ACCEPT
+
+# allow MobIKE
+-A INPUT  -i eth0 -p udp --sport 4500 --dport 4500 -j ACCEPT
+-A OUTPUT -o eth0 -p udp --dport 4500 --sport 4500 -j ACCEPT
+
+# allow ssh
+-A INPUT  -p tcp --dport 22 -j ACCEPT
+-A OUTPUT -p tcp --sport 22 -j ACCEPT
+
+COMMIT
diff --git a/testing/hosts/default/etc/rsyslog.conf b/testing/hosts/default/etc/rsyslog.conf
new file mode 100644 (file)
index 0000000..9f76da3
--- /dev/null
@@ -0,0 +1,125 @@
+#  /etc/rsyslog.conf   Configuration file for rsyslog.
+#
+#                      For more information see
+#                      /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html
+
+
+#################
+#### MODULES ####
+#################
+
+$ModLoad imuxsock # provides support for local system logging
+$ModLoad imklog   # provides kernel logging support
+#$ModLoad immark  # provides --MARK-- message capability
+
+# Don't drop messages
+$SystemLogRateLimitInterval 0
+$RepeatedMsgReduction off
+
+# provides UDP syslog reception
+#$ModLoad imudp
+#$UDPServerRun 514
+
+# provides TCP syslog reception
+#$ModLoad imtcp
+#$InputTCPServerRun 514
+
+
+###########################
+#### GLOBAL DIRECTIVES ####
+###########################
+
+#
+# Use traditional timestamp format.
+# To enable high precision timestamps, comment out the following line.
+#
+$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
+
+#
+# Set the default permissions for all log files.
+#
+$FileOwner root
+$FileGroup adm
+$FileCreateMode 0640
+$DirCreateMode 0755
+$Umask 0022
+
+#
+# Where to place spool and state files
+#
+$WorkDirectory /var/spool/rsyslog
+
+#
+# Include all config files in /etc/rsyslog.d/
+#
+$IncludeConfig /etc/rsyslog.d/*.conf
+
+
+###############
+#### RULES ####
+###############
+
+#
+# First some standard log files.  Log by facility.
+#
+auth,authpriv.*                        /var/log/auth.log
+*.*;auth,authpriv.none         -/var/log/syslog
+#cron.*                                /var/log/cron.log
+daemon.*                       /var/log/daemon.log
+kern.*                         -/var/log/kern.log
+lpr.*                          -/var/log/lpr.log
+mail.*                         -/var/log/mail.log
+user.*                         -/var/log/user.log
+
+#
+# Logging for the mail system.  Split it up so that
+# it is easy to write scripts to parse these files.
+#
+mail.info                      -/var/log/mail.info
+mail.warn                      -/var/log/mail.warn
+mail.err                       /var/log/mail.err
+
+#
+# Logging for INN news system.
+#
+news.crit                      /var/log/news/news.crit
+news.err                       /var/log/news/news.err
+news.notice                    -/var/log/news/news.notice
+
+#
+# Some "catch-all" log files.
+#
+*.=debug;\
+       auth,authpriv.none;\
+       news.none;mail.none     -/var/log/debug
+*.=info;*.=notice;*.=warn;\
+       auth,authpriv.none;\
+       cron,daemon.none;\
+       mail,news.none          -/var/log/messages
+
+#
+# Emergencies are sent to everybody logged in.
+#
+*.emerg                                :omusrmsg:*
+
+#
+# I like to have messages displayed on the console, but only on a virtual
+# console I usually leave idle.
+#
+#daemon,mail.*;\
+#      news.=crit;news.=err;news.=notice;\
+#      *.=debug;*.=info;\
+#      *.=notice;*.=warn       /dev/tty8
+
+# The named pipe /dev/xconsole is for the `xconsole' utility.  To use it,
+# you must invoke `xconsole' with the `-file' option:
+#
+#    $ xconsole -file /dev/xconsole [...]
+#
+# NOTE: adjust the list below, or you'll go crazy if you have a reasonably
+#      busy site..
+#
+daemon.*;mail.*;\
+       news.err;\
+       *.=debug;*.=info;\
+       *.=notice;*.=warn       |/dev/xconsole
diff --git a/testing/hosts/default/etc/security/limits.conf b/testing/hosts/default/etc/security/limits.conf
new file mode 100644 (file)
index 0000000..5b8025d
--- /dev/null
@@ -0,0 +1,58 @@
+# /etc/security/limits.conf
+#
+#Each line describes a limit for a user in the form:
+#
+#<domain>        <type>  <item>  <value>
+#
+#Where:
+#<domain> can be:
+#        - an user name
+#        - a group name, with @group syntax
+#        - the wildcard *, for default entry
+#        - the wildcard %, can be also used with %group syntax,
+#                 for maxlogin limit
+#        - NOTE: group and wildcard limits are not applied to root.
+#          To apply a limit to the root user, <domain> must be
+#          the literal username root.
+#
+#<type> can have the two values:
+#        - "soft" for enforcing the soft limits
+#        - "hard" for enforcing hard limits
+#
+#<item> can be one of the following:
+#        - core - limits the core file size (KB)
+#        - data - max data size (KB)
+#        - fsize - maximum filesize (KB)
+#        - memlock - max locked-in-memory address space (KB)
+#        - nofile - max number of open files
+#        - rss - max resident set size (KB)
+#        - stack - max stack size (KB)
+#        - cpu - max CPU time (MIN)
+#        - nproc - max number of processes
+#        - as - address space limit (KB)
+#        - maxlogins - max number of logins for this user
+#        - maxsyslogins - max number of logins on the system
+#        - priority - the priority to run user process with
+#        - locks - max number of file locks the user can hold
+#        - sigpending - max number of pending signals
+#        - msgqueue - max memory used by POSIX message queues (bytes)
+#        - nice - max nice priority allowed to raise to values: [-20, 19]
+#        - rtprio - max realtime priority
+#        - chroot - change root to directory (Debian-specific)
+#
+#<domain>      <type>  <item>         <value>
+#
+
+#*               soft    core            0
+#root            hard    core            100000
+#*               hard    rss             10000
+#@student        hard    nproc           20
+#@faculty        soft    nproc           20
+#@faculty        hard    nproc           50
+#ftp             hard    nproc           0
+#ftp             -       chroot          /ftp
+#@student        -       maxlogins       4
+
+* hard core unlimited
+
+# End of file
diff --git a/testing/hosts/default/etc/sysctl.conf b/testing/hosts/default/etc/sysctl.conf
new file mode 100644 (file)
index 0000000..cefc73f
--- /dev/null
@@ -0,0 +1,60 @@
+#
+# /etc/sysctl.conf - Configuration file for setting system variables
+# See /etc/sysctl.d/ for additonal system variables
+# See sysctl.conf (5) for information.
+#
+
+#kernel.domainname = example.com
+
+# Uncomment the following to stop low-level messages on console
+#kernel.printk = 3 4 1 3
+
+##############################################################3
+# Functions previously found in netbase
+#
+
+# Uncomment the next two lines to enable Spoof protection (reverse-path filter)
+# Turn on Source Address Verification in all interfaces to
+# prevent some spoofing attacks
+#net.ipv4.conf.default.rp_filter=1
+#net.ipv4.conf.all.rp_filter=1
+
+# Uncomment the next line to enable TCP/IP SYN cookies
+# See http://lwn.net/Articles/277146/
+# Note: This may impact IPv6 TCP sessions too
+#net.ipv4.tcp_syncookies=1
+
+# Uncomment the next line to enable packet forwarding for IPv4
+net.ipv4.ip_forward=1
+
+# Uncomment the next line to enable packet forwarding for IPv6
+#  Enabling this option disables Stateless Address Autoconfiguration
+#  based on Router Advertisements for this host
+net.ipv6.conf.all.forwarding=1
+
+
+###################################################################
+# Additional settings - these settings can improve the network
+# security of the host and prevent against some network attacks
+# including spoofing attacks and man in the middle attacks through
+# redirection. Some network environments, however, require that these
+# settings are disabled so review and enable them as needed.
+#
+# Do not accept ICMP redirects (prevent MITM attacks)
+#net.ipv4.conf.all.accept_redirects = 0
+#net.ipv6.conf.all.accept_redirects = 0
+# _or_
+# Accept ICMP redirects only for gateways listed in our default
+# gateway list (enabled by default)
+# net.ipv4.conf.all.secure_redirects = 1
+#
+# Do not send ICMP redirects (we are not a router)
+#net.ipv4.conf.all.send_redirects = 0
+#
+# Do not accept IP source route packets (we are not a router)
+#net.ipv4.conf.all.accept_source_route = 0
+#net.ipv6.conf.all.accept_source_route = 0
+#
+# Log Martian Packets
+#net.ipv4.conf.all.log_martians = 1
+#
diff --git a/testing/hosts/moon/etc/conf.d/hostname b/testing/hosts/moon/etc/conf.d/hostname
deleted file mode 100644 (file)
index 78e6953..0000000
+++ /dev/null
@@ -1 +0,0 @@
-HOSTNAME=moon
diff --git a/testing/hosts/moon/etc/conf.d/net b/testing/hosts/moon/etc/conf.d/net
deleted file mode 100644 (file)
index 7f09fd8..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-# /etc/conf.d/net:
-
-# This is basically the ifconfig argument without the ifconfig $iface
-#
-config_eth0=( "PH_IP_MOON broadcast 192.168.0.255 netmask 255.255.255.0"
-              "PH_IP6_MOON/16" )
-config_eth1=( "PH_IP_MOON1 broadcast 10.1.255.255 netmask 255.255.0.0"
-              "PH_IP6_MOON1/16" )
-
-# For setting the default gateway
-#
-routes_eth0=( "default via 192.168.0.254" )
diff --git a/testing/hosts/moon/etc/hostname b/testing/hosts/moon/etc/hostname
new file mode 100644 (file)
index 0000000..605185e
--- /dev/null
@@ -0,0 +1 @@
+moon
diff --git a/testing/hosts/moon/etc/init.d/iptables b/testing/hosts/moon/etc/init.d/iptables
deleted file mode 100755 (executable)
index f5fa80b..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/sbin/runscript
-# Copyright 1999-2004 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-opts="start stop reload"
-
-depend() {
-       before net
-       need logger
-}
-
-start() {
-       ebegin "Starting firewall"
-
-       # enable IP forwarding
-       echo 1 > /proc/sys/net/ipv4/ip_forward
-       
-       # default policy is DROP
-       /sbin/iptables -P INPUT DROP
-       /sbin/iptables -P OUTPUT DROP
-       /sbin/iptables -P FORWARD DROP
-
-       # allow esp
-       iptables -A INPUT  -i eth0 -p 50 -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p 50 -j ACCEPT
-
-       # allow IKE
-       iptables -A INPUT  -i eth0 -p udp --sport 500 --dport 500 -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p udp --dport 500 --sport 500 -j ACCEPT
-
-       # allow MobIKE
-       iptables -A INPUT  -i eth0 -p udp --sport 4500 --dport 4500 -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p udp --dport 4500 --sport 4500 -j ACCEPT
-
-       # allow crl fetch from winnetou
-       iptables -A INPUT  -i eth0 -p tcp --sport 80 -s PH_IP_WINNETOU -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p tcp --dport 80 -d PH_IP_WINNETOU -j ACCEPT
-
-       # allow ssh
-       iptables -A INPUT  -p tcp --dport 22 -j ACCEPT
-       iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
-
-       eend $?
-}
-
-stop() {
-       ebegin "Stopping firewall"
-               for a in `cat /proc/net/ip_tables_names`; do
-                       /sbin/iptables -F -t $a
-                       /sbin/iptables -X -t $a
-       
-                       if [ $a == nat ]; then
-                               /sbin/iptables -t nat -P PREROUTING ACCEPT
-                               /sbin/iptables -t nat -P POSTROUTING ACCEPT
-                               /sbin/iptables -t nat -P OUTPUT ACCEPT
-                       elif [ $a == mangle ]; then
-                               /sbin/iptables -t mangle -P PREROUTING ACCEPT
-                               /sbin/iptables -t mangle -P INPUT ACCEPT
-                               /sbin/iptables -t mangle -P FORWARD ACCEPT
-                               /sbin/iptables -t mangle -P OUTPUT ACCEPT
-                               /sbin/iptables -t mangle -P POSTROUTING ACCEPT
-                       elif [ $a == filter ]; then
-                               /sbin/iptables -t filter -P INPUT ACCEPT
-                               /sbin/iptables -t filter -P FORWARD ACCEPT
-                               /sbin/iptables -t filter -P OUTPUT ACCEPT
-                       fi
-               done
-       eend $?
-}
-
-reload() {
-       ebegin "Flushing firewall"
-               for a in `cat /proc/net/ip_tables_names`; do
-                       /sbin/iptables -F -t $a
-                       /sbin/iptables -X -t $a
-               done;
-        eend $?
-       start
-}
-
diff --git a/testing/hosts/moon/etc/init.d/net.eth0 b/testing/hosts/moon/etc/init.d/net.eth0
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
diff --git a/testing/hosts/moon/etc/init.d/net.eth1 b/testing/hosts/moon/etc/init.d/net.eth1
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
old mode 100755 (executable)
new mode 100644 (file)
index 6ee481e..623e75d
@@ -7,20 +7,20 @@ conn %default
        keylife=20m
        rekeymargin=3m
        keyingtries=1
-       left=PH_IP_MOON
+       left=192.168.0.1
        leftcert=moonCert.pem
        leftid=@moon.strongswan.org
        leftfirewall=yes
 
 conn net-net
        leftsubnet=10.1.0.0/16
-       right=PH_IP_SUN
+       right=192.168.0.2
        rightsubnet=10.2.0.0/16
        rightid=@sun.strongswan.org
        auto=add
-        
+
 conn host-host
-       right=PH_IP_SUN
+       right=192.168.0.2
        rightid=@sun.strongswan.org
        auto=add
 
diff --git a/testing/hosts/moon/etc/network/interfaces b/testing/hosts/moon/etc/network/interfaces
new file mode 100644 (file)
index 0000000..df85cc1
--- /dev/null
@@ -0,0 +1,21 @@
+auto lo
+iface lo inet loopback
+
+auto eth0
+iface eth0 inet static
+       address PH_IP_MOON
+       netmask 255.255.255.0
+       broadcast 192.168.0.255
+       gateway 192.168.0.254
+iface eth0 inet6 static
+       address PH_IP6_MOON
+       netmask 16
+
+auto eth1
+iface eth1 inet static
+       address PH_IP_MOON1
+       netmask 255.255.0.0
+       broadcast 10.1.255.255
+iface eth1 inet6 static
+       address PH_IP6_MOON1
+       netmask 16
diff --git a/testing/hosts/moon/etc/runlevels/default/net.eth0 b/testing/hosts/moon/etc/runlevels/default/net.eth0
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
diff --git a/testing/hosts/moon/etc/runlevels/default/net.eth1 b/testing/hosts/moon/etc/runlevels/default/net.eth1
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
diff --git a/testing/hosts/ssh_host_rsa_key.pub b/testing/hosts/ssh_host_rsa_key.pub
deleted file mode 100644 (file)
index a5f71de..0000000
+++ /dev/null
@@ -1 +0,0 @@
-ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAsxKfTm05po6leGD8C+M0eAR5EE4s1pQXc0D/dVlqrmfZ65h5BFQY9lnwpCvapV6OVqKWx8ICmeIH3OhaPxPPNKlU81f3d0xgh8BRJpWh459DYkRVa5f7ax5eeFE1lelj9s1d0seUl/IZolpJ8Wmt9TN1hwJ0mrkwN4670rb3urc=
diff --git a/testing/hosts/sun/etc/conf.d/hostname b/testing/hosts/sun/etc/conf.d/hostname
deleted file mode 100644 (file)
index bc042b6..0000000
+++ /dev/null
@@ -1 +0,0 @@
-HOSTNAME=sun
diff --git a/testing/hosts/sun/etc/conf.d/net b/testing/hosts/sun/etc/conf.d/net
deleted file mode 100644 (file)
index 4a6370a..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-# /etc/conf.d/net:
-
-# This is basically the ifconfig argument without the ifconfig $iface
-#
-config_eth0=( "PH_IP_SUN broadcast 192.168.0.255 netmask 255.255.255.0"
-              "PH_IP6_SUN/16" )
-config_eth1=( "PH_IP_SUN1 broadcast 10.2.255.255 netmask 255.255.0.0"
-              "PH_IP6_SUN1/16" )
-
-# For setting the default gateway
-#
-routes_eth0=( "default via 192.168.0.254" )
-
-
diff --git a/testing/hosts/sun/etc/hostname b/testing/hosts/sun/etc/hostname
new file mode 100644 (file)
index 0000000..6926997
--- /dev/null
@@ -0,0 +1 @@
+sun
diff --git a/testing/hosts/sun/etc/init.d/iptables b/testing/hosts/sun/etc/init.d/iptables
deleted file mode 100755 (executable)
index aeaf472..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/sbin/runscript
-# Copyright 1999-2004 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-opts="start stop reload"
-
-depend() {
-       before net
-       need logger
-}
-
-start() {
-       ebegin "Starting firewall"
-
-       # enable IP forwarding
-       echo 1 > /proc/sys/net/ipv4/ip_forward
-       
-       # default policy is DROP
-       /sbin/iptables -P INPUT DROP
-       /sbin/iptables -P OUTPUT DROP
-       /sbin/iptables -P FORWARD DROP
-
-       # allow esp
-       iptables -A INPUT  -i eth0 -p 50 -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p 50 -j ACCEPT
-
-       # allow IKE
-       iptables -A INPUT  -i eth0 -p udp --dport 500 -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p udp --sport 500 -j ACCEPT
-
-        # allow NAT-T 
-       iptables -A INPUT  -i eth0 -p udp --dport 4500 -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p udp --sport 4500 -j ACCEPT
-
-       # allow crl fetch from winnetou
-       iptables -A INPUT  -i eth0 -p tcp --sport 80 -s PH_IP_WINNETOU -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p tcp --dport 80 -d PH_IP_WINNETOU -j ACCEPT
-
-       # allow ssh
-       iptables -A INPUT  -p tcp --dport 22 -j ACCEPT
-       iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
-
-       eend $?
-}
-
-stop() {
-       ebegin "Stopping firewall"
-               for a in `cat /proc/net/ip_tables_names`; do
-                       /sbin/iptables -F -t $a
-                       /sbin/iptables -X -t $a
-       
-                       if [ $a == nat ]; then
-                               /sbin/iptables -t nat -P PREROUTING ACCEPT
-                               /sbin/iptables -t nat -P POSTROUTING ACCEPT
-                               /sbin/iptables -t nat -P OUTPUT ACCEPT
-                       elif [ $a == mangle ]; then
-                               /sbin/iptables -t mangle -P PREROUTING ACCEPT
-                               /sbin/iptables -t mangle -P INPUT ACCEPT
-                               /sbin/iptables -t mangle -P FORWARD ACCEPT
-                               /sbin/iptables -t mangle -P OUTPUT ACCEPT
-                               /sbin/iptables -t mangle -P POSTROUTING ACCEPT
-                       elif [ $a == filter ]; then
-                               /sbin/iptables -t filter -P INPUT ACCEPT
-                               /sbin/iptables -t filter -P FORWARD ACCEPT
-                               /sbin/iptables -t filter -P OUTPUT ACCEPT
-                       fi
-               done
-       eend $?
-}
-
-reload() {
-       ebegin "Flushing firewall"
-               for a in `cat /proc/net/ip_tables_names`; do
-                       /sbin/iptables -F -t $a
-                       /sbin/iptables -X -t $a
-               done;
-        eend $?
-       start
-}
-
diff --git a/testing/hosts/sun/etc/init.d/net.eth0 b/testing/hosts/sun/etc/init.d/net.eth0
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
diff --git a/testing/hosts/sun/etc/init.d/net.eth1 b/testing/hosts/sun/etc/init.d/net.eth1
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
old mode 100755 (executable)
new mode 100644 (file)
index 277928e..2f979f1
@@ -7,20 +7,20 @@ conn %default
        keylife=20m
        rekeymargin=3m
        keyingtries=1
-       left=PH_IP_SUN
+       left=192.168.0.2
        leftcert=sunCert.pem
        leftid=@sun.strongswan.org
        leftfirewall=yes
 
 conn net-net
        leftsubnet=10.2.0.0/16
-       right=PH_IP_MOON
+       right=192.168.0.1
        rightsubnet=10.1.0.0/16
        rightid=@moon.strongswan.org
        auto=add
 
 conn host-host
-       right=PH_IP_MOON
+       right=192.168.0.1
        rightid=@moon.strongswan.org
        auto=add
 
diff --git a/testing/hosts/sun/etc/network/interfaces b/testing/hosts/sun/etc/network/interfaces
new file mode 100644 (file)
index 0000000..cd8186e
--- /dev/null
@@ -0,0 +1,21 @@
+auto lo
+iface lo inet loopback
+
+auto eth0
+iface eth0 inet static
+       address PH_IP_SUN
+       netmask 255.255.255.0
+       broadcast 192.168.0.255
+       gateway 192.168.0.254
+iface eth0 inet6 static
+       address PH_IP6_SUN
+       netmask 16
+
+auto eth1
+iface eth1 inet static
+       address PH_IP_SUN1
+       netmask 255.255.0.0
+       broadcast 10.2.255.255
+iface eth1 inet6 static
+       address PH_IP6_SUN1
+       netmask 16
diff --git a/testing/hosts/sun/etc/runlevels/default/net.eth0 b/testing/hosts/sun/etc/runlevels/default/net.eth0
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
diff --git a/testing/hosts/sun/etc/runlevels/default/net.eth1 b/testing/hosts/sun/etc/runlevels/default/net.eth1
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
diff --git a/testing/hosts/venus/etc/conf.d/hostname b/testing/hosts/venus/etc/conf.d/hostname
deleted file mode 100644 (file)
index c9e3dd1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-HOSTNAME=venus
diff --git a/testing/hosts/venus/etc/conf.d/net b/testing/hosts/venus/etc/conf.d/net
deleted file mode 100644 (file)
index 43ec978..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-# /etc/conf.d/net:
-
-# This is basically the ifconfig argument without the ifconfig $iface
-#
-config_eth0=( "PH_IP_VENUS broadcast 10.1.255.255 netmask 255.255.0.0"
-              "PH_IP6_VENUS/16" )
-
-# For setting the default gateway
-#
-routes_eth0=( "default via PH_IP_MOON1" )
diff --git a/testing/hosts/venus/etc/hostname b/testing/hosts/venus/etc/hostname
new file mode 100644 (file)
index 0000000..acf16d8
--- /dev/null
@@ -0,0 +1 @@
+venus
diff --git a/testing/hosts/venus/etc/init.d/iptables b/testing/hosts/venus/etc/init.d/iptables
deleted file mode 100755 (executable)
index 1097ac5..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/sbin/runscript
-# Copyright 1999-2004 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-opts="start stop reload"
-
-depend() {
-       before net
-       need logger
-}
-
-start() {
-       ebegin "Starting firewall"
-
-       # default policy is DROP
-       /sbin/iptables -P INPUT DROP
-       /sbin/iptables -P OUTPUT DROP
-       /sbin/iptables -P FORWARD DROP
-
-       # allow IKE
-        iptables -A INPUT  -i eth0 -p udp --sport 500 --dport 500 -j ACCEPT
-        iptables -A OUTPUT -o eth0 -p udp --dport 500 --sport 500 -j ACCEPT
-                       
-       # allow NAT-T 
-       iptables -A INPUT  -i eth0 -p udp --sport 4500 --dport 4500 -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p udp --dport 4500 --sport 4500 -j ACCEPT
-
-
-       # allow crl fetch from winnetou
-       iptables -A INPUT  -i eth0 -p tcp --sport 80 -s PH_IP_WINNETOU -j ACCEPT
-       iptables -A OUTPUT -o eth0 -p tcp --dport 80 -d PH_IP_WINNETOU -j ACCEPT
-
-       # allow ssh
-       iptables -A INPUT  -p tcp --dport 22 -j ACCEPT
-       iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
-
-       eend $?
-}
-
-stop() {
-       ebegin "Stopping firewall"
-               for a in `cat /proc/net/ip_tables_names`; do
-                       /sbin/iptables -F -t $a
-                       /sbin/iptables -X -t $a
-       
-                       if [ $a == nat ]; then
-                               /sbin/iptables -t nat -P PREROUTING ACCEPT
-                               /sbin/iptables -t nat -P POSTROUTING ACCEPT
-                               /sbin/iptables -t nat -P OUTPUT ACCEPT
-                       elif [ $a == mangle ]; then
-                               /sbin/iptables -t mangle -P PREROUTING ACCEPT
-                               /sbin/iptables -t mangle -P INPUT ACCEPT
-                               /sbin/iptables -t mangle -P FORWARD ACCEPT
-                               /sbin/iptables -t mangle -P OUTPUT ACCEPT
-                               /sbin/iptables -t mangle -P POSTROUTING ACCEPT
-                       elif [ $a == filter ]; then
-                               /sbin/iptables -t filter -P INPUT ACCEPT
-                               /sbin/iptables -t filter -P FORWARD ACCEPT
-                               /sbin/iptables -t filter -P OUTPUT ACCEPT
-                       fi
-               done
-       eend $?
-}
-
-reload() {
-       ebegin "Flushing firewall"
-               for a in `cat /proc/net/ip_tables_names`; do
-                       /sbin/iptables -F -t $a
-                       /sbin/iptables -X -t $a
-               done;
-        eend $?
-       start
-}
-
diff --git a/testing/hosts/venus/etc/init.d/net.eth0 b/testing/hosts/venus/etc/init.d/net.eth0
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
old mode 100755 (executable)
new mode 100644 (file)
index dd6a82f..e4604cb
@@ -13,7 +13,7 @@ conn nat-t
        leftcert=venusCert.pem
        leftid=@venus.strongswan.org
        leftfirewall=yes
-       right=PH_IP_SUN
+       right=192.168.0.2
        rightid=@sun.strongswan.org
        rightsubnet=10.2.0.0/16
        auto=add
diff --git a/testing/hosts/venus/etc/network/interfaces b/testing/hosts/venus/etc/network/interfaces
new file mode 100644 (file)
index 0000000..13a1f73
--- /dev/null
@@ -0,0 +1,12 @@
+auto lo
+iface lo inet loopback
+
+auto eth0
+iface eth0 inet static
+       address PH_IP_VENUS
+       netmask 255.255.0.0
+       broadcast 10.1.255.255
+       gateway 10.1.0.1
+iface eth0 inet6 static
+       address PH_IP6_VENUS
+       netmask 16
diff --git a/testing/hosts/venus/etc/runlevels/default/net.eth0 b/testing/hosts/venus/etc/runlevels/default/net.eth0
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
diff --git a/testing/hosts/winnetou/etc/apache2/conf.d/testresults-as-text b/testing/hosts/winnetou/etc/apache2/conf.d/testresults-as-text
new file mode 100644 (file)
index 0000000..6f5f301
--- /dev/null
@@ -0,0 +1 @@
+AddType text/plain .iptables .log .sql
diff --git a/testing/hosts/winnetou/etc/apache2/conf/ssl/ca.crt b/testing/hosts/winnetou/etc/apache2/conf/ssl/ca.crt
deleted file mode 100644 (file)
index 0de3b26..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDtTCCAp2gAwIBAgIBADANBgkqhkiG9w0BAQQFADBFMQswCQYDVQQGEwJDSDEZ
-MBcGA1UEChMQTGludXggc3Ryb25nU3dhbjEbMBkGA1UEAxMSc3Ryb25nU3dhbiBS
-b290IENBMB4XDTA0MDkxMDExMDE0NVoXDTE0MDkwODExMDE0NVowRTELMAkGA1UE
-BhMCQ0gxGTAXBgNVBAoTEExpbnV4IHN0cm9uZ1N3YW4xGzAZBgNVBAMTEnN0cm9u
-Z1N3YW4gUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL/y
-X2LqPVZuWLPIeknK86xhz6ljd3NNhC2z+P1uoCP3sBMuZiZQEjFzhnKcbXxCeo2f
-FnvhOOjrrisSuVkzuu82oxXD3fIkzuS7m9V4E10EZzgmKWIf+WuNRfbgAuUINmLc
-4YGAXBQLPyzpP4Ou48hhz/YQo58Bics6PHy5v34qCVROIXDvqhj91P8g+pS+F21/
-7P+CH2jRcVIEHZtG8M/PweTPQ95dPzpYd2Ov6SZ/U7EWmbMmT8VcUYn1aChxFmy5
-gweVBWlkH6MP+1DeE0/tL5c87xo5KCeGK8Tdqpe7sBRC4pPEEHDQciTUvkeuJ1Pr
-K+1LwdqRxo7HgMRiDw8CAwEAAaOBrzCBrDAPBgNVHRMBAf8EBTADAQH/MAsGA1Ud
-DwQEAwIBBjAdBgNVHQ4EFgQUXafdcAZRMn7ntm2zteXgYOouTe8wbQYDVR0jBGYw
-ZIAUXafdcAZRMn7ntm2zteXgYOouTe+hSaRHMEUxCzAJBgNVBAYTAkNIMRkwFwYD
-VQQKExBMaW51eCBzdHJvbmdTd2FuMRswGQYDVQQDExJzdHJvbmdTd2FuIFJvb3Qg
-Q0GCAQAwDQYJKoZIhvcNAQEEBQADggEBAJrXTj5gWS37myHHhii9drYwkMFyDHS/
-lHU8rW/drcnHdus507+qUhNr9SiEAHg4Ywj895UDvT0a1sFaw44QyEa/94iKA8/n
-+g5kS1IrKvWu3wu8UI3EgzChgHV3cncQlQWbK+FI9Y3Ax1O1np1r+wLptoWpKKKE
-UxsYcxP9K4Nbyeon0AIHOajUheiL3t6aRc3m0o7VU7Do6S2r+He+1Zq/nRUfFeTy
-0Atebkn8tmUpPSKWaXkmwpVNrjZ1Qu9umAU+dtJyhzL2zmnyhPC4VqpsKCOp7imy
-gKZvUIKPm1zyf4T+yjwxwkiX2xVseoM3aKswb1EoZFelHwndU7u0GQ8=
------END CERTIFICATE-----
diff --git a/testing/hosts/winnetou/etc/apache2/conf/ssl/server.crt b/testing/hosts/winnetou/etc/apache2/conf/ssl/server.crt
deleted file mode 100644 (file)
index 956c217..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIBDjANBgkqhkiG9w0BAQQFADBFMQswCQYDVQQGEwJDSDEZ
-MBcGA1UEChMQTGludXggc3Ryb25nU3dhbjEbMBkGA1UEAxMSc3Ryb25nU3dhbiBS
-b290IENBMB4XDTA1MDYwODE5MTcxNFoXDTEwMDYwNzE5MTcxNFowSjELMAkGA1UE
-BhMCQ0gxGTAXBgNVBAoTEExpbnV4IHN0cm9uZ1N3YW4xIDAeBgNVBAMTF3dpbm5l
-dG91LnN0cm9uZ3N3YW4ub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAwBkz95BmByWVZaEW8cDbeuGr4C1caGAj4QPmuwaIriK+7XqXuh16Ahe3S5vZ
-F56WhUSvMDOIyULckKH84oSa3Jx/SCz0g7X42x8vZuq92tpsjcP/u7BlyqpBUtLa
-r14qm5wYw/1nQqMcSG3k9MQOQ+e9KgaGqpidxWM/8T4M/41AaFRBK2gQGBUULo26
-sjoq3af7Z2jYmWkP/kzj1CHLy9Mgt+UvhKeA+ag5cZnyOG596cqVjlKyqG7vdggk
-wW2n+/KDpHNOndYfT7GMFeGXUNzJPkCImWlttic7ssi0mjP3q3MuOP3FNHIRMd2H
-AcNcqT0bgdJHqnNzGv8C0Ei9XQIDAQABo4IBCTCCAQUwCQYDVR0TBAIwADALBgNV
-HQ8EBAMCA6gwHQYDVR0OBBYEFEMS0mbhrA4zDvmfKf4MntUNxkH4MG0GA1UdIwRm
-MGSAFF2n3XAGUTJ+57Zts7Xl4GDqLk3voUmkRzBFMQswCQYDVQQGEwJDSDEZMBcG
-A1UEChMQTGludXggc3Ryb25nU3dhbjEbMBkGA1UEAxMSc3Ryb25nU3dhbiBSb290
-IENBggEAMCIGA1UdEQQbMBmCF3dpbm5ldG91LnN0cm9uZ3N3YW4ub3JnMDkGA1Ud
-HwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwuc3Ryb25nc3dhbi5vcmcvc3Ryb25nc3dh
-bi5jcmwwDQYJKoZIhvcNAQEEBQADggEBACO4+j1Mwt/lbkopeSJst46uFh7OtegG
-6IWNE30i3l3FIn9slSwAOMtmZR0hAF8sExvk61EPlzCR/d9trSJ5+gyjPkeF/enw
-p61rxPMT13Grzomi9gYlk6Q/0zLmE9uYWEY69Q0bEIUcfdZfwB+F7kesa946JNMc
-yHfVEhKtvzmns9ueG0S/8E+6MPDeJv+JHQ++SdWSvOVg6JNxXDGusnim2fjM2Aln
-JmqA6iU4IaPl9DUCuXlLOVv/YhwhviNEbF94upyHq8xjOZdzPbKroHXg/2yvalAw
-4aXc/ZsnFxqsq3i6a2Fj1Y4J7gYsNO/HwA0xvKz3loOTqHaJqO/qeow=
------END CERTIFICATE-----
diff --git a/testing/hosts/winnetou/etc/apache2/conf/ssl/server.key b/testing/hosts/winnetou/etc/apache2/conf/ssl/server.key
deleted file mode 100644 (file)
index 7270271..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEpAIBAAKCAQEAwBkz95BmByWVZaEW8cDbeuGr4C1caGAj4QPmuwaIriK+7XqX
-uh16Ahe3S5vZF56WhUSvMDOIyULckKH84oSa3Jx/SCz0g7X42x8vZuq92tpsjcP/
-u7BlyqpBUtLar14qm5wYw/1nQqMcSG3k9MQOQ+e9KgaGqpidxWM/8T4M/41AaFRB
-K2gQGBUULo26sjoq3af7Z2jYmWkP/kzj1CHLy9Mgt+UvhKeA+ag5cZnyOG596cqV
-jlKyqG7vdggkwW2n+/KDpHNOndYfT7GMFeGXUNzJPkCImWlttic7ssi0mjP3q3Mu
-OP3FNHIRMd2HAcNcqT0bgdJHqnNzGv8C0Ei9XQIDAQABAoIBACYiWrCgl8B/c4Lz
-Uay4Tlm8hvQ/zQJjY3v93EXwbB21hBV8qrYlt9zGfHqj+5q2vsbB9c0pzdO2VDba
-EWueS2fUIWhglEG5VCebrztNCldx2O7jo9bMk8iBt+oLNaJunSK7ACeYHHGcE7dF
-KZh1eyd7z4+SMBWZqmhO5ZisasQoHCusVGepcyyMGQNkc3XKJ6resGAsOqrOoq7Q
-C4vO5Kkbnk8nnEGmQ/ldD8LwIyq1hzVLDiiqWXZgh6S5l4BEo7Dy3KYrZoZfVcZK
-GMVhAI2+uA1ZqY9twpwryT6VZ3eK4DXF/COQntiBW5pLOpaqTOnKqiVmZFwfbo3u
-cq8n5jkCgYEA5zgzRLifbM0q34c2HX8pTegh+BH7MGCxtcoU2uRPaXiGkqQObHI9
-aItrgUQp+pAmKSBnEWJKgKsOh2Uf5ogjIeNuruGG/AXw/Pw2ORHNueenhDuhu69T
-E2I4yxT3PPYbdzJ4ylBElfgm9WTrv7Wi7wSSfgQ6rEFdWukXa5vvsqMCgYEA1K+q
-m1Jv9MGVIVc6MxhuOOj2Ym+qcWt/Pjvg78rR8SRsKwHlGTuv1rdWUSXYDr3f2Nf7
-6DdbJtaSx5f8gY/UG34yGZx5FFbYV03vcCYBaLXsi/b6H7vb/VW74Y5g6bXqnprv
-4mcdVU7xfyNFgdbLPAP9sYVLijPYDwm0Qq3cz/8CgYBKSJz4BBR8AQI4JBl3qoXb
-mKtpJmW76iTN0amXlWgJ64XYkMptftpJvxj/w6V08WDBL77NL/XdlpcpWozAJJac
-6ZOCrcQPLd15eZH2Dck5Y7pG2l2gjbgz7wdt/0NbG3pBdj6mSNlwEPR7PDwdMD6z
-aZWi1LsA4lMaxO4YTVXZ3wKBgQCoFhTNH/+e/YawjNFQJFSn4WUnMn0Pmhc7xfLl
-T/NPkqtx6dN3d7ZmCQrMow33yJOqOje5tFXzgc0KtNE4S8Uj3T4XA5SlQGVFyjAa
-/85JRM2naA8RGVSpCCKuBeoNilnb8zL2SOvjyboN8oAyNuDzk2vh6ihjFsoASHkP
-4XwLXQKBgQC0k6rzt/plIwEiP56XXOqwOxJj6kuE/hx1zGIiGT6lWiOsih20Ym2T
-kYegVFvuDIWmSIAxGONWyee1lfnJbEuaHRixWQTnHUpqrU0FSnZTubnR3q/faZat
-hrvLDdpa0ydAKoMEn3qUPSrh3CdBfi3KTQAQn2Mlk7bGHh9ICWi3vA==
------END RSA PRIVATE KEY-----
diff --git a/testing/hosts/winnetou/etc/apache2/modules.d/00_mod_mime.conf b/testing/hosts/winnetou/etc/apache2/modules.d/00_mod_mime.conf
deleted file mode 100644 (file)
index 72b7e0e..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-# DefaultType: the default MIME type the server will use for a document
-# if it cannot otherwise determine one, such as from filename extensions.
-# If your server contains mostly text or HTML documents, "text/plain" is
-# a good value.  If most of your content is binary, such as applications
-# or images, you may want to use "application/octet-stream" instead to
-# keep browsers from trying to display binary files as though they are
-# text.
-DefaultType text/plain
-
-<IfModule mime_module>
-# TypesConfig points to the file containing the list of mappings from
-# filename extension to MIME-type.
-TypesConfig /etc/mime.types
-
-# AddType allows you to add to or override the MIME configuration
-# file specified in TypesConfig for specific file types.
-#AddType application/x-gzip .tgz
-
-# AddEncoding allows you to have certain browsers uncompress
-# information on the fly. Note: Not all browsers support this.
-#AddEncoding x-compress .Z
-#AddEncoding x-gzip .gz .tgz
-
-# If the AddEncoding directives above are commented-out, then you
-# probably should define those extensions to indicate media types:
-AddType application/x-compress .Z
-AddType application/x-gzip .gz .tgz
-
-# AddHandler allows you to map certain file extensions to "handlers":
-# actions unrelated to filetype. These can be either built into the server
-# or added with the Action directive (see below)
-
-# To use CGI scripts outside of ScriptAliased directories:
-# (You will also need to add "ExecCGI" to the "Options" directive.)
-AddHandler cgi-script .cgi
-
-# For files that include their own HTTP headers:
-#AddHandler send-as-is asis
-
-# For server-parsed imagemap files:
-#AddHandler imap-file map
-
-# For type maps (negotiated resources):
-AddHandler type-map var
-
-# Filters allow you to process content before it is sent to the client.
-#
-# To parse .shtml files for server-side includes (SSI):
-# (You will also need to add "Includes" to the "Options" directive.)
-#AddType text/html .shtml
-#AddOutputFilter INCLUDES .shtml
-</IfModule>
-
-<IfModule mime_magic_module>
-# The mod_mime_magic module allows the server to use various hints from the
-# contents of the file itself to determine its type.  The MIMEMagicFile
-# directive tells the module where the hint definitions are located.
-MIMEMagicFile /etc/apache2/magic
-</IfModule>
-
-# vim: ts=4 filetype=apache
similarity index 98%
rename from testing/hosts/winnetou/etc/apache2/vhosts.d/01_ocsp_vhost.conf
rename to testing/hosts/winnetou/etc/apache2/sites-enabled/001-ocsp_vhost
index 9a32412dbbb578092c2bb214c3da68b6fb345811..b76080e37011eebca838e825913f88d8ae2a72fd 100644 (file)
@@ -2,6 +2,8 @@
 
 Listen 8880
 
+AddHandler cgi-script .cgi
+
 <VirtualHost *:8880>
     ServerAdmin  root@strongswan.org
     DocumentRoot /etc/openssl/ocsp
diff --git a/testing/hosts/winnetou/etc/conf.d/hostname b/testing/hosts/winnetou/etc/conf.d/hostname
deleted file mode 100644 (file)
index 1bfa5ac..0000000
+++ /dev/null
@@ -1 +0,0 @@
-HOSTNAME=winnetou
diff --git a/testing/hosts/winnetou/etc/conf.d/net b/testing/hosts/winnetou/etc/conf.d/net
deleted file mode 100644 (file)
index 7fbc370..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-# /etc/conf.d/net:
-
-# This is basically the ifconfig argument without the ifconfig $iface
-#
-config_eth0=( "PH_IP_WINNETOU broadcast 192.168.0.255 netmask 255.255.255.0"
-              "PH_IP6_WINNETOU/16" )
-
-# For setting the default gateway
-#
-routes_eth0=( "default via 192.168.0.254" )
diff --git a/testing/hosts/winnetou/etc/conf.d/slapd b/testing/hosts/winnetou/etc/conf.d/slapd
deleted file mode 100644 (file)
index 8d9ac47..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-# conf.d file for the openldap-2.1 series
-#
-# To enable both the standard unciphered server and the ssl encrypted
-# one uncomment this line or set any other server starting options
-# you may desire.
-#
-# OPTS="-h 'ldaps:// ldap:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock'"
-OPTS="-4"
diff --git a/testing/hosts/winnetou/etc/init.d/apache2 b/testing/hosts/winnetou/etc/init.d/apache2
deleted file mode 100755 (executable)
index 5f72d30..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-#!/sbin/runscript
-# Copyright 1999-2007 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-opts="configtest fullstatus graceful gracefulstop modules reload"
-
-depend() {
-       need net
-       use mysql dns logger netmount postgresql
-       after sshd
-}
-
-configtest() {
-       ebegin "Checking Apache Configuration"
-       checkconfig
-       eend $?
-}
-
-checkconfig() {
-       SERVERROOT="${SERVERROOT:-/usr/lib/apache2}"
-       if [ ! -d ${SERVERROOT} ]; then
-               eerror "SERVERROOT does not exist: ${SERVERROOT}"
-               return 1
-       fi
-
-       CONFIGFILE="${CONFIGFILE:-/etc/apache2/httpd.conf}"
-       [ "${CONFIGFILE#/}" = "${CONFIGFILE}" ] && CONFIGFILE="${SERVERROOT}/${CONFIGFILE}"
-       if [ ! -r "${CONFIGFILE}" ]; then
-               eerror "Unable to read configuration file: ${CONFIGFILE}"
-               return 1
-       fi
-
-       APACHE2_OPTS="${APACHE2_OPTS} -d ${SERVERROOT}"
-       APACHE2_OPTS="${APACHE2_OPTS} -f ${CONFIGFILE}"
-       [ -n "${STARTUPERRORLOG}" ] && APACHE2_OPTS="${APACHE2_OPTS} -E ${STARTUPERRORLOG}"
-
-       APACHE2="/usr/sbin/apache2"
-
-       ${APACHE2} ${APACHE2_OPTS} -t 1>/dev/null 2>&1
-       ret=$?
-       if [ $ret -ne 0 ]; then
-               eerror "Apache2 has detected a syntax error in your configuration files:"
-               ${APACHE2} ${APACHE2_OPTS} -t
-       fi
-
-       return $ret
-}
-
-start() {
-       checkconfig || return 1
-       ebegin "Starting apache2"
-       [ -f /var/log/apache2/ssl_scache ] && rm /var/log/apache2/ssl_scache
-
-       start-stop-daemon --start --exec ${APACHE2} -- ${APACHE2_OPTS} -k start
-       eend $?
-}
-
-stop() {
-       checkconfig || return 1
-       ebegin "Stopping apache2"
-       start-stop-daemon --stop --retry -TERM/5/-KILL/5 --exec ${APACHE2} --pidfile /var/run/apache2.pid
-       eend $?
-}
-
-reload() {
-       RELOAD_TYPE="${RELOAD_TYPE:-graceful}"
-
-       checkconfig || return 1
-       if [ "${RELOAD_TYPE}" = "restart" ]; then
-               ebegin "Restarting apache2"
-               start-stop-daemon --stop --oknodo --signal HUP --exec ${APACHE2} --pidfile /var/run/apache2.pid
-               eend $?
-       elif [ "${RELOAD_TYPE}" = "graceful" ]; then
-               ebegin "Gracefully restarting apache2"
-               start-stop-daemon --stop --oknodo --signal USR1 --exec ${APACHE2} --pidfile /var/run/apache2.pid
-               eend $?
-       else
-               eerror "${RELOAD_TYPE} is not a valid RELOAD_TYPE. Please edit /etc/conf.d/apache2"
-       fi
-}
-
-graceful() {
-       checkconfig || return 1
-       ebegin "Gracefully restarting apache2"
-       start-stop-daemon --stop --signal USR1 --exec ${APACHE2} --pidfile /var/run/apache2.pid
-       eend $?
-}
-
-gracefulstop() {
-       checkconfig || return 1
-       
-       # zap!
-       if service_started "${myservice}"; then
-               mark_service_stopped "${myservice}"
-       fi
-
-       ebegin "Gracefully stopping apache2"
-       # 28 is SIGWINCH
-       start-stop-daemon --stop --signal 28 --exec ${APACHE2} --pidfile /var/run/apache2.pid
-       eend $?
-}
-
-modules() {
-       checkconfig || return 1
-
-       ${APACHE2} ${APACHE2_OPTS} -M 2>&1
-}
-
-status() {
-       LYNX="${LYNX:-lynx -dump}"
-       STATUSURL="${STATUSURL:-http://localhost/server-status}"
-       
-       ${LYNX} ${STATUSURL} | awk ' /process$/ { print; exit } { print } '
-}
-
-fullstatus() {
-       LYNX="${LYNX:-lynx -dump}"
-       STATUSURL="${STATUSURL:-http://localhost/server-status}"
-       
-       ${LYNX} ${STATUSURL}
-}
diff --git a/testing/hosts/winnetou/etc/init.d/net.eth0 b/testing/hosts/winnetou/etc/init.d/net.eth0
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4
diff --git a/testing/hosts/winnetou/etc/init.d/slapd b/testing/hosts/winnetou/etc/init.d/slapd
deleted file mode 100755 (executable)
index d4c070b..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/sbin/runscript
-# Copyright 1999-2004 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/strongswan/testing/hosts/winnetou/etc/init.d/slapd,v 1.2 2005/05/31 14:04:43 as Exp $
-
-depend() {
-       need net
-}
-
-start() {
-       ebegin "Starting ldap-server"
-       eval start-stop-daemon --start --quiet --pidfile /var/run/openldap/slapd.pid --exec /usr/lib/openldap/slapd -- -u ldap -g ldap "${OPTS}"
-       eend $?
-       if [ ! -e /var/lib/openldap-data/objectClass.bdb ]
-       then
-               sleep 5
-               ldapadd -x -D "cn=Manager, o=Linux strongSwan, c=CH" -w tuxmux -f /etc/openldap/ldif.txt
-       fi
-}
-
-stop() {
-       ebegin "Stopping ldap-server"
-       start-stop-daemon --stop --signal 2 --quiet --pidfile /var/run/openldap/slapd.pid 
-       eend $?
-}
similarity index 99%
rename from testing/hosts/winnetou/etc/openldap/ldif.txt
rename to testing/hosts/winnetou/etc/ldap/ldif.txt
index 3eca4d6c6d2d44358ed3fa1a63fc696a5ea3ea24..d06621adb25a8b9acab757fd427d0999f57675e4 100644 (file)
@@ -28,7 +28,7 @@ cACertificate;binary:< file:///etc/openssl/research/researchCert.der
 
 dn: ou=Sales, o=Linux strongSwan, c=CH
 objectclass: organizationalUnit
-ou: Sales 
+ou: Sales
 
 dn: cn=Sales CA, ou=Sales, o=Linux strongSwan, c=CH
 objectClass: organizationalRole
@@ -37,4 +37,3 @@ objectClass: certificationAuthority
 authorityRevocationList;binary:< file:///etc/openssl/sales/sales.crl
 certificateRevocationList;binary:< file:///etc/openssl/sales/sales.crl
 cACertificate;binary:< file:///etc/openssl/sales/salesCert.der
-
diff --git a/testing/hosts/winnetou/etc/ldap/slapd.conf b/testing/hosts/winnetou/etc/ldap/slapd.conf
new file mode 100644 (file)
index 0000000..103d457
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# See slapd.conf(5) for details on configuration options.
+# This file should NOT be world readable.
+#
+
+moduleload     back_bdb.la
+
+include                /etc/ldap/schema/core.schema
+
+pidfile                /var/run/openldap/slapd.pid
+argsfile       /var/run/openldap/slapd.args
+
+#######################################################################
+# BDB database definitions
+#######################################################################
+
+database       bdb
+suffix         "o=Linux strongSwan,c=CH"
+rootdn         "cn=Manager,o=Linux strongSwan,c=CH"
+checkpoint     32      30
+rootpw         tuxmux
+directory      /var/lib/ldap
+index          objectClass     eq
diff --git a/testing/hosts/winnetou/etc/network/interfaces b/testing/hosts/winnetou/etc/network/interfaces
new file mode 100644 (file)
index 0000000..6fd14d0
--- /dev/null
@@ -0,0 +1,12 @@
+auto lo
+iface lo inet loopback
+
+auto eth0
+iface eth0 inet static
+       address PH_IP_WINNETOU
+       netmask 255.255.255.0
+       broadcast 192.168.0.255
+       gateway 192.168.0.254
+iface eth0 inet6 static
+       address PH_IP6_WINNETOU
+       netmask 16
diff --git a/testing/hosts/winnetou/etc/openldap/slapd.conf b/testing/hosts/winnetou/etc/openldap/slapd.conf
deleted file mode 100644 (file)
index 5a99f95..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-#
-# See slapd.conf(5) for details on configuration options.
-# This file should NOT be world readable.
-#
-include                /etc/openldap/schema/core.schema
-
-# Define global ACLs to disable default read access.
-
-# Do not enable referrals until AFTER you have a working directory
-# service AND an understanding of referrals.
-#referral      ldap://root.openldap.org
-
-pidfile                /var/run/openldap/slapd.pid
-argsfile       /var/run/openldap/slapd.args
-
-# Load dynamic backend modules:
-# modulepath   /usr/lib/openldap/openldap
-# moduleload   back_bdb.la
-# moduleload   back_ldap.la
-# moduleload   back_ldbm.la
-# moduleload   back_passwd.la
-# moduleload   back_shell.la
-
-# Sample security restrictions
-#      Require integrity protection (prevent hijacking)
-#      Require 112-bit (3DES or better) encryption for updates
-#      Require 63-bit encryption for simple bind
-# security ssf=1 update_ssf=112 simple_bind=64
-
-# Sample access control policy:
-#      Root DSE: allow anyone to read it
-#      Subschema (sub)entry DSE: allow anyone to read it
-#      Other DSEs:
-#              Allow self write access
-#              Allow authenticated users read access
-#              Allow anonymous users to authenticate
-#      Directives needed to implement policy:
-# access to dn.base="" by * read
-# access to dn.base="cn=Subschema" by * read
-# access to *
-#      by self write
-#      by users read
-#      by anonymous auth
-#
-# if no access controls are present, the default policy
-# allows anyone and everyone to read anything but restricts
-# updates to rootdn.  (e.g., "access to * by * read")
-#
-# rootdn can always read and write EVERYTHING!
-
-#######################################################################
-# BDB database definitions
-#######################################################################
-
-database       bdb
-suffix         "o=Linux strongSwan,c=CH"
-rootdn         "cn=Manager,o=Linux strongSwan,c=CH"
-checkpoint     32      30 # <kbyte> <min>
-# Cleartext passwords, especially for the rootdn, should
-# be avoid.  See slappasswd(8) and slapd.conf(5) for details.
-# Use of strong authentication encouraged.
-rootpw         tuxmux  
-# The database directory MUST exist prior to running slapd AND 
-# should only be accessible by the slapd and slap tools.
-# Mode 700 recommended.
-directory      /var/lib/openldap-data
-# Indices to maintain
-index  objectClass     eq
index 60e53a0a4977a8b710ee85cd5162491ede373560..839816bf5a3561e62dba42ffe83d8c1c02a96b2e 100755 (executable)
 
 export COMMON_NAME=strongSwan
 
+ROOT=/var/www
+
 cd /etc/openssl
 openssl ca -gencrl -crldays 30 -config /etc/openssl/openssl.cnf -out crl.pem
 openssl crl -in crl.pem -outform der -out strongswan.crl
-cp strongswan.crl     /var/www/localhost/htdocs/
-cp strongswanCert.pem /var/www/localhost/htdocs/
-cp index.html         /var/www/localhost/htdocs/
+cp strongswan.crl     ${ROOT}
+cp strongswanCert.pem ${ROOT}
+cp index.html         ${ROOT}
 cd /etc/openssl/research
 openssl ca -gencrl -crldays 15 -config /etc/openssl/research/openssl.cnf -out crl.pem
 openssl crl -in crl.pem -outform der -out research.crl
-cp research.crl       /var/www/localhost/htdocs/
+cp research.crl       ${ROOT}
 cd /etc/openssl/sales
 openssl ca -gencrl -crldays 15 -config /etc/openssl/sales/openssl.cnf -out crl.pem
 openssl crl -in crl.pem -outform der -out sales.crl
-cp sales.crl         /var/www/localhost/htdocs/
+cp sales.crl         ${ROOT}
 cd /etc/openssl/ecdsa
 openssl ca -gencrl -crldays 15 -config /etc/openssl/ecdsa/openssl.cnf -out crl.pem
 openssl crl -in crl.pem -outform der -out strongswan_ec.crl
-cp strongswan_ec.crl /var/www/localhost/htdocs/
+cp strongswan_ec.crl ${ROOT}
 cd /etc/openssl/monster
 openssl ca -gencrl -crldays 15 -config /etc/openssl/monster/openssl.cnf -out crl.pem
 openssl crl -in crl.pem -outform der -out strongswan-monster.crl
-cp strongswan-monster.crl /var/www/localhost/htdocs/
+cp strongswan-monster.crl ${ROOT}
 cd /etc/openssl/rfc3779
 openssl ca -gencrl -crldays 15 -config /etc/openssl/rfc3779/openssl.cnf -out crl.pem
 openssl crl -in crl.pem -outform der -out strongswan_rfc3779.crl
-cp strongswan_rfc3779.crl /var/www/localhost/htdocs/
+cp strongswan_rfc3779.crl ${ROOT}
 
index cb585ed08581c408378d3428ea4c444b907a35b6..a62fe16bdc41640271b08c7d8e20981876c365b4 100755 (executable)
@@ -5,7 +5,7 @@ cd /etc/openssl
 echo "Content-type: application/ocsp-response"
 echo ""
 
-/usr/bin/openssl ocsp -index index.txt -CA strongswanCert.pem \
-                      -rkey ocspKey.pem -rsigner ocspCert.pem \
-                     -nmin 5 \
-                     -reqin /dev/stdin -respout /dev/stdout
+cat | /usr/bin/openssl ocsp -index index.txt -CA strongswanCert.pem \
+       -rkey ocspKey.pem -rsigner ocspCert.pem \
+       -nmin 5 \
+       -reqin /dev/stdin -respout /dev/stdout | cat
index c193e877906757ebefc593d15fcd1e386cf13072..32405f81c62eca31bd7819de03d7396aed3c289d 100755 (executable)
@@ -5,7 +5,7 @@ cd /etc/openssl/research
 echo "Content-type: application/ocsp-response"
 echo ""
 
-/usr/bin/openssl ocsp -index index.txt -CA researchCert.pem \
-                      -rkey ocspKey.pem -rsigner ocspCert.pem \
-                     -nmin 5 \
-                     -reqin /dev/stdin -respout /dev/stdout
+cat | /usr/bin/openssl ocsp -index index.txt -CA researchCert.pem \
+       -rkey ocspKey.pem -rsigner ocspCert.pem \
+       -nmin 5 \
+       -reqin /dev/stdin -respout /dev/stdout | cat
index c53cb9a76166372379ae6f0054cd0d59f7c2dff5..74a2aebc28a79cd6a31532e3b311ee86157dd25c 100755 (executable)
@@ -5,7 +5,7 @@ cd /etc/openssl/sales
 echo "Content-type: application/ocsp-response"
 echo ""
 
-/usr/bin/openssl ocsp -index index.txt -CA salesCert.pem \
-                      -rkey ocspKey.pem -rsigner ocspCert.pem \
-                     -nmin 5 \
-                     -reqin /dev/stdin -respout /dev/stdout
+cat | /usr/bin/openssl ocsp -index index.txt -CA salesCert.pem \
+       -rkey ocspKey.pem -rsigner ocspCert.pem \
+       -nmin 5 \
+       -reqin /dev/stdin -respout /dev/stdout | cat
diff --git a/testing/hosts/winnetou/etc/runlevels/default/apache2 b/testing/hosts/winnetou/etc/runlevels/default/apache2
deleted file mode 100755 (executable)
index 5f72d30..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-#!/sbin/runscript
-# Copyright 1999-2007 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-opts="configtest fullstatus graceful gracefulstop modules reload"
-
-depend() {
-       need net
-       use mysql dns logger netmount postgresql
-       after sshd
-}
-
-configtest() {
-       ebegin "Checking Apache Configuration"
-       checkconfig
-       eend $?
-}
-
-checkconfig() {
-       SERVERROOT="${SERVERROOT:-/usr/lib/apache2}"
-       if [ ! -d ${SERVERROOT} ]; then
-               eerror "SERVERROOT does not exist: ${SERVERROOT}"
-               return 1
-       fi
-
-       CONFIGFILE="${CONFIGFILE:-/etc/apache2/httpd.conf}"
-       [ "${CONFIGFILE#/}" = "${CONFIGFILE}" ] && CONFIGFILE="${SERVERROOT}/${CONFIGFILE}"
-       if [ ! -r "${CONFIGFILE}" ]; then
-               eerror "Unable to read configuration file: ${CONFIGFILE}"
-               return 1
-       fi
-
-       APACHE2_OPTS="${APACHE2_OPTS} -d ${SERVERROOT}"
-       APACHE2_OPTS="${APACHE2_OPTS} -f ${CONFIGFILE}"
-       [ -n "${STARTUPERRORLOG}" ] && APACHE2_OPTS="${APACHE2_OPTS} -E ${STARTUPERRORLOG}"
-
-       APACHE2="/usr/sbin/apache2"
-
-       ${APACHE2} ${APACHE2_OPTS} -t 1>/dev/null 2>&1
-       ret=$?
-       if [ $ret -ne 0 ]; then
-               eerror "Apache2 has detected a syntax error in your configuration files:"
-               ${APACHE2} ${APACHE2_OPTS} -t
-       fi
-
-       return $ret
-}
-
-start() {
-       checkconfig || return 1
-       ebegin "Starting apache2"
-       [ -f /var/log/apache2/ssl_scache ] && rm /var/log/apache2/ssl_scache
-
-       start-stop-daemon --start --exec ${APACHE2} -- ${APACHE2_OPTS} -k start
-       eend $?
-}
-
-stop() {
-       checkconfig || return 1
-       ebegin "Stopping apache2"
-       start-stop-daemon --stop --retry -TERM/5/-KILL/5 --exec ${APACHE2} --pidfile /var/run/apache2.pid
-       eend $?
-}
-
-reload() {
-       RELOAD_TYPE="${RELOAD_TYPE:-graceful}"
-
-       checkconfig || return 1
-       if [ "${RELOAD_TYPE}" = "restart" ]; then
-               ebegin "Restarting apache2"
-               start-stop-daemon --stop --oknodo --signal HUP --exec ${APACHE2} --pidfile /var/run/apache2.pid
-               eend $?
-       elif [ "${RELOAD_TYPE}" = "graceful" ]; then
-               ebegin "Gracefully restarting apache2"
-               start-stop-daemon --stop --oknodo --signal USR1 --exec ${APACHE2} --pidfile /var/run/apache2.pid
-               eend $?
-       else
-               eerror "${RELOAD_TYPE} is not a valid RELOAD_TYPE. Please edit /etc/conf.d/apache2"
-       fi
-}
-
-graceful() {
-       checkconfig || return 1
-       ebegin "Gracefully restarting apache2"
-       start-stop-daemon --stop --signal USR1 --exec ${APACHE2} --pidfile /var/run/apache2.pid
-       eend $?
-}
-
-gracefulstop() {
-       checkconfig || return 1
-       
-       # zap!
-       if service_started "${myservice}"; then
-               mark_service_stopped "${myservice}"
-       fi
-
-       ebegin "Gracefully stopping apache2"
-       # 28 is SIGWINCH
-       start-stop-daemon --stop --signal 28 --exec ${APACHE2} --pidfile /var/run/apache2.pid
-       eend $?
-}
-
-modules() {
-       checkconfig || return 1
-
-       ${APACHE2} ${APACHE2_OPTS} -M 2>&1
-}
-
-status() {
-       LYNX="${LYNX:-lynx -dump}"
-       STATUSURL="${STATUSURL:-http://localhost/server-status}"
-       
-       ${LYNX} ${STATUSURL} | awk ' /process$/ { print; exit } { print } '
-}
-
-fullstatus() {
-       LYNX="${LYNX:-lynx -dump}"
-       STATUSURL="${STATUSURL:-http://localhost/server-status}"
-       
-       ${LYNX} ${STATUSURL}
-}
diff --git a/testing/hosts/winnetou/etc/runlevels/default/net.eth0 b/testing/hosts/winnetou/etc/runlevels/default/net.eth0
deleted file mode 100755 (executable)
index 92b3851..0000000
+++ /dev/null
@@ -1,1124 +0,0 @@
-#!/sbin/runscript
-# Copyright (c) 2004-2006 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-
-# Contributed by Roy Marples (uberlord@gentoo.org)
-# Many thanks to Aron Griffis (agriffis@gentoo.org)
-# for help, ideas and patches
-
-#NB: Config is in /etc/conf.d/net
-
-# For pcmcia users. note that pcmcia must be added to the same
-# runlevel as the net.* script that needs it.
-depend() {
-       need localmount
-       after bootmisc hostname
-       use isapnp isdn pcmcia usb wlan
-
-       # Load any custom depend functions for the given interface
-       # For example, br0 may need eth0 and eth1
-       local iface="${SVCNAME#*.}"
-       [[ $(type -t "depend_${iface}") == "function" ]] && depend_${iface}
-
-       if [[ ${iface} != "lo" && ${iface} != "lo0" ]] ; then
-               after net.lo net.lo0
-
-               # Support new style RC_NEED and RC_USE in one net file
-               local x="RC_NEED_${iface}"
-               [[ -n ${!x} ]] && need ${!x}
-               x="RC_USE_${iface}"
-               [[ -n ${!x} ]] && use ${!x}
-       fi
-
-       return 0
-}
-
-# Define where our modules are
-MODULES_DIR="${svclib}/net"
-
-# Make some wrappers to fudge after/before/need/use depend flags.
-# These are callbacks so MODULE will be set.
-after() {
-       eval "${MODULE}_after() { echo \"$*\"; }"
-}
-before() {
-       eval "${MODULE}_before() { echo \"$*\"; }"
-}
-need() {
-       eval "${MODULE}_need() { echo \"$*\"; }"
-}
-installed() {
-       # We deliberately misspell this as _installed will probably be used
-       # at some point
-       eval "${MODULE}_instlled() { echo \"$*\"; }"
-}
-provide() {
-       eval "${MODULE}_provide() { echo \"$*\"; }"
-}
-functions() {
-       eval "${MODULE}_functions() { echo \"$*\"; }"
-}
-variables() {
-       eval "${MODULE}_variables() { echo \"$*\"; }"
-}
-
-is_loopback() {
-       [[ $1 == "lo" || $1 == "lo0" ]]
-}
-
-# char* interface_device(char *iface)
-#
-# Gets the base device of the interface
-# Can handle eth0:1 and eth0.1
-# Which returns eth0 in this case
-interface_device() {
-       local dev="${1%%.*}"
-       [[ ${dev} == "$1" ]] && dev="${1%%:*}"
-       echo "${dev}"
-}
-
-# char* interface_type(char* iface)
-#
-# Returns the base type of the interface
-# eth, ippp, etc
-interface_type() {
-       echo "${1%%[0-9]*}"
-}
-
-# int calculate_metric(char *interface, int base)
-#
-# Calculates the best metric for the interface
-# We use this when we add routes so we can prefer interfaces over each other
-calculate_metric() {
-       local iface="$1" metric="$2"
-
-       # Have we already got a metric?
-       local m=$(awk '$1=="'${iface}'" && $2=="00000000" { print $7 }' \
-               /proc/net/route)
-       if [[ -n ${m} ]] ; then
-               echo "${m}"
-               return 0
-       fi
-
-       local i= dest= gw= flags= ref= u= m= mtu= metrics=
-       while read i dest gw flags ref u m mtu ; do
-               # Ignore lo
-               is_loopback "${i}" && continue
-               # We work out metrics from default routes only
-               [[ ${dest} != "00000000" || ${gw} == "00000000" ]] && continue
-               metrics="${metrics}\n${m}"
-       done < /proc/net/route
-
-       # Now, sort our metrics
-       metrics=$(echo -e "${metrics}" | sort -n)
-
-       # Now, find the lowest we can use
-       local gotbase=false
-       for m in ${metrics} ; do
-               [[ ${m} -lt ${metric} ]] && continue
-               [[ ${m} == ${metric} ]] && ((metric++))
-               [[ ${m} -gt ${metric} ]] && break
-       done
-       
-       echo "${metric}"
-}
-
-# int netmask2cidr(char *netmask)
-#
-# Returns the CIDR of a given netmask
-netmask2cidr() {
-       local binary= i= bin=
-
-       for i in ${1//./ }; do
-               bin=""
-               while [[ ${i} != "0" ]] ; do
-                       bin=$[${i}%2]${bin}
-                       (( i=i>>1 ))
-               done
-               binary="${binary}${bin}"
-       done
-       binary="${binary%%0*}"
-       echo "${#binary}"
-}
-
-
-# bool is_function(char* name)
-#
-# Returns 0 if the given name is a shell function, otherwise 1
-is_function() {
-       [[ -z $1 ]] && return 1
-       [[ $(type -t "$1") == "function" ]]
-}
-
-# void function_wrap(char* source, char* target)
-#
-# wraps function calls - for example function_wrap(this, that)
-# maps function names this_* to that_*
-function_wrap() {
-       local i=
-
-       is_function "${2}_depend" && return
-
-       for i in $(typeset -f | grep -o '^'"${1}"'_[^ ]*'); do
-               eval "${2}${i#${1}}() { ${i} \"\$@\"; }"
-       done
-}
-
-# char[] * expand_parameters(char *cmd)
-#
-# Returns an array after expanding parameters. For example
-# "192.168.{1..3}.{1..3}/24 brd +"
-# will return
-# "192.168.1.1/24 brd +"
-# "192.168.1.2/24 brd +"
-# "192.168.1.3/24 brd +"
-# "192.168.2.1/24 brd +"
-# "192.168.2.2/24 brd +"
-# "192.168.2.3/24 brd +"
-# "192.168.3.1/24 brd +"
-# "192.168.3.2/24 brd +"
-# "192.168.3.3/24 brd +"
-expand_parameters() {
-       local x=$(eval echo ${@// /_})
-       local -a a=( ${x} )
-
-       a=( "${a[@]/#/\"}" )
-       a=( "${a[@]/%/\"}" )
-       echo "${a[*]//_/ }"
-}
-
-# void configure_variables(char *interface, char *option1, [char *option2])
-#
-# Maps configuration options from <variable>_<option> to <variable>_<iface>
-# option2 takes precedence over option1
-configure_variables() {
-       local iface="$1" option1="$2" option2="$3"
-
-       local mod= func= x= i=
-       local -a ivars=() ovars1=() ovars2=()
-       local ifvar=$(bash_variable "${iface}")
-
-       for mod in ${MODULES[@]}; do
-               is_function ${mod}_variables || continue
-               for v in $(${mod}_variables) ; do
-                       x=
-                       [[ -n ${option2} ]] && x="${v}_${option2}[@]"
-                       [[ -z ${!x} ]] && x="${v}_${option1}[@]"
-                       [[ -n ${!x} ]] && eval "${v}_${ifvar}=( \"\${!x}\" )"
-               done
-       done
-
-       return 0
-}
-# bool module_load_minimum(char *module)
-#
-# Does the minimum checking on a module - even when forcing
-module_load_minimum() {
-       local f="$1.sh" MODULE="${1##*/}"
-
-       if [[ ! -f ${f} ]] ; then
-               eerror "${f} does not exist"
-               return 1
-       fi
-
-       if ! source "${f}" ; then
-               eerror "${MODULE} failed a sanity check"
-               return 1
-       fi
-
-       for f in depend; do
-               is_function "${MODULE}_${f}" && continue
-               eerror "${MODULE}.sh does not support the required function ${f}"
-               return 1
-       done
-
-       return 0
-}
-
-# bool modules_load_auto()
-#
-# Load and check each module for sanity
-# If the module is not installed, the functions are to be removed
-modules_load_auto() {
-       local i j inst
-
-       # Populate the MODULES array
-       # Basically we treat evey file in ${MODULES_DIR} as a module
-       MODULES=( $( cd "${MODULES_DIR}" ; ls *.sh ) )
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES_DIR}/${MODULES[i]}"
-               [[ ! -f ${MODULES[i]} ]] && unset MODULES[i]
-       done
-       MODULES=( "${MODULES[@]}" )
-
-       # Each of these sources into the global namespace, so it's
-       # important that module functions and variables are prefixed with
-       # the module name, for example iproute2_
-
-       j="${#MODULES[@]}"
-       loaded_interface=false
-       for (( i=0; i<j; i++ )); do
-               MODULES[i]="${MODULES[i]%.sh*}"
-               if [[ ${MODULES[i]##*/} == "interface" ]] ; then
-                       eerror "interface is a reserved name - cannot load a module called interface"
-                       return 1
-               fi
-               
-               (
-               u=0;
-               module_load_minimum "${MODULES[i]}" || u=1;
-               if [[ ${u} == 0 ]] ; then
-                       inst="${MODULES[i]##*/}_check_installed";
-                       if is_function "${inst}" ; then
-                               ${inst} false || u=1;
-                       fi
-               fi
-               exit "${u}";
-               )
-
-               if [[ $? == 0 ]] ; then
-                       source "${MODULES[i]}.sh"
-                       MODULES[i]="${MODULES[i]##*/}"
-               else
-                       unset MODULES[i]
-               fi
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       return 0
-}
-
-# bool modules_check_installed(void)
-#
-# Ensure that all modules have the required modules loaded
-# This enables us to remove modules from the MODULES array
-# Whilst other modules can still explicitly call them
-# One example of this is essidnet which configures network
-# settings for the specific ESSID connected to as the user
-# may be using a daemon to configure wireless instead of our
-# iwconfig module
-modules_check_installed() {
-       local i j missingdeps nmods="${#MODULES[@]}"
-
-       for (( i=0; i<nmods; i++ )); do
-               is_function "${MODULES[i]}_instlled" || continue
-               for j in $( ${MODULES[i]}_instlled ); do
-                       missingdeps=true
-                       if is_function "${j}_check_installed" ; then
-                               ${j}_check_installed && missingdeps=false
-                       elif is_function "${j}_depend" ; then
-                               missingdeps=false
-                       fi
-                       ${missingdeps} && unset MODULES[i] && unset PROVIDES[i] && break
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-}
-
-# bool modules_check_user(void)
-modules_check_user() {
-       local iface="$1" ifvar=$(bash_variable "${IFACE}")
-       local i= j= k= l= nmods="${#MODULES[@]}"
-       local -a umods=()
-
-       # Has the interface got any specific modules?
-       umods="modules_${ifvar}[@]"
-       umods=( "${!umods}" )
-
-       # Global setting follows interface-specific setting
-       umods=( "${umods[@]}" "${modules[@]}" )
-
-       # Add our preferred modules
-       local -a pmods=( "iproute2" "dhcpcd" "iwconfig" "netplugd" )
-       umods=( "${umods[@]}" "${pmods[@]}" )
-
-       # First we strip any modules that conflict from user settings
-       # So if the user specifies pump then we don't use dhcpcd
-       for (( i=0; i<${#umods[@]}; i++ )); do
-               # Some users will inevitably put "dhcp" in their modules
-               # list.  To keep users from screwing up their system this
-               # way, ignore this setting so that the default dhcp
-               # module will be used.
-               [[ ${umods[i]} == "dhcp" ]] && continue
-
-               # We remove any modules we explicitly don't want
-               if [[ ${umods[i]} == "!"* ]] ; then
-                       for (( j=0; j<nmods; j++ )); do
-                               [[ -z ${MODULES[j]} ]] && continue
-                               if [[ ${umods[i]:1} == "${MODULES[j]}" \
-                                       || ${umods[i]:1} == "${PROVIDES[j]}" ]] ; then
-                                       # We may need to setup a class wrapper for it even though
-                                       # we don't use it directly
-                                       # However, we put it into an array and wrap later as
-                                       # another module may provide the same thing
-                                       ${MODULES[j]}_check_installed \
-                                               && WRAP_MODULES=(
-                                                       "${WRAP_MODULES[@]}"
-                                                       "${MODULES[j]} ${PROVIDES[j]}"
-                                               )
-                                       unset MODULES[j]
-                                       unset PROVIDES[j]
-                               fi
-                       done
-                       continue
-               fi
-
-               if ! is_function "${umods[i]}_depend" ; then
-                       # If the module is one of our preferred modules, then
-                       # ignore this error; whatever is available will be
-                       # used instead.
-                       (( i < ${#umods[@]} - ${#pmods[@]} )) || continue
-
-                       # The function may not exist because the modules software is
-                       # not installed. Load the module and report its error
-                       if [[ -e "${MODULES_DIR}/${umods[i]}.sh" ]] ; then
-                               source "${MODULES_DIR}/${umods[i]}.sh"
-                               is_function "${umods[i]}_check_installed" \
-                                       && ${umods[i]}_check_installed true
-                       else
-                               eerror "The module \"${umods[i]}\" does not exist"
-                       fi
-                       return 1
-               fi
-
-               if is_function "${umods[i]}_provide" ; then
-                       mod=$(${umods[i]}_provide)
-               else
-                       mod="${umods[i]}"
-               fi
-               for (( j=0; j<nmods; j++ )); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       if [[ ${PROVIDES[j]} == "${mod}" && ${umods[i]} != "${MODULES[j]}" ]] ; then
-                               # We don't have a match - now ensure that we still provide an
-                               # alternative. This is to handle our preferred modules.
-                               for (( l=0; l<nmods; l++ )); do
-                                       [[ ${l} == "${j}" || -z ${MODULES[l]} ]] && continue
-                                       if [[ ${PROVIDES[l]} == "${mod}" ]] ; then
-                                               unset MODULES[j]
-                                               unset PROVIDES[j]
-                                               break
-                                       fi
-                               done
-                       fi
-               done
-       done
-
-       # Then we strip conflicting modules.
-       # We only need to do this for 3rd party modules that conflict with
-       # our own modules and the preferred list AND the user modules
-       # list doesn't specify a preference.
-       for (( i=0; i<nmods-1; i++ )); do
-               [[ -z ${MODULES[i]} ]] && continue                      
-               for (( j=i+1; j<nmods; j++)); do
-                       [[ -z ${MODULES[j]} ]] && continue
-                       [[ ${PROVIDES[i]} == "${PROVIDES[j]}" ]] \
-                       && unset MODULES[j] && unset PROVIDES[j]
-               done
-       done
-
-       MODULES=( "${MODULES[@]}" )
-       PROVIDES=( "${PROVIDES[@]}" )
-       return 0
-}
-
-# void modules_sort(void)
-#
-# Sort our modules
-modules_sort() {
-       local i= j= nmods=${#MODULES[@]} m=
-       local -a provide=() provide_list=() after=() dead=() sorted=() sortedp=()
-
-       # Make our provide list
-       for ((i=0; i<nmods; i++)); do
-               dead[i]="false"
-               if [[ ${MODULES[i]} != "${PROVIDES[i]}" ]] ; then
-                       local provided=false
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               if [[ ${provide[j]} == "${PROVIDES[i]}" ]] ; then
-                                       provide_list[j]="${provide_list[j]} ${MODULES[i]}"
-                                       provided=true
-                               fi
-                       done
-                       if ! ${provided}; then
-                               provide[j]="${PROVIDES[i]}"
-                               provide_list[j]="${MODULES[i]}"
-                       fi
-               fi
-       done
-
-       # Create an after array, which holds which modules the module at
-       # index i must be after
-       for ((i=0; i<nmods; i++)); do
-               if is_function "${MODULES[i]}_after" ; then
-                       after[i]=" ${after[i]} $(${MODULES[i]}_after) "
-               fi
-               if is_function "${MODULES[i]}_before" ; then
-                       for m in $(${MODULES[i]}_before); do
-                               for ((j=0; j<nmods; j++)) ; do
-                                       if [[ ${PROVIDES[j]} == "${m}" ]] ; then
-                                               after[j]=" ${after[j]} ${MODULES[i]} "
-                                               break
-                                       fi
-                               done
-                       done
-               fi
-       done
-
-       # Replace the after list modules with real modules
-       for ((i=0; i<nmods; i++)); do
-               if [[ -n ${after[i]} ]] ; then
-                       for ((j=0; j<${#provide[@]}; j++)); do
-                               after[i]="${after[i]// ${provide[j]} / ${provide_list[j]} }"
-                       done
-               fi
-       done
-       
-       # We then use the below code to provide a topologial sort
-    module_after_visit() {
-        local name="$1" i= x=
-
-               for ((i=0; i<nmods; i++)); do
-                       [[ ${MODULES[i]} == "$1" ]] && break
-               done
-
-        ${dead[i]} && return
-        dead[i]="true"
-
-        for x in ${after[i]} ; do
-            module_after_visit "${x}"
-        done
-
-        sorted=( "${sorted[@]}" "${MODULES[i]}" )
-               sortedp=( "${sortedp[@]}" "${PROVIDES[i]}" )
-    }
-
-       for x in ${MODULES[@]}; do
-               module_after_visit "${x}"
-       done
-
-       MODULES=( "${sorted[@]}" )
-       PROVIDES=( "${sortedp[@]}" )
-}
-
-# bool modules_check_depends(bool showprovides)
-modules_check_depends() {
-       local showprovides="${1:-false}" nmods="${#MODULES[@]}" i= j= needmod=
-       local missingdeps= p= interface=false
-
-       for (( i=0; i<nmods; i++ )); do
-               if is_function "${MODULES[i]}_need" ; then
-                       for needmod in $(${MODULES[i]}_need); do
-                               missingdeps=true
-                               for (( j=0; j<nmods; j++ )); do
-                                       if [[ ${needmod} == "${MODULES[j]}" \
-                                               || ${needmod} == "${PROVIDES[j]}" ]] ; then
-                                               missingdeps=false
-                                               break
-                                       fi
-                               done
-                               if ${missingdeps} ; then
-                                       eerror "${MODULES[i]} needs ${needmod} (dependency failure)"
-                                       return 1
-                               fi
-                       done
-               fi
-
-               if is_function "${MODULES[i]}_functions" ; then
-                       for f in $(${MODULES[i]}_functions); do
-                               if ! is_function "${f}" ; then
-                                       eerror "${MODULES[i]}: missing required function \"${f}\""
-                                       return 1
-                               fi
-                       done
-               fi
-
-               [[ ${PROVIDES[i]} == "interface" ]] && interface=true
-
-               if ${showprovides} ; then
-                       [[ ${PROVIDES[i]} != "${MODULES[i]}" ]] \
-                       && veinfo "${MODULES[i]} provides ${PROVIDES[i]}"
-               fi
-       done
-
-       if ! ${interface} ; then
-               eerror "no interface module has been loaded"
-               return 1
-       fi
-
-       return 0
-}
-
-# bool modules_load(char *iface, bool starting)
-#
-# Loads the defined handler and modules for the interface
-# Returns 0 on success, otherwise 1
-modules_load()  {
-       local iface="$1" starting="${2:-true}" MODULE= p=false i= j= k=
-       local -a x=()
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a PROVIDES=() WRAP_MODULES=()
-
-       if ! is_loopback "${iface}" ; then
-               x="modules_force_${iface}[@]"
-               [[ -n ${!x} ]] && modules_force=( "${!x}" )
-               if [[ -n ${modules_force} ]] ; then
-                       ewarn "WARNING: You are forcing modules!"
-                       ewarn "Do not complain or file bugs if things start breaking"
-                       report=true
-               fi
-       fi
-
-       veinfo "Loading networking modules for ${iface}"
-       eindent
-
-       if [[ -z ${modules_force} ]] ; then
-               modules_load_auto || return 1
-       else
-               j="${#modules_force[@]}"
-               for (( i=0; i<j; i++ )); do
-                       module_load_minimum "${MODULES_DIR}/${modules_force[i]}" || return 1
-                       if is_function "${modules_force[i]}_check_installed" ; then
-                               ${modules_force[i]}_check_installed || unset modules_force[i]
-                       fi
-               done
-               MODULES=( "${modules_force[@]}" )
-       fi
-
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               # Now load our dependencies - we need to use the MODULE variable
-               # here as the after/before/need functions use it
-               MODULE="${MODULES[i]}"
-               ${MODULE}_depend
-
-               # expose does exactly the same thing as depend
-               # However it is more "correct" as it exposes things to other modules
-               # instead of depending on them ;)
-               is_function "${MODULES[i]}_expose" && ${MODULES[i]}_expose
-
-               # If no provide is given, assume module name
-               if is_function "${MODULES[i]}_provide" ; then
-                       PROVIDES[i]=$(${MODULES[i]}_provide)
-               else
-                       PROVIDES[i]="${MODULES[i]}"
-               fi
-       done
-
-       if [[ -n ${modules_force[@]} ]] ; then
-               # Strip any duplicate modules providing the same thing
-               j="${#MODULES[@]}"
-               for (( i=0; i<j-1; i++ )); do
-                       [[ -z ${MODULES[i]} ]] && continue
-                       for (( k=i+1; k<j; k++ )); do
-                               if [[ ${PROVIDES[i]} == ${PROVIDES[k]} ]] ; then
-                                       unset MODULES[k]
-                                       unset PROVIDES[k]
-                               fi
-                       done
-               done
-               MODULES=( "${MODULES[@]}" )
-               PROVIDES=( "${PROVIDES[@]}" )
-       else
-               if ${starting}; then
-                       modules_check_user "${iface}" || return 1
-               else
-                       # Always prefer iproute2 for taking down interfaces
-                       if is_function iproute2_provide ; then
-                               function_wrap iproute2 "$(iproute2_provide)"
-                       fi
-               fi
-       fi
-       
-       # Wrap our modules
-       j="${#MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap "${MODULES[i]}" "${PROVIDES[i]}"
-       done
-       j="${#WRAP_MODULES[@]}"
-       for (( i=0; i<j; i++ )); do
-               function_wrap ${WRAP_MODULES[i]}
-       done
-       
-       if [[ -z ${modules_force[@]} ]] ; then
-               modules_check_installed || return 1
-               modules_sort || return 1
-       fi
-
-       veinfo "modules: ${MODULES[@]}"
-       eindent
-
-       ${starting} && p=true
-       modules_check_depends "${p}" || return 1
-       return 0
-}
-
-# bool iface_start(char *interface)
-#
-# iface_start is called from start.  It's expected to start the base
-# interface (for example "eth0"), aliases (for example "eth0:1") and to start
-# VLAN interfaces (for example eth0.0, eth0.1).  VLAN setup is accomplished by
-# calling itself recursively.
-iface_start() {
-       local iface="$1" mod config_counter="-1" x config_worked=false
-       local RC_INDENTATION="${RC_INDENTATION}"
-       local -a config=() fallback=() fallback_route=() conf=() a=() b=()
-       local ifvar=$(bash_variable "$1") i= j= metric=0
-
-       # pre Start any modules with
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_start" ; then
-                       ${mod}_pre_start "${iface}" || { eend 1; return 1; }
-               fi
-       done
-
-       x="metric_${ifvar}"
-       # If we don't have a metric then calculate one
-       # Our modules will set the metric variable to a suitable base
-       # in their pre starts.
-       if [[ -z ${!x} ]] ; then
-               eval "metric_${ifvar}=\"$(calculate_metric "${iface}" "${metric}")\""
-       fi
-
-       # We now expand the configuration parameters and pray that the
-       # fallbacks expand to the same number as config or there will be
-       # trouble!
-       a="config_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               config=( "${config[@]}" "${b[@]}" )
-       done
-
-       a="fallback_${ifvar}[@]"
-       a=( "${!a}" )
-       for (( i=0; i<${#a[@]}; i++ )); do 
-               eval b=( $(expand_parameters "${a[i]}") )
-               fallback=( "${fallback[@]}" "${b[@]}" )
-       done
-
-       # We don't expand routes
-       fallback_route="fallback_route_${ifvar}[@]"
-       fallback_route=( "${!fallback_route}" )
-       
-       # We must support old configs
-       if [[ -z ${config} ]] ; then
-               interface_get_old_config "${iface}" || return 1
-               if [[ -n ${config} ]] ; then
-                       ewarn "You are using a deprecated configuration syntax for ${iface}"
-                       ewarn "You are advised to read /etc/conf.d/net.example and upgrade it accordingly"
-               fi
-       fi
-
-       # Handle "noop" correctly
-       if [[ ${config[0]} == "noop" ]] ; then
-               if interface_is_up "${iface}" true ; then
-                       einfo "Keeping current configuration for ${iface}"
-                       eend 0
-                       return 0
-               fi
-
-               # Remove noop from the config var
-               config=( "${config[@]:1}" )
-       fi
-
-       # Provide a default of DHCP if no configuration is set and we're auto
-       # Otherwise a default of NULL
-       if [[ -z ${config} ]] ; then
-               ewarn "Configuration not set for ${iface} - assuming DHCP"
-               if is_function "dhcp_start" ; then
-                       config=( "dhcp" )
-               else
-                       eerror "No DHCP client installed"
-                       return 1
-               fi
-       fi
-
-       einfo "Bringing up ${iface}"
-       eindent
-       for (( config_counter=0; config_counter<${#config[@]}; config_counter++ )); do
-               # Handle null and noop correctly
-               if [[ ${config[config_counter]} == "null" \
-                       || ${config[config_counter]} == "noop" ]] ; then
-                       eend 0
-                       config_worked=true
-                       continue
-               fi
-
-               # We convert it to an array - this has the added
-               # bonus of trimming spaces!
-               conf=( ${config[config_counter]} )
-               einfo "${conf[0]}"
-
-               # Do we have a function for our config?
-               if is_function "${conf[0]}_start" ; then
-                       eindent
-                       ${conf[0]}_start "${iface}" ; x=$?
-                       eoutdent
-                       [[ ${x} == 0 ]] && config_worked=true && continue
-                       # We need to test to see if it's an IP address or a function
-                       # We do this by testing if the 1st character is a digit
-               elif [[ ${conf[0]:0:1} == [[:digit:]] || ${conf[0]} == *:* ]] ; then
-                       x="0"
-                       if ! is_loopback "${iface}" ; then
-                               if [[ " ${MODULES[@]} " == *" arping "* ]] ; then
-                                       if arping_address_exists "${iface}" "${conf[0]}" ; then
-                                               eerror "${conf[0]%%/*} already taken on ${iface}"
-                                               x="1"
-                                       fi
-                               fi
-                       fi
-                       [[ ${x} == "0" ]] && interface_add_address "${iface}" ${conf[@]}; x="$?"
-                       eend "${x}" && config_worked=true && continue
-               else
-                       if [[ ${conf[0]} == "dhcp" ]] ; then
-                               eerror "No DHCP client installed"
-                       else
-                               eerror "No loaded modules provide \"${conf[0]}\" (${conf[0]}_start)"
-                       fi
-               fi
-
-               if [[ -n ${fallback[config_counter]} ]] ; then
-                       einfo "Trying fallback configuration"
-                       config[config_counter]="${fallback[config_counter]}"
-                       fallback[config_counter]=""
-
-                       # Do we have a fallback route?
-                       if [[ -n ${fallback_route[config_counter]} ]] ; then
-                               x="fallback_route[config_counter]"
-                               eval "routes_${ifvar}=( \"\${!x}\" )"
-                               fallback_route[config_counter]=""
-                       fi
-
-                       (( config_counter-- )) # since the loop will increment it
-                       continue
-               fi
-       done
-       eoutdent
-
-       # We return failure if no configuration parameters worked
-       ${config_worked} || return 1
-
-       # Start any modules with _post_start
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_post_start" ; then
-                       ${mod}_post_start "${iface}" || return 1
-               fi
-       done
-
-       return 0
-}
-
-# bool iface_stop(char *interface)
-#
-# iface_stop: bring down an interface.  Don't trust information in
-# /etc/conf.d/net since the configuration might have changed since
-# iface_start ran.  Instead query for current configuration and bring
-# down the interface.
-iface_stop() {
-       local iface="$1" i= aliases= need_begin=false mod=
-       local RC_INDENTATION="${RC_INDENTATION}"
-
-       # pre Stop any modules
-       for mod in ${MODULES[@]}; do
-               if is_function "${mod}_pre_stop" ; then
-                       ${mod}_pre_stop "${iface}" || return 1
-               fi
-       done
-
-       einfo "Bringing down ${iface}"
-       eindent
-
-       # Collect list of aliases for this interface.
-       # List will be in reverse order.
-       if interface_exists "${iface}" ; then
-               aliases=$(interface_get_aliases_rev "${iface}")
-       fi
-
-       # Stop aliases before primary interface.
-       # Note this must be done in reverse order, since ifconfig eth0:1 
-       # will remove eth0:2, etc.  It might be sufficient to simply remove 
-       # the base interface but we're being safe here.
-       for i in ${aliases} ${iface}; do
-               # Stop all our modules
-               for mod in ${MODULES[@]}; do
-                       if is_function "${mod}_stop" ; then
-                               ${mod}_stop "${i}" || return 1
-                       fi
-               done
-
-               # A module may have removed the interface
-               if ! interface_exists "${iface}" ; then
-                       eend 0
-                       continue
-               fi
-
-               # We don't delete ppp assigned addresses
-               if ! is_function pppd_exists || ! pppd_exists "${i}" ; then
-                       # Delete all the addresses for this alias
-                       interface_del_addresses "${i}"
-               fi
-
-               # Do final shut down of this alias
-               if [[ ${IN_BACKGROUND} != "true" \
-                       && ${RC_DOWN_INTERFACE} == "yes" ]] ; then
-                       ebegin "Shutting down ${i}"
-                       interface_iface_stop "${i}"
-                       eend "$?"
-               fi
-       done
-
-       # post Stop any modules
-       for mod in ${MODULES[@]}; do
-               # We have already taken down the interface, so no need to error
-               is_function "${mod}_post_stop" && ${mod}_post_stop "${iface}"
-       done
-
-       return 0
-}
-
-# bool run_start(char *iface)
-#
-# Brings up ${IFACE}.  Calls preup, iface_start, then postup.
-# Returns 0 (success) unless preup or iface_start returns 1 (failure).
-# Ignores the return value from postup.
-# We cannot check that the device exists ourselves as modules like
-# tuntap make create it.
-run_start() {
-       local iface="$1" IFVAR=$(bash_variable "$1")
-
-       # We do this so users can specify additional addresses for lo if they
-       # need too - additional routes too
-       # However, no extra modules are loaded as they are just not needed
-       if [[ ${iface} == "lo" ]] ; then
-               metric_lo="0"
-               config_lo=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo=( "127.0.0.0/8" "${routes_lo[@]}" )
-       elif [[ ${iface} == "lo0" ]] ; then
-               metric_lo0="0"
-               config_lo0=( "127.0.0.1/8 brd 127.255.255.255" "${config_lo[@]}" )
-               routes_lo0=( "127.0.0.0/8" "${routes_lo[@]}" )
-       fi
-
-       # We may not have a loaded module for ${iface}
-       # Some users may have "alias natsemi eth0" in /etc/modules.d/foo
-       # so we can work with this
-       # However, if they do the same with eth1 and try to start it
-       # but eth0 has not been loaded then the module gets loaded as
-       # eth0.
-       # Not much we can do about this :(
-       # Also, we cannot error here as some modules - such as bridge
-       # create interfaces
-       if ! interface_exists "${iface}" ; then
-               /sbin/modprobe "${iface}" &>/dev/null
-       fi
-
-       # Call user-defined preup function if it exists
-       if is_function preup ; then
-               einfo "Running preup function"
-               eindent
-               ( preup "${iface}" )
-               eend "$?" "preup ${iface} failed" || return 1
-               eoutdent
-       fi
-
-       # If config is set to noop and the interface is up with an address
-       # then we don't start it
-       local config=
-       config="config_${IFVAR}[@]"
-       config=( "${!config}" )
-       if [[ ${config[0]} == "noop" ]] && interface_is_up "${iface}" true ; then
-               einfo "Keeping current configuration for ${iface}"
-               eend 0
-       else
-               # Remove noop from the config var
-               [[ ${config[0]} == "noop" ]] \
-                       && eval "config_${IFVAR}=( "\"\$\{config\[@\]:1\}\"" )"
-
-               # There may be existing ip address info - so we strip it
-               if [[ ${RC_INTERFACE_KEEP_CONFIG} != "yes" \
-                       && ${IN_BACKGROUND} != "true" ]] ; then
-                       interface_del_addresses "${iface}"
-               fi
-
-               # Start the interface
-               if ! iface_start "${iface}" ; then
-                       if [[ ${IN_BACKGROUND} != "true" ]] ; then
-                               interface_exists "${iface}" && interface_down "${iface}"
-                       fi
-                       eend 1
-                       return 1
-               fi
-       fi
-
-       # Call user-defined postup function if it exists
-       if is_function postup ; then
-               # We need to mark the service as started incase a
-               # postdown function wants to restart services that depend on us
-               mark_service_started "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postup function"
-               eindent
-               ( postup "${iface}" )
-               eoutdent
-       fi
-
-       return 0
-}
-
-# bool run_stop(char *iface) {
-#
-# Brings down ${iface}.  If predown call returns non-zero, then
-# stop returns non-zero to indicate failure bringing down device.
-# In all other cases stop returns 0 to indicate success.
-run_stop() {
-       local iface="$1" IFVAR=$(bash_variable "$1") x
-
-       # Load our ESSID variable so users can use it in predown() instead
-       # of having to write code.
-       local ESSID=$(get_options ESSID) ESSIDVAR=
-       [[ -n ${ESSID} ]] && ESSIDVAR=$(bash_variable "${ESSID}")
-
-       # Call user-defined predown function if it exists
-       if is_function predown ; then
-               einfo "Running predown function"
-               eindent
-               ( predown "${iface}" )
-               eend $? "predown ${iface} failed" || return 1
-               eoutdent
-       elif is_net_fs / ; then
-               eerror "root filesystem is network mounted -- can't stop ${iface}"
-               return 1
-       elif is_union_fs / ; then
-               for x in $(unionctl "${dir}" --list \
-               | sed -e 's/^\(.*\) .*/\1/') ; do
-                       if is_net_fs "${x}" ; then
-                               eerror "Part of the root filesystem is network mounted - cannot stop ${iface}"
-                               return 1
-                       fi
-               done
-       fi
-
-       iface_stop "${iface}" || return 1  # always succeeds, btw
-
-       # Release resolv.conf information.
-       [[ -x /sbin/resolvconf ]] && resolvconf -d "${iface}"
-       
-       # Mark us as inactive if called from the background
-       [[ ${IN_BACKGROUND} == "true" ]] && mark_service_inactive "net.${iface}"
-
-       # Call user-defined postdown function if it exists
-       if is_function postdown ; then
-               # We need to mark the service as stopped incase a
-               # postdown function wants to restart services that depend on us
-               [[ ${IN_BACKGROUND} != "true" ]] && mark_service_stopped "net.${iface}"
-               end_service "net.${iface}" 0
-               einfo "Running postdown function"
-               eindent
-               ( postdown "${iface}" )
-               eoutdent
-       fi
-
-
-       return 0
-}
-
-# bool run(char *iface, char *cmd)
-#
-# Main start/stop entry point
-# We load modules here and remove any functions that they
-# added as we may be called inside the same shell scope for another interface
-run() {
-       local iface="$1" cmd="$2" r=1 RC_INDENTATION="${RC_INDENTATION}"
-       local starting=true
-       local -a MODULES=() mods=()
-       local IN_BACKGROUND="${IN_BACKGROUND}"
-
-       if [[ ${IN_BACKGROUND} == "true" || ${IN_BACKGROUND} == "1" ]] ; then
-               IN_BACKGROUND=true
-       else
-               IN_BACKGROUND=false
-       fi
-
-       # We need to override the exit function as runscript.sh now checks
-       # for it. We need it so we can mark the service as inactive ourselves.
-       unset -f exit
-
-       eindent
-       [[ ${cmd} == "stop" ]] && starting=false
-
-       # We force lo to only use these modules for a major speed boost
-       if is_loopback "${iface}" ; then        
-               modules_force=( "iproute2" "ifconfig" "system" )
-       fi
-
-       if modules_load "${iface}" "${starting}" ; then
-               if [[ ${cmd} == "stop" ]] ; then
-                       # Reverse the module list for stopping
-                       mods=( "${MODULES[@]}" )
-                       for ((i = 0; i < ${#mods[@]}; i++)); do
-                               MODULES[i]=${mods[((${#mods[@]} - i - 1))]}
-                       done
-
-                       run_stop "${iface}" && r=0
-               else
-                       # Only hotplug on ethernet interfaces
-                       if [[ ${IN_HOTPLUG} == 1 ]] ; then
-                               if ! interface_is_ethernet "${iface}" ; then
-                                       eerror "We only hotplug for ethernet interfaces"
-                                       return 1
-                               fi
-                       fi
-
-                       run_start "${iface}" && r=0
-               fi
-       fi
-
-       if [[ ${r} != "0" ]] ; then
-               if [[ ${cmd} == "start" ]] ; then
-                       # Call user-defined failup if it exists
-                       if is_function failup ; then
-                               einfo "Running failup function"
-                               eindent
-                               ( failup "${iface}" )
-                               eoutdent
-                       fi
-               else
-                       # Call user-defined faildown if it exists
-                       if is_function faildown ; then
-                               einfo "Running faildown function"
-                               eindent
-                               ( faildown "${iface}" )
-                               eoutdent
-                       fi
-               fi
-               [[ ${IN_BACKGROUND} == "true" ]] \
-                       && mark_service_inactive "net.${iface}"
-       fi
-
-       return "${r}"
-}
-
-# bool start(void)
-#
-# Start entry point so that we only have one function
-# which localises variables and unsets functions
-start() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Starting ${IFACE}"
-       run "${IFACE}" start
-}
-
-# bool stop(void)
-#
-# Stop entry point so that we only have one function
-# which localises variables and unsets functions
-stop() {
-       declare -r IFACE="${SVCNAME#*.}"
-       einfo "Stopping ${IFACE}"
-       run "${IFACE}" stop
-}
-
-# vim:ts=4