Rechenzentrum.ps1

<#
 .Synopsis
 Definiert das ganze Rechenzentrum
 #>


using namespace System.Collections.Generic
using namespace System.Diagnostics
using namespace System.Timers

Set-StrictMode -Version Latest

Import-LocalizedData -BindingVariable MsgTable -FileName PSRechenzentrumMessages.psd1

# Definiert das gesamte Rechenzentrum mit einer Serverliste
class Rechenzentrum
{
    [List[Server]]$Serverliste
    [Bool]$InitMode = $false
    [String]$Desciption
    [String]$MsgTable
    [Timer]$RZTimer
    [ScriptBlock]$SBTimerUpdate

    # Der Konstruktor - es wird lediglich eine Beschreibung �bergeben
    Rechenzentrum([String]$Description)
    {
        $this.Desciption = $Description
        $this.RZInit()
    }

    [void]RZInit()
    {
        $this.Serverliste = [List[Server]]::New()
        $this.RZTimer = [Timer]::New()
        # Alle 5 Sekunden wird das Kundenkonto aktualisiert
        $this.RZTimer.Interval = 5000
        # Wird pro Timer-Tick einmal ausgef�hrt
        # Ganz wichtig: Der Scriptblock kann nicht auf die Instanz der
        # Klasse zugreifen - $this wird daher ignoriert - einzige Option
        # ist die Uebergabe von $this ueber den MessageData-Parameter
        $this.SBTimerUpdate = {
            $RZ = $event.MessageData
            # Aktualisieren des Kontostandes fuer jeden laufenden Server
            $RZ.Serverliste.Where{$_.Status -eq "Running"}.ForEach{
                # Trickreich: Innerhalb des switch-Statements steht $_
                # f�r die Enum Serversize und nicht fuer das Server-Objekt
                # Write-Host -Fore Cyan ($_.GetType().Name)
                $Server = $_
                switch($_.Size)
                {
                    "Small" {$Server.Konto.Kontostand += 1}
                    "Medium" {$Server.Konto.Kontostand += 3}
                    "Big" { $Server.Konto.Kontostand += 10 }
                }
                # Auch die Laufzeit aktualisieren
                $_.RunningTime += ([DateTime]::Now - $_.StartZeit).TotalSeconds
            }
        }

        # $Timer.Add_Elapsed($SBTimerUpdate)
        # Event-Handler-Registrierung in jedem Fall entfernen
        Unregister-Event -SourceIdentifier KontoTimer -Force -ErrorAction Ignore
        # Und jetzt den Event-Handler registrieren
        Register-ObjectEvent -InputObject $this.RZTimer -EventName Elapsed `
         -Action $this.SBTimerUpdate -SourceIdentifier KontoTimer -MessageData $this

        # Timer starten
        $this.RZTimer.Start()
        
        # Setzt Admin-Berechtigungen voraus
        if (![EventLog]::SourceExists("PSRechenzentrum"))
        {
            [EventLog]::CreateEventSource("PSRechenzentrum", "Application")
        }
        [EventLog]::WriteEntry("PSRechenzentrum", $Script:MsgTable.RechenzentrumInitialized, "Information");
        $this.InitMode = $true
    }

    [void]AddServer([Server]$RZServer)
    {
        $this.Serverliste.Add($RZServer)
    }

    [void]RemoveServer([Server]$RZServer)
    {
        try {
            $this.ServerListe.Remove($RZServer)
        }
        catch {
            # Spielt keine Rolle
        }
    }

}