Remove gentoo's net.* scripts

It has been determined that it will be best for gentoo's net.* scripts
to be in a separate package to allow independent development.
This package will be called netifrc and maintained by Gentoo.
This commit is contained in:
William Hubbs 2013-03-18 18:29:36 -05:00
parent b2f8ac9382
commit 838c9efb36
54 changed files with 16 additions and 8107 deletions

View File

@ -6,11 +6,6 @@ include Makefile.inc
SUBDIR= conf.d etc init.d local.d man scripts sh src sysctl.d
# Build our old net foo or not
ifeq (${MKNET},oldnet)
SUBDIR+= net doc
endif
# Build pkgconfig or not
MKPKGCONFIG?= yes
ifeq (${MKPKGCONFIG},yes)

2
README
View File

@ -10,7 +10,7 @@ You may wish to tweak the installation with the below arguments
PROGLDFLAGS=-static
LIBNAME=lib64
DESTDIR=/tmp/openrc-image
MKNET=oldnet
MKNET=no
MKPAM=pam
MKPREFIX=yes
MKPKGCONFIG=no

View File

@ -1,7 +1,3 @@
The following applies only to the newnet stack, which is not presently
maintained in OpenRC. The oldnet stack is maintained instead.
- Robin H. Johnson <robbat2@gentoo.org>, 2011/02/21
OpenRC Network Ideals
---------------------

View File

@ -1,8 +1,10 @@
include ../mk/net.mk
DIR= ${CONFDIR}
CONF= bootmisc fsck hostname localmount netmount urandom tmpfiles \
${CONF-${OS}}
ifeq (${MKNET},)
ifeq (${MKNET},yes)
CONF+= network staticroute
TARGETS+= network staticroute
CLEANFILES+= network staticroute

View File

@ -1,4 +0,0 @@
# This blank configuration will automatically use DHCP for any net.*
# scripts in /etc/init.d. To create a more complete configuration,
# please review /usr/share/doc/openrc*/net.example* and save your configuration
# in /etc/conf.d/net (this file :]!).

1
doc/.gitignore vendored
View File

@ -1 +0,0 @@
net.example

View File

@ -1,11 +0,0 @@
DIR= ${DOCDIR}/openrc
SRCS= net.example.in
INC= net.example
MK= ../mk
include ${MK}/os.mk
%.example.in: %.example${SFX}
${CP} $< $@
include ${MK}/scripts.mk

View File

@ -1,445 +0,0 @@
##############################################################################
# QUICK-START
#
# The quickest start is if you want to use DHCP.
# In that case, everything should work out of the box, no configuration
# necessary, though the startup script will warn you that you haven't
# specified anything.
# WARNING :- some examples have a mixture of IPv4 (ie 192.168.0.1) and IPv6
# (ie 4321:0:1:2:3:4:567:89ab) internet addresses. They only work if you have
# the relevant kernel option enabled. So if you don't have an IPv6 enabled
# kernel then remove the IPv6 address from your config.
# If you want to use a static address or use DHCP explicitly, jump
# down to the section labeled INTERFACE HANDLERS.
#
# If you want to do anything more fancy, you should take the time to
# read through the rest of this file.
##############################################################################
# MODULES
#
# We now support modular networking scripts which means we can easily
# add support for new interface types and modules while keeping
# compatibility with existing ones.
#
# Modules load by default if the package they need is installed. If
# you specify a module here that doesn't have its package installed
# then you get an error stating which package you need to install.
# Ideally, you only use the modules setting when you have two or more
# packages installed that supply the same service.
#
# In other words, you probably should DO NOTHING HERE...
##############################################################################
# INTERFACE HANDLERS
# For a static configuration, use something like this
#config_eth0="192.168.0.2/24"
# If you need more than one address, you can use something like this
# NOTE: ifconfig creates an aliased device for each extra IPv4 address
# (eth0:1, eth0:2, etc)
# iproute2 does not do this as there is no need to
#config_eth0="192.168.0.2/24 192.168.0.3/24 192.168.0.4/24"
# You can also use IPv6 addresses
# (you should always specify a prefix length with IPv6 here)
#config_eth0="192.168.0.2/24 4321:0:1:2:3:4:567:89ab/64 4321:0:1:2:3:4:567:89ac/64"
# If you wish to keep existing addresses + routing and the interface is up,
# you can specify a noop (no operation). If the interface is down or there
# are no addresses assigned, then we move onto the next step (default dhcp)
# This is useful when configuring your interface with a kernel command line
# or similar
#config_eth0="noop 192.168.0.2/24"
# If you don't want ANY address (only useful when calling for advanced stuff)
#config_eth0="null"
# Here's how to do routing if you need it
# We add an IPv4 default route, IPv4 subnet route and an IPv6 unicast route
#routes_eth0="default via 192.168.0.1
#10.0.0.0/8 via 192.168.0.1
#::/0"
# If a specified module fails (like dhcp - see below), you can specify a
# fallback like so
#fallback_eth0="192.168.0.2 netmask 255.255.255.0"
#fallback_routes_eth0="default via 192.168.0.1"
# NOTE: fallback entry must match the entry location in config_eth0
# As such you can only have one fallback route.
# Also, if you do not set a fallback_routes entry for an interface, the
# routes entry will be used if that is set.
# Some users may need to alter the MTU - here's how
#mtu_eth0="1500"
# Most drivers that report carrier status function correctly, but some do not
# One of these faulty drivers is for the Intel e1000 network card, but only
# at boot time. To get around this you may alter the carrier_timeout value for
# the interface. 0 is disable and any other number of seconds is how
# long we wait for carrier. The current default is disabled.
#carrier_timeout_eth0=0
# You may wish to disable the interface being brought down when stopping.
# This is only of use for WakeOnLan.
#ifdown_eth0="NO"
##############################################################################
# OPTIONAL MODULES
#-----------------------------------------------------------------------------
# WIRELESS (802.11 support)
# Wireless can be provided by BSDs ifconfig (iwconfig) or wpa_supplicant
# wpa_supplicant is preferred, use the modules directive to prefer iwconfig.
#modules="iwconfig"
# ifconfig (iwconig) support is a one shot script - wpa_supplicant is daemon
# that scans, associates and re-configures if association is lost.
# We call it iwconfig to separate the wireless setup from ifconfig.
####################################
# HINTS
#
# Most users will just need to set the following options
# key_SSID1="s:yourkeyhere enc open" # s: means a text key
# key_SSID2="aaaa-bbbb-cccc-dd" # no s: means a hex key
# preferred_aps="SSID1 SSID2"
#
# Clear? Good. Now configure your wireless network below
####################################
# SETTINGS
# Hard code an SSID to an interface - leave this unset if you wish the driver
# to scan for available Access Points
# I would only set this as a last resort really - use the preferred_aps
# setting at the bottom of this file
#essid_eth0='foo'
# Some drivers/hardware don't scan all that well. We have no control over this
# but we can say how many scans we want to do to try and get a better sweep of
# the area. The default is 1.
#scans_eth0="1"
#Channel can be set (1-14), but defaults to 3 if not set.
#
# The below is taken verbatim from the BSD wavelan documentation found at
# http://www.netbsd.org/Documentation/network/wavelan.html
# There are 14 channels possible; We are told that channels 1-11 are legal for
# North America, channels 1-13 for most of Europe, channels 10-13 for France,
# and only channel 14 for Japan. If in doubt, please refer to the documentation
# that came with your card or access point. Make sure that the channel you
# select is the same channel your access point (or the other card in an ad-hoc
# network) is on. The default for cards sold in North America and most of Europe
# is 3; the default for cards sold in France is 11, and the default for cards
# sold in Japan is 14.
#channel_eth0="3"
# Setup any other config commands. This is basically the ifconfig argument
# without the ifconfig $iface.
#ifconfig_eth0=""
# You can do the same per SSID too.
#ifconfig_SSID=""
# Seconds to wait until associated. The default is to wait 10 seconds.
# 0 means wait indefinitely. WARNING: this can cause an infinite delay when
# booting.
#associate_timeout_eth0="5"
# Define a WEP key per SSID or MAC address (of the AP, not your card)
# The encryption type (open or restricted) must match the
# encryption type on the Access Point.
# To set a hex key, prefix with 0x
#key_SSID="0x12341234123412341234123456"
# or you can use strings. Passphrase IS NOT supported
#key_SSID="foobar"
#key_SSID="foobar"
# WEP key for the AP with MAC address 001122334455
#mac_key_001122334455="foobar"
# You can also override the interface settings found in /etc/conf.d/net
# per SSID - which is very handy if you use different networks a lot
#config_SSID="dhcp"
#routes_SSID=
#fallback_SSID=
# Setting name/domain server causes /etc/resolv.conf to be overwritten
# Note that if DHCP is used, and you want this to take precedence then
# please put -R in your dhcpcd options
#dns_servers_SSID="192.168.0.1 192.168.0.2"
#dns_domain_SSID="some.domain"
#dns_search_SSID="search.this.domain search.that.domain"
# Please check the man page for resolv.conf for more information
# as domain and search (searchdomains) are mutually exclusive and
# searchdomains takes precedence
# You can also set any of the /etc/conf.d/net variables per MAC address
# incase you use Access Points with the same SSID but need different
# networking configs. Below is an example - of course you use the same
# method with other variables
#config_001122334455="dhcp"
#dns_servers_001122334455="192.168.0.1 192.168.0.2"
# Map a MAC address to an SSID
# This is used when the Access Point is not broadcasting its SSID
# WARNING: This will override the SSID being broadcast due to some
# Access Points sending an SSID even when they have been configured
# not to!
# Change 001122334455 to the MAC address and SSID to the SSID
# it should map to
#mac_essid_001122334455="SSID"
# This lists the preferred SSIDs to connect to in order
# SSID's can contain any characters here as they must match the broadcast
# SSID exactly.
# Surround each SSID with the " character and separate them with a space
# If the first SSID isn't found then it moves onto the next
# If this isn't defined then it connects to the first one found
#preferred_aps="SSID1 SSID2"
# You can also define a preferred_aps list per interface
#preferred_aps_eth0="SSID3 SSID4"
# You can also say whether we only connect to preferred APs or not
# Values are "any", "preferredonly", "forcepreferred", "forcepreferredonly"
# and "forceany"
# "any" means it will connect to visible APs in the preferred list and then
# any other available AP
# "preferredonly" means it will only connect to visible APs in the preferred
# list
# "forcepreferred" means it will forcibly connect to APs in order if it does
# not find them in a scan
# "forcepreferredonly" means it forcibly connects to the APs in order and
# does not bother to scan
# "forceany" does the same as forcepreferred + connects to any other
# available AP
# Default is "any"
#associate_order="any"
#associate_order_eth0="any"
# You can define blacklisted Access Points in the same way
#blacklist_aps="SSID1 SSID2"
#blacklist_aps_eth0="SSID3 SSID4"
# If you have more than one wireless card, you can say if you want
# to allow each card to associate with the same Access Point or not
# Values are "yes" and "no"
# Default is "yes"
#unique_ap="yes"
#unique_ap_eth0="yes"
# IMPORTANT: preferred_only, blacklisted_aps and unique_ap only work when
# essid_eth0 is not set and your card is capable of scanning
# NOTE: preferred_aps list ignores blacklisted_aps - so if you have
# the same SSID in both, well, you're a bit silly :p
##################################################
# wpa_supplicant
# emerge net-wireless/wpa_supplicant
# Wireless options are held in /etc/wpa_supplicant/wpa_supplicant.conf
# Consult the wpa_supplicant.conf.example that is installed in
# /usr/share/doc/wpa_supplicant
# By default we don't wait for wpa_supplicant to associate and authenticate.
# If you would like to, so can specify how long in seconds
#associate_timeout_eth0=60
# A value of 0 means wait forever.
# You can also override any settings found here per SSID - which is very
# handy if you use different networks a lot. See below for using the SSID
# in our variables
#config_SSID="dhcp"
# See the System module below for setting dns/nis/ntp per SSID
# You can also override any settings found here per MAC address of the AP
# in case you use Access Points with the same SSID but need different
# networking configs. Below is an example - of course you use the same
# method with other variables
#mac_config_001122334455="dhcp"
#mac_dns_servers_001122334455="192.168.0.1 192.168.0.2"
# When an interface has been associated with an Access Point, a global
# variable called SSID is set to the Access Point's SSID for use in the
# pre/post user functions below (although it's not available in preup as you
# won't have associated then)
# If you're using anything else to configure wireless on your interface AND
# you have installed wpa_supplicant, you need to disable wpa_supplicant
#modules="!iwconfig !wpa_supplicant"
#or
#modules="!wireless"
##############################################################################
# WIRELESS SSID IN VARIABLES
##############################################################################
# Remember to change SSID to your SSID.
# Say that your SSID is My NET - the line
# #key_SSID="s:passkey"
# becomes
# #key_My_NET="s:passkey"
# Notice that the space has changed to an underscore - do the same with all
# characters not in a-z A-Z (English alphabet) 0-9. This only applies to
# variables and not values.
#
# Any SSID's in values like essid_eth0="My NET" may need to be escaped
# This means placing the character \ before the character
# \" need to be escaped for example
# So if your SSID is
# My "\ NET
# it becomes
# My \"\\ NET
# for example
# #essid_eth0="My\"\\NET"
#
# So using the above we can use
# #dns_domain_My____NET="My\"\\NET"
# which is an invalid dns domain, but shows the how to use the variable
# structure
#########################################################
#-----------------------------------------------------------------------------
# DHCP
# DHCP can be provided by dhclient.
#
# dhcpcd: emerge net-misc/dhcpcd
# dhclient: emerge net-misc/dhcp
# Regardless of which DHCP client you prefer, you configure them the
# same way using one of following depending on which interface modules
# you're using.
#config_eth0="dhcp"
# For passing custom options to dhcpcd use something like the following. This
# example reduces the timeout for retrieving an address from 60 seconds (the
# default) to 10 seconds.
#dhcpcd_eth0="-t 10"
# GENERIC DHCP OPTIONS
# Set generic DHCP options like so
#dhcp_eth0="release nodns nontp nonis nogateway nosendhost"
# This tells the dhcp client to release its lease when it stops, not to
# overwrite dns, ntp and nis settings, not to set a default route and not to
# send the current hostname to the dhcp server and when it starts.
# You can use any combination of the above options - the default is not to
# use any of them.
#-----------------------------------------------------------------------------
# System
# For configuring system specifics such as domain, dns, ntp and nis servers
# It's rare that you would need todo this, but you can anyway.
# This is most benefit to wireless users who don't use DHCP so they can change
# their configs based on SSID.
# If you omit the _eth0 suffix, then it applies to all interfaces unless
# overridden by the interface suffix.
#dns_domain_eth0="your.domain"
#dns_servers_eth0="192.168.0.2 192.168.0.3"
#dns_search_eth0="this.domain that.domain"
#dns_options_eth0="timeout:1 rotate"
#dns_sortlist_eth0="130.155.160.0/255.255.240.0 130.155.0.0"
# See the man page for resolv.conf for details about the options and sortlist
# directives
#ntp_servers_eth0="192.168.0.2 192.168.0.3"
#nis_domain_eth0="domain"
#nis_servers_eth0="192.168.0.2 192.168.0.3"
# NOTE: Setting any of these will stamp on the files in question. So if you
# don't specify dns_servers but you do specify dns_domain then no nameservers
# will be listed in /etc/resolv.conf even if there were any there to start
# with.
# If this is an issue for you then maybe you should look into a resolv.conf
# manager like resolvconf-gentoo to manage this file for you. All packages
# that baselayout supports use resolvconf-gentoo if installed.
#-----------------------------------------------------------------------------
# Cable in/out detection
# Sometimes the cable is in, others it's out. Obviously you don't want to
# restart net.eth0 every time when you plug it in either.
# BSD has the Device State Change Daemon - or devd for short
# To enable this, simple add devd to the boot runlevel
#rc-update add devd boot
#rc
##############################################################################
# ADVANCED CONFIGURATION
#
# Four functions can be defined which will be called surrounding the
# start/stop operations. The functions are called with the interface
# name first so that one function can control multiple adapters. An extra two
# functions can be defined when an interface fails to start or stop.
#
# The return values for the preup and predown functions should be 0
# (success) to indicate that configuration or deconfiguration of the
# interface can continue. If preup returns a non-zero value, then
# interface configuration will be aborted. If predown returns a
# non-zero value, then the interface will not be allowed to continue
# deconfiguration.
#
# The return values for the postup, postdown, failup and faildown functions are
# ignored since there's nothing to do if they indicate failure.
#
# ${IFACE} is set to the interface being brought up/down
# ${IFVAR} is ${IFACE} converted to variable name bash allows
#
# For historical and compatibility reasons, preup is actually normally called
# in the following sequence: up ; preup ; up.
# The first up causes the kernel to initialize the device, so
# that it is available for use in the preup function. However, for some
# hardware, e.g. CAN devices, some configuration is needed before trying to up
# the interface will actually work. For such hardware, the
# up_before_preup variables will allow skipping the first up call if set
# to yes.
#up_before_preup_IFVAR="NO"
#up_before_preup="NO"
#preup() {
# # Remember to return 0 on success
# return 0
#}
#predown() {
# # The default in the script is to test for NFS root and disallow
# # downing interfaces in that case. Note that if you specify a
# # predown() function you will override that logic. Here it is, in
# # case you still want it...
# if is_net_fs /; then
# eerror "root filesystem is network mounted -- can't stop ${IFACE}"
# return 1
# fi
#
# # Remember to return 0 on success
# return 0
#}
#postup() {
# # This function could be used, for example, to register with a
# # dynamic DNS service. Another possibility would be to
# # send/receive mail once the interface is brought up.
#}
#postdown() {
# # Return 0 always
# return 0
#}
#failup() {
# # This function is mostly here for completeness... I haven't
# # thought of anything nifty to do with it yet ;-)
#}
#faildown() {
# # This function is mostly here for completeness... I haven't
# # thought of anything nifty to do with it yet ;-)
#}
# You should note that we don't stop the network at system shutdown by default.
# If you really need this, then set keep_network=NO

File diff suppressed because it is too large Load Diff

View File

@ -1,23 +1,19 @@
include ../mk/net.mk
DIR= ${INITDIR}
SRCS= bootmisc.in fsck.in hostname.in local.in localmount.in loopback.in \
netmount.in root.in savecache.in swap.in swapfiles.in \
tmpfiles.setup.in swclock.in sysctl.in urandom.in ${SRCS-${OS}}
BIN= ${OBJS}
# Build our old net foo or not
ifeq (${MKNET},)
# Are we installing our network scripts?
ifeq (${MKNET},yes)
SRCS+= network.in staticroute.in
endif
ifeq (${MKNET},oldnet)
INSTALLAFTER= _installafter_net.lo
SRCS+= net.lo.in
endif
MK= ../mk
include ${MK}/os.mk
NET_LO-FreeBSD= net.lo0
# Generic BSD scripts
SRCS-FreeBSD= hostid.in moused.in newsyslog.in pf.in rarpd.in rc-enabled.in \
rpcbind.in savecore.in syslogd.in
@ -25,12 +21,10 @@ SRCS-FreeBSD= hostid.in moused.in newsyslog.in pf.in rarpd.in rc-enabled.in \
SRCS-FreeBSD+= adjkerntz.in devd.in dumpon.in encswap.in ipfw.in \
mixer.in nscd.in powerd.in syscons.in
NET_LO-Linux= net.lo
SRCS-Linux= devfs.in dmesg.in hwclock.in consolefont.in keymaps.in \
killprocs.in modules.in mount-ro.in mtab.in numlock.in \
procfs.in sysfs.in termencoding.in tmpfiles.dev.in
NET_LO-NetBSD= net.lo0
# Generic BSD scripts
SRCS-NetBSD= hostid.in moused.in newsyslog.in pf.in rarpd.in rc-enabled.in \
rpcbind.in savecore.in syslogd.in
@ -43,6 +37,3 @@ SRCS-NetBSD+= devdb.in swap-blk.in ttys.in wscons.in
include ${MK}/scripts.mk
_installafter_: realinstall
_installafter_net.lo: realinstall
${INSTALL} -m ${BINMODE} net.lo ${DESTDIR}/${INITDIR}/${NET_LO-${OS}}

View File

