/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: 2008-07-20 06:33:48 UTC
  • Revision ID: teddy@fukt.bsnet.se-20080720063348-jscgy5p0itrgvlo8
* mandos-clients.conf ([foo]): Uncommented.
  ([foo]/secret): New.
  ([foo]/secfile): Commented out.
  ([foo]/checker): Changed to "fping -q -- %%(fqdn)s".
  ([foo]/timeout): New.

* server.py: New modeline for Python and Emacs.  Set a logging format.
  (Client.__init__): Bug fix: Choose either the value from the options
                     object or pass the argument through string_to_delta
                     for both "timeout" and "interval".
  (Client.checker_callback): Bug fix: Do not log spurious "Checker for
                             <foo> failed" messages.
  (Client.start_checker): Moved "Starting checker" log message down to
                          just before actually starting the subprocess.
                          Do not redirect the subprocesses' stdout to a
                          pipe.
  (peer_certificate, fingerprint): Added docstrings.
  (entry_group_state_changed): Call "killme()" instead of
                               "main_loop.quit()".
  (daemon, killme): New functions.
  (exitstatus, main_loop_started): New global variables.
  (__main__): Removed the "--cert", "--key", "--ca", and "--crl"
              options.  Removed the sleep command from the default
              checker.  Add a console logger in debug mode.  Call
              "killme()" instead of "main_loop.quit()" when there are no
              more clients.  Call "daemon()" if not in debug mode.
              Register "cleanup()" to run at exit.  Ignore some
              signals.  Catch DBusException to detect another running
              server and exit cleanly.  Exit with "exitstatus".
  (cleanup): New function.

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 Teddy Hogeborn
10
 
# Copyright © 2012 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
 
            if [ "$INTERFACE" = "$DEVICE" ]; then
47
 
                break 2
48
 
            fi
49
 
        done
50
 
        exit
51
 
    done
52
 
fi
53
 
 
54
 
wpa_supplicant=/sbin/wpa_supplicant
55
 
wpa_cli=/sbin/wpa_cli
56
 
ip=/bin/ip
57
 
 
58
 
# Used by the wpa_interface_* functions in the wireless.conf file
59
 
wpa_cli_set(){
60
 
    case "$1" in
61
 
        ssid|psk) arg="\"$2\"" ;;
62
 
        *) arg="$2" ;;
63
 
    esac
64
 
    "$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" set_network "$NETWORK" \
65
 
        "$1" "$arg" 2>&1 | sed -e '/^OK$/d'
66
 
}
67
 
 
68
 
if [ $VERBOSITY -gt 0 ]; then
69
 
    WPAS_OPTIONS="-d $WPAS_OPTIONS"
70
 
fi
71
 
if [ -n "$PIDFILE" ]; then
72
 
    WPAS_OPTIONS="-P$PIDFILE $WPAS_OPTIONS"
73
 
fi
74
 
 
75
 
do_start(){
76
 
    mkdir -m u=rwx,go= -p "$CTRLDIR"
77
 
    "$wpa_supplicant" -B -g "$CTRL" -p "$CTRLDIR" $WPAS_OPTIONS
78
 
    for KEY in $ifkeys; do
79
 
        ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
80
 
        INTERFACE=`addrtoif "$ADDRESS"`
81
 
        DRIVER=`eval 'echo "$WPA_DRIVER_'"$KEY"\"`
82
 
        IFDELAY=`eval 'echo "$DELAY_'"$KEY"\"`
83
 
        "$wpa_cli" -g "$CTRL" interface_add "$INTERFACE" "" \
84
 
            "${DRIVER:-wext}" "$CTRLDIR" > /dev/null \
85
 
            | sed -e '/^OK$/d'
86
 
        NETWORK=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" 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" status \
95
 
                | 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
 
 
130
 
do_stop(){
131
 
    "$wpa_cli" -g "$CTRL" terminate 2>&1 | sed -e '/^OK$/d'
132
 
    for KEY in $ifkeys; do
133
 
        ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
134
 
        INTERFACE=`addrtoif "$ADDRESS"`
135
 
        "$ip" addr show scope global permanent dev "$INTERFACE" \
136
 
            | while read type addr rest; do
137
 
                case "$type" in
138
 
                    inet|inet6)
139
 
                        "$ip" addr del "$addr" dev "$INTERFACE"
140
 
                        ;;
141
 
                esac
142
 
            done
143
 
        "$ip" link set dev "$INTERFACE" down
144
 
    done
145
 
}
146
 
 
147
 
case "${MODE:-$1}" in
148
 
    start|stop)
149
 
        do_"${MODE:-$1}"
150
 
        ;;
151
 
    files)
152
 
        echo "$wpa_supplicant"
153
 
        echo "$wpa_cli"
154
 
        echo "$ip"
155
 
        ;;
156
 
    modules)
157
 
        if [ "$IPADDRS" = dhcp ]; then
158
 
            echo af_packet
159
 
        fi
160
 
        sed -n -e 's/#.*$//' -e 's/[    ]*$//' \
161
 
            -e 's/^MODULE_[^=]\+=//p' "$CONFIG"
162
 
        ;;
163
 
esac