summaryrefslogtreecommitdiffstats
path: root/src/netctl-auto
blob: c6aaf67a0d2b2750c3cc9f8279ebb1dfd5956b31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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