From 63ee3db06be3f43ca63873e75f28cd2223bcfa32 Mon Sep 17 00:00:00 2001 From: Darren 'Tadgy' Austin Date: Mon, 11 Nov 2019 02:25:51 +0000 Subject: VLAN support. Sync logging/IPv6 changes from tadgy-ipv6-fixes branch. rc.inet1: * VLAN support added to rc.inet1{,.conf}. * Created new info_log function to replace $LOGGING variable. * When logging to syslog, use a tag of 'rc.inet1' with PID. * Decrease script noisyness at non-debug levels. * Add more debugging logging for testing. * Use -4 when configuring IPv4 loopback address. * Configure ::1 for IPv6 loopbacking. * Use 'local' not 'declare' in functions. * Move where DAD is disabled when setting IPv6 addresses. * Add error checking to some calls to 'ip'. * Walk backwards through interfaces when deconfiguring. rc.wireless: * Log to syslog, failling back to stdout. * Output error to stderr if not called from rc.inet1. Manpages and netconfig: * Updated for new VLAN support. --- rc.inet1 | 194 ++++++++++++++++++++++++++++++++++++++---------------------- rc.wireless | 11 +++- 2 files changed, 132 insertions(+), 73 deletions(-) diff --git a/rc.inet1 b/rc.inet1 index 2b95bac..19697bc 100644 --- a/rc.inet1 +++ b/rc.inet1 @@ -15,17 +15,20 @@ # LOGGING # ########### -# If possible, log events in /var/log/messages: -if [ -f /var/run/syslogd.pid ] && [ -x /usr/bin/logger ]; then - LOGGER=/usr/bin/logger -else # output to stdout/stderr: - LOGGER=/bin/cat -fi +# Message logging. +info_log() { + # If possible, log events in /var/log/messages: + if [ -f /var/run/syslogd.pid ] && [ -x /usr/bin/logger ]; then + /usr/bin/logger -t "rc.inet1" --id="$$" "$*" + else + printf "%s: %s\\n" "rc.inet1" "$*" + fi +} -# Handy wrapper for verbose logging +# Verbose logging. debug_log() { if [ "$DEBUG_ETH_UP" = "yes" ]; then - echo "/etc/rc.d/rc.inet1: $*" | $LOGGER + info_log "$*" fi } @@ -46,7 +49,7 @@ do IFNAME[$i]=${IFNAME[$i]:=eth${i}} i=$(($i+1)) done -debug_log "List of interfaces: '${IFNAME[*]}'" +debug_log "List of interfaces: ${IFNAME[@]}" #################### # PRE-LOAD MODULES # @@ -55,10 +58,10 @@ debug_log "List of interfaces: '${IFNAME[*]}'" for i in "${IFNAME[@]}"; do # If the interface isn't in the kernel yet (but there's an alias for it in modules.conf), # then it should be loaded first: - if [ ! -e /sys/class/net/${i%%:*} ]; then # no interface yet - if /sbin/modprobe -c | grep -v "^#" | grep -w "alias ${i%%:*}" | grep -vw "alias ${i%%:*} off" >/dev/null; then - echo "/etc/rc.d/rc.inet1: /sbin/modprobe ${i%%:*}" | $LOGGER - /sbin/modprobe ${i%%:*} + if [ ! -e /sys/class/net/${i%%[:.]*} ]; then # no interface yet + if /sbin/modprobe -c | grep -v "^#" | grep -w "alias ${i%%[:.]*}" | grep -vw "alias ${i%%[:.]*} off" >/dev/null; then + debug_log "/sbin/modprobe ${i%%[:.]*}" + /sbin/modprobe ${i%%[:.]*} _DID_MODPROBE=1 fi fi @@ -67,6 +70,7 @@ done # interface (assuming ipv6 has not been disabled entirely), but autoconf/accept_ra need to be # set to 0 before that happens, so try to pre-load ipv6 here. if [ ! -e /proc/sys/net/ipv6 ]; then + debug_log "/sbin/modprobe ipv6" /sbin/modprobe ipv6 _DID_MODPROBE=1 fi @@ -84,10 +88,16 @@ unset _DID_MODPROBE lo_up() { if [ -e /sys/class/net/lo ]; then if ! /sbin/ip link show dev lo | grep -wq -e "state UP" -e "state UNKNOWN" ; then - echo "/etc/rc.d/rc.inet1: /sbin/ip address add 127.0.0.1/8 dev lo" | $LOGGER - /sbin/ip address add 127.0.0.1/8 dev lo + info_log "lo: configuring interface" + debug_log "/sbin/ip -4 address add 127.0.0.1/8 dev lo" + /sbin/ip -4 address add 127.0.0.1/8 dev lo + if [ -e /proc/sys/net/ipv6 ]; then + debug_log "/sbin/ip -6 address add ::1/128 dev lo" + /sbin/ip -6 address add ::1/128 dev lo + fi + debug_log "/sbin/ip link set dev lo up" /sbin/ip link set dev lo up - echo "/etc/rc.d/rc.inet1: /sbin/ip route add 127.0.0.0/8 dev lo" | $LOGGER + debug_log "/sbin/ip route add 127.0.0.0/8 dev lo" /sbin/ip route add 127.0.0.0/8 dev lo fi fi @@ -96,9 +106,8 @@ lo_up() { # Function to take down the loopback interface: lo_down() { if [ -e /sys/class/net/lo ]; then - echo "/etc/rc.d/rc.inet1: /sbin/ip address flush dev lo" | $LOGGER + info_log "lo: de-configuring interface" /sbin/ip address flush dev lo - echo "/etc/rc.d/rc.inet1: /sbin/ip link set dev lo down" | $LOGGER /sbin/ip link set dev lo down fi } @@ -113,6 +122,8 @@ virtif_create() { # this loop goes from i=0 to i=number_of_configured_virtual_interfaces_minus_one # which means it doesn't do anything if there are none. for i in $(seq 0 $((${#VIRTIFNAME[@]} - 1))); do + info_log "${VIRTIFNAME[$i]}: creating virtual interface" + debug_log "/sbin/ip tuntap add dev ${VIRTIFNAME[$i]} mode ${VIRTIFTYPE[$i]} user ${VIRTIFUSER[$i]} group ${VIRTIFGROUP[$i]}" /sbin/ip tuntap add dev ${VIRTIFNAME[$i]} mode ${VIRTIFTYPE[$i]} user ${VIRTIFUSER[$i]} group ${VIRTIFGROUP[$i]} done } @@ -121,6 +132,8 @@ virtif_create() { virtif_destroy() { # argument is 'i' - the position of this interface in the VIRTIFNAME array. for i in $(seq 0 $((${#VIRTIFNAME[@]} - 1))); do + info_log "${VIRTIFNAME[$i]}: destroying virtual interface" + debug_log "/sbin/ip tuntap del dev ${VIRTIFNAME[$i]} mode ${VIRTIFTYPE[$i]}" /sbin/ip tuntap del dev ${VIRTIFNAME[$i]} mode ${VIRTIFTYPE[$i]} done } @@ -128,26 +141,37 @@ virtif_destroy() { # Function to assemble a bridge interface. br_open() { # argument is 'i' - the position of this interface in the IFNAME array. + info_log "${IFNAME[$1]}: creating bridge" + debug_log "/sbin/ip link add name ${IFNAME[$1]} type bridge" /sbin/ip link add name ${IFNAME[$1]} type bridge for BRIF in ${BRNICS[$1]}; do + debug_log "/sbin/ip link set dev $BRIF down" /sbin/ip link set dev $BRIF down + debug_log "/sbin/ip address add 0.0.0.0 dev $BRIF" /sbin/ip address add 0.0.0.0 dev $BRIF + debug_log "/sbin/ip link set dev $BRIF master ${IFNAME[$1]}" /sbin/ip link set dev $BRIF master ${IFNAME[$1]} + debug_log "/sbin/ip link set dev $BRIF up" /sbin/ip link set dev $BRIF up done + debug_log "/sbin/ip link set dev ${IFNAME[$1]} up" /sbin/ip link set dev ${IFNAME[$1]} up } # Function to disassemble a bridge interface. br_close() { - /sbin/ip link set dev ${IFNAME[$1]} down # argument is 'i' - the position of this interface in the IFNAME array. - #for BRIF in ${BRNICS[$1]}; do + info_log "${IFNAME[$1]}: destroying bridge" + debug_log "/sbin/ip link set dev ${IFNAME[$1]} down" + /sbin/ip link set dev ${IFNAME[$1]} down for BRIF in $(ls --indicator-style=none /sys/class/net/${IFNAME[$1]}/brif/) do + debug_log "/sbin/ip link set dev $BRIF nomaster" /sbin/ip link set dev $BRIF nomaster done + debug_log "/sbin/ip link set dev ${IFNAME[$1]} down" /sbin/ip link set dev ${IFNAME[$1]} down + debug_log "/sbin/ip link del ${IFNAME[$1]}" /sbin/ip link del ${IFNAME[$1]} } @@ -166,47 +190,54 @@ if_up() { # there are more interfaces configured than MAXNICS. Let's err on the # side of caution and do nothing instead of possibly doing the wrong thing. if [ $i -ge $MAXNICS ]; then - echo "/etc/rc.d/rc.inet1: skipping ${1}, you might need to increase MAXNICS" | $LOGGER + info_log "${1}: skipping - you might need to increase MAXNICS" return fi - # If the interface is a bridge, then create it first: + # If the interface is a bridge, then create it first. + # If you need to set hardware addresses for the underlying interfaces, + # configure the interfaces with IPs of 0.0.0.0 and set the MAC address + # in the usual way. Then, finally, define the bridge. [ -n "${BRNICS[$i]}" ] && br_open $i # Skip unconfigured interfaces: if [ -z "${IPADDR[$i]}" ] && [ "${USE_DHCP[$i]}" != "yes" ] && [ -z "${IP6ADDRS[$i]}" ] && \ [ "${USE_DHCP6[$i]}" != "yes" ] && [ "${USE_SLAAC[$i]}" != "yes" ]; then - debug_log "skipping ${1} early, interface is not configured in /etc/rc.d/rc.inet1.conf" + debug_log "${1}: skipping IP configuration - not configured in /etc/rc.d/rc.inet1.conf" return fi - if [ -e /sys/class/net/${1%%:*} ] || [ -e /sys/class/net/${1%%.*} ]; then # interface exists + info_log "${1}: configuring interface" + if [ -e /sys/class/net/${1%%[:.]*} ]; then # interface exists if ! /sbin/ip address show scope global dev ${1} 2>/dev/null | grep -Ewq '(inet|inet6)' || \ ! /sbin/ip link show dev ${1} | grep -wq "state UP"; then # interface not up or not configured local IF_UP=0 # Handle VLAN interfaces before trying to configure IP addresses. - if echo "${IFNAME[$i]}" | grep -Fq .; then - iface="${IFNAME[$i]%.*}" - vlan="${IFNAME[$i]#*.}" + if echo "${1}" | grep -Fq .; then + iface="${1%.*}" + vlan="${1#*.}" # Check if the underlying interface is already up. if ! /sbin/ip link show dev ${iface} 2>/dev/null| grep -wq "state UP"; then # Bring up the underlying interface. - echo "/etc/rc.d/rc.inet1: /sbin/ip link set dev ${iface} up" | $LOGGER + debug_log "/sbin/ip link set dev ${iface} up" if ! /sbin/ip link set dev ${iface} up; then - echo "/etc/rc.d/rc.inet1: failed to bring up ${iface} for ${1}" | $LOGGER + info_log "${1}: failed to bring up interface ${iface}" return fi IF_UP=1 fi # Configure the VLAN interface. - echo "/etc/rc.d/rc.inet1: /sbin/ip link add link ${iface} name ${1} type vlan id ${vlan}" | $LOGGER + info_log "${1}: creating VLAN interface" + debug_log "/sbin/ip link add link ${iface} name ${1} type vlan id ${vlan}" if ! /sbin/ip link add link ${iface} name ${1} type vlan id ${vlan}; then - echo "/etc/rc.d/rc.inet1: failed to bring up VLAN interface ${1}" | $LOGGER + info_log "${1}: failed to create VLAN interface" ((IF_UP == 1)) && /sbin/ip link set dev ${iface} down return fi fi # Set hardware address: if [ -n "${HWADDR[$i]}" ]; then - echo "/etc/rc.d/rc.inet1: /sbin/ip link set dev ${1} address ${HWADDR[$i]}" | $LOGGER - /sbin/ip link set dev ${1} address ${HWADDR[$i]} + debug_log "/sbin/ip link set dev ${1} address ${HWADDR[$i]}" + if ! /sbin/ip link set dev ${1} address ${HWADDR[$i]} 2>/dev/null; then + info_log "${1}: failed to set hardware address" + fi fi # Initialize any wireless parameters: if [ -x /etc/rc.d/rc.wireless ]; then @@ -214,20 +245,24 @@ if_up() { fi if [ -e /proc/sys/net/ipv6 ]; then # ipv6 networking is available # Disable v6 IP auto configuration before trying to bring up the interface: + debug_log "${1}: disabling IPv6 autoconf" echo "0" >/proc/sys/net/ipv6/conf/$1/autoconf if [ "${USE_RA[$i]}" = "yes" ]; then # Unconditionally accept router advertisements on this interface: + debug_log "${1}: accepting IPv6 RA" echo "1" >/proc/sys/net/ipv6/conf/$1/accept_ra else # Disable router advertisments on this interface until SLAAC is enabled: + debug_log "${1}: ignoring IPv6 RA" echo "0" >/proc/sys/net/ipv6/conf/$1/accept_ra fi fi IF_UP=0 # Slackware historically favours dynamic configuration over fixed IP to configure interfaces, so keep that tradition: if [ "${USE_DHCP[$i]}" = "yes" ] || { [ -e /proc/sys/net/ipv6 ] && [ "${USE_DHCP6[$i]}" = "yes" ]; }; then # use dhcpcd + info_log "${1}: starting dhcpcd" # Declare DHCP_OPTIONS array before adding new options to it: - declare -a DHCP_OPTIONS=() + local -a DHCP_OPTIONS=() # Set DHCP_OPTIONS for this interface: if [ -e /proc/sys/net/ipv6 ]; then if [ "${USE_DHCP[$i]}" = "yes" ] && [ "${USE_DHCP6[$i]}" != "yes" ]; then # only try v4 dhcp @@ -250,31 +285,34 @@ if_up() { [ -n "${DHCP_IPADDR[$i]}" ] && DHCP_OPTIONS+=("-r" "${DHCP_IPADDR[$i]}") echo "${1}: polling for DHCP server" # 15 seconds should be a reasonable default DHCP timeout. 30 was too much. - echo "/etc/rc.d/rc.inet1: /sbin/dhcpcd -t ${DHCP_TIMEOUT[$i]:-15} ${DHCP_OPTIONS[@]} ${1}" | $LOGGER + debug_log "/sbin/dhcpcd -t ${DHCP_TIMEOUT[$i]:-15} ${DHCP_OPTIONS[@]} ${1}" if /sbin/dhcpcd -t "${DHCP_TIMEOUT[$i]:-15}" "${DHCP_OPTIONS[@]}" ${1}; then # Enable accepting of RA packets if explicitly told to: if [ -e /proc/sys/net/ipv6 ] && [ "${USE_RA[$i]}" = "yes" ]; then + debug_log "${1}: unconditionally accepting IPv6 RA" echo "1" >/proc/sys/net/ipv6/conf/$1/accept_ra fi IF_UP=1 else - echo "/etc/rc.d/rc.inet1: failed to obtain DHCP lease for ${1}" | $LOGGER + info_log "${1}: failed to obtain DHCP lease" /sbin/ip address flush dev ${1} /sbin/ip link set dev ${1} down fi fi if [ -e /proc/sys/net/ipv6 ] && [ "${USE_DHCP6[$i]}" != "yes" ] && [ "${USE_SLAAC[$i]}" = "yes" ]; then # configure via SLAAC + info_log "${1}: enabling SLAAC" # Enable accepting of RA packets, unless explicitly configured not to: if [ "${USE_RA[$i]}" = "no" ]; then + debug_log "${1}: ignoring IPv6 RA" echo "0" >/proc/sys/net/ipv6/conf/$1/accept_ra else - echo "/etc/rc.d/rc.inet1: enabling RA for ${1}" | $LOGGER + debug_log "${1}: accepting IPv6 RA" echo "1" >/proc/sys/net/ipv6/conf/$1/accept_ra fi # Enable auto configuration of interfaces: - echo "/etc/rc.d/rc.inet1: enabling SLAAC for ${1}" | $LOGGER echo "1" >/proc/sys/net/ipv6/conf/$1/autoconf # Bring the interface up: + debug_log "/sbin/ip link set dev ${1} up" /sbin/ip link set dev ${1} up echo "${1}: waiting for router announcement" for ((j = ${SLAAC_TIMEOUT[$i]:=15} * 2; j--;)); do # by default, wait a max of 15 seconds for the interface to configure @@ -283,93 +321,103 @@ if_up() { done if (($IF_UP != 1)); then echo "${1}: timed out" - echo "/etc/rc.d/rc.inet1: failed to auto configure ${1} after ${SLAAC_TIMEOUT[$i]} seconds" | $LOGGER + info_log "${1}: failed to auto configure after ${SLAAC_TIMEOUT[$i]} seconds" /sbin/ip address flush dev ${1} /sbin/ip link set dev ${1} down fi fi if [ "${USE_DHCP[$i]}" != "yes" ] && [ -n "${IPADDR[$i]}" ]; then # add a fixed v4 IP to the interface + info_log "${1}: setting fixed IPv4 address" if [ -z "${NETMASK[$i]}" ]; then - echo "/etc/rc.d/rc.inet1: no NETMASK set for ${1} - assuming 24 (aka, 255.255.255.0)" | $LOGGER + info_log "${1}: no NETMASK set for IP ${IPADDR[$i]} - assuming 24 (aka, 255.255.255.0)" NETMASK[$i]="24" fi - echo "/etc/rc.d/rc.inet1: /sbin/ip -4 address add ${IPADDR[$i]}/${NETMASK[$i]#/} broadcast + dev ${1}" | $LOGGER + debug_log "/sbin/ip -4 address add ${IPADDR[$i]}/${NETMASK[$i]#/} broadcast + dev ${1}" if /sbin/ip -4 address add ${IPADDR[$i]}/${NETMASK[$i]#/} broadcast + dev ${1} && \ /sbin/ip link set dev ${1} up; then IF_UP=1 else - echo "/etc/rc.d/rc.inet1: failed to set IP ${IPADDR[$i]} for ${1}" | $LOGGER + info_log "${1}: failed to set IP ${IPADDR[$i]}" /sbin/ip address flush dev ${1} /sbin/ip link set dev ${1} down fi fi if [ -e /proc/sys/net/ipv6 ] && [ "${USE_DHCP6[$i]}" != "yes" ] && [ "${USE_SLAAC[$i]}" != "yes" ] && \ [ -n "${IP6ADDRS[$i]}" ]; then # add fixed v6 IPs + info_log "${1}: setting fixed IPv6 addresses" # IPv6's Duplicate Address Detection (DAD) causes a race condition when bringing up interfaces, as # described here: https://www.agwa.name/blog/post/beware_the_ipv6_dad_race_condition # Disable DAD while bringing up the interface - but note that this means the loss of detection of a # duplicate address. It's a trade off, unfortunately. + debug_log "${1}: disabling IPv6 DAD" echo "0" >/proc/sys/net/ipv6/conf/$1/accept_dad for v6ip in ${IP6ADDRS[$i]}; do ip="${v6ip%/*}" prefix="${v6ip#*/}" if [ -z "$prefix" ] || [ "$ip" == "$prefix" ]; then - echo "/etc/rc.d/rc.inet1: no prefix length set for ${ip} - assuming 64" | $LOGGER + info_log "${1}: no prefix length set for IP ${ip} - assuming 64" prefix="64" fi - echo "/etc/rc.d/rc.inet1: /sbin/ip -6 address add ${ip}/${prefix} dev ${1}" | $LOGGER + debug_log "/sbin/ip -6 address add ${ip}/${prefix} dev ${1}" if /sbin/ip -6 address add ${ip}/${prefix} dev ${1} && \ /sbin/ip link set dev ${1} up; then # Enable accepting of RA packets if explicitly told to. if [ "${USE_RA[$i]}" = "yes" ]; then + debug_log "${1}: unconditionally accepting IPv6 RA" echo "1" >/proc/sys/net/ipv6/conf/$1/accept_ra fi IF_UP=1 else - echo "/etc/rc.d/rc.inet1: failed to set IP ${ip} for ${1}" | $LOGGER + info_log "${1}: failed to set IP ${ip}" if (($IF_UP != 1)); then # a v4 address was configured, don't flush it /sbin/ip address flush dev ${1} /sbin/ip link set dev ${1} down fi fi done + # Reset accept_dad back to default now all the IPs are configured: + debug_log "${1}: resetting IPv6 DAD to default" + cat /proc/sys/net/ipv6/conf/default/accept_dad >/proc/sys/net/ipv6/conf/$1/accept_dad fi if (($IF_UP == 1)); then # only do further config if the interface came up - # Add extra IPv4 and v6 addresses to the interface: + info_log "${1}: setting fixed IPv4 alias addresses" + # Add extra IPv4 addresses to the interface: if [ -n "${IPALIASES[$i]}" ]; then num=0 for ipalias in ${IPALIASES[$i]}; do ip="${ipalias%/*}" nm="${ipalias#*/}" [ -z "$nm" ] || [ "$ip" == "$nm" ] && nm="24" - echo "/etc/rc.d/rc.inet1: /sbin/ip -4 address add ${ip}/${nm} broadcast + dev ${1} label ${1}:${num}" | $LOGGER + debug_log "/sbin/ip -4 address add ${ip}/${nm} broadcast + dev ${1} label ${1}:${num}" if /sbin/ip -4 address add ${ip}/${nm} broadcast + dev ${1} label ${1}:${num}; then num=$(($num + 1)) else - echo "/etc/rc.d/rc.inet1: failed to add IP ${ip} to ${1}" | $LOGGER + info_log "${1}: failed to add alias IP ${ip}" fi done fi # Force an MTU (possibly over-riding that set by DHCP or RA): if [ -n "${MTU[$i]}" ]; then - echo "/etc/rc.d/rc.inet1: /sbin/ip link set dev ${1} mtu ${MTU[$i]}" | $LOGGER - /sbin/ip link set dev ${1} mtu ${MTU[$i]} + info_log "${1}: setting custom MTU" + debug_log "/sbin/ip link set dev ${1} mtu ${MTU[$i]}" + if ! /sbin/ip link set dev ${1} mtu ${MTU[$i]}; then + info_log "${1}: failed to set MTU" + fi fi # Set promiscuous mode on the interface: if [ "${PROMISCUOUS[$i]}" = "yes" ]; then - echo "/etc/rc.d/rc.inet1: /sbin/ip link set dev ${1} promisc on" | $LOGGER - /sbin/ip link set dev ${1} promisc on - fi - # Reset accept_dad back to default now all the IPs are configured: - if [ -e /proc/sys/net/ipv6 ]; then - cat /proc/sys/net/ipv6/conf/default/accept_dad >/proc/sys/net/ipv6/conf/$1/accept_dad + info_log "${1}: setting promiscuous mode" + debug_log "/sbin/ip link set dev ${1} promisc on" + if ! /sbin/ip link set dev ${1} promisc on; then + info_log "${1}: failed to set promiscuous mode" + fi fi fi else - debug_log "${1} is already up, skipping" + debug_log "${1}: skipping configuration - already up" fi else - debug_log "${1} interface does not exist (yet)" + debug_log "${1}: skipping configuration - does not exist (yet)" fi } @@ -382,41 +430,45 @@ if_down() { i=$(($i+1)) done if [ $i -ge $MAXNICS ]; then - echo "/etc/rc.d/rc.inet1: skipping ${1}, you might need to increase MAXNICS" | $LOGGER + info_log "${1}: skipping - you might need to increase MAXNICS" return fi - if [ -e /sys/class/net/${1%%:*} ]; then + info_log "${1}: de-configuring interface" + if [ -e /sys/class/net/${i%%[:.]*} ]; then if [ "${USE_DHCP[$i]}" = "yes" ] || [ "${USE_DHCP6[$i]}" = "yes" ]; then # take down dhcpcd + info_log "${1}: stopping dhcpcd" # When using -k, dhcpcd requires some command line options to match those used to invoke it: if [ "${USE_DHCP[$i]}" = "yes" ] && [ "${USE_DHCP6[$i]}" != "yes" ]; then # only v4 dhcp DHCP_OPTIONS="-4" elif [ "${USE_DHCP[$i]}" != "yes" ] && [ "${USE_DHCP6[$i]}" = "yes" ]; then # only v6 dhcp DHCP_OPTIONS="-6" fi - echo "/etc/rc.d/rc.inet1: /sbin/dhcpcd $DHCP_OPTIONS -k -d ${1}" | $LOGGER - /sbin/dhcpcd $DHCP_OPTIONS -k -d ${1} 2>/dev/null || \ - echo "/etc/rc.d/rc.inet1: failed to stop dhcpcd for interface ${1}" | $LOGGER + debug_log "/sbin/dhcpcd $DHCP_OPTIONS -k -d ${1}" + /sbin/dhcpcd $DHCP_OPTIONS -k -d ${1} 2>/dev/null || info_log "${1}: failed to stop dhcpcd" fi # Disable v6 IP auto configuration and RA before trying to clear the IP from the interface: if [ -e /proc/sys/net/ipv6 ]; then + debug_log "${1}: disabling IPv6 autoconf and RA" echo "0" >/proc/sys/net/ipv6/conf/$1/autoconf echo "0" >/proc/sys/net/ipv6/conf/$1/accept_ra fi sleep 0.5 # allow time for DHCP/RA to unconfigure the interface # Flush any remaining IPs: - echo "/etc/rc.d/rc.inet1: /sbin/ip address flush dev ${1}" | $LOGGER + debug_log "/sbin/ip address flush dev ${1}" /sbin/ip address flush dev ${1} # Bring the interface down: - echo "/etc/rc.d/rc.inet1: /sbin/ip link set dev ${1} down" | $LOGGER + debug_log "/sbin/ip link set dev ${1} down" /sbin/ip link set dev ${1} down # Reset autoconf and accept_ra back to defaults: if [ -e /proc/sys/net/ipv6 ]; then + debug_log "${1}: resetting IPv6 autoconf and RA to defaults" cat /proc/sys/net/ipv6/conf/default/autoconf >/proc/sys/net/ipv6/conf/$1/autoconf cat /proc/sys/net/ipv6/conf/default/accept_ra >/proc/sys/net/ipv6/conf/$1/accept_ra fi # Take down VLAN interface, if configured. if echo "${1}" | grep -Fq .; then - echo "/etc/rc.d/rc.inet1: /sbin/ip link delete ${1}" | $LOGGER + info_log "${1}: destroying VLAN interface" + debug_log "/sbin/ip link delete ${1}" /sbin/ip link delete ${1} fi # Kill wireless daemons if any: @@ -436,17 +488,18 @@ if_down() { # Function to bring up the gateway if there is not yet a default route: gateway_up() { + info_log "Configuring gateways" # Bring up the IPv4 gateway: if [ -n "$GATEWAY" ]; then if ! /sbin/ip -4 route show | grep -wq default; then - echo "/etc/rc.d/rc.inet1: /sbin/ip -4 route add default via ${GATEWAY}" | $LOGGER + debug_log "/sbin/ip -4 route add default via ${GATEWAY}" /sbin/ip -4 route add default via ${GATEWAY} fi fi # Bring up the IPv6 gateway: if [ -n "$GATEWAY6" ]; then if ! /sbin/ip -6 route show | grep -wq default; then - echo "/etc/rc.d/rc.inet1: /sbin/ip -6 route add default via ${GATEWAY6}" | $LOGGER + debug_log "/sbin/ip -6 route add default via ${GATEWAY6}" /sbin/ip -6 route add default via ${GATEWAY6} fi fi @@ -454,12 +507,13 @@ gateway_up() { # Function to take down an existing default gateway: gateway_down() { + info_log "De-configuring gateways" if /sbin/ip -4 route show | grep -wq default ; then - echo "/etc/rc.d/rc.inet1: /sbin/ip -4 route del default" | $LOGGER + debug_log "/sbin/ip -4 route del default" /sbin/ip -4 route del default fi if /sbin/ip -6 route show | grep -wq default ; then - echo "/etc/rc.d/rc.inet1: /sbin/ip -6 route del default" | $LOGGER + debug_log "/sbin/ip -6 route del default" /sbin/ip -6 route del default fi } diff --git a/rc.wireless b/rc.wireless index 1b4b6f9..1fa02bd 100644 --- a/rc.wireless +++ b/rc.wireless @@ -60,11 +60,16 @@ # Convert the MAC address to uppercase in sed. # ------------------------------------------------------------------------------ -LOGGER=${LOGGER:-cat} +# If possible, log events in /var/log/messages: +if [ -f /var/run/syslogd.pid ] && [ -x /usr/bin/logger ]; then + LOGGER=/usr/bin/logger +else # output to stdout/stderr: + LOGGER=/bin/cat +fi if [ -z "$IFNAME" ] ; then - echo "WARNING: The script 'rc.wireless' must be executed by 'rc.inet1'!" | $LOGGER - echo " You should run the command \"/etc/rc.d/rc.inet1 _start\" yourself." | $LOGGER + echo "ERROR: The script 'rc.wireless' must be executed by 'rc.inet1'!" >&2 + echo " You should run the command \"/etc/rc.d/rc.inet1 _start\" yourself." >&2 return 1 2> /dev/null || exit 1 fi -- cgit v1.2.3