mirror of
git://slackware.nl/current.git
synced 2024-12-28 09:59:53 +01:00
da4119a5e0
ap/slackpkg-15.0.1-noarch-1.txz: Upgraded. Tweak default blacklist file's help text (thanks, dive). Fix display of blacklisted packages. Tweaks to slack-desc. Note that kernel-headers should not be blacklisted. Added Lithuania mirrors (Totoro-kun on LQ). Fix exit code for pending updates (dive). Avoid matching txz/tgz etc extension when blacklisting (dive). Use https for all slackpkg homepage links. Update mirror files (14.2 -> 15.0). Add blacklist to search option. Move applyblacklist to end of makelist(). Clarify how to blacklist duplicate packages. Fix new-config dialog. Reduce false positives in DOUBLEFILES detection. Remove spaces in awk.. More blacklisting fixups (see full commit msg). Escape plus signs in blacklist regex. Convert ${ROOT}/${WORKDIR} > ${WORKDIR} (dive). Convert ${ROOT}/${CONF} -> ${CONF} and tweak blacklists (dive). Further fixup/enhancement to blacklisting issues. Fix "slackpkg blacklist" so that it shows blacklist again. Fixup internal blacklist handling. Use ERE for sanity_check() function (David Woodfall). Remove "slackpkg blacklist" from manual pages. Fix aaa_elflibs --> aaa_libraries in sample blacklist file (mozes). Split aarch64 and arm mirrors into separate files (mozes). Allow new-config after slackpkg upgrade itself (PiterPUNK). Modify blacklist regex line ending. Thanks to Robby Workman. ap/sqlite-3.35.2-x86_64-1.txz: Upgraded. kde/kid3-3.8.6-x86_64-1.txz: Upgraded. l/glib2-2.66.8-x86_64-1.txz: Upgraded. l/pango-1.48.3-x86_64-2.txz: Rebuilt. Eliminate dangling symlink. Thanks to upnort. n/bind-9.16.13-x86_64-1.txz: Upgraded. n/links-2.22-x86_64-1.txz: Upgraded. n/network-scripts-15.0-noarch-14.txz: Rebuilt. Fix discrepancies between rc.inet1.conf versions. Move configuration of SLACC before DHCP. Don't bring up a bridge interface if it will be brought up later by IP config. Fix a typo in br_open when configuring IFOPTS: i->1. Add SLAAC security and privacy options. Fix typo of 'default'. Added debugging output around new SLAAC enhancements. Move enabling RA before SLAAC security section. Thanks to davjohn on LQ. Fix domain name validation checks. Thanks to xbeastx74 on LQ for the report. Thanks to Darren "Tadgy" Austin and Robby Workman. n/wireless_tools-30.pre9-x86_64-5.txz: Rebuilt. rc.wireless: don't leave interfaces in up state as it prevents SLAAC. Take interface down at exit from rc.wireless. Thanks to davjohn. x/libgee-0.20.4-x86_64-1.txz: Upgraded.
351 lines
14 KiB
Bash
351 lines
14 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 initalize.
|
|
# 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.
|
|
# 11/Nov/2019 * Darren Austin * Log to syslog, failling back to stdout.
|
|
# Output error to stderr if not called from
|
|
# rc.inet1.
|
|
# 09/Mar/2021 * Darren Austin * Don't leave the interface in an 'up' state upon
|
|
# exit from the script - this causes problems for
|
|
# SLAAC in rc.inet1 when control is returned.
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# If possible, log events in /var/log/messages:
|
|
if [ -f /var/run/syslogd.pid ] && [ -x /usr/bin/logger ]; then
|
|
LOGGER=/usr/bin/logger
|
|
else # output to stdout/stderr:
|
|
LOGGER=/bin/cat
|
|
fi
|
|
|
|
if [ -z "$IFNAME" ] ; then
|
|
echo "ERROR: The script 'rc.wireless' must be executed by 'rc.inet1'!" >&2
|
|
echo " You should run the command \"/etc/rc.d/rc.inet1 <your_interface>_start\" yourself." >&2
|
|
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/ip link set dev ${INTERFACE}"
|
|
|
|
is_wireless_device ()
|
|
{
|
|
# Return 0 for a wireless interface, or 1 for a non-wireless interface.
|
|
if [ -d /sys/class/net/${1}/wireless ]; then
|
|
return 0
|
|
elif grep -Fxq 'DEVTYPE=wlan' /sys/class/net/${1}/uevent 2>/dev/null; then
|
|
return 0
|
|
elif LC_ALL=C $IWPATH/iwconfig $1 2>&1 | grep -q "IEEE 802.11" ; 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
|
|
pkill --full "bin/wpa_supplicant.* -i${INTERFACE}"
|
|
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=$(cat "/sys/class/net/${INTERFACE}/address")
|
|
|
|
# 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" ] && [ -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" ] || [ -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" ] && [ ! -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=""
|
|
[ -n "$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:
|
|
if pgrep --full "bin/wpa_supplicant.* -i${INTERFACE}" >/dev/null ; 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 "$0: 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
|
|
# Update 09/Mar/21: No point bringing it up here to be taken down at exit.
|
|
# $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
|
|
$IFCOMMAND down
|
|
sleep 3
|