/mandos/trunk

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

« back to all changes in this revision

Viewing changes to network-hooks.d/wireless

  • Committer: Björn Påhlsson
  • Date: 2008-07-20 02:52:20 UTC
  • Revision ID: belorn@braxen-20080720025220-r5u0388uy9iu23h6
Added following support:
Pluginbased client handler
rewritten Mandos client
       Avahi instead of udp server discovery
       openpgp encrypted key support
Passprompt stand alone application for direct console input
Added logging for Mandos server

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
 
# Copying and distribution of this file, with or without modification,
10
 
# are permitted in any medium without royalty provided the copyright
11
 
# notice and this notice are preserved.  This file is offered as-is,
12
 
# without any warranty.
13
 
 
14
 
set -e
15
 
 
16
 
RUNDIR="/run"
17
 
CTRL="$RUNDIR/wpa_supplicant-global"
18
 
CTRLDIR="$RUNDIR/wpa_supplicant"
19
 
PIDFILE="$RUNDIR/wpa_supplicant-mandos.pid"
20
 
 
21
 
CONFIG="$MANDOSNETHOOKDIR/wireless.conf"
22
 
 
23
 
addrtoif(){
24
 
    grep -liFe "$1" /sys/class/net/*/address | sed -e 's,.*/\([^/]*\)/[^/]*,\1,'
25
 
}
26
 
 
27
 
# Read config file
28
 
if [ -e "$CONFIG" ]; then
29
 
    . "$CONFIG"
30
 
else
31
 
    exit
32
 
fi
33
 
 
34
 
ifkeys="`env | sed -n -e 's/^ADDRESS_\([^=]*\)=.*/\1/p' \"$CONFIG\" | sort -u`"
35
 
 
36
 
# Exit if DEVICE is set and is not any of the wireless interfaces
37
 
if [ -n "$DEVICE" ]; then
38
 
    while :; do
39
 
        for KEY in $ifkeys; do
40
 
            ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
41
 
            INTERFACE=`addrtoif "$ADDRESS"`
42
 
            if [ "$INTERFACE" = "$DEVICE" ]; then
43
 
                break 2
44
 
            fi
45
 
        done
46
 
        exit
47
 
    done
48
 
fi
49
 
 
50
 
wpa_supplicant=/sbin/wpa_supplicant
51
 
wpa_cli=/sbin/wpa_cli
52
 
ip=/bin/ip
53
 
 
54
 
# Used by the wpa_interface_* functions in the wireless.conf file
55
 
wpa_cli_set(){
56
 
    case "$1" in
57
 
        ssid|psk) arg="\"$2\"" ;;
58
 
        *) arg="$2" ;;
59
 
    esac
60
 
    "$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" set_network "$NETWORK" \
61
 
        "$1" "$arg" 2>&1 | sed -e '/^OK$/d'
62
 
}
63
 
 
64
 
if [ $VERBOSITY -gt 0 ]; then
65
 
    WPAS_OPTIONS="-d $WPAS_OPTIONS"
66
 
fi
67
 
if [ -n "$PIDFILE" ]; then
68
 
    WPAS_OPTIONS="-P$PIDFILE $WPAS_OPTIONS"
69
 
fi
70
 
 
71
 
case "${MODE:-$1}" in
72
 
    start)
73
 
        mkdir -m u=rwx,go= -p "$CTRLDIR"
74
 
        "$wpa_supplicant" -B -g "$CTRL" -p "$CTRLDIR" $WPAS_OPTIONS
75
 
        for KEY in $ifkeys; do
76
 
            ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
77
 
            INTERFACE=`addrtoif "$ADDRESS"`
78
 
            DRIVER=`eval 'echo "$WPA_DRIVER_'"$KEY"\"`
79
 
            IFDELAY=`eval 'echo "$DELAY_'"$KEY"\"`
80
 
            "$wpa_cli" -g "$CTRL" interface_add "$INTERFACE" "" \
81
 
                "${DRIVER:-wext}" "$CTRLDIR" > /dev/null \
82
 
                | sed -e '/^OK$/d'
83
 
            NETWORK=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" add_network`
84
 
            eval wpa_interface_"$KEY"
85
 
            "$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" enable_network \
86
 
                "$NETWORK" | sed -e '/^OK$/d'
87
 
            sleep "${IFDELAY:-$DELAY}" &
88
 
            sleep=$!
89
 
            while :; do
90
 
                kill -0 $sleep 2>/dev/null || break
91
 
                STATE=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" status | sed -n -e 's/^wpa_state=//p'`
92
 
                if [ "$STATE" = COMPLETED ]; then
93
 
                    while :; do
94
 
                        kill -0 $sleep 2>/dev/null || break 2
95
 
                        UP=`cat /sys/class/net/"$INTERFACE"/operstate`
96
 
                        if [ "$UP" = up ]; then
97
 
                            kill $sleep 2>/dev/null
98
 
                            break 2
99
 
                        fi
100
 
                        sleep 1
101
 
                    done
102
 
                fi
103
 
                sleep 1
104
 
            done &
105
 
            wait $sleep || :
106
 
            IPADDRS=`eval 'echo "$IPADDRS_'"$KEY"\"`
107
 
            if [ -n "$IPADDRS" ]; then
108
 
                if [ "$IPADDRS" = dhcp ]; then
109
 
                    ipconfig -c dhcp -d "$INTERFACE" || :
110
 
                    #dhclient "$INTERFACE"
111
 
                else
112
 
                    for ipaddr in $IPADDRS; do
113
 
                        "$ip" addr add "$ipaddr" dev "$INTERFACE"
114
 
                    done
115
 
                fi
116
 
            fi
117
 
            ROUTES=`eval 'echo "$ROUTES_'"$KEY"\"`
118
 
            if [ -n "$ROUTES" ]; then
119
 
                for route in $ROUTES; do
120
 
                    "$ip" route add "$route" dev "$BRIDGE"
121
 
                done
122
 
            fi
123
 
        done
124
 
        ;;
125
 
    stop)
126
 
        "$wpa_cli" -g "$CTRL" terminate 2>&1 | sed -e '/^OK$/d'
127
 
        for KEY in $ifkeys; do
128
 
            ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
129
 
            INTERFACE=`addrtoif "$ADDRESS"`
130
 
            "$ip" addr show scope global permanent dev "$INTERFACE" \
131
 
                | while read type addr rest; do
132
 
                case "$type" in
133
 
                    inet|inet6)
134
 
                        "$ip" addr del "$addr" dev "$INTERFACE"
135
 
                        ;;
136
 
                esac
137
 
            done
138
 
            "$ip" link set dev "$INTERFACE" down
139
 
        done
140
 
        ;;
141
 
    files)
142
 
        echo "$wpa_supplicant"
143
 
        echo "$wpa_cli"
144
 
        echo "$ip"
145
 
        ;;
146
 
    modules)
147
 
        if [ "$IPADDRS" = dhcp ]; then
148
 
            echo af_packet
149
 
        fi
150
 
        sed -n -e 's/#.*$//' -e 's/[    ]*$//' \
151
 
            -e 's/^MODULE_[^=]\+=//p' "$CONFIG"
152
 
        ;;
153
 
esac