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
|