@ -1,789 +0,0 @@
#!@SBINDIR@/runscript
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
MODULESDIR="${RC_LIBEXECDIR}/net"
MODULESLIST="${RC_SVCDIR}/nettree"
_config_vars="config routes"
[ -z "${IN_BACKGROUND}" ] && IN_BACKGROUND="NO"
description="Configures network interfaces."
# Handy var so we don't have to embed new lines everywhere for array splitting
__IFS="
"
depend()
{
local IFACE=${RC_SVCNAME#*.}
local IFVAR=$(shell_var "${IFACE}")
need localmount
if [ "$RC_UNAME" = Linux -a "$IFACE" != lo ]; then
need sysfs
fi
after bootmisc
keyword -jail -prefix -vserver
case "${IFACE}" in
lo|lo0) ;;
*)
after net.lo net.lo0 dbus
provide net
;;
esac
if [ "$(command -v "depend_${IFVAR}")" = "depend_${IFVAR}" ]; then
depend_${IFVAR}
fi
local dep= prov=
for dep in need use before after provide keyword; do
eval prov=\$rc_${dep}_${IFVAR}
if [ -n "${prov}" ]; then
${dep} ${prov}
ewarn "rc_${dep}_${IFVAR} is deprecated."
ewarn "Please use rc_net_${IFVAR}_${dep} instead."
fi
done
}
# Support bash arrays - sigh
_array_helper()
{
local _a=
eval _a=\$$1
_a=$(echo "${_a}" | sed -e 's:^[[:space:]]*::' -e 's:[[:space:]]*$::' -e '/^$/d' -e 's:[[:space:]]\{1,\}: :g')
[ -n "${_a}" ] && printf "%s\n" "${_a}"
}
_get_array()
{
local _a=
if [ -n "${BASH}" ]; then
case "$(declare -p "$1" 2>/dev/null)" in
"declare -a "*)
ewarn "You are using a bash array for $1."
ewarn "This feature will be removed in the future."
ewarn "Please see net.example for the correct format for $1."
eval "set -- \"\${$1[@]}\""
for _a; do
printf "%s\n" "${_a}"
done
return 0
;;
esac
fi
_array_helper $1
}
# Flatten bash arrays to simple strings
_flatten_array()
{
if [ -n "${BASH}" ]; then
case "$(declare -p "$1" 2>/dev/null)" in
"declare -a "*)
ewarn "You are using a bash array for $1."
ewarn "This feature will be removed in the future."
ewarn "Please see net.example for the correct format for $1."
eval "set -- \"\${$1[@]}\""
for x; do
printf "'%s' " "$(printf "$x" | sed "s:':'\\\'':g")"
done
return 0
;;
esac
fi
_array_helper $1
}
_wait_for_carrier()
{
local timeout= efunc=einfon
_has_carrier && return 0
eval timeout=\$carrier_timeout_${IFVAR}
timeout=${timeout:-${carrier_timeout:-0}}
# Incase users don't want this nice feature ...
[ ${timeout} -le 0 ] && return 0
yesno ${RC_PARALLEL} && efunc=einfo
${efunc} "Waiting for carrier (${timeout} seconds) "
while [ ${timeout} -gt 0 ]; do
if _has_carrier; then
[ "${efunc}" = "einfon" ] && echo
eend 0
return 0
fi
sleep 1
: $(( timeout -= 1 ))
[ "${efunc}" = "einfon" ] && printf "."
done
[ "${efunc}" = "einfon" ] && echo
eend 1
return 1
}
_netmask2cidr()
{
# Some shells cannot handle hex arithmetic, so we massage it slightly
# Buggy shells include FreeBSD sh, dash and busybox.
# bash and NetBSD sh don't need this.
case $1 in
0x*)
local hex=${1#0x*} quad=
while [ -n "${hex}" ]; do
local lastbut2=${hex#??*}
quad=${quad}${quad:+.}0x${hex%${lastbut2}*}
hex=${lastbut2}
done
set -- ${quad}
;;
esac
local i= len=
local IFS=.
for i in $1; do
case $i in
0x*) i=$((i)) ;;
esac
while [ ${i} -ne 0 ]; do
: $(( len += i % 2 ))
: $(( i >>= 1 ))
done
done
echo "${len}"
}
_configure_variables()
{
local var= v= t=
for var in ${_config_vars}; do
local v=
for t; do
eval v=\$${var}_${t}
if [ -n "${v}" ]; then
eval ${var}_${IFVAR}=\$${var}_${t}
continue 2
fi
done
done
}
_which()
{
local i OIFS
# Empty
[ -z "$1" ] && return
# check paths
OIFS="$IFS"
IFS=:
for i in $PATH ; do
[ -x $i/$1 ] && echo $i/$1 && break
done
IFS=$OIFS
}
# Like _which, but also consider shell builtins, and multiple alternatives
_program_available()
{
[ -z "$1" ] && return 0
local x=
for x; do
case "${x}" in
/*) [ -x "${x}" ] && break;;
*) type "${x}" >/dev/null 2>&1 && break;;
esac
unset x
done
[ -n "${x}" ] && echo $x && return 0
return 1
}
_show_address()
{
einfo "received address $(_get_inet_address "${IFACE}")"
}
# Basically sorts our modules into order and saves the list
_gen_module_list()
{
local x= f= force=$1
if ! ${force} && [ -s "${MODULESLIST}" -a "${MODULESLIST}" -nt "${MODULESDIR}" ]; then
local update=false
for x in "${MODULESDIR}"/*.sh; do
[ -e "${x}" ] || continue
if [ "${x}" -nt "${MODULESLIST}" ]; then
update=true
break
fi
done
${update} || return 0
fi
einfo "Caching network module dependencies"
# Run in a subshell to protect the main script
(
after() {
eval ${MODULE}_after="\"\${${MODULE}_after}\${${MODULE}_after:+ }$*\""
}
before() {
local mod=${MODULE}
local MODULE=
for MODULE; do
after "${mod}"
done
}
program() {
if [ "$1" = "start" -o "$1" = "stop" ]; then
local s="$1"
shift
eval ${MODULE}_program_${s}="\"\${${MODULE}_program_${s}}\${${MODULE}_program_${s}:+ }$*\""
else
eval ${MODULE}_program="\"\${${MODULE}_program}\${${MODULE}_program:+ }$*\""
fi
}
provide() {
eval ${MODULE}_provide="\"\${${MODULE}_provide}\${${MODULE}_provide:+ }$*\""
local x
for x in $*; do
eval ${x}_providedby="\"\${${MODULE}_providedby}\${${MODULE}_providedby:+ }${MODULE}\""
done
}
for MODULE in "${MODULESDIR}"/*.sh; do
sh -n "${MODULE}" || continue
. "${MODULE}" || continue
MODULE=${MODULE#${MODULESDIR}/}
MODULE=${MODULE%.sh}
eval ${MODULE}_depend
MODULES="${MODULES} ${MODULE}"
done
VISITED=
SORTED=
visit() {
case " ${VISITED} " in
*" $1 "*) return;;
esac
VISITED="${VISITED} $1"
eval AFTER=\$${1}_after
for MODULE in ${AFTER}; do
eval PROVIDEDBY=\$${MODULE}_providedby
if [ -n "${PROVIDEDBY}" ]; then
for MODULE in ${PROVIDEDBY}; do
visit "${MODULE}"
done
else
visit "${MODULE}"
fi
done
eval PROVIDE=\$${1}_provide
for MODULE in ${PROVIDE}; do
visit "${MODULE}"
done
eval PROVIDEDBY=\$${1}_providedby
[ -z "${PROVIDEDBY}" ] && SORTED="${SORTED} $1"
}
for MODULE in ${MODULES}; do
visit "${MODULE}"
done
printf "" > "${MODULESLIST}"
i=0
for MODULE in ${SORTED}; do
eval PROGRAM=\$${MODULE}_program
eval PROGRAM_START=\$${MODULE}_program_start
eval PROGRAM_STOP=\$${MODULE}_program_stop
eval PROVIDE=\$${MODULE}_provide
echo "module_${i}='${MODULE}'" >> "${MODULESLIST}"
echo "module_${i}_program='${PROGRAM}'" >> "${MODULESLIST}"
echo "module_${i}_program_start='${PROGRAM_START}'" >> "${MODULESLIST}"
echo "module_${i}_program_stop='${PROGRAM_STOP}'" >> "${MODULESLIST}"
echo "module_${i}_provide='${PROVIDE}'" >> "${MODULESLIST}"
: $(( i += 1 ))
done
echo "module_${i}=" >> "${MODULESLIST}"
)
return 0
}
_load_modules()
{
local starting=$1 mymods=
# Ensure our list is up to date
_gen_module_list false
if ! . "${MODULESLIST}"; then
_gen_module_list true
. "${MODULESLIST}"
fi
MODULES=
if [ "${IFACE}" != "lo" -a "${IFACE}" != "lo0" ]; then
eval mymods=\$modules_${IFVAR}
[ -z "${mymods}" ] && mymods=${modules}
fi
local i=-1 x= mod= f= provides=
while true; do
: $(( i += 1 ))
eval mod=\$module_${i}
[ -z "${mod}" ] && break
[ -e "${MODULESDIR}/${mod}.sh" ] || continue
eval set -- \$module_${i}_program
if [ -n "$1" ]; then
if ! _program_available "$@" >/dev/null; then
vewarn "Skipping module $mod due to missing program: $@"
continue
fi
fi
if ${starting}; then
eval set -- \$module_${i}_program_start
else
eval set -- \$module_${i}_program_stop
fi
if [ -n "$1" ]; then
if ! _program_available "$@" >/dev/null; then
vewarn "Skipping module $mod due to missing program: $@"
continue
fi
fi
eval provides=\$module_${i}_provide
if ${starting}; then
case " ${mymods} " in
*" !${mod} "*) continue;;
*" !${provides} "*) [ -n "${provides}" ] && continue;;
esac
fi
MODULES="${MODULES}${MODULES:+ }${mod}"
# Now load and wrap our functions
if ! . "${MODULESDIR}/${mod}.sh"; then
eend 1 "${RC_SVCNAME}: error loading module \`${mod}'"
exit 1
fi
[ -z "${provides}" ] && continue
# Wrap our provides
local f=
for f in pre_start start post_start; do
eval "${provides}_${f}() { [ "$(command -v "${mod}_${f}")" = "${mod}_${f}" ] || return 0; ${mod}_${f} \"\$@\"; }"
done
eval module_${mod}_provides="${provides}"
eval module_${provides}_providedby="${mod}"
done
# Wrap our preferred modules
for mod in ${mymods}; do
case " ${MODULES} " in
*" ${mod} "*)
eval x=\$module_${mod}_provides
[ -z "${x}" ] && continue
for f in pre_start start post_start; do
eval "${x}_${f}() { [ "$(command -v "${mod}_${f}")" = "${mod}_${f}" ] || return 0; ${mod}_${f} \"\$@\"; }"
done
eval module_${x}_providedby="${mod}"
;;
esac
done
# Finally remove any duplicated provides from our list if we're starting
# Otherwise reverse the list
local LIST="${MODULES}" p=
MODULES=
if ${starting}; then
for mod in ${LIST}; do
eval x=\$module_${mod}_provides
if [ -n "${x}" ]; then
eval p=\$module_${x}_providedby
[ "${mod}" != "${p}" ] && continue
fi
MODULES="${MODULES}${MODULES:+ }${mod}"
done
else
for mod in ${LIST}; do
MODULES="${mod}${MODULES:+ }${MODULES}"
done
fi
veinfo "Loaded modules: ${MODULES}"
}
_load_config()
{
local config="$(_get_array "config_${IFVAR}")"
local fallback="$(_get_array fallback_${IFVAR})"
config_index=0
local IFS="$__IFS"
set -- ${config}
# We should support a space separated array for cidr configs
# But only as long as they do not contain other parameters for the address
if [ $# = 1 ]; then
unset IFS
set -- ${config}
# Of course, we may have a single address added old style.
# If the NEXT argument is a v4 or v6 address, it's the next config.
# Otherwise, it's arguments to the first config...
if [ "${2#*.*}" = "${2}" -a "${2#*:*}" = "${2}" ]; then
# Not an IPv4/IPv6
local IFS="$__IFS"
set -- ${config}
fi
fi
# Ensure that loopback has the correct address
if [ "${IFACE}" = "lo" -o "${IFACE}" = "lo0" ]; then
if [ "$1" != "null" ]; then
config_0="127.0.0.1/8"
config_index=1
fi
else
if [ -z "$1" ]; then
ewarn "No configuration specified; defaulting to DHCP"
config_0="dhcp"
config_index=1
fi
fi
# We store our config in an array like vars
# so modules can influence it
for cmd; do
eval config_${config_index}="'${cmd}'"
: $(( config_index += 1 ))
done
# Terminate the list
eval config_${config_index}=
config_index=0
for cmd in ${fallback}; do
eval fallback_${config_index}="'${cmd}'"
: $(( config_index += 1 ))
done
# Terminate the list
eval fallback_${config_index}=
# Don't set to zero, so any net modules don't have to do anything extra
config_index=-1
}
# Support functions
_run_if()
{
local cmd=$1 iface=$2 ifr=${IFACE} ifv=${IFVAR}
# Ensure that we don't stamp on real values
local IFACE= IFVAR=
shift
if [ -n "${iface}" ]; then
IFACE="${iface}"
[ "${iface}" != "${ifr}" ] && IFVAR=$(shell_var "${IFACE}")
else
IFACE=${ifr}
IFVAR=${ifv}
fi
${cmd}
}
interface_exists()
{
_run_if _exists "$@"
}
interface_up()
{
_run_if _up "$@"
}
interface_down()
{
_run_if _down "$@"
}
start()
{
local IFACE=${RC_SVCNAME#*.} oneworked=false fallback=false module=
local IFVAR=$(shell_var "${IFACE}") cmd= our_metric=
local metric=0 _up_before_preup
eval _up_before_preup="\$up_before_preup_${IFVAR}"
[ -z "${_up_before_preup}" ] && _up_before_preup=$up_before_preup
einfo "Bringing up interface ${IFACE}"
eindent
if [ -z "${MODULES}" ]; then
local MODULES=
_load_modules true
fi
# We up the iface twice if we have a preup to ensure it's up if
# available in preup and afterwards incase the user inadvertently
# brings it down
if [ "$(command -v preup)" = "preup" ]; then
yesno "${_up_before_preup:-yes}" && _up 2>/dev/null
ebegin "Running preup"
eindent
preup || return 1
eoutdent
fi
_up 2>/dev/null
for module in ${MODULES}; do
if [ "$(command -v "${module}_pre_start")" = "${module}_pre_start" ]; then
${module}_pre_start || exit $?
fi
done
if ! _exists; then
eerror "ERROR: interface ${IFACE} does not exist"
eerror "Ensure that you have loaded the correct kernel module for your hardware"
return 1
fi
if ! _wait_for_carrier; then
if service_started devd; then
ewarn "no carrier, but devd will start us when we have one"
mark_service_inactive "${RC_SVCNAME}"
else
eerror "no carrier"
fi
return 1
fi
local config= config_index=
_load_config
config_index=0
eval our_metric=\$metric_${IFVAR}
if [ -n "${our_metric}" ]; then
metric=${our_metric}
elif [ "${IFACE}" != "lo" -a "${IFACE}" != "lo0" ]; then
: $(( metric += $(_ifindex) ))
fi
while true; do
eval config=\$config_${config_index}
[ -z "${config}" ] && break
set -- ${config}
if [ "$1" != "null" -a "$1" != "noop" ]; then
ebegin "$1"
fi
eindent
case "$1" in
noop)
if [ -n "$(_get_inet_address)" ]; then
oneworked=true
break
fi
;;
null) :;;
[0-9]*|*:*) _add_address ${config};;
*)
if [ "$(command -v "${config}_start")" = "${config}_start" ]; then
"${config}"_start
else
eerror "nothing provides \`${config}'"
fi
;;
esac
if eend $?; then
oneworked=true
else
eval config=\$fallback_${config_index}
if [ -n "${config}" ]; then
fallback=true
eoutdent
ewarn "Trying fallback configuration ${config}"
eindent
eval config_${config_index}=\$config
unset fallback_${config_index}
: $(( config_index -= 1 ))
fi
fi
eoutdent
: $(( config_index += 1 ))
done
if ! ${oneworked}; then
if [ "$(command -v failup)" = "failup" ]; then
ebegin "Running failup"
eindent
failup
eoutdent
fi
return 1
fi
local hideFirstroute=false first=true routes=
if ${fallback}; then
routes="$(_get_array "fallback_routes_${IFVAR}")"
fi
if [ -z "${routes}" ]; then
routes="$(_get_array "routes_${IFVAR}")"
fi
if [ "${IFACE}" = "lo" -o "${IFACE}" = "lo0" ]; then
if [ "${config_0}" != "null" ]; then
routes="127.0.0.0/8 via 127.0.0.1
${routes}"
hideFirstroute=true
fi
fi
local OIFS="${IFS}" SIFS="${IFS-y}"
local IFS="$__IFS"
local fam
for cmd in ${routes}; do
unset IFS
if ${first}; then
first=false
einfo "Adding routes"
fi
case ${cmd} in
-6" "*) fam="-6"; cmd=${cmd#-6 };;
-4" "*) fam="-4"; cmd=${cmd#-4 };;
esac
eindent
ebegin ${cmd}
# Work out if we're a host or a net if not told
case ${cmd} in
-net" "*|-host" "*);;
*" "netmask" "*) cmd="-net ${cmd}";;
*.*.*.*/32*) cmd="-host ${cmd}";;
*.*.*.*/*|0.0.0.0|0.0.0.0" "*) cmd="-net ${cmd}";;
default|default" "*) cmd="-net ${cmd}";;
*:*/128*) cmd="-host ${cmd}";;
*:*/*) cmd="-net ${cmd}";;
*) cmd="-host ${cmd}";;
esac
if ${hideFirstroute}; then
_add_route ${fam} ${cmd} >/dev/null 2>&1
hideFirstroute=false
else
_add_route ${fam} ${cmd} >/dev/null
fi
eend $?
eoutdent
done
if [ "${SIFS}" = "y" ]; then
unset IFS
else
IFS="${OIFS}"
fi
for module in ${MODULES}; do
if [ "$(command -v "${module}_post_start")" = "${module}_post_start" ]; then
${module}_post_start || exit $?
fi
done
if [ "$(command -v postup)" = "postup" ]; then
ebegin "Running postup"
eindent
postup
eoutdent
fi
return 0
}
stop()
{
# Don't stop the network at shutdown.
# We don't use the noshutdown keyword so that we are started again
# correctly if we go back to multiuser.
yesno ${keep_network:-YES} && yesno $RC_GOINGDOWN && return 0
local IFACE=${RC_SVCNAME#*.} module=
local IFVAR=$(shell_var "${IFACE}") opts=
einfo "Bringing down interface ${IFACE}"
eindent
if [ -z "${MODULES}" ]; then
local MODULES=
_load_modules false
fi
if [ "$(command -v predown)" = "predown" ]; then
ebegin "Running predown"
eindent
predown || return 1
eoutdent
else
if is_net_fs /; then
eerror "root filesystem is network mounted -- can't stop ${IFACE}"
return 1
fi
fi
for module in ${MODULES}; do
if [ "$(command -v "${module}_pre_stop")" = "${module}_pre_stop" ]; then
${module}_pre_stop || exit $?
fi
done
for module in ${MODULES}; do
if [ "$(command -v "${module}_stop")" = "${module}_stop" ]; then
${module}_stop
fi
done
# Only delete addresses for interfaces that exist
if _exists; then
# PPP can manage it's own addresses when IN_BACKGROUND
# Important in case "demand" set on the ppp link
if ! (yesno ${IN_BACKGROUND} && is_ppp) ; then
_delete_addresses "${IFACE}"
fi
fi
for module in ${MODULES}; do
if [ "$(command -v "${module}_post_stop")" = "${module}_post_stop" ]; then
${module}_post_stop
fi
done
# If not in background, and not loopback then bring the interface down
# unless overridden.
if ! yesno ${IN_BACKGROUND} && \
[ "${IFACE}" != "lo" -a "${IFACE}" != "lo0" ]; then
eval module=\$ifdown_${IFVAR}
module=${module:-${ifdown:-YES}}
yesno ${module} && _down 2>/dev/null
fi
type resolvconf >/dev/null 2>&1 && resolvconf -d "${IFACE}" 2>/dev/null
if [ "$(command -v "postdown")" = "postdown" ]; then
ebegin "Running postdown"
eindent
postdown
eoutdent
fi
return 0
}

1
mk/net.mk Normal file
View File

@ -0,0 +1 @@
MKNET?= yes

2
net/.gitignore vendored
View File

@ -1,2 +0,0 @@
ifconfig.sh
iwconfig.sh

View File

@ -1,24 +0,0 @@
DIR= ${LIBEXECDIR}/net
SRCS= ifconfig.sh.in ${SRCS-${OS}}
INC= dhclient.sh dhcpcd.sh ifconfig.sh macchanger.sh macnet.sh \
ssidnet.sh system.sh wpa_supplicant.sh ${INC-${OS}}
MK= ../mk
include ${MK}/os.mk
SRCS-FreeBSD= iwconfig.sh.in
INC-FreeBSD= iwconfig.sh
SRCS-Linux= iwconfig.sh.in
INC-Linux= adsl.sh apipa.sh arping.sh bonding.sh br2684ctl.sh bridge.sh \
ccwgroup.sh clip.sh ethtool.sh iproute2.sh ifplugd.sh ip6to4.sh \
ipppd.sh iwconfig.sh netplugd.sh pppd.sh pump.sh tuntap.sh udhcpc.sh \
vlan.sh macvlan.sh ip6rd.sh firewalld.sh
SRCS-NetBSD=
INC-NetBSD= ifwatchd.sh
%.sh: %.sh${SFX}
${CP} $< $@
include ${MK}/scripts.mk

View File

@ -1,74 +0,0 @@
# Copyright (c) 2004-2007 Gentoo Foundation
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
adsl_depend()
{
program /usr/sbin/adsl-start /usr/sbin/pppoe-start
before dhcp
}
adsl_setup_vars()
{
local startstop="$1" cfgexe=
if [ -x /usr/sbin/pppoe-start ]; then
exe="/usr/sbin/pppoe-${startstop}"
cfgexe=pppoe-setup
else
exe="/usr/sbin/adsl-${startstop}"
cfgexe=adsl-setup
fi
# Decide which configuration to use. Hopefully there is an
# interface-specific one
cfgfile="/etc/ppp/pppoe-${IFACE}.conf"
[ -f "${cfgfile}" ] || cfgfile="/etc/ppp/pppoe.conf"
if [ ! -f "${cfgfile}" ]; then
eerror "no pppoe.conf file found!"
eerror "Please run ${cfgexe} to create one"
return 1
fi
return 0
}
adsl_start()
{
local exe= cfgfile= user=
adsl_setup_vars start || return 1
# Might or might not be set in conf.d/net
eval user=\$adsl_user_${IFVAR}
# Start ADSL with the cfgfile, but override ETH and PIDFILE
einfo "Starting ADSL for ${IFACE}"
(
cat "${cfgfile}";
echo "ETH=${IFACE}";
echo "PIDFILE=/var/run/rp-pppoe-${IFACE}.pid";
[ -n "${user}" ] && echo "USER=${user}";
) | ${exe} >/dev/null
eend $?
}
adsl_stop()
{
local exe= cfgfile=
[ ! -f /var/run/rp-pppoe-"${IFACE}".pid ] && return 0
adsl_setup_vars stop || return 1
einfo "Stopping ADSL for ${IFACE}"
(
cat "${cfgfile}";
echo "ETH=${IFACE}";
echo "PIDFILE=/var/run/rp-pppoe-${IFACE}.pid";
) | ${exe} >/dev/null
eend $?
return 0
}

View File

@ -1,48 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
apipa_depend()
{
program /sbin/arping
}
_random()
{
local r=${RANDOM} # checkbashisms: false positive, we handle it AFTERWARDS
if [ -n "${r}" ]; then
echo "${r}"
else
uuidgen | sed -n -e 's/[^[:digit:]]//g' -e 's/\(^.\{1,7\}\).*/\1/p'
fi
}
apipa_start()
{
local iface="$1" i1= i2= addr= i=0
_exists true || return 1
einfo "Searching for free addresses in 169.254.0.0/16"
eindent
while [ ${i} -lt 64516 ]; do
: $(( i1 = (_random % 255) + 1 ))
: $(( i2 = (_random % 255) + 1 ))
addr="169.254.${i1}.${i2}"
vebegin "${addr}/16"
if ! arping_address "${addr}"; then
eval config_${config_index}="\"${addr}/16 broadcast 169.254.255.255\""
: $(( config_index -= 1 ))
veend 0
eoutdent
return 0
fi
: $(( i += 1 ))
done
eerror "No free address found!"
eoutdent
return 1
}

View File

@ -1,131 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
arping_depend()
{
program /sbin/arping /usr/sbin/arping2
before interface
}
arping_address()
{
local ip=${1%%/*} mac="$2" spoof="$3" foundmac= i= w= opts=
# We only handle IPv4 addresses
case "${ip}" in
0.0.0.0|0) return 1;;
*.*.*.*);;
*) return 1;;
esac
# We need to bring the interface up to test
_exists "${iface}" || return 1
_up "${iface}"
eval w=\$arping_wait_${IFVAR}
[ -z "${w}" ] && w=${arping_wait:-5}
if type arping2 >/dev/null 2>&1; then
if [ -n "${spoof}" ]; then
opts="${opts} -S ${spoof}"
else
[ -z "$(_get_inet_address)" ] && opts="${opts} -0"
fi
while [ ${w} -gt 0 -a -z "${foundmac}" ]; do
foundmac="$(arping2 ${opts} -r -c 1 -i "${IFACE}" "${ip}" 2>/dev/null | \
sed -e 'y/abcdef/ABCDEF/')"
: $(( w -= 1 ))
done
else
[ -z "$(_get_inet_address)" ] && opts="${opts} -D"
foundmac="$(arping -w "${w}" ${opts} -f -I "${IFACE}" "${ip}" 2>/dev/null | \
sed -n -e 'y/abcdef/ABCDEF/' -e 's/[^[]*\[\([^]]*\)\].*/\1/p')"
fi
[ -z "${foundmac}" ] && return 1
if [ -n "${mac}" ]; then
if [ "${mac}" != "${foundmac}" ]; then
vewarn "Found ${ip} but MAC ${foundmac} does not match"
return 1
fi
fi
return 0
}
_arping_in_config()
{
_get_array "config_${IFVAR}" | while read i; do
[ "${i}" = "arping" ] && return 1
done
return 1
}
arping_start()
{
local gateways= x= conf= i=
einfo "Pinging gateways on ${IFACE} for configuration"
eval gateways=\$gateways_${IFVAR}
if [ -z "${gateways}" ]; then
eerror "No gateways have been defined (gateways_${IFVAR}=\"...\")"
return 1
fi
eindent
for x in ${gateways}; do
local IFS=,
set -- ${x}
local ip=$1 mac=$2 spoof=$3 extra=
unset IFS
if [ -n "${mac}" ]; then
mac="$(echo "${mac}" | tr '[:lower:]' '[:upper:]')"
extra="(MAC ${mac})"
fi
vebegin "${ip} ${extra}"
if arping_address "${ip}" "${mac}" "${spoof}"; then
local IFS=.
for i in ${ip}; do
if [ "${#i}" = "2" ]; then
conf="${conf}0${i}"
elif [ "${#i}" = "1" ]; then
conf="${conf}00${i}"
else
conf="${conf}${i}"
fi
done
unset IFS
[ -n "${mac}" ] && conf="${conf}_$(echo "${mac}" | sed -e 's/://g')"
eend 0
eoutdent
veinfo "Configuring ${IFACE} for ${ip} ${extra}"
_configure_variables ${conf}
# Call the system module as we've aleady passed it by ....
# And it *has* to be pre_start for other things to work correctly
system_pre_start
# Ensure that we have a valid config - ie arping is no longer there
local IFS="$__IFS"
for i in $(_get_array "config_${IFVAR}"); do
if [ "${i}" = "arping" ]; then
eend 1 "No config found for ${ip} (config_${conf}=\"...\")"
continue 2
fi
done
unset IFS
_load_config
return 0
fi
veend 1
done
eoutdent
return 1
}

View File

@ -1,223 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
bonding_depend()
{
before interface macchanger
program /sbin/ifconfig /bin/ifconfig
# If you do not have sysfs, you MUST have this binary instead for ioctl
# Also you will loose some functionality that cannot be done via sysfs:
if [ ! -d /sys/class/net ]; then
program /sbin/ifenslave
fi
}
_config_vars="$_config_vars slaves"
_is_bond()
{
[ -f "/proc/net/bonding/${IFACE}" ]
}
bonding_pre_start()
{
local x= s= n= slaves= primary=
slaves="$(_get_array "slaves_${IFVAR}")"
unset slaves_${IFVAR}
eval primary="\$primary_${IFVAR}"
unset primary_${IFVAR}
eval subsume="\$subsume_${IFVAR}"
unset subsume_${IFVAR}
[ -z "${slaves}" ] && return 0
# Load the kernel module if required
if [ ! -d /proc/net/bonding ]; then
if ! modprobe bonding; then
eerror "Cannot load the bonding module"
return 1
fi
fi
if [ ! -d /sys/class/net ]; then
ewarn "sysfs is not available! You will be unable to create new bonds, or change dynamic parameters!"
fi
# We can create the interface name we like now, but this
# requires sysfs
if ! _exists && [ -d /sys/class/net ]; then
echo "+${IFACE}" > /sys/class/net/bonding_masters
fi
_exists true || return 1
if ! _is_bond; then
eerror "${IFACE} is not capable of bonding"
return 1
fi
# Interface must be down in order to configure
_down
# Configure the bond mode & link monitoring, then we can reloop to ensure
# we configure all other options
# mode needs to be done before all other options.
# miimon needs to be done BEFORE downdelay
[ -d /sys/class/net ] && for n in mode miimon; do
x=/sys/class/net/"${IFACE}"/bonding/$n
[ -f "${x}" ] || continue
eval s=\$${n}_${IFVAR}
if [ -n "${s}" ]; then
einfo "Setting ${n}: ${s}"
echo "${s}" >"${x}" || \
eerror "Failed to configure $n (${n}_${IFVAR})"
fi
done
# Nice and dynamic for remaining options:)
[ -d /sys/class/net ] && for x in /sys/class/net/"${IFACE}"/bonding/*; do
[ -f "${x}" ] || continue
n=${x##*/}
eval s=\$${n}_${IFVAR}
# skip mode and miimon
[ "${n}" == "mode" -o "${n}" == "miimon" ] && continue
if [ -n "${s}" ]; then
einfo "Setting ${n}: ${s}"
echo "${s}" >"${x}" || \
eerror "Failed to configure $n (${n}_${IFVAR})"
fi
done
ebegin "Adding slaves to ${IFACE}"
eindent
einfo "${slaves}"
# Check that our slaves exist
(
for IFACE in ${slaves}; do
_exists true || return 1
done
# Unless we are subsuming an existing interface (NFS root), we down
# slave interfaces to work around bugs supposedly in some chipsets
# that cause failure to enslave from other states.
if [ -z "${subsume}" ]; then
for IFACE in ${slaves}; do
_delete_addresses
_down
done
fi
)
# Now force the master to up
# - First test for interface subsume request (required for NFS root)
if [ -n "${subsume}" ]; then
einfo "Subsuming ${subsume} interface characteristics."
eindent
local oiface=${IFACE}
IFACE=${subsume}
local addr="$(_get_inet_address)"
einfo "address: ${addr}"
IFACE=${oiface}
unset oiface
eoutdent
# subsume (presumably kernel auto-)configured IP
ifconfig ${IFACE} ${addr} up
else
# warn if root on nfs and no subsume interface supplied
local root_fs_type=$(mountinfo -s /)
if [ "${root_fs_type}" = "nfs" ]; then
warn_nfs=1
ewarn "NFS root detected!!!"
ewarn " If your system crashes here, /etc/conf.d/net needs"
ewarn " subsume_${IFACE}=\"<iface>\" ... where <iface> is the"
ewarn " existing, (usually kernel auto-)configured interface."
fi
# up the interface
_up
fi
# finally add in slaves
# things needed in the process, and if they are done by ifenslave, openrc, and/or the kernel.
# down new slave interface: ifenslave, openrc
# set mtu: ifenslave, kernel
# set slave MAC: ifenslave, kernel
eoutdent
if [ -d /sys/class/net ]; then
sys_bonding_path=/sys/class/net/"${IFACE}"/bonding
local oiface
oiface=$IFACE
if [ -n "${primary}" ]; then
IFACE=$primary
_down
IFACE=$oiface
echo "+${primary}" >$sys_bonding_path/slaves
echo "${primary}" >$sys_bonding_path/primary
fi
for s in ${slaves}; do
[ "${s}" = "${primary}" ] && continue
if ! grep -q ${s} $sys_bonding_path/slaves; then
IFACE=$s
_down
IFACE=$oiface
echo "+${s}" >$sys_bonding_path/slaves
fi
done
else
ifenslave "${IFACE}" ${slaves} >/dev/null
fi
eend $?
return 0 #important
}
bonding_stop()
{
_is_bond || return 0
# Wipe subsumed interface
if [ -n "${subsume}" ]; then
ifconfig ${subsume} 0.0.0.0
fi
local slaves= s=
slaves=$( \
sed -n -e 's/^Slave Interface: //p' "/proc/net/bonding/${IFACE}" \
| tr '\n' ' ' \
)
[ -z "${slaves}" ] && return 0
# remove all slaves
ebegin "Removing slaves from ${IFACE}"
eindent
einfo "${slaves}"
eoutdent
if [ -d /sys/class/net ]; then
for s in ${slaves}; do
echo -"${s}" > /sys/class/net/"${IFACE}"/bonding/slaves
done
else
ifenslave -d "${IFACE}" ${slaves}
fi
# reset all slaves
(
for IFACE in ${slaves}; do
if _exists; then
_delete_addresses
_down
fi
done
)
_down
if [ -d /sys/class/net ]; then
echo "-${IFACE}" > /sys/class/net/bonding_masters
fi
eend 0
return 0
}

