spb/ka-guardian
Public
Python 57.1%
Shell 13.8%
CSS 12%
JavaScript 10%
HTML 7.2%
1#!/bin/zsh2# ============================================3# KA Guardian — synchronisation du registre mld + sonde des runners (100 % zsh)4# Le registre des déploiements (M1M32:~/dispatch/registry.json) dit où tourne5# chaque app du Groupe Ka. mld le POUSSE déjà dans le spool à chaque sauvegarde ;6# ce service le TIRE en plus toutes les 2 min (ceinture et bretelles), puis7# sonde le runner :7791 de chaque nœud hébergeur pour que les orchestrateurs8# sachent, AVANT de dépêcher une mission, si le nœud est équipé.9# Chaîne launchd → zsh → /usr/bin/ssh : macOS 26 « Local Network Privacy »10# refuse le LAN aux descendants de python (homebrew) — jamais de python ici.11# ~/ka-guardian-spool/registry.json ← copie du registre (écriture atomique)12# ~/ka-guardian-spool/runners.json ← {"<ip>": {"ok":bool,"node":…,"busy":…,"ts":epoch}}13# ============================================14export PATH=/usr/bin:/bin:/usr/sbin:/sbin15SPOOL=$HOME/ka-guardian-spool16KEY=$HOME/.ssh/ka_guardian_ed2551917LOG=$SPOOL/registry-sync.log18INTERVAL=${KA_REGISTRY_INTERVAL:-120}19mkdir -p $SPOOL2021log() { print "$(date '+%F %T') $*" >> $LOG; }2223# JSON minimal sans python : extraire les IP uniques des apps du registre.24registry_ips() {25 # les entrées ont la forme "ip": "192.168.2.83"26 grep -o '"ip": *"[0-9.]*"' $SPOOL/registry.json 2>/dev/null | grep -o '[0-9.]*[0-9]' | sort -u27}2829while true; do30 # 1. tirer le registre (alias gitsrv = passerelle M1M32, clé ka_guardian autorisée)31 if /usr/bin/ssh -o BatchMode=yes -o ConnectTimeout=8 gitsrv 'cat ~/dispatch/registry.json' > $SPOOL/registry.json.pull 2>>$LOG \32 && grep -q '"apps"' $SPOOL/registry.json.pull; then33 if ! cmp -s $SPOOL/registry.json.pull $SPOOL/registry.json; then34 mv -f $SPOOL/registry.json.pull $SPOOL/registry.json35 log "registre mis à jour ($(grep -o '"updated": *"[^"]*"' $SPOOL/registry.json | head -1))"36 else37 rm -f $SPOOL/registry.json.pull38 fi39 else40 rm -f $SPOOL/registry.json.pull41 log "tirage du registre impossible (gitsrv injoignable) — copie précédente conservée"42 fi4344 # 2. sonder les runners des nœuds hébergeurs (le journal des sondes ne garde que le dernier cycle)45 : > $SPOOL/registry-sync.probe.log46 out="{"47 first=148 for ip in $(registry_ips); do49 resp=$(/usr/bin/ssh -i $KEY -o BatchMode=yes -o ConnectTimeout=6 -o StrictHostKeyChecking=accept-new \50 -o ControlMaster=auto -o ControlPath=/tmp/kg-cm-%h -o ControlPersist=120 \51 simon-pierreboucher@$ip "/usr/bin/curl -s -m 4 http://127.0.0.1:7791/health" 2>>$SPOOL/registry-sync.probe.log)52 ts=$(date +%s)53 if [[ $resp == *'"ok":true'* ]]; then54 node=$(print -r -- $resp | grep -o '"node":"[^"]*"' | cut -d'"' -f4)55 busy=$([[ $resp == *'"busy":true'* ]] && echo true || echo false)56 row="\"$ip\":{\"ok\":true,\"node\":\"$node\",\"busy\":$busy,\"ts\":$ts}"57 else58 row="\"$ip\":{\"ok\":false,\"node\":null,\"busy\":false,\"ts\":$ts}"59 fi60 [[ $first -eq 1 ]] && first=0 || out+=","61 out+=$row62 done63 out+="}"64 print -r -- $out > $SPOOL/runners.json.tmp && mv -f $SPOOL/runners.json.tmp $SPOOL/runners.json6566 sleep $INTERVAL67done68