#!/usr/bin/env bash # install.sh # Rocket.Chat Plugin für Hermes Agent — Interaktives Setup # Voraussetzungen: bash, curl, git, python3 # # Nutzung: # ./install.sh → Normale Installation # ./install.sh --dry-run → Simulation (zeigt alles an, ändert nichts) # ./install.sh --help → Diese Hilfe anzeigen set -euo pipefail # ── Hilfe ── if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then cat <<'EOF' Rocket.Chat Plugin — Interaktives Setup für Hermes Agent Nutzung: ./install.sh Interaktive Installation mit Verbindungstest ./install.sh --dry-run Vorschau: zeigt alle Schritte an, ändert NICHTS ./install.sh --help Diese Hilfe anzeigen Was install.sh macht: 1. Prüft Voraussetzungen (curl, git, python3) 2. Legt das Plugin-Verzeichnis an 3. Kopiert plugin.yaml, __init__.py, adapter.py 4. Fragt Rocket.Chat-Zugangsdaten interaktiv ab 5. Testet die Verbindung und liest UserID/RoomID aus 6. Schreibt die Konfiguration in ~/.hermes/.env 7. Bietet Neustart von Hermes Gateway an Deinstallation: ./uninstall.sh EOF exit 0 fi # ── Dry-Run Modus ── DRY_RUN=false if [[ "${1:-}" == "--dry-run" ]]; then DRY_RUN=true echo -e "\n🔍 DRY-RUN MODUS — Es wird NICHTS verändert. Nur Vorschau.\n" fi SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PLUGIN_NAME="rocketchat" HERMES_HOME="${HERMES_HOME:-$HOME/.hermes}" PLUGIN_DEST="$HERMES_HOME/hermes-agent/plugins/platforms/$PLUGIN_NAME" ECHO_OK() { echo -e " ✅ $1"; } ECHO_ERR() { echo -e " ❌ $1"; } ECHO_INFO() { echo -e " ℹ️ $1"; } ECHO_STEP() { echo -e "\n🔵 $1"; } ECHO_WARN() { echo -e " ⚠️ $1"; } ECHO_DRY() { echo -e " 📝 [DRY-RUN] $1"; } run_or_simulate() { local desc="$1" shift if $DRY_RUN; then ECHO_DRY "$desc" echo " → würde ausführen: $*" else "$@" fi } # ── Schritt 1: Prerequisites ── ECHO_STEP "1/7 Prüfe Voraussetzungen" MISSING="" for cmd in curl git python3; do if command -v "$cmd" &>/dev/null; then ECHO_OK "$cmd installiert" else ECHO_ERR "$cmd fehlt" MISSING="$MISSING $cmd" fi done if [[ -n "$MISSING" ]]; then ECHO_WARN "Folgende Pakete müssen nachinstalliert werden:" echo " sudo apt update && sudo apt install -y$MISSING" if ! $DRY_RUN; then read -rp " Pakete jetzt installieren? [j/N] " ans if [[ "$ans" =~ ^[Jj]$ ]]; then sudo apt update && sudo apt install -y $MISSING else echo "Abbruch. Bitte installiere:$MISSING" exit 1 fi else ECHO_DRY "würde fragen: Pakete jetzt installieren?" fi fi # ── Schritt 2: Zielverzeichnis anlegen ── ECHO_STEP "2/7 Erstelle Plugin-Verzeichnis" if [[ -d "$PLUGIN_DEST" ]]; then ECHO_WARN "Verzeichnis existiert bereits: $PLUGIN_DEST" if ! $DRY_RUN; then read -rp " Überschreiben? [j/N] " ans if [[ "$ans" =~ ^[Jj]$ ]]; then rm -rf "$PLUGIN_DEST" else echo "Abbruch." exit 1 fi else ECHO_DRY "würde fragen: Verzeichnis überschreiben?" fi fi run_or_simulate "Verzeichnis anlegen: $PLUGIN_DEST" mkdir -p "$PLUGIN_DEST" $DRY_RUN || ECHO_OK "Verzeichnis angelegt: $PLUGIN_DEST" # ── Schritt 3: Dateien kopieren ── ECHO_STEP "3/7 Kopiere Plugin-Dateien" for f in plugin.yaml __init__.py adapter.py; do if [[ -f "$SCRIPT_DIR/$f" ]]; then run_or_simulate "$f → $PLUGIN_DEST/$f" cp "$SCRIPT_DIR/$f" "$PLUGIN_DEST/" $DRY_RUN || ECHO_OK "$f kopiert" else ECHO_ERR "$f nicht im aktuellen Verzeichnis gefunden" exit 1 fi done # ── Schritt 4: Konfiguration erfragen ── ECHO_STEP "4/7 Konfiguration" if $DRY_RUN; then echo " [DRY-RUN] Beispielwerte werden verwendet" RC_URL="https://chat.example.com" RC_USER="bernd" RC_PASS="geheim" RC_ROOM="#ki-assistent" ECHO_DRY "URL = $RC_URL" ECHO_DRY "User = $RC_USER" ECHO_DRY "Raum = $RC_ROOM" else read -rp " Rocket.Chat Basis-URL (z.B. https://chat.example.com): " RC_URL [[ -z "$RC_URL" ]] && { ECHO_ERR "URL darf nicht leer sein"; exit 1; } read -rp " Rocket.Chat Benutzername: " RC_USER [[ -z "$RC_USER" ]] && { ECHO_ERR "Benutzername darf nicht leer sein"; exit 1; } read -rsp " Rocket.Chat Passwort: " RC_PASS echo [[ -z "$RC_PASS" ]] && { ECHO_ERR "Passwort darf nicht leer sein"; exit 1; } read -rp " Standard-Raumname (z.B. #ki-assistent) [optional]: " RC_ROOM fi # ── Schritt 5: Verbindungstest ── ECHO_STEP "5/7 Teste Verbindung zu Rocket.Chat" LOGIN_RESP=$(curl -s -H "Content-Type: application/json" \ -d "{\"user\":\"$RC_USER\",\"password\":\"$RC_PASS\"}" \ "${RC_URL%/}/api/v1/login" 2>/dev/null) || true if [[ -z "$LOGIN_RESP" ]] || ! echo "$LOGIN_RESP" | grep -q '"status":"success"'; then ECHO_ERR "Login fehlgeschlagen" echo " URL : $RC_URL" echo " User: $RC_USER" if ! $DRY_RUN; then read -rp " Parameter bearbeiten? [j/N] " ans if [[ "$ans" =~ ^[Jj]$ ]]; then exec "$0" fi else ECHO_DRY "würde fragen: Parameter bearbeiten?" fi exit 1 fi AUTH_TOKEN=$(echo "$LOGIN_RESP" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['data']['authToken'])") USER_ID=$(echo "$LOGIN_RESP" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['data']['userId'])") ECHO_OK "Login erfolgreich (UserID: $USER_ID)" # Raum auflösen, wenn angegeben ROOM_ID="" if [[ -n "$RC_ROOM" ]]; then ROOM_QUERY="${RC_ROOM/#\#}" ROOM_RESP=$(curl -s -H "X-Auth-Token: $AUTH_TOKEN" -H "X-User-Id: $USER_ID" \ "${RC_URL%/}/api/v1/rooms.info?roomName=$ROOM_QUERY" 2>/dev/null) || true if echo "$ROOM_RESP" | grep -q '"success":true'; then ROOM_ID=$(echo "$ROOM_RESP" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['room']['_id'])") ECHO_OK "Raum gefunden: #$ROOM_QUERY (RoomID: $ROOM_ID)" else ECHO_WARN "Raum '#$ROOM_QUERY' nicht gefunden — überspringe" fi fi # ── Schritt 6: Env-Variablen setzen ── ECHO_STEP "6/7 Schreibe Konfiguration" ENV_FILE="$HERMES_HOME/.env" run_or_simulate "Verzeichnis erstellen: $HERMES_HOME" mkdir -p "$HERMES_HOME" run_or_simulate "Env-Datei berühren: $ENV_FILE" touch "$ENV_FILE" # Alte Einträge entfernen if ! $DRY_RUN; then sed -i '/^ROCKETCHAT_/d' "$ENV_FILE" 2>/dev/null || true fi run_or_simulate "Env-Einträge in $ENV_FILE schreiben" bash -c " cat >> '$ENV_FILE' <<'INNEREOF' # Rocket.Chat Plugin — generiert von install.sh am $(date +%Y-%m-%d) export ROCKETCHAT_BASE_URL=\"$RC_URL\" export ROCKETCHAT_USER=\"$RC_USER\" export ROCKETCHAT_PASSWORD=\"$RC_PASS\" export ROCKETCHAT_ALLOW_ALL_USERS=\"false\" INNEREOF [[ -n '$ROOM_ID' ]] && echo 'export ROCKETCHAT_ROOM_ID=\"$ROOM_ID\"' >> '$ENV_FILE' " $DRY_RUN || ECHO_OK "~/.hermes/.env aktualisiert" # Optional: config.yaml Eintrag anzeigen ECHO_INFO "Falls du config.yaml bevorzugst, füge Folgendes hinzu:" cat </dev/null; then hermes gateway stop 2>/dev/null || true sleep 1 ECHO_OK "Hermes Gateway gestoppt" echo "" echo " Starte neu mit:" echo " hermes gateway start" echo "" else ECHO_WARN "'hermes' Befehl nicht im PATH gefunden" echo " Bitte starte Hermes Gateway manuell:" echo " hermes gateway start" fi fi if $DRY_RUN; then ECHO_STEP "🔍 DRY-RUN BEENDET" ECHO_INFO "Es wurde NICHTS verändert." ECHO_INFO "Starte ohne --dry-run für echte Installation." else ECHO_STEP "✨ Fertig!" ECHO_OK "Plugin installiert unter: $PLUGIN_DEST" ECHO_INFO "Env-Variablen geladen in: $ENV_FILE" ECHO_INFO "Rocket.Chat Plugin ist bereit." fi