/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: Teddy Hogeborn
  • Date: 2008-08-16 03:29:08 UTC
  • Revision ID: teddy@fukt.bsnet.se-20080816032908-ihw7c05r2mnyk389
Add feature to specify custom environment variables for plugins.

* plugin-runner.c (plugin): New members "environ" and "envc" to
                            contain possible custom environment.
  (getplugin): Return NULL on failure instead of doing exit(); all
               callers changed.
  (add_to_char_array): New helper function for "add_argument" and
                       "add_environment".
  (addargument): Renamed to "add_argument".  Return bool.  Call
                 "add_to_char_array" to actually do things.
  (add_environment): New; analogous to "add_argument".
  (addcustomargument): Renamed to "add_to_argv" to avoid confusion
                       with "add_argument".
  (main): New options "--global-envs" and "--envs-for" to specify
          custom environment for plugins.  Print environment for
          plugins in debug mode.  Use asprintf instead of strcpy and
          strcat.  Use execve() for plugins with custom environments.
          Free environment for plugin when freeing plugin list.

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