# Citrix-Manager

VDA-Management mit Session-Migration und Rolling Updates für IKK Kliniken.

## Überblick

Der Citrix-Manager überwacht und verwaltet Citrix Virtual Desktop Agents (VDAs) über ein zentrales Web-Dashboard. Ein PowerShell-Agent auf dem Citrix Delivery Controller sammelt VDA-Status, Sessions und Performance-Daten und meldet sie an das Dashboard. Aktionen wie Drain, Reboot und Session-Migration können zentral ausgelöst werden.

**Produktion:** https://citrix-manager.c3po42.de  
**Port:** 8980  
**Demo-Login:** admin / admin (Operator: operator / op)

## Features

- **40+ VDA-Überwachung** — Status, CPU, RAM, Disk, Wartungsmodus, Image-Version
- **Session-Management** — Alle Sessions mit Benutzer, Client, Protokoll, Anwendungen, Idle-Zeit
- **Drain / Activate** — Wartungsmodus ein-/ausschalten (keine neuen Sessions)
- **Session-Migration** — Alle Sessions eines VDA trennen (Benutzer reconnecten automatisch)
- **Farm-Update (Rolling Update)** — Vollautomatisches Rolling Update als Background-Task: Drain → Sessions migrieren → Warten bis leer → Reboot mit Golden Image → Aktivieren. Batch-Verarbeitung, Pause/Resume, Live-Fortschritt (Auto-Refresh 5s)
- **Netzwerk-Discovery** — Server im Netzwerk finden per IP-Range oder Hostname-Scan (TCP 135/RPC, 3389/RDP, 1494/ICA). Parallel-Scan mit Semaphore (max 50 gleichzeitig, max 255 Hosts). Gefundene Server als VDAs importieren
- **Session-Migration** — Alle Sessions eines VDA auf andere VDAs umziehen. User reconnectet automatisch (5–15 Sek Unterbrechung), Citrix Broker weist neuen VDA zu
- **Reboot-Zeitfenster** — Definierbare Zeiten für erlaubte Reboots (z.B. Samstag 02:00–06:00)
- **Force Logoff** — Optionale erzwungene Abmeldung nach Drain-Timeout
- **Delivery Groups** — Gruppierung nach Verwendungszweck (Verwaltung, Klinik, Arzt, RemoteApp)
- **Multi-Standort** — Unterstützung mehrerer Klinik-Standorte (z.B. Ilmenau, Arnstadt)
- **SSE Live-Updates** — Echtzeit-Aktualisierung im Browser
- **Aktivitätsprotokoll** — Vollständiges Audit-Log aller Aktionen
- **Statistiken** — Sessions pro DG, Top-User, Image-Verteilung, Standort-Übersicht

## Architektur

```
Citrix Delivery Controller
  └── agent.ps1 (PowerShell, Scheduled Task alle 5 Min)
        ├── Citrix SDK: Get-BrokerMachine, Get-BrokerSession
        ├── WMI: CPU, RAM, Disk per Remote-Abfrage
        └── POST /api/agent/report → Dashboard

Dashboard (Web)
  └── main.py (FastAPI, Port 8980)
        ├── SQLite (citrix_manager.db, WAL)
        ├── JWT-Auth (ADMIN, OPERATOR, VIEWER)
        ├── SSE für Live-Updates
        └── REST-API für VDAs, Sessions, Rolling Updates
```

## Installation

### Dashboard (Windows)

```powershell
irm https://downloads.c3po42.de/citrix-manager/install.ps1 | iex
```

### Dashboard (Linux)

```bash
curl -fsSL https://downloads.c3po42.de/citrix-manager/install.sh | bash
```

### Agent (Citrix Delivery Controller)

1. `agent.ps1` auf den Delivery Controller kopieren
2. `$DashboardUrl` und `$AgentKey` in der Konfiguration anpassen
3. Als Scheduled Task registrieren:

```powershell
.\agent.ps1 -Install
```

