Add src/handlers.printers.ps1
This commit is contained in:
150
src/handlers.printers.ps1
Normal file
150
src/handlers.printers.ps1
Normal file
@@ -0,0 +1,150 @@
|
||||
function Invoke-GetPrinters {
|
||||
param($Context)
|
||||
|
||||
try {
|
||||
if ($Context.Request.HttpMethod -ne 'POST') {
|
||||
$Context.Response.StatusCode = 405
|
||||
Send-Text $Context 'Use POST'
|
||||
return
|
||||
}
|
||||
|
||||
if (-not (Get-Command Get-SvsPrinterProfilesFromServer -ErrorAction SilentlyContinue)) {
|
||||
|
||||
Write-LogHybrid "SVSMSP cmdlets missing. Attempting Install-SVSMSP -InstallToolkit..." Warning Printers -LogToEvent
|
||||
|
||||
try {
|
||||
Install-SVSMSP -InstallToolkit
|
||||
Import-Module SVSMSP -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
catch {
|
||||
Write-LogHybrid "Auto-install of SVSMSP failed: $($_.Exception.Message)" Error Printers -LogToEvent
|
||||
$Context.Response.StatusCode = 500
|
||||
Send-Text $Context "SVSMSP auto-install failed. Run 'Install SVSMSP Module' manually."
|
||||
return
|
||||
}
|
||||
|
||||
if (-not (Get-Command Get-SvsPrinterProfilesFromServer -ErrorAction SilentlyContinue)) {
|
||||
Write-LogHybrid "SVSMSP installed but printer cmdlets still unavailable." Error Printers -LogToEvent
|
||||
$Context.Response.StatusCode = 500
|
||||
Send-Text $Context "SVSMSP installed but printer commands still not available. Restart SAMY."
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
$rawBody = (New-Object IO.StreamReader $Context.Request.InputStream).ReadToEnd()
|
||||
if (-not $rawBody) {
|
||||
$Context.Response.StatusCode = 400
|
||||
Send-Text $Context 'Missing request body.'
|
||||
return
|
||||
}
|
||||
|
||||
try { $body = $rawBody | ConvertFrom-Json }
|
||||
catch {
|
||||
$Context.Response.StatusCode = 400
|
||||
Send-Text $Context 'Invalid JSON body.'
|
||||
return
|
||||
}
|
||||
|
||||
$password = [string]$body.password
|
||||
if ($password -eq '') {
|
||||
Write-LogHybrid "Printer password is blank; relying on allowlisted IP (server-side)." Info Printers -LogToEvent
|
||||
}
|
||||
|
||||
$uri = 'https://bananas.svstools.ca/getprinters'
|
||||
Write-LogHybrid "Fetching printers from $uri" Info Printers -LogToEvent
|
||||
|
||||
$printers = Get-SvsPrinterProfilesFromServer -Uri $uri -Password $password
|
||||
if ($null -eq $printers) { $printers = @() }
|
||||
|
||||
try { Set-SvsPrinterLocalConfig -PrinterProfiles $printers -SkipIfEmpty }
|
||||
catch { Write-LogHybrid "Set-SvsPrinterLocalConfig failed: $($_.Exception.Message)" Warning Printers -LogToEvent }
|
||||
|
||||
Send-JSON $Context $printers
|
||||
}
|
||||
catch {
|
||||
Write-LogHybrid "Invoke-GetPrinters error: $($_.Exception.Message)" Error Printers -LogToEvent
|
||||
$Context.Response.StatusCode = 500
|
||||
Send-Text $Context "Internal server error fetching printers."
|
||||
}
|
||||
}
|
||||
|
||||
function Invoke-InstallPrinters {
|
||||
param($Context)
|
||||
|
||||
try {
|
||||
if ($Context.Request.HttpMethod -ne 'POST') {
|
||||
$Context.Response.StatusCode = 405
|
||||
Send-Text $Context 'Use POST'
|
||||
return
|
||||
}
|
||||
|
||||
$rawBody = (New-Object IO.StreamReader $Context.Request.InputStream).ReadToEnd()
|
||||
if (-not $rawBody) {
|
||||
$Context.Response.StatusCode = 400
|
||||
Send-Text $Context 'Missing request body.'
|
||||
return
|
||||
}
|
||||
|
||||
try { $body = $rawBody | ConvertFrom-Json }
|
||||
catch {
|
||||
$Context.Response.StatusCode = 400
|
||||
Send-Text $Context 'Invalid JSON body.'
|
||||
return
|
||||
}
|
||||
|
||||
$printers = $body.printers
|
||||
if (-not $printers -or $printers.Count -eq 0) {
|
||||
$Context.Response.StatusCode = 400
|
||||
Send-Text $Context 'No printers specified.'
|
||||
return
|
||||
}
|
||||
|
||||
Write-LogHybrid "Received request to install $($printers.Count) printers." Info Printers -LogToEvent
|
||||
|
||||
$successCount = 0
|
||||
$failures = @()
|
||||
|
||||
foreach ($p in $printers) {
|
||||
$clientCode = $p.ClientCode
|
||||
$profileName = $p.ProfileName
|
||||
$setDefault = [bool]($p.PSObject.Properties.Name -contains 'SetAsDefault' -and $p.SetAsDefault)
|
||||
|
||||
if (-not $clientCode -or -not $profileName) {
|
||||
$msg = "Skipping printer entry: ClientCode or ProfileName missing."
|
||||
Write-LogHybrid $msg Warning Printers -LogToEvent
|
||||
$failures += $msg
|
||||
continue
|
||||
}
|
||||
|
||||
$summary = "ClientCode=$clientCode ProfileName=$profileName SetAsDefault=$setDefault"
|
||||
Write-LogHybrid "Installing printer ($summary)" Info Printers -LogToEvent
|
||||
|
||||
try {
|
||||
Invoke-SVSPrinterInstall `
|
||||
-ClientCode $clientCode `
|
||||
-ProfileName $profileName `
|
||||
-SetAsDefault:$setDefault
|
||||
|
||||
$successCount++
|
||||
Write-LogHybrid "Printer installed successfully ($summary)" Success Printers -LogToEvent
|
||||
}
|
||||
catch {
|
||||
$errMsg = "Failed to install printer ($summary): $($_.Exception.Message)"
|
||||
Write-LogHybrid $errMsg Error Printers -LogToEvent
|
||||
$failures += $errMsg
|
||||
}
|
||||
}
|
||||
|
||||
Send-JSON $Context @{
|
||||
SuccessCount = $successCount
|
||||
FailureCount = $failures.Count
|
||||
Failures = $failures
|
||||
Message = "Printer install processed. Check SAMY logs for detail."
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-LogHybrid "Invoke-InstallPrinters error: $($_.Exception.Message)" Error Printers -LogToEvent
|
||||
$Context.Response.StatusCode = 500
|
||||
Send-Text $Context "Internal server error installing printers."
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user