#!/usr/bin/env bash # Installation d'un agent SentinelMesh # Usage : curl -fsSL http://:8080/install.sh | bash -s -- --server http://:8080 --token --agent-type scan-network set -euo pipefail # --- Paramètres --- SERVER="" PORT="8080" TOKEN="" AGENT_TYPE="" HOSTNAME_OVERRIDE="" VERSION="latest" GITEA_URL="https://git.maison43gil.com" GITEA_REPO="gilles/SentinelMesh" usage() { cat < URL du backend SentinelMesh (ex: http://192.168.1.10:8080) --token Token d'authentification --agent-type Type d'agent à installer Options facultatives : --port Port du backend (défaut: 8080) --hostname Nom d'hôte (défaut: auto-détecté) --version Version à installer (défaut: latest) EOF exit 1 } while [[ $# -gt 0 ]]; do case "$1" in --server) SERVER="$2"; shift 2 ;; --port) PORT="$2"; shift 2 ;; --token) TOKEN="$2"; shift 2 ;; --agent-type) AGENT_TYPE="$2"; shift 2 ;; --hostname) HOSTNAME_OVERRIDE="$2"; shift 2 ;; --version) VERSION="$2"; shift 2 ;; -h|--help) usage ;; *) echo "Option inconnue : $1"; usage ;; esac done [[ -z "$SERVER" || -z "$TOKEN" || -z "$AGENT_TYPE" ]] && usage [[ "$AGENT_TYPE" != "scan-network" && "$AGENT_TYPE" != "metric" ]] && { echo "Erreur : --agent-type doit être 'scan-network' ou 'metric'" exit 1 } # --- Détection --- HOSTNAME="${HOSTNAME_OVERRIDE:-$(hostname -f 2>/dev/null || cat /etc/hostname || echo "unknown")}" AGENT_ID="$(echo "${AGENT_TYPE}-${HOSTNAME}" | tr '.' '-')" detect_arch() { case "$(uname -m)" in x86_64) echo "x86_64-unknown-linux-gnu" ;; aarch64|arm64) echo "aarch64-unknown-linux-gnu" ;; armv7l) echo "armv7-unknown-linux-gnueabihf" ;; *) echo "Architecture non supportée : $(uname -m)" >&2; exit 1 ;; esac } ARCH="$(detect_arch)" # --- Chemins --- BINARY_NAME="agent-${AGENT_TYPE}" INSTALL_DIR="/usr/local/bin" CONFIG_DIR="/etc/sentinelmesh" SERVICE_NAME="sentinelmesh-${AGENT_TYPE}" SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service" # Port API locale selon le type d'agent [[ "$AGENT_TYPE" == "scan-network" ]] && API_PORT="9100" || API_PORT="9101" # --- Vérifications --- [[ "$EUID" -ne 0 ]] && { echo "Erreur : ce script doit être exécuté en root (sudo)."; exit 1; } command -v curl &>/dev/null || { echo "Erreur : curl est requis."; exit 1; } command -v systemctl &>/dev/null || { echo "Erreur : systemd est requis."; exit 1; } echo "========================================" echo " Installation SentinelMesh — ${BINARY_NAME}" echo "========================================" echo " Serveur : ${SERVER}" echo " Agent ID : ${AGENT_ID}" echo " Hostname : ${HOSTNAME}" echo " Architecture: ${ARCH}" echo " Version : ${VERSION}" echo "========================================" # --- Téléchargement --- if [[ "$VERSION" == "latest" ]]; then DOWNLOAD_URL="${GITEA_URL}/${GITEA_REPO}/releases/download/latest/${BINARY_NAME}-${ARCH}" else DOWNLOAD_URL="${GITEA_URL}/${GITEA_REPO}/releases/download/${VERSION}/${BINARY_NAME}-${ARCH}" fi echo "[1/5] Téléchargement du binaire…" TMP_BIN="$(mktemp)" if ! curl -fsSL -o "$TMP_BIN" "$DOWNLOAD_URL"; then echo "Erreur : impossible de télécharger ${DOWNLOAD_URL}" echo "Conseil : vérifiez que la version ${VERSION} est publiée sur Gitea." rm -f "$TMP_BIN" exit 1 fi chmod +x "$TMP_BIN" mv "$TMP_BIN" "${INSTALL_DIR}/${BINARY_NAME}" echo " → ${INSTALL_DIR}/${BINARY_NAME}" # --- Configuration --- echo "[2/5] Création de la configuration…" mkdir -p "$CONFIG_DIR" cat > "${CONFIG_DIR}/${AGENT_TYPE}.yaml" < "$SERVICE_FILE" </dev/null && echo " → Agent enregistré" || echo " ⚠ Enregistrement échoué (l'agent réessaiera au démarrage)" echo "" echo "========================================" echo " Installation terminée !" echo "" echo " Commandes utiles :" echo " Statut : systemctl status ${SERVICE_NAME}" echo " Logs : journalctl -u ${SERVICE_NAME} -f" echo " Config : ${CONFIG_DIR}/${AGENT_TYPE}.yaml" echo " API locale : http://localhost:${API_PORT}" echo "========================================"