erplibre/script/qemu_cache/catalogue_en.go
Mathieu Benoit ab57a49d22 [ADD] cache qemu : ranger à nouveau le magasin sous la clé courante
La règle de clé d'un fichier portable a changé : seule la fin du chemin compte
désormais. Les objets écrits sous l'ancienne règle restent sur le disque mais
deviennent introuvables — le service les redemande à l'amont, et la place
qu'ils tiennent ne sert plus personne. Sur un magasin de 12 764 objets, 5 419
étaient dans ce cas, soit 9,11 Gio. La passe les range sous la clé courante
sans rien retélécharger, et fond au passage les copies qu'un miroir portait
sous plusieurs chemins — 1 422 groupes, environ 3,37 Gio rendus. Un statut
seul n'est pas touché : sa clé porte l'hôte. Vérifié : cinq tests, trois
mutations attrapées.

--- EN ---

The key rule for a portable file changed: only the end of the path now counts.
Objects written under the old rule stay on disk but become unreachable — the
service asks upstream again, and the space they hold serves no one. On a store
of 12 764 objects, 5 419 were in that case, that is 9.11 GiB. The pass stores
them again under the current key without downloading anything, and merges on
the way the copies a mirror carried under several paths — 1 422 groups, about
3.37 GiB returned. A status-only entry is left alone: its key carries the
host. Checked: five tests, three mutations caught.

Assisted-by: Claude Opus 5
2026-09-21 05:39:38 -04:00

167 lines
19 KiB
Go

