/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
23
# Read config file
24
if [ -e "$CONFIG" ]; then
25
    . "$CONFIG"
26
else
27
    exit
28
fi
29
30
interfaces="`env|sed -n -e 's/^\(MODULE\|IPADDRS\|ROUTES\|WPA_DRIVER\)_\([^=]*\)=.*/\2/p' \"$CONFIG\" |sort -u`"
31
32
# Exit if DEVICE is set and is not any of the wireless interfaces
33
if [ -n "$DEVICE" ]; then
34
    while :; do
35
	for IF in $interfaces; do
36
	    if [ "$IF" = "$DEVICE" ]; then
37
		break 2
38
	    fi
39
	done
40
	exit
41
    done
42
fi
43
44
wpa_supplicant=/sbin/wpa_supplicant
45
wpa_cli=/sbin/wpa_cli
46
ip=/bin/ip
47
48
# Used by the wpa_interface_* functions in the wireless.conf file
49
wpa_cli_set(){
50
    case "$1" in
51
        ssid|psk) arg="\"$2\"" ;;
52
        *) arg="$2" ;;
53
    esac
54
    "$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" set_network "$NETWORK" \
55
	"$1" "$arg" 2>&1 | sed -e '/^OK$/d'
56
}
57
58
if [ $VERBOSITY -gt 0 ]; then
59
    WPAS_OPTIONS="-d $WPAS_OPTIONS"
60
fi
61
if [ -n "$PIDFILE" ]; then
62
    WPAS_OPTIONS="-P$PIDFILE $WPAS_OPTIONS"
63
fi
64
65
case "${MODE:-$1}" in
66
    start)
67
	mkdir -m u=rwx,go= -p "$CTRLDIR"
68
	"$wpa_supplicant" -B -g "$CTRL" -p "$CTRLDIR" $WPAS_OPTIONS
69
        for INTERFACE in $interfaces; do
70
	    DRIVER=`eval 'echo "$WPA_DRIVER_'"$INTERFACE"\"`
535.1.3 by Teddy Hogeborn
* network-hooks.d/wireless (start): Bug fixes: Don't shadow "$DELAY".
71
	    IFDELAY=`eval 'echo "$DELAY_'"$INTERFACE"\"`
535.1.1 by teddy at recompile
Add wireless network hook
72
	    "$wpa_cli" -g "$CTRL" interface_add "$INTERFACE" "" \
73
		"${DRIVER:-wext}" "$CTRLDIR" > /dev/null \
74
		| sed -e '/^OK$/d'
75
	    NETWORK=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" add_network`
76
	    eval wpa_interface_"$INTERFACE"
77
	    "$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" enable_network \
78
		"$NETWORK" | sed -e '/^OK$/d'
535.1.5 by Teddy Hogeborn
* network-hooks.d/wireless (start): Bug fix: background "sleep"
79
	    sleep "${IFDELAY:-$DELAY}" &
535.1.1 by teddy at recompile
Add wireless network hook
80
	    sleep=$!
81
	    while :; do
535.1.3 by Teddy Hogeborn
* network-hooks.d/wireless (start): Bug fixes: Don't shadow "$DELAY".
82
		kill -0 $sleep 2>/dev/null || break
535.1.1 by teddy at recompile
Add wireless network hook
83
		STATE=`"$wpa_cli" -p "$CTRLDIR" -i "$INTERFACE" status | sed -n -e 's/^wpa_state=//p'`
84
		if [ "$STATE" = COMPLETED ]; then
535.1.7 by teddy at recompile
* network-hooks.s/wireless (start): Wait until interface is up.
85
		    while :; do
86
			kill -0 $sleep 2>/dev/null || break 2
87
			UP=`cat /sys/class/net/"$INTERFACE"/operstate`
88
			if [ "$UP" = up ]; then
89
			    kill $sleep 2>/dev/null
90
			    break 2
91
			fi
92
			sleep 1
93
		    done
535.1.1 by teddy at recompile
Add wireless network hook
94
		fi
95
		sleep 1
96
	    done &
97
	    wait $sleep || :
98
	    IPADDRS=`eval 'echo "$IPADDRS_'"$INTERFACE"\"`
99
	    if [ -n "$IPADDRS" ]; then
100
		if [ "$IPADDRS" = dhcp ]; then
101
		    ipconfig -c dhcp -d "$INTERFACE" || :
102
		    #dhclient "$INTERFACE"
103
		else
104
		    for ipaddr in $IPADDRS; do
105
			"$ip" addr add "$ipaddr" dev "$INTERFACE"
106
		    done
107
		fi
108
	    fi
109
	    ROUTES=`eval 'echo "$ROUTES_'"$INTERFACE"\"`
110
	    if [ -n "$ROUTES" ]; then
111
		for route in $ROUTES; do
112
		    "$ip" route add "$route" dev "$BRIDGE"
113
		done
114
	    fi
115
        done
116
	;;
117
    stop)
118
	"$wpa_cli" -g "$CTRL" terminate 2>&1 | sed -e '/^OK$/d'
119
        for INTERFACE in $interfaces; do
120
	    "$ip" addr show scope global permanent dev "$INTERFACE" \
121
		| while read type addr rest; do
122
		case "$type" in
123
		    inet|inet6)
124
			"$ip" addr del "$addr" dev "$INTERFACE"
125
			;;
126
		esac
127
	    done
128
	    "$ip" link set dev "$INTERFACE" down
129
	done
130
	;;
131
    files)
132
	echo "$wpa_supplicant"
133
	echo "$wpa_cli"
134
	echo "$ip"
135
	;;
136
    modules)
137
	if [ "$IPADDRS" = dhcp ]; then
138
	    echo af_packet
139
	fi
535.1.3 by Teddy Hogeborn
* network-hooks.d/wireless (start): Bug fixes: Don't shadow "$DELAY".
140
	sed -n -e 's/#.*$//' -e 's/[ 	]*$//' \
141
	    -e 's/^MODULE_[^=]\+=//p' "$CONFIG"
535.1.1 by teddy at recompile
Add wireless network hook
142
	;;
143
esac