Xester.psm1

Write-Verbose 'Importing from [C:\projects\xester\Xester\private]'
# .\Xester\private\Disable-SSLValidation.ps1
function Disable-SSLValidation
{
    <#
    .SYNOPSIS
        Disables SSL certificate validation
    .DESCRIPTION
        Disable-SSLValidation disables SSL certificate validation by using reflection to implement the System.Net.ICertificatePolicy class.
        Author: Matthew Graeber (@mattifestation)
        License: BSD 3-Clause
    .NOTES
        Reflection is ideal in situations when a script executes in an environment in which you cannot call csc.ese to compile source code.
        If compiling code is an option, then implementing System.Net.ICertificatePolicy in C# and Add-Type is trivial.
    .LINK
        http://www.exploit-monday.com
    #>

    Set-StrictMode -Version 2
    # You have already run this function if ([System.Net.ServicePointManager]::CertificatePolicy.ToString() -eq 'IgnoreCerts') { Return }
    $Domain = [AppDomain]::CurrentDomain
    $DynAssembly = New-Object System.Reflection.AssemblyName('IgnoreCerts')
    $AssemblyBuilder = $Domain.DefineDynamicAssembly($DynAssembly, [System.Reflection.Emit.AssemblyBuilderAccess]::Run)
    $ModuleBuilder = $AssemblyBuilder.DefineDynamicModule('IgnoreCerts', $false)
    $TypeBuilder = $ModuleBuilder.DefineType('IgnoreCerts', 'AutoLayout, AnsiClass, Class, Public, BeforeFieldInit', [System.Object], [System.Net.ICertificatePolicy])
    $TypeBuilder.DefineDefaultConstructor('PrivateScope, Public, HideBySig, SpecialName, RTSpecialName') | Out-Null
    $MethodInfo = [System.Net.ICertificatePolicy].GetMethod('CheckValidationResult')
    $MethodBuilder = $TypeBuilder.DefineMethod($MethodInfo.Name, 'PrivateScope, Public, Virtual, HideBySig, VtableLayoutMask', $MethodInfo.CallingConvention, $MethodInfo.ReturnType, ([Type[]] ($MethodInfo.GetParameters() | ForEach-Object {$_.ParameterType})))
    $ILGen = $MethodBuilder.GetILGenerator()
    $ILGen.Emit([Reflection.Emit.Opcodes]::Ldc_I4_1)
    $ILGen.Emit([Reflection.Emit.Opcodes]::Ret)
    $TypeBuilder.CreateType() | Out-Null

    # Disable SSL certificate validation
    [System.Net.ServicePointManager]::CertificatePolicy = New-Object IgnoreCerts
    return $true
}

