cSABnzbd.psm1

enum Ensure
{
    Absent
    Present
}

[DscResource()]
class cSABnzbdInstall 
{
    [DscProperty(Key)]
    [string] $Ensure
    
    [DscProperty()]
    [PSCredential]$ServiceCredential
           
    # Gets the resource's current state.
    [cSABnzbdInstall] Get() 
    {
        # If SABnzbd is installed
        $Package = Get-Package -Name 'Sabnzbd' -ErrorAction SilentlyContinue
        if ($null -ne $Package) 
        {
            $this.Ensure = [Ensure]::Present
        }
        else 
        {
            $this.Ensure = [Ensure]::Absent
        }
        return $this
    }
    
    # Sets the desired state of the resource.
    [void] Set() 
    {
        if ($this.Ensure -eq [Ensure]::Present)
        {
            # Get Sabnzbd info from github
            $ReleaseInfo = $this.GetLatestVersion()
            $SetupAsset = $ReleaseInfo.assets.where{$_.name.contains('.exe')}
            $DownloadURI = $SetupAsset.browser_download_url
            
            # Download from Github
            $DownloadDestination = Join-Path -Path $ENV:temp -ChildPath 'SABnzbd-setup.exe'
            Invoke-WebRequest -Uri $DownloadURI -OutFile $DownloadDestination
            
            # Start install
            Start-Process -FilePath $DownloadDestination -ArgumentList '/S' -Wait
            
            # Make program data location
            $SABProgramData = Join-Path -Path $env:ProgramData -ChildPath 'sabnzbd'
            $null = mkdir -Path $SABProgramData
            
            # Service install paths (and ini)
            $SABIni = Join-Path -Path $SABProgramData -ChildPath 'sabnzbd.ini'
            $SABInstall = Join-Path -Path ${env:ProgramFiles(x86)} -ChildPath 'SABnzbd'
            $SABhelper = Join-Path -Path $SABInstall -ChildPath 'SABnzbd-helper.exe' 
            $SABService = Join-Path -Path $SABInstall -ChildPath 'SABnzbd-service.exe'
            
            # Install Services
            if ($null -eq $this.ServiceCredential)
            {
                & $SABhelper --startup auto install
                & $SABService --startup auto -f $SABIni install
            }
            else 
            {
                $Username = $this.ServiceCredential.UserName
                $Password = $this.ServiceCredential.GetNetworkCredential().Password
                & $SABhelper --startup auto --username $Username --password $Password install
                & $SABService --startup auto --username $Username --password $Password -f $SABIni install
            }
            
            # Start service
            Start-Service 'sabnzbd'
        }
        else
        {
            $SABInstall = Join-Path -Path ${env:ProgramFiles(x86)} -ChildPath 'SABnzbd'
            $SABUninstaller = Join-Path -Path $SABInstall -ChildPath 'uninstall.exe'
            Start-Process -FilePath $SABUninstaller -ArgumentList '/S' -Wait
        }
    }
    
    # Tests if the resource is in the desired state.
    [bool] Test() 
    {
        # If SABnzbd is installed, check we have the latest version installed
        $Package = Get-Package -Name 'Sabnzbd' -ErrorAction SilentlyContinue
        
        if ($this.Ensure -eq [Ensure]::Present)
        {
            if ($null -eq $Package)
            {
                return $false
            }
            else 
            {
                # Get Sabnzbd info from github
                $GitVersion = $this.GetLatestVersion().tag_name
                return ($Package.version -eq $GitVersion)    
            }
        }
        else 
        {
            # If it should be absent, check if null and return result
            return ($null -eq $Package) 
        }
    }
    
    [PSCustomObject] GetLatestVersion ()
    {
        $ReleaseInfo = Invoke-RestMethod -Uri 'https://api.github.com/repos/sabnzbd/sabnzbd/releases/latest' -UseBasicParsing
        return $ReleaseInfo
    }
}