Explorar el Código

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
DJ Lucas hace 14 años
padre
commit
c2db0877b0

+ 4 - 0
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.

+ 4 - 4
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
 

+ 58 - 44
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

+ 154 - 76
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

+ 139 - 76
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
+