View File

@ -1,50 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
br2684ctl_depend()
{
before ppp
program start br2684ctl
}
_config_vars="$_config_vars bridge bridge_add brctl"
br2684ctl_pre_start()
{
local opts=
eval opts=\$br2684ctl_${IFVAR}
[ -z "${opts}" ] && return 0
if [ "${IFACE#nas[0-9]*}" = "${IFACE}" ]; then
eerror "Interface must be called nas[0-9] for RFC 2684 Bridging"
return 1
fi
case " ${opts} " in
*" -b "*|*" -c "*)
eerror "The -b and -c options are not allowed for br2684ctl_${IVAR}"
return 1
;;
*" -a "*);;
*)
eerror "-a option (VPI and VCI) is required in br2684ctl_${IFVAR}"
return 1
;;
esac
einfo "Starting RFC 2684 Bridge control on ${IFACE}"
start-stop-daemon --start --exec $(_which br2684ctl) --background \
--make-pidfile --pidfile "/var/run/br2684ctl-${IFACE}.pid" \
-- -c "${IFACE#nas*}" ${opts}
eend $?
}
br2684ctl_post_stop()
{
local pidfile="/var/run/br2684ctl-${IFACE}.pid"
[ -e "${pidfile}" ] || return 0
einfo "Stopping RFC 2684 Bridge control on ${IFACE}"
start-stop-daemon --stop --quiet --pidfile "${pidfile}"
eend $?
}

View File

@ -1,190 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
bridge_depend()
{
before interface macnet
program brctl
}
_config_vars="$_config_vars bridge bridge_add brctl"
_is_bridge()
{
[ -d /sys/class/net/"${1:-${IFACE}}"/bridge ]
return $?
}
_is_bridge_port()
{
[ -d /sys/class/net/"${1:-${IFACE}}"/brport ]
return $?
}
_bridge_ports()
{
for x in /sys/class/net/"${1:-${IFACE}}"/brif/*; do
n=${x##*/}
echo $n
done
}
bridge_pre_start()
{
local brif= oiface="${IFACE}" e= x=
# ports is for static add
local ports="$(_get_array "bridge_${IFVAR}")"
# old config options
local opts="$(_get_array "brctl_${IFVAR}")"
# brif is used for dynamic add
eval brif=\$bridge_add_${IFVAR}
# we need a way to if the bridge exists in a variable name, not just the
# contents of a variable. Eg if somebody has only bridge_add_eth0='br0',
# with no other lines mentioning br0.
eval bridge_unset=\${bridge_${IFVAR}-y\}
eval brctl_unset=\${brctl_${IFVAR}-y\}
if [ -z "${brif}" -a "${brctl_unset}" = 'y' ]; then
if [ -z "${ports}" -a "${bridge_unset}" = "y" ]; then
#eerror "Misconfigured static bridge detected (see net.example)"
return 0
fi
fi
# If the bridge was already up, we should clear it
[ "${bridge_unset}" != "y" ] && bridge_post_stop
(
# Normalize order of variables
if [ -z "${ports}" -a -n "${brif}" ]; then
# Dynamic mode detected
ports="${IFACE}"
IFACE="${brif}"
IFVAR=$(shell_var "${IFACE}")
else
# Static mode detected
ports="${ports}"
metric=1000
fi
if ! _is_bridge ; then
ebegin "Creating bridge ${IFACE}"
if ! brctl addbr "${IFACE}"; then
eend 1
return 1
fi
fi
# TODO: does this reset the bridge every time we add a interface to the
# bridge? We should probably NOT do that.
# Old configuration set mechanism
# Only a very limited subset of the options are available in the old
# configuration method. The sysfs interface is in the next block instead.
local IFS="$__IFS"
for x in ${opts}; do
unset IFS
set -- ${x}
x=$1
shift
set -- "${x}" "${IFACE}" "$@"
brctl "$@"
done
unset IFS
# New configuration set mechanism, matches bonding
for x in /sys/class/net/"${IFACE}"/bridge/*; do
[ -f "${x}" ] || continue
n=${x##*/}
eval s=\$${n}_${IFVAR}
if [ -n "${s}" ]; then
einfo "Setting ${n}: ${s}"
echo "${s}" >"${x}" || \
eerror "Failed to configure $n (${n}_${IFVAR})"
fi
done
if [ -n "${ports}" ]; then
einfo "Adding ports to ${IFACE}"
eindent
local BR_IFACE="${IFACE}"
for x in ${ports}; do
ebegin "${x}"
local IFACE="${x}"
local IFVAR=$(shell_var "${IFACE}")
if ! _exists "${IFACE}" ; then
eerror "Cannot add non-existent interface ${IFACE} to ${BR_IFACE}"
return 1
fi
# The interface is known to exist now
_up
if ! brctl addif "${BR_IFACE}" "${x}"; then
eend 1
return 1
fi
# Per-interface bridge settings
for x in /sys/class/net/"${IFACE}"/brport/*; do
[ -f "${x}" ] || continue
n=${x##*/}
eval s=\$${n}_${IFVAR}
if [ -n "${s}" ]; then
einfo "Setting ${n}@${IFACE}: ${s}"
echo "${s}" >"${x}" || \
eerror "Failed to configure $n (${n}_${IFVAR})"
fi
done
eend 0
done
eoutdent
fi
) || return 1
# Bring up the bridge
_set_flag promisc
_up
}
bridge_post_stop()
{
local port= ports= delete=false extra=
if _is_bridge "${IFACE}"; then
ebegin "Destroying bridge ${IFACE}"
_down
for x in /sys/class/net/"${IFACE}"/brif/*; do
[ -s $x ] || continue
n=${x##*/}
ports="${ports} ${n}"
done
delete=true
iface=${IFACE}
eindent
else
# We are taking down an interface that is part of a bridge maybe
ports="${IFACE}"
local brport_dir="/sys/class/net/${IFACE}/brport"
[ -d ${brport_dir} ] || return 0
iface=$(readlink ${brport_dir}/bridge)
iface=${iface##*/}
[ -z "${iface}" ] && return 0
extra=" from ${iface}"
fi
for port in ${ports}; do
ebegin "Removing port ${port}${extra}"
local IFACE="${port}"
_set_flag -promisc
brctl delif "${iface}" "${port}"
eend $?
done
if ${delete}; then
eoutdent
brctl delbr "${iface}"
eend $?
fi
return 0
}

View File

@ -1,106 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
_config_vars="$_config_vars ccwgroup"
ccwgroup_depend()
{
before interface
}
ccwgroup_load_modules()
{
# make sure we have ccwgroup support or this is a crap shoot
if [ ! -d /sys/bus/ccwgroup ] ; then
modprobe -q ccwgroup
if [ ! -d /sys/bus/ccwgroup ] ; then
eerror "ccwgroup support missing in kernel"
return 1
fi
fi
# verify the specific interface is supported
if [ ! -d /sys/bus/ccwgroup/drivers/$1 ] ; then
modprobe $1 >/dev/null 2>&1
if [ ! -d /sys/bus/ccwgroup/drivers/$1 ] ; then
eerror "$1 support missing in kernel"
return 1
fi
fi
return 0
}
ccwgroup_pre_start()
{
local ccwgroup="$(_get_array "ccwgroup_${IFVAR}")"
[ -z "${ccwgroup}" ] && return 0
local ccw_type
eval ccw_type=\${ccwgroup_type_${IFVAR}:-qeth}
ccwgroup_load_modules ${ccw_type} || return 1
einfo "Enabling ccwgroup/${ccw_type} on ${IFACE}"
set -- ${ccwgroup}
local first=$1; shift
if [ -e /sys/devices/${ccw_type}/${first}/online ]; then
echo "0" >/sys/devices/${ccw_type}/${first}/online
else
echo "${first}$(printf ',%s' "$@")" >/sys/bus/ccwgroup/drivers/${ccw_type}/group
fi
local var val
for var in $(_get_array "ccwgroup_opts_${IFVAR}") online=1 ; do
val=${var#*=}
var=${var%%=*}
echo "${val}" > /sys/devices/${ccw_type}/${first}/${var}
done
eend $?
# Now that we've properly configured the device, we can run
# bring the interface up. Common code tried to do this already,
# but it failed because we didn't setup sysfs yet.
_up
}
ccwgroup_pre_stop()
{
local path="/sys/class/net/${IFACE}"
# Erase any existing ccwgroup to be safe
service_set_value ccwgroup_device ""
service_set_value ccwgroup_type ""
[ ! -L "${path}"/device/driver ] && return 0
case "$(readlink "${path}"/device/driver)" in
*/bus/ccwgroup/*) ;;
*) return 0;;
esac
local device
device="$(readlink "${path}"/device)"
device=${device##*/}
service_set_value ccwgroup_device "${device}"
device="$(readlink "${path}"/device/driver)"
device=${device##*/}
service_set_value ccwgroup_type "${device}"
}
ccwgroup_post_stop()
{
local device="$(service_get_value ccwgroup_device)"
[ -z "${device}" ] && return 0
local ccw_type="$(service_get_value ccwgroup_type)"
local path="/sys/devices/${ccw_type}/${device}"
einfo "Disabling ccwgroup/${ccw_type} on ${IFACE}"
if echo "0" >"${path}"/online &&
echo "1" >"${path}"/ungroup ; then
# The device doesn't disappear right away which breaks
# restart, or a quick start up, so wait around.
while [ -e "${path}" ] ; do :; done
fi
eend $?
}

View File

@ -1,221 +0,0 @@
# Copyright (c) 2005-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
clip_depend()
{
program /usr/sbin/atmsigd
before interface
}
_config_vars="$_config_vars clip"
# This starts a service. Albeit atmsigd, ilmid and atmarpd do allow for back-
# grounding through the -b option, its usage causes them to be sensible to
# SIGHUP, which is sent to all daemons when console detaches right after
# startup. This is probably due to the fact that these programs don't detach
# themself from the controlling terminal when backgrounding... The only way I
# see to overcame this is to use the --background option in start-stop-daemon,
# which is reported as a "last resort" method, but it acts correctly about this.
atmclip_svc_start()
{
ebegin "Starting $2 Daemon ($1)"
start-stop-daemon --start \
--background \
--make-pidfile --pidfile "/var/run/$1.pid" \
--exec "/usr/sbin/$1" -- -l syslog
eend $?
}
atmclip_svcs_start()
{
einfo "First CLIP instance: starting ATM CLIP daemons"
eindent
if yesno ${clip_full:-yes}; then
atmclip_svc_start atmsigd "Signaling" && \
atmclip_svc_start ilmid "Integrated Local Management Interface" && \
atmclip_svc_start atmarpd "Address Resolution Protocol"
else
atmclip_svc_start atmarpd "Address Resolution Protocol"
fi
local r=$?
eoutdent
return ${r}
}
atmclip_svc_stop()
{
ebegin "Stopping $2 Daemon ($1)"
start-stop-daemon --stop --quiet \
--pidfile "/var/run/$1.pid" \
--exec "/usr/sbin/$1"
eend $?
}
atmclip_svcs_stop()
{
einfo "Last CLIP instance: stopping ATM CLIP daemons"
eindent
# Heartake operation!
sync
atmclip_svc_stop atmarpd "Address Resolution Protocol"
if yesno ${clip_full:-yes}; then
atmclip_svc_stop ilmid "Integrated Local Management Interface"
atmclip_svc_stop atmsigd "Signaling"
fi
eoutdent
}
are_atmclip_svcs_running()
{
start-stop-daemon --quiet --test --stop --pidfile /var/run/atmarpd.pid || return 1
if yesno ${clip_full:-yes}; then
start-stop-daemon --quiet --test --stop --pidfile /var/run/ilmid.pid || return 1
start-stop-daemon --quiet --test --stop --pidfile /var/run/atmsigd.pid || return 1
fi
return 0
}
clip_pre_start()
{
local clip=
eval clip=\$clip_${IFVAR}
[ -z "${clip}" ] && return 0
if [ ! -r /proc/net/atm/arp ]; then
modprobe clip && sleep 2
if [ ! -r /proc/net/atm/arp ]; then
eerror "You need first to enable kernel support for ATM CLIP"
return 1
fi
fi
local started_here=
if ! are_atmclip_svcs_running; then
atmclip_svcs_start || return 1
started_here=1
fi
if ! _exists; then
ebegin "Creating CLIP interface ${IFACE}"
atmarp -c "${IFACE}"
if ! eend $?; then
[ -z "${started_here}" ] && atmclip_svcs_stop
return 1
fi
fi
return 0
}
clip_post_start()
{
local clip="$(_get_array "clip_${IFVAR}")"
[ -z "${clip}" ] && return 0
are_atmclip_svcs_running || return 1
# The atm tools (atmarpd?) are silly enough that they would not work with
# iproute2 interface setup as opposed to the ifconfig one.
# The workaround is to temporarily toggle the interface state from up
# to down and then up again, without touching its address. This (should)
# work with both iproute2 and ifconfig.
_down
_up
# Now the real thing: create a PVC with our peer(s).
# There are cases in which the ATM interface is not yet
# ready to establish new VCCs. In that cases, atmarp would
# fail. Here we allow 10 retries to happen every 2 seconds before
# reporting problems. Also, when no defined VC can be established,
# we stop the ATM daemons.
local has_failures= i=
for i in ${clip}; do
local IFS=","
set -- ${i}
unset IFS
local peerip="$1"; shift
local ifvpivci="$1"; shift
ebegin "Creating PVC ${ifvpivci} for peer ${peerip}"
local nleftretries=10 emsg= ecode=
while [ ${nleftretries} -gt 0 ]; do
: $(( nleftretries -= 1 ))
emsg="$(atmarp -s "${peerip}" "${ifvpivci}" "$@" 2>&1)"
ecode=$? && break
sleep 2
done
if ! eend ${ecode}; then
eerror "Creation failed for PVC ${ifvpivci}: ${emsg}"
has_failures=1
fi
done
if [ -n "${has_failures}" ]; then
clip_pre_stop "${iface}"
clip_post_stop "${iface}"
return 1
else
return 0
fi
}
clip_pre_stop()
{
are_atmclip_svcs_running || return 0
# We remove all the PVCs which may have been created by
# clip_post_start for this interface. This shouldn't be
# needed by the ATM stack, but sometimes I got a panic
# killing CLIP daemons without previously vacuuming
# every active CLIP PVCs.
# The linux 2.6's ATM stack is really a mess...
local itf= t= encp= idle= ipaddr= left=
einfo "Removing PVCs on this interface"
eindent
{
read left && \
while read itf t encp idle ipaddr left; do
if [ "${itf}" = "${IFACE}" ]; then
ebegin "Removing PVC to ${ipaddr}"
atmarp -d "${ipaddr}"
eend $?
fi
done
} < /proc/net/atm/arp
eoutdent
}
# Here we should teorically delete the interface previously created in the
# clip_pre_start function, but there is no way to "undo" an interface creation.
# We can just leave the interface down. "ifconfig -a" will still list it...
# Also, here we can stop the ATM CLIP daemons if there is no other CLIP PVC
# outstanding. We check this condition by inspecting the /proc/net/atm/arp file.
clip_post_stop()
{
are_atmclip_svcs_running || return 0
local itf= left= hasothers=
{
read left && \
while read itf left; do
if [ "${itf}" != "${IFACE}" ]; then
hasothers=1
break
fi
done
} < /proc/net/atm/arp
if [ -z "${hasothers}" ]; then
atmclip_svcs_stop || return 1
fi
}

View File

@ -1,76 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
dhclient_depend()
{
after interface
program start /sbin/dhclient
provide dhcp
}
_config_vars="$_config_vars dhcp dhcpcd"
dhclient_start()
{
local args= opt= opts= pidfile="/var/run/dhclient-${IFACE}.pid"
local sendhost=true dconf=
# Get our options
# These options only work in Gentoo, and maybe RedHat
eval args=\$dhclient_${IFVAR}
eval opts=\$dhcp_${IFVAR}
[ -z "${opts}" ] && opts=${dhcp}
for opt in ${opts}; do
case "${opt}" in
nodns) args="${args} -e PEER_DNS=no";;
nontp) args="${args} -e PEER_NTP=no";;
nogateway) args="${args} -e PEER_ROUTERS=no";;
nosendhost) sendhost=false;;
esac
done
# Add our route metric
[ "${metric:-0}" != "0" ] && args="${args} -e IF_METRIC=${metric}"
if ${sendhost}; then
local hname="$(hostname)"
if [ "${hname}" != "(none)" -a "${hname}" != "localhost" ]; then
dhconf="${dhconf} interface \"${IFACE}\" {"
dhconf="${dhconf} send host-name \"${hname}\";"
dhconf="${dhconf}}"
fi
fi
# Bring up DHCP for this interface
ebegin "Running dhclient"
echo "${dhconf}" | start-stop-daemon --start --exec /sbin/dhclient \
--pidfile "${pidfile}" \
-- ${args} -q -1 -pf "${pidfile}" "${IFACE}"
eend $? || return 1
_show_address
return 0
}
dhclient_stop()
{
local pidfile="/var/run/dhclient-${IFACE}.pid" opts=
[ ! -f "${pidfile}" ] && return 0
# Get our options
if [ -x /sbin/dhclient ]; then
eval opts=\$dhcp_${IFVAR}
[ -z "${opts}" ] && opts=${dhcp}
fi
ebegin "Stopping dhclient on ${IFACE}"
case " ${opts} " in
*" release "*) dhclient -q -r -pf "${pidfile}" "${IFACE}";;
*)
start-stop-daemon --stop --quiet \
--exec /sbin/dhclient --pidfile "${pidfile}"
;;
esac
eend $?
}

View File

@ -1,88 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
dhcpcd_depend()
{
after interface
program start dhcpcd
provide dhcp
# We prefer dhcpcd over the others
after dhclient pump udhcpc
}
_config_vars="$_config_vars dhcp dhcpcd"
dhcpcd_start()
{
local args= opt= opts= pidfile="/var/run/dhcpcd-${IFACE}.pid" new=true
eval args=\$dhcpcd_${IFVAR}
[ -z "${args}" ] && args=${dhcpcd}
# Get our options
eval opts=\$dhcp_${IFVAR}
[ -z "${opts}" ] && opts=${dhcp}
case "$(dhcpcd --version)" in
"dhcpcd "[123]*) new=false;;
esac
# Map some generic options to dhcpcd
for opt in ${opts}; do
case "${opt}" in
nodns)
if ${new}; then
args="${args} -C resolv.conf"
else
args="${args} -R"
fi
;;
nontp)
if ${new}; then
args="${args} -C ntp.conf"
else
args="${args} -N"
fi
;;
nonis)
if ${new}; then
args="${args} -C yp.conf"
else
args="${args} -Y"
fi
;;
nogateway) args="${args} -G";;
nosendhost) args="${args} -h ''";
esac
done
# Add our route metric if not given
case " $args " in
*" -m "*) ;;
*) [ "${metric:-0}" != 0 ] && args="$args -m $metric";;
esac
# Bring up DHCP for this interface
ebegin "Running dhcpcd"
eval dhcpcd "${args}" "${IFACE}"
eend $? || return 1
_show_address
return 0
}
dhcpcd_stop()
{
local pidfile="/var/run/dhcpcd-${IFACE}.pid" opts= sig=SIGTERM
[ ! -f "${pidfile}" ] && return 0
ebegin "Stopping dhcpcd on ${IFACE}"
eval opts=\$dhcp_${IFVAR}
[ -z "${opts}" ] && opts=${dhcp}
case " ${opts} " in
*" release "*) sig=SIGHUP;;
esac
start-stop-daemon --stop --quiet --signal ${sig} --pidfile "${pidfile}"
eend $?
}

View File

