#!/bin/bash #================================================= # GENERIC STARTING #================================================= # IMPORT GENERIC HELPERS #================================================= source _common.sh source /usr/share/yunohost/helpers #================================================= # MANAGE SCRIPT FAILURE #================================================= # Exit if an error occurs during the execution of the script ynh_abort_if_errors #================================================= # RETRIEVE ARGUMENTS #================================================= app=$YNH_APP_INSTANCE_NAME final_path=$(ynh_app_setting_get $app final_path) #================================================= # SPECIFIC GETTERS FOR TOML SHORT KEY #================================================= get__status() { if [ -f "/sys/class/net/tun0/operstate" ] && [ "$(cat /sys/class/net/tun0/operstate)" == "up" ] then if [ $old[service_enabled] -eq 1 ] then cat << EOF style: success ask: en: Your VPN is running :) EOF else cat << EOF style: warning ask: en: Your VPN is running, but it shouldn't ! EOF fi elif [ $old[service_enabled] -eq 1 ] then cat << EOF style: danger ask: en: Your VPN is down ! EOF else cat << EOF style: info ask: en: Your VPN is down has expected. EOF fi } get__login_user() { if [ -s /etc/openvpn/keys/credentials ] then sed -n 1p /etc/openvpn/keys/credentials fi } get__login_passphrase() { if [ -s /etc/openvpn/keys/credentials ] then sed -n 2p /etc/openvpn/keys/credentials fi } #================================================= # SPECIFIC VALIDATORS FOR TOML SHORT KEYS #================================================= validate__login_user() { if grep -q '^\s*auth-user-pass' ${config_file} then [[ -z "${login_user}" ]] && echo 'A Username is needed with this configuration file' fi } validate__login_passphrase() { if grep -q '^\s*auth-user-pass' ${config_file} then [[ -z "${login_passphrase}" ]] && echo 'A Password is needed with this configuration file' fi } validate__crt_server_ca() { if grep -q '^\s*ca\s' ${config_file} then [[ ! -e "${crt_server_ca}" ]] && echo "A server CA certificate is needed" fi } validate__crt_client() { if grep -q '^\s*cert\s' ${config_file} then [[ ! -e "${crt_client}" ]] && echo "A Client certificate is needed with this configuration file" fi } validate__crt_client_key() { if grep -q '^\s*key\s' ${config_file} then [[ ! -e "${crt_client_key}" ]] && echo "A client private key is needed with this configuration file" fi } validate__crt_client_ta() { if grep -q '^\s*tls-auth\s' ${config_file} then [[ ! -e "${crt_client_ta}" ]] && echo "A TLS auth shared secret is needed with this configuration file" fi } validate__nameservers() { [[ "$dns_method" == "custom" ]] && [[ -z "$nameservers" ]] echo "You need to choose DNS resolvers or select an other method to provide DNS resolvers" } #================================================= # SPECIFIC SETTERS FOR TOML SHORT KEYS #================================================= set__login_user() { if [ -n "${login_user}" ] then echo "${login_user}\n${login_passphrase}" > /etc/openvpn/keys/credentials else echo "" > /etc/openvpn/keys/credentials fi } set__login_passphrase() { : } #================================================= # OVERWRITING VALIDATE STEP #================================================= ynh_panel_validate() { tmp_dir=$(dirname "${config_file}") # Overwrite form response with cube files data before validation process if [ -f "${config_file}" ] && [[ $config_file == *.cube ]] then 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 dns_method="custom" nameservers="$dns0,$dns1" # Build specific OVPN template 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}")" do if [ ! -z "${rm_regex}" ] ; then sed -i "/$rm_regex/di" $tmp_dir/client.conf.tpl fi done # Add some other lines echo "# Custom" >> $tmp_dir/client.conf.tpl jq --raw-output ".openvpn_add[]" "${config_file}" >> $tmp_dir/client.conf.tpl # Build directly the OVPN file cp /etc/openvpn/client.conf.tpl "${config_file}" sed "s||${settings[server_name]}|g" -i "${config_file}" sed "s||${settings[server_port]}|g" -i "${config_file}" sed "s||${settings[server_proto]}|g" -i "${config_file}" if [ -e "${settings[crt_client_key]}" ]; then sed 's|^||g' -i "${config_file}" else sed 's|^|;|g' -i "${config_file}" fi if [ -e "${settings[crt_client_ta]}" ]; then sed 's|^||' -i "${config_file}" else sed 's|^|;|' -i "${config_file}" fi if [[ "${settings[server_proto]}" =~ udp ]]; then sed 's|^||' -i "${config_file}" else sed 's|^|;|' -i "${config_file}" fi if [ -n "${settings[login_user]}" ]; then sed 's|^||' -i "${config_file}" else sed 's|^|;|' -i "${config_file}" fi elif [ -f "${config_file}" ] && [[ "${config_file}" =~ ^.*\.(ovpn|conf)$ ]] then if grep -q '^\s*' ${config_file} then grep -Poz '(?<=)(.*\n)*.*(?=)' ${config_file} > $tmp_dir/crt_server_ca crt_server_ca=$tmp_dir/crt_server_ca sed -i '/^\s*/,/\s*<\/ca>/d' ${config_file} sed -i '/^\s*ca\s/d' ${config_file} echo "ca /etc/openvpn/keys/ca-server.crt" >> ${config_file} fi if grep -q '^\s*' ${config_file} then grep -Poz '(?<=)(.*\n)*.*(?=)' ${config_file} > $tmp_dir/crt_client crt_client=$tmp_dir/crt_client sed -i '/^\s*/,/\s*<\/cert>/d' ${config_file} sed -i '/^\s*cert\s/d' ${config_file} echo "cert /etc/openvpn/keys/user.crt" >> ${config_file} fi if grep -q '^\s*' ${config_file} then grep -Poz '(?<=)(.*\n)*.*(?=)' ${config_file} > $tmp_dir/crt_client_key crt_client_key=$tmp_dir/crt_client_key sed -i '/^\s*/,/\s*<\/key>/d' ${config_file} sed -i '/^\s*key\s/d' ${config_file} echo "key /etc/openvpn/keys/user.key" >> ${config_file} fi if grep -q '^\s*' ${config_file} then grep -Poz '(?<=)(.*\n)*.*(?=)' ${config_file} > $tmp_dir/crt_client_ta crt_client_ta=$tmp_dir/crt_client_ta sed -i '/^\s*/,/\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} fi sed -i 's@^\s*ca\s.*$@ca /etc/openvpn/keys/ca-server.crt@g' ${config_file} sed -i 's@^\s*cert\s.*$@cert /etc/openvpn/keys/user.crt@g' ${config_file} sed -i 's@^\s*key\s.*$@key /etc/openvpn/keys/user.key@g' ${config_file} sed -i 's@^\s*tls-auth\s.*$@tls-auth /etc/openvpn/keys/user-ta.key@g' ${config_file} fi _ynh_panel_validate } #================================================= # OVERWRITING APPLY STEP #================================================= ynh_panel_apply() { # Stop vpn client touch /tmp/.ynh-vpnclient-stopped systemctl stop ynh-vpnclient _ynh_panel_apply # Start vpn client systemctl start ynh-vpnclient rm -f /tmp/.ynh-vpnclient-stopped } ynh_panel_run $1