The Veeam, MARS, WSB and VB365 collectors each carried identical copies of logging, ISO time conversion, property lookup, posting to the API, config loading, TLS setup, the sent-runs state file and the 401 check, and their installers repeated the same key prompt, locked-down config, file copy and scheduled-task registration. These now live in collectors/common/BackupDashboard.Collector.psm1: - Initialize-Collector / Test-RunSent / Send-JobReport / Test-AuthRejected / Complete-Collector for collector runs - Write-Log, Get-ErrorText, ConvertTo-IsoTime, Get-FirstValue - Install-CollectorTask for the shared half of each installer Collectors find the module next to themselves (installed) or in ..\common (repo); installers copy it into Program Files beside the collector. The diagnostic scripts stay standalone single files. No behavior change: a harness ran each collector against its mock (12 scenarios: dry run, two real runs against a stub API, state file, logs, exit codes, rejected key, en-GB, backfill) before and after, and all 84 outputs are identical. Installers, run with stand-ins for the Windows-only commands, write identical configs and tasks; the only differences are the module being copied and the summary line naming the shell's path. Co-Authored-By: Claude Opus 5.5 <[email protected]>
55 lines
2.6 KiB
PowerShell
55 lines
2.6 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Installs the Windows Server Backup collector as a SYSTEM scheduled task.
|
|
|
|
.DESCRIPTION
|
|
- Copies Send-WsbBackupStatus.ps1 to Program Files (only admins can modify it, which
|
|
matters because it runs as SYSTEM).
|
|
- Writes the config to ProgramData\BackupDashboard and restricts that folder to SYSTEM and
|
|
Administrators, since it contains the API key.
|
|
- Registers a scheduled task that runs every IntervalMinutes under Windows PowerShell 5.1
|
|
(powershell.exe), which the WindowsServerBackup module targets.
|
|
Safe to re-run to change settings or update the script. Can sit alongside the other collectors.
|
|
|
|
.EXAMPLE
|
|
.\Install-WsbCollector.ps1 -ApiUrl https://backups.example.com -Tenant "Acme Corp"
|
|
(prompts for the API key)
|
|
#>
|
|
#Requires -RunAsAdministrator
|
|
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory)][string]$ApiUrl,
|
|
[Parameter(Mandatory)][string]$Tenant,
|
|
# Name shown on the dashboard; defaults to "<server> - Windows Server Backup"
|
|
[string]$JobName,
|
|
[string]$SourceSystem = 'Windows Server Backup',
|
|
[ValidateRange(5, 1440)][int]$IntervalMinutes = 60,
|
|
[ValidateRange(1, 720)][int]$LookbackHours = 48,
|
|
[string]$InstallDir = (Join-Path $env:ProgramFiles 'BackupDashboard')
|
|
)
|
|
|
|
$ErrorActionPreference = 'Stop'
|
|
$WindowsPowerShell = Join-Path $env:SystemRoot 'System32\WindowsPowerShell\v1.0\powershell.exe'
|
|
|
|
# Check Windows Server Backup is here before changing anything
|
|
if (-not (Get-Module -ListAvailable -Name WindowsServerBackup)) {
|
|
throw 'The WindowsServerBackup PowerShell module is not available. Install the Windows Server Backup feature (Install-WindowsFeature Windows-Server-Backup).'
|
|
}
|
|
|
|
# Shared installer code: in the repo it's in ..\common, so copy the whole collectors folder
|
|
$sharedModule = @(
|
|
(Join-Path $PSScriptRoot 'BackupDashboard.Collector.psm1'),
|
|
(Join-Path (Join-Path (Join-Path $PSScriptRoot '..') 'common') 'BackupDashboard.Collector.psm1')
|
|
) | Where-Object { Test-Path $_ } | Select-Object -First 1
|
|
if (-not $sharedModule) {
|
|
throw "BackupDashboard.Collector.psm1 not found. Copy the whole collectors folder, including common."
|
|
}
|
|
Import-Module $sharedModule -Force
|
|
|
|
$settings = [ordered]@{ Tenant = $Tenant; SourceSystem = $SourceSystem; LookbackHours = $LookbackHours }
|
|
if ($JobName) { $settings.JobName = $JobName }
|
|
Install-CollectorTask -Name 'wsb' -ScriptPath (Join-Path $PSScriptRoot 'Send-WsbBackupStatus.ps1') `
|
|
-TaskName 'Backup Dashboard - WSB collector' `
|
|
-TaskDescription 'Sends Windows Server Backup results to the Backup Dashboard' `
|
|
-Shell $WindowsPowerShell -ApiUrl $ApiUrl -IntervalMinutes $IntervalMinutes -InstallDir $InstallDir -Settings $settings
|