# Zabbix Windows Script Deployment

Dieses System ermöglicht es, auf Windows-Servern und Clients automatisch PowerShell-Skripte sowie Zabbix-Agent-Konfigurationsdateien aus einem zentralen HTTP-Repository herunterzuladen und aktuell zu halten. In Zabbix kann anschließend gesteuert werden, welche Server Skripte und Config-Dateien aktualisieren und wie oft dies passieren soll.

Alle Dateien werden aus folgendem Repository geladen: 

    http://zabbix-scripts.kabeljournal.de/zabbix-windows/

Es existieren zwei Kanäle: 

- `dev`
- `production`

Welcher Kanal genutzt wird, wird über lokale JSON-Konfigurationsdateien festgelegt.

---

## Funktionen

- Automatische Aktualisierung aller PowerShell-Skripte
- Automatische Verteilung von Zabbix-Agent-UserParameter-Konfigurationen
- Nutzung von **dev**- oder **prod**-Channel
- Sämtliche Verteilung erfolgt über Zabbix (UserParameter)
- Keine manuelle Skript- oder Config-Verteilung mehr
- Klare Trennung zwischen Skripten und Zabbix-Config-Dateien

---

## Repository-Struktur (Server) 

```
/zabbix-windows/
  dev/
    scripts.manifest
    configs.manifest
    scripts/
      <alle PowerShell-Skripte>
    configs/
      <alle .conf-Dateien für UserParameter>

  prod/
    scripts.manifest
    configs.manifest
    scripts/
    configs/
```

`*.manifest` Dateien listen exakt die Dateien auf, die heruntergeladen werden sollen.

---

## Lokale Struktur (Client / Windows-Server)

```
C:\ZabbixScripts\
  Config\
    Update-ZabbixWindowsScripts.ps1
    scripts-updater.config.json
    configs-updater.config.json

  Scripts\
    (vom Server heruntergeladene PowerShell-Dateien)

  AgentConfig\
    (vom Server heruntergeladene Zabbix-Konfigurationsdateien)
```

---

## 1. Updater-Konfigurationsdateien anlegen

### 1.1 Für Skripte

Pfad:

```
C:\ZabbixScripts\Config\scripts-updater.config.json
```

Inhalt:

```json
{
  "BaseUrl": "http://zabbix-scripts.kabeljournal.de/zabbix-windows",
  "Channel": "prod",
  "TargetDirectory": "C:\\\\ZabbixScripts\\\\Scripts",
  "ManifestFile": "scripts.manifest",
  "CleanExtraFiles": true,
  "Debug": false
}
```

### 1.2 Für Zabbix-Agent-Konfigurationen 

Pfad:

```
C:\ZabbixScripts\Config\configs-updater.config.json
```

Inhalt:

```json
{
  "BaseUrl": "http://zabbix-scripts.kabeljournal.de/zabbix-windows",
  "Channel": "prod",
  "TargetDirectory": "C:\\\\ZabbixScripts\\\\AgentConfig",
  "ManifestFile": "configs.manifest",
  "CleanExtraFiles": true,
  "Debug": false
}
```

---

## 2. Updater-Skript installieren

Pfad:

```
C:\ZabbixScripts\Config\Update-ZabbixWindowsScripts.ps1
```

Das Skript ist universell und lädt anhand der angegebenen `-ConfigPath` die passende Manifest-Datei.

---

## 3. Zabbix-Agent einmalig konfigurieren

Damit Zabbix externe Config-Dateien laden kann:

In der Datei:

```
C:\Program Files\Zabbix Agent 2\zabbix_agent2.conf
```

oder in einer beliebigen `.conf` unter:

```
C:\Program Files\Zabbix Agent 2\zabbix_agent2.d\
```

einfügen:

```ini
Include=C:\ZabbixScripts\AgentConfig\*.conf
```

Danach:

```
Restart-Service "Zabbix Agent 2"
```

### 3.1 UserParameter für das Skript- und Config-Update

Ein Beispiel:

`C:\ZabbixScripts\AgentConfig\script-updater.conf`:

