Public/Invoke-NexthinkNutanixConnector.ps1
|
function Invoke-NexthinkNutanixConnector { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string]$NutanixEnvironment, [Parameter(Mandatory = $false)] [string]$ScriptRootPath = $script:ModuleRoot ) $exitCode = 0 $version = Get-ModuleVersion try { $script:IN_MEMORY_LOGS.Clear() $config = Get-Configuration -ScriptRootPath $ScriptRootPath -NutanixEnvironment $NutanixEnvironment Initialize-Logger -Config $config Initialize-Folder -Config $config -Path $script:STORAGE_FOLDER_NAME | Out-Null Write-CustomLog -Message "Starting Nutanix Connector $version for environment: $NutanixEnvironment" -Severity 'INFO' Write-CustomLog -Message "Script root path: $ScriptRootPath" -Severity 'DEBUG' Write-CustomLog -Message "Successfully loaded configuration for environment: $NutanixEnvironment" -Severity 'DEBUG' Remove-SpoolStaleFiles -Config $config -MaxFileCount $script:SPOOL_MAX_FILE_COUNT $state = Read-State -Config $config if (Test-StateHasPendingData -State $state) { try { $payload = Read-SpoolData -Config $config -State $state if ($null -eq $payload -or $payload.Count -eq 0) { Write-CustomLog -Message "State indicates pending data, but no spool payloads were found. Continuing to query fresh data." -Severity 'WARNING' } else { Write-CustomLog -Message "Successfully read pending payload: $payload" -Severity 'DEBUG' Send-HypervisorEvents -State $state -Config $config -Payload $payload ` -Timestamp (ConvertFrom-RfcUtcTimestamp -Value $state.watermarks.last_received_utc) } } catch { Write-CustomLog -Message "Non-fatal error while sending pending spooled data. Continuing to query fresh data. Details: $($_.Exception.Message)" -Severity 'ERROR' -NoCache } } $collection = Invoke-NutanixPrismCentralCollection -Config $config -State $state $summary = $collection.Summary Write-CustomLog -Message "Prism Central collection completed. Hosts=$($summary.Hosts) VMs=$($summary.Vms) Duration=$($summary.DurationSeconds)s" -Severity 'INFO' try { Send-VirtualMachines -Config $config -Payload $collection.Payload | Out-Null } catch { Write-CustomLog -Message "Virtual machines step failed. Details: $($_.Exception.Message)" -Severity 'ERROR' } try { $timestamp = if ($null -ne $collection.Range -and $null -ne $collection.Range.End) { $collection.Range.End } else { [DateTime]::UtcNow } Send-HypervisorEvents -State $state -Config $config -Payload @($collection.Payload) -Timestamp $timestamp } catch { Write-CustomLog -Message "Non-fatal error while sending current payload. Data was still collected/spooled. Details: $($_.Exception.Message)" -Severity 'ERROR' -NoCache } } catch { $exitCode = 1 Write-CustomLog -Message "Error in Nutanix Connector: $_" -Severity 'ERROR' } finally { if ($null -ne $config -and $null -ne $config.NexthinkAPI) { try { Send-Logs -NutanixEnvironment $NutanixEnvironment ` -Version $version ` -LogsApiHost $config.NexthinkAPI.HostFQDN ` -LoginHost $config.NexthinkAPI.LoginFQDN ` -NexthinkTarget $config.NexthinkAPI.WindowsCredentialEntry } catch { Write-CustomLog -Message "Failed to send logs to API: $($_.Exception.Message)" -Severity 'ERROR' -NoCache } } Wait-LoggingFlush } return $exitCode } |