mirror of
git://slackware.nl/current.git
synced 2025-01-30 08:38:10 +01:00
76fc4757ac
Mon Nov 4 17:08:47 UTC 2013 Slackware 14.1 x86_64 stable is released! It's been another interesting release cycle here at Slackware bringing new features like support for UEFI machines, updated compilers and development tools, the switch from MySQL to MariaDB, and many more improvements throughout the system. Thanks to the team, the upstream developers, the dedicated Slackware community, and everyone else who pitched in to help make this release a reality. The ISOs are off to be replicated, a 6 CD-ROM 32-bit set and a dual-sided 32-bit/64-bit x86/x86_64 DVD. Please consider supporting the Slackware project by picking up a copy from store.slackware.com. We're taking pre-orders now, and offer a discount if you sign up for a subscription. Have fun! :-)
342 lines
13 KiB
Bash
342 lines
13 KiB
Bash
#!/bin/sh
|
|
# /etc/rc.d/rc.wireless
|
|
# $Id: rc.wireless,v 1.13 2007/04/13 14:14:43 eha Exp eha $
|
|
#
|
|
# Wireless network card setup.
|
|
#
|
|
# This script sets up PCI, USB, and 32-bit Cardbus wireless devices
|
|
# NOT 16-bit PCMCIA cards! Those are configured in /etc/pcmcia/.
|
|
# Single parameter to this script is the name of a network interface.
|
|
# Normally this script is called from rc.inet1 rather than run
|
|
# directly.
|
|
#
|
|
# This script is a modified '/etc/pcmcia/wireless' script
|
|
# 09/apr/2004 by Eric Hameleers
|
|
# 16/sep/2004 * Eric Hameleers * Fixed iwspy and iwpriv commands
|
|
# 08/apr/2005 * Eric Hameleers * Allow per-interface overrides of the wireless
|
|
# parameters (see /etc/rc.d/rc.inet1.conf)
|
|
# 11/apr/2005 * Eric Hameleers * Tune wpa_supplicant interactions.
|
|
# 23/apr/2005 * Eric Hameleers * First configure card with iwconfig,
|
|
# before starting wpa_supplicant
|
|
# 27/apr/2005 * Eric Hameleers * Multiple 'iwpriv $INTERFACE set' commands.
|
|
# 14/feb/2006 * Eric Hameleers * Better error messages; alternative way of
|
|
# getting HWADDR; parametrized WPA_WAIT value.
|
|
# Don't kill an already running wpa_supplicant.
|
|
# 29/apr/2006 * Pat Volkerding * Reverted HWADDR change, since it relies on
|
|
# a binary (macaddr) that is not built or
|
|
# installed by default since it is not
|
|
# compatible with all interfaces.
|
|
# 15/aug/2006 * Eric Hameleers * Added missing "" around $ESSID, which broke
|
|
# ESSIDs that contain a space character.
|
|
# 10/oct/2006 * Eric Hameleers * Added default empty values for all parameters.
|
|
# This makes a second wireless card leave
|
|
# wpa_supplicant alone if WPA is not configured.
|
|
# 15/oct/2006 * Eric Hameleers * Swapped the calls to "key <key>" and
|
|
# "key restricted" since that might be needed
|
|
# for WEP to work reliably.
|
|
# 09/jan/2007 * Eric Hameleers * Add explicit default values to wireless params;
|
|
# also set the ESSID before IWPRIV commands,
|
|
# needed for some RaLink cards;
|
|
# use /proc/net/wireless instead of calling
|
|
# iwconfig to determine if a card is wireless.
|
|
# 13/apr/2007 * Eric Hameleers * Use of the IWPRIV variable was broken.
|
|
# NOTE: if you need to enter multiple parameters
|
|
# in IWPRIV, you must separate them with the pipe
|
|
# (|) character - this used to be a space char!
|
|
# See the example in rc.inet1.conf.
|
|
# 16/apr/2008 * Pat Volkerding * Make sure that HWADDR is all upper case.
|
|
# 23/apr/2008 * Pat Volkerding * Increase sleep time after bringing up an
|
|
# interface to 3 seconds. Some drivers
|
|
# need this additional time to initialize.
|
|
# 02/jan/2010 * Pat Volkerding * Look for /sys/class/net/$NETDEV/wireless rather
|
|
# than the contents of /proc/net/wireless to find
|
|
# if a network device is wireless. In newer
|
|
# kernels devices will not show up in
|
|
# /proc/net/wireless until active.
|
|
# 16/aug/2012 * Pat Volkerding * Use several tests to determine if an interface
|
|
# is wireless, as the reliability of any given
|
|
# test may depend on the kernel options and the
|
|
# wireless driver used.
|
|
# Convert the MAC address to uppercase in sed.
|
|
# ------------------------------------------------------------------------------
|
|
|
|
LOGGER=${LOGGER:-cat}
|
|
|
|
if [ -z $IFNAME ] ; then
|
|
echo "WARNING: The script 'rc.wireless' must be executed by 'rc.inet1'!" | $LOGGER
|
|
echo " You should run the command \"/etc/rc.d/rc.inet1 <your_interface>_start\" yourself." | $LOGGER
|
|
return 1 2> /dev/null || exit 1
|
|
fi
|
|
|
|
INTERFACE=$1
|
|
|
|
# Find the path where wireless tools are installed
|
|
for IWPATH in /usr/{bin,sbin} /usr/local/{bin,sbin} /sbin /bin ; do
|
|
if [ -x $IWPATH/iwconfig ] ; then break ; fi
|
|
done
|
|
|
|
# The same for wpa_supplicant (needed for WPA support)
|
|
for SUPPATH in /usr/{bin,sbin} /usr/local/{bin,sbin} /sbin /bin ; do
|
|
if [ -x $SUPPATH/wpa_supplicant ] ; then break ; fi
|
|
done
|
|
|
|
# Set all desired settings through the wireless tools
|
|
IWCOMMAND="$IWPATH/iwconfig ${INTERFACE}"
|
|
IWPRIVCMD="$IWPATH/iwpriv ${INTERFACE}"
|
|
IWSPYCMD="$IWPATH/iwspy ${INTERFACE}"
|
|
IFCOMMAND="/sbin/ifconfig ${INTERFACE}"
|
|
|
|
is_wireless_device ()
|
|
{
|
|
# Return 0 for a wireless interface, or 1 for a non-wireless interface.
|
|
if LC_ALL=C $IWPATH/iwconfig $1 2>&1 | grep -q "IEEE 802.11" ; then
|
|
return 0
|
|
elif [ -d /sys/class/net/${1}/wireless ]; then
|
|
return 0
|
|
elif [ "$(cat /sys/class/net/${1}/uevent | grep DEVTYPE)" = "DEVTYPE=wlan" ]; then
|
|
return 0
|
|
else # all tests failed, assume the device is not wireless (or add a better test :)
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
###############
|
|
# EXIT POINTS #
|
|
###############
|
|
|
|
# Is the device wireless? If not, exit this script.
|
|
is_wireless_device ${INTERFACE} || return 0 2> /dev/null || exit 0
|
|
|
|
# If we stop a wireless interface using wpa_supplicant,
|
|
# we'll kill its wpa_supplicant daemon too and exit this script:
|
|
if [ "$2" = "stop" ]; then
|
|
WPAPID=$(echo $(ps axww | grep wpa_supplicant | grep i${INTERFACE}) | cut -f1 -d' ')
|
|
[ ${WPAPID} ] && kill ${WPAPID}
|
|
return 0
|
|
fi
|
|
|
|
# -----------------------------------------------------
|
|
# Continue with the script - bringing the interface UP.
|
|
# -----------------------------------------------------
|
|
|
|
# Bring interface up - for determining the HWADDR
|
|
$IFCOMMAND up
|
|
sleep 3
|
|
|
|
# Get the MAC address for the interface
|
|
HWADDR=$(/sbin/ifconfig ${INTERFACE} | sed -ne 's/.*\(..:..:..:..:..:..\).*/\U\1/p')
|
|
|
|
# Empty all wireless parameters- some of them could still be set for a previous interface:
|
|
# when rc.inet1 is sourced from rc.M all scripts are run in the same shell.
|
|
CHANNEL=""
|
|
ESSID=""
|
|
FREQ=""
|
|
FRAG=""
|
|
IWCONFIG=""
|
|
IWPRIV=""
|
|
IWSPY=""
|
|
KEY=""
|
|
MODE=""
|
|
NICKNAME=""
|
|
NWID=""
|
|
RATE=""
|
|
RTS=""
|
|
SENS=""
|
|
WPA=""
|
|
WPADRIVER=""
|
|
WPACONF=""
|
|
WPAWAIT=""
|
|
# Read the configuration information for the card with address $HWADDR
|
|
# from /etc/rc.d/rc.wireless.conf:
|
|
[[ -r /etc/rc.d/rc.wireless.conf ]] && . /etc/rc.d/rc.wireless.conf
|
|
|
|
# Let any per-interface overrides (the WLAN_xxxx parameters) that are set
|
|
# in /etc/rc.d/rc.inet1.conf have precedence.
|
|
# The reason: you might have multiple wireless cards of the same brand, or
|
|
# connecting to multiple networks.
|
|
# Position 'i' of this interface in the IFNAME array was determined in rc.inet1
|
|
CHANNEL=${WLAN_CHANNEL[$i]:-${CHANNEL}}
|
|
ESSID=${WLAN_ESSID[$i]:-${ESSID}}
|
|
FREQ=${WLAN_FREQ[$i]:-${FREQ}}
|
|
FRAG=${WLAN_FRAG[$i]:-${FRAG}}
|
|
IWCONFIG=${WLAN_IWCONFIG[$i]:-${IWCONFIG}}
|
|
IWPRIV=${WLAN_IWPRIV[$i]:-${IWPRIV}}
|
|
IWSPY=${WLAN_IWSPY[$i]:-${IWSPY}}
|
|
KEY=${WLAN_KEY[$i]:-${KEY}}
|
|
MODE=${WLAN_MODE[$i]:-${MODE}}
|
|
NICKNAME=${WLAN_NICKNAME[$i]:-${NICKNAME}}
|
|
NWID=${WLAN_NWID[$i]:-${NWID}}
|
|
RATE=${WLAN_RATE[$i]:-${RATE}}
|
|
RTS=${WLAN_RTS[$i]:-${RTS}}
|
|
SENS=${WLAN_SENS[$i]:-${SENS}}
|
|
WPA=${WLAN_WPA[$i]:-${WPA}}
|
|
# The "ext" interface will be default if not explicitly set
|
|
WPADRIVER=${WLAN_WPADRIVER[$i]:-${WPADRIVER:="wext"}}
|
|
# The default config file as installed by the wpa_supplicant package:
|
|
WPACONF=${WLAN_WPACONF[$i]:-${WPACONF:="/etc/wpa_supplicant.conf"}}
|
|
WPAWAIT=${WLAN_WPAWAIT[$i]:-${WPAWAIT:="60"}}
|
|
|
|
|
|
[ -n "$VERBOSE" -a -n "$INFO" ] && echo "$0: $1 information: '$INFO'"
|
|
|
|
###################
|
|
# WIRELESS CONFIG #
|
|
###################
|
|
|
|
# Mode needs to be first : some settings apply only in a specific mode!
|
|
if [ -n "$MODE" ] ; then
|
|
echo "$0: $IWCOMMAND mode $MODE" | $LOGGER
|
|
# if $IWCOMMAND fails, try taking the interface down to run it.
|
|
# Some drivers require this.
|
|
if ! $IWCOMMAND mode $MODE 2> /dev/null ; then
|
|
$IFCOMMAND down
|
|
$IWCOMMAND mode $MODE
|
|
$IFCOMMAND up
|
|
sleep 3
|
|
fi
|
|
fi
|
|
# This is a bit hackish, but should do the job right...
|
|
if [ ! -n "$NICKNAME" ] ; then
|
|
NICKNAME=$(/bin/hostname)
|
|
fi
|
|
if [ -n "$ESSID" -o -n "$MODE" ] ; then
|
|
echo "$0: $IWCOMMAND nick $NICKNAME" | $LOGGER
|
|
$IWCOMMAND nick $NICKNAME
|
|
fi
|
|
# Regular stuff...
|
|
if [ -n "$NWID" ] ; then
|
|
echo "$0: $IWCOMMAND nwid $NWID" | $LOGGER
|
|
$IWCOMMAND nwid $NWID
|
|
fi
|
|
if [ -n "$FREQ" ] ; then
|
|
echo "$0: $IWCOMMAND freq $FREQ" | $LOGGER
|
|
$IWCOMMAND freq $FREQ
|
|
elif [ -n "$CHANNEL" ] ; then
|
|
echo "$0: $IWCOMMAND channel $CHANNEL" | $LOGGER
|
|
$IWCOMMAND channel $CHANNEL
|
|
fi
|
|
|
|
# WEP keys (non-WPA)
|
|
if [ -n "$KEY" -a ! -n "$WPA" ] ; then
|
|
if [ "$KEY" = "off" ]; then
|
|
echo "$0: $IWCOMMAND key open" | $LOGGER
|
|
$IWCOMMAND key open
|
|
echo "$0: $IWCOMMAND key off" | $LOGGER
|
|
$IWCOMMAND key off
|
|
else
|
|
echo "$0: $IWCOMMAND key ************" | $LOGGER
|
|
$IWCOMMAND key $KEY
|
|
if ! echo "$KEY" | egrep -qw "restricted|open" ; then
|
|
# Set "restricted" as the default security mode:
|
|
echo "$0: $IWCOMMAND key restricted" | $LOGGER
|
|
$IWCOMMAND key restricted
|
|
fi
|
|
fi
|
|
fi
|
|
if [ -n "$SENS" ] ; then
|
|
echo "$0: $IWCOMMAND sens $SENS" | $LOGGER
|
|
$IWCOMMAND sens $SENS
|
|
fi
|
|
if [ -n "$RATE" ] ; then
|
|
echo "$0: $IWCOMMAND rate $RATE" | $LOGGER
|
|
$IWCOMMAND rate $RATE
|
|
fi
|
|
if [ -n "$RTS" ] ; then
|
|
echo "$0: $IWCOMMAND rts $RTS" | $LOGGER
|
|
$IWCOMMAND rts $RTS
|
|
fi
|
|
if [ -n "$FRAG" ] ; then
|
|
echo "$0: $IWCOMMAND frag $FRAG" | $LOGGER
|
|
$IWCOMMAND frag $FRAG
|
|
fi
|
|
# More specific parameters
|
|
if [ -n "$IWCONFIG" ] ; then
|
|
echo "$0: $IWCOMMAND $IWCONFIG" | $LOGGER
|
|
$IWCOMMAND $IWCONFIG
|
|
fi
|
|
if [ -n "$IWSPY" ] ; then
|
|
echo "$0: $IWSPYCMD $IWSPY" | $LOGGER
|
|
$IWSPYCMD $IWSPY
|
|
fi
|
|
# For RaLink cards, the SSID must be set right before configuring WPAPSK/TKIP parameters
|
|
# using iwpriv commands in order to generate the wpapsk password. This should not hurt other cards:
|
|
if [ -n "$ESSID" ] ; then
|
|
echo "$0: $IWCOMMAND essid \"$ESSID\"" | $LOGGER
|
|
$IWCOMMAND essid "$ESSID"
|
|
fi
|
|
# The iwpriv can set one private IOCTL at the time, so if the $IWPRIV
|
|
# variable contains multiple pipe ('|') separated settings, we split them here:
|
|
# WARNING: if your iwpriv commands contain a WEP/WPA key, these can be logged
|
|
# in /var/log/messages!
|
|
if [ -n "$IWPRIV" ] ; then
|
|
echo "${IWPRIV}|" | \
|
|
while read -d '|' iwi; do
|
|
if [ -n "$iwi" ]; then
|
|
echo "$0: '$IWPRIVCMD $iwi'" | $LOGGER
|
|
$IWPRIVCMD $iwi
|
|
fi
|
|
done
|
|
fi
|
|
|
|
##################
|
|
# WPA_SUPPLICANT #
|
|
##################
|
|
|
|
# Support for WPA (wireless protected access) is provided by wpa_supplicant
|
|
# for those drivers that support it (and it looks like wpa_supplicant is
|
|
# the future for WPA support in Linux anyway)
|
|
if [ "$WPA" = "wpa_supplicant" ] || [ "$WPA" = "wpaxsupplicant" ] && [ -x ${SUPPATH}/wpa_supplicant ]; then
|
|
# Interface down, so wpa_supplicant can associate with the AP
|
|
$IFCOMMAND down
|
|
#WPACONF=${WPACONF:-/etc/wpa_supplicant.conf}
|
|
WPA_OPTIONS=""
|
|
[ ${WPADRIVER} ] && WPA_OPTIONS="-D${WPADRIVER}" # specify the driver
|
|
[ ${WPA} = "wpaxsupplicant" ] && WPA_OPTIONS="${WPA_OPTIONS} -e" # Use external xsupplicant (disables the internal supplicant)
|
|
|
|
# We leave a running wpa_supplicant process in peace:
|
|
WPAPID=$(echo $(ps axww | grep wpa_supplicant | grep i${INTERFACE}) | cut -f1 -d' ')
|
|
if [ ${WPAPID} ]; then
|
|
echo "$0: wpa_supplicant found running already" | $LOGGER
|
|
else
|
|
echo "$0: wpa_supplicant -B -c${WPACONF} ${WPA_OPTIONS} -i$INTERFACE" | $LOGGER
|
|
${SUPPATH}/wpa_supplicant -B -c${WPACONF} ${WPA_OPTIONS} -i$INTERFACE
|
|
fi
|
|
|
|
# Buy wpa_supplicant some time to authenticate before bringing the
|
|
# interface back up... but we don't wait forever:
|
|
# You can increase this value in rc.inet1.conf (WLAN_WPAWAIT) or rc.wireless.conf (WPAWAIT)
|
|
# if your card takes longer to associate:
|
|
WPAWAIT=${WPAWAIT:-10}
|
|
wi=0
|
|
while [ $wi -lt $WPAWAIT ]; do
|
|
wi=$(($wi+1)); sleep 1
|
|
if (grep -q "^ctrl_interface=" ${WPACONF}); then
|
|
if (LC_ALL=C ${SUPPATH}/wpa_cli -i$INTERFACE status | grep -q "^wpa_state=COMPLETED"); then break; fi
|
|
else
|
|
if (LC_ALL=C ${IWCOMMAND} | grep -Eq "Encryption key:....-"); then break; fi
|
|
fi
|
|
done
|
|
if [ $wi -eq $WPAWAIT ]; then
|
|
echo "WPA authentication did not complete, try running '/etc/rc.d/rc.inet1 ${INTERFACE}_start' in a few seconds." | $LOGGER
|
|
fi
|
|
# Bring interface up to avoid 'not ready' errors when calling iwconfig
|
|
$IFCOMMAND up
|
|
sleep 3
|
|
|
|
else
|
|
|
|
# ESSID need to be last: most devices re-perform the scanning/discovery
|
|
# when this is set, and things like encryption keys had better be
|
|
# defined if we want to discover the right set of APs/nodes.
|
|
# NOTE: when automatic association does not work, but you manage to get
|
|
# an IP address by manually setting the ESSID and then calling dhcpcd,
|
|
# then the cause might be the incorrect definition of your ESSID="bla"
|
|
# parameter in rc.wireless.conf.
|
|
# Debug your wireless problems by running 'iwevent' while the card
|
|
# is being configured.
|
|
if [ -n "$ESSID" ] ; then
|
|
echo "$0: $IWCOMMAND essid \"$ESSID\"" | $LOGGER
|
|
$IWCOMMAND essid "$ESSID"
|
|
fi
|
|
|
|
fi
|