Add openconnect protocol support to network scripts
[openwrt/svn-archive/archive.git] / net / openconnect / files / run-openconnect
1 #!/bin/sh -x
2
3 . /etc/functions.sh
4
5 [ $# = 0 ] && { echo " $0 <group>"; exit; }
6
7 include /lib/network
8 scan_interfaces
9
10 config="$1"
11 export OPENWRT_INTERFACE="$config"
12
13 config_get proto "$config" proto
14
15 if [ "$proto" != "openconnect" ]; then
16 echo "Interface $config is $proto not openconnect" >&2
17 exit 1
18 fi
19
20 config_get device "$config" device
21
22 local server
23 config_get server "$config" server
24
25 local port
26 config_get port "$config" port
27 if [ -n "$port" ]; then
28 args="$server:$port"
29 else
30 args="$server"
31 fi
32
33 local cookie
34 config_get cookie "$config" cookie
35 [ -n "$cookie" ] && args="$args -C $cookie"
36
37 local username
38 config_get username "$config" username
39 [ -n "$username" ] && args="$args -u $username"
40
41 local password
42 config_get password "$password" password
43
44 /sbin/insmod tun
45
46 local lock="/var/lock/openconnect-$config"
47
48 # creating the tunnel below will trigger a net subsystem event
49 # prevent it from touching or iface by disabling .auto here
50 uci_set_state network "$config" ifname $link
51 uci_set_state network "$config" auto 0
52
53 local gw="$(find_gw)"
54 [ -n "$gw" ] && {
55 local serv_addrs=""
56 for ip in $(resolveip -4 -t 3 "$server"); do
57 append serv_addrs "$ip"
58 route delete -host "$ip" 2>/dev/null
59 route add -host "$ip" gw "$gw"
60 done
61 uci_toggle_state network "$config" serv_addrs "$serv_addrs"
62 }
63
64 RECON=$(date +%s)
65
66 trap "[ -r /var/run/openconnect-$config-oc.pid ] && kill -HUP \$(cat /var/run/openconnect-$config-oc.pid)" SIGHUP
67 while [ "$(uci_get_state network ${config} up)" = "1" ]; do
68 NOW=$(date +%s)
69 if [ $RECON -gt $NOW ]; then
70 DELAY=$(expr $RECON - $NOW)
71 logger -t openconnect "Waiting for $DELAY seconds before reconnecting"
72 sleep $(expr $DELAY)
73 fi
74
75 # The lock prevents a race condition where /lib/network/openconnect.sh could
76 # send us SIGHUP after we spawn openconnect, but before we store its pid.
77 # Thus leaving it running after we should have killed it.
78 lock $lock
79 echo "$passwd" | /usr/sbin/openconnect $args -i "vpn-$config" \
80 --no-cert-check --non-inter --passwd-on-stdin --syslog --script /etc/vpnc/vpnc-script &
81 echo $! > /var/run/openconnect-$config-oc.pid
82 lock -u $lock
83 wait $!
84 rm /var/run/openconnect-$config-oc.pid
85 RECON=$(expr $NOW + 60)
86 done