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
fi
}
-# Determining if the interface is a bridge:
-if [ "x${BRIDGE}" = "xyes" ]; then
- check_brctl
- cmd_run_log ${BRCTL} addbr ${1} &&
- cmd_run_log ${BRCTL} stp ${1} off || exit 1
-fi
+# Bring interface up
+bring_if_up()
+{
+ link_status=$(ip link show ${DEVICE})
+ if [ -n "${link_status}" ]; then
+ 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
-# Determining if the interface is part of a bridge:
-if [ -n "${BRIDGE_TO}" ]; then
- check_brctl
- cmd_run_log ${BRCTL} addif ${BRIDGE_TO} ${1} || exit 1
-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
+}
-if [ "x${BOOTPROTO}" = "xdhcp" ]; then
- # DHCP configuration
+# Static IP address protocol
+proto_static()
+{
+ cmd_run_log ip addr add ${IPADDR}/${PREFIX_LENGTH} dev ${DEVICE} brd + ${IFSCOPE} &&
+ 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} via ${DEVICE}" \
+ ip route add default via ${GATEWAY} dev ${DEVICE}
+ fi
+ fi
+}
+
+# Obtain IP address from DHCP
+proto_dhcp()
+{
+ bring_if_up
# Load DHCP client parameters
source /etc/sysconfig/network/dhcp-client
fi
cmd_run_log ${DHCP_PROG} ${DHCP_START} ${DEVICE}
-elif [ x${BOOTPROTO} = "xstatic" ]; then
- # Static configuration
- cmd_run_log ip addr add ${IPADDR}/${PREFIX_LENGTH} dev ${DEVICE} brd + ${IFSCOPE} &&
- cmd_run_log ip link set ${DEVICE} 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
+proto_wireless()
+{
+ # Bring interface up
+ bring_if_up
+
+ # Check if a socket exists, meaning wpa_supplicant is running
+ if [ -S /var/run/wpa_supplicant/${DEVICE} ]; then
+ echo "wpa_supplicant already running"
+
+ # 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
+
+ # 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
+
+ count=0
+ while ! wpa_cli -i ${DEVICE} status | grep "wpa_state=COMPLETED"; do
+ echo "Waiting for wpa_supplicant to complete"
+ sleep 0.25
+
+ let count=count+1
+ 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 [ ! -d /sys/class/net/${DEVICE} ]; then
+ echo "Interface ${DEVICE} not found"
+ exit ${EXIT_CODE_WARNING}
+fi
+
+# Determining if the interface is a bridge:
+if [ "x${BRIDGE}" = "xyes" ]; then
+ check_brctl
+ cmd_run_log ${BRCTL} addbr ${DEVICE} &&
+ cmd_run_log ${BRCTL} stp ${DEVICE} off || exit 1
+fi
+
+# Determining if the interface is part of a bridge:
+if [ -n "${BRIDGE_TO}" ]; then
+ check_brctl
+ cmd_run_log ${BRCTL} addif ${BRIDGE_TO} ${DEVICE} || exit 1
+fi
+
+if [ "x${BOOTPROTO}" = "xwifi" ]; then
+ proto_wireless
+ # At this point, the SSID script has been sourced, and its
+ # BOOTPROTO variable will contain either "static" or "dhcp",
+ # so configuration will continue below.
+fi
+
+if [ "x${BOOTPROTO}" = "xdhcp" ]; then
+ proto_dhcp
+elif [ "x${BOOTPROTO}" = "xstatic" ]; then
+ proto_static
elif [ x${BOOTPROTO} = "xpppoe" ]; then
- # PPPoE configuration
cmd_run_log pppoe-start
else
+ echo "Invalid BOOTPROTO variable"
exit 1
fi