/mandos/release

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/release

« back to all changes in this revision

Viewing changes to network-hooks.d/wireless

Merge new wireless network hook.  Fix bridge network hook to use
hardware addresses instead of interface names.  Implement and document
new "CONNECT" environment variable for network hooks.

Show diffs side-by-side

added added

removed removed

Lines of Context:
6
6
# configuration file(s) should be copied into the
7
7
# /etc/mandos/network-hooks.d directory.
8
8
9
 
# Copyright © 2012-2018 Teddy Hogeborn
10
 
# Copyright © 2012-2018 Björn Påhlsson
11
 
12
9
# Copying and distribution of this file, with or without modification,
13
10
# are permitted in any medium without royalty provided the copyright
14
11
# notice and this notice are preserved.  This file is offered as-is,
35
32
    exit
36
33
fi
37
34
 
38
 
ifkeys=`sed -n -e 's/^ADDRESS_\([^=]*\)=.*/\1/p' "$CONFIG" | sort -u`
 
35
ifkeys=`env | sed -n -e 's/^ADDRESS_\([^=]*\)=.*/\1/p' "$CONFIG" \
 
36
    | sort -u`
39
37
 
40
38
# Exit if DEVICE is set and is not any of the wireless interfaces
41
39
if [ -n "$DEVICE" ]; then
43
41
        for KEY in $ifkeys; do
44
42
            ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
45
43
            INTERFACE=`addrtoif "$ADDRESS"`
46
 
            
47
 
            case "$DEVICE" in
48
 
                *,"$INTERFACE"|*,"$INTERFACE",*|"$INTERFACE",*|"$INTERFACE")
49
 
                    break 2;;
50
 
            esac
 
44
            if [ "$INTERFACE" = "$DEVICE" ]; then
 
45
                break 2
 
46
            fi
51
47
        done
52
48
        exit
53
49
    done
74
70
    WPAS_OPTIONS="-P$PIDFILE $WPAS_OPTIONS"
75
71
fi
76
72
 
77
 
do_start(){
78
 
    mkdir -m u=rwx,go= -p "$CTRLDIR"
79
 
    "$wpa_supplicant" -B -g "$CTRL" -p "$CTRLDIR" $WPAS_OPTIONS
80
 
    for KEY in $ifkeys; do
81
 
        ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
82
 
        INTERFACE=`addrtoif "$ADDRESS"`
83
 
        DRIVER=`eval 'echo "$WPA_DRIVER_'"$KEY"\"`
84
 
        IFDELAY=`eval 'echo "$DELAY_'"$KEY"\"`
85
 
        "$wpa_cli" -g "$CTRL" interface_add "$INTERFACE" "" \
86
 
            "${DRIVER:-wext}" "$CTRLDIR" > /dev/null \
87
 
            | sed -e '/^OK$/d'
88
 
        NETWORK=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" add_network`
89
 
        eval wpa_interface_"$KEY"
90
 
        "$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" enable_network \
91
 
            "$NETWORK" | sed -e '/^OK$/d'
92
 
        sleep "${IFDELAY:-$DELAY}" &
93
 
        sleep=$!
94
 
        while :; do
95
 
            kill -0 $sleep 2>/dev/null || break
96
 
            STATE=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" status \
97
 
                | sed -n -e 's/^wpa_state=//p'`
98
 
            if [ "$STATE" = COMPLETED ]; then
99
 
                while :; do
100
 
                    kill -0 $sleep 2>/dev/null || break 2
101
 
                    UP=`cat /sys/class/net/"$INTERFACE"/operstate`
102
 
                    if [ "$UP" = up ]; then
103
 
                        kill $sleep 2>/dev/null
104
 
                        break 2
105
 
                    fi
106
 
                    sleep 1
107
 
                done
108
 
            fi
109
 
            sleep 1
110
 
        done &
111
 
        wait $sleep || :
112
 
        IPADDRS=`eval 'echo "$IPADDRS_'"$KEY"\"`
113
 
        if [ -n "$IPADDRS" ]; then
114
 
            if [ "$IPADDRS" = dhcp ]; then
115
 
                ipconfig -c dhcp -d "$INTERFACE" || :
116
 
                #dhclient "$INTERFACE"
117
 
            else
118
 
                for ipaddr in $IPADDRS; do
119
 
                    "$ip" addr add "$ipaddr" dev "$INTERFACE"
120
 
                done
121
 
            fi
122
 
        fi
123
 
        ROUTES=`eval 'echo "$ROUTES_'"$KEY"\"`
124
 
        if [ -n "$ROUTES" ]; then
125
 
            for route in $ROUTES; do
126
 
                "$ip" route add "$route" dev "$INTERFACE"
127
 
            done
128
 
        fi
129
 
    done
130
 
}
131
 
 
132
 
