#!/bin/bash . /etc/rc.conf . /etc/rc.d/functions for s in wireless bonding bridges dhcpcd; do [[ -f /etc/conf.d/$s ]] && . "/etc/conf.d/$s" done # helper function to determine if legacy network support is needed need_legacy() { # complain when `interface' is unset and `INTERFACES' has profiles enabled if [[ -z $interface && ${INTERFACES[@]##!*} ]]; then return 0 # need legacy fi return 1 # enough present for iproute2 support } deprecated() { print_depr "The legacy network settings format" "rc.conf(5)" } network_up() { if [[ $address ]]; then ip link set dev $interface up || return 1 ip addr add $address/${netmask:-24} broadcast ${broadcast:-+} dev $interface || return 1 [[ $gateway ]] && { ip route add default via $gateway || return 1; } else dhcpcd $DHCPCD_ARGS $interface || return 1 fi } network_down() { if [[ ! -n $interface ]]; then if [[ -f /run/dhcpcd.pid ]]; then dhcpcd -qk || return 1 fi else if [[ ! -n $address && -f /run/dhcpcd-$interface.pid ]]; then dhcpcd -qk $interface || return 1 else ip addr flush dev $interface || return 1 fi ip link set dev $interface down || return 1 fi } ifup() { local ifcfg=${!1} if [[ ! $1 ]]; then echo "usage: $0 ifup " return 1 fi # Get the name of the interface from the first token in the string if [[ $ifcfg = dhcp ]]; then ifname=$1 else ifname=${ifcfg%% *} fi ifconfig $ifname up wi_up $1 || return 1 if [[ $ifcfg = dhcp ]]; then # remove the .pid file if it exists rm -f /run/dhcpcd-${1}.pid >/dev/null 2>&1 rm -f /run/dhcpcd-${1}.cache >/dev/null 2>&1 dhcpcd $DHCPCD_ARGS ${1} else ifconfig $ifcfg fi } wi_up() { local iwcfg=wlan_$1 [[ ${!iwcfg} ]] || return 0 iwconfig ${!iwcfg} [[ $WIRELESS_TIMEOUT ]] || WIRELESS_TIMEOUT=2 sleep $WIRELESS_TIMEOUT bssid=$(iwgetid $1 -ra) if [[ $bssid = 00:00:00:00:00:00 ]]; then printhl "Could not associate $1 - try increasing WIRELESS_TIMEOUT and check network is WEP or has no security" return 1 fi return 0 } ifdown() { local ifcfg=${!1} if [[ ! $1 ]]; then echo "usage: $0 ifdown " return 1 fi if [[ $ifcfg = dhcp && -f /run/dhcpcd-${1}.pid ]]; then dhcpcd -k ${1} >/dev/null 2>&1 fi # Always bring the interface itself down ifconfig ${1} down >/dev/null 2>&1 } iflist() { for ifline in ${INTERFACES[@]}; do if [[ $ifline = ${ifline#!} ]]; then printf " $ifline:\t" else printf "$ifline:\t" fi echo ${!ifline#!} done } rtup() { local routecfg=${!1} if [[ ! $1 ]]; then echo "usage: $0 rtup " return 1 fi if [[ $routecfg =~ :: ]]; then route -A inet6 add $routecfg else route add $routecfg fi } rtdown() { local routecfg=${!1} if [[ ! $1 ]]; then echo "usage: $0 rtdown " return 1 fi if [[ $routecfg =~ :: ]]; then route -A inet6 del $routecfg else route del $routecfg fi } rtlist() { for rtline in ${ROUTES[@]}; do if [[ $rtline = ${rtline#!} ]]; then printf " $rtline:\t" else printf "$rtline:\t" fi echo ${!rtline#!} done } bond_up() { for ifline in ${BOND_INTERFACES[@]}; do if [[ $ifline = ${ifline#!} ]]; then bondcfg="bond_$ifline" if [[ ${!bondcfg} ]]; then ifenslave $ifline ${!bondcfg} || error=1 fi fi done } bond_down() { for ifline in ${BOND_INTERFACES[@]}; do if [[ $ifline = ${ifline#!} ]]; then bondcfg="bond_$ifline" ifenslave -d $ifline ${!bondcfg} || error=1 fi done } bridge_up() { for br in ${BRIDGE_INTERFACES[@]}; do if [[ $br = ${br#!} ]]; then # if the bridge already exists, remove it if [[ $(ifconfig $br 2>/dev/null) ]]; then ifconfig $br down brctl delbr $br fi brctl addbr $br brifs="bridge_$br" for brif in ${!brifs}; do if [[ $brif = ${brif#!} ]]; then for ifline in ${BOND_INTERFACES[@]}; do if [[ $brif = $ifline && $ifline = ${ifline#!} ]]; then ifup $ifline bondcfg="bond_$ifline" ifenslave $ifline ${!bondcfg} || error=1 unset bond_$ifline fi done brctl addif $br $brif || error=1 fi done fi done } bridge_down() { for br in ${BRIDGE_INTERFACES[@]}; do if [[ $br = ${br#!} ]]; then brctl delbr $br fi done } case "$1" in start) # deprecation check need_legacy && deprecated if ! ck_daemon network; then echo "Network is already running. Try 'rc.d restart network'" exit fi stat_busy "Starting network" error=0 if need_legacy; then # bring up bridge interfaces bridge_up # bring up Ethernet interfaces for ifline in ${INTERFACES[@]}; do if [[ $ifline = ${ifline#!} ]]; then ifup $ifline || error=1 fi done # bring up bond interfaces bond_up # bring up routes for rtline in "${ROUTES[@]}"; do if [ "$rtline" = "${rtline#!}" ]; then rtup $rtline || error=1 fi done else network_up fi if (( ! error )); then add_daemon network stat_done else stat_fail fi ;; stop) # deprecation check need_legacy && deprecated if [[ $NETWORK_PERSIST =~ yes|YES && $RUNLEVEL == [06] ]]; then status "Skipping network shutdown" true exit 0 fi stat_busy "Stopping network" rm_daemon network error=0 if need_legacy; then for rtline in "${ROUTES[@]}"; do if [[ $rtline = ${rtline#!} ]]; then rtdown $rtline || error=1 fi done # bring down bond interfaces bond_down for ifline in ${INTERFACES[@]}; do if [[ $ifline = ${ifline#!} ]]; then ifdown $ifline || error=1 fi done # bring down bridge interfaces bridge_down else network_down fi if (( ! error )); then stat_done else stat_fail fi ;; restart) $0 stop sleep 2 $0 start ;; ifup|ifdown|iflist|rtup|rtdown|rtlist) # deprecation check deprecated $1 $2 ;; *) echo "usage: $0 {start|stop|restart}" echo " $0 {ifup|ifdown|iflist|rtup|rtdown|rtlist}";; esac # vim: set ts=2 sw=2 noet: