pmx 0.3.0
pmx 0.3.0
Proxmox command-line interface.
Install
Download the archive for your platform from the assets below, verify it
against pmx_0.3.0_SHA256SUMS, extract, and place pmx on your PATH.
Persona symlinks (optional)
pmx inspects how it was invoked (argv[0]) to decide which commands to
expose: named (or symlinked as) pve, it hoists the Proxmox VE groups to
the root; named pbs, it hoists the Proxmox Backup Server groups; named
pdm, it hoists the Proxmox Datacenter Manager groups. The archive ships
a single pmx binary — most archive formats (notably .zip, used for
the Windows build) do not reliably preserve symlinks, so create them
yourself after installing:
sudo ln -s pmx /usr/local/bin/pve
sudo ln -s pmx /usr/local/bin/pbs
sudo ln -s pmx /usr/local/bin/pdm(make install, when building from source, creates all three symlinks
automatically.) See the README's Personas section
for the full command surface each persona exposes.
Changelog
- 4e75ce0: docs(design): spell out the node auto-resolution rules (@wayneeseguin)
- 2cf1a87: feat(cli): name the target in the invocation audit record (@wayneeseguin)
- 2e7ef07: feat(config): name the config keys that no setting matches in context validate (@wayneeseguin)
- 08cfa08: feat(logx): stamp every record with the process id (@wayneeseguin)
- 9c3592d: feat(node): warn when vzdump/bulk vmid filters name non-resident guests (@wayneeseguin)
- 7dd371f: feat(scripts): audit PVE targets against operational best practices (@wayneeseguin)
- 8e01e36: feat(storage): resolve a storage's node from the cluster unless --node is explicit (@wayneeseguin)
- 9ad150e: feat: accept both spellings where the PVE API disagrees with itself (@wayneeseguin)
- 590293d: feat: let operators treat a task that finished with warnings as a failure (@wayneeseguin)
- f29c824: fix(apiclient): report tasks that finish with warnings (@wayneeseguin)
- 5c32d05: fix(auth): keep the OIDC authorization code out of errors and logs (@wayneeseguin)
- cda3156: fix(cli): cancel the root context on interrupt instead of dying mid-command (@wayneeseguin)
- 780fa78: fix(cli): resolve a guest's node from the cluster unless --node is explicit (@wayneeseguin)
- 1f92435: fix(cli): stop writing a log file for every shell-completion request (@wayneeseguin)
- f132348: fix(cli): treat an empty --node value as an absent flag (@wayneeseguin)
- d25b52f: fix(cluster): point HA group failures at HA rules (@wayneeseguin)
- faddc1d: fix(config): reject backslashes in keychain secrets (@wayneeseguin)
- 366926c: fix(context): enforce the fingerprint pin on resumed TLS sessions too (@wayneeseguin)
- 424921c: fix(context): honor fingerprint pinning and --insecure in validate --connect (@wayneeseguin)
- fde0b52: fix(context): keep the edit tempfile beside the config, not in /tmp (@wayneeseguin)
- c6d8374: fix(exec): keep shelled-out ssh interruptible, and never orphan it (@wayneeseguin)
- c351d1e: fix(lab): honor cancellation while waiting for cluster quorum (@wayneeseguin)
- 60776c9: fix(lab): say when a context sync has already rotated the token (@wayneeseguin)
- 1433809: fix(lab): validate every config value that reaches a remote root shell (@wayneeseguin)
- 7b804ae: fix(logx): collapse directories a prune did not empty itself, and tolerate a concurrent prune (@wayneeseguin)
- 341bdab: fix(node): name the concurrency limit migrateall requires (@wayneeseguin)
- e62bc63: fix(node): quieter and clearer replication node resolution (@wayneeseguin)
- b903c56: fix(node): resolve a replication job's node from its guest (@wayneeseguin)
- 8d418cb: fix(node): split --vmid/--vmids lists the way the server does (@wayneeseguin)
- 5207409: fix(nodeaddr): report a failed cluster-status lookup instead of falling back silently (@wayneeseguin)
- 6c08a57: fix(pbs): explain the retired per-datastore prune settings (@wayneeseguin)
- 3cbfaf6: fix(pbs): keep raw list entries paired with their sorted rows (@wayneeseguin)
- 07a2ad0: fix(pbs): tolerate endpoints that answer without a task handle (@wayneeseguin)
- 4439501: fix(pbs,pdm): treat an empty 200 response as success (@wayneeseguin)
- 0767067: fix(pdm): explain why nested-JSON auto-install flags are rejected (@wayneeseguin)
- f0b1af4: fix(qemu): write cputype alongside CPU flags (@wayneeseguin)
- ea0375e: fix(remote): stop root flags leaking into the rsync command line (@wayneeseguin)
- f33cfbb: fix(security): keep security list cluster-wide under an ambient default node (@wayneeseguin)
- babf0ba: fix(ssh): bound scripted ssh sessions with keepalives, not just connect time (@wayneeseguin)
- 6d5397f: fix(storage): make a file-restore listing usable as input (@wayneeseguin)
- 89f20ce: fix(storage): send the bare volume name when allocating (@wayneeseguin)
- 6b6ba81: fix(storage): stop guessing among non-shared storage carriers (@wayneeseguin)
- 5284188: fix(task): reject a --node that conflicts with a task's UPID (@wayneeseguin)
- ceae82a: fix(task): resolve the node from the UPID for task log, stop, and status (@wayneeseguin)
- 8392e4d: fix: keep GET/DELETE credentials out of logs, errors, and stderr (@wayneeseguin)
- 73fc11f: fix: stop treating an unreadable cluster state as a departed node (@wayneeseguin)
- 6ddc5a9: perf(security): read guest configs concurrently and stop aborting the audit (@wayneeseguin)
- 1f0630a: style(qemu): split help-list line writes to avoid string concatenation (@wayneeseguin)
- bb3f128: test(e2e): add destructive suites for PBS and PDM (@wayneeseguin)
- f6e1bd3: test(e2e): attribute verbs recorded through a shared helper (@wayneeseguin)
- 5860e31: test(e2e): count verbs recorded inside loops, and cover the root aliases (@wayneeseguin)
- dd2383c: test(e2e): drive the container template and file-restore verbs (@wayneeseguin)
- 4fbbb16: test(e2e): drive the two-node verbs against the lab cluster (@wayneeseguin)
- dd19324: test(e2e): make the destructive suite's node choice reproducible (@wayneeseguin)
- 1bd3aff: test(e2e): provision the storage the move verbs relocate to (@wayneeseguin)
- 5a726da: test(e2e): strip the TLS banner before truncating a failure reason (@wayneeseguin)