/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

  • Committer: Teddy Hogeborn
  • Date: 2021-02-03 23:10:42 UTC
  • mto: This revision was merged to the branch mainline in revision 406.
  • Revision ID: teddy@recompile.se-20210203231042-2z3egrvpo1zt7nej
mandos-ctl: Fix bad test for command.Remove and related minor issues

The test for command.Remove removes all clients from the spy server,
and then loops over all clients, looking for the corresponding Remove
command as recorded by the spy server.  But since since there aren't
any clients left after they were removed, no assertions are made, and
the test therefore does nothing.  Fix this.

In tests for command.Approve and command.Deny, add checks that clients
were not somehow removed by the command (in which case, likewise, no
assertions are made).

Add related checks to TestPropertySetterCmd.runTest; i.e. test that a
sequence is not empty before looping over it and making assertions.

* mandos-ctl (TestBaseCommands.test_Remove): Save a copy of the
  original "clients" dict, and loop over those instead.  Add assertion
  that all clients were indeed removed.  Also fix the code which looks
  for the Remove command, which now needs to actually work.
  (TestBaseCommands.test_Approve, TestBaseCommands.test_Deny): Add
  assertion that there are still clients before looping over them.
  (TestPropertySetterCmd.runTest): Add assertion that the list of
  values to get is not empty before looping over them.  Also add check
  that there are still clients before looping over clients.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/bin/sh
 
2
#
 
3
# This is an example of a Mandos client network hook.  This hook
 
4
# brings up a wireless interface as specified in a separate
 
5
# configuration file.  To be used, this file and any needed
 
6
# configuration file(s) should be copied into the
 
7
# /etc/mandos/network-hooks.d directory.
 
8
 
9
# Copyright © 2012-2018 Teddy Hogeborn
 
10
# Copyright © 2012-2018 Björn Påhlsson
 
11
 
12
# Copying and distribution of this file, with or without modification,
 
13
# are permitted in any medium without royalty provided the copyright
 
14
# notice and this notice are preserved.  This file is offered as-is,
 
15
# without any warranty.
 
16
 
 
17
set -e
 
18
 
 
19
RUNDIR="/run"
 
20
CTRL="$RUNDIR/wpa_supplicant-global"
 
21
CTRLDIR="$RUNDIR/wpa_supplicant"
 
22
PIDFILE="$RUNDIR/wpa_supplicant-mandos.pid"
 
23
 
 
24
CONFIG="$MANDOSNETHOOKDIR/wireless.conf"
 
25
 
 
26
addrtoif(){
 
27
    grep -liFe "$1" /sys/class/net/*/address \
 
28
        | sed -e 's,.*/\([^/]*\)/[^/]*,\1,'
 
29
}
 
30
 
 
31
# Read config file
 
32
if [ -e "$CONFIG" ]; then
 
33
    . "$CONFIG"
 
34
else
 
35
    exit
 
36
fi
 
37
 
 
38
ifkeys=`sed -n -e 's/^ADDRESS_\([^=]*\)=.*/\1/p' "$CONFIG" | sort -u`
 
39
 
 
40
# Exit if DEVICE is set and is not any of the wireless interfaces
 
41
if [ -n "$DEVICE" ]; then
 
42
    while :; do
 
43
        for KEY in $ifkeys; do
 
44
            ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
 
45
            INTERFACE=`addrtoif "$ADDRESS"`
 
46
            
 
47
            case "$DEVICE" in
 
48
                *,"$INTERFACE"|*,"$INTERFACE",*|"$INTERFACE",*|"$INTERFACE")
 
49
                    break 2;;
 
50
            esac
 
51
        done
 
52
        exit
 
53
    done
 
54
fi
 
55
 
 
56
wpa_supplicant=/sbin/wpa_supplicant
 
57
wpa_cli=/sbin/wpa_cli
 
58
ip=/bin/ip
 
59
 
 
60
# Used by the wpa_interface_* functions in the wireless.conf file
 
61
wpa_cli_set(){
 
62
    case "$1" in
 
63
        ssid|psk) arg="\"$2\"" ;;
 
64
        *) arg="$2" ;;
 
65
    esac
 
66
    "$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" set_network "$NETWORK" \
 
67
        "$1" "$arg" 2>&1 | sed -e '/^OK$/d'
 
68
}
 
69
 
 
70
if [ $VERBOSITY -gt 0 ]; then
 
71
    WPAS_OPTIONS="-d $WPAS_OPTIONS"
 
72
fi
 
73
if [ -n "$PIDFILE" ]; then
 
74
    WPAS_OPTIONS="-P$PIDFILE $WPAS_OPTIONS"
 
75
fi
 
76
 
 
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
 
139
                case "$type" in
 
140
                    inet|inet6)
 
141
                        "$ip" addr del "$addr" dev "$INTERFACE"
 
142
                        ;;
 
143
                esac
 
144
            done
 
145
        "$ip" link set dev "$INTERFACE" down
 
146
    done
 
147
}
 
148
 
 
149
case "${MODE:-$1}" in
 
150
    start|stop)
 
151
        do_"${MODE:-$1}"
 
152
        ;;
 
153
    files)
 
154
        echo "$wpa_supplicant"
 
155
        echo "$wpa_cli"
 
156
        echo "$ip"
 
157
        ;;
 
158
    modules)
 
159
        if [ "$IPADDRS" = dhcp ]; then
 
160
            echo af_packet
 
161
        fi
 
162
        sed -n -e 's/#.*$//' -e 's/[    ]*$//' \
 
163
            -e 's/^MODULE_[^=]\+=//p' "$CONFIG"
 
164
        ;;
 
165
esac