Files
Hermes_rocket.chat_Plugin/install.sh
T
2026-05-05 18:45:38 +02:00

247 lines
7.4 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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)
set -euo pipefail
# ── 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 <<EOF
plugins:
platforms:
rocketchat:
enabled: true
base_url: "$RC_URL"
user: "$RC_USER"
password: "$RC_PASS"
room_id: "${ROOM_ID:-optional}"
allowed_users: []
allow_all_users: false
EOF
# ── Schritt 7: Hermes Gateway Neustart ──
ECHO_STEP "7/7 Hermes Gateway Neustart"
if $DRY_RUN; then
ECHO_DRY "würde hermes gateway stop ausführen (falls verfügbar)"
ECHO_DRY "würde Hinweis ausgeben: hermes gateway start"
else
if command -v hermes &>/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