poshbot.veeam.psm1

#region: Start Load VEEAM Snapin (if not already loaded)
Add-PSSnapin VeeamPSSnapIn
#endregion

$CommandsToExport = @()

function Get-VeeamRepositories {
        <#
        .SYNOPSIS
        Get Veeam Repositories
        .EXAMPLE
        !Get-VeeamRepositories
        .EXAMPLE
        !Get-VeeamRepositories --brhost <your BR Host>
        .EXAMPLE
        !Repos
        .EXAMPLE
        !VeeamRepositories
        #>


        [PoshBot.BotCommand(
                Aliases = ('Repos', 'VeeamRepositories'),
                Permissions = 'read'
        )]
        [cmdletbinding()]
        param(
                [Parameter(Position=0, Mandatory=$false)]
                [string] $BRHost = "localhost"
        )

        #region: Functions
        Function Get-vPCRepoInfo {
                [CmdletBinding()]
                param (
                        [Parameter(Position=0, ValueFromPipeline=$true)]
                        [PSObject[]]$Repository
                )
                Begin {
                        $outputAry = @()
                        Function New-RepoObject {param($name, $repohost, $path, $free, $total)
                        $repoObj = New-Object -TypeName PSObject -Property @{
                                        Target = $name
                                        RepoHost = $repohost
                                        Storepath = $path
                                        StorageFree = [Math]::Round([Decimal]$free/1GB,2)
                                        StorageTotal = [Math]::Round([Decimal]$total/1GB,2)
                                        FreePercentage = [Math]::Round(($free/$total)*100)
                                }
                                Return $repoObj | Select-Object Target, RepoHost, Storepath, StorageFree, StorageTotal, FreePercentage
                        }
                }
                Process {
                        Foreach ($r in $Repository) {
                                # Refresh Repository Size Info
                                try {
                                        [Veeam.Backup.Core.CBackupRepositoryEx]::SyncSpaceInfoToDb($r, $true)
                                }
                                catch {
                                        Write-Debug "SyncSpaceInfoToDb Failed"
                                }

                                If ($r.HostId -eq "00000000-0000-0000-0000-000000000000") {
                                        $HostName = ""
                                }
                                Else {
                                        $HostName = $($r.GetHost()).Name.ToLower()
                                }
                                $outputObj = New-RepoObject $r.Name $Hostname $r.Path $r.info.CachedFreeSpace $r.Info.CachedTotalSpace
                        }
                        $outputAry += $outputObj
                }
                End {
                        $outputAry
                }
        }
        #endregion

        #region: Start BRHost Connection
        Connect-VBRServer -Server $BRHost
        #endregion

        #region: Collect and filter Repos
        [Array]$repoList = Get-VBRBackupRepository | Where-Object {$_.Type -ne "SanSnapshotOnly"}
        [Array]$scaleouts = Get-VBRBackupRepository -scaleout
        if ($scaleouts) {
                foreach ($scaleout in $scaleouts) {
                        $extents = Get-VBRRepositoryExtent -Repository $scaleout
                        foreach ($ex in $extents) {
                                $repoList = $repoList + $ex.repository
                        }
                }
        }
        #endregion

        #region: Build Report
        $RepoReport = $repoList | Get-vPCRepoInfo | Select-Object       @{Name="Repository Name"; Expression = {$_.Target}},
                                                                        @{Name="Host"; Expression = {$_.RepoHost}},
                                                                        @{Name="Path"; Expression = {$_.Storepath}},
                                                                        @{Name="Free (GB)"; Expression = {$_.StorageFree}},
                                                                        @{Name="Total (GB)"; Expression = {$_.StorageTotal}},
                                                                        @{Name="Free (%)"; Expression = {$_.FreePercentage}}
        forEach ($Repo in $RepoReport) {

                $r = [pscustomobject]@{
                        Name = $($Repo.'Repository Name')
                        'Free (%)' = $($Repo.'Free (%)')
                        'Free (GB)' = $($Repo.'Free (GB)')
                        'Total (GB)' =  $($Repo.'Total (GB)')
                        'Host' =  $($Repo.'Host')
                        'Path' =  $($Repo.'Path')
                    }

                New-PoshBotCardResponse -Title "$($Repo.'Repository Name'):" -Text ($r | Format-List -Property * | Out-String)
        }
        #endregion
}
$CommandsToExport += 'Get-VeeamRepositories'

