--- branches/unlabeled-1.1.1/magellan-initscripts/etc/rc.d/init.d/network 2004/12/13 22:52:07 2 +++ trunk/magellan-initscripts/etc/rc.d/init.d/network 2010/07/14 14:51:55 1108 @@ -1,4 +1,5 @@ #!/bin/bash +# $Id$ #%rlevels: 0:k 1:k 2:k 3:s 4:s 5:s 6:k #%start: 20 @@ -9,132 +10,614 @@ #%before: #%after: -source /etc/sysconfig/rc -source $rc_functions +source /etc/conf.d/rc +source ${rc_functions} -checkconfig() { - if [ -z $NETWORKING ] +# 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 + local BRIDGE_AGEING_TIME + local BRIDGE_PRIORITY + local BRIDGE_FORWARD_DELAY + local BRIDGE_HELLO_TIME + local BRIDGE_MAX_MESSAGE_AGE + local BRIDGE_PATH_COST + local BRIDGE_PORT_PRIORITY + + 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 + 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" fi ;; + dhcp) - if [ -z $DHCP_PROG ] + if [[ -z ${DHCP_PROG} ]] then - echo "DHCP_PROG missing in net.${interface}, aborted" - exit 1 + echo -n "DHCP_PROG missing in net.${interface}," + echo "using default programm" + DHCP_PROG="/sbin/dhcpcd" fi + [[ -z ${DHCP_START} ]] && DHCP_START="-t 10" + [[ -z ${DHCP_STOP} ]] && DHCP_STOP="-k" ;; + 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 -case "$1" in - start) - for file in $(grep -il "ONBOOT=\"yes\"" $network_settings/net.*) + 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 + + # use wext as default driver, do not abort here anymore + [[ -z ${WIRELESS_WPA_DRIVER} ]] && WIRELESS_WPA_DRIVER=wext + + # 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_options() +{ + local iface="$1" + local i + local port + local cost + local prio + + # 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 + + # configure ageing time + if [[ ! -z ${BRIDGE_AGEING_TIME} ]] + then + brctl setageing "${iface}" "${BRIDGE_AGEING_TIME}" + fi + + # configure bridge priority + if [[ ! -z ${BRIDGE_PRIORITY} ]] + then + brctl setbridgeprio "${iface}" "${BRIDGE_PRIORITY}" + fi + + # configure forward delay + if [[ ! -z ${BRIDGE_FORWARD_DELAY} ]] + then + brctl setfd "${iface}" "${BRIDGE_FORWARD_DELAY}" + fi + + # configure hello time + if [[ ! -z ${BRIDGE_HELLO_TIME} ]] + then + brctl sethello "${iface}" "${BRIDGE_HELLO_TIME}" + fi + + # configure maximal message age + if [[ ! -z ${BRIDGE_MAX_MESSAGE_AGE} ]] + then + brctl setmaxage "${iface}" "${BRIDGE_MAX_MESSAGE_AGE}" + fi + + # configure path cost for every port + if [[ ! -z ${BRIDGE_PATH_COST} ]] + then + for i in ${BRIDGE_PATH_COST} do - interface=$(basename $file | sed s/net.//) - case "$interface" in - *~) ;; - *) - #$network_devices/ifup $interface - source $network_settings/net.${interface} || exit 1 - checkconfig - case $NETWORKING in - dhcp) - echo -e ${COLOREDSTAR}"Bringing up interface ${COLBLUE}${interface}${COLDEFAULT} ..." - $CURS_UP - $SET_WWCOL - echo "[DHCP]" - #modprobe $interface - loadproc $DHCP_PROG $DHCP_START - ;; - static) - echo -e ${COLOREDSTAR}"Bringing up interface ${COLBLUE}${interface}${COLDEFAULT} ..." - $CURS_UP - $SET_WWCOL - echo "[STATIC]" - ifconfig $interface $IP netmask $NETMASK broadcast $BROADCAST - evaluate_retval - ;; - esac - ;; + port="${i%=*}" + cost="${i#*=}" + [[ ! -z ${port} ]] && brctl pathcost "${iface}" "${port}" "${cost}" + done + fi + + # configure port priority for every port + if [[ ! -z ${BRIDGE_PORT_PRIORITY} ]] + then + for i in ${BRIDGE_PORT_PRIORITY} + do + port="${i%=*}" + prio="${i#*=}" + [[ ! -z ${port} ]] && brctl setportprio "${iface}" "${port}" "${prio}" + done + fi +} + +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 + # configure all other options + config_bridge_options "${iface}" + ;; + + 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 ${rc_network_settings}/net.*) + else + if [[ -e ${rc_network_settings}/net.$1 ]] + then + ALL_INTERFACES="$1" + else + ${FAILURE} + echo "Interface $1 does not exist. Aborting" + ${NORMAL} + exit 1 + fi + fi - if [ "$GATEWAY" != "" ] + # get list of all devices + for iface in ${ALL_INTERFACES} + do + # checkconfig + source ${rc_network_settings}/net.${iface} || exit 1 + checkconfig + + # setup mac + if [[ -n ${FORCE_MAC_TO} ]] then - echo -e ${COLOREDSTAR}"Setting up default gateway ..." - route add default gateway $GATEWAY metric 1 \ - dev $GATEWAY_IF + echo -e ${COLOREDSTAR}"Faking MAC to ${FORCE_MAC_TO} for ${COLBLUE}${iface}${COLDEFAULT} ... " + ifconfig "${iface}" hw ether "${FORCE_MAC_TO}" evaluate_retval fi - update_svcstatus $1 - splash svc_started "$(basename $0)" 0 - ;; + # setup bridges + if [[ ${iface} = br[0-9]* ]] + then + config_bridge_devices "${iface}" add + fi - stop) - if [ "$GATEWAY" != "" ] + # now configure wireless_extensions + [ -x /usr/sbin/iwconfig ] && setup_wireless_extensions "${iface}" + + echo -e ${COLOREDSTAR}"Bringing up interface ${COLBLUE}${iface}${COLDEFAULT} ..." + + # activate the interface + ifconfig "${iface}" up + + # 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 + # add given nameserver + 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 + # include head + if [ -f /etc/resolv.conf.head ] + then + cat /etc/resolv.conf.head >> /etc/resolv.conf + else + echo "# /etc/resolv.conf.head can replace this line" >> /etc/resolv.conf + fi + + for dns in ${NAMESERVER} + do + echo "nameserver ${dns}" >> /etc/resolv.conf + done + + # include tail + if [ -f /etc/resolv.conf.tail ] + then + cat /etc/resolv.conf.tail >> /etc/resolv.conf + else + echo "# /etc/resolv.conf.tail can replace this line" >> /etc/resolv.conf + fi + + unset NAMESERVER + fi + done + + # setup user routes + config_routes add +} + +networking_stop() +{ + if [[ -z $1 ]] + then + ALL_INTERFACES=$(onboot_interface_list ${rc_network_settings}/net.*) + else + if [[ -e ${rc_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 ${rc_network_settings}/net.${iface} || exit 1 + checkconfig + + if [[ -n ${GATEWAY} ]] then echo -e ${COLOREDSTAR}"Removing default gateway ..." route del -net default evaluate_retval fi - for file in $(grep -il "ONBOOT=\"yes\"" $network_settings/net.*) - do - interface=$(basename $file | sed s/net.//) - case "$interface" in - *~) ;; - *) - #$network_devices/ifdown $interface - source $network_settings/net.${interface} || exit 1 - checkconfig - echo -e ${COLOREDSTAR}"Bringing down interface ${COLBLUE}${interface}${COLDEFAULT} ..." - ifconfig eth0 down - evaluate_retval - - #shutdown dhcp-daemon - if [ $NETWORKING == dhcp ] - then - my_runlevel="`runlevel | cut -d ' ' -f2`" - if [ "$my_runlevel" -ne "0" -a "$my_runlevel" -ne "6" ] - then - echo -e ${COLOREDSTAR}"Stopping the dhcp-daemon ..." - $CURS_UP - $SET_WWCOL - echo "[${DHCP_PROG}]" - $DHCP_PROG $DHCP_STOP - evaluate_retval - fi - fi - ;; - esac - done + 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 ;; @@ -146,7 +629,7 @@ ;; *) - echo "Usage: $0 {start|stop|restart}" + echo "Usage: $0 {start|stop|restart} [interface]" exit 1 ;; esac