lib/TMC.SN.Tables.ps1



function Get-SNTable {
    param (
        $instance,
        $table,
        $method,
        $headers)
    

    $Filtered = ($sn_table_list | Where-Object {$_.Name -eq $table}).Filtered
    if ($Filtered -eq $true) {
        $searchParam = '&sysparm_query=sys_domain=' + $searchDomain
    }

    if (-Not [string]::IsNullOrEmpty($fieldList)) {
        $fieldListParam = '&sysparm_fields=' + $fieldList
    }

    if ($debug_createsampleresult -eq $true) {
        $resultSize = $debug_sampleassetresultsize
        $restMethodParms = @{}
    }
    else {
        $resultSize = 10000
        $restMethodParms = @{FollowRelLink = $true; }
    }
    
    
    ## Control Dependency collection as an override
    if ($table -eq 'cmdb_rel_ci') {
                
        # Debug Settings
        if ($debug_createsampleresult -eq $true) {
            $resultSize = $debug_sampledependencyresultsize
        }
    }

    ## Update Core tables so we get the whole thing
    if ($table -in @("core_company", "cmn_location","cmdb_model","cmdb_rel_type")){
        $resultSize = 10000
        $restMethodParms = @{FollowRelLink = $true; }
    }


    Write-Host "Getting ServiceNow Table: " -NoNewline
    Write-Host $table -ForegroundColor Green



    $uri = "https://$instance/api/now/table/" + $table + "?sysparm_limit=" + $resultSize + $searchParam + $fieldListParam
    $response = Invoke-RestMethod -Headers $headers -Method $method -Uri $uri @restMethodParms


    foreach ($item in $response) {
        $resultset += $item.result
    }
    $resultset


}

Function Invoke-SNDataCollection {

    if ($debug_createsampleresult -eq $true) {
        Write-Host " Collecting Sample Size of $debug_sampleassetresultsize Assets, and $debug_sampledependencyresultsize Dependencies" -ForegroundColor Yellow
    }

    foreach ($table in $sn_table_list) {
        $data = Get-SNTable -table $table.Name -instance $instance -method $method -headers $headers
        Add-Member -InputObject $ro -MemberType NoteProperty -Name $table.Name -Value $data -Force
    }
}

Function Update-SNReferenceColumns {
    param (
        [Parameter(Mandatory = $true)][Array]$inputObject,
        [Parameter(Mandatory = $true)][PSObject]$Table
    )
    
    ## Sort the object
    $inputObject = $inputObject | Sort-Object -Property sys_id

    $assetClass = $Table.TMAssetClass

    foreach ($item in $inputObject) {
        
        if($assetClass -ne $null){
            $ro.sys_id_to_asset_type.($item.sys_id) = $assetClass
        }
        
        $item.model_id | Add-Member -MemberType NoteProperty -Name name -Value ($ro.cmdb_model | Where-Object {$_.sys_id -eq $item.model_id.value}).name -Force -ErrorAction SilentlyContinue
        $item.manufacturer | Add-Member -MemberType NoteProperty -Name name -Value ($ro.core_company | Where-Object {$_.sys_id -eq $item.manufacturer.value}).name  -Force -ErrorAction SilentlyContinue
        $item.location | Add-Member -MemberType NoteProperty -Name name -Value ($ro.cmn_location | Where-Object {$_.sys_id -eq $item.location.value}).name -Force -ErrorAction SilentlyContinue
        
        # These reduce the output file size
        if($item.model_id){$item.model_id.PSObject.Properties.Remove("link")}
        if($item.manufacturer){$item.manufacturer.PSObject.Properties.Remove("link")}
        if($item.location){$item.location.PSObject.Properties.Remove("link")}
        if($item.running_process){$item.running_process.PSObject.Properties.Remove("link")}
        if($item.running_process_command){$item.running_process_command.PSObject.Properties.Remove("link")}
    }
}

Function Update-SNDependencies {
    
    $knownparents = @()
    $knownparentsandchildren = @()

    Write-Host "Removing Dependencies with Unknown Parents"    
    $knownparents = foreach ($dep in $global:ro.cmdb_rel_ci) {
        if ($dep.parent.value -ne $null){
            if($global:ro.sys_id_to_asset_type.Contains($dep.parent.value)) {
                $dep
            }
        }
    }
    Write-Host "Remaining Dependencies (with Known Parents): " -NoNewLine
    Write-Host $knownparents.count -ForegroundColor Green
    
    Write-Host "Removing Dependencies with Unknown Children"    
    $knownparentsandchildren = foreach ($dep in $knownparents) {
        if ($dep.child.value -ne $null){
            if($global:ro.sys_id_to_asset_type.Contains($dep.child.value)) {
                $dep
            }
        }
    }
    
    #Report how many dependencies were kept
    Write-Host "Total Remaining Dependencies: " -NoNewline
    Write-Host $knownparentsandchildren.Count -ForegroundColor Green
    
    Write-host "Adding Asset Types"
    foreach ($item in $knownparentsandchildren) {
        Add-Member -InputObject $item -MemberType NoteProperty -Name "parentclass" -value $ro.sys_id_to_asset_type[$item.parent.value] -Force
        Add-Member -InputObject $item -MemberType NoteProperty -Name "childclass" -value $ro.sys_id_to_asset_type[$item.child.value] -Force
        Add-Member -InputObject $item -MemberType NoteProperty -Name "deptype" -value ($ro.cmdb_rel_type | Where-Object {$_.sys_id -eq $item.type.value}).name -Force
    }
    
    #Replace the original data with the applicable relationships
    $global:ro.cmdb_rel_ci = $knownparentsandchildren
    
}

function Update-ObjectToValue {
    param(
        [Parameter(Mandatory = $true)][PSObject]$inputObject,
        [Parameter(Mandatory = $true)][string]$property
        )

    if ($inputObject.$property -ne $null) {
        $inputObject.$property = $inputObject.$property.value
    }
}

function Update-ObjectToName {
    param(
        [Parameter(Mandatory = $true)][PSObject]$inputObject,
        [Parameter(Mandatory = $true)][string]$property
    )

    if ($inputObject.$property -ne $null) {
        $inputObject.$property = $inputObject.$property.name
    }
}

Function Update-SNResults {
    
    foreach ($table in $sn_table_list) {

        switch ($table.ProcessingRequired) {
            "Base" { 

                Write-Host "Processing Data Updates for: " -NoNewline
                Write-Host $table.Name -ForegroundColor Green
                $updateObject = $global:ro.($table.Name)
                if($updateObject.Count -gt 0){
                    Update-SNReferenceColumns -inputObject $updateObject -Table $table
                }
            }
            "Relationship" { 
                Write-Host "Processing Relationships/Dependencies"
                Update-SNDependencies
            }
            Default {}
        }
        
    }
}