Der Agent meldet ab sofort alle 5 Minuten VDAs und Sessions an das Dashboard.

## Agent-Befehle

```powershell
# Report senden (manuell)
.\agent.ps1

# Scheduled Task verwalten
.\agent.ps1 -Install      # Task registrieren (alle 5 Min + Systemstart)
.\agent.ps1 -Uninstall    # Task entfernen

# VDA-Aktionen
.\agent.ps1 -Drain CTX-VDA01           # Wartungsmodus aktivieren
.\agent.ps1 -Activate CTX-VDA01        # Wartungsmodus deaktivieren
.\agent.ps1 -Reboot CTX-VDA01          # VDA neustarten
.\agent.ps1 -MigrateSessions CTX-VDA01 # Alle Sessions trennen

# Session-Aktionen
.\agent.ps1 -Disconnect 1234   # Session trennen
.\agent.ps1 -Logoff 1234       # Session abmelden (Force)
```

## Citrix SDK Voraussetzungen

Der Agent benötigt das Citrix PowerShell SDK auf dem Delivery Controller:

- **Citrix.Broker.Commands** (Get-BrokerMachine, Get-BrokerSession, etc.)
- Wird mit dem Citrix Delivery Controller automatisch installiert
- Agent läuft als SYSTEM und benötigt Zugriff auf das Citrix SDK Snapin

Verwendete Cmdlets:
- `Get-BrokerMachine` — VDA-Status abrufen
- `Get-BrokerSession` — Sessions abrufen
- `Set-BrokerMachineMaintenanceMode` — Wartungsmodus setzen
- `Disconnect-BrokerSession` — Session trennen
- `Stop-BrokerSession` — Session abmelden
- `New-BrokerHostingPowerAction` — Reboot auslösen
- `Get-BrokerDesktopGroup` — Delivery Groups abrufen

## Farm-Update Workflow

Das Farm-Update ist ein vollautomatisches Rolling Update, das als Background-Task läuft. Pro VDA durchläuft der Worker folgende Schritte:

```
WARTEND → DRAIN → SESSIONS_LEER → REBOOT → FERTIG
```

1. **Planung:** VDAs auswählen, Batch-Größe (z.B. 5), Drain-Timeout und Zeitfenster festlegen
2. **Pro Batch (automatisch als Background-Task):**
   - Drain aktivieren (keine neuen Sessions)
   - Sessions migrieren (bestehende Sessions trennen, User reconnecten auf freiem VDA)
   - Warten bis Sessions leer oder Timeout erreicht
   - Optional: Force Logoff nach Timeout
   - Reboot mit Golden Image auslösen
   - Warten auf Neuregistrierung
   - Drain deaktivieren (VDA wieder aktiv)
3. **Nächster Batch** bis alle VDAs aktualisiert
4. **Pause/Resume** jederzeit möglich — der aktuelle Batch läuft fertig, kein neuer wird gestartet
5. **Live-Fortschritt** im Frontend mit Auto-Refresh alle 5 Sekunden

### VDA-Status während des Updates

| Status | Bedeutung |
|---|---|
| WARTEND | VDA wartet auf seinen Batch |
| DRAIN | Wartungsmodus aktiv, Sessions werden migriert |
| SESSIONS_LEER | Alle Sessions beendet, bereit für Reboot |
| REBOOT | VDA wird mit Golden Image neugestartet |
| FERTIG | Update abgeschlossen, VDA wieder aktiv |

## Netzwerk-Discovery

Server im Netzwerk finden und als VDAs importieren:

1. IP-Range oder Hostname-Muster angeben
2. Scanner prüft TCP-Ports: 135 (RPC), 3389 (RDP), 1494 (ICA)
3. Parallel-Scan mit Semaphore (max 50 gleichzeitig, max 255 Hosts)
4. Erkennung: RDP- und ICA-Ports offen → markiert als „vermutlich VDA"
5. Gefundene Server können direkt als VDAs importiert werden

## Session-Migration

