~/.ssh/config entries were only ever written while deploying a VM. A fleet that already exists — or one whose DHCP leases have moved — had no way to refresh them. Entry [13] of the QEMU menu does it on demand: [1] update ~/.ssh/config for the local VMs [2] add the nested VMs through ProxyJump, recursively The second one matters because of the « ERPLibre Deployment (+ QEMU + dev) » profile: a VM built that way hosts VMs of its own, on its own private network. Those are not reachable from this host at all — only from their parent. So each level is written with a ProxyJump to the level above, and OpenSSH chains the hops on its own. « ssh erplibre-fedora-42 » then works from here even though the address only means something two machines away. The recursion probes over « ssh <alias> », i.e. through the block just written, so the parent's own ProxyJump applies automatically and one probe works identically at any depth. One SSH connection per MACHINE, not per VM: a single snippet returns every « name<TAB>ip » pair, falling back to the guest agent when the dnsmasq lease is missing. Passwordless sudo is a given here — the cloud-init config grants it (deploy_qemu.py:1175). A nested VM keeps its short name, which is what one wants to type, and is only prefixed with its parent on collision — so discovering a machine that already exists elsewhere never overwrites the other one's entry. Depth defaults to 2 (host, VM, nested VM) and already-seen aliases are skipped, which is what stops a cycle: a child that reports its own grandparent. Verified on a simulated two-level fleet including a deliberate cycle: the ProxyJump chain is correct at each level, the colliding name is prefixed, the parent block is not overwritten, and only one probe per machine is issued. The remote snippet itself was run for real on this host — valid POSIX sh, two VMs with their addresses. A VM without an IP is skipped rather than written with an empty HostName. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| database_manager.py | ||
| kdbx_manager.py | ||
| logo_ascii.txt | ||
| migration_form.py | ||
| qemu_deploy_form.py | ||
| qemu_install_monitor.py | ||
| README.base.md | ||
| README.fr.md | ||
| README.md | ||
| source_todo.sh | ||
| 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.