diff options
author | DJ Lucas <dj@linuxfromscratch.org> | 2011-05-18 17:18:30 +0000 |
---|---|---|
committer | DJ Lucas <dj@linuxfromscratch.org> | 2011-05-18 17:18:30 +0000 |
commit | c2db0877b0203a21182e5aaba75c98e6291d2ea0 (patch) | |
tree | 4845d841e8c425c558cbfe6336e298328f18eb10 | |
parent | 499ce32dd46e8fba9c0fc18c398408cc269ad867 (diff) |
New ifup/ifdown and modified network script. Changed comments on cleanfs scritp as well.
git-svn-id: http://svn.linuxfromscratch.org/LFS/trunk/BOOK@9543 4aa44e1e-78dd-0310-a6d2-fbcd4c07a689
-rw-r--r-- | lsb-bootscripts/ChangeLog | 4 | ||||
-rw-r--r-- | lsb-bootscripts/etc/init.d/cleanfs | 8 | ||||
-rw-r--r-- | lsb-bootscripts/etc/init.d/network | 102 | ||||
-rw-r--r-- | lsb-bootscripts/sbin/ifdown | 230 | ||||
-rw-r--r-- | lsb-bootscripts/sbin/ifup | 215 |
5 files changed, 359 insertions, 200 deletions
diff --git a/lsb-bootscripts/ChangeLog b/lsb-bootscripts/ChangeLog index 04c739112..ddf064576 100644 --- a/lsb-bootscripts/ChangeLog +++ b/lsb-bootscripts/ChangeLog @@ -1,3 +1,7 @@ +2011-05-18 DJ Lucas <dj@linuxfromscratch.org> + * /sbin/ifup, /sbin/ifdown: Complete rewrite for use as standalone tools + * etc/init.d/network: Rewrote script to account for new ifup and ifdown + 2011-05-14 DJ Lucas <dj@linuxfromscratch.org> * etc/default/rc.site: Added FAILURE_ACTION variable for use in remote systems where user input is not appropriate in the event of a failure. diff --git a/lsb-bootscripts/etc/init.d/cleanfs b/lsb-bootscripts/etc/init.d/cleanfs index 2e71456ee..26a0c2096 100644 --- a/lsb-bootscripts/etc/init.d/cleanfs +++ b/lsb-bootscripts/etc/init.d/cleanfs @@ -9,10 +9,10 @@ # Should-Stop: # Default-Start: S # Default-Stop: -# Short-Description: Cleans temporary directories early in the boot process. -# Description: Cleans temporary directories /var/run, /var/lock, and -# /tmp. cleanfs also creates /var/run/utmp and any files -# defined in /etc/default/createfiles. +# Short-Description: Cleans and prepares the temporary directory. +# Description: Cleans the temporary directory /tmp and creates the +# /var/run/utmp file and any other files defined in +# /etc/default/createfiles. # X-LFS-Provided-By: LFS ### END INIT INFO diff --git a/lsb-bootscripts/etc/init.d/network b/lsb-bootscripts/etc/init.d/network index ec11d5e38..b725dd05a 100644 --- a/lsb-bootscripts/etc/init.d/network +++ b/lsb-bootscripts/etc/init.d/network @@ -17,54 +17,68 @@ . /lib/lsb/init-functions case "${1}" in - start) - # Start all network interfaces - for file in ${NETWORK_DEVICES}/ifconfig.* - do - interface=${file##*/ifconfig.} + start) + # Start all network interfaces + for dir in ${NETWORK_DEVICES}/ifconfig.* + do + interface=${dir##*/ifconfig.} + # skip if $dir is * (because nothing was found) + if [ "${interface}" = "*" ]; then + continue + fi + # Process individual configuration files + for file in "${dir}"/* ; do + ONBOOT=`grep "ONBOOT" "${file}" | sed 's@^ONBOOT=@@'` + case "${ONBOOT}" in + Y* | y* | 0) + /sbin/ifup -c "${file}" "${interface}" + ;; + esac + done + done + ;; - # skip if $file is * (because nothing was found) - if [ "${interface}" = "*" ] - then - continue - fi - IN_BOOT=1 /sbin/ifup ${interface} - done - ;; + stop) + # Reverse list + DIRS="" + for dir in /run/network/ifconfig.* + do + DIRS="${dir} ${DIRS}" + done - stop) - # Reverse list - FILES="" - for file in /run/network/ifconfig.* - do - FILES="${file} ${FILES}" - done + # Stop all network interfaces + for dir in ${DIRS}; do + interface=${dir##*/ifconfig.} + # skip if $dir is * (because nothing was found) + if [ "${interface}" = "*" ]; then + continue + fi + # Process individual configuration files + for file in "${dir}"/* ; do + # No checking necessary if it is in /run/network + /sbin/ifdown -c "${file}" "${interface}" + done + link_status=`/sbin/ip link show "${interface}" | \ + grep -o "state DOWN"` + if [ "${link_status}" != "state DOWN" ]; then + message="Shutting down the ${interface} interface..." + /sbin/ip addr flush "${interface}" && + /sbin/ip link set "${interface}" down + evaluate_retval standard + fi + done + ;; - # Stop all network interfaces - for file in ${FILES} - do - interface=${file##*/ifconfig.} + restart) + ${0} stop + sleep 1 + ${0} start + ;; - # skip if $file is * (because nothing was found) - if [ "${interface}" = "*" ] - then - continue - fi - - IN_BOOT=1 /sbin/ifdown ${interface} - done - ;; - - restart) - ${0} stop - sleep 1 - ${0} start - ;; - - *) - echo "Usage: ${0} {start|stop|restart}" - exit 1 - ;; + *) + echo "Usage: ${0} {start|stop|restart}" + exit 1 + ;; esac # End /etc/init.d/network diff --git a/lsb-bootscripts/sbin/ifdown b/lsb-bootscripts/sbin/ifdown index f9e2a51ad..e6d49c874 100644 --- a/lsb-bootscripts/sbin/ifdown +++ b/lsb-bootscripts/sbin/ifdown @@ -1,98 +1,176 @@ #!/bin/sh ######################################################################## -# Begin $NETWORK_DEVICES/ifdown +# Begin /sbin/ifdown # # Description : Interface Down # -# Authors : Nathan Coulson - nathan@linuxfromscratch.org -# Kevin P. Fleming - kpfleming@linuxfromscratch.org +# Authors : DJ Lucas - dj@linuxfromscratch.org # -# Version : 00.01 -# -# Notes : the IFCONFIG variable is passed to the scripts found -# in the services directory, to indicate what file the -# service should source to get environmental variables. +# Version : 00.02 # ######################################################################## . /lib/lsb/init-functions -# Collect a list of configuration files for our interface -if [ -n "${2}" ]; then - for file in ${@#$1}; do # All parameters except $1 - FILES="${FILES} /run/network/ifconfig.${1}/${file}" - done -elif [ -d "/run/network/ifconfig.${1}" ]; then - FILES=`echo /run/network/ifconfig.${1}/*` -else - FILES="/run/network/ifconfig.${1}" -fi - -# Reverse the order configuration files are processed in -for file in ${FILES}; do - FILES2="${file} ${FILES2}" -done -FILES=${FILES2} +function get_args() + { + if test -z "${1}" ; then + showhelp + exit 1 + fi -# Process each configuration file -for file in ${FILES}; do - # skip backup files - if [ "${file}" != "${file%""~""}" ]; then - continue - fi + while test -n "${1}" ; do + case "${1}" in + -c | --configfile) + check_arg $1 $2 + CONFIGFILE="${2}" + shift 2 + ;; + -f | --force) + FORCE="1" + shift 1 + ;; + eth* | iw* | wlan*) + INTERFACE="${1}" + shift 1 + ;; + -h | --help) + showhelp + exit 0 + ;; + *) + showhelp + echo "ERROR: '${1}' unknown argument" + echo "" + exit 2 + ;; + esac + done + } - if [ ! -f "${file}" ]; then - message="${file} is not a network configuration file or directory." - log_warning_msg - fi - ( - if [ ! -d "${file}" ]; then - . ${file} +function check_arg() + { + echo "${2}" | grep -v "^-" > /dev/null + if [ -z "${?}" -o ! -n "${2}" ]; then + echo "Error: ${1} requires a valid argument." + exit 2 fi + } - # Will not process this service if started by boot, and ONBOOT - # is not set to yes - if [ "${IN_BOOT}" = "1" -a "${ONBOOT}" != "yes" ]; then - continue - fi +function showhelp() + { + echo "" + echo "`/usr/bin/basename ${0}` brings down a valid network interface." + echo "" + echo "Options:" + echo " -c --configfile The path to an interface configuration file" + echo " If no configuration file is given, all files" + echo " listed in /etc/network/ifconfig.<int> will" + echo " be processed, regarless of the value of ONBOOT" + echo " -f --force Flush all IPs and force the interface down." + echo " -h --help Show this help message and exit." + echo "" + echo "Examples:" + echo " `/usr/bin/basename ${0}` eth0 -c /run/network/ifconfig.eth0/ipv4" + echo " `/usr/bin/basename ${0}` eth0 --force -c /run/network/ifconfig.eth0/ipv4" + echo " `/usr/bin/basename ${0}` eth0 --force" + echo " `/usr/bin/basename ${0}` eth0" + echo "" + echo "" + } + +# Intialize empty variables so that the shell does not polute the script +CONFIGFILE="" +CONFIGDIR="" +INTERFACE="" +FORCE="" +failed=0 + +# Process command line arguments +get_args ${@} + +# Handle common errors - No need to account for bootscripts, this should not +# happen during boot or shutdown. +if [ "${CONFIGFILE}x" != "x" -a ! -f "${CONFIGFILE}" ]; then + echo "ERROR: ${CONFIGFILE} is not a valid network configuration file." + echo "" + exit 2 +fi + +if [ "${INTERFACE}x" == "x" ]; then + echo "ERROR: No interface was given" + echo "" + exit 2 +else + if ! grep "${INTERFACE}" /proc/net/dev 2>&1 > /dev/null; then + echo "ERROR: ${INTERFACE} is not a valid network interface." + echo "" + exit 2 + fi +fi - # Will not process this service if started by hotplug, and - # ONHOTPLUG is not set to yes - if [ "${IN_HOTPLUG}" = "1" -a "${ONHOTPLUG}" != "yes" ]; then - continue +# If a configuration file is present, use it +if [ "${CONFIGFILE}x" != "x" ]; then + . "${CONFIGFILE}" + if [ -x "/lib/network-services/${SERVICE}" ]; then + # do the work + if IFCONFIG=${CONFIGFILE} \ + /lib/network-services/${SERVICE} ${INTERFACE} down; then + rm "${CONFIGFILE}" fi - - # This will run the service script, if SERVICE is set - if [ -n "${SERVICE}" -a -x "/lib/network-services/${SERVICE}" ]; then - if ip link show ${1} > /dev/null 2>&1 - then - IFCONFIG=${file} /lib/network-services/${SERVICE} ${1} down && - if [ -f "${file}" ]; then - rm ${file} + else + echo "ERROR: Service '${SERVICE}' is not a valid service." + echo "" + exit 2 + fi +# No interface configuration file was given +else + # Process all running interface configuration files + CONFIGDIR="/run/network/ifconfig.${INTERFACE}" + if [ -d "${CONFIGDIR}" ]; then + FILES=`ls "${CONFIGDIR}"` + for CONFIGFILE in ${FILES} + do + ( + . "${CONFIGDIR}/${CONFIGFILE}" + # No error checking necessary if they are in /run + if IFCONFIG="${CONFIGDIR}/${CONFIGFILE}" \ + /lib/network-services/${SERVICE} ${INTERFACE} down; then + rm "${CONFIGDIR}/${CONFIGFILE}" fi - else - message="Interface ${1} doesn't exist." - log_warning_msg - fi - else - echo -e "${FAILURE}Unable to process ${file}. Either" - echo -e "${FAILURE}the SERVICE variable was not set," - echo -e "${FAILURE}or the specified service cannot be executed." - message="" - log_failure_msg - fi - ) -done - -if [ -z "${2}" ]; then - link_status=`ip link show $1` - if [ -n "${link_status}" ]; then - if echo "${link_status}" | grep -q UP; then - message="Bringing down the ${1} interface..." - ip link set ${1} down - evaluate_retval standard + ) + done + # all running config files processes, set the link down + message="Setting interface ${INTERFACE} down..." + /sbin/ip link set "${INTERFACE}" down + evaluate_retval standard + else + if [ "${FORCE}" != "1" ]; then + echo "ERROR: No configuration files found for ${INTERFACE}." + echo "" + exit 2 fi fi fi + +if [ "${FORCE}" == "1" ]; then + /sbin/ip addr flush dev "${INTERFACE}" 2>&1 > /dev/null || failed=1 + if [ "${failed}" == "1" ]; then + log_failure_msg "Flushing IP addresses from interface ${INTERFACE}..." + echo "" + exit 1 + else + log_success_msg "Flushing IP addresses from interface ${INTERFACE}..." + fi + /sbin/ip link set dev "${INTERFACE}" down 2>&1 > /dev/null || failed=1 + if [ "${failed}" == "1" ]; then + log_failure_msg "Setting link down for interface ${INTERFACE}..." + echo "" + exit 1 + else + log_success_msg "Setting link down for interface ${INTERFACE}..." + fi +fi + +exit "${failed}" -# End $NETWORK_DEVICES/ifdown diff --git a/lsb-bootscripts/sbin/ifup b/lsb-bootscripts/sbin/ifup index 069af2f94..0c7fbddea 100644 --- a/lsb-bootscripts/sbin/ifup +++ b/lsb-bootscripts/sbin/ifup @@ -1,97 +1,160 @@ #!/bin/sh ######################################################################## -# Begin $NETWORK_DEVICES/ifup +# Begin /sbin/ifdown # # Description : Interface Up # -# Authors : Nathan Coulson - nathan@linuxfromscratch.org -# Kevin P. Fleming - kpfleming@linuxfromscratch.org +# Authors : DJ Lucas - dj@linuxfromscratch.org # -# Version : 00.00 -# -# Notes : the IFCONFIG variable is passed to the scripts found -# in the services directory, to indicate what file the -# service should source to get environmental variables. +# Version : 00.02 # ######################################################################## -. /lib/lsb/init-functions +. /lib/lsb/init-functions -# Collect a list of configuration files for our interface -if [ -n "${2}" ]; then - for file in ${@#$1} # All parameters except $1 - do - FILES="${FILES} ${NETWORK_DEVICES}/ifconfig.${1}/${file}" - done -elif [ -d "${NETWORK_DEVICES}/ifconfig.${1}" ]; then - FILES=`echo ${NETWORK_DEVICES}/ifconfig.${1}/*` -else - FILES="${NETWORK_DEVICES}/ifconfig.${1}" -fi +function get_args() + { + if test -z "${1}" ; then + showhelp + exit 1 + fi -message="Bringing up the ${1} interface..." + while test -n "${1}" ; do + case "${1}" in + -c | --configfile) + check_arg $1 $2 + CONFIGFILE="${2}" + shift 2 + ;; + eth* | iw* | wlan*) + INTERFACE="${1}" + shift 1 + ;; + -h | --help) + showhelp + exit 0 + ;; + *) + showhelp + echo "ERROR: '${1}' unknown argument" + echo "" + exit 2 + ;; + esac + done + } -# Process each configruation file -for file in ${FILES}; do - # skip backup files - if [ "${file}" != "${file%""~""}" ]; then - continue - fi +function check_arg() + { + echo "${2}" | grep -v "^-" > /dev/null + if [ -z "${?}" -o ! -n "${2}" ]; then + echo "Error: ${1} requires a valid argument." + exit 2 + fi + } - if [ ! -f "${file}" ]; then - log_warning_msg - message="${file} is not a network configuration file or directory." - log_warning_msg - fi +function showhelp() + { + echo "`/usr/bin/basename ${0}` brings up a valid network interface." + echo "" + echo "Options:" + echo " -c --configfile The path to an interface configuration file" + echo " If no configuration file is given, all files" + echo " listed in ${NETWORK_DEVICES}/ifconfig.<int> will" + echo " be processed, regarless of the value of ONBOOT" + echo " -h --help Show this help message and exit." + echo "" + echo "Examples:" + echo " `/usr/bin/basename ${0}` eth0 -c ${NETWORK_DEVICES}/ifconfig.eth0/ipv4" + echo " `/usr/bin/basename ${0}` eth0" + echo "" + echo "" + } - ( - if [ ! -d "${file}" ]; then - . ${file} - fi +# Intialize empty variables so that the shell does not polute the script +CONFIGFILE="" +CONFIGDIR="" +INTERFACE="" + +# Process command line arguments +get_args ${@} - # Will not process this service if started by boot, and ONBOOT - # is not set to yes - if [ "${IN_BOOT}" = "1" -a "${ONBOOT}" != "yes" ]; then - continue +# Handle common errors - No need to account for bootscripts, this should not +# happen during boot or shutdown. +if [ "${CONFIGFILE}x" != "x" -a ! -f "${CONFIGFILE}" ]; then + echo "ERROR: ${CONFIGFILE} is not a valid network configuration file." + echo "" + exit 2 +fi + +if [ "${INTERFACE}x" == "x" ]; then + echo "ERROR: No interface was given" + echo "" + exit 2 +else + if ! grep "${INTERFACE}" /proc/net/dev 2>&1 > /dev/null; then + echo "ERROR: ${INTERFACE} is not a valid network interface." + echo "" + exit 2 + fi +fi + +# If a configuration file is present, use it +if [ "${CONFIGFILE}x" != "x" ]; then + . "${CONFIGFILE}" + if [ -x "/lib/network-services/${SERVICE}" ]; then + # do the work + # Check to make sure the interface is up + link_status=`/sbin/ip link show "${INTERFACE}" | \ + grep -o "state UP"` + if [ "${link_status}" != "state UP" ]; then + message="Bringing up the ${INTERFACE} interface..." + /sbin/ip link set ${INTERFACE} up + evaluate_retval standard fi - # Will not process this service if started by hotplug, and - # ONHOTPLUG is not set to yes - if [ "${IN_HOTPLUG}" = "1" -a "${ONHOTPLUG}" != "yes" -a "${HOSTNAME}" != "(none)" ]; then - continue + if IFCONFIG=${CONFIGFILE} \ + /lib/network-services/${SERVICE} ${INTERFACE} up; then + mkdir -p "/run/network/ifconfig.${INTERFACE}" + cp "${CONFIGFILE}" "/run/network/ifconfig.${INTERFACE}/" fi - - if [ -n "${SERVICE}" -a -x "/lib/network-services/${SERVICE}" ]; then - if [ -z "${CHECK_LINK}" -o "${CHECK_LINK}" = "y" -o "${CHECK_LINK}" = "yes" -o "${CHECK_LINK}" = "1" ]; then - if ip link show ${1} > /dev/null 2>&1; then - link_status=`ip link show ${1}` - if [ -n "${link_status}" ]; then - if ! echo "${link_status}" | grep -q UP; then - ip link set ${1} up - evaluate_retval standard - fi + else + echo "ERROR: Service '${SERVICE}' is not a valid service." + echo "" + exit 2 + fi +# No interface configuration file was given +else + # Process all available interface configuration files + CONFIGDIR="/etc/network/ifconfig.${INTERFACE}" + if [ -d "${CONFIGDIR}" ]; then + FILES=`ls "${CONFIGDIR}"` + for CONFIGFILE in ${FILES} + do + ( + . "${CONFIGDIR}/${CONFIGFILE}" + if [ -x "/lib/network-services/${SERVICE}" ]; then + # Check to make sure the interface is up + link_status=`/sbin/ip link show "${INTERFACE}" | \ + grep -o "state UP"` + if [ "${link_status}" != "state UP" ]; then + message="Bringing up the ${INTERFACE} interface..." + /sbin/ip link set ${INTERFACE} up + evaluate_retval standard + fi + if IFCONFIG="${CONFIGDIR}/${CONFIGFILE}" \ + /lib/network-services/${SERVICE} ${INTERFACE} up; then + mkdir -p "/run/network/ifconfig.${INTERFACE}" + cp "${CONFIGDIR}/${CONFIGFILE}" \ + "/run/network/ifconfig.${INTERFACE}/" fi else - message="${message}Interface ${1} doesn't exist." - log_warning_msg + echo "ERROR: Service '${SERVICE}' is not a valid service." + echo "" + exit 2 fi - fi - IFCONFIG=${file} /lib/network-services/${SERVICE} ${1} up - if [ "${?}" -eq "0" ]; then - if [ ! -d "${file}" -a "${file}" != "${NETWORK_DEVICES}/ifconfig.${1}" ]; then - mkdir -p "/run/network/ifconfig.${1}" - cp "${file}" "/run/network/ifconfig.${1}" - elif [ ! -d "${file}" ]; then - cp "${file}" "/run/network/" - fi - fi - else - echo -e "${FAILURE}Unable to process ${file}. Either" - echo -e "${FAILURE}the SERVICE variable was not set," - echo -e "${FAILURE}or the specified service cannot be executed." - message="" - log_failure_msg - fi - ) -done -# End $NETWORK_DEVICES/ifup + ) + done + fi +fi + |