Browse Source

[enh] New VPN CLient version

ljf 3 years ago
parent
commit
59ff2c8ce6
3 changed files with 82 additions and 61 deletions
  1. 1 1
      conf/ynh-vpnclient
  2. 8 0
      config_panel.toml
  3. 73 60
      scripts/config

+ 1 - 1
conf/ynh-vpnclient

@@ -175,7 +175,7 @@ unset_dns() {
 
   info "Removing custom DNS resolvers from vpnclient"
   rm -f /etc/dhcp/dhclient-exit-hooks.d/ynh-vpnclient
-  mv "${resolvconf}.ynh" "${resolvconf}"
+  [ -e "${resolvconf}.ynh" ] && mv "${resolvconf}.ynh" "${resolvconf}"
 
   # FIXME : this situation happened to a user ...
   # We could try to force regen the dns conf 

+ 8 - 0
config_panel.toml

@@ -98,6 +98,14 @@ name = "DNS & IPv6"
     [advanced.ipv6]
     name = "IPv6"
 
+        [advanced.ipv6.ip6_net]
+        ask = "Prefix IPv6"
+        type = "string"
+        optional = true
+        example = "2001:db8:42::"
+        pattern.regexp = "^[0-9a-fA-F:]+$"
+        pattern.error = "Please provide a valid IPv6 Prefix"
+        
         [advanced.ipv6.ip6_addr]
         ask = "IPv6"
         type = "string"

+ 73 - 60
scripts/config

@@ -36,14 +36,18 @@ set_right() {
 
 get__status() {
     local service_enabled=$(ynh_app_setting_get $app service_enabled)
-    if [ -f "/sys/class/net/tun0/operstate" ] && [ "$(cat /sys/class/net/tun0/operstate)" == "up" ]
+    if ip route get 1.2.3.4 | grep -q tun0
     then
         if [ $service_enabled -eq 1 ]
         then
             cat << EOF
 style: success
 ask:
-  en: Your VPN is running :)
+  en: |-
+    Your VPN is running :)
+
+    **IPv4:** \`$(curl https://ip.yunohost.org --silent)\`
+    **IPv6:** \`$(curl https://ip6.yunohost.org --silent)\`
 EOF
         else
             cat << EOF
@@ -57,7 +61,11 @@ EOF
         cat << EOF
 style: danger
 ask:
-  en: Your VPN is down !
+  en: |-
+    Your VPN is down ! Here are errors logged in the last 5 minutes
+    \`\`\`
+$(journalctl -u openvpn@client -p0..3 --since "- 20 minutes" -o cat | sed 's/^/    /g' | tail -n 15)
+    \`\`\`
 EOF
     else
         cat << EOF
@@ -72,7 +80,7 @@ EOF
 get__login_user() {
     if [ -s /etc/openvpn/keys/credentials ]
     then
-        echo "value: $(sed -n 1p /etc/openvpn/keys/credentials)" 
+        echo "$(sed -n 1p /etc/openvpn/keys/credentials)" 
     else
         echo ""
     fi
@@ -81,7 +89,7 @@ get__login_user() {
 get__login_passphrase() {
     if [ -s /etc/openvpn/keys/credentials ]
     then
-        echo "value: $(sed -n 2p /etc/openvpn/keys/credentials)"
+        echo "$(sed -n 2p /etc/openvpn/keys/credentials)"
     else
         echo ""
     fi
@@ -178,47 +186,51 @@ set__login_passphrase() {
 #=================================================
 # OVERWRITING VALIDATE STEP 
 #=================================================
+read_cube() {
+    tmp_dir=$(dirname "$1")
+    setting_value="$(jq --raw-output ".$2" "$1")"
+    if [[ "$setting_value" == "null" ]]
+    then
+        setting_value=''
+    # Save file in tmp dir
+    elif [[ "$2" == "crt_"* ]]
+    then
+        if [ -n "${setting_value}" ]
+        then
+            echo "${setting_value}" | sed 's/|/\n/g' > $tmp_dir/$2
+            setting_value="$tmp_dir/$2"
+        fi
+    fi
+    echo $setting_value
+}
 ynh_app_config_validate() {
-    tmp_dir=$(dirname "${config_file}")
+    # At this moment this var is not already set with the old value
+    if [ -z ${config_file+x} ]
+    then
+        config_file="${old[config_file]}"
+
     # Overwrite form response with cube files data before validation process
-    if [ -f "${config_file}" ] && [[ $config_file == *.cube ]]
+    elif [ -f "${config_file}" ] && [[ $config_file == *.cube ]]
     then
         ynh_print_info --message="Transforming .cube into OVPN file"
-        declare -A settings
-        settings[server_name]=""
-        settings[server_port]=""
-        settings[server_proto]=""
-        settings[ip6_net]=""
-        settings[login_user]=""
-        settings[login_passphrase]=""
-        settings[dns0]=""
-        settings[dns1]=""
-        settings[crt_server_ca]="file"
-        settings[crt_client]="file"
-        settings[crt_client_key]="file"
-        settings[crt_client_ta]="file"
-
-        for setting_name in "${!settings[@]}"
-        do
-            setting_value="$(jq --raw-output ".$setting_name" "${config_file}")"
-            if [[ "$setting_value" == "null" ]]
-            then
-                setting_value=''
-            # Save file in tmp dir
-            elif [[ "${settings[$setting_name]}" == "file" ]]
-            then
-                if [ -n "${settings_value}" ]
-                then
-                    echo "${setting_value}" | sed 's/|/\n/g' > $tmp_dir/$setting_name
-                    setting_value="$tmp_dir/$setting_name"
-                fi
-            fi
-
-            $setting_name="$setting_value"
-        done
+        server_name="$(read_cube $config_file server_name)"
+        server_port="$(read_cube $config_file server_port)"
+        server_proto="$(read_cube $config_file server_proto)"
+        ip6_net="$(read_cube $config_file ip6_net)"
+        ip6_addr="$(read_cube $config_file ip6_addr)"
+        login_user="$(read_cube $config_file login_user)"
+        login_passphrase="$(read_cube $config_file login_passphrase)"
+        dns0="$(read_cube $config_file dns0)"
+        dns1="$(read_cube $config_file dns1)"
+        crt_server_ca="$(read_cube $config_file crt_server_ca)"
+        crt_client="$(read_cube $config_file crt_client)"
+        crt_client_key="$(read_cube $config_file crt_client_key)"
+        crt_client_ta="$(read_cube $config_file crt_client_ta)"
         dns_method="custom"
-        nameservers="$dns0,$dns1" 
+        nameservers="$dns0,$dns1"
+
         # Build specific OVPN template
+        tmp_dir=$(dirname "${config_file}")
         cp -f /etc/openvpn/client.conf.tpl.restore $tmp_dir/client.conf.tpl
         # Remove some lines
         for rm_regex in "$(jq --raw-output '.openvpn_rm[]' "${config_file}")"
@@ -234,73 +246,76 @@ ynh_app_config_validate() {
 
         # Build directly the OVPN file
         cp /etc/openvpn/client.conf.tpl "${config_file}"
-        [ "${settings[server_proto]}" == tcp ] && settings[server_proto]=tcp-client
-        sed "s|<TPL:SERVER_NAME>|${settings[server_name]}|g" -i "${config_file}"
-        sed "s|<TPL:SERVER_PORT>|${settings[server_port]}|g" -i "${config_file}"
-        sed "s|<TPL:PROTO>|${settings[server_proto]}|g" -i "${config_file}"
-        if [ -e "${settings[crt_client_key]}" ]; then
+        [ "$server_proto" == tcp ] && server_proto=tcp-client
+        sed "s|<TPL:SERVER_NAME>|$server_name|g" -i "${config_file}"
+        sed "s|<TPL:SERVER_PORT>|$server_port|g" -i "${config_file}"
+        sed "s|<TPL:PROTO>|$server_proto|g" -i "${config_file}"
+        if [ -e "$crt_client_key" ]; then
             sed 's|^<TPL:CERT_COMMENT>||g' -i "${config_file}"
         else
             sed 's|^<TPL:CERT_COMMENT>|;|g' -i "${config_file}"
         fi
-        if [ -e "${settings[crt_client_ta]}" ]; then
+        if [ -e "$crt_client_ta" ]; then
             sed 's|^<TPL:TA_COMMENT>||' -i "${config_file}"
         else
             sed 's|^<TPL:TA_COMMENT>|;|' -i "${config_file}"
         fi
-        if [[ "${settings[server_proto]}" =~ udp ]]; then
+        if [[ "$server_proto" =~ udp ]]; then
             sed 's|^<TPL:UDP_COMMENT>||' -i "${config_file}"
         else
             sed 's|^<TPL:UDP_COMMENT>|;|' -i "${config_file}"
         fi
-        if [ -n "${settings[login_user]}" ]; then
+        if [ -n "$login_user" ]; then
             sed 's|^<TPL:LOGIN_COMMENT>||' -i "${config_file}"
         else
             sed 's|^<TPL:LOGIN_COMMENT>|;|' -i "${config_file}"
         fi
+        [ "$server_proto" == tcp-client ] && server_proto=tcp
 
 
     elif [ -f "${config_file}" ] && [[ "${config_file}" =~ ^.*\.(ovpn|conf)$ ]]
     then
+        tmp_dir=$(dirname "${config_file}")
         ynh_print_info --message="Extracting TLS keys from .ovpn file"
         if grep -q '^\s*<ca>' ${config_file}
         then
-            grep -Poz '(?<=<ca>)(.*\n)*.*(?=</ca>)' ${config_file} > $tmp_dir/crt_server_ca
+            grep -Poz '(?<=<ca>)(.*\n)*.*(?=</ca>)' ${config_file} | sed '/^$/d'  > $tmp_dir/crt_server_ca
             crt_server_ca=$tmp_dir/crt_server_ca
             sed -i '/^\s*<ca>/,/\s*<\/ca>/d' ${config_file}
             sed -i '/^\s*ca\s/d' ${config_file}
             echo "ca /etc/openvpn/keys/ca-server.crt" >> ${config_file}
-        else
-            crt_server_ca=""
         fi
         if grep -q '^\s*<cert>' ${config_file}
         then
-            grep -Poz '(?<=<cert>)(.*\n)*.*(?=</cert>)' ${config_file} > $tmp_dir/crt_client
+            grep -Poz '(?<=<cert>)(.*\n)*.*(?=</cert>)' ${config_file} | sed '/^$/d'  > $tmp_dir/crt_client
             crt_client=$tmp_dir/crt_client
             sed -i '/^\s*<cert>/,/\s*<\/cert>/d' ${config_file}
             sed -i '/^\s*cert\s/d' ${config_file}
             echo "cert /etc/openvpn/keys/user.crt" >> ${config_file}
-        else
+        elif ! grep -q '^\s*cert\s' ${config_file}
+        then
             crt_client=""
         fi
         if grep -q '^\s*<key>' ${config_file}
         then
-            grep -Poz '(?<=<key>)(.*\n)*.*(?=</key>)' ${config_file} > $tmp_dir/crt_client_key
+            grep -Poz '(?<=<key>)(.*\n)*.*(?=</key>)' ${config_file} | sed '/^$/d' > $tmp_dir/crt_client_key
             crt_client_key=$tmp_dir/crt_client_key
             sed -i '/^\s*<key>/,/\s*<\/key>/d' ${config_file}
             sed -i '/^\s*key\s/d' ${config_file}
             echo "key /etc/openvpn/keys/user.key" >> ${config_file}
-        else
+        elif ! grep -q '^\s*key\s' ${config_file}
+        then
             crt_client_key=""
         fi
         if grep -q '^\s*<tls-auth>' ${config_file}
         then
-            grep -Poz '(?<=<tls-auth>)(.*\n)*.*(?=</tls-auth>)' ${config_file} > $tmp_dir/crt_client_ta
+            grep -Poz '(?<=<tls-auth>)(.*\n)*.*(?=</tls-auth>)' ${config_file} | sed '/^$/d' > $tmp_dir/crt_client_ta
             crt_client_ta=$tmp_dir/crt_client_ta
             sed -i '/^\s*<tls-auth>/,/\s*<\/tls-auth>/d' ${config_file}
             sed -i '/^\s*tls-auth\s/d' ${config_file}
             echo "tls-auth /etc/openvpn/keys/user_ta.key 1" >> ${config_file}
-        else
+        elif ! grep -q '^\s*tls-auth\s' ${config_file}
+        then
             crt_client_ta=""
         fi
         sed -i 's@^\s*ca\s.*$@ca /etc/openvpn/keys/ca-server.crt@g' ${config_file}
@@ -309,13 +324,11 @@ ynh_app_config_validate() {
         sed -i 's@^\s*tls-auth\s.*$@tls-auth /etc/openvpn/keys/user-ta.key@g' ${config_file}
     fi
 
-    # Restrict permission
+    # Currently we need root priviledge to create tun0
     if [ -f "${config_file}" ]
     then
         sed -i '/^\s*user\s/d' ${config_file}
         sed -i '/^\s*group\s/d' ${config_file}
-        echo "user vpnclient" >> ${config_file}
-        echo "group vpnclient" >> ${config_file}
     fi
 
     _ynh_app_config_validate