[pve-devel] [PATCH v3 guest-common 1/2] fix #1291: implement remove_vmid_from_backup_jobs
Christian Ebner
c.ebner at proxmox.com
Mon Jul 1 15:43:47 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>
---
PVE/VZDump/Plugin.pm | 46 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/PVE/VZDump/Plugin.pm b/PVE/VZDump/Plugin.pm
index 9933ef6..f415242 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::API2::Backup;
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