#!/bin/bash # Copyright (c) 2004-2005 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # Contributed by Roy Marples (uberlord@gentoo.org) # char* netplugd_provides(void) # # Returns a string to change module definition for starting up netplugd_provides() { echo "plug" } # void netplugd_depend(void) # # Sets up the dependancies for the module netplugd_depend() { after macnet before interface } # bool netplugd_check_installed(void) # # Returns 0 if netplug is installed, otherwise 1 netplugd_check_installed() { if [[ ! -x /sbin/netplugd ]]; then ${1:-false} && eerror "For netplug support, emerge sys-apps/netplug" return 1 fi return 0 } # bool netplugd_check_depends(void) # # Checks to see if we have the needed functions netplugd_check_depends() { local f for f in interface_exists interface_get_mac_address ; do [[ $( type -t "${f}" ) == "function" ]] && continue eerror "netplugd: missing required function ${f}\n" return 1 done return 0 } # bool netplugd_pre_start(char *interface) # # Start netplug on an interface netplugd_pre_start() { local iface="$1" timeout i local pidfile="/var/run/netplugd.${iface}.pid" # We don't start netplug if we're being called from the background ${IN_BACKGROUND} && return 0 interface_exists "${iface}" || return 0 # We need a valid MAC address # It's a basic test to ensure it's not a virtual interface local mac=$(interface_get_mac_address "${iface}") if [[ -z ${mac} ]]; then vewarn "netplug only works on interfaces with a valid MAC address" return 0 fi # We don't work on bridges if [[ $(type -t bridge_exists) == "function" ]]; then if bridge_exists "${iface}"; then veinfo "netplug does not work on bridges" return 0 fi fi # We don't work on tun/tap interfaces if [[ $(type -t tuntap_exists) == "function" ]]; then if tuntap_exists "${iface}"; then veinfo "netplug does not work on tun/tap interfaces" return 0 fi fi # We don't work on wirelesss interfaces if [[ $(type -t wireless_check_extensions) == "function" ]]; then if wireless_check_extensions "${iface}"; then veinfo "netplug does not work on wireless interfaces" return 0 fi fi ebegin "Starting netplug on ${iface}" # We need the interface up for netplug to listen to netlink events interface_up "${iface}" # Mark the us as inactive so netplug can restart us mark_service_inactive "net.${iface}" # Start netplug start-stop-daemon --start --exec /sbin/netplugd \ --pidfile "${pidfile}" \ -- -i "${iface}" -P -p "${pidfile}" -c /dev/null eend "$?" || return 1 eindent eval timeout=\"\$\{plug_timeout_${ifvar}\:-10}\" if [[ ${timeout} == "0" ]]; then ewarn "WARNING: infinite timeout set for ${iface} to come up" elif [[ ${timeout} -lt 0 ]]; then ewarn "WARNING: negative timeout set for ${iface}" exit 0 fi veinfo "Waiting for ${iface} to be marked as started" i=0 while true ; do if service_started "net.${iface}"; then local addr=$( interface_get_address "${iface}" ) einfo "${iface} configured with address ${addr}" exit 0 fi sleep 1 (( i++ )) [[ ${i} == "${timeout}" || ${i} -gt "${timeout}" ]] && break done eend 1 "Failed to configure ${iface} in the background" exit 0 } # bool netplugd_post_stop(char *iface) # # Stops netplug on an interface # Returns 0 (true) when successful, non-zero otherwise netplugd_post_stop() { ${IN_BACKGROUND} && return 0 local iface="$1" local pidfile="/var/run/netplugd.${iface}.pid" [[ ! -e ${pidfile} ]] && return 0 ebegin "Stopping netplug on ${iface}" start-stop-daemon --stop --exec /sbin/netplugd \ --pidfile "${pidfile}" eend $? } # vim:ts=4