# .\Xester\private\Get-XsTimeStamp.ps1
function Get-XsTimeStamp {
    <#
    .DESCRIPTION
        This function will return a TimeStamp.
    .PARAMETER RestServer
        A Rest Server is required.
    .EXAMPLE
        Get-XsTimeStamp
    .NOTES
        This will return a TimeStamp.
    #>

    [CmdletBinding()]
    [OutputType([string])]
    param()
    try
    {
        Get-Date -Format "MMddyyyy-HH:mm:ss"
    }
    catch
    {
        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName
        Throw "Get-XsTimeStamp: $ErrorMessage $FailedItem"
    }
}
Write-Verbose 'Importing from [C:\projects\xester\Xester\public]'
# .\Xester\public\Get-XSqmanData.ps1
function Get-XsQmanData {
    <#
.DESCRIPTION
    This function will Gather Qman data.
.PARAMETER RestServer
    A Rest Server is required.
.PARAMETER QmanId
    A Qman Id is required.
.EXAMPLE
    Get-XSqmanData -RestServer localhost -QmanId 1
.NOTES
    This will return a hashtable of data from the PPS database.
#>

[CmdletBinding(
    SupportsShouldProcess = $true,
    ConfirmImpact = "Low"
)]
[OutputType([hashtable])]
[OutputType([Boolean])]
param(
    [Parameter(Mandatory=$true)][string]$RestServer,
    [Parameter(Mandatory=$true)][int]$QmanId
)
begin {
}
process
{
    if ($pscmdlet.ShouldProcess("Get-XSqmanData"))
    {
        try
        {
            Write-Log -Message "Getting the Qman Data" -MsgType INFO -Logfile $Logfile -LogLevel $LogLevel
            # Make the rest call to Get the data
            $Url = "/queue_manager/$QmanId"
            Invoke-XesterRestCall -RestServer $RestServer -URI "$Url" -Method Get
        }
        catch
        {
            $ErrorMessage = $_.Exception.Message
            $FailedItem = $_.Exception.ItemName
            Throw "Get-XSqmanData: $ErrorMessage $FailedItem"
        }
    }
    else
    {
        # -WhatIf was used.
        return $false
    }
}
}
# .\Xester\public\Invoke-XesterRestCall.ps1
function Invoke-XesterRestCall
{
    <#
    .DESCRIPTION
        This function will Perform a Rest Call to a Specific XesterUI Server.
    .PARAMETER RestServer
        A Rest Server is required.(Hostname or IP, not full URL)
    .PARAMETER URI
        A URI is required.
    .PARAMETER Method
        A Method is Required.
    .PARAMETER Body
        A Method is Optional.
    .EXAMPLE
        Invoke-XesterRestCall -RestServer localhost -URI "/queue_manager/1?transform=true" -Method Get
    .NOTES
        This will return a hashtable of data from the PPS database.
    #>

    [CmdletBinding()]
    [OutputType([hashtable])]
    param(
        [Parameter(Mandatory = $true)][string]$RestServer,
        [Parameter(Mandatory = $true)][string]$URI,
        [ValidateSet("GET", "POST", "PUT", "DELETE")]
        [Parameter(Mandatory = $true)][string]$Method,
        [Parameter(Mandatory = $false)]$Body
    )
    try
    {
        $fullURL = "http://" + $RestServer + "/XesterUI/api/index.php" + $URI
        if ($null -eq $Body)
        {
            $RestParams = @{
                Method = "$Method"
                URI    = "$fullURL"
            }
        }
        else
        {
            $RestParams = @{
                Method = "$Method"
                URI    = "$fullURL"
                Body   = $Body
            }
        }
        Write-Log -Message "RestCall Details; FullUrl: $FullURL - Method: $Method" -LogLevel $LogLevel -MsgType DEBUG -Logfile $Logfile | Out-Null
        Invoke-RestMethod @RestParams
    }
    catch
    {
        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName
        Throw "Invoke-XesterRestCall: $ErrorMessage $FailedItem"
    }
}
# .\Xester\public\Update-XSqmanData.ps1
function Update-XsQmanData {
    <#
.DESCRIPTION
    This function will Update the Qman Data
.PARAMETER RestServer
    A Rest Server is required.
.PARAMETER Status
    A Status is required.
.PARAMETER QmanId
    A Qman Id is required.
.PARAMETER QmanLogFile
    A QmanLogFile is optional.
.EXAMPLE
    Update-XSqmanData -RestServer localhost -Status 2 -QmanId 1 -QmanLogFile "c:\test\test.log"
.NOTES
    This will return a hashtable of data from the PPS database.
#>

[CmdletBinding(
    SupportsShouldProcess = $true,
    ConfirmImpact = "Low"
)]
[OutputType([hashtable])]
[OutputType([Boolean])]
param(
    [Parameter(Mandatory=$true)][string]$RestServer,
    [Parameter(Mandatory=$true)][int]$Status,
    [Parameter(Mandatory=$false)][string]$QmanLogFile,
    [Parameter(Mandatory=$true)][int]$QmanId
)
begin {
    $HeartBeat = Get-XsTimeStamp
    if(($null -eq $QmanLogFile) -or ($QmanLogFile -eq "")){
        $body = @{
            STATUS_ID = "$Status"
            Heartbeat = "$HeartBeat"
        }
    } else {
        $body = @{
            STATUS_ID = "$Status"
            Log_File = "$QmanLogFile"
            Heartbeat = "$HeartBeat"
        }
    }
    $body = $body | ConvertTo-Json
}
process
{
    if ($pscmdlet.ShouldProcess("Update-XSqmanData"))
    {
        try
        {
            Write-Log -Message "Updating the Qman" -MsgType INFO -Logfile $Logfile -LogLevel $LogLevel
            # Make the rest call to update the data
            $Url = "/queue_manager/$QmanId"
            Invoke-XesterRestCall -RestServer $RestServer -URI "$Url" -Method Put -Body $body
        }
        catch
        {
            $ErrorMessage = $_.Exception.Message
            $FailedItem = $_.Exception.ItemName
            Throw "Update-XSqmanData: $ErrorMessage $FailedItem"
        }
    }
    else
    {
        # -WhatIf was used.
        return $false
    }
}
}
Write-Verbose 'Importing from [C:\projects\xester\Xester\classes]'