AitonVPNTools.psm1


class HostsWritter {
    [String]$hostsPath
    [String]$dockerMachineIp
    [String]$localNexusName

    HostsWritter([String]$hostsPath, [String]$dockerMachineIp, [String]$localNexusName) {

        $this.hostsPath = $hostsPath
        $this.dockerMachineIp = $dockerMachineIp
        $this.localNexusName = $localNexusName

    }

    Add() {

        Write-Verbose "Adding hosts entry for instance: $this"

        $this.Remove()
        $filtered = Get-Content $this.hostsPath
        $filtered += "`r`n"
        $filtered += $this.dockerMachineIp + " " + $this.localNexusName + "`r`n"
        Set-Content -Value $filtered -Path $this.hostsPath

    }


    Remove() {

        Write-Verbose "Remove hosts entry for instance: $this"

        (Get-Content $this.hostsPath) | Where-Object { $_ -notmatch $this.dockerMachineIp } | Set-Content $this.hostsPath

    }

    [String]ToString() {

        return ($this.dockerMachineIp + " " + $this.hostsPath + " " + $this.localNexusName)

    }
}

function Has-NeededPrivilages() {
    
    $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
    return $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

}

function Exit-AfterFail($message) {

    Get-Process *openvpn* | Stop-Process -Force
    throw $message
    
}

function AitonVPN-Connect {
    
    [CmdletBinding()]
        Param(
            [Parameter(Mandatory=$True, Position=1)]
             [String]$vpnPassword,
             [String]$pathToVPNConf = 'C:\Program Files\OpenVPN\config\aiton\milewskip.ovpn',
             [String]$localNexusName = 'repository.dev.avecezar.org',
             [String]$dockerMachineIp = '127.0.0.1',
             [String]$hostsPath = "$env:windir\System32\drivers\etc\hosts",
             [String]$openVPNExePath = "C:\Program Files\OpenVPN\bin\openvpn.exe"
        )

    Write-Verbose "AitonVPN-Connect $pathToVPNConf $localNexusName $dockerMachineIp $hostsPath $openVPNExePath"

    if ((Has-NeededPrivilages) -eq $False) {
        Exit-AfterFail "Please run with Administrator rights. This module needs administrator privileges for editing hosts table."
    }

    [HostsWritter]$hostsWritter = New-Object HostsWritter($hostsPath, $dockerMachineIp, $localNexusName)

    $confParentPath = Split-Path -Parent $local:pathToVPNConf
    $command = "&{Set-Location -Path `'$local:confParentPath`'; echo `'$local:vpnPassword`' | & `'$local:openVPNExePath`' --config `'$local:pathToVPNConf`' }"
    $command = "-Command `"$command`""
    Start-Process powershell -ArgumentList $command -WindowStyle Hidden

    $hostsWritter.Remove()
    
}

function AitonVPN-Disconnect {
    
    [CmdletBinding()]
        Param(
             [String]$localNexusName = 'repository.dev.avecezar.org',
             [String]$dockerMachineIp = '127.0.0.1',
             [String]$hostsPath = "$env:windir\System32\drivers\etc\hosts"
        )

    Write-Verbose "AitonVPN-Disconnect $localNexusName $dockerMachineIp $hostsPath"

    if ((Has-NeededPrivilages) -eq $False) {
        throw "Please run with Administrator rights. This module needs administrator privileges for killing processes (OpenVPN) and editing hosts table."
    }

    [HostsWritter]$hostsWritter = New-Object HostsWritter($hostsPath, $dockerMachineIp, $localNexusName)
    Get-Process *openvpn* | Stop-Process -Force
    $hostsWritter.Add()
    
}

Export-ModuleMember -Function AitonVPN-Connect, AitonVPN-Disconnect