@ -1,52 +0,0 @@
# Copyright (c) 2011 by Gentoo Foundation
# Released under the 2-clause BSD license.
ethtool_depend()
{
program ethtool
before interface
}
# This is just to trim whitespace, do not add any quoting!
_trim() {
echo $*
}
ethtool_pre_start() {
local order opt OFS="${OIFS}"
eval order=\$ethtool_order_${IFVAR}
[ -z "${order}" ] && eval order=\$ethtool_order
[ -z "${order}" ] && order="flash change-eeprom change pause coalesce ring offload identify nfc rxfh-indir ntuple"
# ethtool options not used: --driver, --register-dump, --eeprom-dump, --negotiate, --test, --statistics
eindent
for opt in ${order} ; do
local args
eval args=\$ethtool_$(echo $opt | tr - _)_${IFVAR}
# Skip everything if no arguments
[ -z "${args}" ] && continue
# Split on \n
OIFS="${IFS}"
local IFS="$__IFS"
for p in ${args} ; do
IFS="${OIFS}"
local args_pretty="$(_trim "${p}")"
# Do nothing if empty
[ -z "${args_pretty}" ] && continue
[ "${opt}" = "ring" ] && opt="set-ring"
args_pretty="--${opt} $IFACE ${args_pretty}"
args="--${opt} $IFACE ${args}"
ebegin "ethtool ${args_pretty}"
ethtool ${args}
rc=$?
eend $rc "ethtool exit code $rc"
# TODO: ethtool has MANY different exit codes, with no
# documentation as to which ones are fatal or not. For now we
# simply print the exit code and don't stop the start sequence.
done
IFS="${OIFS}"
done
eoutdent
}

View File

@ -1,38 +0,0 @@
# Copyright (c) 2012 Doug Goldstein <cardoe@cardoe.com>
# Released under the 2-clause BSD license.
firewalld_depend()
{
after interface
before dhcp
program firewall-cmd
[ "$IFACE" != "lo" ] && need firewalld
}
_config_vars="$_config_vars firewalld_zone"
firewalld_post_start()
{
local firewalld_zone=
eval firewalld_zone=\$firewalld_zone_${IFVAR}
_exists || return 0
if [ "${IFACE}" != "lo" ]; then
firewall-cmd --zone="${firewalld_zone}" \
--change-interface="${IFACE}" > /dev/null 2>&1
fi
return 0
}
firewalld_pre_stop()
{
_exists || return 0
if [ "${IFACE}" != "lo" ]; then
firewall-cmd --remove-interface="${IFACE}" > /dev/null 2>&1
fi
return 0
}

View File

@ -1,264 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
ifconfig_depend()
{
program /sbin/ifconfig
provide interface
}
_exists()
{
# Only FreeBSD sees to have /dev/net .... is there something
# other than ifconfig we can use for the others?
if [ -d /dev/net ]; then
[ -e /dev/net/"${IFACE}" ]
else
ifconfig "${IFACE}" >/dev/null 2>&1
fi
}
_up()
{
ifconfig "${IFACE}" up
}
_down()
{
ifconfig "${IFACE}" down
}
_ifindex()
{
local x= i=1
case "${RC_UNAME}" in
FreeBSD|DragonFly)
for x in /dev/net[0-9]*; do
if [ "${x}" -ef /dev/net/"${IFACE}" ]; then
echo "${x#/dev/net}"
return 0
fi
: $(( i += 1 ))
done
;;
default)
for x in $(ifconfig -l); do
if [ "${x}" = "${IFACE}" ]; then
echo "${i}"
return 0
fi
: $(( i += 1 ))
done
;;
esac
# Return the next available index
echo "${i}"
return 1
}
_ifconfig_ent()
{
LC_ALL=C ifconfig "${IFACE}" 2>/dev/null | while read ent rest; do
case "${ent}" in
$1) echo "${rest}";;
esac
done
}
_get_mac_address()
{
local ent="ether"
case "${RC_UNAME}" in
NetBSD|OpenBSD) ent="address:";;
esac
case $(_ifconfig_ent "${ent}") in
00:00:00:00:00:00);;
44:44:44:44:44:44);;
FF:FF:FF:FF:FF:FF);;
"") return 1;;
*) echo "${address}";;
esac
return 0;
}
_is_wireless()
{
case "$(_ifconfig_ent "media:")" in
IEEE802.11*|"IEEE 802.11 Wireless"*) return 0;;
*) return 1;;
esac
}
_get_inet_address()
{
local inet= address= n= netmask= rest=
LC_ALL=C ifconfig "${IFACE}" | while read inet address n netmask rest; do
if [ "${inet}" = "inet" ]; then
echo "${address}/$(_netmask2cidr "${netmask}")"
return 0
fi
done
}
_add_address()
{
local inet6=
case "$@" in
*:*) inet6=inet6;;
esac
if [ "${metric:-0}" != "0" ]; then
set -- "$@" metric ${metric}
fi
# ifconfig doesn't like CIDR addresses
case "${RC_UNAME}" in
OpenBSD)
local ip="${1%%/*}" cidr="${1##*/}" netmask=
if [ -n "${cidr}" -a "${cidr}" != "${ip}" ]; then
netmask="$(_cidr2netmask "${cidr}")"
shift
set -- "${ip}" netmask "${netmask}" "$@"
fi
;;
esac
ifconfig "${IFACE}" ${inet6} "$@" alias
}
_add_route()
{
if [ $# -gt 3 ]; then
if [ "$3" = "gw" -o "$3" = "via" ]; then
local one=$1 two=$2
shift; shift; shift
set -- "${one}" "${two}" "$@"
fi
fi
case "$@" in
*:*) route add -inet6 "$@";;
*) route add "$@";;
esac
}
_delete_addresses()
{
einfo "Removing addresses"
eindent
LC_ALL=C ifconfig "${IFACE}" | while read inet address ali rest; do
case "${inet}" in
inet|inet6)
if [ "${address}" = "alias" ]; then
address="${ali}"
fi
case "${address}" in
*"%${IFACE}"|::1) continue;;
127.0.0.1) [ "${IFACE}" = "lo0" ] && continue;;
esac
einfo "${address}"
ifconfig "${IFACE}" "${inet}" "${address}" -alias
eend $?
;;
esac
done
eoutdent
return 0
}
_show_address()
{
einfo "received address $(_get_inet_address "${IFACE}")"
}
_has_carrier()
{
case "$(_ifconfig_ent "status:")" in
""|active|associated) return 0;;
*) return 1;;
esac
}
ifconfig_pre_start()
{
local config="$(_get_array "ifconfig_${IFVAR}")" conf= arg= args=
local IFS="$__IFS"
[ -z "${config}" ] && return 0
veinfo "Running ifconfig commands"
eindent
for conf in ${config}; do
unset IFS
args=
for arg in ${conf}; do
case ${arg} in
[Dd][Hh][Cc][Pp]);;
[Nn][Oo][Aa][Uu][Tt][Oo]);;
[Nn][Oo][Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp]);;
[Ss][Yy][Nn][Cc][Dd][Hh][Cc][Pp]);;
[Ww][Pp][Aa]);;
*) args="${args} ${arg}";;
esac
done
[ -z "${args}" ] && continue
vebegin "ifconfig${args}"
eval ifconfig "${IFACE}" "${args}"
veend $?
done
eoutdent
return 0
}
_ifconfig_ipv6_tentative()
{
local inet= address= rest=
LC_ALL=C ifconfig "${IFACE}" | while read inet address rest; do
case "${inet}" in
inet6)
case "${rest}" in
*" "tentative*) return 2;;
esac
;;
esac
done
[ $? = 2 ]
}
ifconfig_post_start()
{
if _ifconfig_ipv6_tentative; then
ebegin "Waiting for IPv6 addresses"
while true; do
_ifconfig_ipv6_tentative || break
done
eend 0
fi
}
# Is the interface administratively/operationally up?
# The 'UP' status in ifconfig is the administrative status
# Operational state does not seem to be available in BSD?
# 0: up
# 1: down
# 2: invalid arguments
is_admin_up()
{
local iface="$1"
[ -z "$iface" ] && iface="$IFACE"
ifconfig "${iface}" | \
sed -n '1,1{ /flags=.*[<,]UP[,>]/{ q 0 }}; q 1; '
}
is_oper_up()
{
eerror "TODO: is_oper_up not available on BSD"
return 2
}

View File

@ -1,328 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
ifconfig_depend()
{
program /sbin/ifconfig /bin/ifconfig
provide interface
}
_up()
{
ifconfig "${IFACE}" up
}
_down()
{
ifconfig "${IFACE}" down
}
_exists()
{
[ -e /sys/class/net/"$IFACE" ]
}
_ifindex()
{
local index=-1
local f v
if [ -e /sys/class/net/"${IFACE}"/ifindex ]; then
index=$(cat /sys/class/net/"${IFACE}"/ifindex)
else
for f in /sys/class/net/*/ifindex ; do
v=$(cat $f)
[ $v -gt $index ] && index=$v
done
: $(( index += 1 ))
fi
echo "${index}"
return 0
}
_is_wireless()
{
# Support new sysfs layout
[ -d /sys/class/net/"${IFACE}"/wireless -o \
-d /sys/class/net/"${IFACE}"/phy80211 ] && return 0
[ ! -e /proc/net/wireless ] && return 1
grep -Eq "^[[:space:]]*${IFACE}:" /proc/net/wireless
}
_set_flag()
{
ifconfig "${IFACE}" "$1"
}
_get_mac_address()
{
local mac=$(LC_ALL=C ifconfig "${IFACE}" | \
sed -n -e 's/.* \(HWaddr\|ether\) \(..:..:..:..:..:..\).*/\2/p')
case "${mac}" in
00:00:00:00:00:00);;
44:44:44:44:44:44);;
FF:FF:FF:FF:FF:FF);;
"");;
*) echo "${mac}"; return 0;;
esac
return 1
}
_set_mac_address()
{
ifconfig "${IFACE}" hw ether "$1"
}
_get_inet_address()
{
set -- $(LC_ALL=C ifconfig "${IFACE}" |
sed -n -e 's/.*\(inet addr:\|inet \)\([^ ]*\).*\(Mask:\|netmask \)\([^ ]*\).*/\2 \4/p')
[ -z "$1" ] && return 1
echo -n "$1"
shift
echo "/$(_netmask2cidr "$1")"
}
_get_inet_addresses()
{
local iface=${IFACE} i=0
local addrs="$(_get_inet_address)"
while true; do
local IFACE="${iface}:${i}"
_exists || break
local addr="$(_get_inet_address)"
[ -n "${addr}" ] && addrs="${addrs}${addrs:+ }${addr}"
: $(( i += 1 ))
done
echo "${addrs}"
}
_cidr2netmask()
{
local cidr="$1" netmask="" done=0 i=0 sum=0 cur=128
local octets= frac=
local octets=$(( cidr / 8 ))
local frac=$(( cidr % 8 ))
while [ ${octets} -gt 0 ]; do
netmask="${netmask}.255"
: $(( octets -= 1 ))
: $(( done += 1 ))
done
if [ ${done} -lt 4 ]; then
while [ ${i} -lt ${frac} ]; do
: $(( sum += cur ))
: $(( cur /= 2 ))
: $(( i += 1 ))
done
netmask="${netmask}.${sum}"
: $(( done += 1 ))
while [ ${done} -lt 4 ]; do
netmask="${netmask}.0"
: $(( done += 1 ))
done
fi
echo "${netmask#.*}"
}
_add_address()
{
if [ "$1" = "127.0.0.1/8" -a "${IFACE}" = "lo" ]; then
ifconfig "${IFACE}" "$@" 2>/dev/null
return 0
fi
case "$1" in
*:*) ifconfig "${IFACE}" inet6 add "$@"; return $?;;
esac
# IPv4 is tricky - ifconfig requires an aliased device
# for multiple addresses
local iface="${IFACE}"
if LC_ALL=C ifconfig "${iface}" | grep -Eq '\<inet (addr:)?.*'; then
# Get the last alias made for the interface and add 1 to it
i=$(ifconfig | sed '1!G;h;$!d' | grep -m 1 -o "^${iface}:[0-9]*" \
| sed -n -e 's/'"${iface}"'://p')
: $(( i = ${i:-0} + 1 ))
iface="${iface}:${i}"
fi
# ifconfig doesn't like CIDR addresses
local ip="${1%%/*}" cidr="${1##*/}" netmask=
if [ -n "${cidr}" -a "${cidr}" != "${ip}" ]; then
netmask="$(_cidr2netmask "${cidr}")"
shift
set -- "${ip}" netmask "${netmask}" "$@"
fi
local arg= cmd=
while [ -n "$1" ]; do
case "$1" in
brd)
if [ "$2" = "+" ]; then
shift
else
cmd="${cmd} broadcast"
fi
;;
peer) cmd="${cmd} pointopoint";;
*) cmd="${cmd} $1";;
esac
shift
done
ifconfig "${iface}" ${cmd}
}
_add_route()
{
local inet6= family=
if [ "$1" = "-A" -o "$1" = "-f" -o "$1" = "-family" ]; then
family="-A $2"
shift; shift
elif [ "$1" = "-4" ]; then
family="-A inet"
shift
elif [ "$1" = "-6" ]; then
family="-A inet6"
shift
fi
if [ -n "${metric}" ]; then
set -- "$@" metric ${metric}
fi
if [ $# -eq 3 ]; then
set -- "$1" "$2" gw "$3"
elif [ "$3" = "via" ]; then
local one=$1 two=$2
shift; shift; shift
set -- "${one}" "${two}" gw "$@"
fi
case "$@" in
*:*|default*) [ "$1" = "-net" -o "$1" = "-host" ] && shift;;
esac
route ${family} add "$@" dev "${IFACE}"
}
_delete_addresses()
{
# We don't remove addresses from aliases
case "${IFACE}" in
*:*) return 0;;
esac
einfo "Removing addresses"
eindent
# iproute2 can add many addresses to an iface unlike ifconfig ...
# iproute2 added addresses cause problems for ifconfig
# as we delete an address, a new one appears, so we have to
# keep polling
while true; do
local addr=$(_get_inet_address)
[ -z "${addr}" ] && break
if [ "${addr}" = "127.0.0.1/8" ]; then
# Don't delete the loopback address
[ "${IFACE}" = "lo" -o "${IFACE}" = "lo0" ] && break
fi
einfo "${addr}"
ifconfig "${IFACE}" 0.0.0.0 || break
done
# Remove IPv6 addresses
local addr=
for addr in $(LC_ALL=C ifconfig "${IFACE}" | \
sed -n -e 's/^.*\(inet6 addr:\|inet6\) \([^ ]*\) .*\(Scope:[^L]\|scopeid [^<]*<[^l]\).*/\2/p'); do
if [ "${IFACE}" = "lo" ]; then
case "${addr}" in
"::1/128"|"/128") continue;;
esac
fi
einfo "${addr}"
ifconfig "${IFACE}" inet6 del "${addr}"
done
return 0
}
_has_carrier()
{
return 0
}
_tunnel()
{
iptunnel "$@"
}
ifconfig_pre_start()
{
local tunnel=
eval tunnel=\$iptunnel_${IFVAR}
if [ -n "${tunnel}" ]; then
# Set our base metric to 1000
metric=1000
ebegin "Creating tunnel ${IFVAR}"
iptunnel add ${tunnel}
eend $? || return 1
_up
fi
# MTU support
local mtu=
eval mtu=\$mtu_${IFVAR}
[ -n "${mtu}" ] && ifconfig "${IFACE}" mtu "${mtu}"
# TX Queue Length support
local len=
eval len=\$txqueuelen_${IFVAR}
[ -n "${len}" ] && ifconfig "${IFACE}" txqueuelen "${len}"
return 0
}
ifconfig_post_stop()
{
# Don't delete sit0 as it's a special tunnel
[ "${IFACE}" = "sit0" ] && return 0
[ -z "$(iptunnel show "${IFACE}" 2>/dev/null)" ] && return 0
ebegin "Destroying tunnel ${IFACE}"
iptunnel del "${IFACE}"
eend $?
}
# Is the interface administratively/operationally up?
# The 'UP' status in ifconfig/iproute2 is the administrative status
# Operational state is available in iproute2 output as 'state UP', or the
# operstate sysfs variable.
# 0: up
# 1: down
# 2: invalid arguments
is_admin_up()
{
local iface="$1"
[ -z "$iface" ] && iface="$IFACE"
ifconfig "${iface}" | \
sed -n '1,1{ /flags=.*[<,]UP[,>]/{ q 0 }}; q 1; '
}
is_oper_up()
{
local iface="$1"
[ -z "$iface" ] && iface="$IFACE"
read state </sys/class/net/"${iface}"/operstate
[ "x$state" = "up" ]
}

View File

@ -1,94 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
_config_vars="$_config_vars plug_timeout"
ifplugd_depend()
{
program start /usr/sbin/ifplugd
after macnet rename
before interface
provide plug
}
ifplugd_pre_start()
{
local pidfile="/var/run/ifplugd.${IFACE}.pid" timeout= args=
# We don't start ifplugd if we're being called from the background
yesno ${IN_BACKGROUND} && return 0
_exists || return 0
# We need a valid MAC address
# It's a basic test to ensure it's not a virtual interface
if ! _get_mac_address >/dev/null 2>&1; then
vewarn "ifplugd only works on interfaces with a valid MAC address"
return 0
fi
# We don't work on bonded, bridges, tun/tap, vlan or wireless
for f in bond bridge tuntap vlan wireless; do
if type "_is_${f}" >/dev/null 2>&1; then
if _is_${f}; then
veinfo "ifplugd does not work with ${f}"
return 0
fi
fi
done
ebegin "Starting ifplugd on ${IFACE}"
eval args=\$ifplugd_${IFVAR}
# Mark the us as inactive so netplug can restart us
mark_service_inactive
# Start ifplugd
eval start-stop-daemon --start --exec /usr/sbin/ifplugd \
--pidfile "${pidfile}" -- "${args}" --iface="${IFACE}"
eend $? || return 1
eindent
# IFACE-specific, then global, then default
eval timeout=\$plug_timeout_${IFVAR}
[ -z "${timeout}" ] && timeout=$plug_timeout
[ -z "${timeout}" ] && timeout=-1
if [ ${timeout} -eq 0 ]; then
ewarn "WARNING: infinite timeout set for ${IFACE} to come up"
elif [ ${timeout} -lt 0 ]; then
einfo "Backgrounding ..."
exit 1
fi
veinfo "Waiting for ${IFACE} to be marked as started"
local i=0
while true; do
if service_started; then
_show_address
exit 0
fi
sleep 1
[ ${timeout} -eq 0 ] && continue
: $(( i += 1 ))
[ ${i} -ge ${timeout} ] && break
done
eend 1 "Failed to configure ${IFACE} in the background"
exit 1
}
ifplugd_stop()
{
yesno ${IN_BACKGROUND} && return 0
local pidfile="/var/run/ifplugd.${IFACE}.pid"
[ ! -e "${pidfile}" ] && return 0
ebegin "Stopping ifplugd on ${IFACE}"
start-stop-daemon --stop --quiet --exec /usr/sbin/ifplugd \
--pidfile "${pidfile}" --signal QUIT
eend $?
}

View File

@ -1,59 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
_config_vars="$_config_vars plug_timeout"
ifwatchd_depend()
{
program start /usr/sbin/ifwatchd
after macnet rename wireless
before interface
provide plug
}
ifwatchd_pre_start()
{
# We don't start ifwatchd if we're being called from the background
yesno ${IN_BACKGROUND} && return 0
_exists || return 0
# We need a valid MAC address
# It's a basic test to ensure it's not a virtual interface
if ! _get_mac_address >/dev/null 2>&1; then
vewarn "ifwatchd only works on interfaces with a valid MAC address"
return 0
fi
ebegin "Starting ifwatchd on ${IFACE}"
# Mark the us as inactive so ifwatchd can restart us
mark_service_inactive
# Start ifwatchd
IN_BACKGROUND=yes ; export IN_BACKGROUND
start-stop-daemon --start --exec /usr/sbin/ifwatchd \
-- -c "${RC_LIBEXECDIR}/sh/ifwatchd-carrier.sh" \
-n "${RC_LIBEXECDIR}/sh/ifwatchd-nocarrier.sh" "${IFACE}"
unset IN_BACKGROUND
eend "$?" || return 1
einfo "Backgrounding ..."
exit 1
}
ifwatchd_stop()
{
yesno ${IN_BACKGROUND} && return 0
start-stop-daemon --test --quiet --stop --exec /usr/sbin/ifwatchd \
-- -c "${RC_LIBEXECDIR}/sh/ifwatchd-carrier.sh" \
-n "${RC_LIBEXECDIR}/sh/ifwatchd-nocarrier.sh" "${IFACE}" \
|| return 0
ebegin "Stopping ifwatchd on" "${IFACE}"
start-stop-daemon --stop --exec /usr/sbin/ifwatchd \
-- -c "${RC_LIBEXECDIR}/sh/ifwatchd-carrier.sh" \
-n "${RC_LIBEXECDIR}/sh/ifwatchd-nocarrier.sh" "${IFACE}"
eend $?
}

View File

@ -1,175 +0,0 @@
# Copyright (c) 2011 by Gentoo Foundation
# Released under the 2-clause BSD license.
_config_vars="$_config_vars link prefix suffix ipv4mask relay"
ip6rd_depend()
{
program ip
after interface
}
ip6rd_pre_start()
{
# ALL interfaces run pre_start blocks, not just those with something
# assigned, so we must check if we need to run on this interface before we
# do so.
local config
eval config=\$config_${IFVAR}
[ "$config" = "ip6rd" ] || return 0
case "${MODULES}" in
*" ifconfig "*)
eerror "ifconfig is not supported for 6rd"
eerror "Please emerge sys-apps/iproute2"
return 1
;;
esac
local host= suffix= relay= addr= iface=${IFACE} config_ip6rd= localip= ipv4mask=
eval host=\$link_${IFVAR}
if [ -z "${host}" ]; then
eerror "link_${IFVAR} not set"
return 1
fi
eval host=\${link_${IFVAR}}
eval ipv4mask=\${ipv4mask_${IFVAR}:-0}
eval suffix=\${suffix_${IFVAR}:-1}
eval relay=\${relay_${IFVAR}}
eval prefix=\${prefix_${IFVAR}}
IFACE=${host}
addrs=$(_get_inet_addresses)
IFACE=${iface}
if [ -z "${addrs}" ]; then
eerror "${host} is not configured with an IPv4 address"
return 1
fi
# TODO: Get this settings from DHCP (Option 212)
if [ -z "${prefix}" ]; then
eerror "prefix_${IFVAR} not set"
return 1
fi
if [ -z "${relay}" ]; then
eerror "relay_${IFVAR} not set"
return 1
fi
for addr in ${addrs}; do
# Strip the subnet
local ip="${addr%/*}" subnet="${addr#*/}"
# We don't work on private IPv4 addresses
if _ip6rd_inet_is_private_network "${ip}"
then
continue
fi
local ip6= ip6_prefix="${prefix%::/*}" ip6_subnet="${prefix#*/}"
ip6_subnet=$((ip6_subnet + (32-ipv4mask)))
eval ip6="$(printf "${ip6_prefix}:%s::%s" \
$(_ip6rd_prefix_shave_bits ${ip} ${ipv4mask}) ${suffix})"
veinfo "Derived IPv6 address: ${ip6}"
# Now apply our IPv6 address to our config
config_ip6rd="${config_ip6rd}${config_ip6rd:+ }${ip6}/${ip6_subnet}"
if [ -n "${localip}" ]; then
localip="any"
else
localip="${ip}"
fi
done
if [ -z "${config_ip6rd}" ]; then
eerror "No global IPv4 addresses found on interface ${host}"
return 1
fi
ebegin "Creating 6rd tunnel ${IFACE}"
if [ "${IFACE}" != "sit0" ]; then
_tunnel add "${IFACE}" mode sit ttl 255 remote any local "${localip}"
fi
_tunnel 6rd dev "${IFACE}" 6rd-prefix "${prefix}"
eend $? || return 1
_up
routes_ip6rd="2003::/3 via ::${relay} metric 2147483647"
service_set_value "config_ip6rd_$IFVAR" "$config_ip6rd"
service_set_value "routes_ip6rd_$IFVAR" "$routes_ip6rd"
}
ip6rd_start()
{
local config_ip6rd=$(service_get_value "config_ip6rd_$IFVAR")
local routes_ip6rd=$(service_get_value "routes_ip6rd_$IFVAR")
# Now apply our config
eval config_${config_index}=\'"${config_ip6rd}"\'
: $(( config_index -= 1 ))
# Add a route for us, ensuring we don't delete anything else
local routes="$(_get_array "routes_${IFVAR}")
$routes_ip6rd"
eval routes_${IFVAR}=\$routes
}
_ip6rd_inet_atoi()
{
local IFS="${IFS}." ipi=0 j=3
for i in $1 ; do
# post-decrement isn't valid
ipi=$(( ipi | (i << (8*j)) ))
j=$(( j - 1 ))
done
echo ${ipi}
}
_ip6rd_inet_itoa()
{
local ipi=$1 bitmask v
bitmask=$(( (1 << 24)-1 ))
for i in 0 1 2 3; do
v=$(( (ipi & ~bitmask) >> 24 ))
ipi=$(( (ipi & bitmask) << 8 ))
if [ $i != 3 ] ; then
printf "%d." $v
else
printf "%d\n" $v
fi
done
}
_ip6rd_inet_get_network()
{
local a=$(_ip6rd_inet_atoi $1)
local net=$(( a & ( (1<<$2)-1 ) ))
local cidr=$(( 32 - $2 ))
echo $(_ip6rd_inet_itoa $(( (net << cidr ) )) )
}
_ip6rd_inet_is_private_network()
{
if [ "$(_ip6rd_inet_get_network $1 16)" = "192.168.0.0" ]\
|| [ "$(_ip6rd_inet_get_network $1 8)" = "10.0.0.0" ]\
|| [ "$(_ip6rd_inet_get_network $1 12)" = "172.16.0.0" ]\
|| [ "$(_ip6rd_inet_get_network $1 16)" = "169.254.0.0" ]
then
return 0;
fi
return 1;
}
_ip6rd_prefix_shave_bits()
{
local ipi=
ipi=$(( ($(_ip6rd_inet_atoi $1) & (1<<(32-$2))-1) << $2))
if [ $2 -le 16 ]
then
printf "%04x:%0$(( (16-$2>>2)+(($2%4)?1:0) ))x" \
$((ipi >> 16)) $((ipi & (1<<(16-$2))-1))
elif [ $2 -lt 32 ]
then
printf "%0$(( (32-$2>>2)+(($2%4)?1:0) ))x" \
$((ipi >> 16))
fi
}

