diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/Makefile | 6 | ||||
-rw-r--r-- | net/dhclient.sh | 75 | ||||
-rw-r--r-- | net/dhcpcd.sh | 71 | ||||
-rw-r--r-- | net/macchanger.sh | 88 | ||||
-rw-r--r-- | net/macnet.sh | 19 | ||||
-rw-r--r-- | net/ssidnet.sh | 24 | ||||
-rw-r--r-- | net/system.sh | 106 | ||||
-rw-r--r-- | net/wpa_supplicant.sh | 164 |
8 files changed, 553 insertions, 0 deletions
diff --git a/net/Makefile b/net/Makefile new file mode 100644 index 00000000..5ed3d8b9 --- /dev/null +++ b/net/Makefile @@ -0,0 +1,6 @@ +DIR = /$(LIB)/rcscripts/net +FILES = dhclient.sh dhcpcd.sh macchanger.sh macnet.sh ssidnet.sh system.sh \ + wpa_supplicant.sh + +TOPDIR = .. +include $(TOPDIR)/default.mk diff --git a/net/dhclient.sh b/net/dhclient.sh new file mode 100644 index 00000000..14838d00 --- /dev/null +++ b/net/dhclient.sh @@ -0,0 +1,75 @@ +# Copyright 2004-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +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= + + _wait_for_carrier || return 1 + + # 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} -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}" -- ${opts} -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 $? +} + +# vim: set ts=4 : diff --git a/net/dhcpcd.sh b/net/dhcpcd.sh new file mode 100644 index 00000000..f90f3336 --- /dev/null +++ b/net/dhcpcd.sh @@ -0,0 +1,71 @@ +# Copyright 2004-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +dhcpcd_depend() { + after interface + program start /sbin/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" + + _wait_for_carrier || return 1 + + eval args=\$dhcpcd_${IFVAR} + + # 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} -R" ;; + nontp) args="${args} -N" ;; + nonis) args="${args} -Y" ;; + nogateway) args="${args} -G" ;; + nosendhost) args="${args} -h ''"; + esac + done + + # Add our route metric + [ "${metric:-0}" != "0" ] && args="${args} -m ${metric}" + + # Bring up DHCP for this interface + ebegin "Running dhcpcd" + + eval /sbin/dhcpcd "${args}" "${IFACE}" + eend $? || return 1 + + _show_address + return 0 +} + +dhcpcd_stop() { + local pidfile="/var/run/dhcpcd-${IFACE}.pid" opts= + [ ! -f "${pidfile}" ] && return 0 + + # Get our options + if [ -x /sbin/dhcpcd ] ; then + eval opts=\$dhcp_${IFVAR} + [ -z "${opts}" ] && opts=${dhcp} + fi + + ebegin "Stopping dhcpcd on ${IFACE}" + case " ${opts} " in + *" release "*) dhcpcd -k "${IFACE}" ;; + *) + start-stop-daemon --stop --quiet \ + --exec /sbin/dhcpcd --pidfile "${pidfile}" + ;; + esac + eend $? +} + +# vim: set ts=4 : diff --git a/net/macchanger.sh b/net/macchanger.sh new file mode 100644 index 00000000..dce481c8 --- /dev/null +++ b/net/macchanger.sh @@ -0,0 +1,88 @@ +# Copyright 2004-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +macchanger_depend() { + before macnet +} + +_config_vars="$_config_vars mac" + +macchanger_pre_start() { + # We don't change MAC addresses from background + ${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:]') + case "${mac}" in + # specific mac-addr, i wish there were a shorter way to specify this + [0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]:[0-9a-f][0-9a-f]) + # 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 + 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 +} + +# vim: set ts=4 : diff --git a/net/macnet.sh b/net/macnet.sh new file mode 100644 index 00000000..d8db406a --- /dev/null +++ b/net/macnet.sh @@ -0,0 +1,19 @@ +# Copyright 2005-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +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 +} + +# vim: set ts=4 : diff --git a/net/ssidnet.sh b/net/ssidnet.sh new file mode 100644 index 00000000..379e4d38 --- /dev/null +++ b/net/ssidnet.sh @@ -0,0 +1,24 @@ +# Copyright 2004-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +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 +} + +# vim: set ts=4 : diff --git a/net/system.sh b/net/system.sh new file mode 100644 index 00000000..68abc7fe --- /dev/null +++ b/net/system.sh @@ -0,0 +1,106 @@ +# Copyright 2005-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +_config_vars="$_config_vars dns_servers dns_domain dns_search" +_config_vars="$_config_vars ntp_servers nis_servers nis_domain" + +system_depend() { + after interface + before dhcp +} + +_system_dns() { + local servers= domain= search= x= + + 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} + + [ -z "${servers}" -a -z "${domain}" -a -z "${search}" ] && 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 + + # Support resolvconf if we have it. + if [ -x /sbin/resolvconf ] ; then + printf "${buffer}" | resolvconf -a "${IFACE}" + 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 + + buffer="${buffer}driftfile /var/lib/ntp/ntp.drift\n" + buffer="${buffer}logfile /var/log/ntp.log\n" + + 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 +} + +# vim: set ts=4 : diff --git a/net/wpa_supplicant.sh b/net/wpa_supplicant.sh new file mode 100644 index 00000000..7ba5bb4f --- /dev/null +++ b/net/wpa_supplicant.sh @@ -0,0 +1,164 @@ +# Copyright 2004-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +wpa_supplicant_depend() { + program start /sbin/wpa_supplicant + 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>/dev/null ; 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=$((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= cfgfile= ctrl_dir= + + _is_wireless || return 0 + + # We don't configure wireless if we're being called from + # the background unless we're not currently running + if [ "${IN_BACKGROUND}" = "true" ] ; then + if service_started_daemon "${SVCNAME}" /sbin/wpa_supplicant ; then + SSID=$(_get_ssid "${IFACE}") + SSIDVAR=$(_shell_var "${SSID}") + save_options "SSID" "${SSID}" + metric=2000 + fi + return 0 + fi + + save_options "SSID" "" + eval opts=\$wpa_supplicant_${IFVAR} + ebegin "Starting wpa_supplicant on" "${IFVAR}" + + + if [ -x /sbin/iwconfig ] ; then + local x= + for x in txpower rate rts frag ; do + iwconfig "${IFACE}" "${x}" auto 2>/dev/null + done + 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 -n -e 's/[ \t]*#.*//g;s/[ \t]*$//g;s/^ctrl_interface=//p' "${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 + save_options ctrl_dir "${ctrl_dir}" + + actfile="/etc/wpa_supplicant/wpa_cli.sh" + + start-stop-daemon --start --exec /sbin/wpa_supplicant \ + --pidfile "/var/run/wpa_supplicant-${IFACE}.pid" \ + -- ${opts} -W -B -i "${IFACE}" \ + -P "/var/run/wpa_supplicant-${IFACE}.pid" + eend $? || return 1 + + # 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 "${SVCNAME}" && inact=true + mark_service_inactive "${SVCNAME}" + + ebegin "Starting wpa_cli on" "${IFACE}" + start-stop-daemon --start --exec /bin/wpa_cli \ + --pidfile "/var/run/wpa_cli-${IFACE}.pid" \ + -- -a /etc/wpa_supplicant/wpa_cli.sh -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 /sbin/wpa_supplicant \ + --pidfile "/var/run/wpa_supplicant-${IFACE}.pid" + ${inact} || mark_service_stopped "${SVCNAME}" + return 1 +} + +wpa_supplicant_post_stop() { + if [ "${IN_BACKGROUND}" = "true" ] ; then + # Only stop wpa_supplicant if it's not the controlling daemon + ! service_started_daemon "${SVCNAME}" /sbin/wpa_supplicant 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 /bin/wpa_cli \ + --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 /sbin/wpa_supplicant \ + --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}" +} + +# vim: set ts=4 : |