#!/sbin/runscript
# Copyright (c) 2007-2010 Funtoo Technologies
# All rights reserved. Released under the 2-clause BSD license.
# TODO - generate cached config for /etc/init.d/foo, use them for starting and stopping
# rather than running "live" commands. This way "stop" will work correctly at all times.
# next line: INT = deprecated, support it for backwards compat:
INT=${RC_SVCNAME#netif.}
interface=${interface:-$INT}
[ "$interface" = "tmpl" ] && exit 0
if [ -z "$template" ]; then
eerror "Please specify a template (template=) for $RC_SVCNAME"
exit 1
fi
CYAN="[36;01m"
OFF="[0m"
DESC2="${template}"
[ -n "$description" ] && DESC2="${description}"
STARTD="Network $DESC2 $CYAN$interface$OFF up"
STOPD="Network $DESC2 $CYAN$interface$OFF down"
require() {
local missing=""
for envname in $*; do
[ -z "${!envname}" ] && missing="$missing $envname"
done
if [ -n "$missing" ]; then
echo
eerror "ERROR: Required configuration variable(s) are missing:"
eerror ""
for miss in $missing; do
eerror " ${CYAN}$miss${OFF}"
done
eerror ""
eerror "Please correct your configuration to address this issue."
echo
exit 1
fi
}
die() { eend 1 "$*"; exit 1; }
netif_depend() { return; }
netif_pre_up() { return; }
netif_post_up() { return; }
netif_pre_down() { return; }
netif_post_down() { return; }
depend() {
need localmount
[ "$vlanmode" != "off" ] && need "netif.${trunk}"
[ -n "$slaves" ] && need $slaves
netif_depend
}
start() {
ebegin "$STARTD"
if [ "$macaddr" != "" ]; then
/sbin/nameif ${interface} ${macaddr}
fi
if [ "$vlanmode" != "off" ]; then
if [ ! -d /proc/net/vlan ]; then
modprobe 8021q
if [ ! -d /proc/net/vlan ]; then
eerror "VLAN for interface $interface could not be configured:"
die " \n802.1q support is not present in this kernel."
fi
fi
require trunk vlan
ip link add dev ${interface} link ${trunk} type vlan id ${vlan} || die "Couldn't configure VLAN ${vlan} on ${trunk}"
fi
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< HERE STARTS
ip addr flush dev $interface
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< AND HERE ENDS
netif_pre_up
ip link set $interface up
if [ -n "$mtu" ]; then
ip link set $interface mtu $mtu
if [ -n "$slaves" ]; then
for slave in ${slaves//netif./}; do
ip link set $slave mtu $mtu || eend $?
done
fi
fi
ezroute add; ezresolv add
eend $?
}
stop() {
ebegin "$STOPD"
netif_pre_down
ezresolv del; ezroute del
ip link set $interface down
ip addr flush dev $interface
netif_post_down
# VLANS:
[ "${vlanmode}" != "off" ] && ip link delete ${interface}
eend 0
}
# DOM, IP, NM, SLAVES, MTU, NS1, NS2, GW are deprecated - this is backwards compat. code:
domain=${domain:-$DOM}
if [ -n "$IP" ]; then
ipaddr=$IP/$NM
fi
netmask=${netmask:-$NM}
slaves=${slaves:-$SLAVES}
mtu=${mtu:-$MTU}
nameservers="${nameservers:-$NS1 $NS2}"
gateway=${gateway:-$GW}
# COMPAT END
start_pre() {
if [ -n "$ipaddr $ipaddrs" ]; then
for i in $ipaddr $ipaddrs; do
if [ "${i##*/}" = "$i" ]; then
echo
ewarn "You probably want to add a netmask to the ipaddr $i defined in your configuration."
ewarn "Example: ipaddr=\"192.168.0.1/24\""
echo
fi
done
fi
}
ezdns() {
# This function generates a resolv.conf file, which ezresolv() passes to resolvconf
[ -n "$domain" ] && echo "domain $domain"
for ns in $nameservers; do
echo "nameserver $ns"
done
}
ezresolv() {
# This function calls resolvconf (openresolv) with the correct resolv.conf passed as a here-file
if [ "$1" = "add" ]; then
[ -z "`ezdns`" ] && return
resolvconf -a $interface << EOF || die "Problem adding DNS info for $interface"
`ezdns`
EOF
else
resolvconf -d $interface
fi
}
ezroute() {
if [ -n "$gateway" ]; then
ip route $1 default via $gateway
[ "$1" = "add" ] && [ $? -ne 0 ] && die "Couldn't set route: $*"
fi
}
if [ -z "$trunk" ]; then
# auto-detect trunk/vlan ID from interface name
vlanmode="auto"
vlan="${interface##*.}"
trunk="${interface%.*}"
[ "$vlan" = "$interface" ] && vlanmode="off"
else
# trunk/vlan ID specified by user in config
vlanmode="custom"
require vlan
fi
. /etc/netif.d/$template