/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk
535.1.1 by teddy at recompile
Add wireless network hook
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
535.1.8 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
23
addrtoif(){
24
    grep -liFe "$1" /sys/class/net/*/address | sed -e 's,.*/\([^/]*\)/[^/]*,\1,'
25
}
26
535.1.1 by teddy at recompile
Add wireless network hook
27
# Read config file
28
if [ -e "$CONFIG" ]; then
29
    . "$CONFIG"
30
else
31
    exit
32
fi
33
535.1.8 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
34
ifkeys="`env | sed -n -e 's/^ADDRESS_\([^=]*\)=.*/\1/p' \"$CONFIG\" | sort -u`"
535.1.1 by teddy at recompile
Add wireless network hook
35
36
# Exit if DEVICE is set and is not any of the wireless interfaces
37
if [ -n "$DEVICE" ]; then
38
    while :; do
535.1.8 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
39
	for KEY in $ifkeys; do
40
	    ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
41
	    INTERFACE=`addrtoif "$ADDRESS"`
42
	    if [ "$INTERFACE" = "$DEVICE" ]; then
535.1.1 by teddy at recompile
Add wireless network hook
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
535.1.8 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
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"\"`
535.1.1 by teddy at recompile
Add wireless network hook
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`
535.1.8 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
84
	    eval wpa_interface_"$KEY"
535.1.1 by teddy at recompile
Add wireless network hook
85
	    "$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" enable_network \
86
		"$NETWORK" | sed -e '/^OK$/d'
535.1.5 by Teddy Hogeborn
* network-hooks.d/wireless (start): Bug fix: background "sleep"
87
	    sleep "${IFDELAY:-$DELAY}" &
535.1.1 by teddy at recompile
Add wireless network hook
88
	    sleep=$!
89
	    while :; do
535.1.3 by Teddy Hogeborn
* network-hooks.d/wireless (start): Bug fixes: Don't shadow "$DELAY".
90
		kill -0 $sleep 2>/dev/null || break
535.1.1 by teddy at recompile
Add wireless network hook
91
		STATE=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" status | sed -n -e 's/^wpa_state=//p'`
92
		if [ "$STATE" = COMPLETED ]; then
535.1.7 by teddy at recompile
* network-hooks.s/wireless (start): Wait until interface is up.
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
535.1.1 by teddy at recompile
Add wireless network hook
102
		fi
103
		sleep 1
104
	    done &
105
	    wait $sleep || :
535.1.8 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
106
	    IPADDRS=`eval 'echo "$IPADDRS_'"$KEY"\"`
535.1.1 by teddy at recompile
Add wireless network hook
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
535.1.8 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
117
	    ROUTES=`eval 'echo "$ROUTES_'"$KEY"\"`
535.1.1 by teddy at recompile
Add wireless network hook
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'
535.1.8 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
127
        for KEY in $ifkeys; do
128
	    ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
129
	    INTERFACE=`addrtoif "$ADDRESS"`
535.1.1 by teddy at recompile
Add wireless network hook
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
535.1.3 by Teddy Hogeborn
* network-hooks.d/wireless (start): Bug fixes: Don't shadow "$DELAY".
150
	sed -n -e 's/#.*$//' -e 's/[ 	]*$//' \
151
	    -e 's/^MODULE_[^=]\+=//p' "$CONFIG"
535.1.1 by teddy at recompile
Add wireless network hook
152
	;;
153
esac