Rapporté, et c'est le pire défaut possible ici. Après avoir renommé une VM en « erplibre-ubuntu-2404-MIGRATION », le nettoyage offrait au « rm -f » son disque de 63 Go, son seed et son nvram — les trois attachés à une VM EN MARCHE. L'orphelinat se jugeait sur le NOM du fichier comparé aux noms de domaines ; un renommage suffisait donc à condamner une VM de production. L'autorité est désormais libvirt : ce qu'un domaine référence n'est pas orphelin, quel que soit son nom, et l'écran nomme ce qu'il conserve et pour qui. Un second contrôle, indépendant, épargne aussi ce qu'un processus tient ouvert. L'effacement d'une VM demande de même ses fichiers à libvirt : par le nom, il laissait les 63 Go derrière lui. --- EN --- Reported, and it is the worst possible defect here. After renaming a VM to "erplibre-ubuntu-2404-MIGRATION", cleanup offered its 63 GB disk, its seed and its nvram to "rm -f" — all three attached to a RUNNING VM. Orphanhood was judged on the file NAME against domain names; a rename was therefore enough to condemn a production VM. Libvirt is now the authority: what a domain references is not an orphan, whatever its name, and the screen names what it keeps and for whom. A second, independent check also spares whatever a process holds open. Deleting a VM likewise asks libvirt for its files: by name, it left the 63 GB behind. Assisted-by: Claude Opus 5 |
||
|---|---|---|
| .. | ||
| auto_ask.py | ||
| database_manager.py | ||
| deploy_form_lib.py | ||
| deploy_form_plan.py | ||
| kdbx_manager.py | ||
| logo_ascii.txt | ||
| migration_form.py | ||
| migration_stats.py | ||
| migration_status.py | ||
| migration_status_tui.py | ||
| proxmox_deploy_form.py | ||
| proxmox_menu.py | ||
| qemu_access.py | ||
| qemu_deploy.py | ||
| qemu_deploy_form.py | ||
| qemu_hardware.py | ||
| qemu_install.py | ||
| qemu_install_monitor.py | ||
| qemu_manage.py | ||
| qemu_menu.py | ||
| README.base.md | ||
| README.fr.md | ||
| README.md | ||
| source_todo.sh | ||
| textual_setup.py | ||
| todo.json | ||
| todo.py | ||
| todo_example.json | ||
| todo_file_browser.py | ||
| todo_i18n.py | ||
| todo_prefs.py | ||
| todo_telemetry.py | ||
| todo_upgrade.py | ||
| version_manager.py | ||
TODO is an assistant robot to use ERPLibre
Execute it with ./script/todo/todo.py or make todo.
For a new project, copy todo_example.json to private/todo/todo_override.json | private/todo/todo_override_private.json and edit it.
The mail/ package is the mail client reachable from Assistant > Mail:
several IMAP/SMTP accounts, a local cache, and a Textual TUI. See
../../doc/EMAIL.md.
Where the code lives
todo.py carries the menus and the general helpers. Everything around a
single subject sits in its own file, and the whole thing is assembled by
mixins on the TODO class — one file, one subject, its header states its
boundary.
| File | What it owns |
|---|---|
todo.py |
the menus, the configuration, the general helpers |
qemu_menu.py |
the QEMU/KVM menu, the image catalogue, the statistics |
qemu_deploy.py |
deciding then running a deployment |
qemu_install.py |
the recipes run inside a VM |
qemu_manage.py |
lifecycle, disks, hardware, cleanup, addresses |
qemu_access.py |
SSH, tunnels, consoles, Android emulator |
proxmox_menu.py |
the same, on a REMOTE Proxmox VE host |
The two deployment forms — libvirt here, Proxmox over there — ask the same questions, so they share a foundation rather than each holding a copy:
| File | What it owns |
|---|---|
deploy_form_lib.py |
pure logic (sizes, plan, totals, spec), the shared CSS, the resource-row factory, the progress view |
deploy_form_plan.py |
the plan's gestures: overrides, locks, copies, renaming, free values |
qemu_deploy_form.py |
what QEMU/KVM adds: desktops, tools, branches, install profiles |
proxmox_deploy_form.py |
what Proxmox adds: host, storage, bridge, VMID, address |
A form inherits PlanMixin and provides three hooks: which presets each
resource offers, the name a VM would fall back to, and what a lock freezes.
test_todo_deploy_form_lib.py fails if a form redefines a gesture the
foundation already carries — that is what keeps the architecture from drifting
back into two copies.