SPB Git forge

spb/ka-guardian

Public
26commits 1branches 0releases
4.5 MBsize
maindefault branch
20 days agolast push
Python 57.1% Shell 13.8% CSS 12% JavaScript 10% HTML 7.2%
3.1 KB · 68 lines shellscript
Raw Blame History
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