Replace PREFIX_LENGTH with NETMASK_LENGHTH
[hvlinux.git] / stage2 / bootscripts / ifup
index e31fd43..5ba66bb 100755 (executable)
@@ -6,6 +6,8 @@ DEVICE=${1}
 
 BRCTL=/usr/sbin/brctl
 
+WPA_SUPP_OPTS="-Dnl80211 -B -s -c /etc/wpa_supplicant.conf"
+
 # Source functions library
 source /etc/rc.d/init.d/functions
 
@@ -14,6 +16,15 @@ log_script_name "$0 $*"
 # Load network interface card parameters
 source /etc/sysconfig/network/ifconfig.${DEVICE}
 
+# Load DHCP client parameters
+source /etc/sysconfig/network/dhcp-client
+
+# Make sure DHCP client is available.
+if [ ! -x ${DHCP_PROG} ]; then
+    echo "Program \"${DHCP_PROG}\" is not executable."
+    exit ${EXIT_CODE_FAILURE}
+fi
+
 # Check that the brctl program is present and executable.
 check_brctl()
 {
@@ -31,40 +42,48 @@ bring_if_up()
         if ! echo "${link_status}" | grep -q UP; then
             cmd_run_log ip link set ${DEVICE} up
         fi
+    else
+        echo "Interface ${DEVICE} not found"
+        exit ${EXIT_CODE_WARNING}
+    fi
+
+    # Check if a cable is plugged for wired interface
+    if echo "${DEVICE}" | grep -q "eth" ; then
+        count=0
+        while cat /sys/class/net/${DEVICE}/carrier | grep -q "0"; do
+            echo "Waiting for carrier to go up"
+            sleep 0.25
+
+            let count=count+1
+            # 2.5 seconds delay
+            if [ $count -gt 10 ]; then
+                echo "Interface ${DEVICE}: carrier not detected (cable unplugged?)"
+                exit ${EXIT_CODE_WARNING}
+            fi
+        done
     fi
 }
 
 # Static IP address protocol
 proto_static()
 {
-    cmd_run_log ip addr add ${IPADDR}/${PREFIX_LENGTH} dev ${DEVICE} brd + ${IFSCOPE} &&
+    cmd_run_log ip addr add ${IPADDR}/${NETMASK_LENGTH} dev ${DEVICE} \
+        brd + ${IFSCOPE} || exit ${EXIT_CODE_FAILURE}
+
+    # Bring interface up
     bring_if_up
 
     if [ -n "${GATEWAY}" ]; then
-       if ip route | grep -q default; then
-           msg_log "Gateway already setup; skipping."
-       else
-           cmd_run_log_box "Adding default route to gateway ${GATEWAY}" \
-                ip route add default via ${GATEWAY} dev ${DEVICE}
-       fi
+        cmd_run_log ip route add default via ${GATEWAY} || \
+            exit ${EXIT_CODE_FAILURE}
     fi
 }
 
 # Obtain IP address from DHCP
 proto_dhcp()
 {
-    # Load DHCP client parameters
-    source /etc/sysconfig/network/dhcp-client
-
-    # Make sure no file named `/var/run/dhclient.pid' remains.
-    if [ -f "/var/run/dhclient.pid" ]; then
-       rm -f /var/run/dhclient.pid
-    fi
-
-    if [ ! -x "${DHCP_PROG}" ]; then
-       echo "Program \"${DHCP_PROG}\" is not executable."
-        exit ${EXIT_CODE_FAILURE}
-    fi
+    # Bring interface up
+    bring_if_up
 
     cmd_run_log ${DHCP_PROG} ${DHCP_START} ${DEVICE}
 }
@@ -74,49 +93,70 @@ proto_wireless()
     # Bring interface up
     bring_if_up
 
-    if [ ! -d /etc/sysconfig/network/ssid ]; then
-        echo "Missing \"/etc/sysconfig/network/ssid\" directory"
-        exit ${EXIT_CODE_WARNING}
-    fi
+    # Check if a socket exists, meaning wpa_supplicant is running
+    if [ -S /var/run/wpa_supplicant/${DEVICE} ]; then
+        echo "wpa_supplicant already running"
 
