spb/ka-guardian
Public
Python 57.1%
Shell 13.8%
CSS 12%
JavaScript 10%
HTML 7.2%
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