function Get-VeeamSessions {
                <#
        .SYNOPSIS
        Get Veeam Sessions
        .EXAMPLE
        !Get-VeeamSessions
        .EXAMPLE
        !Get-VeeamSessions --reportMode Monthly
        .EXAMPLE
        !Get-VeeamSessions --brhost <your BR Host>
        .EXAMPLE
        !Sessions
        .EXAMPLE
        !VeeamSessions
        #>


        [PoshBot.BotCommand(
                Aliases = ('Sessions', 'VeeamSessions'),
                Permissions = 'read'
        )]
        [cmdletbinding()]
        param(
                [Parameter(Position=0, Mandatory=$false)]
                        [string] $BRHost = "localhost",
                [Parameter(Position=1, Mandatory=$false)]
                        $reportMode = "24" # Weekly, Monthly as String or Hour as Integer

        )

        #region: Convert mode (timeframe) to hours
        If ($reportMode -eq "Monthly") {
                $HourstoCheck = 720
        } Elseif ($reportMode -eq "Weekly") {
                $HourstoCheck = 168
        } Else {
                $HourstoCheck = $reportMode
        }
        #endregion

        #region: Start BRHost Connection
        Connect-VBRServer -Server $BRHost
        #endregion

        #region: Collect Sessions
        $allSesh = Get-VBRBackupSession         # Get all Sessions (Backup/BackupCopy/Replica)
        $seshListBk = @($allSesh | Where-Object{($_.CreationTime -ge (Get-Date).AddHours(-$HourstoCheck)) -and $_.JobType -eq "Backup"})           # Gather all Backup sessions within timeframe
        $seshListBkc = @($allSesh | Where-Object{($_.CreationTime -ge (Get-Date).AddHours(-$HourstoCheck)) -and $_.JobType -eq "BackupSync"})      # Gather all BackupCopy sessions within timeframe
        $seshListRepl = @($allSesh | Where-Object{($_.CreationTime -ge (Get-Date).AddHours(-$HourstoCheck)) -and $_.JobType -eq "Replica"})        # Gather all Replication sessions within timeframe
        #endregion

        #region: Get Backup session informations
        $TotalBackupTransfer = 0
        $TotalBackupRead = 0
        $seshListBk | ForEach-Object{$TotalBackupTransfer += $([Math]::Round([Decimal]$_.Progress.TransferedSize/1GB, 0))}
        $seshListBk | ForEach-Object{$TotalBackupRead += $([Math]::Round([Decimal]$_.Progress.ReadSize/1GB, 0))}
        #endregion

        #region: Preparing Backup Session Reports
        $successSessionsBk = @($seshListBk | Where-Object{$_.Result -eq "Success"})
        $warningSessionsBk = @($seshListBk | Where-Object{$_.Result -eq "Warning"})
        $failsSessionsBk = @($seshListBk | Where-Object{$_.Result -eq "Failed"})
        $runningSessionsBk = @($allSesh | Where-Object{$_.State -eq "Working" -and $_.JobType -eq "Backup"})
        $failedSessionsBk = @($seshListBk | Where-Object{($_.Result -eq "Failed") -and ($_.WillBeRetried -ne "True")})
        #endregion

        #region: Preparing Backup Copy Session Reports
        $successSessionsBkC = @($seshListBkC | Where-Object{$_.Result -eq "Success"})
        $warningSessionsBkC = @($seshListBkC | Where-Object{$_.Result -eq "Warning"})
        $failsSessionsBkC = @($seshListBkC | Where-Object{$_.Result -eq "Failed"})
        $runningSessionsBkC = @($allSesh | Where-Object{$_.State -eq "Working" -and $_.JobType -eq "BackupSync"})
        $IdleSessionsBkC = @($allSesh | Where-Object{$_.State -eq "Idle" -and $_.JobType -eq "BackupSync"})
        $failedSessionsBkC = @($seshListBkC | Where-Object{($_.Result -eq "Failed") -and ($_.WillBeRetried -ne "True")})
        #endregion

        #region: Preparing Replicatiom Session Reports
        $successSessionsRepl = @($seshListRepl | Where-Object{$_.Result -eq "Success"})
        $warningSessionsRepl = @($seshListRepl | Where-Object{$_.Result -eq "Warning"})
        $failsSessionsRepl = @($seshListRepl | Where-Object{$_.Result -eq "Failed"})
        $runningSessionsRepl = @($allSesh | Where-Object{$_.State -eq "Working" -and $_.JobType -eq "Replica"})
        $failedSessionsRepl = @($seshListRepl | Where-Object{($_.Result -eq "Failed") -and ($_.WillBeRetried -ne "True")})
        #endregion

        #region: Build Report
        $SessionObject = [PSCustomObject] @{
                "Successful Backups"  = $successSessionsBk.Count
                "Warning Backups" = $warningSessionsBk.Count
                "Failes Backups" = $failsSessionsBk.Count
                "Failed Backups" = $failedSessionsBk.Count
                "Running Backups" = $runningSessionsBk.Count
                "Warning BackupCopys" = $warningSessionsBkC.Count
                "Failes BackupCopys" = $failsSessionsBkC.Count
                "Failed BackupCopys" = $failedSessionsBkC.Count
                "Running BackupCopys" = $runningSessionsBkC.Count
                "Idle BackupCopys" = $IdleSessionsBkC.Count
                "Successful Replications" = $successSessionsRepl.Count
                "Warning Replications" = $warningSessionsRepl.Count
                "Failes Replications" = $failsSessionsRepl.Count
                "Failed Replications" = $failedSessionsRepl.Count
                "Running Replications" = $RunningSessionsRepl.Count
                "Total Backup Transfer" = $TotalBackupTransfer
                "Total Backup Read" = $TotalBackupRead
        }
        $SessionResport += $SessionObject

        New-PoshBotCardResponse -Title "Session Stats for the last $HourstoCheck h:" -Text ($SessionResport | Format-List -Property * | Out-String)
        #endregion
}
$CommandsToExport += 'Get-VeeamSessions'