View File

@ -1,116 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
_config_vars="$_config_vars link suffix relay"
ip6to4_depend()
{
after interface
program ip
}
ip6to4_pre_start()
{
# ALL interfaces run pre_start blocks, not just those with something
# assigned, so we must check if we need to run on this interface before we
# do so.
local config
eval config=\$config_${IFVAR}
[ "$config" = "ip6to4" ] || return 0
case " ${MODULES} " in
*" ifconfig "*)
if [ "${IFACE}" != "sit0" ]; then
eerror "ip6to4 can only work on the sit0 interface using ifconfig"
eerror "emerge sys-apps/iproute2 to use other interfaces"
return 1
fi
esac
local host= suffix= relay= addr= iface=${IFACE} config_ip6to4= localip=
eval host=\$link_${IFVAR}
if [ -z "${host}" ]; then
eerror "link_${IFVAR} not set"
return 1
fi
eval suffix=\${suffix_${IFVAR}:-1}
eval relay=\${relay_${IFVAR}:-192.88.99.1}
IFACE=${host}
addrs=$(_get_inet_addresses)
IFACE=${iface}
if [ -z "${addrs}" ]; then
eerror "${host} is not configured with an IPv4 address"
return 1
fi
for addr in ${addrs}; do
# Strip the subnet
local ip="${addr%/*}" subnet="${addr#*/}"
# We don't work on private IPv4 addresses
case "${ip}" in
127.*) continue;;
10.*) continue;;
192.168.*) continue;;
172.*)
local i=16
while [ ${i} -lt 32 ]; do
case "${ip}" in
172.${i}.*) break;;
esac
: $(( i += 1 ))
done
[ ${i} -lt 32 ] && continue
;;
esac
veinfo "IPv4 address on ${host}: ${ip}/${subnet}"
local ipa= ip6= IFS="${IFS}."
for i in ${ip}; do
ipa="${ipa} ${i}"
done
unset IFS
eval ip6="$(printf "2002:%02x%02x:%02x%02x::%s" ${ipa} ${suffix})"
veinfo "Derived IPv6 address: ${ip6}"
# Now apply our IPv6 address to our config
config_ip6to4="${config_ip6to4}${config_ip6to4:+ }${ip6}/48"
if [ -n "${localip}" ]; then
localip="any"
else
localip="${ip}"
fi
done
if [ -z "${config_ip6to4}" ]; then
eerror "No global IPv4 addresses found on interface ${host}"
return 1
fi
if [ "${IFACE}" != "sit0" ]; then
ebegin "Creating 6to4 tunnel on ${IFACE}"
_tunnel add "${IFACE}" mode sit ttl 255 remote any local "${localip}"
eend $? || return 1
_up
fi
routes_ip6to4="2003::/3 via ::${relay} metric 2147483647"
service_set_value "config_ip6to4_$IFVAR" "$config_ip6to4"
service_set_value "routes_ip6to4_$IFVAR" "$routes_ip6to4"
}
ip6to4_start()
{
local config_ip6to4=$(service_get_value "config_ip6to4_$IFVAR")
local routes_ip6to4=$(service_get_value "routes_ip6to4_$IFVAR")
# Now apply our config
eval config_${config_index}=\'"${config_ip6to4}"\'
: $(( config_index -= 1 ))
# Add a route for us, ensuring we don't delete anything else
local routes="$(_get_array "routes_${IFVAR}")
$routes_ip6to4"
eval routes_${IFVAR}=\$routes
}

View File

@ -1,48 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
ipppd_depend()
{
program start /usr/sbin/ipppd
after macnet
before interface
provide isdn
}
_config_vars="$_config_vars ipppd"
ipppd_pre_start()
{
local opts= pidfile="/var/run/ipppd-${IFACE}.pid"
# Check that we are a valid ippp interface
case "${IFACE}" in
ippp[0-9]*);;
*) return 0;;
esac
# Check that the interface exists
_exists || return 1
# Might or might not be set in conf.d/net
eval opts=\$ipppd_${IFVAR}
einfo "Starting ipppd for ${IFACE}"
start-stop-daemon --start --exec /usr/sbin/ipppd \
--pidfile "${pidfile}" \
-- ${opts} pidfile "${pidfile}" \
file "/etc/ppp/options.${IFACE}" >/dev/null
eend $?
}
ipppd_post_stop()
{
local pidfile="/var/run/ipppd-${IFACE}.pid"
[ ! -f "${pidfile}" ] && return 0
einfo "Stopping ipppd for ${IFACE}"
start-stop-daemon --stop --quiet --exec /usr/sbin/ipppd \
--pidfile "${pidfile}"
eend $?
}

View File

@ -1,404 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
iproute2_depend()
{
program ip
provide interface
after ifconfig
}
_up()
{
ip link set dev "${IFACE}" up
}
_down()
{
ip link set dev "${IFACE}" down
}
_exists()
{
[ -e /sys/class/net/"$IFACE" ]
}
_ifindex()
{
local index=-1
local f v
if [ -e /sys/class/net/"${IFACE}"/ifindex ]; then
index=$(cat /sys/class/net/"${IFACE}"/ifindex)
else
for f in /sys/class/net/*/ifindex ; do
v=$(cat $f)
[ $v -gt $index ] && index=$v
done
: $(( index += 1 ))
fi
echo "${index}"
return 0
}
_is_wireless()
{
# Support new sysfs layout
[ -d /sys/class/net/"${IFACE}"/wireless -o \
-d /sys/class/net/"${IFACE}"/phy80211 ] && return 0
[ ! -e /proc/net/wireless ] && return 1
grep -Eq "^[[:space:]]*${IFACE}:" /proc/net/wireless
}
_set_flag()
{
local flag=$1 opt="on"
if [ "${flag#-}" != "${flag}" ]; then
flag=${flag#-}
opt="off"
fi
ip link set dev "${IFACE}" "${flag}" "${opt}"
}
_get_mac_address()
{
local mac=$(LC_ALL=C ip link show "${IFACE}" | sed -n \
-e 'y/abcdef/ABCDEF/' \
-e '/link\// s/^.*\<\(..:..:..:..:..:..\)\>.*/\1/p')
case "${mac}" in
00:00:00:00:00:00);;
44:44:44:44:44:44);;
FF:FF:FF:FF:FF:FF);;
"");;
*) echo "${mac}"; return 0;;
esac
return 1
}
_set_mac_address()
{
ip link set dev "${IFACE}" address "$1"
}
_get_inet_addresses()
{
LC_ALL=C ip -family inet addr show "${IFACE}" | \
sed -n -e 's/.*inet \([^ ]*\).*/\1/p'
}
_get_inet_address()
{
set -- $(_get_inet_addresses)
[ $# = "0" ] && return 1
echo "$1"
}
_add_address()
{
if [ "$1" = "127.0.0.1/8" -a "${IFACE}" = "lo" ]; then
ip addr add "$@" dev "${IFACE}" 2>/dev/null
return 0
fi
local x
local address netmask broadcast peer anycast label scope
local valid_lft preferred_lft home nodad
local confflaglist
address="$1" ; shift
while [ -n "$*" ]; do
x=$1 ; shift
case "$x" in
netmask|ne*)
netmask="/$(_netmask2cidr "$1")" ; shift ;;
broadcast|brd|br*)
broadcast="$1" ; shift ;;
pointopoint|pointtopoint|peer|po*|pe*)
peer="$1" ; shift ;;
anycast|label|scope|valid_lft|preferred_lft|a*|l*|s*|v*|pr*)
case $x in
a*) x=anycast ;;
l*) x=label ;;
s*) x=scope ;;
v*) x=valid_lft ;;
pr*) x=preferred_lft ;;
esac
eval "$x=$1" ; shift ;;
home|nodad|h*|no*)
case $x in h*) x=home ;; n*) x=nodad ;; esac
# FIXME: If we need to reorder these, this will take more code
confflaglist="${confflaglist} $x" ; ;;
*)
ewarn "Unknown argument to config_$IFACE: $x"
esac
done
# Always scope lo addresses as host unless specified otherwise
if [ "${IFACE}" = "lo" ]; then
[ -z "$scope" ] && scope="host"
fi
# figure out the broadcast address if it is not specified
# This must NOT be set for IPv6 addresses
if [ "${address#*:}" = "${address}" ]; then
[ -z "$broadcast" ] && broadcast="+"
elif [ -n "$broadcast" ]; then
eerror "Broadcast keywords are not valid with IPv6 addresses"
return 1
fi
# This must appear on a single line, continuations cannot be used
set -- "${address}${netmask}" ${peer:+peer} ${peer} ${broadcast:+broadcast} ${broadcast} ${anycast:+anycast} ${anycast} ${label:+label} ${label} ${scope:+scope} ${scope} dev "${IFACE}" ${valid_lft:+valid_lft} $valid_lft ${preferred_lft:+preferred_lft} $preferred_lft $confflaglist
veinfo ip addr add "$@"
ip addr add "$@"
}
_add_route()
{
local family=
if [ "$1" = "-A" -o "$1" = "-f" -o "$1" = "-family" ]; then
family="-f $2"
shift; shift
elif [ "$1" = "-4" ]; then
family="-f inet"
shift
elif [ "$1" = "-6" ]; then
family="-f inet6"
shift
fi
if [ $# -eq 3 ]; then
set -- "$1" "$2" via "$3"
elif [ "$3" = "gw" ]; then
local one=$1 two=$2
shift; shift; shift
set -- "${one}" "${two}" via "$@"
fi
local cmd= have_metric=false
while [ -n "$1" ]; do
case "$1" in
metric) cmd="${cmd} $1"; have_metric=true;;
netmask) cmd="${cmd}/$(_netmask2cidr "$2")"; shift;;
-host|-net);;
*) cmd="${cmd} $1";;
esac
shift
done
# We cannot use a metric if we're using a nexthop
if ! ${have_metric} && \
[ -n "${metric}" -a \
"${cmd##* nexthop }" = "$cmd" ]
then
cmd="${cmd} metric ${metric}"
fi
veinfo ip ${family} route append ${cmd} dev "${IFACE}"
ip ${family} route append ${cmd} dev "${IFACE}"
eend $?
}
_delete_addresses()
{
ip addr flush dev "${IFACE}" scope global 2>/dev/null
ip addr flush dev "${IFACE}" scope site 2>/dev/null
if [ "${IFACE}" != "lo" ]; then
ip addr flush dev "${IFACE}" scope host 2>/dev/null
fi
return 0
}
_has_carrier()
{
LC_ALL=C ip link show dev "${IFACE}" | grep -q "LOWER_UP"
}
_tunnel()
{
ip tunnel "$@"
}
# This is just to trim whitespace, do not add any quoting!
_trim() {
echo $*
}
# This is our interface to Routing Policy Database RPDB
# This allows for advanced routing tricks
_ip_rule_runner() {
local cmd rules OIFS="${IFS}" family
if [ "$1" = "-4" -o "$1" = "-6" ]; then
family="$1"
shift
else
family="-4"
fi
cmd="$1"
rules="$2"
veindent
local IFS="$__IFS"
for ru in $rules ; do
unset IFS
ruN="$(_trim "${ru}")"
[ -z "${ruN}" ] && continue
vebegin "${cmd} ${ruN}"
ip $family rule ${cmd} ${ru}
veend $?
local IFS="$__IFS"
done
IFS="${OIFS}"
veoutdent
}
iproute2_pre_start()
{
local tunnel=
eval tunnel=\$iptunnel_${IFVAR}
if [ -n "${tunnel}" ]; then
# Set our base metric to 1000
metric=1000
# Bug#347657: If the mode is 'ipip6' or 'ip6ip6', the -6 must be passed
# to iproute2 during tunnel creation.
local ipproto=''
[ "${tunnel##mode ipip6}" != "${tunnel}" ] && ipproto='-6'
[ "${tunnel##mode ip6ip6}" != "${tunnel}" ] && ipproto='-6'
ebegin "Creating tunnel ${IFVAR}"
ip ${ipproto} tunnel add ${tunnel} name "${IFACE}"
eend $? || return 1
_up
fi
# MTU support
local mtu=
eval mtu=\$mtu_${IFVAR}
[ -n "${mtu}" ] && ip link set dev "${IFACE}" mtu "${mtu}"
# TX Queue Length support
local len=
eval len=\$txqueuelen_${IFVAR}
[ -n "${len}" ] && ip link set dev "${IFACE}" txqueuelen "${len}"
return 0
}
_iproute2_ipv6_tentative()
{
# Only check tentative when we have a carrier.
_has_carrier || return 1
LC_ALL=C ip addr show dev "${IFACE}" | \
grep -q "^[[:space:]]*inet6 .* tentative"
}
iproute2_post_start()
{
local n=5
# Kernel may not have IP built in
if [ -e /proc/net/route ]; then
local rules="$(_get_array "rules_${IFVAR}")"
if [ -n "${rules}" ]; then
if ! ip -4 rule list | grep -q "^"; then
eerror "IP Policy Routing (CONFIG_IP_MULTIPLE_TABLES) needed for ip rule"
else
service_set_value "ip_rule" "${rules}"
einfo "Adding IPv4 RPDB rules"
_ip_rule_runner -4 add "${rules}"
fi
fi
ip -4 route flush table cache dev "${IFACE}"
fi
# Kernel may not have IPv6 built in
if [ -e /proc/net/ipv6_route ]; then
local rules="$(_get_array "rules6_${IFVAR}")"
if [ -n "${rules}" ]; then
if ! ip -6 rule list | grep -q "^"; then
eerror "IPv6 Policy Routing (CONFIG_IPV6_MULTIPLE_TABLES) needed for ip rule"
else
service_set_value "ip6_rule" "${rules}"
einfo "Adding IPv6 RPDB rules"
_ip_rule_runner -6 add "${rules}"
fi
fi
ip -6 route flush table cache dev "${IFACE}"
fi
if _iproute2_ipv6_tentative; then
ebegin "Waiting for IPv6 addresses"
while [ $n -ge 0 ]; do
_iproute2_ipv6_tentative || break
sleep 1
: $(( n -= 1 ))
done
[ $n -ge 0 ]
eend $?
fi
return 0
}
iproute2_post_stop()
{
# Kernel may not have IP built in
if [ -e /proc/net/route ]; then
local rules="$(service_get_value "ip_rule")"
if [ -n "${rules}" ]; then
einfo "Removing IPv4 RPDB rules"
_ip_rule_runner -4 del "${rules}"
fi
# Only do something if the interface actually exist
if _exists; then
ip -4 route flush table cache dev "${IFACE}"
fi
fi
# Kernel may not have IPv6 built in
if [ -e /proc/net/ipv6_route ]; then
local rules="$(service_get_value "ip6_rule")"
if [ -n "${rules}" ]; then
einfo "Removing IPv6 RPDB rules"
_ip_rule_runner -6 del "${rules}"
fi
# Only do something if the interface actually exist
if _exists; then
ip -6 route flush table cache dev "${IFACE}"
fi
fi
# Don't delete sit0 as it's a special tunnel
if [ "${IFACE}" != "sit0" ]; then
if [ -n "$(ip tunnel show "${IFACE}" 2>/dev/null)" ]; then
ebegin "Destroying tunnel ${IFACE}"
ip tunnel del "${IFACE}"
eend $?
fi
fi
}
# Is the interface administratively/operationally up?
# The 'UP' status in ifconfig/iproute2 is the administrative status
# Operational state is available in iproute2 output as 'state UP', or the
# operstate sysfs variable.
# 0: up
# 1: down
# 2: invalid arguments
is_admin_up()
{
local iface="$1"
[ -z "$iface" ] && iface="$IFACE"
ip link show dev $iface | \
sed -n '1,1{ /[<,]UP[,>]/{ q 0 }}; q 1; '
}
is_oper_up()
{
local iface="$1"
[ -z "$iface" ] && iface="$IFACE"
read state </sys/class/net/"${iface}"/operstate
[ "x$state" = "up" ]
}

View File

@ -1,593 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
_config_vars="$_config_vars ssid mode associate_timeout preferred_aps"
_config_vars="$_config_vars blacklist_aps"
iwconfig_depend()
{
program /sbin/ifconfig
after plug
before interface
provide wireless
}
iwconfig_get_wep_status()
{
local status="disabled"
local mode=$(LC_ALL=C ifconfig "${IFACE}" \
| sed -n -e 's/^[[:space:]]*authmode \([^ ]*\) privacy ON .*/\1/p')
if [ -n "${mode}" ] ; then
status="enabled - ${mode}"
fi
echo "(WEP ${status})"
}
_iwconfig_get()
{
LC_ALL=C ifconfig "${IFACE}" | \
sed -n -e "s/^[[:space:]]*ssid \(.*\) channel \([0-9]*\).* bssid \(..:..:..:..:..:..\)\$/\\$1/p"
}
_get_ssid()
{
local ssid="$(_iwconfig_get 1)"
# If the ssid has a space then it's wrapped in quotes. This is a
# problem if the real ssid has a quote at the start or the end :/
ssid=${ssid#\"}
ssid=${ssid%\"}
echo "${ssid}"
}
_get_ap_mac_address()
{
_iwconfig_get 3
}
_get_channel()
{
_iwconfig_get 2
}
iwconfig_report()
{
local m="connected to"
local ssid="$(_get_ssid)"
local mac="$(_get_ap_mac_address "${iface}")"
[ -n "${mac}" ] && mac=" at ${mac}"
local wep_status="$(iwconfig_get_wep_status "${iface}")"
local channel="$(_get_channel)"
[ -n "${channel}" ] && channel="on channel ${channel} "
eindent
einfo "${IFACE} ${m} \"${ssid}\"${mac}"
einfo "${channel}${wep_status}"
eoutdent
}
iwconfig_get_wep_key()
{
local mac="$1" key=
[ -n "${mac}" ] && mac="$(echo "${mac}" | sed -e 's/://g')"
eval key=\$mac_key_${mac}
[ -z "${key}" ] && eval key=\$key_${SSIDVAR}
echo "${key:--}"
}
iwconfig_user_config()
{
local conf=
eval set -- \$ifconfig_${SSIDVAR}
for conf in "$@" ; do
ifconfig "${IFACE}" ${conf}
done
}
iwconfig_set_mode()
{
local x= opt= unopt="hostap adhoc"
case "$1" in
master|hostap) unopt="adhoc" opt="hostap" ;;
ad-hoc|adhoc) unopt="hostap" opt="adhoc" ;;
esac
for x in ${unopt} ; do
ifconfig "${IFACE}" -mediaopt ${x}
done
for x in ${opt} ; do
ifconfig "${IFACE}" mediaopt ${x}
done
}
iwconfig_setup_specific()
{
local mode="${1:-master}" channel=
if [ -z "${SSID}" ]; then
eerror "${IFACE} requires an SSID to be set to operate in ${mode} mode"
eerror "adjust the ssid_${IFVAR} setting in /etc/conf.d/net"
return 1
fi
iwconfig_set_mode "${mode}" || return 1
SSIDVAR=$(shell_var "${SSID}")
local key=$(iwconfig_get_wep_key)
# Now set the key
ifconfig "${IFACE}" wepkey "${key}"
ifconfig "${IFACE}" ssid "${SSID}" || return 1
eval channel=\$channel_${IFVAR}
# We default the channel to 3
ifconfig "${IFACE}" channel "${channel:-3}" || return 1
iwconfig_user_config
iwconfig_report "${iface}"
return 0
}
iwconfig_associate()
{
local mac="$1" channel="$2" caps="$3"
local mode= w="(WEP Disabled)" key=
SSIDVAR=$(shell_var "${SSID}")
key=$(iwconfig_get_wep_key "${mac}")
case "${caps}" in
[EI]P*)
if [ "${key}" = "-" ] ; then
ewarn "WEP key is not set for \"${SSID}\""
return 1
fi
;;
"") ;;
*)
if [ "${key}" != "-" ] ; then
key="-"
ewarn "\"${SSID}\" is not WEP enabled"
fi
;;
esac
# Set mode accordingly
case "${caps}" in
*E*)
mode="managed"
if LC_ALL=C ifconfig "${IFACE}" | \
grep -q "^[[:space:]]*media: .*adhoc" ; then
ifconfig "${IFACE}" down -mediaopt adhoc up
fi
;;
*I*)
mode="adhoc"
if ! LC_ALL=C ifconfig "${IFACE}" | \
grep -q "^[[:space:]]*media: .*adhoc" ; then
ifconfig "${IFACE}" down mediaopt adhoc up
fi
;;
*)
if LC_ALL=C ifconfig "${IFACE}" \
| grep -q "^[[:space:]]*media: .*adhoc" ; then
mode="adhoc"
else
mode="managed"
fi
;;
esac
if [ "${key}" = "-" ] ; then
ifconfig "${IFACE}" wepmode off
else
ifconfig "${IFACE}" wepmode on
ifconfig "${IFACE}" deftxkey 1
w=$(iwconfig_get_wep_status)
fi
ebegin "Connecting to \"${SSID}\" in ${mode} mode ${w}"
if ! ifconfig "${IFACE}" wepkey "${key}" ; then
eerror "Invalid WEP key ${key}"
return 1
fi
ifconfig "${IFACE}" ssid "${SSID}" || return 1
iwconfig_user_config
if [ "${SSID}" != "any" ] && type preassociate >/dev/null 2>/dev/null ; then
veinfo "Running preassociate function"
veindent
( preassociate )
local e=$?
veoutdent
if [ ${e} -eq 0 ] ; then
veend 1 "preassociate \"${SSID}\" on ${IFACE} failed"
return 1
fi
fi
local timeout= i=0
eval timeout=\$associate_timeout_${IFVAR}
timeout=${timeout:-10}
[ ${timeout} -eq 0 ] \
&& vewarn "WARNING: infinite timeout set for association on ${IFACE}"
while true; do
_has_carrier && break
sleep 1
[ ${timeout} -eq 0 ] && continue
: $(( i += 1 ))
[ ${i} -ge ${timeout} ] && { eend 1; return 1; }
done
_has_carrier || { eend 1; return 1; }
eend 0
if [ "${SSID}" = "any" ]; then
SSID="$(_get_ssid)"
iwconfig_associate
return $?
fi
iwconfig_report
if type postassociate >/dev/null 2>/dev/null ; then
veinfo "Running postassociate function"
veindent
( postassociate )
veoutdent
fi
return 0
}
iwconfig_scan()
{
local x= i=0 scan= quality=
einfo "Scanning for access points"
eindent
scan="$(LC_ALL=C ifconfig -v "${IFACE}" list scan 2>/dev/null | sed -e "1 d" -e "s/$/'/g" -e "s/^/'/g")"
while [ ${i} -lt 3 -a -z "${scan}" ] ; do
scan="${scan}${scan:+ }$(LC_ALL=C ifconfig -v "${IFACE}" scan 2>/dev/null | sed -e "1 d" -e "s/$/'/g" -e "s/^/'/g")"
: $(( i += 1 ))
done
APS=-1
eval set -- ${scan}
for line in "$@" ; do
: $(( APS += 1 ))
set -- ${line}
while true ; do
case "$1" in
*:*:*:*:*:*) break ;;
esac
eval SSID_${APS}="\"\${SSID_${APS}}\${SSID_${APS}:+ }$1\""
shift
done
eval MAC_${APS}="$(echo "$1" | tr '[:lower:]' '[:upper:]')"
eval CHAN_${APS}="$2"
quality=${4%:*}
shift ; shift ; shift ; shift ; shift
eval CAPS_${APS}="\"$*\""
# Add 1000 for managed nodes as we prefer them to adhoc
set -- $*
case "$1" in
*E*) eval QUAL_${APS}=$(( quality + 1000 )) ;;
*) eval QUAL_${APS}=\$quality ;;
esac
done
if [ -z "${MAC_0}" ]; then
ewarn "no access points found"
eoutdent
return 1
fi
# Sort based on quality
local i=0 k=1 a= b= x= t=
while [ ${i} -lt ${APS} ] ; do
: $(( k = i + 1 ))
while [ ${k} -le ${APS} ] ; do
eval a=\$QUALITY_${i}
[ -z "${a}" ] && break
eval b=\$QUALITY_${k}
if [ -n "${b}" -a "${a}" -lt "${b}" ] ; then
for x in MAC SSID CHAN QUALITY CAPS ; do
eval t=\$${x}_${i}
eval ${x}_${i}=\$${x}_${k}
eval ${x}_${k}=\$t
done
fi
: $(( k += 1 ))
done
: $(( i += 1 ))
done
# Strip any duplicates
local i=0 k=1 a= b=
while [ ${i} -lt ${APS} ] ; do
: $(( k = i + 1 ))
while [ ${k} -le ${APS} ] ; do
eval a=\$MAC_${i}
eval b=\$MAC_${k}
if [ "${a}" = "${b}" ] ; then
eval a=\$QUALITY_${i}
eval b=\$QUALITY_${k}
if [ -n "${a}" -a -n "${b}" ] ; then
if [ ${a} -ge ${b} ] ; then
unset MAC_${k} SSID_${k} CHAN_${k} QUALITY_${k} CAPS_${k}
else
unset MAC_${i} SSID_${i} CHAN_${i} QUALITY_${i} CAPS_${i}
fi
else
unset MAC_${k} SSID_${k} CHAN_${k} QUALITY_${k} CAPS_${k}
fi
fi
: $(( k += 1 ))
done
: $(( i += 1 ))
done
local i=0 e= m= s=
while [ ${i} -le ${APS} ] ; do
eval x=\$MAC_${i}
if [ -z "${x}" ] ; then
: $(( i += 1 ))
continue
fi
eval m=\$MODE_${i}
[ -n "${m}" ] && m=", ${m}"
eval s=\$SSID_${i}
eval q=\$QUALITY_${i}
eval e=\$CAPS_${i}
case "${e}" in
[EI]P*) e=", encrypted" ;;
*) e="" ;;
esac
if [ -z "${s}" ] ; then
einfo "Found ${x}${m}${e}"
else
einfo "Found \"${s}\" at ${x}${m}${e}"
fi
x="$(echo "${x}" | sed -e 's/://g')"
eval x=\$mac_ssid_${x}
if [ -n "${x}" ] ; then
eval SSID_${i}=\$x
s=${x}
eindent
einfo "mapping to \"${x}\""
eoutdent
fi
eval set -- $(_flatten_array "blacklist_aps_${IFVAR}")
[ $# = 0 ] && eval set -- $(_flatten_array "blacklist_aps")
for x; do
if [ "${x}" = "${s}" ] ; then
ewarn "${s} has been blacklisted - not connecting"
unset SSID_${i} MAC_${i} CHAN_${i} QUALITY_${i} CAPS_${i}
fi
done
: $(( i += 1 ))
done
eoutdent
return 0
}
iwconfig_force_preferred()
{
eval set -- $(_flatten_array "preferred_aps_${IFVAR}")
[ $# = 0 ] && eval set -- $(_flatten_array "preferred_aps")
[ $# = 0 ] && return 1
ewarn "Trying to force preferred in case they are hidden"
local ssid=
for ssid; do
local found_AP=false i=0 e=
while [ ${i} -le ${APS:--1} ] ; do
eval e=\$SSID_${i}
if [ "${e}" = "${ssid}" ] ; then
found_AP=true
break
fi
: $(( i += 1 ))
done
if ! ${found_AP} ; then
SSID=${ssid}
iwconfig_associate && return 0
fi
done
ewarn "Failed to associate with any preferred access points on ${IFACE}"
return 1
}
iwconfig_connect_preferred()
{
eval set -- $(_flatten_array "preferred_aps_${IFVAR}")
[ $# = 0 ] && eval set -- $(_flatten_array "preferred_aps")
[ $# = 0 ] && return 1
local ssid= i= mode= mac= caps= freq= chan=
for ssid; do
i=0
while [ ${i} -le ${APS} ] ; do
eval e=\$SSID_${i}
if [ "${e}" = "${ssid}" ] ; then
SSID=${e}
eval mac=\$MAC_${i}
eval caps=\$CAPS_${i}
eval freq=\$FREQ_${i}
eval chan=\$CHAN_${i}
iwconfig_associate "${mac}" \
"${chan}" "${caps}" && return 0
fi
: $(( i += 1 ))
done
done
return 1
}
iwconfig_connect_not_preferred()
{
local ssid= i=0 mode= mac= caps= freq= chan= pref=
while [ ${i} -le ${APS} ] ; do
eval e=\$SSID_${i}
if [ -z "${e}" ] ; then
: $(( i += 1 ))
continue
fi
eval set -- $(_flatten_array "preferred_aps_${IFVAR}")
[ $# = 0 ] && eval set -- $(_flatten_array "preferred_aps")
pref=false
for ssid; do
if [ "${e}" = "${ssid}" ] ; then
pref=true
break
fi
done
if ! ${pref} ; then
SSID=${e}
eval mac=\$MAC_${i}
eval caps=\$CAPS_${i}
eval freq=\$FREQ_${i}
eval chan=\$CHAN_${i}
iwconfig_associate "${mac}" \
"${chan}" "${caps}" && return 0
fi
: $(( i += 1 ))
done
return 1
}
iwconfig_defaults()
{
# Set some defaults
#ifconfig "${iface}" txpower 100 2>/dev/null
ifconfig "${IFACE}" bssid -
ifconfig "${IFACE}" ssid -
ifconfig "${IFACE}" wepkey 1:- wepkey 2:- wepkey 3:- wepkey 4:-
ifconfig "${IFACE}" authmode open
ifconfig "${IFACE}" -mediaopt adhoc
ifconfig "${IFACE}" -mediaopt hostap
}
iwconfig_configure()
{
local x= APS=-1
eval SSID=\$ssid_${IFVAR}
# Setup ad-hoc mode?
eval x=\$mode_${IFVAR}
x=${x:-managed}
case "${x}" in
ad-hoc|adhoc|hostap|master) iwconfig_setup_specific "${x}" ;;
esac
if [ "${x}" != "managed" -a "${x}" != "auto" -a "${x}" != "ad-hoc" -a "${x}" != "adhoc" -a ${x} != "master" ] ; then
eerror "Only managed, ad-hoc, master and auto modes are supported"
return 1
fi
# Has an SSID been forced?
if [ -n "${SSID}" ]; then
iwconfig_set_mode "${x}"
iwconfig_associate && return 0
[ "${SSID}" = "any" ] && iwconfig_force_preferred && return 0
eval SSID=\$adhoc_ssid_${IFVAR}
if [ -n "${SSID}" ]; then
iwconfig_setup_specific adhoc
return $?
fi
return 1
fi
# Are we forcing preferred only?
eval x=\$associate_order_${IFVAR}
[ -n "${x}" ] && associate_order=${x}
associate_order=${associate_order:-any}
if [ "${associate_order}" = "forcepreferredonly" ]; then
iwconfig_force_preferred && return 0
else
iwconfig_scan || return 1
iwconfig_connect_preferred && return 0
[ "${associate_order}" = "forcepreferred" ] || \
[ "${associate_order}" = "forceany" ] && \
iwconfig_force_preferred && return 0
[ "${associate_order}" = "any" ] || \
[ "${associate_order}" = "forceany" ] && \
iwconfig_connect_not_preferred && return 0
fi
e="associate with"
[ -z "${MAC_0}" ] && e="find"
[ "${preferred_aps}" = "force" ] || \
[ "${preferred_aps}" = "forceonly" ] && \
e="force"
e="Couldn't ${e} any access points on ${IFACE}"
eval SSID=\$adhoc_ssid_${IFVAR}
if [ -n "${SSID}" ]; then
ewarn "${e}"
iwconfig_setup_specific adhoc
return $?
fi
eerror "${e}"
return 1
}
iwconfig_pre_start()
{
# We don't configure wireless if we're being called from
# the background
yesno ${IN_BACKGROUND} && return 0
service_set_value "SSID" ""
_exists || return 0
if ! _is_wireless ; then
veinfo "${IFACE} is not wireless"
return 0
fi
iwconfig_defaults
iwconfig_user_config
# Set the base metric to be 2000
metric=2000
einfo "Configuring wireless network for ${IFACE}"
if iwconfig_configure ; then
service_set_value "SSID" "${SSID}"
return 0
fi
eerror "Failed to configure wireless for ${IFACE}"
iwconfig_defaults
#iwconfig "${IFACE}" txpower 0 2>/dev/null
unset SSID SSIDVAR
_down
return 1
}
iwconfig_post_stop()
{
yesno ${IN_BACKGROUND} && return 0
_is_wireless || return 0
iwconfig_defaults
#iwconfig "${IFACE}" txpower 0 2>/dev/null
}

View File

@ -1,763 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
_config_vars="$_config_vars ssid mode associate_timeout sleep_scan"
_config_vars="$_config_vars preferred_aps blacklist_aps"
iwconfig_depend()
{
program /sbin/iwconfig
after plug
before interface
provide wireless
}
iwconfig_get_wep_status()
{
local mode= status="disabled"
# No easy way of doing this grep in bash regex :/
if LC_ALL=C iwconfig "${IFACE}" | \
grep -qE "^ +Encryption key:[*0-9,A-F]"; then
status="enabled"
mode=$(LC_ALL=C iwconfig "${IFACE}" | \
sed -n -e 's/^.*Security mode:\(.*[^ ]\).*/\1/p')
[ -n "${mode}" ] && mode=" - ${mode}"
fi
echo "(WEP ${status}${mode})"
}
_get_ssid()
{
local i=5 ssid=
while [ ${i} -gt 0 ]; do
ssid=$(iwgetid --raw "${IFACE}")
if [ -n "${ssid}" ]; then
echo "${ssid}"
return 0
fi
sleep 1
: $(( i -= 1 ))
done
return 1
}
_get_ap_mac_address()
{
local mac="$(iwgetid --raw --ap "${IFACE}")"
case "${mac}" in
"00:00:00:00:00:00") return 1;;
"44:44:44:44:44:44") return 1;;
"FF:00:00:00:00:00") return 1;;
"FF:FF:FF:FF:FF:FF") return 1;;
*) echo "${mac}";;
esac
}
iwconfig_get_mode()
{
LC_ALL=C iwgetid --mode "${IFACE}" | \
sed -n -e 's/^.*Mode:\(.*\)/\1/p' | \
tr '[:upper:]' '[:lower:]'
}
iwconfig_set_mode()
{
local mode="$1"
[ "${mode}" = "$(iwconfig_get_mode)" ] && return 0
# Devicescape stack requires the interface to be down
_down
iwconfig "${IFACE}" mode "${mode}" || return 1
_up
}
iwconfig_get_type()
{
LC_ALL=C iwconfig "${IFACE}" | \
sed -n -e 's/^'"$1"' *\([^ ]* [^ ]*\).*/\1/p'
}
iwconfig_report()
{
local mac= m="connected to"
local ssid="$(_get_ssid)"
local wep_status="$(iwconfig_get_wep_status)"
local channel="$(iwgetid --raw --channel "${iface}")"
[ -n "${channel}" ] && channel="on channel ${channel} "
local mode="$(iwconfig_get_mode)"
if [ "${mode}" = "master" ]; then
m="configured as"
else
mac="$(_get_ap_mac_address)"
[ -n "${mac}" ] && mac=" at ${mac}"
fi
eindent
einfo "${IFACE} ${m} SSID \"${SSID}\"${mac}"
einfo "in ${mode} mode ${channel}${wep_status}"
eoutdent
}
iwconfig_get_wep_key()
{
local mac="$1" key=
[ -n "${mac}" ] && mac="$(echo "${mac}" | sed -e 's/://g')"
eval key=\$mac_key_${mac}
[ -z "${key}" ] && eval key=\$key_${SSIDVAR}
if [ -z "${key}" ]; then
echo "off"
else
set -- ${key}
local x= e=false
for x; do
if [ "${x}" = "enc" ]; then
e=true
break
fi
done
${e} || key="${key} enc open"
echo "${key}"
fi
}
iwconfig_user_config()
{
local conf= var=${SSIDVAR} config=
[ -z "${var}" ] && var=${IFVAR}
config="$(_get_array "iwconfig_${var}")"
local IFS="$__IFS"
for conf in ${config}; do
unset IFS
if ! eval iwconfig "${IFACE}" "${conf}"; then
ewarn "${IFACE} does not support the following configuration commands"
ewarn " ${conf}"
fi
done
unset IFS
config="$(_get_array "iwpriv_${var}")"
local IFS="$__IFS"
for conf in ${config}; do
unset IFS
if ! eval iwpriv "${IFACE}" "${conf}"; then
ewarn "${IFACE} does not support the following private ioctls"
ewarn " ${conf}"
fi
done
}
iwconfig_setup_specific()
{
local mode="$1" channel=
if [ -z "${SSID}" ]; then
eerror "${IFACE} requires an SSID to be set to operate in ${mode} mode"
eerror "adjust the ssid_${IFVAR} setting in /etc/conf.d/net"
return 1
fi
SSIDVAR=$(shell_var "${SSID}")
local key=$(iwconfig_get_wep_key)
iwconfig_set_mode "${mode}"
# Now set the key
if ! eval iwconfig "${IFACE}" key "${key}"; then
if [ "${key}" != "off" ]; then
ewarn "${IFACE} does not support setting keys"
ewarn "or the parameter \"mac_key_${SSIDVAR}\" or \"key_${SSIDVAR}\" is incorrect"
fi
fi
# Then set the SSID
if ! iwconfig "${IFACE}" essid "${SSID}"; then
eerror "${IFACE} does not support setting SSID to \"${SSID}\""
return 1
fi
eval channel=\$channel_${SSIDVAR}
[ -z "${channel}" ] && eval channel=\$channel_${IFVAR}
# We default the channel to 3
if ! iwconfig "${IFACE}" channel "${channel:-3}"; then
ewarn "${IFACE} does not support setting the channel to \"${channel:-3}\""
return 1
fi
# Finally apply the user Config
iwconfig_user_config
iwconfig_report
return 0
}
iwconfig_wait_for_association()
{
local timeout= i=0
eval timeout=\$associate_timeout_${IFVAR}
timeout=${timeout:-10}
[ ${timeout} -eq 0 ] \
&& vewarn "WARNING: infinite timeout set for association on ${IFACE}"
while true; do
# Use sysfs if we can
if [ -e /sys/class/net/"${IFACE}"/carrier ]; then
if [ "$(cat /sys/class/net/"${IFACE}"/carrier)" = "1" ]; then
# Double check we have an ssid and a non-zero
# mac address. This is mainly for buggy
# prism54 drivers that always set their
# carrier on or buggy madwifi drivers that
# sometimes have carrier on and ssid set
# without being associated. :/
[ -n "$(iwgetid --raw "${IFACE}")" ] && [ "$(iwgetid --ap --raw "${IFACE}")" != "00:00:00:00:00:00" ] && return 0
fi
else
local atest=
eval atest=\$associate_test_${IFVAR}
atest=${atest:-mac}
if [ "${atest}" = "mac" -o "${atest}" = "all" ]; then
[ -n "$(_get_ap_mac_address)" ] && return 0
fi
if [ "${atest}" = "quality" -o "${atest}" = "all" ]; then
[ "$(sed -n -e 's/^.*'"${IFACE}"': *[0-9]* *\([0-9]*\).*/\1/p' \
/proc/net/wireless)" != "0" ] && return 0
fi
fi
sleep 1
[ ${timeout} -eq 0 ] && continue
: $(( i += 1 ))
[ ${i} -ge ${timeout} ] && return 1
done
return 1
}
iwconfig_associate()
{
local mode="${1:-managed}" mac="$2" wep_required="$3"
local freq="$4" chan="$5"
local w="(WEP Disabled)" key=
iwconfig_set_mode "${mode}"
if [ "${SSID}" = "any" ]; then
iwconfig "${IFACE}" ap any 2>/dev/null
unset SSIDVAR
else
SSIDVAR=$(shell_var "${SSID}")
key="$(iwconfig_get_wep_key "${mac}")"
if [ "${wep_required}" = "on" -a "${key}" = "off" ]; then
ewarn "WEP key is not set for \"${SSID}\""
return 1
fi
if [ "${wep_required}" = "off" -a "${key}" != "off" ]; then
key="off"
ewarn "\"${SSID}\" is not WEP enabled"
fi
if ! eval iwconfig "${IFACE}" key "${key}"; then
if [ "${key}" != "off" ]; then
ewarn "${IFACE} does not support setting keys"
ewarn "or the parameter \"mac_key_${SSIDVAR}\" or \"key_${SSIDVAR}\" is incorrect"
return 1
fi
fi
[ "${key}" != "off" ] && w="$(iwconfig_get_wep_status "${iface}")"
fi
if ! iwconfig "${IFACE}" essid "${SSID}"; then
if [ "${SSID}" != "any" ]; then
ewarn "${IFACE} does not support setting SSID to \"${SSID}\""
fi
fi
# Only use channel or frequency
if [ -n "${chan}" ]; then
iwconfig "${IFACE}" channel "${chan}"
elif [ -n "${freq}" ]; then
iwconfig "${IFACE}" freq "${freq}"
fi
[ -n "${mac}" ] && iwconfig "${IFACE}" ap "${mac}"
# Finally apply the user Config
iwconfig_user_config
ebegin "Connecting to \"${SSID}\" in ${mode} mode ${w}"
if [ "${SSID}" != "any" ] && type preassociate >/dev/null 2>&1; then
veinfo "Running preassociate function"
veindent
( preassociate )
local e=$?
veoutdent
if [ ${e} -eq 0 ]; then
veend 1 "preassociate \"${SSID}\" on ${IFACE} failed"
return 1
fi
fi
if ! iwconfig_wait_for_association; then
eend 1
return 1
fi
eend 0
if [ "${SSID}" = "any" ]; then
SSID="$(_get_ssid)"
iwconfig_associate
return $?
fi
iwconfig_report
if type postassociate >/dev/null 2>&1; then
veinfo "Running postassociate function"
veindent
( postassociate )
veoutdent
fi
return 0
}
iwconfig_scan()
{
local x= i=0 scan=
einfo "Scanning for access points"
eindent
# Sleep if required
eval x=\$sleep_scan_${IFVAR}
[ -n "${x}" ] && sleep "${x}"
while [ ${i} -lt 3 ]; do
local scan="${scan}${scan:+ }$(LC_ALL=C iwlist "${IFACE}" scan 2>/dev/null | sed -e "s/'/'\\\\''/g" -e "s/$/'/g" -e "s/^/'/g")"
# If this is the first pass and txpower as off and we have no
# results then we need to wait for at least 2 seconds whilst
# the interface does an initial scan.
if [ "${i}" = "0" -a "${txpowerwasoff}" = "0" ]; then
case "${scan}" in
"'${IFACE} "*"No scan results"*)
sleep 2
txpowerwasoff=1
continue
;;
esac
fi
: $(( i += 1 ))
done
if [ -z "${scan}" ]; then
ewarn "${iface} does not support scanning"
eoutdent
eval x=\$adhoc_ssid_${IFVAR}
[ -n "${x}" ] && return 0
if [ -n "${preferred_aps}" ]; then
[ "${associate_order}" = "forcepreferred" ] || \
[ "${associate_order}" = "forcepreferredonly" ] && return 0
fi
eerror "You either need to set a preferred_aps list in /etc/conf.d/wireless"
eerror " preferred_aps=\"SSID1 SSID2\""
eerror " and set associate_order_${IFVAR}=\"forcepreferred\""
eerror " or set associate_order_${IFVAR}=\"forcepreferredonly\""
eerror "or hardcode the SSID to \"any\" and let the driver find an Access Point"
eerror " ssid_${IFVAR}=\"any\""
eerror "or configure defaulting to Ad-Hoc when Managed fails"
eerror " adhoc_ssid_${IFVAR}=\"WLAN\""
eerror "or hardcode the SSID against the interface (not recommended)"
eerror " ssid_${IFVAR}=\"SSID\""
return 1
fi
APS=-1
eval set -- ${scan}
for line; do
case "${line}" in
*Address:*)
: $(( APS += 1 ))
eval MAC_${APS}="\""$(echo "${line#*: }" | tr '[:lower:]' '[:upper:]')"\""
eval QUALITY_${APS}=0
;;
*ESSID:*)
x=${line#*\"}
x=${x%*\"}
eval SSID_${APS}=\$x
;;
*Mode:*)
x="$(echo "${line#*:}" | tr '[:upper:]' '[:lower:]')"
if [ "${x}" = "master" ]; then
eval MODE_${APS}=managed
else
eval MODE_${APS}=\$x
fi
;;
*'Encryption key:'*)
x=${line#*:}
eval ENC_${APS}=\$x
;;
#*Frequency:*)
# freq[i]="${line#*:}"
# x="${freq[i]#* }"
# freq[i]="${freq[i]%% *}${x:0:1}"
# ;;
*Channel:*)
x=${line#*:}
x=${x%% *}
eval CHAN_${APS}=\$x
;;
*Quality*)
x=${line#*:}
x=${x%/*}
x="$(echo "${x}" | sed -e 's/[^[:digit:]]//g')"
x=${x:-0}
eval QUALITY_${APS}=\$x
;;
esac
done
if [ -z "${MAC_0}" ]; then
ewarn "no access points found"
eoutdent
return 1
fi
# Sort based on quality
local i=0 k=1 a= b= x= t=
while [ ${i} -lt ${APS} ]; do
: $(( k = i + 1 ))
while [ ${k} -le ${APS} ]; do
eval a=\$QUALITY_${i}
[ -z "${a}" ] && break
eval b=\$QUALITY_${k}
if [ -n "${b}" -a "${a}" -lt "${b}" ]; then
for x in MAC SSID MODE CHAN QUALITY ENC; do
eval t=\$${x}_${i}
eval ${x}_${i}=\$${x}_${k}
eval ${x}_${k}=\$t
done
fi
: $(( k += 1 ))
done
: $(( i += 1 ))
done
# Strip any duplicates
local i=0 k=1 a= b=
while [ ${i} -lt ${APS} ]; do
: $(( k = i + 1 ))
while [ ${k} -le ${APS} ]; do
eval a=\$MAC_${i}
eval b=\$MAC_${k}
if [ "${a}" = "${b}" ]; then
eval a=\$QUALITY_${i}
eval b=\$QUALITY_${k}
local u=${k}
# We need to split this into two tests, otherwise bash errors
[ -n "${a}" -a -n "${b}" ] && [ "${a}" -lt "${b}" ] && u=${i}
unset MAC_${u} SSID_${u} MODE_${u} CHAN_${u} QUALITY_${u} ENC_${u}
fi
: $(( k += 1 ))
done
: $(( i += 1 ))
done
local i=0 e= m= s=
while [ ${i} -le ${APS} ]; do
eval x=\$MAC_${i}
if [ -z "${x}" ]; then
: $(( i += 1 ))
continue
fi
eval m=\$MODE_${i}
eval s=\$SSID_${i}
eval q=\$QUALITY_${i}
eval e=\$ENC_${i}
if [ -n "${e}" -a "${e}" != "off" ]; then
e=", encrypted"
else
e=""
fi
if [ -z "${s}" ]; then
einfo "Found ${x}, ${m}${e}"
else
einfo "Found \"${s}\" at ${x}, ${m}${e}"
fi
x="$(echo "${x}" | sed -e 's/://g')"
eval x=\$mac_ssid_${x}
if [ -n "${x}" ]; then
eval SSID_${i}=\$x
s=${x}
eindent
einfo "mapping to \"${x}\""
eoutdent
fi
eval set -- $(_flatten_array "blacklist_aps_${IFVAR}")
[ $# = 0 ] && eval set -- $(_flatten_array "blacklist_aps")
for x; do
if [ "${x}" = "${s}" ]; then
ewarn "${s} has been blacklisted - not connecting"
unset SSID_${i} MAC_${i} ${MODE}_${i} CHAN_${i} QUALITY_${i} ENC_${i}
fi
done
: $(( i += 1 ))
done
eoutdent
}
iwconfig_force_preferred()
{
eval set -- $(_flatten_array "preferred_aps_${IFVAR}")
[ $# = 0 ] && eval set -- $(_flatten_array "preferred_aps")
[ $# = 0 ] && return 1
ewarn "Trying to force preferred in case they are hidden"
for ssid; do
local found_AP=false i=0 e=
while [ ${i} -le ${APS} ]; do
eval e=\$SSID_${i}
if [ "${e}" = "${ssid}" ]; then
found_AP=true
break
fi
: $(( i += 1 ))
done
if ! ${found_AP}; then
SSID=${ssid}
iwconfig_associate && return 0
fi
done
ewarn "Failed to associate with any preferred access points on ${IFACE}"
return 1
}
iwconfig_connect_preferred()
{
local ssid= i= mode= mac= enc= freq= chan=
eval set -- $(_flatten_array "preferred_aps_${IFVAR}")
[ $# = 0 ] && eval set -- $(_flatten_array "preferred_aps")
for ssid; do
unset IFS
i=0
while [ ${i} -le ${APS} ]; do
eval e=\$SSID_${i}
if [ "${e}" = "${ssid}" ]; then
SSID=${e}
eval mode=\$MODE_${i}
eval mac=\$MAC_${i}
eval enc=\$ENC_${i}
eval freq=\$FREQ_${i}
eval chan=\$CHAN_${i}
iwconfig_associate "${mode}" "${mac}" "${enc}" "${freq}" \
"${chan}" && return 0
fi
: $(( i += 1 ))
done
done
return 1
}
iwconfig_connect_not_preferred()
{
local ssid= i=0 mode= mac= enc= freq= chan= pref=false
while [ ${i} -le ${APS} ]; do
eval e=\$SSID_${i}
if [ -n "${e}" ]; then
eval set -- $(_flatten_array "preferred_aps_${IFVAR}")
[ $# = 0 ] && eval set -- $(_flatten_array "preferred_aps")
for ssid; do
if [ "${e}" = "${ssid}" ]; then
pref=true
break
fi
done
if ! ${pref}; then
SSID=${e}
eval mode=\$MODE_${i}
eval mac=\$MAC_${i}
eval enc=\$ENC_${i}
eval freq=\$FREQ_${i}
eval chan=\$CHAN_${i}
iwconfig_associate "${mode}" "${mac}" "${enc}" "${freq}" \
"${chan}" && return 0
fi
fi
: $(( i += 1 ))
done
return 1
}
iwconfig_defaults()
{
# Turn on the radio
iwconfig "${IFACE}" txpower on 2>/dev/null
# Release the AP forced
# Must do ap and then ssid otherwise scanning borks
iwconfig "${IFACE}" ap off 2>/dev/null
iwconfig "${IFACE}" essid off 2>/dev/null
}
iwconfig_configure()
{
local x= APS=-1
eval SSID=\$ssid_${IFVAR}
# Support old variable
[ -z "${SSID}" ] && eval SSID=\$essid_${IFVAR}
# Setup ad-hoc mode?
eval x=\$mode_${IFVAR}
x=${x:-managed}
if [ "${x}" = "ad-hoc" -o "${x}" = "master" ]; then
iwconfig_setup_specific "${x}"
return $?
fi
if [ "${x}" != "managed" -a "${x}" != "auto" ]; then
eerror "Only managed, ad-hoc, master and auto modes are supported"
return 1
fi
# Has an SSID been forced?
if [ -n "${SSID}" ]; then
iwconfig_set_mode "${x}"
iwconfig_associate && return 0
[ "${SSID}" = "any" ] && iwconfig_force_preferred && return 0
eval SSID=\$adhoc_ssid_${IFVAR}
if [ -n "${SSID}" ]; then
iwconfig_setup_specific ad-hoc
return $?
fi
return 1
fi
eval x=\$preferred_aps_${IFVAR}
[ -n "${x}" ] && preferred_aps=${x}
eval x=\$blacklist_aps_${IFVAR}
[ -n "${x}" ] && blacklist_aps=${x}
eval x=\$associate_order_${IFVAR}
[ -n "${x}" ] && associate_order=${x}
associate_order=${associate_order:-any}
if [ "${associate_order}" = "forcepreferredonly" ]; then
iwconfig_force_preferred && return 0
else
iwconfig_scan || return 1
iwconfig_connect_preferred && return 0
[ "${associate_order}" = "forcepreferred" ] || \
[ "${associate_order}" = "forceany" ] && \
iwconfig_force_preferred && return 0
[ "${associate_order}" = "any" ] || \
[ "${associate_order}" = "forceany" ] && \
iwconfig_connect_not_preferred && return 0
fi
e="associate with"
[ -z "${MAC_0}" ] && e="find"
[ "${preferred_aps}" = "force" ] || \
[ "${preferred_aps}" = "forceonly" ] && \
e="force"
e="Couldn't ${e} any access points on ${IFACE}"
eval SSID=\$adhoc_ssid_${IFVAR}
if [ -n "${SSID}" ]; then
ewarn "${e}"
iwconfig_setup_specific ad-hoc
return $?
fi
eerror "${e}"
return 1
}
iwconfig_pre_start()
{
# We don't configure wireless if we're being called from
# the background
yesno ${IN_BACKGROUND} && return 0
service_set_value "SSID" ""
_exists || return 0
if ! _is_wireless; then
veinfo "Wireless extensions not found for ${IFACE}"
return 0
fi
# Warn about old file - we want to punt it really
if [ -e /etc/conf.d/wireless ]; then
ewarn "/etc/conf.d/wireless is deprecated"
ewarn "Please put all settings into /etc/conf.d/net"
. /etc/conf.d/wireless
fi
# Store the fact that tx-power was off so we default to a longer
# wait if our scan returns nothing
LC_ALL=C iwconfig "${IFACE}" | sed -e '1d' | grep -q "Tx-Power=off"
local txpowerwasoff=$?
iwconfig_defaults
iwconfig_user_config
# Set the base metric to be 2000
metric=2000
# Check for rf_kill - only ipw supports this at present, but other
# cards may in the future.
if [ -e /sys/class/net/"${IFACE}"/device/rf_kill ]; then
if [ $(cat /sys/class/net/"${IFACE}"/device/rf_kill) != "0" ]; then
eerror "Wireless radio has been killed for interface ${IFACE}"
return 1
fi
fi
einfo "Configuring wireless network for ${IFACE}"
# Are we a proper IEEE device?
# Most devices reutrn IEEE 802.11b/g - but intel cards return IEEE
# in lower case and RA cards return RAPCI or similar
# which really sucks :(
# For the time being, we will test prism54 not loading firmware
# which reports NOT READY!
x="$(iwconfig_get_type)"
if [ "${x}" = "NOT READY!" ]; then
eerror "Looks like there was a problem loading the firmware for ${IFACE}"
return 1
fi
if iwconfig_configure; then
service_set_value "SSID" "${SSID}"
return 0
fi
eerror "Failed to configure wireless for ${IFACE}"
iwconfig_defaults
iwconfig "${IFACE}" txpower off 2>/dev/null
unset SSID SSIDVAR
_down
return 1
}
iwconfig_post_stop()
{
yesno ${IN_BACKGROUND} && return 0
_exists || return 0
iwconfig_defaults
iwconfig "${IFACE}" txpower off 2>/dev/null
}

View File

@ -1,92 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
macchanger_depend()
{
before macnet
# no program 'macchanger', as we have partial functionality without it
}
_config_vars="$_config_vars mac"
macchanger_pre_start()
{
# We don't change MAC addresses from background
yesno ${IN_BACKGROUND} && return 0
local mac= opts=
eval mac=\$mac_${IFVAR}
[ -z "${mac}" ] && return 0
_exists true || return 1
ebegin "Changing MAC address of ${IFACE}"
# The interface needs to be up for macchanger to work most of the time
_down
mac=$(echo "${mac}" | tr '[:upper:]' '[:lower:]')
local hex="[0-9a-f][0-9a-f]"
case "${mac}" in
# specific mac-addr
${hex}:${hex}:${hex}:${hex}:${hex}:${hex})
# We don't need macchanger to change to a specific
# mac address
_set_mac_address "${mac}"
if eend "$?"; then
mac=$(_get_mac_address)
eindent
einfo "changed to ${mac}"
eoutdent
_up
return 0
fi
;;
# increment MAC address, default macchanger behavior
increment) opts="${opts}";;
# randomize just the ending bytes
random-ending) opts="${opts} -e";;
# keep the same kind of physical layer (eg fibre, copper)
random-samekind) opts="${opts} -a";;
# randomize to any known vendor of any physical layer type
random-anykind) opts="${opts} -A";;
# fully random bytes
random-full|random) opts="${opts} -r";;
# default case is just to pass on all the options
*) opts="${opts} ${mac}";;
esac
if [ ! -x /sbin/macchanger ]; then
eerror "For changing MAC addresses, emerge net-analyzer/macchanger"
return 1
fi
mac=$(/sbin/macchanger ${opts} "${IFACE}" \
| sed -n -e 's/^Faked MAC:.*\<\(..:..:..:..:..:..\)\>.*/\U\1/p' )
_up
# Sometimes the interface needs to be up ....
if [ -z "${mac}" ]; then
mac=$(/sbin/macchanger ${opts} "${IFACE}" \
| sed -n -e 's/^Faked MAC:.*\<\(..:..:..:..:..:..\)\>.*/\U\1/p' )
fi
if [ -z "${mac}" ]; then
eend 1 "Failed to set MAC address"
return 1
fi
eend 0
eindent
einfo "changed to" "${mac}"
eoutdent
return 0
}

View File

@ -1,19 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
macnet_depend()
{
before rename interface wireless
after macchanger
}
macnet_pre_start()
{
local mac=$(_get_mac_address 2>/dev/null)
[ -z "${mac}" ] && return 0
vebegin "Configuring ${IFACE} for MAC address ${mac}"
mac=$(echo "${mac}" | sed -e 's/://g')
_configure_variables "${mac}"
veend 0
}

View File

@ -1,53 +0,0 @@
# 2011-09-22 Stef Simoens <stef@bgs.org>
# based on vlan.sh & tuntap.sh
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# All rights reserved. Released under the 2-clause BSD license.
macvlan_depend()
{
program ip
after interface
before dhcp macchanger
}
_is_macvlan()
{
[ -n "$(RC_SVCNAME="net.${IFACE}"; export RC_SVCNAME ; service_get_value macvlan)" ]
}
macvlan_pre_start()
{
# MAC-VLAN needs an existing interface to link to
local macvlan=
eval macvlan=\$macvlan_${IFVAR}
[ -z "${macvlan}" ] && return 0
case " ${MODULES} " in
*" ifconfig "*)
eerror "sys-apps/iproute2 is required to configure MACVLANs"
return 1 ;;
esac
# optional mode, default to "private"
local mode=
eval mode=\$mode_${IFVAR}
[ -z "${mode}" ] && mode="private"
ebegin "Creating MAC-VLAN ${IFACE} to ${macvlan}"
e="$(ip link add link "${macvlan}" name "${IFACE}" type macvlan mode "${mode}" 2>&1 1>/dev/null)"
if [ -n "${e}" ]; then
eend 1 "${e}"
else
eend 0 && _up && service_set_value macvlan "${macvlan}"
fi
}
macvlan_post_stop()
{
_is_macvlan || return 0
ebegin "Removing MAC-VLAN ${IFACE}"
ip link delete "${IFACE}" type macvlan >/dev/null
eend $?
}

View File

@ -1,96 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
_config_vars="$_config_vars plug_timeout"
netplugd_depend()
{
program start /sbin/netplugd
after macnet rename
before interface
provide plug
# Prefer ifplugd
before ifplugd
}
netplugd_pre_start()
{
local pidfile="/var/run/netplugd-${IFACE}.pid" timeout=
# We don't start netplug if we're being called from the background
yesno ${IN_BACKGROUND} && return 0
_exists || return 0
# We need a valid MAC address
# It's a basic test to ensure it's not a virtual interface
if ! _get_mac_address >/dev/null 2>&1; then
vewarn "netplug only works on interfaces with a valid MAC address"
return 0
fi
# We don't work on bonded, bridges, tun/tap, vlan or wireless
for f in bond bridge tuntap vlan wireless; do
if type "_is_${f}" >/dev/null 2>&1; then
if _is_${f}; then
veinfo "netplug does not work with" "${f}"
return 0
fi
fi
done
ebegin "Starting netplug on" "${IFACE}"
# Mark the us as inactive so netplug can restart us
mark_service_inactive
# Start netplug
start-stop-daemon --start --exec /sbin/netplugd \
--pidfile "${pidfile}" \
-- -i "${IFACE}" -P -p "${pidfile}" -c /dev/null
eend "$?" || return 1
eindent
# IFACE-specific, then global, then default
eval timeout=\$plug_timeout_${IFVAR}
[ -z "${timeout}" ] && timeout=$plug_timeout
[ -z "${timeout}" ] && timeout=-1
if [ ${timeout} -eq 0 ]; then
ewarn "WARNING: infinite timeout set for ${IFACE} to come up"
elif [ ${timeout} -lt 0 ]; then
einfo "Backgrounding ..."
exit 1
fi
veinfo "Waiting for ${IFACE} to be marked as started"
local i=0
while true; do
if service_started; then
_show_address
exit 0
fi
sleep 1
[ ${timeout} -eq 0 ] && continue
: $(( i += 1 ))
[ ${i} -ge ${timeout} ] && break
done
eend 1 "Failed to configure ${IFACE} in the background"
exit 1
}
netplugd_stop()
{
yesno ${IN_BACKGROUND} && return 0
local pidfile="/var/run/netplugd-${IFACE}.pid"
[ ! -e "${pidfile}" ] && return 0
ebegin "Stopping netplug on" "${IFACE}"
start-stop-daemon --stop --quiet --exec /sbin/netplugd \
--pidfile "${pidfile}"
eend $?
}

View File

@ -1,243 +0,0 @@
# Copyright (c) 2005-2007 Gentoo Foundation
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
pppd_depend()
{
program /usr/sbin/pppd
after interface
before dhcp
provide ppp
}
is_ppp()
{
[ -e /var/run/ppp-"${IFACE}".pid ]
}
requote()
{
printf "'%s' " "$@"
}
pppd_pre_start()
{
# Interface has to be called ppp
[ "${IFACE%%[0-9]*}" = "ppp" ] || return 0
# Set our base metric
metric=4000
if yesno ${IN_BACKGROUND}; then
local config=
eval config=\$config_${IFVAR}
# If no config for ppp then don't default to DHCP
if [ -z "${config}" ]; then
eval config_${IFVAR}=null
fi
return 0
fi
local link= i= unit="${IFACE#ppp}" opts=
# PPP requires a link to communicate over - normally a serial port
# PPPoE communicates over Ethernet
# PPPoA communicates over ATM
# In all cases, the link needs to be available before we start PPP
eval link=\$link_${IFVAR}
[ -n "${link}" ] || return 0
case "${link}" in
/*)
if [ ! -e "${link}" ]; then
eerror "${link} does not exist"
eerror "Please verify hardware or kernel module (driver)"
return 1
fi
;;
esac
if [ -z "${unit}" ]; then
eerror "PPP requires a unit - use net.ppp[0-9] instead of net.ppp"
return 1
fi
# We need to flatten the useless array
set -- $(_get_array "pppd_${IFVAR}")
opts="$@"
local mtu= hasmtu=false hasmru=false hasmaxfail=false haspersist=false
local hasupdetach=false hasdefaultmetric=false
for i in ${opts}; do
case "${i}" in
unit|nodetach|linkname)
eerror "The option \"${i}\" is not allowed in pppd_${IFVAR}"
return 1
;;
defaultmetric) hasdefaultmetric=true;;
mtu) hasmtu=true;;
mru) hasmru=true;;
maxfail) hasmaxfail=true;;
persist) haspersist=true;;
updetach) hasupdetach=true;;
esac
done
# Might be set in conf.d/net
local username= password= passwordset=
eval username=\$username_${IFVAR}
eval password=\$password_${IFVAR}
eval passwordset=\$\{password_${IFVAR}-x\}
if [ -n "${username}" ] \
&& [ -n "${password}" -o -z "${passwordset}" ]; then
opts="plugin passwordfd.so ${opts} passwordfd 0"
fi
if ! ${hasdefaultmetric}; then
local m=
eval m=\$metric_${IFVAR}
[ -z "${m}" ] && : $(( m = metric + $(_ifindex) ))
opts="${opts} defaultmetric ${m}"
fi
if [ -n "${mtu}" ]; then
${hasmtu} || opts="${opts} mtu ${mtu}"
${hasmru} || opts="${opts} mru ${mtu}"
fi
${hasmaxfail} || opts="${opts} maxfail 0"
${haspersist} || opts="${opts} persist"
# Set linkname because we need /var/run/ppp-${linkname}.pid
# This pidfile has the advantage of being there,
# even if ${IFACE} interface was never started
opts="linkname ${IFACE} ${opts}"
# Setup auth info
if [ -n "${username}" ]; then
opts="user '${username}' remotename ${IFACE} ${opts}"
fi
# Load a custom interface configuration file if it exists
[ -f "/etc/ppp/options.${IFACE}" ] \
&& opts="${opts} file '/etc/ppp/options.${IFACE}'"
# Set unit
opts="unit ${unit} ${opts}"
# Setup connect script
local chatprog="/usr/sbin/chat -e -E -v" phone=
eval phone=\$phone_number_${IFVAR}
set -- ${phone}
[ -n "$1" ] && chatprog="${chatprog} -T '$1'"
[ -n "$2" ] && chatprog="${chatprog} -U '$2'"
# We need to flatten the useless array
set -- $(_get_array "chat_${IFVAR}")
if [ $# != 0 ]; then
opts="${opts} connect '$(echo ${chatprog} $@ | sed -e "s:':'\\\\'':g")'"
fi
# Add plugins
local haspppoa=false haspppoe=false plugins="$(_get_array "plugins_${IFVAR}")"
local IFS="$__IFS"
for i in ${plugins}; do
unset IFS
set -- ${i}
case "$1" in
passwordfd) continue;;
pppoa) shift; set -- "pppoatm" "$@";;
pppoe) shift; set -- "rp-pppoe" "$@";;
capi) shift; set -- "capiplugin" "$@";;
esac
case "$1" in
rp-pppoe) haspppoe=true;;
pppoatm) haspppoa=true;;
esac
if [ "$1" = "rp-pppoe" ] || [ "$1" = "pppoatm" -a "${link}" != "/dev/null" ]; then
opts="${opts} connect true"
set -- "$@" "${link}"
fi
opts="plugin $1.so ${opts}"
shift
opts="${opts} $@"
done
unset IFS
#Specialized stuff. Insert here actions particular to connection type (pppoe,pppoa,capi)
local insert_link_in_opts=1
if ${haspppoe}; then
if [ ! -e /proc/net/pppoe ]; then
# Load the PPPoE kernel module
if ! modprobe pppoe; then
eerror "kernel does not support PPPoE"
return 1
fi
fi
# Ensure that the link exists and is up
( IFACE="${link}"; _exists true && _up ) || return 1
insert_link_in_opts=0
fi
if ${haspppoa}; then
if [ ! -d /proc/net/atm ]; then
# Load the PPPoA kernel module
if ! modprobe pppoatm; then
eerror "kernel does not support PPPoATM"
return 1
fi
fi
if [ "${link}" != "/dev/null" ]; then
insert_link_in_opts=0
else
ewarn "WARNING: An [itf.]vpi.vci ATM address was expected in link_${IFVAR}"
fi
fi
[ "${insert_link_in_opts}" = "0" ] || opts="${link} ${opts}"
ebegin "Starting pppd in ${IFACE}"
mark_service_inactive
if [ -n "${username}" ] \
&& [ -n "${password}" -o -z "${passwordset}" ]; then
printf "%s" "${password}" | \
eval start-stop-daemon --start --exec /usr/sbin/pppd \
--pidfile "/var/run/ppp-${IFACE}.pid" -- "${opts}" >/dev/null
else
eval start-stop-daemon --start --exec /usr/sbin/pppd \
--pidfile "/var/run/ppp-${IFACE}.pid" -- "${opts}" >/dev/null
fi
if ! eend $? "Failed to start PPP"; then
mark_service_stopped
return 1
fi
if ${hasupdetach}; then
_show_address
else
einfo "Backgrounding ..."
fi
# pppd will re-call us when we bring the interface up
exit 0
}
# Dummy function for users that still have config_ppp0="ppp"
pppd_start()
{
return 0
}
pppd_stop()
{
yesno ${IN_BACKGROUND} && return 0
local pidfile="/var/run/ppp-${IFACE}.pid"
[ ! -s "${pidfile}" ] && return 0
# Give pppd at least 30 seconds do die, #147490
einfo "Stopping pppd on ${IFACE}"
start-stop-daemon --stop --quiet --exec /usr/sbin/pppd \
--pidfile "${pidfile}" --retry 30
eend $?
}

View File

@ -1,59 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
pump_depend()
{
program /sbin/pump
after interface
provide dhcp
}
_config_vars="$_config_vars dhcp pump"
pump_start()
{
local args= opt= opts=
# Get our options
eval opts=\$dhcp_${IFVAR}
[ -z "${opts}" ] && opts=${dhcp}
# Map some generic options to dhcpcd
for opt in ${opts}; do
case "${opt}" in
nodns) args="${args} --no-dns";;
nontp) args="${args} --no-ntp";;
nogateway) args="${args} --no-gateway";;
esac
done
# Add our route metric
[ "${metric:-0}" != "0" ] && args="${args} --route-metric ${metric}"
args="${args} --win-client-ident"
args="${args} --keep-up --interface ${IFACE}"
ebegin "Running pump"
eval pump "${args}"
eend $? || return 1
_show_address
return 0
}
pump_stop()
{
# We check for a pump process first as querying for status
# causes pump to spawn a process
start-stop-daemon --quiet --test --stop --exec /sbin/pump || return 0
# Check that pump is running on the interface
if ! pump --status --interface "${IFACE}" >/dev/null 2>&1; then
return 0
fi
# Pump always releases the lease
ebegin "Stopping pump on ${IFACE}"
pump --release --interface "${IFACE}"
eend $? "Failed to stop pump"
}

View File

@ -1,24 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
ssidnet_depend()
{
before interface system
after wireless
}
ssidnet_pre_start()
{
[ -z "${SSID}" -a -z "${SSIDVAR}" ] && return 0
local mac=$(_get_ap_mac_address | sed -e 's/://g') x=
vebegin "Configuring ${IFACE} for SSID ${SSID}"
_configure_variables "${mac}" "${SSIDVAR}"
# Backwards compat for old gateway var
eval x=\$gateway_${SSIDVAR}
[ -n "${x}" ] && gateway=${x}
veend 0
}

View File

@ -1,122 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
_config_vars="$_config_vars dns_servers dns_domain dns_search"
_config_vars="$_config_vars dns_sortlist dns_options"
_config_vars="$_config_vars ntp_servers nis_servers nis_domain"
system_depend()
{
after interface
before dhcp
}
_system_dns()
{
local servers= domain= search= sortlist= options= x= imetric=
eval servers=\$dns_servers_${IFVAR}
[ -z "${servers}" ] && servers=${dns_servers}
eval domain=\$dns_domain_${IFVAR}
[ -z "${domain}" ] && domain=${dns_domain}
eval search=\$dns_search_${IFVAR}
[ -z "${search}" ] && search=${dns_search}
eval sortlist=\$dns_sortlist_${IFVAR}
[ -z "${sortlist}" ] && sortlist=${dns_sortlist}
eval options=\$dns_options_${IFVAR}
[ -z "${options}" ] && options=${dns_options}
[ -z "${servers}" -a -z "${domain}" -a -z "${search}" \
-a -z "${sortlist}" -a -z "${options}" ] && return 0
local buffer="# Generated by net-scripts for interface ${IFACE}\n"
[ -n "${domain}" ] && buffer="${buffer}domain ${domain}\n"
[ -n "${search}" ] && buffer="${buffer}search ${search}\n"
for x in ${servers}; do
buffer="${buffer}nameserver ${x}\n"
done
[ -n "${sortlist}" ] && buffer="${buffer}sortlist ${sortlist}\n"
[ -n "${options}" ] && buffer="${buffer}options ${options}\n"
# Support resolvconf if we have it.
if [ -x /sbin/resolvconf ]; then
x="-a ${IFACE}"
eval imetric=\${metric_${IFVAR}}
if [ -n "${imetric}" ]; then
x="${x} -m ${imetric}"
fi
printf "${buffer}" | resolvconf ${x}
else
printf "${buffer}" > /etc/resolv.conf
chmod 644 /etc/resolv.conf
fi
}
_system_ntp()
{
local servers= buffer= x=
eval servers=\$ntp_servers_${IFVAR}
[ -z "${servers}" ] && servers=${ntp_servers}
[ -z "${servers}" ] && return 0
buffer="# Generated by net-scripts for interface ${IFACE}\n"
buffer="${buffer}restrict default noquery notrust nomodify\n"
buffer="${buffer}restrict 127.0.0.1\n"
for x in ${servers}; do
buffer="${buffer}restrict ${x} nomodify notrap noquery\n"
buffer="${buffer}server ${x}\n"
done
printf "${buffer}" > /etc/ntp.conf
chmod 644 /etc/ntp.conf
}
_system_nis()
{
local servers= domain= x= buffer=
eval servers=\$nis_servers_${IFVAR}
[ -z "${servers}" ] && servers=${nis_servers}
eval domain=\$nis_domain_${IFVAR}
[ -z "${domain}" ] && domain=${nis_domain}
[ -z "${servers}" -a -z "${domain}" ] && return 0
buffer="# Generated by net-scripts for interface ${iface}\n"
if [ -n "${domain}" ]; then
hostname -y "${domain}"
if [ -n "${servers}" ]; then
for x in ${servers}; do
buffer="${buffer}domain ${domain} server ${x}\n"
done
else
buffer="${buffer}domain ${domain} broadcast\n"
fi
else
for x in ${servers}; do
buffer="${buffer}ypserver ${x}\n"
done
fi
printf "${buffer}" > /etc/yp.conf
chmod 644 /etc/yp.conf
}
system_pre_start()
{
_system_dns
_system_ntp
_system_nis
return 0
}

View File

@ -1,102 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
tuntap_depend()
{
before bridge interface macchanger
program ip openvpn tunctl
}
_config_vars="$_config_vars iproute2 openvpn tunctl"
_is_tuntap()
{
[ -n "$(RC_SVCNAME="net.${IFACE}"; export RC_SVCNAME ; service_get_value tuntap)" ]
}
tuntap_pre_start()
{
local tuntap=
local rc=
eval tuntap=\$tuntap_${IFVAR}
[ -z "${tuntap}" ] && return 0
if [ ! -e /dev/net/tun ]; then
if ! modprobe tun; then
eerror "TUN/TAP support is not present in this kernel"
return 1
fi
vebegin "Waiting for /dev/net/tun"
# /dev/net/tun can take its time to appear
local timeout=10
while [ ! -e /dev/net/tun -a ${timeout} -gt 0 ]; do
sleep 1
: $(( timeout -= 1 ))
done
if [ ! -e /dev/net/tun ]; then
eerror "TUN/TAP support present but /dev/net/tun is not"
return 1
fi
veend 0
fi
ebegin "Creating Tun/Tap interface ${IFACE}"
# Set the base metric to 1000
metric=1000
local i_opts= o_opts= t_opts=
local do_iproute2=false do_openvpn=false do_tunctl=false
eval i_opts=\$iproute2_${IFVAR}
eval o_opts=\$openvpn_${IFVAR}
eval t_opts=\$tunctl_${IFVAR}
if [ -n "${i_opts}" ] && type ip >/dev/null 2>&1; then
do_iproute2=true
elif [ -n "${o_opts}" ] && type openvpn >/dev/null 2>&1; then
do_openvpn=true
elif [ -n "${t_opts}" ] && type tunctl >/dev/null 2>&1; then
do_tunctl=true
elif type ip >/dev/null 2>&1; then
do_iproute2=true
elif type openvpn >/dev/null 2>&1; then
do_openvpn=true
elif type tunctl >/dev/null 2>&1; then
do_tunctl=true
fi
if ${do_iproute2}; then
ip tuntap add dev "${IFACE}" mode "${tuntap}" ${i_opts}
rc=$?
elif ${do_openvpn}; then
openvpn --mktun --dev-type "${tuntap}" --dev "${IFACE}" \
${o_opts} >/dev/null
rc=$?
elif ${do_tunctl}; then
tunctl ${t_opts} -t "${IFACE}" >/dev/null
rc=$?
else
eerror "Neither iproute2, openvpn nor tunctl has been found, please install"
eerror "either \"iproute2\" \"openvpn\" or \"usermode-utilities\"."
rc=1
fi
eend $rc && _up && service_set_value tuntap "${tuntap}"
}
tuntap_post_stop()
{
_is_tuntap || return 0
ebegin "Destroying Tun/Tap interface ${IFACE}"
if type ip > /dev/null 2>&1; then
ip tuntap del dev ${IFACE} mode $(service_get_value tuntap)
elif type tunctl >/dev/null 2>&1; then
tunctl -d "${IFACE}" >/dev/null
else
openvpn --rmtun \
--dev-type "$(service_get_value tuntap)" \
--dev "${IFACE}" >/dev/null
fi
eend $?
}

View File

@ -1,110 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
udhcpc_depend()
{
program start /bin/busybox
after interface
provide dhcp
}
_config_vars="$_config_vars dhcp udhcpc"
udhcpc_start()
{
local args= opt= opts= pidfile="/var/run/udhcpc-${IFACE}.pid"
local sendhost=true cachefile="/var/cache/udhcpc-${IFACE}.lease"
eval args=\$udhcpc_${IFVAR}
# Get our options
eval opts=\$dhcp_${IFVAR}
[ -z "${opts}" ] && opts=${dhcp}
# This omits the Gentoo specific patch to busybox,
# but it creates temporary files.
# We can move this stuff to udhcpc hook script to avoid that, should we do?
local conf="/var/run/udhcpc-${IFACE}.conf"
echo -n >"$conf"
# Map some generic options to dhcpcd
for opt in ${opts}; do
case "${opt}" in
nodns) echo "PEER_DNS=no" >>"$conf" ;;
nontp) echo "PEER_NTP=no" >>"$conf" ;;
nogateway) echo "PEER_ROUTERS=no" >>"$conf" ;;
nosendhost) sendhost=false;
esac
done
[ "${metric:-0}" != "0" ] && echo "IF_METRIC=${metric}" >>"$conf"
ebegin "Running udhcpc"
# Try and load the cache if it exists
if [ -f "${cachefile}" ]; then
case "$ {args} " in
*" --request="*|*" -r "*);;
*)
local x=$(cat "${cachefile}")
# Check for a valid ip
case "${x}" in
*.*.*.*) args="${args} --request=${x}";;
esac
;;
esac
fi
case " ${args} " in
*" --quit "*|*" -q "*) x="/bin/busybox udhcpc";;
*) x="start-stop-daemon --start --exec /bin/busybox \
--pidfile \"${pidfile}\" -- udhcpc";;
esac
case " ${args} " in
*" --hostname="*|*" -h "*|*" -H "*);;
*)
if ${sendhost}; then
local hname="$(hostname)"
if [ "${hname}" != "(none)" ] && [ "${hname}" != "localhost" ]; then
args="${args} -x hostname:'${hname}'"
fi
fi
;;
esac
eval "${x}" "${args}" --interface="${IFACE}" --now \
--script="${RC_LIBEXECDIR}/sh/udhcpc-hook.sh" \
--pidfile="${pidfile}" >/dev/null
eend $? || return 1
_show_address
return 0
}
udhcpc_stop()
{
local pidfile="/var/run/udhcpc-${IFACE}.pid" opts=
[ ! -f "${pidfile}" ] && return 0
# Get our options
eval opts=\$dhcp_${IFVAR}
[ -z "${opts}" ] && opts=${dhcp}
ebegin "Stopping udhcpc on ${IFACE}"
case " ${opts} " in
*" release "*)
start-stop-daemon --stop --quiet --signal USR2 \
--exec /bin/busybox --pidfile "${pidfile}"
if [ -f /var/cache/udhcpc-"${IFACE}".lease ]; then
rm -f /var/cache/udhcpc-"${IFACE}".lease
fi
;;
esac
start-stop-daemon --stop --exec /bin/busybox --pidfile "${pidfile}"
eend $?
if [ -e "/var/run/udhcpc-${IFACE}.conf" ]; then
rm -f "/var/run/udhcpc-${IFACE}.conf"
fi
}

View File

@ -1,146 +0,0 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
vlan_depend()
{
program ip
after interface
before dhcp
}
_config_vars="$_config_vars vlans"
_is_vlan()
{
[ ! -d /proc/net/vlan ] && return 1
[ -e /proc/net/vlan/"${IFACE}" ] && return 0
grep -Eq "^${IFACE}[[:space:]]+" /proc/net/vlan/config
}
_get_vlans()
{
[ -e /proc/net/vlan/config ] || return 1
sed -n -e 's/^\W*\([^ ]*\) \(.* \) .*'"${IFACE}"'$/\1/p' /proc/net/vlan/config
}
_check_vlan()
{
if [ ! -d /proc/net/vlan ]; then
modprobe 8021q
if [ ! -d /proc/net/vlan ]; then
eerror "VLAN (802.1q) support is not present in this kernel"
return 1
fi
fi
}
vlan_pre_start()
{
local vconfig
eval vconfig=\$vconfig_${IFVAR}
if [ -n "${vconfig}" ]; then
eerror "You must convert your vconfig_ VLAN entries to vlan${N} entries."
return 1
fi
local vlans=
eval vlans=\$vlans_${IFVAR}
[ -z "$vlans" ] && return 0
case " ${MODULES} " in
*" ifconfig "*)
eerror "sys-apps/iproute2 is required to configure VLANs"
return 1 ;;
esac
}
vlan_post_start()
{
local vlans=
eval vlans=\$vlans_${IFVAR}
[ -z "${vlans}" ] && return 0
_check_vlan || return 1
_exists || return 1
local vlan= e= s= vname= vflags= vingress= vegress=
for vlan in ${vlans}; do
einfo "Adding VLAN ${vlan} to ${IFACE}"
# We need to gather all interface configuration options
# 1) naming. Default to the standard "${IFACE}.${vlan}" but it can be anything
eval vname=\$${IFACE}_vlan${vlan}_name
[ -z "${vname}" ] && eval vname=\$vlan${vlan}_name
[ -z "${vname}" ] && vname="${IFACE}.${vlan}"
# 2) flags
eval vflags=\$${IFACE}_vlan${vlan}_flags
[ -z "${vflags}" ] && eval vflags=\$vlan${vlan}_flags
# 3) ingress/egress map
eval vingress=\$${IFACE}_vlan${vlan}_ingress
[ -z "${vingress}" ] && eval vingress=\$vlan${vlan}_ingress
[ -z "${vingress}" ] || vingress="ingress-qos-map ${vingress}"
eval vegress=\$${IFACE}_vlan${vlan}_egress
[ -z "${vegress}" ] && eval vegress=\$vlan${vlan}_egress
[ -z "${vegress}" ] || vegress="egress-qos-map ${vegress}"
# txqueue
local txqueuelen=
eval txqueuelen=\$txqueuelen_${IFACE}_vlan${vlan}
[ -z "${txqueuelen}" ] && eval txqueuelen=\$txqueuelen_vlan${vlan}
# mac
local mac=
eval mac=\$mac_${IFACE}_vlan${vlan}
[ -z "${mac}" ] && eval mac=\$mac_vlan${vlan}
# broadcast
local broadcast=
eval broadcast=\$broadcast_${IFACE}_vlan${vlan}
[ -z "${broadcast}" ] && eval broadcast=\$broadcast_vlan${vlan}
# mtu
local mtu=
eval mtu=\$mtu_${IFACE}_vlan${vlan}
[ -z "${mtu}" ] && eval mtu=\$mtu_vlan${vlan}
# combine it all
local opts="${txqueuelen:+txqueuelen} ${txqueuelen} ${mac:+address} ${mac} ${broadcast:+broadcast} ${broadcast} ${mtu:+mtu} ${mtu}"
veinfo "ip link add link \"${IFACE}\" name \"${vname}\" ${opts} type vlan id \"${vlan}\" ${vflags} ${vingress} ${vegress}"
e="$(ip link add link "${IFACE}" name "${vname}" ${opts} type vlan id "${vlan}" ${vflags} ${vingress} ${vegress} 2>&1 1>/dev/null)"
if [ -n "${e}" ]; then
eend 1 "${e}"
continue
fi
# We may not want to start the vlan ourselves
eval s=\$vlan_start_${IFVAR}
yesno ${s:-yes} || continue
# We need to work out the interface name of our new vlan id
local ifname="$(sed -n -e \
's/^\([^[:space:]]*\) *| '"${vlan}"' *| .*'"${IFACE}"'$/\1/p' \
/proc/net/vlan/config )"
mark_service_started "net.${ifname}"
(
RC_SVCNAME="net.${ifname}" ; export RC_SVCNAME
start
) || mark_service_stopped "net.${ifname}"
done
return 0
}
vlan_pre_stop()
{
local vlan=
_exists || return 0
for vlan in $(_get_vlans); do
einfo "Removing VLAN ${vlan##*.} from ${IFACE}"
(
RC_SVCNAME="net.${vlan}" ; export RC_SVCNAME
stop
) && {
mark_service_stopped "net.${vlan}"
ip link delete "${vlan}" type vlan >/dev/null
}
done
return 0
}

View File

@ -1,212 +0,0 @@
# Copyright (c) 2007-2009 Roy Marples <roy@marples.name>
# Released under the 2-clause BSD license.
wpa_supplicant_depend()
{
wpas=/usr/sbin/wpa_supplicant
[ -x ${wpas} ] || wpas=/sbin/wpa_supplicant
if [ -x ${wpas} ]; then
program start ${wpas}
# bug 345281: if wpa_supplicant is built w/ USE=dbus, we need to start
# dbus before we can start wpa_supplicant.
${wpas} -h |grep DBus -sq
[ $? -eq 0 ] && need dbus
fi
after macnet plug
before interface
provide wireless
# Prefer us over iwconfig
after iwconfig
}
# Only set these functions if not set already
# IE, prefer to use iwconfig
if ! type _get_ssid >/dev/null 2>&1; then
_get_ssid()
{
local timeout=5 ssid=
while [ ${timeout} -gt 0 ]; do
ssid=$(wpa_cli -i"${IFACE}" status | sed -n -e 's/^ssid=//p')
if [ -n "${ssid}" ]; then
echo "${ssid}"
return 0
fi
sleep 1
: $(( timeout -= 1 ))
done
return 1
}
_get_ap_mac_address()
{
wpa_cli -i"${IFACE}" status | sed -n -e 's/^bssid=\(.*\)$/\1/p' \
| tr '[:lower:]' '[:upper:]'
}
fi
wpa_supplicant_pre_start()
{
local opts= cliopts= cfgfile= ctrl_dir= wireless=true
local wpas=/usr/sbin/wpa_supplicant wpac=/usr/bin/wpa_cli
local actfile=/etc/wpa_supplicant/wpa_cli.sh
if [ ! -x "${wpas}" ]; then
wpas=/sbin/wpa_supplicant
wpac=/bin/wpa_cli
fi
[ "${RC_UNAME}" = "Linux" ] || unset wpac
[ -e "${actfile}" ] || unset wpac
eval opts=\$wpa_supplicant_${IFVAR}
eval cliopts=\$wpa_cli_${IFVAR}
[ -z "${cliopts}" ] && cliopts=${wpa_cli}
case " ${opts} " in
*" -Dwired "*) wireless=false;;
*) _is_wireless || return 0;;
esac
# We don't configure wireless if we're being called from
# the background unless we're not currently running
if yesno ${IN_BACKGROUND}; then
if ${wireless} && \
service_started_daemon "${RC_SVCNAME}" "${wpas}"; then
SSID=$(_get_ssid "${IFACE}")
SSIDVAR=$(shell_var "${SSID}")
service_set_value "SSID" "${SSID}"
metric=2000
fi
return 0
fi
service_set_value "SSID" ""
ebegin "Starting wpa_supplicant on ${IFVAR}"
if type iwconfig_defaults >/dev/null 2>&1; then
iwconfig_defaults
iwconfig_user_config
fi
cfgfile=${opts##* -c}
if [ -n "${cfgfile}" -a "${cfgfile}" != "${opts}" ]; then
case "${cfgfile}" in
" "*) cfgfile=${cfgfile# *};;
esac
cfgfile=${cfgfile%% *}
else
# Support new and old style locations
cfgfile="/etc/wpa_supplicant/wpa_supplicant-${IFACE}.conf"
[ ! -e "${cfgfile}" ] \
&& cfgfile="/etc/wpa_supplicant/wpa_supplicant.conf"
[ ! -e ${cfgfile} ] \
&& cfgfile="/etc/wpa_supplicant.conf"
opts="${opts} -c ${cfgfile}"
fi
if [ ! -f ${cfgfile} ]; then
eend 1 "/etc/wpa_supplicant/wpa_supplicant.conf not found"
return 1
fi
# Work out where the ctrl_interface dir is if it's not specified
local ctrl_dir=$(sed -e 's/^ *//' \
-e '/^ctrl_interface=/!d' \
-e 's/^ctrl_interface=//' \
-e 's/^ *//' \
-e 's/^DIR=//' \
-e 's/^ *//' \
-e 's/GROUP=.*//' \
-e 's/ *$//' \
"${cfgfile}")
if [ -z "${ctrl_dir}" ]; then
ctrl_dir=${opts##* -C}
if [ -n "${ctrl_dir}" -a "${ctrl_dir}" != "${opts}" ]; then
case "${ctrl_dir}" in
" "*) ctrl_dir=${ctrl_dir# *};;
esac
ctrl_dir=${ctrl_dir%% *}
else
ctrl_dir="/var/run/wpa_supplicant"
opts="${opts} -C ${ctrl_dir}"
fi
fi
service_set_value ctrl_dir "${ctrl_dir}"
if [ -n "${wpac}" ]; then
opts="${opts} -W"
elif service_started devd; then
mark_service_inactive
fi
start-stop-daemon --start --exec "${wpas}" \
--pidfile "/var/run/wpa_supplicant-${IFACE}.pid" \
-- ${opts} -B -i "${IFACE}" \
-P "/var/run/wpa_supplicant-${IFACE}.pid"
eend $? || return 1
# If we don't have a working wpa_cli and action file continue
if [ -z "${wpac}" ]; then
if service_started devd; then
ebegin "Backgrounding ..."
exit 1
fi
return 0
fi
# Starting wpa_supplication-0.4.0, we can get wpa_cli to
# start/stop our scripts from wpa_supplicant messages
local inact=false
service_inactive && inact=true
mark_service_inactive
ebegin "Starting wpa_cli on" "${IFACE}"
start-stop-daemon --start --exec "${wpac}" \
--pidfile "/var/run/wpa_cli-${IFACE}.pid" \
-- ${cliopts} -a "${actfile}" -p "${ctrl_dir}" -i "${IFACE}" \
-P "/var/run/wpa_cli-${IFACE}.pid" -B
if eend $?; then
ebegin "Backgrounding ..."
exit 1
fi
# wpa_cli failed to start? OK, error here
start-stop-daemon --quiet --stop --exec "${wpas}" \
--pidfile "/var/run/wpa_supplicant-${IFACE}.pid"
${inact} || mark_service_stopped
return 1
}
wpa_supplicant_post_stop()
{
local wpas=/usr/sbin/wpa_supplicant wpac=/usr/bin/wpa_cli
if [ ! -x "${wpas}" ]; then
wpas=/sbin/wpa_supplicant
wpac=/bin/wpa_cli
fi
if yesno "${IN_BACKGROUND}"; then
# Only stop wpa_supplicant if it's not the controlling daemon
! service_started_daemon "${RC_SVCNAME}" "${wpas}" 1
fi
[ $? != 0 ] && return 0
local pidfile="/var/run/wpa_cli-${IFACE}.pid"
if [ -f ${pidfile} ]; then
ebegin "Stopping wpa_cli on ${IFACE}"
start-stop-daemon --stop --exec "${wpac}" --pidfile "${pidfile}"
eend $?
fi
pidfile="/var/run/wpa_supplicant-${IFACE}.pid"
if [ -f ${pidfile} ]; then
ebegin "Stopping wpa_supplicant on ${IFACE}"
start-stop-daemon --stop --exec "${wpas}" --pidfile "${pidfile}"
eend $?
fi
# If wpa_supplicant exits uncleanly, we need to remove the stale dir
[ -S "/var/run/wpa_supplicant/${IFACE}" ] \
&& rm -f "/var/run/wpa_supplicant/${IFACE}"
}

View File

@ -1,3 +1,5 @@
include ../mk/net.mk
BOOT= bootmisc fsck hostname localmount loopback \
root swap swapfiles sysctl urandom ${BOOT-${OS}}
DEFAULT= local netmount
@ -10,7 +12,7 @@ BOOTDIR= ${LEVELDIR}/boot
DEFAULTDIR= ${LEVELDIR}/default
SHUTDOWNDIR= ${LEVELDIR}/shutdown
ifeq (${MKNET},)
ifeq (${MKNET},yes)
BOOT+= network staticroute
endif
@ -25,12 +27,6 @@ BOOT-${OS}=
SHUTDOWN-${OS}=
SYSINIT-${OS}=
ifeq (${MKNET},oldnet)
BOOT-FreeBSD+= net.lo0
BOOT-Linux+= net.lo
BOOT-NetBSD+= net.lo0
endif
BOOT-BSD= hostid newsyslog savecore syslogd swap-blk
# Generic BSD stuff

3
sh/.gitignore vendored
View File

@ -6,9 +6,6 @@ runscript.sh
cgroup-release-agent.sh
init.sh
init-early.sh
ifwatchd-carrier.sh
ifwatchd-nocarrier.sh
rc-cgroup.sh
udhcpc-hook.sh
tmpfiles.sh
migrate-to-run.sh

View File

@ -13,12 +13,12 @@ SRCS-FreeBSD=
BIN-FreeBSD=
SRCS-Linux= cgroup-release-agent.sh.in init-early.sh.in migrate-to-run.sh.in \
rc-cgroup.sh.in udhcpc-hook.sh.in
rc-cgroup.sh.in
BIN-Linux= cgroup-release-agent.sh init-early.sh migrate-to-run.sh \
rc-cgroup.sh udhcpc-hook.sh
rc-cgroup.sh
SRCS-NetBSD= ifwatchd-carrier.sh.in ifwatchd-nocarrier.sh.in
BIN-NetBSD= ifwatchd-carrier.sh ifwatchd-nocarrier.sh
SRCS-NetBSD=
BIN-NetBSD=
include ${MK}/scripts.mk

View File

@ -1,5 +0,0 @@
#!@SHELL@
# Wrapper for ifwatchd(8)
IN_BACKGROUND=yes ; export IN_BACKGROUND
$RC_SERVICE --quiet start

View File

@ -1,5 +0,0 @@
#!@SHELL@
# Wrapper for ifwatchd(8)
IN_BACKGROUND=yes ; export IN_BACKGROUND
$RC_SERVICE --quiet stop

View File

@ -1,117 +0,0 @@
#!@SHELL@
# busybox udhcp setup script
PATH=/bin:/usr/bin:/sbin:/usr/sbin
peer_var()
{
[ -n "$1" ] && [ "$1" != "yes" ]
}
update_dns()
{
peer_var "${PEER_DNS}" && return
[ -z "${domain}" ] && [ -z "${dns}" ] && return
conf="# Generated by udhcpc for ${interface}\n"
[ -n "${domain}" ] && conf="${conf}domain ${domain}\n"
for i in ${dns} ; do
conf="${conf}nameserver ${i}\n"
done
if [ -x /sbin/resolvconf ] ; then
printf "${conf}" | resolvconf -a ${interface}
else
printf "${conf}" > /etc/resolv.conf
chmod 644 /etc/resolv.conf
fi
}
update_ntp()
{
peer_var "${PEER_NTP}" && return
[ -z "${ntpsrv}" ] && return
conf="# Generated by udhcpc for interface ${interface}\n"
conf="${conf}restrict default noquery notrust nomodify\n"
conf="${conf}restrict 127.0.0.1\n"
for i in ${ntpsrv} ; do
conf="${conf}restrict ${i} nomodify notrap noquery\n"
conf="${conf}server ${i}\n"
done
conf="${conf}driftfile /var/lib/ntp/ntp.drift\n"
conf="${conf}logfile /var/log/ntp.log\n"
printf "${conf}" > /etc/ntp.conf
chmod 644 /etc/ntp.conf
}
update_hostname()
{
peer_var "${PEER_HOSTNAME}" && return
[ -z "${hostname}" ] && return
myhost="$(hostname)"
[ -z "${myhost}" ] || [ "${myhost}" = "(none)" ] && hostname "${hostname}"
}
update_interface()
{
[ -n "${broadcast}" ] && broadcast="broadcast ${broadcast}"
[ -n "${subnet}" ] && netmask="netmask ${subnet}"
[ -n "${mtu}" ] && mtu="mtu ${mtu}"
ifconfig "${interface}" ${ip} ${broadcast} ${netmask} ${mtu}
}
update_routes()
{
peer_var "${PEER_ROUTERS}" && return
if [ -n "${router}" ] ; then
metric=
[ -n "${IF_METRIC}" ] && metric="metric ${IF_METRIC}"
for i in ${router} ; do
route add default gw "${i}" ${metric} dev "${interface}"
done
fi
}
deconfig()
{
ifconfig "${interface}" 0.0.0.0
if ! peer_var "${PEER_ROUTERS}" ; then
while route del default dev "${interface}" >/dev/null 2>&1; do
:
done
fi
if ! peer_var "${PEER_DNS}" ; then
[ -x /sbin/resolvconf ] && resolvconf -d "${interface}"
fi
}
if [ -r "/var/run/udhcpc-${interface}.conf" ]; then
. "/var/run/udhcpc-${interface}.conf"
fi
case "$1" in
bound|renew)
update_hostname
update_interface
update_routes
update_dns
update_ntp
;;
deconfig|leasefail)
deconfig
;;
nak)
echo "nak: ${message}"
;;
*)
echo "unknown option $1" >&2
echo "Usage: $0 {bound|deconfig|leasefail|nak|renew}" >&2
exit 1
;;
esac
exit 0