feat(scan): add guided Linux agent setup in administration
This commit is contained in:
111
agents/fedeo-device-agent/scripts/install-linux.sh
Normal file
111
agents/fedeo-device-agent/scripts/install-linux.sh
Normal file
@@ -0,0 +1,111 @@
|
||||
#!/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.'
|
||||
if ! command -v node >/dev/null || ! command -v scanimage >/dev/null || ! python3 -c 'import PIL' >/dev/null 2>&1; then
|
||||
if ! command -v apt-get >/dev/null; then
|
||||
echo 'Bitte Node.js >= 20, SANE (scanimage), Python 3 und Pillow 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
|
||||
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) }'
|
||||
python3 -c 'import PIL'
|
||||
|
||||
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=' + unit_quote(agent_dir),
|
||||
'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
|
||||
Reference in New Issue
Block a user