[pve-devel] [PATCH v4 guest-common 2/2] fix #1291: implement remove_vmid_from_backup_jobs

Christian Ebner c.ebner at proxmox.com
Tue Oct 15 13:00:20 CEST 2019


remove_vmid_from_backup_jobs updates the vzdump.cron backup jobs,
excluding the given vmid.

Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
---
version 4:
    * VZDump::Common cfs registers vzdump.cron instead of PVE::VZDump

 PVE/VZDump/Plugin.pm | 46 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/PVE/VZDump/Plugin.pm b/PVE/VZDump/Plugin.pm
index 9933ef6..73bbae1 100644
--- a/PVE/VZDump/Plugin.pm
+++ b/PVE/VZDump/Plugin.pm
@@ -7,6 +7,8 @@ use POSIX qw(strftime);
 
 use PVE::Tools;
 use PVE::SafeSyslog;
+use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file);
+use PVE::VZDump::Common; # register parser/writer for vzdump.cron
 
 my $log_level = {
     err =>  'ERROR:',
@@ -168,4 +170,48 @@ sub cleanup {
     die "internal error"; # implement in subclass
 }
 
+sub remove_vmid_from_list {
+    my ($list, $rm_vmid) = @_;
+    # this removes the given vmid from the list, if present
+    return join(',', grep { $_ ne $rm_vmid } PVE::Tools::split_list($list));
+}
+
+sub remove_vmid_from_jobs {
+    my ($jobs, $exclude_vmid) = @_;
+
+    my $updated_jobs = [];
+    foreach my $job (@$jobs) {
+	if (defined $job->{vmid}) {
+	    my $list = remove_vmid_from_list($job->{vmid}, $exclude_vmid);
+	    if ($list) {
+		$job->{vmid} = $list;
+		push @$updated_jobs, $job;
+	    }
+	} elsif (defined $job->{exclude}) {
+	    my $list = remove_vmid_from_list($job->{exclude}, $exclude_vmid);
+	    if ($list) {
+		$job->{exclude} = $list;
+	    } else {
+		delete $job->{exclude};
+	    }
+	    push @$updated_jobs, $job;
+	} else {
+	    push @$updated_jobs, $job;
+	}
+    }
+    return $updated_jobs;
+}
+
+sub remove_vmid_from_backup_jobs {
+    my ($vmid) = @_;
+
+    cfs_lock_file('vzdump.cron', undef, sub {
+	my $vzdump_jobs = cfs_read_file('vzdump.cron');
+	my $jobs = $vzdump_jobs->{jobs} || [];
+	$vzdump_jobs->{jobs} = remove_vmid_from_jobs($jobs, $vmid);
+	cfs_write_file('vzdump.cron', $vzdump_jobs);
+    });
+    die "$@" if ($@);
+}
+
 1;
-- 
2.20.1




More information about the pve-devel mailing list