Common.psm1


<#PSScriptInfo
 
.VERSION 1.0
 
.GUID 2c1a2f98-e781-403c-9c81-85b736767abc
 
.AUTHOR RaviCKolandaiswamy
 
.COMPANYNAME
 
.COPYRIGHT
 
.TAGS
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
 
 
.PRIVATEDATA
 
#>


<#
 
.DESCRIPTION
 Basic Functions for calling various APIs
 
#>
 

#Get public and private function definition files.

#check PS version for this, PS 6 and above use -SkipCertificateCheck for Invoke-RestMethod
if ($PSVersionTable.PSVersion.Major -lt 6)
{
    #Ignore SSL errors
    If ($Null -eq ([System.Management.Automation.PSTypeName]'TrustAllCertsPolicy').Type) {
        Add-Type -Debug:$False @"
            using System.Net;
            using System.Security.Cryptography.X509Certificates;
            public class TrustAllCertsPolicy : ICertificatePolicy {
                public bool CheckValidationResult(
                    ServicePoint srvPoint, X509Certificate certificate,
                    WebRequest request, int certificateProblem) {
                    return true;
                }
            }
"@

    }
    [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
}


#Enable TLS, TLS1.1, TLS1.2 in this session if they are available
IF([Net.SecurityProtocolType]::Tls) {[Net.ServicePointManager]::SecurityProtocol=[Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls}
IF([Net.SecurityProtocolType]::Tls11) {[Net.ServicePointManager]::SecurityProtocol=[Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls11}
IF([Net.SecurityProtocolType]::Tls12) {[Net.ServicePointManager]::SecurityProtocol=[Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12}

function Invoke-RestApiRequest {
    [CmdletBinding(DefaultParameterSetName = 'EndpointName')]
    param (
         [Parameter(ParameterSetName = 'Endpoint')]
          $url,
         [Parameter(ParameterSetName = 'Endpoint')]
          $user,
         [Parameter(ParameterSetName = 'Endpoint')]
          $pass,

          [Parameter(ParameterSetName = 'EndpointName')]
          $endpointName,

          [Parameter(ParameterSetName = 'EndpointName')]
          [Parameter(ParameterSetName = 'Endpoint')]
          $relativeUrl,

          [Parameter(ParameterSetName = 'EndpointName')]
          [Parameter(ParameterSetName = 'Endpoint')]
          $jsonBody,

          [Parameter(ParameterSetName = 'EndpointName')]
          [Parameter(ParameterSetName = 'Endpoint')]
          $method = 'GET'
    )
    
    if ($PSCmdlet.ParameterSetName -eq 'EndpointName') 
    {
        $connection = Get-ApiConnection $endpointName
        $url = $connection.ApiEndpointUrl
        $user = $connection.ApiUser
        $pass = $connection.ApiKey
    } 

    $decodedCreds = Invoke-Decode $pass #[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass))
    $pair = "$($user):$($decodedCreds)"
    $encodedCreds = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))
    $basicAuthValue = "Basic $encodedCreds"
    $Headers = @{
        Authorization = $basicAuthValue
    }

    $params = @{
        Uri         = $url.TrimEnd('/') + '/' + $relativeUrl.TrimStart('/')
        Headers     = $Headers
        Method      = $method
        Body        = $jsonBody
        ContentType = 'application/json'
    }
    Write-Output "URL: $($params.Uri)"
    return Invoke-RestMethod @params -SkipCertificateCheck
}    

function Invoke-Decode {
    param($text)
    return [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($text))
}

function Add-ApiConnection {
    $name = Read-Host 'API Connection Name'
    $url = Read-Host 'API Endpoint Url'
    $user = Read-Host 'API User'
    $key = Read-Host "API Key" -AsSecureString
    $enc = $key | ConvertFrom-SecureString 
    $apiConnection = @{
        Name = $name
        ApiEndpointUrl = $url
        ApiUser = $user
        ApiKey = $enc
    }
    $json = ConvertTo-Json $apiConnection
    $json | Out-File "$name.api.dat"
}

function Get-ApiConnection {
    param (
        $name
        )
    
        if (!(Test-Path $name)) {
           $fileName = "$name.api.dat"
        } else {
            $fileName = $name
        }

        if (!(Test-Path $fileName)) {
            throw "Local Endpoint data file does not exist for the given connection name: $fileName"
        }
    $connectionData = Get-Content $fileName | ConvertFrom-Json
    $url = $connectionData.psobject.Properties['ApiEndpointUrl'].Value
    $user = $connectionData.psobject.Properties['ApiUser'].Value
    $enc = $connectionData.psobject.Properties['ApiKey'].Value
    $key = $enc | ConvertTo-SecureString

    $connection = @{
        Name = $connectionData.Name
        ApiEndpointUrl = $url
        ApiUser = $user
        ApiKey = $key
    }
    return $connection
}

function Add-HostConnection {
    $name = Read-Host 'Connection Name'
    $hostName = Read-Host 'Host Name (Machine Name or IP)'
    $creds = Get-Credential
    $user = $creds.UserName
    $encPassword = $creds.Password | ConvertFrom-SecureString

    try
    {
        $portInput = Read-Host 'WMI Port (Ex: 5985)'
        $port = [System.Convert]::ToInt($portInput)
    } catch
    {
        $port = 5985
    }
    
    try
    {
        $sslInput = Read-Host 'WMI Is Use SSL ? (yes / no)?'
        $isUseSsl = [System.Convert]::ToBoolean($sslInput)
    } catch
    {
        $isUseSsl = $False
    }

    $hostConnection = @{
        Name = $name
        HostName = $hostName
        User = $user
        Password = $encPassword
        Port = $port
        IsUseSsl = $isUseSsl
    }
    $json = ConvertTo-Json $hostConnection
    $json | Out-File "$name.host.dat"
}

function Get-HostConnection {
    param (
        $name
        )
    
        if (!(Test-Path $name)) {
           $fileName = "$name.host.dat"
        } else {
            $fileName = $name
        }

        if (!(Test-Path $fileName)) {
            throw "Local Host data file does not exist for the given connection name: $fileName"
        }
    $connectionData = Get-Content $fileName | ConvertFrom-Json
    $hostName = $connectionData.psobject.Properties['HostName'].Value
    $port= [int] ($connectionData.psobject.Properties['Port'].Value)
    $isUseSsl= [bool] ($connectionData.psobject.Properties['IsUseSsl'].Value)
    $user = $connectionData.psobject.Properties['User'].Value
    $enc = $connectionData.psobject.Properties['Password'].Value
    $key = $enc | ConvertTo-SecureString

    $connection = @{
        Name = $connectionData.Name
        HostName = $hostName
        User = $user
        Password = $key
        Port = $port
        IsUseSsl = $isUseSsl
    }
    return $connection
}

function Add-SqlDbConnection {
    $name = Read-Host 'Connection Name'
    $dbServerName = Read-Host 'DB Server Name'
    $user = Read-Host 'DB User'
    $pass = Read-Host "DB Password" -AsSecureString
    $encPassword = $pass | ConvertFrom-SecureString

    $sqlDbConnection = @{
        Name = $name
        DbServerName = $dbServerName
        User = $user
        Password = $encPassword
    }
    $json = ConvertTo-Json $sqlDbConnection
    $json | Out-File "$name.sqldb.dat"
}

function Get-SqlDbConnection {
    param (
        $name
        )
    
        if (!(Test-Path $name)) {
           $fileName = "$name.sqldb.dat"
        } else {
            $fileName = $name
        }

        if (!(Test-Path $fileName)) {
            throw "Local SQL DB data file does not exist for the given connection name: $fileName"
        }
    $connectionData = Get-Content $fileName | ConvertFrom-Json
    $dbServerName = $connectionData.psobject.Properties['DbServerName'].Value
    $user = $connectionData.psobject.Properties['User'].Value
    $enc = $connectionData.psobject.Properties['Password'].Value
    $pass = $enc | ConvertTo-SecureString

    $connection = @{
       Name = $connectionData.Name
       DbServerName = $dbServerName
       User = $user
       Password = $pass
    }
    return $connection
}

function Invoke-SqlDbQuery {
    param($name, $dbName, $query)
    $sqlDbConn = Get-SqlDbConnection $name
    $decoded = Invoke-Decode $sqlDbConn.Password
    Invoke-Sqlcmd -ServerInstance $sqlDbConn.DbServerName -Database $dbName -Username $sqlDbConn.User -Password "$decoded" -Query $query
}

function Invoke-SqlDbQueryFromFile {
    param($name, $dbName, $queryFile)
    $sqlDbConn = Get-SqlDbConnection $name
    $decoded = Invoke-Decode $sqlDbConn.Password
    Invoke-Sqlcmd -ServerInstance $sqlDbConn.DbServerName -Database $dbName -Username $sqlDbConn.User -Password "$decoded" -InputFile $queryFile
}

function Invoke-EnterPSSession {
    param($name)
    $hostConnection = Get-HostConnection $name
    $hostCreds=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $hostConnection.User, $hostConnection.Password
    if($hostConnection.IsUseSsl) {
        Enter-PSSession -ComputerName $hostConnection.HostName -Port $hostConnection.Port -UseSSL -Credential $hostCreds
    } else {
        Enter-PSSession -ComputerName $hostConnection.HostName -Port $hostConnection.Port -Credential $hostCreds
    }
}

function Invoke-ExitPSSession {
    Exit-PSSession
}

function Invoke-HostCommand {
    param($name, $cmd)
    $hostConnection = Get-HostConnection $name
    $hostCreds=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $hostConnection.User, $hostConnection.Password
    $sc=[Scriptblock]::Create($cmd)
    if($hostConnection.IsUseSsl) {
        Invoke-Command -ComputerName $hostConnection.HostName -Port $hostConnection.Port -UseSSL -Credential $hostCreds -ScriptBlock $sc
    } else {
        Invoke-Command -ComputerName $hostConnection.HostName -Port $hostConnection.Port -Credential $hostCreds -ScriptBlock $sc
    }
}

function Get-HostEventLog {
    param($name, $logName = "Application", [int] $newest = 10, $entryType = "Error", [datetime] $after, [datetime] $before, $source, $message, [int] $index)
    $hostConnection = Get-HostConnection $name
    $hostCreds=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $hostConnection.User, $hostConnection.Password
    $cmd = "Get-EventLog -LogName $logName -Newest $newest -EntryType $entryType"
    if($after -ne $null) {
        $cmd = $cmd + " -After $after"
    }
    if($before -ne $null) {
        $cmd = $cmd + " -Before $before"
    }
    if($source -ne $null) {
        $cmd = $cmd + " -Source $source"
    }
    if($message -ne $null) {
        $cmd = $cmd + " -Message $message"
    }
    if($index -ne $null -and $index -gt 0) {
        $cmd = $cmd + " -Index $index"
    }
    Write-Host "Executing: $cmd"
    $sc=[Scriptblock]::Create($cmd)
    if($hostConnection.IsUseSsl) {
        Invoke-Command -ComputerName $hostConnection.HostName -Port $hostConnection.Port -UseSSL -Credential $hostCreds -ScriptBlock $sc
    } else {
        Invoke-Command -ComputerName $hostConnection.HostName -Port $hostConnection.Port -Credential $hostCreds -ScriptBlock $sc
    }
}

function Invoke-InstallOrUpdateModule {
    param($name) 
    if ((Get-InstalledModule -Name $name -ErrorAction SilentlyContinue) -eq $null) {
        #-MinimumVersion 5.0 # Optionally specify minimum version to have
        Install-Module -Name CloudAssert.Common
    } else {
        Update-Module -Name CloudAssert.Common -Force
    }
}
# SIG # Begin signature block
# MIIOCwYJKoZIhvcNAQcCoIIN/DCCDfgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUZNaE8sCmMinGcbEuqKc5oCfi
# GSagggtCMIIFWjCCBEKgAwIBAgIQDO0lEK+T1uQiVg3lGt++5DANBgkqhkiG9w0B
# AQsFADB9MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVy
# MRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEj
# MCEGA1UEAxMaQ09NT0RPIFJTQSBDb2RlIFNpZ25pbmcgQ0EwHhcNMTcxMDEzMDAw
# MDAwWhcNMjExMDEzMjM1OTU5WjCBojELMAkGA1UEBhMCVVMxDjAMBgNVBBEMBTk4
# MDUyMQswCQYDVQQIDAJXQTEQMA4GA1UEBwwHUmVkbW9uZDESMBAGA1UECQwJU3Vp
# dGUgMjAwMRowGAYDVQQJDBE4MjAxIDE2NHRoIEF2ZSBORTEZMBcGA1UECgwQQ0xP
# VUQgQVNTRVJUIExMQzEZMBcGA1UEAwwQQ0xPVUQgQVNTRVJUIExMQzCCASIwDQYJ
# KoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3TRJvdYkx0p/ETrd2ZDE42azIJ4qsR
# SrFIrV2Ac0rSRry9gouPMNgPGCdvcLkDj247i5LuJK1G/kXK27cCnefXgiiy7IZz
# XCzYIr+rhQ2IpZFDQHRDu8gAHthtCrW/0DiDZZLOqAfQipoaJiZLktfw1ExMjoZO
# lzux00hH/8BasYAaV2wWR3MPEqt8ehtOInop7vUKXHBeHqlS0vGZpmZmSooqnOqo
# e/+Ik7rBODjfWbS/ukEEz3uT5tQAfbaCqe0AI7jy+Qguag20pUSJZI15tzoUGDzu
# QF0IIhDZRUhrs9MVGlBCHPcQg5nAfll1xeyAXDGvOTUVNbe7p20H0tECAwEAAaOC
# Aa4wggGqMB8GA1UdIwQYMBaAFCmRYP+KTfrr+aZquM/55ku9Sc4SMB0GA1UdDgQW
# BBQDFhoCqrRSPk96X5/uWmKZzc0GfjAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/
# BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAzARBglghkgBhvhCAQEEBAMCBBAwRgYD
# VR0gBD8wPTA7BgwrBgEEAbIxAQIBAwIwKzApBggrBgEFBQcCARYdaHR0cHM6Ly9z
# ZWN1cmUuY29tb2RvLm5ldC9DUFMwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2Ny
# bC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5jcmwwdAYIKwYB
# BQUHAQEEaDBmMD4GCCsGAQUFBzAChjJodHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9D
# T01PRE9SU0FDb2RlU2lnbmluZ0NBLmNydDAkBggrBgEFBQcwAYYYaHR0cDovL29j
# c3AuY29tb2RvY2EuY29tMB8GA1UdEQQYMBaBFGluZm9AY2xvdWRhc3NlcnQuY29t
# MA0GCSqGSIb3DQEBCwUAA4IBAQCkmEma81+PRWa1v+En+dBfFF0TlfrnwXHQeU6a
# qGRxFWJO2ORTlj8TyTJZNQp7/5senwqGOkhZyBiUbDDz+mgpS3dD8+OTB+LPeTC0
# qxA2FwZan2yLiMyJ+tzWoMZThxWGdKr//9SwglLk6sjgAYeQ8zw0eLC3R5GkGZKE
# ZJdlZkeZj3OcjDZ+tsB0YeyrvzQApaAHxROJjPFmFNJulHkGTOIftgAYTZOLCuBw
# UjveYnsgiOjey0ljXb94Xfiy5V7F+Tg3hKmu+ykDthEr04omYgun4JRB++4ZmoYy
# Q9oqjKQDJM7/dnVbMh0W0D/8Ns0OepvGilKNbYYbVsLKi451MIIF4DCCA8igAwIB
# AgIQLnyHzA6TSlL+lP0ct800rzANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UEBhMC
# R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9y
# ZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBS
# U0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTMwNTA5MDAwMDAwWhcNMjgw
# NTA4MjM1OTU5WjB9MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5j
# aGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGlt
# aXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJTQSBDb2RlIFNpZ25pbmcgQ0EwggEiMA0G
# CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCmmJBjd5E0f4rR3elnMRHrzB79MR2z
# uWJXP5O8W+OfHiQyESdrvFGRp8+eniWzX4GoGA8dHiAwDvthe4YJs+P9omidHCyd
# v3Lj5HWg5TUjjsmK7hoMZMfYQqF7tVIDSzqwjiNLS2PgIpQ3e9V5kAoUGFEs5v7B
# EvAcP2FhCoyi3PbDMKrNKBh1SMF5WgjNu4xVjPfUdpA6M0ZQc5hc9IVKaw+A3V7W
# vf2pL8Al9fl4141fEMJEVTyQPDFGy3CuB6kK46/BAW+QGiPiXzjbxghdR7ODQfAu
# ADcUuRKqeZJSzYcPe9hiKaR+ML0btYxytEjy4+gh+V5MYnmLAgaff9ULAgMBAAGj
# ggFRMIIBTTAfBgNVHSMEGDAWgBS7r34CPfqm8TyEjq3uOJjs2TIy1DAdBgNVHQ4E
# FgQUKZFg/4pN+uv5pmq4z/nmS71JzhIwDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB
# /wQIMAYBAf8CAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYDVR0gBAowCDAGBgRV
# HSAAMEwGA1UdHwRFMEMwQaA/oD2GO2h0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NP
# TU9ET1JTQUNlcnRpZmljYXRpb25BdXRob3JpdHkuY3JsMHEGCCsGAQUFBwEBBGUw
# YzA7BggrBgEFBQcwAoYvaHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNB
# QWRkVHJ1c3RDQS5jcnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2Nh
# LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAAj8COcPu+Mo7id4MbU2x8U6ST6/COCwE
# zMVjEasJY6+rotcCP8xvGcM91hoIlP8l2KmIpysQGuCbsQciGlEcOtTh6Qm/5iR0
# rx57FjFuI+9UUS1SAuJ1CAVM8bdR4VEAxof2bO4QRHZXavHfWGshqknUfDdOvf+2
# dVRAGDZXZxHNTwLk/vPa/HUX2+y392UJI0kfQ1eD6n4gd2HITfK7ZU2o94VFB696
# aSdlkClAi997OlE5jKgfcHmtbUIgos8MbAOMTM1zB5TnWo46BLqioXwfy2M6FafU
# FRunUkcyqfS/ZEfRqh9TTjIwc8Jvt3iCnVz/RrtrIh2IC/gbqjSm/Iz13X9ljIwx
# VzHQNuxHoc/Li6jvHBhYxQZ3ykubUa9MCEp6j+KjUuKOjswm5LLY5TjCqO3GgZw1
# a6lYYUoKl7RLQrZVnb6Z53BtWfhtKgx/GWBfDJqIbDCsUgmQFhv/K53b0CDKieoo
# fjKOGd97SDMe12X4rsn4gxSTdn1k0I7OvjV9/3IxTZ+evR5sL6iPDAZQ+4wns3bJ
# 9ObXwzTijIchhmH+v1V04SF3AwpobLvkyanmz1kl63zsRQ55ZmjoIs2475iFTZYR
# PAmK0H+8KCgT+2rKVI2SXM3CZZgGns5IW9S1N5NGQXwH3c/6Q++6Z2H/fUnguzB9
# XIDj5hY5S6cxggIzMIICLwIBATCBkTB9MQswCQYDVQQGEwJHQjEbMBkGA1UECBMS
# R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
# T01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJTQSBDb2RlIFNpZ25p
# bmcgQ0ECEAztJRCvk9bkIlYN5RrfvuQwCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcC
# AQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYB
# BAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFN2XUeS42uxw
# iMlIQnP3Fwb90emxMA0GCSqGSIb3DQEBAQUABIIBAJFzCtWls/oZrxYB+tTNKg/3
# hua65PA6UsKJqgLam3HWtKByhFrR3VFNaBp/2Ib8LNMS/PaqCNjxvHzj/wfoE0C4
# c8r9tf87kVA/AoC4S9kzXsE41Zk97WqvzJfn6PAXdWI35TBcfyR9yTHqwRfZdiRF
# Pbl+E3VqU2S5NcsdiC2raLXxsdsfaBQWUQUP2ESjLjON6WPkSq02ibXmKdJvt3Nw
# C+gx0hWY3IAx3rC27PzGIATRS/C1J6Nu284qfKig5vj5KtFrucYpyfco1+WNOQpg
# fudUDWoCKKlaKH4MO0VsGdfxM3OAExIyGJqyyY2a53alUeO3nnCgYRe1H7PNbQA=
# SIG # End signature block