Passer le protocole agent ↔ console à gRPC #1
Loading…
Reference in a new issue
No description provided.
Delete branch "chantier/grpc"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Remplace le cadrage maison
[u32 BE][JSON]par gRPC (tonic), après évaluationchiffrée des candidats dans
spike/(voirspike/RAPPORT.md).1. Passage à gRPC
Le défaut le plus visible n'était pas le format des messages mais l'absence
de multiplexage : pendant un transfert de fichier, une frappe du shell mettait
232 ms au p90 (jusqu'à 347 ms), mesuré sur le mesh. Le contrôle de flux par
stream de HTTP/2 ramène ça à 44 ms — tout en transférant plus vite (40 contre
31 Mio/s).
Ce que le transport prend en charge désormais, et qui disparaît du code :
id, plus de tablepending, plus dethread lecteur démultiplexeur) ;
is_terminal()et ses vingt bras à tenir à jour) ;Cancel, le registre d'AbortHandleet la table de sessions shell n'ont plus de raison d'être — et une console qui
disparaît ne laisse plus de PTY orphelin) ;
UNIMPLEMENTEDau lieu d'une session coupée, donc plusbesoin du décodeur tolérant
decode_request).Défaut corrigé au passage :
FilePutmettait le fichier entier en base64dans une trame unique plafonnée à
MAX_FRAME. Au-delà de ~48 Mio, l'agentrefusait la trame et coupait la connexion sans message d'erreur. Le
client-streaming supprime la limite — vérifié sur le mesh à 64 et 200 Mio,
empreintes SHA-256 comparées.
Choix de conception : les types applicatifs (serde) sont conservés à côté
des types générés, avec une couche de conversion explicite
(
protocol/src/conv.rs). C'est ce qui permet de migrer le transport sanstoucher au frontend — la forme de l'événement
agent-msgest inchangée — niaux analyseurs de comptes, de pare-feu et de runbooks, ni à leurs tests. Le
compte de lignes monte (≈670 lignes de conversions contre 240 de plomberie
supprimées) ; ce qui baisse, c'est le risque : le code parti était celui des
courses critiques.
console/src/identity.rsgarde exprès un client de l'ancien dialecte : unagent pré-gRPC ne répond pas du tout, et une erreur de transport nue
n'apprendrait rien à l'utilisateur. La sonde le reconnaît et rend le chemin de
son binaire pour le redéployer.
2. Garde-fou de mise à jour de l'agent
La console proposait la mise à jour quel que soit le binaire candidat. Deux
conséquences, dont une grave.
La grave : la release roulante
agent-latestde la forge porte encore lebinaire d'avant gRPC (commitish
8c90418, 4 172 464 octets), puisque cettebranche n'est pas fusionnée. Cliquer « Dernier paquet de la forge » sur un hôte
migré téléchargeait ce binaire, le poussait avec succès — l'agent en place
étant gRPC, il l'acceptait — puis l'agent se remplaçait, redémarrait, et
devenait injoignable jusqu'à un redéploiement par SSH.
La gênante : le bouton était proposé même quand l'agent tournait déjà sur le
binaire candidat.
L'agent grave donc une ligne d'identité dans son propre binaire
(
NBOPS-AGENT-META/1 protocol=<n> commit=<sha>), que la console retrouve parrecherche d'octets. Ce choix plutôt qu'un sidecar publié par la CI parce que la
console a toujours les octets sous la main : ça couvre les trois sources —
forge, agent embarqué, fichier choisi à la main — avec un seul mécanisme, là où
un sidecar laisse la troisième découverte. Et un binaire d'avant gRPC n'a pas le
marqueur, ce qui l'identifie exactement comme il faut.
La décision est une fonction pure,
verdict_maj, couverte par 9 tests.3. Tableaux triables, et retrait de la bascule « live »
Les 8 tableaux de l'application se trient en cliquant sur un en-tête :
processus / interfaces / disques du tableau de bord, unités systemd,
gestionnaire de fichiers, règles nftables et ufw, groupes locaux.
Logique partagée (
compareCells/sortRows/nextSort+ un composantSortBtn) plutôt que recopiée huit fois. Trois choix qui méritent d'être dits :localeComparenumérique :« ens10 » se range après « ens9 » ;
processus est réécrit à chaque échantillon poussé, un tri instable ferait
sauter les lignes une fois par seconde ;
SortBtnne fournit que le bouton, pas le<th>: chaque tableau a sa propremise en forme d'en-tête dans son style scopé, et un
<th>émis par un composanttiers en sortirait.
aria-sortreste donc sur la cellule.La bascule « live (push ~1 s) » disparaît avec le bouton « Rafraîchir » :
l'abonnement est permanent. Elle datait d'un temps où le push était optionnel.
4. Édition d'un fichier via vim
Cliquer un fichier ouvre
vimdessus dans l'onglet Shell.ShellIn.Openportedésormais
programetargsséparés, exécutés sans shell.Ce découpage est un choix de sûreté : une commande unique à découper obligerait
à échapper le chemin, et un nom de fichier avec une espace, une apostrophe ou un
point-virgule deviendrait une injection. Fixé par un test : un argument
contenant
; touch <témoin> #doit ressortir entier et ne rien exécuter — letest échoue si le fichier témoin apparaît.
Vérifications
make cipasse : fmt, clippy-D warnings, tests, frontend, cohérence du dist.make win) : OK.ep1etvps.kxh-studio.frviaagent probe: appels unaires, flux, annulation par abandon, PTYbidirectionnel, code de sortie propagé, transferts 8 / 64 / 200 Mio avec
empreintes comparées, et
--editpour vim.push, shell bidirectionnel, déconnexion qui referme bien le TCP.
Ce qui n'est pas couvert par des tests, sciemment
L'implémentation du service gRPC et la pompe de flux de la console sont du
câblage qui demande un agent vivant ou un
AppHandleTauri : couvertes paragent probede bout en bout. Les composants Svelte n'ont pas de harnais detest dans ce dépôt — seule la logique extraite dans
util.jsest testée. Lerendu visuel du tri et de l'édition vim n'a pas pu être contrôlé à l'écran.
À savoir avant de fusionner
protoc >= 3.21.12devient un prérequis de build (ajouté àscripts/ci-rust.shavec contrôle de version ; Debian 13 fournit exactementce plancher).
transport le rend injoignable autrement. État du parc au 2026-09-10 —
à jour :
ep1,vps.kxh-studio.fr· à redéployer :ep2,forge,monitor,pbs1,pve1·mtmgétait injoignable.agent-latest: la CI republieraun agent gRPC.
🤖 Generated with Claude Code
https://claude.ai/code/session_01GzHyvUbKutGrRcWjyfwDkT
Passer le protocole agent ↔ console à gRPCto WIP: Passer le protocole agent ↔ console à gRPCWIP: Passer le protocole agent ↔ console à gRPCto Passer le protocole agent ↔ console à gRPC