79 lines
3.0 KiB
PowerShell
79 lines
3.0 KiB
PowerShell
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory = $true)]
|
|
[string]$ConfigurationTemplate
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
$serviceName = "telegraf"
|
|
$installRoot = "C:\Program Files\NDC\Mission Core\Telegraf"
|
|
$configurationRoot = "C:\ProgramData\NDC\MissionCore\telemetry-agent"
|
|
$configurationPath = Join-Path $configurationRoot "telegraf.conf"
|
|
$executable = Join-Path $installRoot "telegraf.exe"
|
|
$serviceRegistryPath = "HKLM:\SYSTEM\CurrentControlSet\Services\$serviceName"
|
|
|
|
$service = Get-Service -Name $serviceName -ErrorAction Stop
|
|
if (-not (Test-Path -LiteralPath $executable -PathType Leaf)) {
|
|
throw "NDC Mission Core Telegraf executable is missing"
|
|
}
|
|
if (-not (Test-Path -LiteralPath $ConfigurationTemplate -PathType Leaf)) {
|
|
throw "Configuration template not found: $ConfigurationTemplate"
|
|
}
|
|
|
|
foreach ($entry in @((Get-ItemProperty -Path $serviceRegistryPath).Environment)) {
|
|
$name, $value = $entry -split "=", 2
|
|
if ($name -and $value) {
|
|
Set-Item -Path "Env:$name" -Value $value
|
|
}
|
|
}
|
|
if (-not $env:MISSIONCORE_TELEMETRY_INTERVAL) {
|
|
$env:MISSIONCORE_TELEMETRY_INTERVAL = "2s"
|
|
}
|
|
|
|
$temporaryRoot = Join-Path $env:TEMP "ndc-mission-core-telegraf-update-$([Guid]::NewGuid().ToString('N'))"
|
|
$validationOutput = Join-Path $temporaryRoot "validation.out.log"
|
|
$validationError = Join-Path $temporaryRoot "validation.error.log"
|
|
$backupRoot = Join-Path $configurationRoot "backups"
|
|
$backupPath = Join-Path $backupRoot "telegraf-$([DateTime]::UtcNow.ToString('yyyyMMddTHHmmssZ')).conf"
|
|
try {
|
|
New-Item -ItemType Directory -Path $temporaryRoot, $backupRoot -Force | Out-Null
|
|
$validation = Start-Process -FilePath $executable `
|
|
-ArgumentList @("--config", $ConfigurationTemplate, "--test") `
|
|
-NoNewWindow -Wait -PassThru `
|
|
-RedirectStandardOutput $validationOutput `
|
|
-RedirectStandardError $validationError
|
|
if ($validation.ExitCode -ne 0) {
|
|
$validationDetail = Get-Content -LiteralPath $validationError -Tail 8 |
|
|
Out-String
|
|
throw "Telegraf configuration validation failed: $validationDetail"
|
|
}
|
|
|
|
Copy-Item -LiteralPath $configurationPath -Destination $backupPath
|
|
Stop-Service -Name $serviceName
|
|
try {
|
|
Copy-Item -LiteralPath $ConfigurationTemplate -Destination $configurationPath
|
|
Start-Service -Name $serviceName
|
|
$service = Get-Service -Name $serviceName
|
|
$service.WaitForStatus(
|
|
[ServiceProcess.ServiceControllerStatus]::Running,
|
|
[TimeSpan]::FromSeconds(20)
|
|
)
|
|
}
|
|
catch {
|
|
Copy-Item -LiteralPath $backupPath -Destination $configurationPath
|
|
Start-Service -Name $serviceName
|
|
throw
|
|
}
|
|
|
|
[ordered]@{
|
|
SchemaVersion = "missioncore.telemetry-agent-config-result/v1"
|
|
ServiceName = $serviceName
|
|
Status = (Get-Service -Name $serviceName).Status.ToString()
|
|
Configuration = $configurationPath
|
|
Backup = $backupPath
|
|
} | ConvertTo-Json -Compress
|
|
}
|
|
finally {
|
|
Remove-Item -LiteralPath $temporaryRoot -Recurse -Force -ErrorAction SilentlyContinue
|
|
}
|