```ini
UserParameter=custom.scripts.update,powershell -NoProfile -ExecutionPolicy Bypass -File "C:\ZabbixScripts\Config\Update-ZabbixWindowsScripts.ps1" -ConfigPath "C:\ZabbixScripts\Config\scripts-updater.config.json"

UserParameter=custom.configs.update,powershell -NoProfile -ExecutionPolicy Bypass -File "C:\ZabbixScripts\Config\Update-ZabbixWindowsScripts.ps1" -ConfigPath "C:\ZabbixScripts\Config\configs-updater.config.json"
```

Diese Datei wird **vom Server über configs.manifest verteilt**.

---

## 4. Template in Zabbix anlegen

Template: **Template Windows Script Updater**

### Items:

| Name                    | Key                     | Intervall |
|-------------------------|--------------------------|-----------|
| Update Windows Scripts  | custom.scripts.update    | 1h        |
| Update Zabbix Configs   | custom.configs.update    | 1h        |

Beide Items als **Text** definieren.

---

## 5. Template zu Hosts zuordnen

Alle Hosts, die Skripte und Configs automatisch aktualisieren sollen, erhalten dieses Template.

---

## 6. Testlauf

### Skript-Update testen:

```
zabbix_agent2.exe -t custom.scripts.update
```

### Config-Update testen:

```
zabbix_agent2.exe -t custom.configs.update
```

Erwartete Ausgabe:

```
OK: Channel 'prod' aktualisiert ...
```

---

## Fertig!

Damit ist die automatische Verteilung von Skripten und Configs vollständig implementiert.


# Automatisches Deployment für den Branch `production`

Das Deployment erfolgt automatisch über einen Webhook, der beim
Push/Merge auf den Branch `production` ausgelöst wird. Der Server führt
dabei ein `git pull` im Production-Verzeichnis aus.

## 1. Voraussetzungen

-   Webserver-User: `www-data`

-   Repository-SSH-URL:

        git@46.227.222.6:alexander/zabbix-windows-scripts.git

-   Arbeitsverzeichnisse:

        /var/www/scripts/zabbix-windows/dev
        /var/www/scripts/zabbix-windows/production

## 2. SSH-Key für den Webserver-User einrichten

``` bash
sudo -u www-data -s
ssh-keygen -t ed25519 -C "www-data@server"
cat ~/.ssh/id_ed25519.pub
```

Diesen Public Key im Git-Server als Deploy Key eintragen.

## 3. Repositories klonen

### Dev

``` bash
sudo -u www-data -s
cd /var/www/scripts/zabbix-windows
git clone git@46.227.222.6:alexander/zabbix-windows-scripts.git dev
```

### Production

``` bash
sudo -u www-data -s
cd /var/www/scripts/zabbix-windows
git clone git@46.227.222.6:alexander/zabbix-windows-scripts.git production
```

Falls bereits vorhanden und HTTP-URL gesetzt ist:

``` bash
cd /var/www/scripts/zabbix-windows/production
git remote set-url origin git@46.227.222.6:alexander/zabbix-windows-scripts.git
```

## 4. Webhook-Skript

``` php
<?php
$expectedToken = 'SECRET';

if (!isset($_GET['token']) || $_GET['token'] !== $expectedToken) {
    http_response_code(403);
    echo "Forbidden";
    exit;
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo "Method not allowed";
    exit;
}

$repoDir = '/var/www/scripts/zabbix-windows/production';

chdir($repoDir);
exec('git pull 2>&1', $output, $returnVar);

if ($returnVar !== 0) {
    http_response_code(500);
    echo "git pull failed\n";
    echo implode("\n", $output);
    exit;
}

echo "OK\n";
```

## 5. Webhook im Git-Server einrichten

-   URL:

        https://<server>/webhook.php?token=SECRET

-   Methode: `POST`

-   Event: Push/Merge auf `production`

## 6. Funktionstest

``` bash
sudo -u www-data -s
cd /var/www/scripts/zabbix-windows/production
git pull
```

Webhook testen:

``` bash
curl -X POST "https://<server>/webhook.php?token=SECRET"
```

Erwartete Ausgabe:

    OK

