########################################################################### # Copyright (C) 2016-2018 Flexera Software ########################################################################### $ScriptPath = Split-Path (Get-Variable MyInvocation -Scope 0).Value.MyCommand.Path ########################################################################### # function GenerateMGSBIXML([string]$source, [string]$sourceSpreadsheet, [string]$importLogFile, [string]$dest) { Log "Generating '$dest' from template '$source'" try { Get-Content $source | %{ $_ -replace "{LogFile}", $importLogFile } | %{ $_ -replace "{SourceSpreadsheet}", $sourceSpreadsheet } | Out-File $dest -Encoding UTF8 } catch { Log "Error generating file: $_" -level "Error" return $false } return $true } ########################################################################### # function ExecuteMGSBI([string[]] $arguments) { $id = GetFNMSInstallDir if (!$id) { Log "Could not identify FlexNet Manager Suite installation directory" -level Error return $false } $mgsbi = Join-Path $id "DotNet\bin\MGSBI.exe" $ok = ExecuteProcess $mgsbi $arguments if (!$ok) { Log "MGSBI.exe failed" -level Error return $false } return $true } ########################################################################### function StoreMGSBILogInDB($logFile, $sessionUID, $tenantUID = '0000000000000000') { if (!(Test-Path $logFile.Replace("[", "``[").Replace("]", "``]"))) { Log "WARNING: Log file not found: $logFile" -level Warning return # No log file created: do nothing } Log "Storing log file in database: $logFile" if (!(EnsureSqlModuleLoaded)) { return $false } [System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression") | Out-Null [System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem") | Out-Null $zip = [System.IO.Path]::GetTempFileName() try { $fs = New-Object System.IO.FileStream($zip, "Create") try { $archive = New-Object System.IO.Compression.ZipArchive($fs, "Create") $entry = [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($archive, $logFile, (Split-Path $logFile -Leaf)) } finally { if ($archive) { $archive.Dispose() } $fs.Dispose() } $fileContent = (Get-Content $zip -Encoding Byte | %{ [string]::Format("{0:x2}", $_) }) -Join "" $dbServer = GetConfigValue "FNMSDBServer" $dbName = GetConfigValue "FNMSComplianceDBName" Invoke-Sqlcmd -ServerInstance $dbServer -Database $dbName ` -Query " EXEC dbo.SetTenantUID '`$(TenantUID)' INSERT INTO dbo.LogFile(SessionUID, TaskStepID, FileContent, FileExtension) SELECT st.SessionUID, ts.TaskStepID, 0x`$(FileContent), '.zip' FROM dbo.TaskExecutionStatus st, dbo.TaskStep ts WHERE st.SessionUID = '`$(SessionUID)' AND ts.TaskStepResourceName = 'TaskStep.Business.ImportData' " ` -Variable ("TenantUID=$tenantUID", "SessionUID=$sessionUID", "FileContent=$fileContent") } finally { Remove-Item $zip -Force } } ########################################################################### # function RunImport { $source = Join-Path $ScriptPath "ServiceNowAssets.template.xml" $dest = Join-Path $env:TEMP "ServiceNowAssets.xml" $logDir = GetConfigValue "LogDir" $dataDir = GetConfigValue "ServiceNowAssetsSourceDirectory" Log "Importing files from $dataDir" $failDir = Join-Path $dataDir "Failed" $successDir = Join-Path $dataDir "Succeeded" # Check directories exist (create them if they don't) if (!(ValidateDirExists $failDir) -or !(ValidateDirExists $successDir)) { return $false } $allOk = $true Get-ChildItem $dataDir -File | %{ Log "Importing source data file: $($_.FullName)" Log "" $importDate = Get-Date $importLogFile = "{0}\ServiceNowAssets_{1:yyyyMMdd_HHmmss}.log" -f $logDir, $importDate if (!(GenerateMGSBIXML $source $_.FullName $importLogFile $dest)) { return $false } Log "" $sessionUID = [GUID]::NewGuid() $args = ("/Import=ServiceNowAssets", "/ConfigFile=`"$dest`"", "/SessionUID=$sessionUID") $ok = ExecuteMGSBI $args StoreMGSBILogInDB $importLogFile $sessionUID if (!$ok) { $allOk = $false $destDir = $failDir } else { $destDir = $successDir } $archiveName = Join-Path $destDir ("{0} ({1:yyyyMMdd_HHmmss}){2}" -f $_.BaseName, $importDate, $_.Extension) Log "Archiving source data file to: $archiveName" $_.MoveTo($archiveName) if (Test-Path $importLogFile) { Copy-Item $importLogFile "$($archiveName).log" } } Log "No more files found to import" return $allOk } ########################################################################### # Main script RunImport