diff --git a/install/install.sh b/install/install.sh old mode 100644 new mode 100755 index 4fb6b3c..3822974 --- a/install/install.sh +++ b/install/install.sh @@ -1,31 +1,210 @@ #!/usr/bin/env bash -# Script d'installation des agents SentinelMesh +# 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() { - echo "Usage: $0 --server --token --agent-type [--port ] [--hostname ]" + 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 ;; - *) usage ;; + --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 +} -# TODO Phase 5 : téléchargement binaire, création config, enregistrement backend, service systemd +# --- Détection --- +HOSTNAME="${HOSTNAME_OVERRIDE:-$(hostname -f 2>/dev/null || cat /etc/hostname || echo "unknown")}" +AGENT_ID="$(echo "${AGENT_TYPE}-${HOSTNAME}" | tr '.' '-')" -echo "Installation agent-${AGENT_TYPE} → ${SERVER}:${PORT} (non implémenté — Phase 5)" +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 "========================================"