#!/bin/bash # $Id$ #%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} source /etc/conf.d/network # 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 rc_echo "NETWORKING missing in net.${iface}, aborted" exit 1 fi case "${NETWORKING}" in static) if [[ -z ${IP} ]] then rc_echo "IP missing in net.${iface}, aborted" exit 1 fi if [[ -z ${NETMASK} ]] then rc_echo -n "NETMASK missing in net.${iface}, " rc_echo "using ${DEFAULT_NETMASK}" NETMASK="${DEFAULT_NETMASK}" fi if [[ -z ${BROADCAST} ]] then rc_echo -n "BROADCAST missing in net.${iface}, " rc_echo "using default address" fi ;; dhcp) if [[ -z ${DHCP_PROG} ]] then rc_echo -n "DHCP_PROG missing in net.${iface}," rc_echo "using default programm ${DEFAULT_DHCP_PROG}" DHCP_PROG="${DEFAULT_DHCP_PROG}" fi [[ -z ${DHCP_START} ]] && DHCP_START="${DEFAULT_DHCP_START}" [[ -z ${DHCP_STOP} ]] && DHCP_STOP="${DEFAULT_DHCP_STOP}" ;; 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 iface="$(basename ${file} | sed s/net.//)" # exclude backup files and exclude net.routes and net.sample too case "${iface}" in *~) continue ;; routes) continue ;; sample) continue ;; esac if [[ $(read_value ONBOOT ${file}) = yes ]] then devices="${devices} ${iface}" fi done echo "${devices}" } config_wireless_wep() { local iface="$1" if [[ -z ${iface} ]] then rc_echo "WEP: no \$iface given. Aborting setup." return 1 fi ${CURS_UP} ${SET_WWCOL} rc_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 rc_echo "WPA: no \$iface given. Aborting setup." return 1 fi if [ ! -x $(type -P wpa_supplicant) ] then rc_echo "WPA: wpa_supplicant not installed. Aborting setup." return 1 fi ${CURS_UP} ${SET_WWCOL} rc_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/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 /run/wpa_supplicant ] && rm -rf /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 rc_echo " Waiting 5 seconds to retrieve authentification reply ... " sleep 5 } setup_wireless_extensions() { local iface="$1" if [[ -z ${iface} ]] then rc_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 rc_print "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}" ;; *) rc_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 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 rc_echo "BRIDGE: no \$iface given. Aborting setup." return 1 fi if [[ -z ${method} ]] then rc_echo "BRIDGE: no \$method given. Aborting setup." return 1 fi # first check for brctl if [[ -z $(type -P brctl) ]] then rc_echo "brctl not found! Please install 'net-misc/bridge-utils'." return 1 fi # check the config if [[ -z ${BRIDGE_INTERFACES} ]] then rc_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" ;; del) message="Removing" ;; *) rc_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 rc_print "${message} route ${COLBLUE}${route}${COLDEFAULT} ..." # do not esacpe ${route} or it breaks! 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} rc_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 ${rc_network_settings}/net.${iface} || exit 1 checkconfig # setup mac if [[ -n ${FORCE_MAC_TO} ]] then rc_print "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 # now configure wireless_extensions [ -x $(type -P iwconfig) ] && setup_wireless_extensions "${iface}" rc_print "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} rc_echo "[DHCP]" loadproc ${DHCP_PROG} ${DHCP_START} "${iface}" ;; static|STATIC) ${CURS_UP} ${SET_WWCOL} rc_echo "[STATIC]" ifconfig "${iface}" "${IP}" netmask "${NETMASK}" broadcast "${BROADCAST}" evaluate_retval ;; esac # setup def gw if [[ -n ${GATEWAY} ]] then rc_print "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 rc_print "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} rc_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 rc_print "Removing default gateway ..." route del -net default evaluate_retval fi rc_print "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 $(basename ${DHCP_PROG})) ]] then rc_print "Stopping the dhcp-daemon ..." ${CURS_UP} ${SET_WWCOL} rc_echo "[$(basename ${DHCP_PROG})]" if [[ -z ${DHCP_STOP} ]] then killproc ${DHCP_PROG} evaluate_retval else ${DHCP_PROG} ${DHCP_STOP} "${iface}" evaluate_retval fi fi # shutdown wpa_supplicant daemon if [[ -n $(pidof wpa_supplicant) ]] then killall wpa_supplicant fi done # remove state dir if [ -d /run/wpa_supplicant ] then rm -rf /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 ;; *) rc_echo "Usage: $0 {start|stop|restart} [interface]" exit 1 ;; esac