Sessions von einem VDA auf andere umziehen:

1. Alle Sessions des Quell-VDA werden getrennt (Disconnect)
2. Citrix Broker weist automatisch einen neuen VDA zu
3. User reconnectet automatisch (5–15 Sekunden Unterbrechung)
4. Typischer Einsatz: Vor Reboot oder Wartung eines VDA

## API-Endpunkte

| Methode | Endpunkt | Beschreibung |
|---|---|---|
| POST | /api/auth/login | Anmeldung (JWT) |
| GET | /api/auth/me | Aktuelle Benutzerinfo |
| GET | /api/dashboard | Gesamtübersicht |
| GET | /api/vdas | VDA-Liste (Filter: DG, Standort, Wartung) |
| GET | /api/vdas/{id} | VDA-Details |
| GET | /api/vdas/{id}/sessions | Sessions eines VDA |
| POST | /api/vdas/{id}/drain | Wartungsmodus an |
| POST | /api/vdas/{id}/activate | Wartungsmodus aus |
| POST | /api/vdas/{id}/reboot | VDA neustarten |
| POST | /api/vdas/{id}/migrate-sessions | Alle Sessions migrieren |
| GET | /api/sessions | Session-Liste (Filter: VDA, Benutzer) |
| POST | /api/sessions/{id}/disconnect | Session trennen |
| POST | /api/sessions/{id}/logoff | Session abmelden |
| GET | /api/rolling-updates | Rolling Updates |
| POST | /api/rolling-updates | Neues Rolling Update erstellen |
| POST | /api/rolling-updates/{id}/start | Farm-Update Worker starten |
| POST | /api/rolling-updates/{id}/pause | Farm-Update pausieren |
| POST | /api/rolling-updates/{id}/resume | Farm-Update fortsetzen |
| POST | /api/discover | Netzwerk-Scan starten (IP-Range/Hostname) |
| POST | /api/discover/import | Gefundene Server als VDAs importieren |
| GET | /api/delivery-groups | Delivery Groups |
| GET | /api/zeitfenster | Reboot-Zeitfenster |
| POST | /api/zeitfenster | Zeitfenster erstellen |
| GET | /api/aktivitaeten | Aktivitätsprotokoll |
| GET | /api/statistik | Statistiken |
| GET | /api/health | Health-Check |
| POST | /api/agent/report | Agent-Report (VDAs + Sessions) |
| POST | /api/agent/action-result | Agent-Aktionsergebnis |
| GET | /api/events | SSE Live-Updates |

## Rollen

| Rolle | Rechte |
|---|---|
| ADMIN | Alles + Benutzerverwaltung + Zeitfenster |
| OPERATOR | VDA-Aktionen, Session-Aktionen, Rolling Updates |
| VIEWER | Nur Lesen (Dashboard, VDAs, Sessions, Statistiken) |

## Tech-Stack

- **Backend:** FastAPI + aiosqlite + python-jose + bcrypt
- **Frontend:** Vanilla JS + CSS (single-file, Dark Cyan Theme)
- **Agent:** PowerShell 5.1 + Citrix SDK + WMI
- **Datenbank:** SQLite (WAL-Modus)
- **Auth:** JWT (8h gültig)
- **Updates:** SSE (Server-Sent Events)

## Demo-Modus

Im Demo-Modus (Standard) werden automatisch angelegt:
- 2 Delivery Controller (Ilmenau, Arnstadt)
- 4 Delivery Groups (Verwaltung, Klinik, Arzt, RemoteApp)
- 40 VDAs mit realistischen Performance-Daten
- ~120 Sessions mit Benutzern und Anwendungen
- Reboot-Zeitfenster (Samstag/Sonntag Nacht)
- CPU/RAM-Werte schwanken alle 15 Sekunden

## Deploy

```bash
python deploy_vps.py        # Deploy auf VPS (Port 8980, citrix-manager.c3po42.de)
python deploy_downloads.py  # Download-Seite deployen
```