do_stop(){
133
 
    "$wpa_cli" -g "$CTRL" terminate 2>&1 | sed -e '/^OK$/d'
134
 
    for KEY in $ifkeys; do
135
 
        ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
136
 
        INTERFACE=`addrtoif "$ADDRESS"`
137
 
        "$ip" addr show scope global permanent dev "$INTERFACE" \
138
 
            | while read type addr rest; do
 
73
case "${MODE:-$1}" in
 
74
    start)
 
75
        mkdir -m u=rwx,go= -p "$CTRLDIR"
 
76
        "$wpa_supplicant" -B -g "$CTRL" -p "$CTRLDIR" $WPAS_OPTIONS
 
77
        for KEY in $ifkeys; do
 
78
            ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
 
79
            INTERFACE=`addrtoif "$ADDRESS"`
 
80
            DRIVER=`eval 'echo "$WPA_DRIVER_'"$KEY"\"`
 
81
            IFDELAY=`eval 'echo "$DELAY_'"$KEY"\"`
 
82
            "$wpa_cli" -g "$CTRL" interface_add "$INTERFACE" "" \
 
83
                "${DRIVER:-wext}" "$CTRLDIR" > /dev/null \
 
84
                | sed -e '/^OK$/d'
 
85
            NETWORK=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" \
 
86
                add_network`
 
87
            eval wpa_interface_"$KEY"
 
88
            "$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" enable_network \
 
89
                "$NETWORK" | sed -e '/^OK$/d'
 
90
            sleep "${IFDELAY:-$DELAY}" &
 
91
            sleep=$!
 
92
            while :; do
 
93
                kill -0 $sleep 2>/dev/null || break
 
94
                STATE=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" \
 
95
                    status | sed -n -e 's/^wpa_state=//p'`
 
96
                if [ "$STATE" = COMPLETED ]; then
 
97
                    while :; do
 
98
                        kill -0 $sleep 2>/dev/null || break 2
 
99
                        UP=`cat /sys/class/net/"$INTERFACE"/operstate`
 
100
                        if [ "$UP" = up ]; then
 
101
                            kill $sleep 2>/dev/null
 
102
                            break 2
 
103
                        fi
 
104
                        sleep 1
 
105
                    done
 
106
                fi
 
107
                sleep 1
 
108
            done &
 
109
            wait $sleep || :
 
110
            IPADDRS=`eval 'echo "$IPADDRS_'"$KEY"\"`
 
111
            if [ -n "$IPADDRS" ]; then
 
112
                if [ "$IPADDRS" = dhcp ]; then
 
113
                    ipconfig -c dhcp -d "$INTERFACE" || :
 
114
                    #dhclient "$INTERFACE"
 
115
                else
 
116
                    for ipaddr in $IPADDRS; do
 
117
                        "$ip" addr add "$ipaddr" dev "$INTERFACE"
 
118
                    done
 
119
                fi
 
120
            fi
 
121
            ROUTES=`eval 'echo "$ROUTES_'"$KEY"\"`
 
122
            if [ -n "$ROUTES" ]; then
 
123
                for route in $ROUTES; do
 
124
                    "$ip" route add "$route" dev "$BRIDGE"
 
125
                done
 
126
            fi
 
127
        done
 
128
        ;;
 
129
    stop)
 
130
        "$wpa_cli" -g "$CTRL" terminate 2>&1 | sed -e '/^OK$/d'
 
131
        for KEY in $ifkeys; do
 
132
            ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
 
133
            INTERFACE=`addrtoif "$ADDRESS"`
 
134
            "$ip" addr show scope global permanent dev "$INTERFACE" \
 
135
                | while read type addr rest; do
139
136
                case "$type" in
140
137
                    inet|inet6)
141
138
                        "$ip" addr del "$addr" dev "$INTERFACE"
142
139
                        ;;
143
140
                esac
144
141
            done
145
 
        "$ip" link set dev "$INTERFACE" down
146
 
    done
147
 
}
148
 
 
149
 
case "${MODE:-$1}" in
150
 
    start|stop)
151
 
        do_"${MODE:-$1}"
 
142
            "$ip" link set dev "$INTERFACE" down
 
143
        done
152
144
        ;;
153
145
    files)
154
146
        echo "$wpa_supplicant"