/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-08-02 10:48:24 UTC
  • Revision ID: teddy@fukt.bsnet.se-20080802104824-fx0miwp9o4g9r31e
* plugbasedclient.c (struct process): New fields "eof", "completed",
                                      and "status".
  (handle_sigchld): New function.
  (main): Initialize "dir" to NULL to only closedir() it if necessary.
          Move "process_list" to be a global variable to be accessible
          by "handle_sigchld".  Make "handle_sigchld" handle SIGCHLD.
          Remove redundant check for NULL "dir".  Free "filename" when
          no longer used.  Block SIGCHLD around fork()/exec().
          Restore normal signals in child.  Only loop while running
          processes exist.  Print process buffer when the process is
          done and it has emitted EOF, not when it only emits EOF.
          Remove processes from list which exit non-cleanly.  In
          cleaning up, closedir() if necessary.  Bug fix: set next
          pointer correctly when freeing process list.

* plugins.d/passprompt.c (main): Do not ignore SIGQUIT.

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