private/support.ps1

# add helper functions here

function Get-AptPkgInventory {
    <#
    .SYNOPSIS
        Get a list of installed APT packages
    .DESCRIPTION
        Get a list of installed APT packages
    .PARAMETER (none)
        No parameters
    .EXAMPLE
        Get-AptPkgInventory
    .LINK
        https://github.com/Skatterbrainz/linuxtools/blob/master/docs/Get-AptPkgInventory.md
    #>

    [CmdletBinding()]
    param()
    try {
        write-host "Updating apt cache..."
        sudo apt update
        $apps = sudo apt list
        $apps | ForEach-Object {
            $tpkg = $null
            $tpkg = $_.Split("[")
            $pkg  = $tpkg[0].Split(" ")
            $stat = $tpkg[1]
            if (![string]::IsNullOrEmpty($stat)) {
                $stat   = $stat.TrimEnd("]")
                $latest = $stat.Replace("upgradable from: ", "")
            }
            [pscustomobject]@{
                Name            = $pkg[0]
                Current         = $pkg[1]
                Rev             = $pkg[2]
                Available       = $latest
            }
        }
    } catch {
        Write-Error $($_.Exception.Message -join(";"))
    }
}
function Get-FlatpakInventory {
    <#
    .SYNOPSIS
        Collects inventory of installed flatpak packages.
    .DESCRIPTION
        Collects inventory of installed flatpak packages.
    .PARAMETER (none)
        No parameters
    .EXAMPLE
        Get-FlatpakInventory
    .LINK
        https://github.com/Skatterbrainz/linuxtools/blob/master/docs/Get-FlatpakInventory.md
    #>

    param()
    try {
        $flatpaks = flatpak list --columns=name,version,application,description,installation,size
        $flatpaks | ForEach-Object {
            $pkg = $_.Split("`t") | Where-Object {![string]::IsNullOrEmpty($_)}
            [pscustomobject]@{
                Name            = $pkg[0]
                Version         = $pkg[1]
                AppId           = $pkg[2]
                Description     = $pkg[3]
                InstallLocation = $pkg[4]
                Size            = $pkg[5]
            }
        }
    } catch {
        Write-Error $($_.Exception.Message -join(";"))
    }
}

function Get-SnapInventory {
    <#
    .SYNOPSIS
        Collects inventory of installed snap packages.
    .DESCRIPTION
        Collects inventory of installed snap packages.
    .PARAMETER (none)
        No parameters
    .LINK
        https://github.com/Skatterbrainz/linuxtools/blob/master/docs/Get-SnapInventory.md
    #>

    param()
    try {
        write-host "Listing snaps..."
        $snaps = snap list --all
        $snaps | ForEach-Object {
            $pkg = $_.Split(" ") | Where-Object {![string]::IsNullOrEmpty($_)}
            [pscustomobject]@{
                Name            = $pkg[0]
                Version         = $pkg[1]
                Rev             = $pkg[2]
                Tracking        = $pkg[3]
                Publisher       = $pkg[4]
                Notes           = $pkg[5]
            }
        }
    } catch {
        Write-Error $($_.Exception.Message -join(";"))
    }
}

function Update-AptPackages {
    <#
    .SYNOPSIS
        Update and upgrade APT packages
    .DESCRIPTION
        Update and upgrade APT packages
    .PARAMETER (none)
        No parameters
    .EXAMPLE
        Update-AptPackages
    .LINK
        https://github.com/Skatterbrainz/linuxtools/blob/master/docs/Update-AptPackages.md
    #>

    param()
    try {
        write-host "Updating apt cache..."
        sudo apt update
        write-host "Upgrading packages..."
        sudo apt upgrade -y
    } catch {
        Write-Error $($_.Exception.Message -join(";"))
    }
}

function Update-SnapPackages {
    <#
    .SYNOPSIS
        Update snap packages
    .DESCRIPTION
        Update snap packages
    .PARAMETER (none)
        No parameters
    .EXAMPLE
        Update-SnapPackages
    .LINK
        https://github.com/Skatterbrainz/linuxtools/blob/master/docs/Update-SnapPackages.md
    #>

    param()
    try {
        write-host "Updating snap packages..."
        sudo snap refresh
    } catch {
        Write-Error $($_.Exception.Message -join(";"))
    }
}

