Signed-off-by: Alexandre Derumier <aderum...@odiso.com> --- PVE/API2/Qemu.pm | 1 + PVE/QemuServer/Cloudinit.pm | 47 ++++++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-)
diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm index cc58744..8ac3ae3 100644 --- a/PVE/API2/Qemu.pm +++ b/PVE/API2/Qemu.pm @@ -1063,6 +1063,7 @@ __PACKAGE__->register_method({ path => '{vmid}/cloudinit', method => 'GET', proxyto => 'node', + protected => '1', description => "Get the cloudinit configuration with both current and pending values.", permissions => { check => ['perm', '/vms/{vmid}', [ 'VM.Audit' ]], diff --git a/PVE/QemuServer/Cloudinit.pm b/PVE/QemuServer/Cloudinit.pm index 156e073..917511e 100644 --- a/PVE/QemuServer/Cloudinit.pm +++ b/PVE/QemuServer/Cloudinit.pm @@ -607,11 +607,56 @@ sub dump_cloudinit_config { } } +sub extract_cloudinit_config { + my ($conf, $vmid) = @_; + + my $current_drive = undef; + PVE::QemuConfig->foreach_volume($conf, sub { + my ($ds, $drive) = @_; + $current_drive = $drive if PVE::QemuServer::drive_is_cloudinit($drive); + + }); + + my $running = PVE::QemuServer::check_running($vmid); + my $storecfg = PVE::Storage::config(); + my $iso_path = PVE::Storage::path($storecfg, $current_drive->{file}); + my ($storeid, $volname) = PVE::Storage::parse_volume_id($current_drive->{file}, 1); + my $scfg = PVE::Storage::storage_config($storecfg, $storeid); + my $format = PVE::QemuServer::qemu_img_format($scfg, $volname); + my $plugin = PVE::Storage::Plugin->lookup($scfg->{type}); + $plugin->activate_volume($storeid, $scfg, $volname) if !$running; + + my $raw_cloudinit_config = undef; + + my $path = "/run/pve/cloudinit_current/$vmid"; + mkpath $path; + my $parser = sub { + my $line = shift; + $raw_cloudinit_config .= "$line\n"; + }; + eval { + #qemu-img dd is really slower (5s) than convert (0.2s) + run_command([ + ['qemu-img', 'convert', '-f', 'raw', '-O', 'raw', "$iso_path", "$path/iso"] + ]); + + run_command([ + ['isoinfo', '-i', "$path/iso", '-x', "/PROXMOX/VMCONF.\;1"] + ], outfunc => $parser); + }; + rmtree($path); + $plugin->deactivate_volume($storeid, $scfg, $volname) if !$running; + + my $cloudinit_config = PVE::QemuServer::parse_vm_config("/qemu-server/$vmid.conf", $raw_cloudinit_config); + return $cloudinit_config; +} + sub get_pending_config { my ($conf, $vmid) = @_; + my $newconf = { %{$conf} }; - my $cloudinit_current = $newconf->{cloudinit}; + my $cloudinit_current = extract_cloudinit_config($conf, $vmid); my @cloudinit_opts = keys %{PVE::QemuServer::cloudinit_config_properties()}; push @cloudinit_opts, 'name'; -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel