diff options
Diffstat (limited to 'src/netctl-auto')
-rwxr-xr-x | src/netctl-auto | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/netctl-auto b/src/netctl-auto new file mode 100755 index 0000000..c6aaf67 --- /dev/null +++ b/src/netctl-auto @@ -0,0 +1,87 @@ +#! /bin/bash +. /usr/lib/network/network +. "$SUBR_DIR/8021x" +. "$SUBR_DIR/rfkill" +. /etc/conf.d/netcfg + +AUTOWIFI="/usr/sbin/wpa_actiond -p /run/wpa_supplicant" +ACTION_SCRIPT="/usr/bin/netcfg-wpa_actiond-action" + +case $1 in + help) + echo "netcfg-wpa_actiond <interface>" + echo "netcfg-wpa_actiond stop <interface>" + exit + ;; + stop) + [[ -z $2 ]] && echo "Please specify an interface to stop" && exit 1 + interface=$2 + PIDFILE="/run/wpa_actiond_${interface}.pid" + [[ -f "$IFACE_DIR/$interface" ]] && source "$IFACE_DIR/$interface" + netcfg -D "$interface" + timeout_wait 1 '[[ ! -f "$PIDFILE" ]]' || kill "$(< "$PIDFILE")" + # only try to disable software rfkill switches (FS#25514) + if [[ "$RFKILL" == "soft" ]]; then + set_rf_state "$interface" disabled $RFKILL_NAME || exit $? + fi + exit + ;; + *) + interface=$1; shift + PIDFILE="/run/wpa_actiond_${interface}.pid" + EXTRA_AUTOWIFI_OPTIONS="$*" + ;; +esac + +if [[ -z $interface ]]; then + echo "No interface specified" + exit 1 +fi + +# Load interface specific config +[[ -f "$IFACE_DIR/$interface" ]] && source "$IFACE_DIR/$interface" + +if [[ -f "$CONN_DIR/interfaces/$interface" ]]; then + netcfg -D "$interface" +fi + +if [[ -n "$RFKILL" ]]; then # Enable radio if necessary + enable_rf "$interface" "$RFKILL" "$RFKILL_NAME" || exit $? +fi + +WPA_CONF="$(make_wpa_config_file "$interface")" + +if [[ -n "${AUTO_PROFILES}" ]]; then + for prof in "${AUTO_PROFILES[@]}"; do echo "$prof"; done +else + list_profiles +fi | while read profile; do + echo "$profile" + ( + load_profile "$profile" + + [[ $CONNECTION != "wireless" ]] && exit 1 + [[ $INTERFACE != $interface ]] && exit 1 + # Exclude wpa-config, the wpa_conf is 'complete' and doesn't fit in this scheme + [[ -z "$SECURITY" ]] && SECURITY="none" + [[ $SECURITY == "wpa-config" ]] && exit 1 + + printf "%s\n" "network={" "$(make_wpa_config)" "id_str=\"$profile\"" "}" >> "$WPA_CONF" + ) +done + + +[[ -z $WPA_DRIVER ]] && WPA_DRIVER="nl80211,wext" +WPA_OPTS="-W $WPA_OPTS" + +# Kill any existing wpa_supplicant on this interface +stop_wpa "$interface" &> /dev/null + +if start_wpa "$interface" "$WPA_CONF" "$WPA_DRIVER" $WPA_OPTS; then + if $AUTOWIFI -i "$interface" -P "$PIDFILE" -a "$ACTION_SCRIPT" $EXTRA_AUTOWIFI_OPTIONS; then + exit 0 + fi +fi + +exit 1 + |