[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 } } $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 }