#!/usr/bin/env bash # Generated by the FEDEO setup wizard. This file contains the agent's access token. set -euo pipefail umask 077 if [[ "$(uname -s)" != Linux ]]; then echo 'Diese Installation ist für Linux vorgesehen.' >&2 exit 1 fi if [[ "$(id -u)" == 0 ]]; then echo 'Bitte dieses Skript als normaler Benutzer ohne sudo starten.' >&2 exit 1 fi if [[ "${1:-}" != '' && "${1:-}" != --no-start ]]; then echo 'Aufruf: bash install.sh [--no-start]' >&2 exit 1 fi FEDEO_SETUP_ID='@@AGENT_ID@@' FEDEO_SETUP_AUTOSTART='@@AUTOSTART@@' FEDEO_SETUP_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/fedeo-device-agent/$FEDEO_SETUP_ID" FEDEO_SETUP_CONFIG="${XDG_CONFIG_HOME:-$HOME/.config}/fedeo-device-agent/$FEDEO_SETUP_ID.env" FEDEO_SETUP_WORK="${XDG_STATE_HOME:-$HOME/.local/state}/fedeo-device-agent/$FEDEO_SETUP_ID" FEDEO_SETUP_UNIT="fedeo-device-agent-$FEDEO_SETUP_ID.service" FEDEO_SETUP_UNITS="${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user" echo 'FEDEO Scan-Agent wird für diesen Benutzer eingerichtet.' fedeo_processing_ready() { python3 -c 'import PIL, cv2, numpy' >/dev/null 2>&1 && tesseract --list-langs 2>/dev/null | grep -qx deu && tesseract --list-langs 2>/dev/null | grep -qx eng } if ! command -v node >/dev/null || ! command -v scanimage >/dev/null || ! fedeo_processing_ready; then if ! command -v apt-get >/dev/null; then echo 'Bitte Node.js >= 20, SANE, Python/Pillow/OpenCV sowie Tesseract mit Deutsch/Englisch installieren und das Skript erneut starten.' >&2 exit 1 fi echo 'Fehlende Systempakete werden über apt installiert (sudo benötigt).' sudo apt-get update sudo apt-get install -y nodejs sane-utils python3-pil python3-opencv tesseract-ocr tesseract-ocr-deu tesseract-ocr-eng fi node -e 'if (Number(process.versions.node.split(".")[0]) < 20) { console.error("Node.js >= 20 wird benötigt. Bitte Node.js aktualisieren und die Installation erneut starten."); process.exit(1) }' fedeo_processing_ready || { echo 'Die benötigte Bildverarbeitung oder die OCR-Sprachpakete fehlen weiterhin.' >&2; exit 1; } FEDEO_SETUP_NODE="$(command -v node)" FEDEO_SETUP_HAS_SYSTEMD=false if command -v systemctl >/dev/null && systemctl --user show-environment >/dev/null 2>&1; then FEDEO_SETUP_HAS_SYSTEMD=true fi if [[ "$FEDEO_SETUP_AUTOSTART" == true && "$FEDEO_SETUP_HAS_SYSTEMD" != true ]]; then echo 'Der Benutzerdienst von systemd ist nicht erreichbar. Bitte in der Desktop-Sitzung starten oder den Autostart im Assistenten ausschalten.' >&2 exit 1 fi mkdir -p "$FEDEO_SETUP_DIR" "$(dirname "$FEDEO_SETUP_CONFIG")" "$FEDEO_SETUP_WORK" "$FEDEO_SETUP_UNITS" # Stop only the matching installation before replacing its files. if [[ "$FEDEO_SETUP_HAS_SYSTEMD" == true && "${1:-}" != --no-start ]]; then systemctl --user stop "$FEDEO_SETUP_UNIT" 2>/dev/null || true fi python3 - "$FEDEO_SETUP_DIR" "$FEDEO_SETUP_CONFIG" "$FEDEO_SETUP_WORK" "$FEDEO_SETUP_NODE" "$FEDEO_SETUP_UNITS/$FEDEO_SETUP_UNIT" <<'FEDEO_PYTHON' import base64 import json import os from pathlib import Path import sys agent_dir, config_path, work_dir, node, unit_path = map(Path, sys.argv[1:]) files = json.loads(base64.b64decode('@@PAYLOAD_BASE64@@')) for name, encoded in files.items(): relative = Path(name) if relative.is_absolute() or '..' in relative.parts: raise ValueError('Ungültiger Dateiname im Installationspaket') target = agent_dir / relative target.parent.mkdir(parents=True, exist_ok=True) target.write_bytes(base64.b64decode(encoded, validate=True)) config = base64.b64decode('@@CONFIG_BASE64@@').decode('utf8') config += 'FEDEO_WORK_DIR=' + str(work_dir) + '\n' config_path.write_text(config, encoding='utf8') config_path.chmod(0o600) def unit_quote(value): return '"' + str(value).replace('\\', '\\\\').replace('"', '\\"').replace('%', '%%') + '"' unit_path.write_text('\n'.join([ '[Unit]', 'Description=FEDEO Scan-Agent', 'After=network-online.target', '', '[Service]', 'Type=simple', # WorkingDirectory takes a literal path, unlike Environment/ExecStart. # Quotes would become part of the path; only systemd specifiers need escaping. 'WorkingDirectory=' + str(agent_dir).replace('%', '%%'), 'Environment=' + unit_quote('FEDEO_AGENT_ENV=' + str(config_path)), 'ExecStart=' + unit_quote(node) + ' ' + unit_quote(agent_dir / 'dist/main.js'), 'Restart=on-failure', 'RestartSec=5', 'UMask=0077', '', '[Install]', 'WantedBy=default.target', '', ]), encoding='utf8') FEDEO_PYTHON echo "Agent installiert: $FEDEO_SETUP_DIR" echo "Konfiguration: $FEDEO_SETUP_CONFIG" if [[ "${1:-}" == --no-start ]]; then echo 'Installation abgeschlossen; Agent wurde nicht gestartet.' elif [[ "$FEDEO_SETUP_AUTOSTART" == true ]]; then systemctl --user daemon-reload systemctl --user enable "$FEDEO_SETUP_UNIT" systemctl --user restart "$FEDEO_SETUP_UNIT" echo 'Agent gestartet. Er startet künftig bei der Anmeldung.' printf 'Protokoll: journalctl --user -u %q -f\n' "$FEDEO_SETUP_UNIT" echo 'Jetzt im FEDEO-Assistenten die Verbindung prüfen. Die heruntergeladene Installationsdatei kann anschließend gelöscht werden.' else if [[ "$FEDEO_SETUP_HAS_SYSTEMD" == true ]]; then systemctl --user disable "$FEDEO_SETUP_UNIT" 2>/dev/null || true systemctl --user daemon-reload fi echo 'Agent startet im Terminal. Dieses Fenster geöffnet lassen; Beenden mit Strg+C.' cd "$FEDEO_SETUP_DIR" FEDEO_AGENT_ENV="$FEDEO_SETUP_CONFIG" "$FEDEO_SETUP_NODE" dist/main.js fi