// © 2026 TechnoLibre (http://www.technolibre.ca)
// License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
package main
// anglais traduit les messages humains du binaire. La clé est le texte
// français mot pour mot, tel que T le reçoit ; une clé absente sort en
// français. langue_test.go refuse un T(...) sans entrée, une entrée
// qu'aucun T(...) n'emploie, et une traduction qui ne garde pas les mêmes
// verbes de format que son original.
var anglais = map[string]string{
"taille vide": "empty size",
"taille illisible %q : essayer 50G, 500M, 2T": "unreadable size %q: try 50G, 500M, 2T",
"effacer le moins récemment servi jusqu'à tenir sous cette taille (ex. 50G)": "erase the least recently served until the cache fits under this size (e.g. 50G)",
"purge au plafond : %v\n": "size purge: %v\n",
"[à blanc] ": "[dry run] ",
"plafond %s : le cache occupe %s\n": "ceiling %s: the cache occupies %s\n",
"%sobjets : %d, %s ; dépôts : %d, %s ; reste %s\n": "%sobjects: %d, %s; repositories: %d, %s; %s left\n",
"cache : variante de %s non gardée : %v": "cache: variant of %s not kept: %v",
"langue des messages : fr ou en ; à défaut, EL_LANG": "language of messages: fr or en; otherwise EL_LANG",
"granularité inconnue %q : jour, semaine ou mois": "unknown granularity %q: day, week or month",
"durée vide": "empty duration",
"durée illisible %q": "unreadable duration %q",
"durée illisible %q : essayer 30j, 12h, 90m": "unreadable duration %q: try 30d, 12h, 90m",
"Âge du dernier usage, par %s.\n": "Age of last use, by %s.\n",
"\nUn objet servi voit sa date remise à jour : « vieux » veut donc dire\n« n'a plus servi », et non « est entré il y a longtemps ».\n": "\nA served object has its date renewed: « old » therefore means\n« no longer served », not « stored long ago ».\n",
" rien": " nothing",
"[à blanc] objets qui partiraient : %d, %s\n": "[dry run] objects that would go: %d, %s\n",
"[à blanc] dépôts qui partiraient : %d, %s\n": "[dry run] repositories that would go: %d, %s\n",
"[à blanc] rien n'a été effacé.": "[dry run] nothing was erased.",
"erplibre_go_qemu_cache : requête adressée au cache lui-même, refusée.\n demandé : %s\nLa relayer la renverrait vers cette même écoute, sans fin.\n": "erplibre_go_qemu_cache: request addressed to the cache itself, refused.\n requested: %s\nRelaying it would send it back to this same listener, endlessly.\n",
"boucle refusée : %s vise le cache lui-même": "loop refused: %s targets the cache itself",
"adresse MAC vide": "empty MAC address",
"adresse MAC illisible %q": "unreadable MAC address %q",
"adresse MAC de %d octets, six attendus": "MAC address of %d bytes, six expected",
"%s est une adresse de groupe : jamais une adresse source": "%s is a group address: never a source address",
"l'adresse nulle n'identifie aucune machine": "the null address identifies no machine",
"dépôt illisible %q": "unreadable repository %q",
"dépôt sans chemin %q": "repository without a path %q",
"chemin de dépôt refusé %q": "repository path refused %q",
"miroir refusé pour %s : %s libres sous %s, plancher de %s": "mirror refused for %s: %s free under %s, floor of %s",
"miroir git : sonde de %s en échec (%v) ; ses miroirs sont servis sans rafraîchissement jusqu'à ce qu'il réponde": "git mirror: probe of %s failed (%v); its mirrors are served without refresh until it answers",
"git %s : %v : %s": "git %s: %v: %s",
"miroir éteint": "mirror disabled",
"hors des miroirs : %s": "outside the mirrors: %s",
"amont connu muet : l'établissement vient d'échouer, il n'est pas retenté": "upstream known mute: connecting just failed, it is not retried",
"répertoire des objets gardés": "directory of kept objects",
"répertoire de l'autorité de certification": "certificate authority directory",
"écoute pour le 80 détourné": "listener for redirected port 80",
"écoute pour le 443 détourné": "listener for redirected port 443",
"pont libvirt des VM": "libvirt bridge of the VMs",
"sous-réseau des VM": "subnet of the VMs",
"journal d'accès JSON par ligne": "access log, one JSON object per line",
"hôtes à ne jamais déchiffrer, séparés par des virgules": "hosts never to decrypt, comma-separated",
"dire chaque requête": "log every request",
"dire ce que le cache occupe, puis sortir": "print what the cache occupies, then exit",
"montrer les gestes privilégiés sans en faire un": "show the privileged steps without performing any",
"créer l'autorité si elle manque, puis sortir": "create the authority if missing, then exit",
"écrire les règles nft seules, à passer à « nft -f - »": "print the nft rules alone, to feed to « nft -f - »",
"écrire les commandes iptables seules, une par ligne": "print the iptables commands alone, one per line",
"liste des VM soustraites au détournement, une MAC par ligne": "list of VMs excluded from redirection, one MAC per line",
"soustraire cette adresse MAC au détournement": "exclude this MAC address from redirection",
"nom de la VM, écrit à côté de la MAC ajoutée": "VM name, written next to the added MAC",
"rendre cette adresse MAC au détournement": "return this MAC address to redirection",
"racine des dépôts git tenus en miroir ; vide, git est simplement relayé vers l'amont": "root of the mirrored git repositories; empty, git is simply relayed upstream",
"délai en deçà duquel un dépôt n'est pas re-interrogé": "delay under which a repository is not queried again",
"fichier de dépôts, un par ligne, à tenir en miroir d'avance": "file of repositories, one per line, to mirror ahead",
"dépôts clonés en parallèle par le pré-remplissage": "repositories cloned in parallel by the prefill",
"dire ce que le cache occupe, groupé par âge du dernier usage": "print what the cache occupies, grouped by age of last use",
"découpage du relevé par âge : jour, semaine ou mois": "split of the age report: day, week or month",
"effacer TOUT le cache : objets et dépôts en miroir": "erase the WHOLE cache: objects and mirrored repositories",
"n'effacer que ce qui n'a pas servi depuis ce délai (ex. 30j, 12h)": "erase only what has not served for this delay (e.g. 30d, 12h)",
"dire les dépôts tenus en miroir, du plus lourd au plus léger": "list the mirrored repositories, heaviest first",
"effacer le miroir de ce dépôt ; il se refera au prochain besoin": "erase this repository's mirror; it is rebuilt when next needed",
"dire les exceptions en place, une « MAC nom » par ligne": "list the exceptions in place, one « MAC name » per line",
"dire la version, puis sortir": "print the version, then exit",
"lire des lignes « MÉTHODE URL » sur l'entrée standard et dire, pour chacune, ce que le magasin tient : une ligne séparée par des tabulations « verdict statut stored_at classe méthode url », verdict garde (corps 200), statut (statut seul, sans corps), absent ou non-cachable. Lecture seule : --cache-dir suffit, sans privilège, et l'âge des objets n'est pas touché": "read « METHOD URL » lines on standard input and say, for each, what the store holds: a tab-separated line « verdict status stored_at class method url », verdict garde (200 body), statut (status only, no body), absent or non-cachable. Read-only: --cache-dir is enough, no privilege, and object ages are not touched",
"lire des lignes « MÉTHODE URL » sur l'entrée standard et EFFACER du magasin ce que chacune désigne : le corps ET le statut seul. Dit, par ligne et séparé par des tabulations, « verdict octets classe méthode url », verdict oublié, absent, non-cachable ou refus. Le seul geste qui retire UNE entrée : --purge efface tout, et --purge-older-than n'atteint jamais un objet qui sert, chaque service remettant sa date à maintenant. Écrit : demande le droit du service. Pas d'essai à blanc — --detient EST l'aperçu : il répond aux mêmes lignes, par les mêmes clés, sans rien modifier": "read « METHOD URL » lines on standard input and ERASE from the store what each one designates: the body AND the status-only entry. Says, per line and tab-separated, « verdict bytes class method url », verdict oublié, absent, non-cachable or refus. The only gesture that removes ONE entry: --purge erases everything, and --purge-older-than never reaches an object that serves, every service resetting its date to now. Writes: needs the service's rights. No dry run — --detient IS the preview: it answers the same lines, through the same keys, without modifying anything",
"entrée illisible : %v\n": "unreadable input: %v\n",
"exceptions illisibles : %v\n": "unreadable exceptions: %v\n",
"exception refusée : %v\n": "exception refused: %v\n",
"exception posée : %s %s\n": "exception added: %s %s\n",
"aucune exception pour %s\n": "no exception for %s\n",
"efface ce qui n'a pas servi depuis %s (avant %s)\n": "erasing what has not served for %s (before %s)\n",
"efface TOUT le cache": "erasing the WHOLE cache",
"purge des objets : %v\n": "object purge: %v\n",
"objets effacés : %d, %s rendus\n": "objects erased: %d, %s freed\n",
"purge des miroirs : %v\n": "mirror purge: %v\n",
"dépôts effacés : %d, %s rendus\n": "repositories erased: %d, %s freed\n",
"aucun dépôt en miroir": "no mirrored repository",
"%10s %d dépôts\n": "%10s %d repositories\n",
"effacement : %v\n": "erasure: %v\n",
"miroir effacé : %s\n": "mirror erased: %s\n",
"miroir git éteint : passer --git-mirror-dir": "git mirror disabled: pass --git-mirror-dir",
"liste illisible : %v\n": "unreadable list: %v\n",
"%d dépôts à tenir en miroir sous %s\n": "%d repositories to mirror under %s\n",
"%d en miroir, %d en échec, %s occupés\n": "%d mirrored, %d failed, %s used\n",
"état illisible : %v\n": "unreadable state: %v\n",
"autorité : %v\n": "authority: %v\n",
"autorité : %s\n": "authority: %s\n",
"empreinte : %s\n": "fingerprint: %s\n",
"miroir git demandé mais « git-http-backend » est introuvable : git sera relayé vers l'amont (%s)": "git mirror requested but « git-http-backend » is missing: git will be relayed upstream (%s)",
"le cache s'arrête : %v": "the cache stops: %v",
"%d écriture(s) interrompue(s) retirée(s)": "%d interrupted write(s) removed",
"écoute HTTP : %w": "HTTP listener: %w",
"écoute TLS : %w": "TLS listener: %w",
"cache : %s": "cache: %s",
"autorité : %s (%s)": "authority: %s (%s)",
"écoutes : http %d, tls %d": "listeners: http %d, tls %d",
"répertoire : %s\n": "directory : %s\n",
"objets : %d\n": "objects : %d\n",
"occupation : %s\n": "occupied : %s\n",
"plus ancien : aucun objet\n": "oldest : no object\n",
"plus ancien : %s\n": "oldest : %s\n",
"autorité : %s\n": "authority : %s\n",
"empreinte : %s\n": "fingerprint : %s\n",
"empreinte : autorité absente\n": "fingerprint : authority missing\n",
"dépôts git : %d en miroir, %s\n": "git repos : %d mirrored, %s\n",
"exceptions : aucune\n": "exceptions : none\n",
"exceptions : %d VM soustraite(s) au détournement\n": "exceptions : %d VM(s) excluded from redirection\n",
"\nAucune éviction n'est écrite : ce cache ne diminue jamais\n": "\nNo eviction is written: this cache never shrinks\n",
"de lui-même, et il vit sur le disque de l'orchestrateur.\n": "by itself, and it lives on the orchestrator's disk.\n",
"À blanc — rien n'est écrit, rien n'est posé.\n\n": "Dry run — nothing is written, nothing is set.\n\n",
"Répertoire du cache, créé au démarrage :\n %s\n\n": "Cache directory, created at startup:\n %s\n\n",
"Autorité, créée si elle manque :\n %s (clé en 0600)\n\n": "Authority, created if missing:\n %s (key in 0600)\n\n",
"Règles nft à poser sur l'hôte :\n": "nft rules to set on the host:\n",
"\nÀ défaut de nft :\n": "\nWithout nft:\n",
"\nRetrait :\n %s\n": "\nRemoval:\n %s\n",
"\nDans chaque VM qui utilise le cache :\n": "\nIn each VM that uses the cache:\n",
" %-7s %s/erplibre-cache.crt puis %s\n": " %-7s %s/erplibre-cache.crt then %s\n",
"clé de l'autorité illisible : %w": "unreadable authority key: %w",
"autorité illisible : PEM invalide": "unreadable authority: invalid PEM",
"tunnel opaque retenu pour %s (%d échec(s)) : %v": "opaque tunnel kept for %s (%d failure(s)): %v",
"poignée de main interrompue pour %s : %v": "handshake interrupted for %s: %v",
"tunnel impossible pour %q : destination inconnue (%v)": "tunnel impossible for %q: unknown destination (%v)",
"tunnel refusé pour %q : connexion non détournée, sa destination %s est cette écoute même": "tunnel refused for %q: connection not redirected, its destination %s is this very listener",
"tunnel vers %s : %v ; %s est déchiffré à la place": "tunnel to %s: %v; %s is decrypted instead",
"ranger à nouveau les objets du magasin sous la clé courante, et fondre les copies qu'un miroir portait sous plusieurs chemins ; service arrêté, et --dry-run pour ne que compter": "store the objects again under the current key, and merge the copies a mirror carried under several paths; service stopped, and --dry-run to only count",
"re-clé : %v\n": "re-key: %v\n",
"tunnel vers %s refermé après %s : %s vers l'amont, %s vers l'invité": "tunnel to %s closed after %s: %s upstream, %s to the guest",
"tunnel vers %s : %v": "tunnel to %s: %v",
"ce n'est pas une poignée de main TLS (type %d)": "not a TLS handshake (type %d)",
"longueur d'enregistrement invraisemblable : %d": "implausible record length: %d",
"la connexion n'est pas une socket TCP": "the connection is not a TCP socket",
"aucune destination d'origine : la connexion n'est pas redirigée": "no original destination: the connection is not redirected",
"interception transparente : Linux seulement": "transparent interception: Linux only",
"requête sans hôte : ni ligne absolue ni en-tête Host": "request without host: neither absolute line nor Host header",
"cache : écriture impossible pour %s : %v": "cache: cannot write %s: %v",
"cache : %s non gardé : %v": "cache: %s not kept: %v",
"erplibre_go_qemu_cache : amont injoignable et rien en réserve.\n demandé : %s\n classe : %s\n cause : %v\n%sCe fichier n'a jamais traversé ce cache. Rétablir le réseau, ou\ndéployer une VM identique à celle qui a rempli le cache.\n": "erplibre_go_qemu_cache: upstream unreachable and nothing in store.\n requested: %s\n class : %s\n cause : %v\n%sThis file never crossed this cache. Restore the network, or\ndeploy a VM identical to the one that filled the cache.\n",
"hors ligne, absent du cache : %s": "offline, missing from the cache: %s",
"corps tronqué : %d octets sur %d": "truncated body: %d bytes of %d",
"%d o": "%d B",
"%.1f Pio": "%.1f PiB",
"Kio": "KiB",
"Mio": "MiB",
"Gio": "GiB",
"Tio": "TiB",
"Objets du cache :": "Cache objects:",
"Dépôts en miroir :": "Mirrored repositories:",
"objets": "objects",
"dépôts": "repos",
"jour": "day",
"semaine": "week",
"mois": "month",
"L'établissement vers cet amont vient d'échouer : aucune connexion\nn'a été tentée pour cette requête, l'amont sera retenté sous peu.\n": "Connecting to this upstream just failed: no connection\nwas attempted for this request, upstream will be retried shortly.\n",
}