installers: move to project root, share a single .venv
client/install.sh → install_client.sh server/install.sh → install_server.sh Both scripts now resolve REPO_DIR as their own directory (repo root) and use a shared .venv at the repo root instead of per-subdirectory virtual environments. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Executable
+170
@@ -0,0 +1,170 @@
|
||||
#!/usr/bin/env bash
|
||||
# SERVER installer — installs the we_monitor collector as a systemd user service.
|
||||
# Does NOT install the GUI client (see client/requirements.txt).
|
||||
#
|
||||
# Fresh install:
|
||||
# chmod +x install.sh
|
||||
# ./install.sh
|
||||
# # then edit ~/.config/we_monitor/credentials.json
|
||||
# systemctl --user start we_monitor
|
||||
#
|
||||
# Update (code already pulled via git):
|
||||
# ./install.sh
|
||||
# (restarts the service automatically if it was running)
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
REPO_DIR="$SCRIPT_DIR"
|
||||
SERVICE_NAME="we_monitor"
|
||||
CREDS_DIR="$HOME/.config/we_monitor"
|
||||
CREDS_FILE="$CREDS_DIR/credentials.json"
|
||||
SYSTEMD_DIR="$HOME/.config/systemd/user"
|
||||
SERVICE_FILE="$SYSTEMD_DIR/$SERVICE_NAME.service"
|
||||
LOG_DIR="$REPO_DIR/logs"
|
||||
|
||||
VENV="$REPO_DIR/.venv"
|
||||
PYTHON="$VENV/bin/python"
|
||||
|
||||
# detect fresh install vs update
|
||||
IS_UPDATE=false
|
||||
WAS_ACTIVE=false
|
||||
if systemctl --user is-enabled "$SERVICE_NAME" &>/dev/null; then
|
||||
IS_UPDATE=true
|
||||
if systemctl --user is-active "$SERVICE_NAME" &>/dev/null; then
|
||||
WAS_ACTIVE=true
|
||||
fi
|
||||
fi
|
||||
|
||||
if $IS_UPDATE; then
|
||||
echo "==> we_monitor updater"
|
||||
else
|
||||
echo "==> we_monitor installer"
|
||||
fi
|
||||
echo " Project : $REPO_DIR"
|
||||
echo " User : $USER"
|
||||
echo ""
|
||||
|
||||
# ── 1. virtual environment ────────────────────────────────────────────────────
|
||||
if [[ ! -x "$PYTHON" ]]; then
|
||||
echo "==> Creating virtual environment : $VENV"
|
||||
python3 -m venv "$VENV"
|
||||
else
|
||||
echo "==> Virtual environment exists : $VENV"
|
||||
fi
|
||||
|
||||
echo "==> Installing / updating dependencies"
|
||||
"$VENV/bin/pip" install --quiet --upgrade pip
|
||||
"$VENV/bin/pip" install --quiet --upgrade -r "$REPO_DIR/server/requirements.txt"
|
||||
|
||||
echo "==> Applying cariad-hybrid-auth-fix.patch to volkswagencarnet"
|
||||
SITE_PKG="$("$PYTHON" -c 'import sysconfig; print(sysconfig.get_path("purelib"))')"
|
||||
PATCH_FILE="$REPO_DIR/cariad-hybrid-auth-fix.patch"
|
||||
if patch -d "$SITE_PKG" -p1 -N --dry-run --silent < "$PATCH_FILE" 2>/dev/null; then
|
||||
patch -d "$SITE_PKG" -p1 -N --silent < "$PATCH_FILE"
|
||||
echo " Patch applied"
|
||||
else
|
||||
echo " Patch already applied (skipping)"
|
||||
fi
|
||||
|
||||
echo " Python : $PYTHON"
|
||||
echo ""
|
||||
|
||||
# ── 2. credentials template (only on fresh install) ───────────────────────────
|
||||
mkdir -p "$CREDS_DIR"
|
||||
chmod 700 "$CREDS_DIR"
|
||||
|
||||
if [[ ! -f "$CREDS_FILE" ]]; then
|
||||
cat > "$CREDS_FILE" <<'EOF'
|
||||
{
|
||||
"credentials": {
|
||||
"username": "me@example.com",
|
||||
"password": "secret"
|
||||
},
|
||||
"vin": "",
|
||||
"domains": ["charging", "electric_drive", "connectivity"],
|
||||
"interval_s": 300,
|
||||
"host": "0.0.0.0",
|
||||
"port": 9999,
|
||||
"log_dir": "./logs",
|
||||
"diff": false
|
||||
}
|
||||
EOF
|
||||
chmod 600 "$CREDS_FILE"
|
||||
echo "==> Created credentials template : $CREDS_FILE"
|
||||
echo " *** Edit this file before starting the service! ***"
|
||||
else
|
||||
echo "==> Credentials file exists : $CREDS_FILE"
|
||||
fi
|
||||
|
||||
# ── 3. log directory ──────────────────────────────────────────────────────────
|
||||
mkdir -p "$LOG_DIR"
|
||||
echo "==> Log directory : $LOG_DIR"
|
||||
|
||||
# ── 4. systemd user service ───────────────────────────────────────────────────
|
||||
mkdir -p "$SYSTEMD_DIR"
|
||||
|
||||
cat > "$SERVICE_FILE" <<EOF
|
||||
[Unit]
|
||||
Description=CarConnectivity vehicle data collector
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=$REPO_DIR
|
||||
ExecStart=$PYTHON -m server.main -c $CREDS_FILE
|
||||
Restart=on-failure
|
||||
RestartSec=60
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=$SERVICE_NAME
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
EOF
|
||||
|
||||
echo "==> Installed service unit : $SERVICE_FILE"
|
||||
|
||||
# ── 5. enable linger (service survives logout / starts at boot) ───────────────
|
||||
if loginctl enable-linger "$USER" 2>/dev/null; then
|
||||
echo "==> Linger enabled for $USER (service starts at boot)"
|
||||
else
|
||||
echo " Note: could not enable linger — service runs only while logged in"
|
||||
echo " Run as root to fix: loginctl enable-linger $USER"
|
||||
fi
|
||||
|
||||
# ── 6. reload systemd and enable / restart ────────────────────────────────────
|
||||
systemctl --user daemon-reload
|
||||
systemctl --user enable "$SERVICE_NAME"
|
||||
|
||||
if $WAS_ACTIVE; then
|
||||
systemctl --user restart "$SERVICE_NAME"
|
||||
echo "==> Service restarted"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
if $IS_UPDATE; then
|
||||
echo " Update complete."
|
||||
echo ""
|
||||
if $WAS_ACTIVE; then
|
||||
echo " Service was restarted automatically."
|
||||
else
|
||||
echo " Service was not running — start it manually if needed:"
|
||||
echo " systemctl --user start $SERVICE_NAME"
|
||||
fi
|
||||
else
|
||||
echo " Installation complete."
|
||||
echo ""
|
||||
echo " Next steps:"
|
||||
echo " 1. Edit credentials (username, password, vin, interval_s, …):"
|
||||
echo " \$EDITOR $CREDS_FILE"
|
||||
echo ""
|
||||
echo " 2. Start the service:"
|
||||
echo " systemctl --user start $SERVICE_NAME"
|
||||
fi
|
||||
echo ""
|
||||
echo " Check status : systemctl --user status $SERVICE_NAME"
|
||||
echo " Follow logs : journalctl --user -u $SERVICE_NAME -f"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
Reference in New Issue
Block a user