You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
4.0 KiB

10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
  1. #!/bin/sh
  2. . /lib/functions.sh
  3. . ../netifd-proto.sh
  4. init_proto "$@"
  5. proto_openconnect_init_config() {
  6. proto_config_add_string "server"
  7. proto_config_add_int "port"
  8. proto_config_add_int "mtu"
  9. proto_config_add_int "juniper"
  10. proto_config_add_string "interface"
  11. proto_config_add_string "username"
  12. proto_config_add_string "serverhash"
  13. proto_config_add_string "authgroup"
  14. proto_config_add_string "password"
  15. proto_config_add_string "password2"
  16. proto_config_add_string "token_mode"
  17. proto_config_add_string "token_secret"
  18. proto_config_add_string "token_script"
  19. proto_config_add_string "os"
  20. proto_config_add_string "csd_wrapper"
  21. proto_config_add_array 'form_entry:regex("[^:]+:[^=]+=.*")'
  22. no_device=1
  23. available=1
  24. }
  25. proto_openconnect_add_form_entry() {
  26. [ -n "$1" ] && append cmdline "--form-entry $1"
  27. }
  28. proto_openconnect_setup() {
  29. local config="$1"
  30. json_get_vars server port interface username serverhash authgroup password password2 token_mode token_secret token_script os csd_wrapper mtu juniper form_entry
  31. grep -q tun /proc/modules || insmod tun
  32. ifname="vpn-$config"
  33. logger -t openconnect "initializing..."
  34. logger -t "openconnect" "adding host dependency for $server at $config"
  35. for ip in $(resolveip -t 10 "$server"); do
  36. logger -t "openconnect" "adding host dependency for $ip at $config"
  37. proto_add_host_dependency "$config" "$ip" "$interface"
  38. done
  39. [ -n "$port" ] && port=":$port"
  40. cmdline="$server$port -i "$ifname" --non-inter --syslog --script /lib/netifd/vpnc-script"
  41. [ -n "$mtu" ] && cmdline="$cmdline --mtu $mtu"
  42. # migrate to standard config files
  43. [ -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"
  44. [ -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"
  45. [ -f "/etc/config/openconnect-ca-vpn-$config.pem" ] && mv "/etc/config/openconnect-ca-vpn-$config.pem" "/etc/openconnect/ca-vpn-$config.pem"
  46. [ -f /etc/openconnect/user-cert-vpn-$config.pem ] && append cmdline "-c /etc/openconnect/user-cert-vpn-$config.pem"
  47. [ -f /etc/openconnect/user-key-vpn-$config.pem ] && append cmdline "--sslkey /etc/openconnect/user-key-vpn-$config.pem"
  48. [ -f /etc/openconnect/ca-vpn-$config.pem ] && {
  49. append cmdline "--cafile /etc/openconnect/ca-vpn-$config.pem"
  50. append cmdline "--no-system-trust"
  51. }
  52. if [ "${juniper:-0}" -gt 0 ]; then
  53. append cmdline "--juniper"
  54. fi
  55. [ -n "$serverhash" ] && {
  56. append cmdline " --servercert=$serverhash"
  57. append cmdline "--no-system-trust"
  58. }
  59. [ -n "$authgroup" ] && append cmdline "--authgroup $authgroup"
  60. [ -n "$username" ] && append cmdline "-u $username"
  61. [ -n "$password" ] || [ "$token_mode" = "script" ] && {
  62. umask 077
  63. mkdir -p /var/etc
  64. pwfile="/var/etc/openconnect-$config.passwd"
  65. [ -n "$password" ] && {
  66. echo "$password" > "$pwfile"
  67. [ -n "$password2" ] && echo "$password2" >> "$pwfile"
  68. }
  69. [ "$token_mode" = "script" ] && {
  70. $token_script > "$pwfile" 2> /dev/null || {
  71. logger -t openconenct "Cannot get password from script '$token_script'"
  72. proto_setup_failed "$config"
  73. }
  74. }
  75. append cmdline "--passwd-on-stdin"
  76. }
  77. [ -n "$token_mode" -a "$token_mode" != "script" ] && append cmdline "--token-mode=$token_mode"
  78. [ -n "$token_secret" ] && append cmdline "--token-secret=$token_secret"
  79. [ -n "$os" ] && append cmdline "--os=$os"
  80. [ -n "$csd_wrapper" ] && [ -x "$csd_wrapper" ] && append cmdline "--csd-wrapper=$csd_wrapper"
  81. json_for_each_item proto_openconnect_add_form_entry form_entry
  82. proto_export INTERFACE="$config"
  83. logger -t openconnect "executing 'openconnect $cmdline'"
  84. if [ -f "$pwfile" ]; then
  85. proto_run_command "$config" /usr/sbin/openconnect-wrapper $pwfile $cmdline
  86. else
  87. proto_run_command "$config" /usr/sbin/openconnect $cmdline
  88. fi
  89. }
  90. proto_openconnect_teardown() {
  91. local config="$1"
  92. pwfile="/var/etc/openconnect-$config.passwd"
  93. rm -f $pwfile
  94. logger -t openconnect "bringing down openconnect"
  95. proto_kill_command "$config" 2
  96. }
  97. add_protocol openconnect