#!/bin/bash # $Header: /home/cvsd/magellan-cvs/magellan-src/magellan-initscripts/etc/rc.d/init.d/network,v 1.19 2008-12-22 22:01:15 niro Exp $ #%rlevels: 0:k 1:k 2:k 3:s 4:s 5:s 6:k #%start: 20 #%stop: 80 #deps #%needs: #%before: #%after: source /etc/conf.d/rc source ${rc_functions} # read values from files read_value() { local var="$1" local file="$2" local value # local all possible vars # global local ONBOOT local NETWORKING # static local IP local NETMASK local BROADCAST local NETWORKING local FORCE_MAC_TO # dhcp local DHCP_PROG local DHCP_START local DHCP_STOP # default gw local GATEWAY local GATEWAY_IF # wireless extensions local WIRELESS_AP local WIRELESS_AUTH_MODE local WIRELESS_BITRATE local WIRELESS_CHANNEL local WIRELESS_DEFAULT_KEY local WIRELESS_ESSID local WIRELESS_FREQUENCY local WIRELESS_KEY local WIRELESS_KEY_ASCII local WIRELESS_KEY_0 local WIRELESS_KEY_1 local WIRELESS_KEY_2 local WIRELESS_KEY_3 local WIRELESS_KEY_LENGTH local WIRELESS_MODE 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}) echo "${value}" } checkconfig() { if [[ -z ${NETWORKING} ]] then echo "NETWORKING missing in net.${interface}, aborted" exit 1 fi case "${NETWORKING}" in static) if [[ -z ${IP} ]] then echo "IP missing in net.${interface}, aborted" exit 1 fi 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} ]] then echo -n "BROADCAST missing in net.${interface}, " echo "using default address" fi ;; dhcp) if [[ -z ${DHCP_PROG} ]] then echo "DHCP_PROG missing in net.${interface}, aborted" exit 1 fi ;; esac } # onboot_interface_list /path/to/files* onboot_interface_list() { local file local devices local iface # get list of all devices for file in $@ do if [[ $(read_value ONBOOT ${file}) = yes ]] then iface="$(basename ${file} | sed s/net.//)" # exclude backup files and exclude net.routes too case "${iface}" in *~) ;; */net.routes) ;; *) devices="${devices} $(basename ${file} | sed s/net.//)" ;; esac fi done 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} local wpa_proto case ${WIRELESS_AUTH_MODE} in wpa) wpa_proto="WPA" ;; wpa2) wpa_proto="WPA2" ;; esac # setup the network entry sed -i -e "s:@WIRELESS_ESSID@:${WIRELESS_ESSID}:g" \ -e "s:@WIRELESS_KEY@:${WIRELESS_KEY_ASCII}:g" \ -e "s:@WIRELESS_AUTH_MODE@:${wpa_proto}: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|wpa2) 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 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 ${ALL_INTERFACES} do # checkconfig source ${network_settings}/net.${iface} || exit 1 checkconfig # setup mac 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 dhcp|DHCP) ${CURS_UP} ${SET_WWCOL} echo "[DHCP]" loadproc ${DHCP_PROG} ${DHCP_START} "${iface}" ;; static|STATIC) ${CURS_UP} ${SET_WWCOL} echo "[STATIC]" ifconfig "${iface}" "${IP}" netmask "${NETMASK}" broadcast "${BROADCAST}" evaluate_retval ;; esac # setup def gw if [[ -n ${GATEWAY} ]] then 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 if [[ -n ${NAMESERVER} ]] then echo -e ${COLOREDSTAR}"Setting up all nameserver for ${COLBLUE}${iface}${COLDEFAULT} ..." # whipe out the old one echo "# Generated by the magellan-initscripts for ${iface}" > /etc/resolv.conf for dns in ${NAMESERVER} do echo "nameserver ${dns}" >> /etc/resolv.conf done 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 ${ALL_INTERFACES} do source ${network_settings}/net.${iface} || exit 1 checkconfig if [[ -n ${GATEWAY} ]] then echo -e ${COLOREDSTAR}"Removing default gateway ..." route del -net default evaluate_retval fi echo -e ${COLOREDSTAR}"Bringing down interface ${COLBLUE}${iface}${COLDEFAULT} ..." 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 echo -e ${COLOREDSTAR}"Stopping the dhcp-daemon ..." ${CURS_UP} ${SET_WWCOL} echo "[$(basename ${DHCP_PROG})]" ${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 $2 update_svcstatus $1 splash svc_started "$(basename $0)" 0 ;; stop) networking_stop $2 update_svcstatus $1 splash svc_stopped "$(basename $0)" 0 ;; restart) $0 stop sleep 1 $0 start ;; *) echo "Usage: $0 {start|stop|restart} [interface]" exit 1 ;; esac