#!/bin/sh # ifup DEVICE=${1} BRCTL=/usr/sbin/brctl # Source functions library source /etc/rc.d/init.d/functions log_script_name "$0 $*" # Load network interface card parameters source /etc/sysconfig/network/ifconfig.${DEVICE} # Check that the brctl program is present and executable. check_brctl() { if [ ! -x ${BRCTL} ]; then msg_log "*** ERROR: /usr/sbin/brctl not found." exit ${EXIT_CODE_FAILURE} 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 # 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} && 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 # 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 cmd_run_log ${DHCP_PROG} ${DHCP_START} ${DEVICE} } 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 # 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} fi # Warning: there is no guarantee that wpa_supplicant will try that network, # if two or more networks are listed in wpa_supplicant.conf and are # all simultaneously reachable (if they appear in iwlist). echo "Trying to connect to wifi network \"${ESSID}\"" if [ -f /var/run/wpa_supplicant/${DEVICE} ]; then echo "Stopping previous wpa_supplicant" killall wpa_supplicant rm /var/run/wpa_supplicant/${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 0.25 let count=count+1 if [ $count -gt 20 ]; then echo "wpa_supplicant failure" exit ${EXIT_CODE_WARNING} fi done } # 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 cmd_run_log pppoe-start else echo "Invalid or absent BOOTPROTO variable" exit 1 fi exit $?