SPB Git forge

spb/ka-guardian

Public
26commits 1branches 0releases
4.5 MBsize
maindefault branch
19 days agolast push
Python 57.1% Shell 13.8% CSS 12% JavaScript 10% HTML 7.2%
2.1 KB · 46 lines shellscript
Raw Blame History
1#!/bin/zsh2# ============================================3# KA Guardian — courrier inter-nœuds (100 % zsh)4# macOS 26 « Local Network Privacy » refuse le trafic LAN dès que python5# (homebrew) est dans la chaîne de processus — même ses enfants ssh/curl.6# Ce service launchd (binaire responsable: zsh) expédie donc les requêtes:7#   spool/outbox/<id>.job  → ssh <nœud> curl http://127.0.0.1:<port><path>8#   spool/done/<id>.resp   ← corps de réponse + dernière ligne = code HTTP9# Format .job: ligne 1 = "<ip> <port> <path> <timeout>", reste = payload JSON.10# ============================================11export PATH=/usr/bin:/bin:/usr/sbin:/sbin   # launchd démarre sans PATH12SPOOL=$HOME/ka-guardian-spool13KEY=$HOME/.ssh/ka_guardian_ed2551914mkdir -p $SPOOL/outbox $SPOOL/done $SPOOL/tmp15source $HOME/.ka-guardian.env 2>/dev/null || true1617while true; do18  for f in $SPOOL/outbox/*.job(N); do19    id=${f:t:r}20    hdr=$(head -1 $f)21    parts=(${(z)hdr})22    # NB: ne JAMAIS nommer une variable `path` en zsh — c'est le tableau23    # spécial lié à PATH (l'assigner détruit le PATH du process).24    ip=$parts[1]; port=$parts[2]; jpath=$parts[3]; tmo=${parts[4]:-30}25    # 3 tentatives: un destinataire qui redémarre ne doit pas perdre le message.26    rc=127    for attempt in 1 2 3; do28      tail -n +2 $f | /usr/bin/ssh -i $KEY \29        -o StrictHostKeyChecking=accept-new -o BatchMode=yes -o ConnectTimeout=8 \30        -o ControlMaster=auto -o ControlPath=/tmp/kg-cm-%h -o ControlPersist=120 \31        simon-pierreboucher@$ip \32        "/usr/bin/curl -s -m $tmo --retry 2 --retry-connrefused -X POST http://127.0.0.1:$port$jpath -H 'Content-Type: application/json' -H 'X-KA-Token: $KA_GUARDIAN_TOKEN' -d @- -w '\n%{http_code}'" \33        > $SPOOL/tmp/$id.resp 2>>$SPOOL/courier.log34      rc=$?35      [[ $rc -eq 0 ]] && break36      sleep 337    done38    [[ $rc -ne 0 ]] && print "\ncourier_ssh_rc_$rc" >> $SPOOL/tmp/$id.resp39    mv $SPOOL/tmp/$id.resp $SPOOL/done/$id.resp40    rm -f $f41  done42  # ménage: réponses jamais réclamées depuis > 1 h43  for old in $SPOOL/done/*.resp(N.mh+1); do rm -f $old; done44  sleep 145done46