/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=`env | sed -n -e 's/^ADDRESS_\([^=]*\)=.*/\1/p' "$CONFIG" \
39
 
    | sort -u`
40
 
 
41
 
# Exit if DEVICE is set and is not any of the wireless interfaces
42
 
if [ -n "$DEVICE" ]; then
43
 
    while :; do
44
 
        for KEY in $ifkeys; do
45
 
            ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
46
 
            INTERFACE=`addrtoif "$ADDRESS"`
47
 
            if [ "$INTERFACE" = "$DEVICE" ]; then
48
 
                break 2
49
 
            fi
50
 
        done
51
 
        exit
52
 
    done
53
 
fi
54
 
 
55
 
wpa_supplicant=/sbin/wpa_supplicant
56
 
wpa_cli=/sbin/wpa_cli
57
 
ip=/bin/ip
58
 
 
59
 
# Used by the wpa_interface_* functions in the wireless.conf file
60
 
wpa_cli_set(){
61
 
    case "$1" in
62
 
        ssid|psk) arg="\"$2\"" ;;
63
 
        *) arg="$2" ;;
64
 
    esac
65
 
    "$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" set_network "$NETWORK" \
66
 
        "$1" "$arg" 2>&1 | sed -e '/^OK$/d'
67
 
}
68
 
 
69
 
if [ $VERBOSITY -gt 0 ]; then
70
 
    WPAS_OPTIONS="-d $WPAS_OPTIONS"
71
 
fi
72
 
if [ -n "$PIDFILE" ]; then
73
 
    WPAS_OPTIONS="-P$PIDFILE $WPAS_OPTIONS"
74
 
fi
75
 
 
76
 
do_start(){
77
 
    mkdir -m u=rwx,go= -p "$CTRLDIR"
78
 
    "$wpa_supplicant" -B -g "$CTRL" -p "$CTRLDIR" $WPAS_OPTIONS
79
 
    for KEY in $ifkeys; do
80
 
        ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
81
 
        INTERFACE=`addrtoif "$ADDRESS"`
82
 
        DRIVER=`eval 'echo "$WPA_DRIVER_'"$KEY"\"`
83
 
        IFDELAY=`eval 'echo "$DELAY_'"$KEY"\"`
84
 
        "$wpa_cli" -g "$CTRL" interface_add "$INTERFACE" "" \
85
 
            "${DRIVER:-wext}" "$CTRLDIR" > /dev/null \
86
 
            | sed -e '/^OK$/d'
87
 
        NETWORK=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" add_network`
88
 
        eval wpa_interface_"$KEY"
89
 
        "$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" enable_network \
90
 
            "$NETWORK" | sed -e '/^OK$/d'
91
 
        sleep "${IFDELAY:-$DELAY}" &
92
 
        sleep=$!
93
 
        while :; do
94
 
            kill -0 $sleep 2>/dev/null || break
95
 
            STATE=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" status \
96
 
                | sed -n -e 's/^wpa_state=//p'`
97
 
            if [ "$STATE" = COMPLETED ]; then
98
 
                while :; do
99
 
                    kill -0 $sleep 2>/dev/null || break 2
100
 
                    UP=`cat /sys/class/net/"$INTERFACE"/operstate`
101
 
                    if [ "$UP" = up ]; then
102
 
                        kill $sleep 2>/dev/null
103
 
                        break 2
104
 
                    fi
105
 
                    sleep 1
106
 
                done
107
 
            fi
108
 
            sleep 1
109
 
        done &
110
 
        wait $sleep || :
111
 
        IPADDRS=`eval 'echo "$IPADDRS_'"$KEY"\"`
112
 
        if [ -n "$IPADDRS" ]; then
113
 
            if [ "$IPADDRS" = dhcp ]; then
114
 
                ipconfig -c dhcp -d "$INTERFACE" || :
115
 
                #dhclient "$INTERFACE"
116
 
            else
117
 
                for ipaddr in $IPADDRS; do
118
 
                    "$ip" addr add "$ipaddr" dev "$INTERFACE"
119
 
                done
120
 
            fi
121
 
        fi
122
 
        ROUTES=`eval 'echo "$ROUTES_'"$KEY"\"`
123
 
        if [ -n "$ROUTES" ]; then
124
 
            for route in $ROUTES; do
125
 
                "$ip" route add "$route" dev "$BRIDGE"
126
 
            done
127
 
        fi
128
 
    done
129
 
}
130
 
 
131
 
do_stop(){
132
 
    "$wpa_cli" -g "$CTRL" terminate 2>&1 | sed -e '/^OK$/d'
133
 
    for KEY in $ifkeys; do
134
 
        ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
135
 
        INTERFACE=`addrtoif "$ADDRESS"`
136
 
        "$ip" addr show scope global permanent dev "$INTERFACE" \
137
 
            | while read type addr rest; do
138
 
                case "$type" in
139
 
                    inet|inet6)
140
 
                        "$ip" addr del "$addr" dev "$INTERFACE"
141
 
                        ;;
142
 
                esac
143
 
            done
144
 
        "$ip" link set dev "$INTERFACE" down
145
 
    done
146
 
}
147
 
 
148
 
case "${MODE:-$1}" in
149
 
    start|stop)
150
 
        do_"${MODE:-$1}"
151
 
        ;;
152
 
    files)
153
 
        echo "$wpa_supplicant"
154
 
        echo "$wpa_cli"
155
 
        echo "$ip"
156
 
        ;;
157
 
    modules)
158
 
        if [ "$IPADDRS" = dhcp ]; then
159
 
            echo af_packet
160
 
        fi
161
 
        sed -n -e 's/#.*$//' -e 's/[    ]*$//' \
162
 
            -e 's/^MODULE_[^=]\+=//p' "$CONFIG"
163
 
        ;;
164
 
esac