/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
# 
549 by teddy at recompile
* Makefile (install-server): Add intro(8mandos) man page.
9
# Copyright © 2012 Teddy Hogeborn
10
# Copyright © 2012 Björn Påhlsson
11
# 
535.1.1 by teddy at recompile
Add wireless network hook
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
535.1.8 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
26
addrtoif(){
535.1.9 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
27
    grep -liFe "$1" /sys/class/net/*/address \
28
	| sed -e 's,.*/\([^/]*\)/[^/]*,\1,'
535.1.8 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
29
}
30
535.1.1 by teddy at recompile
Add wireless network hook
31
# Read config file
32
if [ -e "$CONFIG" ]; then
33
    . "$CONFIG"
34
else
35
    exit
36
fi
37
535.1.9 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
38
ifkeys=`env | sed -n -e 's/^ADDRESS_\([^=]*\)=.*/\1/p' "$CONFIG" \
39
    | sort -u`
535.1.1 by teddy at recompile
Add wireless network hook
40
41
# Exit if DEVICE is set and is not any of the wireless interfaces
42
if [ -n "$DEVICE" ]; then
43
    while :; do
535.1.8 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
44
	for KEY in $ifkeys; do
45
	    ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
46
	    INTERFACE=`addrtoif "$ADDRESS"`
47
	    if [ "$INTERFACE" = "$DEVICE" ]; then
535.1.1 by teddy at recompile
Add wireless network hook
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
case "${MODE:-$1}" in
77
    start)
78
	mkdir -m u=rwx,go= -p "$CTRLDIR"
79
	"$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
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"\"`
535.1.1 by teddy at recompile
Add wireless network hook
85
	    "$wpa_cli" -g "$CTRL" interface_add "$INTERFACE" "" \
86
		"${DRIVER:-wext}" "$CTRLDIR" > /dev/null \
87
		| sed -e '/^OK$/d'
535.1.9 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
88
	    NETWORK=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" \
89
		add_network`
535.1.8 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
90
	    eval wpa_interface_"$KEY"
535.1.1 by teddy at recompile
Add wireless network hook
91
	    "$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" enable_network \
92
		"$NETWORK" | sed -e '/^OK$/d'
535.1.5 by Teddy Hogeborn
* network-hooks.d/wireless (start): Bug fix: background "sleep"
93
	    sleep "${IFDELAY:-$DELAY}" &
535.1.1 by teddy at recompile
Add wireless network hook
94
	    sleep=$!
95
	    while :; do
535.1.3 by Teddy Hogeborn
* network-hooks.d/wireless (start): Bug fixes: Don't shadow "$DELAY".
96
		kill -0 $sleep 2>/dev/null || break
535.1.9 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
97
		STATE=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" \
98
		    status | sed -n -e 's/^wpa_state=//p'`
535.1.1 by teddy at recompile
Add wireless network hook
99
		if [ "$STATE" = COMPLETED ]; then
535.1.7 by teddy at recompile
* network-hooks.s/wireless (start): Wait until interface is up.
100
		    while :; do
101
			kill -0 $sleep 2>/dev/null || break 2
102
			UP=`cat /sys/class/net/"$INTERFACE"/operstate`
103
			if [ "$UP" = up ]; then
104
			    kill $sleep 2>/dev/null
105
			    break 2
106
			fi
107
			sleep 1
108
		    done
535.1.1 by teddy at recompile
Add wireless network hook
109
		fi
110
		sleep 1
111
	    done &
112
	    wait $sleep || :
535.1.8 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
113
	    IPADDRS=`eval 'echo "$IPADDRS_'"$KEY"\"`
535.1.1 by teddy at recompile
Add wireless network hook
114
	    if [ -n "$IPADDRS" ]; then
115
		if [ "$IPADDRS" = dhcp ]; then
116
		    ipconfig -c dhcp -d "$INTERFACE" || :
117
		    #dhclient "$INTERFACE"
118
		else
119
		    for ipaddr in $IPADDRS; do
120
			"$ip" addr add "$ipaddr" dev "$INTERFACE"
121
		    done
122
		fi
123
	    fi
535.1.8 by teddy at recompile
* network-hooks.s/bridge: Don't use interface names directly; search
124
	    ROUTES=`eval 'echo "$ROUTES_'"$KEY"\"`
535.1.1 by teddy at recompile
Add wireless network hook
125
	    if [ -n "$ROUTES" ]; then
126
		for route in $ROUTES; do
127
		    "$ip" route add "$route" dev "$BRIDGE"
128
		done
129
	    fi
130
        done
131
	;;
132
    stop)
133
	"$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
134
        for KEY in $ifkeys; do
135
	    ADDRESS=`eval 'echo "$ADDRESS_'"$KEY"\"`
136
	    INTERFACE=`addrtoif "$ADDRESS"`
535.1.1 by teddy at recompile
Add wireless network hook
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
    files)
149
	echo "$wpa_supplicant"
150
	echo "$wpa_cli"
151
	echo "$ip"
152
	;;
153
    modules)
154
	if [ "$IPADDRS" = dhcp ]; then
155
	    echo af_packet
156
	fi
535.1.3 by Teddy Hogeborn
* network-hooks.d/wireless (start): Bug fixes: Don't shadow "$DELAY".
157
	sed -n -e 's/#.*$//' -e 's/[ 	]*$//' \
158
	    -e 's/^MODULE_[^=]\+=//p' "$CONFIG"
535.1.1 by teddy at recompile
Add wireless network hook
159
	;;
160
esac