2014-06-04 00:18:17 +08:00
#!/bin/sh
. /lib/functions.sh
. ../netifd-proto.sh
init_proto " $@ "
proto_openconnect_init_config( ) {
proto_config_add_string "server"
proto_config_add_int "port"
2017-05-08 13:07:23 +08:00
proto_config_add_int "mtu"
2017-11-07 18:11:34 +08:00
proto_config_add_int "juniper"
2017-11-22 10:10:22 +08:00
proto_config_add_string "interface"
2014-06-04 00:18:17 +08:00
proto_config_add_string "username"
2014-06-05 05:17:54 +08:00
proto_config_add_string "serverhash"
proto_config_add_string "authgroup"
2014-06-04 00:18:17 +08:00
proto_config_add_string "password"
2015-06-19 04:40:25 +08:00
proto_config_add_string "password2"
2015-02-07 03:54:39 +08:00
proto_config_add_string "token_mode"
proto_config_add_string "token_secret"
2017-11-28 15:04:31 +08:00
proto_config_add_string "token_script"
2015-04-05 03:31:49 +08:00
proto_config_add_string "os"
2015-04-05 03:32:59 +08:00
proto_config_add_string "csd_wrapper"
2019-09-20 17:22:54 +08:00
proto_config_add_array 'form_entry:regex("[^:]+:[^=]+=.*")'
2014-06-04 00:18:17 +08:00
no_device = 1
available = 1
}
2019-09-20 17:22:54 +08:00
proto_openconnect_add_form_entry( ) {
[ -n " $1 " ] && append cmdline " --form-entry $1 "
}
2014-06-04 00:18:17 +08:00
proto_openconnect_setup( ) {
local config = " $1 "
2019-09-20 17:22:54 +08:00
json_get_vars server port interface username serverhash authgroup password password2 token_mode token_secret token_script os csd_wrapper mtu juniper form_entry
2014-06-04 00:18:17 +08:00
grep -q tun /proc/modules || insmod tun
2015-07-08 04:48:44 +08:00
ifname = " vpn- $config "
2014-06-04 00:18:17 +08:00
2014-06-05 05:17:54 +08:00
logger -t openconnect "initializing..."
2016-05-22 23:42:22 +08:00
logger -t "openconnect" " adding host dependency for $server at $config "
for ip in $( resolveip -t 10 " $server " ) ; do
logger -t "openconnect" " adding host dependency for $ip at $config "
2017-11-22 10:10:22 +08:00
proto_add_host_dependency " $config " " $ip " " $interface "
2016-05-22 23:42:22 +08:00
done
2014-06-04 00:18:17 +08:00
[ -n " $port " ] && port = " : $port "
2015-07-08 04:48:44 +08:00
cmdline = " $server $port -i " $ifname " --non-inter --syslog --script /lib/netifd/vpnc-script"
2017-05-08 13:07:23 +08:00
[ -n " $mtu " ] && cmdline = " $cmdline --mtu $mtu "
2014-06-04 00:18:17 +08:00
2015-01-20 05:46:12 +08:00
# migrate to standard config files
[ -f " /etc/config/openconnect-user-cert-vpn- $config .pem " ] && mv " /etc/config/openconnect-user-cert-vpn- $config .pem " " /etc/openconnect/user-cert-vpn- $config .pem "
[ -f " /etc/config/openconnect-user-key-vpn- $config .pem " ] && mv " /etc/config/openconnect-user-key-vpn- $config .pem " " /etc/openconnect/user-key-vpn- $config .pem "
[ -f " /etc/config/openconnect-ca-vpn- $config .pem " ] && mv " /etc/config/openconnect-ca-vpn- $config .pem " " /etc/openconnect/ca-vpn- $config .pem "
2015-01-20 05:37:43 +08:00
[ -f /etc/openconnect/user-cert-vpn-$config .pem ] && append cmdline " -c /etc/openconnect/user-cert-vpn- $config .pem "
[ -f /etc/openconnect/user-key-vpn-$config .pem ] && append cmdline " --sslkey /etc/openconnect/user-key-vpn- $config .pem "
[ -f /etc/openconnect/ca-vpn-$config .pem ] && {
2015-01-20 05:37:29 +08:00
append cmdline " --cafile /etc/openconnect/ca-vpn- $config .pem "
2014-12-06 03:27:45 +08:00
append cmdline "--no-system-trust"
2014-12-20 23:56:53 +08:00
}
2017-11-07 18:11:34 +08:00
if [ " ${ juniper :- 0 } " -gt 0 ] ; then
append cmdline "--juniper"
fi
2014-12-20 23:56:53 +08:00
[ -n " $serverhash " ] && {
2014-12-06 03:27:45 +08:00
append cmdline " --servercert= $serverhash "
append cmdline "--no-system-trust"
2014-12-20 23:56:53 +08:00
}
2014-06-05 05:17:54 +08:00
[ -n " $authgroup " ] && append cmdline " --authgroup $authgroup "
2014-06-04 00:18:17 +08:00
[ -n " $username " ] && append cmdline " -u $username "
2017-11-28 15:04:31 +08:00
[ -n " $password " ] || [ " $token_mode " = "script" ] && {
2014-06-04 00:18:17 +08:00
umask 077
2015-02-07 03:54:39 +08:00
mkdir -p /var/etc
pwfile = " /var/etc/openconnect- $config .passwd "
2017-11-28 15:04:31 +08:00
[ -n " $password " ] && {
echo " $password " > " $pwfile "
[ -n " $password2 " ] && echo " $password2 " >> " $pwfile "
}
[ " $token_mode " = "script" ] && {
$token_script > " $pwfile " 2> /dev/null || {
logger -t openconenct " Cannot get password from script ' $token_script ' "
proto_setup_failed " $config "
}
}
2014-06-04 00:18:17 +08:00
append cmdline "--passwd-on-stdin"
}
2017-11-28 15:04:31 +08:00
[ -n " $token_mode " -a " $token_mode " != "script" ] && append cmdline " --token-mode= $token_mode "
2014-12-05 14:51:45 +08:00
[ -n " $token_secret " ] && append cmdline " --token-secret= $token_secret "
2015-04-05 03:31:49 +08:00
[ -n " $os " ] && append cmdline " --os= $os "
2015-04-05 03:32:59 +08:00
[ -n " $csd_wrapper " ] && [ -x " $csd_wrapper " ] && append cmdline " --csd-wrapper= $csd_wrapper "
2014-12-05 14:51:45 +08:00
2019-09-20 17:22:54 +08:00
json_for_each_item proto_openconnect_add_form_entry form_entry
2014-06-04 00:18:17 +08:00
proto_export INTERFACE = " $config "
2014-06-05 05:17:54 +08:00
logger -t openconnect " executing 'openconnect $cmdline ' "
2014-12-20 23:56:53 +08:00
if [ -f " $pwfile " ] ; then
2014-09-01 05:57:47 +08:00
proto_run_command " $config " /usr/sbin/openconnect-wrapper $pwfile $cmdline
2014-06-05 05:17:54 +08:00
else
proto_run_command " $config " /usr/sbin/openconnect $cmdline
fi
2014-06-04 00:18:17 +08:00
}
proto_openconnect_teardown( ) {
2014-09-01 05:57:47 +08:00
local config = " $1 "
2015-02-07 03:54:39 +08:00
pwfile = " /var/etc/openconnect- $config .passwd "
2014-06-05 05:17:54 +08:00
rm -f $pwfile
logger -t openconnect "bringing down openconnect"
2014-10-28 19:31:48 +08:00
proto_kill_command " $config " 2
2014-06-04 00:18:17 +08:00
}
add_protocol openconnect