-    # Spaces will be converted to underscores in ESSID field
-    for wnet in $(iwlist ${DEVICE} scan | grep ESSID |
-        sed -e "s!.*SSID:\"\(.*\)\"!\1!" -e "s!\ !_!g"); do
-        if [ -f "/etc/sysconfig/network/ssid/${wnet}" ]; then
-            ESSID=${wnet}
-            source "/etc/sysconfig/network/ssid/${wnet}"
-           break
-       fi
-    done
-
-    if [ -z "${ESSID}" ]; then
-        echo "No known wifi networks"
-        exit ${EXIT_CODE_WARNING}
+        # Make sure wpa_supplicant is responding
+        if ! wpa_cli -i ${DEVICE} status; then
+            echo "Stopping unresponding wpa_supplicant"
+            killall wpa_supplicant
+            rm /var/run/wpa_supplicant/${DEVICE}
+        fi
     fi
 
-    if [ -f /var/run/wpa_supplicant/${DEVICE} ]; then
-        echo "Stopping previous wpa_supplicant"
-        killall wpa_supplicant
-        rm /var/run/wpa_supplicant/${DEVICE}
+    # Start wpa_supplicant if it is not running
+    if [ ! -S /var/run/wpa_supplicant/${DEVICE} ]; then
+        echo "Starting wpa_supplicant"
+        wpa_supplicant ${WPA_SUPP_OPTS} -i ${DEVICE}
     fi
 
-    wpa_supplicant -B -c /etc/wpa_supplicant.conf -i ${DEVICE}
     count=0
     while ! wpa_cli -i ${DEVICE} status | grep "wpa_state=COMPLETED"; do
         echo "Waiting for wpa_supplicant to complete"
-        sleep 1
+        sleep 0.25
 
         let count=count+1
-        if [ $count -gt 10 ]; then
+        if [ $count -gt 20 ]; then
             echo "wpa_supplicant failure"
             exit ${EXIT_CODE_WARNING}
         fi
     done
+
+    # Obtain SSID that wpa_supplicant connected to, if applicable
+    SSID=$(wpa_cli -i ${DEVICE} status | egrep "^ssid=" | \
+        sed 's!^ssid=\(.*\)!\1!')
+
+    # Convert spaces to underscores in SSID field
+    SSID=$(echo ${SSID} | sed -e "s!\ !_!g")
+
+    echo "wpa_supplicant connected to network \"${SSID}\""
+
+    if [ -z "${SSID}" ]; then
+        echo "Not connected to any network"
+        exit ${EXIT_CODE_WARNING}
+    fi
+
+    if [ ! -d /etc/sysconfig/network/ssid ]; then
+        echo "Missing \"/etc/sysconfig/network/ssid\" directory"
+        exit ${EXIT_CODE_WARNING}
+    fi
+
+    # Warning:
+    # wpa_supplicant will connect to a given network SSID even if the case is
+    # incorrect (MyNetwork and MYNETWORK will work). But the ssid network file
+    # configuration case must match exactly what was returned by wpa_supplicant.
+    if [ ! -f "/etc/sysconfig/network/ssid/${SSID}" ]; then
+        echo "${0}: Missing network configuration file \"/etc/sysconfig/network/ssid/${SSID}\""
+        exit ${EXIT_CODE_FAILURE}
+    fi
+
+    source "/etc/sysconfig/network/ssid/${SSID}"
 }
 
 # Make sure interface is available
-if ! ip link show ${DEVICE} > /dev/null 2>&1; then
-    echo "Interface ${1} not found"
+if [ ! -d /sys/class/net/${DEVICE} ]; then
+    echo "Interface ${DEVICE} not found"
     exit ${EXIT_CODE_WARNING}
 fi
 
@@ -147,7 +187,7 @@ elif [ "x${BOOTPROTO}" = "xstatic" ]; then
 elif [ x${BOOTPROTO} = "xpppoe" ]; then
     cmd_run_log pppoe-start
 else
-    echo "Invalid or absent BOOTPROTO variable"
+    echo "Invalid BOOTPROTO variable"
     exit 1
 fi