blob: 37f1945f41c7a6d8f1364049ceb7e0007196e27d [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001#!/bin/sh
2. /lib/functions.sh
3. ../netifd-proto.sh
4init_proto "$@"
5
6append_args() {
7 while [ $# -gt 0 ]; do
8 append cmdline "'${1//\'/\'\\\'\'}'"
9 shift
10 done
11}
12
13proto_openconnect_init_config() {
14 proto_config_add_string "server"
15 proto_config_add_int "port"
16 proto_config_add_int "mtu"
17 proto_config_add_int "juniper"
18 proto_config_add_string "vpn_protocol"
19 proto_config_add_boolean "no_dtls"
20 proto_config_add_string "interface"
21 proto_config_add_string "username"
22 proto_config_add_string "serverhash"
23 proto_config_add_string "authgroup"
24 proto_config_add_string "usergroup"
25 proto_config_add_string "password"
26 proto_config_add_string "password2"
27 proto_config_add_string "token_mode"
28 proto_config_add_string "token_secret"
29 proto_config_add_string "token_script"
30 proto_config_add_string "os"
31 proto_config_add_string "csd_wrapper"
32 proto_config_add_array 'form_entry:regex("[^:]+:[^=]+=.*")'
33 no_device=1
34 available=1
35}
36
37proto_openconnect_add_form_entry() {
38 [ -n "$1" ] && append_args --form-entry "$1"
39}
40
41proto_openconnect_setup() {
42 local config="$1"
43
44 json_get_vars \
45 authgroup \
46 csd_wrapper \
47 form_entry \
48 interface \
49 juniper \
50 vpn_protocol \
51 mtu \
52 no_dtls \
53 os \
54 password \
55 password2 \
56 port \
57 server \
58 serverhash \
59 token_mode \
60 token_script \
61 token_secret \
62 usergroup \
63 username \
64
65 grep -q tun /proc/modules || insmod tun
66 ifname="vpn-$config"
67
68 logger -t openconnect "initializing..."
69
70 logger -t "openconnect" "adding host dependency for $server at $config"
71 for ip in $(resolveip -t 10 "$server"); do
72 logger -t "openconnect" "adding host dependency for $ip at $config"
73 proto_add_host_dependency "$config" "$ip" "$interface"
74 done
75
76 [ -n "$port" ] && port=":$port"
77
78 append_args "$server$port" -i "$ifname" --non-inter --syslog --script /lib/netifd/vpnc-script
79 [ "$no_dtls" = 1 ] && append_args --no-dtls
80 [ -n "$mtu" ] && append_args --mtu "$mtu"
81
82 # migrate to standard config files
83 [ -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"
84 [ -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"
85 [ -f "/etc/config/openconnect-ca-vpn-$config.pem" ] && mv "/etc/config/openconnect-ca-vpn-$config.pem" "/etc/openconnect/ca-vpn-$config.pem"
86
87 [ -f /etc/openconnect/user-cert-vpn-$config.pem ] && append_args -c "/etc/openconnect/user-cert-vpn-$config.pem"
88 [ -f /etc/openconnect/user-key-vpn-$config.pem ] && append_args --sslkey "/etc/openconnect/user-key-vpn-$config.pem"
89 [ -f /etc/openconnect/ca-vpn-$config.pem ] && {
90 append_args --cafile "/etc/openconnect/ca-vpn-$config.pem"
91 append_args --no-system-trust
92 }
93
94 if [ "${juniper:-0}" -gt 0 ]; then
95 append_args --juniper
96 fi
97
98 [ -n "$vpn_protocol" ] && {
99 append_args --protocol "$vpn_protocol"
100 }
101
102 [ -n "$serverhash" ] && {
103 append_args "--servercert=$serverhash"
104 append_args --no-system-trust
105 }
106 [ -n "$authgroup" ] && append_args --authgroup "$authgroup"
107 [ -n "$usergroup" ] && append_args --usergroup "$usergroup"
108 [ -n "$username" ] && append_args -u "$username"
109 [ -n "$password" ] || [ "$token_mode" = "script" ] && {
110 umask 077
111 mkdir -p /var/etc
112 pwfile="/var/etc/openconnect-$config.passwd"
113 [ -n "$password" ] && {
114 echo "$password" > "$pwfile"
115 [ -n "$password2" ] && echo "$password2" >> "$pwfile"
116 }
117 [ "$token_mode" = "script" ] && {
118 $token_script >> "$pwfile" 2> /dev/null || {
119 logger -t openconenct "Cannot get password from script '$token_script'"
120 proto_setup_failed "$config"
121 }
122 }
123 append_args --passwd-on-stdin
124 }
125
126 [ -n "$token_mode" -a "$token_mode" != "script" ] && append_args "--token-mode=$token_mode"
127 [ -n "$token_secret" ] && append_args "--token-secret=$token_secret"
128 [ -n "$os" ] && append_args "--os=$os"
129 [ -n "$csd_wrapper" ] && [ -x "$csd_wrapper" ] && append_args "--csd-wrapper=$csd_wrapper"
130
131 json_for_each_item proto_openconnect_add_form_entry form_entry
132
133 proto_export INTERFACE="$config"
134 logger -t openconnect "executing 'openconnect $cmdline'"
135
136 if [ -f "$pwfile" ]; then
137 eval "proto_run_command '$config' /usr/sbin/openconnect-wrapper '$pwfile' $cmdline"
138 else
139 eval "proto_run_command '$config' /usr/sbin/openconnect $cmdline"
140 fi
141}
142
143proto_openconnect_teardown() {
144 local config="$1"
145
146 pwfile="/var/etc/openconnect-$config.passwd"
147
148 rm -f $pwfile
149 logger -t openconnect "bringing down openconnect"
150 proto_kill_command "$config" 2
151}
152
153add_protocol openconnect