--- trunk/magellan-initscripts/etc/rc.d/init.d/network 2005/10/09 22:31:13 265 +++ trunk/magellan-initscripts/etc/rc.d/init.d/network 2008/03/20 12:43:14 684 @@ -1,5 +1,5 @@ #!/bin/bash -# $Header: /home/cvsd/magellan-cvs/magellan-src/magellan-initscripts/etc/rc.d/init.d/network,v 1.8 2005-10-09 22:31:13 niro Exp $ +# $Header: /home/cvsd/magellan-cvs/magellan-src/magellan-initscripts/etc/rc.d/init.d/network,v 1.17 2008-03-20 12:43:14 niro Exp $ #%rlevels: 0:k 1:k 2:k 3:s 4:s 5:s 6:k #%start: 20 @@ -60,6 +60,10 @@ local WIRELESS_NICK local WIRELESS_NWID local WIRELESS_POWER + local WIRELESS_WPA_DRIVER + + local BRIDGE_INTERFACES + local BRIDGE_STP source ${file} eval value=\$$(echo ${var}) @@ -68,7 +72,7 @@ checkconfig() { - if [ -z "${NETWORKING}" ] + if [[ -z ${NETWORKING} ]] then echo "NETWORKING missing in net.${interface}, aborted" exit 1 @@ -76,20 +80,20 @@ case "${NETWORKING}" in static) - if [ -z "${IP}" ] + if [[ -z ${IP} ]] then echo "IP missing in net.${interface}, aborted" exit 1 fi - if [ -z "${NETMASK}" ] + if [[ -z ${NETMASK} ]] then echo -n "NETMASK missing in net.${interface}, " echo "using 255.255.255.0" NETMASK=255.255.255.0 fi - if [ -z "${BROADCAST}" ] + if [[ -z ${BROADCAST} ]] then echo -n "BROADCAST missing in net.${interface}, " echo "using default address" @@ -97,7 +101,7 @@ ;; dhcp) - if [ -z "${DHCP_PROG}" ] + if [[ -z ${DHCP_PROG} ]] then echo "DHCP_PROG missing in net.${interface}, aborted" exit 1 @@ -120,9 +124,10 @@ if [[ $(read_value ONBOOT ${file}) = yes ]] then iface="$(basename ${file} | sed s/net.//)" - # exclude backup files + # exclude backup files and exclude net.routes too case "${iface}" in *~) ;; + */net.routes) ;; *) devices="${devices} $(basename ${file} | sed s/net.//)" ;; esac fi @@ -131,21 +136,267 @@ echo "${devices}" } +config_wireless_wep() +{ + local iface="$1" + + if [[ -z ${iface} ]] + then + echo "WEP: no \$iface given. Aborting setup." + return 1 + fi + + ${CURS_UP} + ${SET_WWCOL} + echo "[AUTH: WEP]" + + iwconfig "${iface}" enc on + [[ -n ${WIRELESS_KEY_LENGTH} ]] && iwconfig "${iface}" enc "${WIRELESS_KEY_LENGTH}" + [[ -n ${WIRELESS_KEY} ]] && iwconfig "${iface}" key "${WIRELESS_KEY}" + [[ -n ${WIRELESS_KEY_ASCII} ]] && iwconfig "${iface}" key s:"${WIRELESS_KEY_ASCII}" +} + +config_wireless_wpa() +{ + local iface="$1" + + if [[ -z ${iface} ]] + then + echo "WPA: no \$iface given. Aborting setup." + return 1 + fi + + if [ ! -x /sbin/wpa_supplicant ] + then + echo "WPA: wpa_supplicant not installed. Aborting setup." + return 1 + fi + + ${CURS_UP} + ${SET_WWCOL} + echo "[AUTH: WPA]" + + # get default settings + [[ -f /etc/conf.d/wpa_supplicant ]] && source /etc/conf.d/wpa_supplicant + + # check the configuration + [[ -z ${WIRELESS_WPA_CONFIG} ]] && WIRELESS_WPA_CONFIG=/etc/wpa_supplicant.auto + [[ -z ${WIRELESS_WPA_SKEL} ]] && WIRELESS_WPA_SKEL=/etc/conf.d/wpa_supplicant.skel + if [[ -z ${WIRELESS_WPA_DRIVER} ]] + then + echo "WPA: WIRELESS_WPA_DRIVER given. Aborting setup." + return 1 + fi + + # write a config with the settings from net.${iface} + # only wpa-psk ! all other needs manual setup + if [[ ${WIRELESS_WPA_AUTOCONF} = true ]] + then + # write default cfg from skeleton + cat ${WIRELESS_WPA_SKEL} > ${WIRELESS_WPA_CONFIG} + + # setup the network entry + sed -i -e "s:@WIRELESS_ESSID@:${WIRELESS_ESSID}:g" \ + -e "s:@WIRELESS_KEY@:${WIRELESS_KEY}:g" \ + ${WIRELESS_WPA_CONFIG} + fi + + # remove old state dir + [ -d /var/run/wpa_supplicant ] && rm -rf /var/run/wpa_supplicant + + # now run the wpa_supplicant dameon + wpa_supplicant -B \ + -D"${WIRELESS_WPA_DRIVER}" \ + -c"${WIRELESS_WPA_CONFIG}" \ + -i"${iface}" \ + ${WIRELESS_WPA_OPTS} + + # echo wait 5 seconds + echo " Waiting 5 seconds to retrieve authentification reply ... " + sleep 5 +} + +setup_wireless_extensions() +{ + local iface="$1" + + if [[ -z ${iface} ]] + then + echo "WIRELESS_EXTENSIONS: no \$iface given. Aborting setup." + return 1 + fi + + if [[ -n ${WIRELESS_BITRATE} ]] || + [[ -n ${WIRELESS_CHANNEL} ]] || + [[ -n ${WIRELESS_ESSID} ]] || + [[ -n ${WIRELESS_FREQUENCY} ]] || + [[ -n ${WIRELESS_MODE} ]] || + [[ -n ${WIRELESS_NICK} ]] || + [[ -n ${WIRELESS_AUTH_MODE} ]] + then + echo -e ${COLOREDSTAR}"Setting up wlan-ext for ${COLBLUE}${iface}${COLDEFAULT} ... " + fi + + [[ -n ${WIRELESS_BITRATE} ]] && iwconfig "${iface}" rate "${WIRELESS_BITRATE}" + [[ -n ${WIRELESS_CHANNEL} ]] && iwconfig "${iface}" channel "${WIRELESS_CHANNEL}" + [[ -n ${WIRELESS_ESSID} ]] && iwconfig "${iface}" essid "${WIRELESS_ESSID}" + [[ -n ${WIRELESS_FREQUENCY} ]] && iwconfig "${iface}" freq "${WIRELESS_FREQUENCY}" + [[ -n ${WIRELESS_MODE} ]] && iwconfig "${iface}" mode "${WIRELESS_MODE}" + [[ -n ${WIRELESS_NICK} ]] && iwconfig "${iface}" nick "${WIRELESS_NICK}" + + case "${WIRELESS_AUTH_MODE}" in + wpa) config_wireless_wpa "${iface}" ;; + wep|on) config_wireless_wep "${iface}" ;; + off) iwconfig "${iface}" enc off ;; + esac +} + +config_bridge_devices() +{ + local iface="$1" + local method="$2" + local bport + + if [[ -z ${iface} ]] + then + echo "BRIDGE: no \$iface given. Aborting setup." + return 1 + fi + + if [[ -z ${method} ]] + then + echo "BRIDGE: no \$method given. Aborting setup." + return 1 + fi + + # first check for brctl + if [[ -z $(which brctl) ]] + then + echo "brctl not found! Please install 'net-misc/bridge-utils'." + return 1 + fi + + # check the config + if [[ -z ${BRIDGE_INTERFACES} ]] + then + echo "BRIDGE: no \$BRIDGE_INTERFACES given. Aborting setup." + return 1 + fi + + case ${method} in + add) + # setup the bridge device + brctl addbr ${iface} + for bport in ${BRIDGE_INTERFACES} + do + # enter promiscous mode + ifconfig ${bport} 0.0.0.0 promisc + # now setup the bridge + brctl addif ${iface} ${bport} + done + # enable spanning-tree protocol + case ${BRIDGE_STP} in + on|off) brctl stp ${iface} ${BRIDGE_STP} ;; + *) echo "BRIDGE: unkown value \$BRIDGE_STP='$BRIDGE_STP'."; return 1 ;; + esac + ;; + + remove) + for bport in ${BRIDGE_INTERFACE} + do + # bring the interface down + ifconfig ${bport} down + # remove the interface from the bridge + brctl delif ${iface} ${bport} + done + # bring the bridge down + brctl delbr ${iface} + ;; + esac + + # unset the bridge variable to be safe + unset BRIDGE_INTERFACES + # continue to setup generic networking +} + +config_routes() +{ + local method="$1" + local message + + # only add and del are allowed + case ${method} in + add) message="Adding route ${COLBLUE}${route}${COLDEFAULT} ..." ;; + del) message="Removing route ${COLBLUE}${route}${COLDEFAULT} ..." ;; + *) + echo "config_routes: unsupported \$method '${method}'." + exit 1 + ;; + esac + + # adds/delete user routes + if [[ -f /etc/conf.d/net.routes ]] + then + ( cat /etc/conf.d/net.routes; echo ) | # make sure there is a LF at the end + while read route + do + case "${route}" in + \#*|"") continue ;; + esac + echo -e ${COLOREDSTAR}"${message}" + route ${method} ${route} + evaluate_retval + done + fi +} + networking_start() { - local iface dns + local iface dns routes ALL_INTERFACES + + if [[ -z $1 ]] + then + ALL_INTERFACES=$(onboot_interface_list ${network_settings}/net.*) + else + if [[ -e ${network_settings}/net.$1 ]] + then + ALL_INTERFACES="$1" + else + ${FAILURE} + echo "Interface $1 does not exist. Aborting" + ${NORMAL} + exit 1 + fi + fi # get list of all devices - for iface in $(onboot_interface_list ${network_settings}/net.*) + for iface in ${ALL_INTERFACES} do # checkconfig source ${network_settings}/net.${iface} || exit 1 checkconfig - echo -e ${COLOREDSTAR}"Bringing up interface ${COLBLUE}${iface}${COLDEFAULT} ..." - # setup mac - [ -n "${FORCE_MAC_TO}" ] && ifconfig ${iface} hw ether "${FORCE_MAC_TO}" + if [ -n "${FORCE_MAC_TO}" ] + then + echo -e ${COLOREDSTAR}"Faking MAC to ${FORCE_MAC_TO} for ${COLBLUE}${iface}${COLDEFAULT} ... " + ifconfig "${iface}" hw ether "${FORCE_MAC_TO}" + evaluate_retval + fi + + # setup bridges + if [[ ${iface} = br[0-9]* ]] + then + config_bridge_devices ${iface} add + fi + + # activate the interface + ifconfig "${iface}" up + + # now configure wireless_extensions + [ -x /usr/sbin/iwconfig ] && setup_wireless_extensions "${iface}" + + echo -e ${COLOREDSTAR}"Bringing up interface ${COLBLUE}${iface}${COLDEFAULT} ..." # setup static or dhcp case ${NETWORKING} in @@ -153,7 +404,7 @@ ${CURS_UP} ${SET_WWCOL} echo "[DHCP]" - loadproc ${DHCP_PROG} ${DHCP_START} + loadproc ${DHCP_PROG} ${DHCP_START} "${iface}" ;; static|STATIC) ${CURS_UP} @@ -170,6 +421,8 @@ echo -e ${COLOREDSTAR}"Setting up default gateway for ${COLBLUE}${iface}${COLDEFAULT} ..." route add default gateway ${GATEWAY} metric 1 dev ${iface} evaluate_retval + + unset GATEWAY fi # setup /etc/resolv.conf @@ -183,37 +436,34 @@ do echo "nameserver ${dns}" >> /etc/resolv.conf done - fi - # setup wlan extensions - if [ -x /usr/sbin/iwconfig ] - then - [[ -n ${WIRELESS_BITRATE} ]] && iwconfig "${iface}" rate "${WIRELESS_BITRATE}" - [[ -n ${WIRELESS_CHANNEL} ]] && iwconfig "${iface}" channel "${WIRELESS_CHANNEL}" - [[ -n ${WIRELESS_ESSID} ]] && iwconfig "${iface}" essid "${WIRELESS_ESSID}" - [[ -n ${WIRELESS_FREQUENCY} ]] && iwconfig "${iface}" freq "${WIRELESS_FREQUENCY}" - [[ -n ${WIRELESS_MODE} ]] && iwconfig "${iface}" mode "${WIRELESS_MODE}" - [[ -n ${WIRELESS_NICK} ]] && iwconfig "${iface}" nick "${WIRELESS_NICK}" - if [[ -n ${WIRELESS_AUTH_MODE} ]] - then - case ${WIRELESS_AUTH_MODE} in - wpa) echo "Using wpa";; - wep|on) iwconfig "${iface}" enc on ;; - off) iwconfig "${iface}" enc off ;; - *) echo "Unkown Wireless_Auth_Mode '${WIRELESS_AUTH_MODE}'." ;; - esac - fi - [[ -n ${WIRELESS_KEY_LENGTH} ]] && iwconfig "${iface}" enc "${WIRELESS_KEY_LENGTH}" - [[ -n ${WIRELESS_KEY} ]] && iwconfig "${iface}" key "${WIRELESS_KEY}" - [[ -n ${WIRELESS_KEY_ASCII} ]] && iwconfig "${iface}" key s:"${WIRELESS_KEY_ASCII}" + unset NAMESERVER fi done + + # setup user routes + config_routes add } networking_stop() { + if [[ -z $1 ]] + then + ALL_INTERFACES=$(onboot_interface_list ${network_settings}/net.*) + else + if [[ -e ${network_settings}/net.$1 ]] + then + ALL_INTERFACES="$1" + else + ${FAILURE} + echo "Interface $1 does not exist. Aborting" + ${NORMAL} + exit 1 + fi + fi + # get list of all devices - for iface in $(onboot_interface_list ${network_settings}/net.*) + for iface in ${ALL_INTERFACES} do source ${network_settings}/net.${iface} || exit 1 checkconfig @@ -229,6 +479,12 @@ ifconfig ${iface} down evaluate_retval + # remove bridges + if [[ ${iface} = br[0-9]* ]] + then + config_bridge_devices ${iface} remove + fi + # shutdown dhcp-daemon if [[ ${NETWORKING} = dhcp ]] && [[ -n $(pidof ${DHCP_PROG}) ]] then @@ -236,21 +492,36 @@ ${CURS_UP} ${SET_WWCOL} echo "[$(basename ${DHCP_PROG})]" - ${DHCP_PROG} ${DHCP_STOP} + ${DHCP_PROG} ${DHCP_STOP} "${iface}" evaluate_retval fi + + # shutdown wpa_supplicant daemon + if [[ -n $(pidof wpa_supplicant) ]] + then + killall wpa_supplicant + fi done + + # remove state dir + if [ -d /var/run/wpa_supplicant ] + then + rm -rf /var/run/wpa_supplicant + fi + + # delete user routes + config_routes del } case $1 in start) - networking_start + networking_start $2 update_svcstatus $1 splash svc_started "$(basename $0)" 0 ;; stop) - networking_stop + networking_stop $2 update_svcstatus $1 splash svc_stopped "$(basename $0)" 0 ;; @@ -262,7 +533,7 @@ ;; *) - echo "Usage: $0 {start|stop|restart}" + echo "Usage: $0 {start|stop|restart} [interface]" exit 1 ;; esac