functions/public/Get-KlippyLogFile.ps1
|
function Get-KlippyLogFile { <# .SYNOPSIS Gets log files from a Klipper printer. .DESCRIPTION Lists log files available from the printer including Klipper logs, Moonraker logs, and other service logs. Supports wildcard filtering. .PARAMETER Id The unique identifier of the printer. .PARAMETER PrinterName The friendly name of the printer. .PARAMETER InputObject A printer object from pipeline input. .PARAMETER Path Path filter or pattern. Supports wildcards. .EXAMPLE Get-KlippyLogFile Lists all log files on the default printer. .EXAMPLE Get-KlippyLogFile -PrinterName "voronv2" -Path "klippy*" Lists Klipper log files. .EXAMPLE Get-KlippyLogFile -Path "*.log" Lists all .log files. .OUTPUTS PSCustomObject[] with log file information. #> [CmdletBinding(DefaultParameterSetName = 'Default')] [OutputType([PSCustomObject[]])] param( [Parameter(Mandatory = $true, ParameterSetName = 'ById')] [ValidateNotNullOrEmpty()] [string]$Id, [Parameter(Mandatory = $true, ParameterSetName = 'ByName')] [ValidateNotNullOrEmpty()] [string]$PrinterName, [Parameter(Mandatory = $true, ParameterSetName = 'ByObject', ValueFromPipeline = $true)] [PSCustomObject]$InputObject, [Parameter(Position = 0)] [string]$Path ) process { # Resolve printer $resolveParams = @{} switch ($PSCmdlet.ParameterSetName) { 'ById' { $resolveParams['Id'] = $Id } 'ByName' { $resolveParams['PrinterName'] = $PrinterName } 'ByObject' { $resolveParams['InputObject'] = $InputObject } } $printer = Resolve-KlippyPrinterTarget @resolveParams try { Write-Verbose "[$($printer.PrinterName)] Fetching log file list..." # Get file listing from logs root $response = Invoke-KlippyHttpRequest -Printer $printer -Endpoint "server/files/list" -QueryParameters @{ root = "logs" } # Filter to files only $fileList = $response | Where-Object { -not $_.Dirname } # Apply path filter if specified if ($Path) { $fileList = $fileList | Filter-KlippyItemByWildcard -Pattern $Path } # Transform to output objects $results = foreach ($file in $fileList) { $fileName = Split-Path $file.Path -Leaf # Determine log type based on filename $logType = switch -Regex ($fileName) { '^klippy' { 'Klipper' } '^moonraker' { 'Moonraker' } '^crowsnest' { 'Crowsnest' } '^webcamd' { 'Webcam' } default { 'Other' } } [PSCustomObject]@{ PSTypeName = 'KlippyCLI.LogFile' PrinterId = $printer.Id PrinterName = $printer.PrinterName Path = $file.Path Name = $fileName LogType = $logType Size = $file.Size SizeKB = [Math]::Round($file.Size / 1KB, 2) SizeMB = [Math]::Round($file.Size / 1MB, 2) Modified = if ($file.Modified) { [DateTimeOffset]::FromUnixTimeSeconds([long]$file.Modified).LocalDateTime } else { $null } } } return $results } catch { Write-Error "[$($printer.PrinterName)] Failed to list log files: $_" } } } |