#!/bin/bash set -e # 1. Aktuellen Linux-Benutzer ermitteln CURRENT_USER=$(whoami) USER_HOME=$HOME # 2. Version & Datum aus version.json auslesen if [ -f version.json ]; then VERSION=$(jq -r '.version' version.json) DATE=$(jq -r '.build_date' version.json) else VERSION="1.0.0" DATE=$(date +'%Y-%m-%d') fi echo "🔧 Baue Spannung-Monitor $VERSION ($DATE) für Raspberry Pi 3 & 4" # KORREKTUR: Einfache Anführungszeichen fangen die Leerzeichen für den Go-Linker ab LDFLAGS="-X 'main.Version=$VERSION' -X 'main.BuildDate=$DATE'" # Zielverzeichnis 'app' bereinigen und neu erstellen rm -rf app spannung-arm* mkdir app # --- BUILD-PROZESS MIT CGO --- # Definiere die Pfade zu den lokalen sysroots SYSROOT_64="$USER_HOME/spannung/sysroot-arm64" SYSROOT_32="$USER_HOME/spannung/sysroot-arm32" # 1. Für 64-Bit Raspberry Pi (Standard bei Pi 4 und neueren Pi 3 OS) echo "📦 Kompiliere für ARM64 (64-Bit)..." CGO_LDFLAGS="-L$SYSROOT_64/lib/aarch64-linux-gnu -L$SYSROOT_64/usr/lib/aarch64-linux-gnu -Wl,-rpath-link=$SYSROOT_64/lib/aarch64-linux-gnu -Wl,-rpath-link=$SYSROOT_64/usr/lib/aarch64-linux-gnu" \ CGO_ENABLED=1 GOOS=linux GOARCH=arm64 CC=aarch64-linux-gnu-gcc \ go build -ldflags "$LDFLAGS" -o ./app/spannung-arm64 . echo "✅ Fertig gebaut: ./app/spannung-arm64" # 2. Für 32-Bit Raspberry Pi (Klassisch für Pi 3 / ältere OS) echo "📦 Kompiliere für ARM32 v7 (32-Bit)..." CGO_LDFLAGS="-L$SYSROOT_32/lib/arm-linux-gnueabihf -L$SYSROOT_32/usr/lib/arm-linux-gnueabihf -Wl,-rpath-link=$SYSROOT_32/lib/arm-linux-gnueabihf -Wl,-rpath-link=$SYSROOT_32/usr/lib/arm-linux-gnueabihf" \ CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 CC=arm-linux-gnueabihf-gcc \ go build -ldflags "$LDFLAGS" -o ./app/spannung-arm32_7 . echo "✅ Fertig gebaut: ./app/spannung-arm32_7" # Dateiberechtigungen im Zielordner setzen chmod +x ./app/spannung-* # Konfiguration und Web-Ordner kopieren cp config.json ./app/ cp version.json ./app/ cp web ./app/ -r # 3. Die Service-Datei mit Platzhaltern generieren cat << 'EOF' > ./app/spannung.service [Unit] Description=Spannung Control Service After=network-online.target i2c.service Wants=network-online.target StartLimitIntervalSec=60s StartLimitBurst=3 [Service] Type=simple # Vorprüfung ALS ROOT ausführen ExecStartPre=/bin/bash -c 'for i in {1..5}; do /usr/sbin/i2cdetect -y 1 | grep -q 48 && /usr/sbin/i2cdetect -y 1 | grep -q 49 && exit 0; sleep 2; done; exit 1' ExecStart={{TARGET_DIR}}/{{BINARY}} WorkingDirectory={{TARGET_DIR}} User={{TARGET_USER}} Restart=on-failure RestartSec=5s # KORREKTUR: Verhindert, dass STRG+C über SSH den Dienst beim Beenden des Logs killt KillMode=process StandardOutput=append:{{TARGET_DIR}}/spannung.log StandardError=append:{{TARGET_DIR}}/spannung.log [Install] WantedBy=multi-user.target EOF # 4. Ein automatisches Installations-Skript für den Pi im app-Ordner erstellen cat << 'EOF' > ./app/install.sh #!/bin/bash set -e echo "🚀 Starte automatische Einrichtung des Spannung-Monitors..." # Pfade und Benutzer auf dem aktuellen Pi ermitteln PI_DIR=$(pwd) PI_USER=$(whoami) # Architektur des Betriebssystems prüfen ARCH=$(uname -m) if [ "$ARCH" = "aarch64" ]; then BINARY="spannung-arm64" echo "🎯 64-Bit OS erkannt. Nutze: $BINARY" else BINARY="spannung-arm32_7" echo "🎯 32-Bit OS erkannt. Nutze: $BINARY" fi # Platzhalter in der Service-Datei direkt auf dem Pi ersetzen sed -i "s|{{TARGET_DIR}}|$PI_DIR|g" spannung.service sed -i "s|{{TARGET_USER}}|$PI_USER|g" spannung.service sed -i "s|{{BINARY}}|$BINARY|g" spannung.service echo "📝 Service-Datei wurde erfolgreich für dieser Pi konfiguriert." # Service in das Systemverzeichnis kopieren und aktivieren echo "⚙️ Kopiere Service-Datei nach /etc/systemd/system/..." sudo cp spannung.service /etc/systemd/system/spannung.service sudo systemctl daemon-reload sudo systemctl enable spannung.service echo "▶️ Starte den Dienst..." sudo systemctl restart spannung.service echo "✅ Fertig! Der Spannung-Monitor läuft und der Autostart ist aktiv." EOF chmod +x ./app/install.sh echo "📝 Service-Datei und install.sh generiert." echo "📂 Inhalt des fertigen app-Verzeichnisses:" ls -la app