[pve-devel] [PATCH qemu-server v3 2/3] config: add special class that prevents writing the configuration

Fiona Ebner f.ebner at proxmox.com
Wed Feb 12 12:04:26 CET 2025


To be used in the context of template backup, where a minimized
temporary configuration is created to start the VM in 'prelaunch'
mode. Issue a warning, so that code paths where this happens will be
noted and can be evaluated and adapted.

Since the code currently doesn't use blessed config objects, special
dispatching is needed to potentially defer to the new child class in
the write_config() method.

Suggested-by: Fabian Grünbichler <f.gruenbichler at proxmox.com>
Suggested-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
Signed-off-by: Fiona Ebner <f.ebner at proxmox.com>
---

Changes in v3:
* use dedicated class

 PVE/Makefile              |  1 +
 PVE/QemuConfig.pm         | 15 +++++++++++++++
 PVE/QemuConfig/Makefile   |  5 +++++
 PVE/QemuConfig/NoWrite.pm | 25 +++++++++++++++++++++++++
 4 files changed, 46 insertions(+)
 create mode 100644 PVE/QemuConfig/Makefile
 create mode 100644 PVE/QemuConfig/NoWrite.pm

diff --git a/PVE/Makefile b/PVE/Makefile
index dc173681..440fbe77 100644
--- a/PVE/Makefile
+++ b/PVE/Makefile
@@ -11,4 +11,5 @@ install:
 	$(MAKE) -C VZDump install
 	$(MAKE) -C API2 install
 	$(MAKE) -C CLI install
+	$(MAKE) -C QemuConfig install
 	$(MAKE) -C QemuServer install
diff --git a/PVE/QemuConfig.pm b/PVE/QemuConfig.pm
index ffdf9f03..b60cc398 100644
--- a/PVE/QemuConfig.pm
+++ b/PVE/QemuConfig.pm
@@ -3,6 +3,8 @@ package PVE::QemuConfig;
 use strict;
 use warnings;
 
+use Scalar::Util qw(blessed);
+
 use PVE::AbstractConfig;
 use PVE::INotify;
 use PVE::JSONSchema;
@@ -561,6 +563,19 @@ sub get_derived_property {
     }
 }
 
+sub write_config {
+    my ($class, $vmid, $conf) = @_;
+
+    # Dispatch to class the object was blessed with if caller invoked the method via the
+    # 'PVE::QemuConfig' class name explicitly. This is hack, but the code currently doesn't
+    # generally use blessed config objects. Safeguard against infinite recursion.
+    if (blessed($conf) && !blessed($class)) {
+	return $conf->write_config($vmid, $conf);
+    }
+
+    return $class->SUPER::write_config($vmid, $conf);
+}
+
 # END implemented abstract methods from PVE::AbstractConfig
 
 sub has_cloudinit {
diff --git a/PVE/QemuConfig/Makefile b/PVE/QemuConfig/Makefile
new file mode 100644
index 00000000..c3a0d277
--- /dev/null
+++ b/PVE/QemuConfig/Makefile
@@ -0,0 +1,5 @@
+SOURCES=NoWrite.pm
+
+.PHONY: install
+install: ${SOURCES}
+	for i in ${SOURCES}; do install -D -m 0644 $$i ${DESTDIR}${PERLDIR}/PVE/QemuConfig/$$i; done
diff --git a/PVE/QemuConfig/NoWrite.pm b/PVE/QemuConfig/NoWrite.pm
new file mode 100644
index 00000000..f697506f
--- /dev/null
+++ b/PVE/QemuConfig/NoWrite.pm
@@ -0,0 +1,25 @@
+package PVE::QemuConfig::NoWrite;
+
+use strict;
+use warnings;
+
+use PVE::RESTEnvironment qw(log_warn);
+
+use base qw(PVE::QemuConfig);
+
+sub new {
+    my ($class, $conf) = @_;
+
+    bless($conf, $class);
+
+    return $conf;
+}
+
+sub write_config {
+    my ($class, $vmid, $conf) = @_;
+
+    log_warn("refusing to write temporary configuration");
+    return;
+}
+
+1;
-- 
2.39.5





More information about the pve-devel mailing list