#!/bin/sh

# Preset for ctctl: Setup VPN client and link traffic to a VPS
# Version: 1.0.0
# Copyright: GNU GPL (2021-2021) Narcis Garcia
# Homepage: https://www.somtecnologia.com/

# TO DO:
#	- 


if [ -f "${PresetsDir}/server_lib.sh.inc" ] ; then
	. "${PresetsDir}/server_lib.sh.inc"
else
	printf '%s\n' "${sERROR}E: Presets library file not found: ${PresetsDir}/server_lib.sh${fRESET}" 1>&2
	LastStatus=95 ; if [ $StatusCode -eq 0 ] ; then StatusCode=$LastStatus ; fi
fi

preset_LINKVPN ()
{
	printf "${sHEAD0}\n   SETUP VPN CLIENT AND LINK TRAFFIC TO VPS${fRESET}\n"

	# COMMON SETUP
	if [ $StatusCode -eq 0 ] && [ ! -e /dev/net/tun ] ; then
		printf '%s\n' "Enabling TUN module"
		if [ "$(cat /etc/modules 2>/dev/null | grep -e '^tun$')" = "" ] ; then
			echo tun >> /etc/modules
			LastStatus=$? ; if [ $StatusCode -eq 0 ] ; then StatusCode=$LastStatus ; fi
		fi
		modprobe tun
	fi
	if [ $StatusCode -eq 0 ] && [ "$(id -un openvpn 2>/dev/null)" != "openvpn" ] ; then
		printf '%s\n' "Creating OpenVPN system account"
		GecosParm='--comment'
		if [ "$(adduser --help | grep -e '--comment')" = "" ] ; then GecosParm='--gecos' ; fi
		adduser --system --disabled-login $GecosParm '' --home /etc/openvpn --no-create-home --group openvpn
		LastStatus=$? ; if [ $StatusCode -eq 0 ] ; then StatusCode=$LastStatus ; fi
	fi
	if [ $StatusCode -eq 0 ] ; then
		printf '%s\n' "Deploying directories for OpenVPN"
		for CurDir in /etc/openvpn/accounts.d /etc/openvpn/peers.d /etc/openvpn/scripts /var/log/openvpn ; do
			if [ $StatusCode -eq 0 ] && [ ! -d "$CurDir" ] ; then
				mkdir -p "$CurDir"
				LastStatus=$? ; if [ $StatusCode -eq 0 ] ; then StatusCode=$LastStatus ; fi
				chown -R openvpn:openvpn "$CurDir"
				LastStatus=$? ; if [ $StatusCode -eq 0 ] ; then StatusCode=$LastStatus ; fi
				chmod -R u=rwX,g=rX,o= "$CurDir"
				LastStatus=$? ; if [ $StatusCode -eq 0 ] ; then StatusCode=$LastStatus ; fi
				chmod -R g+s "$CurDir"
				LastStatus=$? ; if [ $StatusCode -eq 0 ] ; then StatusCode=$LastStatus ; fi
			fi
		done
		LastStatus=$? ; if [ $StatusCode -eq 0 ] ; then StatusCode=$LastStatus ; fi
	fi
	if [ $StatusCode -eq 0 ] && [ ! -x /etc/openvpn/scripts/gw-updown.sh ] ; then
		printf '%s\n' "Installing session scripts"
		HttpGetContent https://downloads.actiu.net/ctctl/utilities/vpn/gw-updown.sh > /etc/openvpn/scripts/gw-updown.sh
		LastStatus=$? ; if [ $StatusCode -eq 0 ] ; then StatusCode=$LastStatus ; fi
		chmod u+rwx,g+rx /etc/openvpn/scripts/gw-updown.sh
		LastStatus=$? ; if [ $StatusCode -eq 0 ] ; then StatusCode=$LastStatus ; fi
	fi

	# CLIENT SETUP
}

case "$Type" in
	"ovz" )
		printf '%s\n' "${sERROR}E: Container type \"${Type}\" not yet implemented for preset: ${Preset}.${fRESET}" 1>&2
		LastStatus=63 ; if [ $StatusCode -eq 0 ] ; then StatusCode=$LastStatus ; fi
		;;
	"lxc" )
		preset_LINKVPN
		LastStatus=$? ; if [ $StatusCode -eq 0 ] ; then StatusCode=$LastStatus ; fi
		;;
	* )
		printf '%s\n' "${sERROR}E: Unknown or unsupported container type \"${Type}\" for preset: ${Preset}.${fRESET}" 1>&2
		LastStatus=80 ; if [ $StatusCode -eq 0 ] ; then StatusCode=$LastStatus ; fi
		;;
esac