function Get-VeeamJobs {
        <#
        .SYNOPSIS
        Get Veeam Jobs
        .EXAMPLE
        !Get-VeeamJobs
        .EXAMPLE
        !Get-VeeamJobs --brhost <your BR Host>
        .EXAMPLE
        !Jobs
        .EXAMPLE
        !VeeamJobs
        #>


        [PoshBot.BotCommand(
                Aliases = ('Jobs', 'VeeamJobs'),
                Permissions = 'read'
        )]
        [cmdletbinding()]
        param(
                [Parameter(Position=0, Mandatory=$false)]
                [string] $BRHost = "localhost"
        )

        #region: Start BRHost Connection
        Connect-VBRServer -Server $BRHost
        #endregion

        #region: Collect Jobs
        [Array] $Jobs = Get-VBRJob
        #endregion

        #region: Build Report
        forEach ($Job in $Jobs) {

                $r = [pscustomobject]@{
                        Name = $($Job.'Name')
                        JobType = $($Job.'JobType')
                        IsRunning = $($Job.'IsRunning')
                        IsScheduleEnabled =  $($Job.'IsScheduleEnabled')
                        NextRun =  $($Job.'.ScheduleOptions.StartDateTimeLocal')
                    }

                New-PoshBotCardResponse -Title "$($Job.'Name'):" -Text ($r | Format-List -Property * | Out-String)
        }
        #endregion
}
$CommandsToExport += 'Get-VeeamJobs'

Export-ModuleMember -Function $CommandsToExport