Aller au contenu

Gestion technique des MLO

Inventaire et état désiré

medusa-admin parcourt les resources FiveM avec GetNumResources, GetResourceByFindIndex et GetResourcePath. Seules celles dont le chemin normalisé appartient à [medusamappings], [medusamappings2] ou [medusamappings3] sont publiées vers POST /internal/v1/mlo/sync. La table mlo_resources conserve le chemin, les notes, l’état désiré, l’état runtime, la présence et la date du dernier inventaire. Le web admin déduit le pack de ce chemin pour l'afficher sur chaque fiche sans dupliquer cette donnée en base.

Le filtre de la page MLO est exécuté entièrement dans le navigateur sur l'inventaire déjà reçu. mloResources conserve la réponse complète et renderMlos() applique une comparaison de resource_name insensible à la casse à chaque événement input. Une actualisation remplace l'inventaire mais conserve la valeur du champ, sans requête API supplémentaire par frappe.

PostgreSQL reste la source de vérité pour les notes et desired_enabled. Toutes les cinq secondes, le resource compare cet état à GetResourceState et exécute uniquement start NOM ou stop NOM si nécessaire. Les noms transmis à une commande sont limités à [A-Za-z0-9_.-]. Une nouvelle resource est activée par défaut, même si elle est découverte avant la fin du démarrage du groupe. Au redémarrage, FiveM charge d'abord le groupe configuré puis la synchronisation réapplique les états désactivés persistés dans PostgreSQL dans les cinq secondes suivantes.

start et stop sont des commandes FiveM restreintes lorsqu'elles sont appelées avec ExecuteCommand. server.cfg.template accorde donc exclusivement command.start et command.stop au principal resource.medusa-admin. Sans ces deux ACE, FiveM journalise Access denied for command stop ou start, puis la boucle de réconciliation réessaie toutes les cinq secondes sans pouvoir appliquer l'état désiré.

Redémarrage complet

La table fivem_restart_requests porte la file idempotente pending → processing → completed. L’API web exige CSRF et ADMIN_ALLOW_RESTART_FIVEM. Le resource FiveM réclame atomiquement la demande, puis écrit .container-restart-request dans son propre répertoire. Un watchdog POSIX lancé par entrypoint.sh retire ce signal et envoie SIGTERM au PID 1. Grâce à restart: unless-stopped, Docker recrée le conteneur sans montage du socket Docker. Au démarrage, medusa-admin marque les demandes en cours comme terminées avant de republier l’inventaire.

La migration 0012_mlo_management crée les deux tables. Les routes web vivent sous /admin/mlo et les routes FiveM protégées par X-Internal-Api-Key sous /internal/v1/mlo.