function Update-FlatpakPackages {
    <#
    .SYNOPSIS
        Update and upgrade Flatpak packages
    .DESCRIPTION
        Update and upgrade Flatpak packages
    .PARAMETER (none)
        No parameters
    .EXAMPLE
        Update-FlatpakPackages
    .LINK
        https://github.com/Skatterbrainz/linuxtools/blob/master/docs/Update-FlatpakPackages.md
    #>

    param()
    try {
        write-host "Updating flatpak packages..."
        flatpak update -y
    } catch {
        Write-Error $($_.Exception.Message -join(";"))
    }
}

function Get-AptPkgUpgradable {
    <#
    .SYNOPSIS
        Collects inventory of upgradable apt packages.
    .DESCRIPTION
        Collects inventory of upgradable apt packages.
    .PARAMETER (none)
        No parameters
    .LINK
        https://github.com/Skatterbrainz/linuxtools/blob/master/docs/Get-AptPkgUpgradable.md
    #>

    param()
    try {
        write-host "Updating apt cache..."
        sudo apt update
        $apps = sudo apt list --upgradable
        $apps | ForEach-Object {
            $tpkg = $null
            $tpkg = $_.Split("[")
            $pkg  = $tpkg[0].Split(" ")
            $stat = $tpkg[1]
            if (![string]::IsNullOrEmpty($stat)) {
                $stat = $stat.TrimEnd("]")
                $latest = $stat.Replace("upgradable from: ", "")
            }
            [pscustomobject]@{
                Name            = $pkg[0]
                Current         = $pkg[1]
                Rev             = $pkg[2]
                Available       = $latest
            }
        }
    } catch {
        Write-Error $($_.Exception.Message -join(";"))
    }
}

function Get-GridSelect {
    <#
    .SYNOPSIS
        Display a grid view of the specified data set and return the selected item(s)
    .DESCRIPTION
        Display a grid view of the specified data set and return the selected item(s)
    .PARAMETER DataSet
        Specify the data set (array, arraylist, collection) to display in the grid view
    .PARAMETER Title
        Specify the title of the grid view window
    .PARAMETER OutputMode
        Specify the output mode: Single or Multiple. Default is Multiple
    .EXAMPLE
        Get-GridSelect -DataSet $users -Title "Select a User Account" -OutputMode Single
        Display a grid view of the specified data set and return the selected item
    .EXAMPLE
        Get-GridSelect -DataSet $users -Title "Select User Accounts"
        Display a grid view of the specified data set and return the selected item(s)
    #>

    param (
        [parameter(Mandatory=$True)]$DataSet,
        [parameter(Mandatory=$True)][string]$Title,
        [parameter(Mandatory=$False)][string][ValidateSet('Single','Multiple')]$OutputMode = 'Multiple'
    )
    if (Get-Module Microsoft.PowerShell.ConsoleGuiTools -ListAvailable) {
        @($DataSet | Out-ConsoleGridView -Title $Title -OutputMode $OutputMode)
    } else {
        Write-Warning "Linux platforms require module: microsoft.powershell.consoleguitools"
    }
}

function IsCinnamonInstalled {
    <#
    .SYNOPSIS
        Determine if Cinnamon desktop is installed
    .DESCRIPTION
        Determine if Cinnamon desktop is installed
    #>

    param()
    $desktop = Get-ChildItem -Path "/usr/share/xsessions" -Filter "cinnamon.desktop" -ErrorAction SilentlyContinue
    if ($desktop) {
        Write-Output $true
        $global:IsCinnamon = $true
    } else {
        Write-Output $false
        $global:IsCinnamon = $false
    }
}

function Get-CinnamonVersion {
    <#
    .SYNOPSIS
        Get the version of the installed Cinnamon desktop
    .DESCRIPTION
        Get the version of the installed Cinnamon desktop
    #>

    param()
    if ($IsCinnamon) {
        try {$cver = Invoke-Command -ScriptBlock { cinnamon --version }} catch {}
        $cver
    } else {
        Write-Warning "Cinnamon desktop is not installed"
    }
}