/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

First version of a somewhat complete D-Bus server interface.  Also
change user/group name to "_mandos".

* debian/mandos.postinst: Rename old "mandos" user and group to
                          "_mandos"; create "_mandos" user and group
                          if none exist.
* debian/mandos-client.postinst: - '' -

* initramfs-tools-hook: Try "_mandos" before "mandos" as user and
                        group name.

* mandos (_datetime_to_dbus_struct): New; was previously local.
  (Client.started): Renamed to "last_started".  All users changed.
  (Client.started): New; boolean.
  (Client.dbus_object_path): New.
  (Client.check_command): Renamed to "checker_command".  All users
                          changed.
  (Client.__init__): Set and use "self.dbus_object_path".  Set
                     "self.started".
  (Client.start): Update "self.started".  Emit "self.PropertyChanged"
                  signals for both "started" and "last_started".
  (Client.stop): Update "self.started".  Emit "self.PropertyChanged"
                 signal for "started".
  (Client.checker_callback): Take additional "command" argument.  All
                             callers changed. Emit
                             "self.PropertyChanged" signal.
  (Client.bump_timeout): Emit "self.PropertyChanged" signal for
                         "last_checked_ok".
  (Client.start_checker): Emit "self.PropertyChanged" signal for
                          "checker_running".
  (Client.stop_checker): Emit "self.PropertyChanged" signal for
                         "checker_running".
  (Client.still_valid): Bug fix: use "getattr(self, started, False)"
                        instead of "self.started" in case this client
                        object is so new that the "started" attribute
                        has not been created yet.
  (Client.IntervalChanged, Client.CheckerIsRunning, Client.GetChecker,
  Client.GetCreated, Client.GetFingerprint, Client.GetHost,
  Client.GetInterval, Client.GetName, Client.GetStarted,
  Client.GetTimeout, Client.StateChanged, Client.TimeoutChanged):
  Removed; all callers changed.
  (Client.CheckerCompleted): Add "condition" and "command" arguments.
                             All callers changed.
  (Client.GetAllProperties, Client.PropertyChanged): New.
  (Client.StillValid): Renamed to "IsStillValid".
  (Client.StartChecker): Changed to its own function to avoid the
                         return value from "Client.start_checker()".
  (Client.Stop): Changed to its own function to avoid the return value
                 from "Client.stop()".
  (main): Try "_mandos" before "mandos" as user and group name.
          Removed inner function "remove_from_clients".  New inner
          class "MandosServer".

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