From 97ac6c04e855895c8601857ec0bc01d02fd2fe0a Mon Sep 17 00:00:00 2001 From: nexxo Date: Sat, 1 Aug 2026 03:42:37 +0200 Subject: [PATCH] =?UTF-8?q?Release=20v1.3.87=20=E2=80=94=20VM.Monitor=20gi?= =?UTF-8?q?bt=20es=20in=20Proxmox=209=20nicht=20mehr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Übernahme des ersten PVE-9-Hosts blieb in CreateAutomationToken stehen: `pveum role modify` lehnt die GANZE Privilegienliste ab, sobald ein einziger Name darin unbekannt ist — "invalid privilege 'VM.Monitor'". Die Liste stammt aus der PVE-8-Zeit. Ersatzlos gestrichen, nicht ersetzt: VM.Monitor gab Zugriff auf den QEMU-Monitor, und den benutzt CluPilot nirgends. Geprüft, nicht vermutet — die einzigen Treffer auf "monitor" im Provisioning betreffen Uptime Kuma. Auf PVE 8 fehlt damit ein Recht, das dort ohnehin niemand gebraucht hat; eine Liste passt weiterhin auf beide Fassungen. Dazu ein Test, der die angeforderten Namen gegen die gültigen hält — abgelesen aus der Administrator-Rolle eines echten PVE 9. Die Liste ist die Verabredung zwischen CluPilot und jedem Host, den es je übernimmt; sie hier zu prüfen ist billiger als der Abbruch auf einer Maschine, die schon halb eingerichtet ist. 2245 Tests grün. Co-Authored-By: Claude Opus 5 --- VERSION | 2 +- config/provisioning.php | 16 ++++++++++- tests/Feature/Provisioning/HostStepsTest.php | 29 ++++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index f77f159..4ba0b73 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.86 +1.3.87 diff --git a/config/provisioning.php b/config/provisioning.php index 61cc57a..813d572 100644 --- a/config/provisioning.php +++ b/config/provisioning.php @@ -449,8 +449,22 @@ return [ | covers the datacenter firewall if that ever moves off SSH and onto the | API. It is granted on `/` because both endpoints check `/` and nothing | narrower would satisfy them. + | + | `VM.Monitor` stand hier und ist am 1. August 2026 herausgeflogen: PVE 9 + | kennt es nicht mehr, und `pveum role modify` lehnt die GANZE Liste ab, + | sobald ein Name darin unbekannt ist — „invalid privilege 'VM.Monitor'". + | Die Übernahme des ersten PVE-9-Hosts blieb damit in + | CreateAutomationToken stehen, fünf Wiederholungen lang. + | + | Ersatzlos gestrichen, nicht ersetzt: es gab Zugriff auf den + | QEMU-Monitor, und den benutzt CluPilot nirgends — geprüft, nicht + | vermutet. Auf PVE 8 fehlt damit ein Recht, das dort ohnehin niemand + | gebraucht hat, also passt eine Liste weiterhin auf beide Fassungen. + | + | Wenn hier je wieder etwas dazukommt: die gültigen Namen stehen auf dem + | Host selbst, in der Administrator-Rolle aus `pveum role list`. */ - 'role_privs' => 'VM.Allocate,VM.Clone,VM.Config.Disk,VM.Config.CPU,VM.Config.Memory,VM.Config.Network,VM.Config.Options,VM.Config.Cloudinit,VM.PowerMgmt,VM.Monitor,VM.Audit,VM.Backup,VM.GuestAgent.Audit,VM.GuestAgent.Unrestricted,Datastore.AllocateSpace,Datastore.Audit,Sys.Audit,Sys.Modify', + 'role_privs' => 'VM.Allocate,VM.Clone,VM.Config.Disk,VM.Config.CPU,VM.Config.Memory,VM.Config.Network,VM.Config.Options,VM.Config.Cloudinit,VM.PowerMgmt,VM.Audit,VM.Backup,VM.GuestAgent.Audit,VM.GuestAgent.Unrestricted,Datastore.AllocateSpace,Datastore.Audit,Sys.Audit,Sys.Modify', 'user' => 'automation@pve', 'token_name' => 'clupilot', ], diff --git a/tests/Feature/Provisioning/HostStepsTest.php b/tests/Feature/Provisioning/HostStepsTest.php index ca836b5..6db8db1 100644 --- a/tests/Feature/Provisioning/HostStepsTest.php +++ b/tests/Feature/Provisioning/HostStepsTest.php @@ -1342,3 +1342,32 @@ it('names the reason pveum gave instead of only that it failed', function () { // in einer Ereigniszeile. ->and($result->reason)->not->toContain('USAGE'); }); + +it('asks only for privileges Proxmox 9 still knows', function () { + // `pveum role modify` lehnt die GANZE Liste ab, sobald ein Name darin + // unbekannt ist. `VM.Monitor` gibt es in PVE 9 nicht mehr, und die + // Übernahme des ersten PVE-9-Hosts blieb daran hängen — fünf + // Wiederholungen mit einer Meldung, die den Namen nicht nannte. + // + // Die Liste ist die Verabredung zwischen CluPilot und jedem Host, den es je + // übernimmt. Sie gegen die gültigen Namen zu halten, ist billiger als der + // Abbruch auf einer Maschine, die schon halb eingerichtet ist. + $gueltig = [ + 'Datastore.Allocate', 'Datastore.AllocateSpace', 'Datastore.AllocateTemplate', 'Datastore.Audit', + 'Group.Allocate', 'Mapping.Audit', 'Mapping.Modify', 'Mapping.Use', 'Permissions.Modify', + 'Pool.Allocate', 'Pool.Audit', 'Realm.Allocate', 'Realm.AllocateUser', + 'SDN.Allocate', 'SDN.Audit', 'SDN.Use', + 'Sys.AccessNetwork', 'Sys.Audit', 'Sys.Console', 'Sys.Incoming', 'Sys.Modify', + 'Sys.PowerMgmt', 'Sys.Syslog', 'User.Modify', + 'VM.Allocate', 'VM.Audit', 'VM.Backup', 'VM.Clone', + 'VM.Config.CDROM', 'VM.Config.CPU', 'VM.Config.Cloudinit', 'VM.Config.Disk', + 'VM.Config.HWType', 'VM.Config.Memory', 'VM.Config.Network', 'VM.Config.Options', + 'VM.Console', 'VM.GuestAgent.Audit', 'VM.GuestAgent.FileRead', + 'VM.GuestAgent.FileSystemMgmt', 'VM.GuestAgent.FileWrite', 'VM.GuestAgent.Unrestricted', + 'VM.Migrate', 'VM.PowerMgmt', 'VM.Replicate', 'VM.Snapshot', 'VM.Snapshot.Rollback', + ]; + + $angefordert = explode(',', (string) config('provisioning.proxmox.role_privs')); + + expect(array_diff($angefordert, $gueltig))->toBe([]); +});