diff --git a/PVE/API2/Backup.pm b/PVE/API2/Backup.pm index b1ad6afc..9953a704 100644 --- a/PVE/API2/Backup.pm +++ b/PVE/API2/Backup.pm @@ -16,6 +16,7 @@ use PVE::Exception qw(raise_param_exc); use PVE::VZDump; use PVE::VZDump::Common; use PVE::Jobs; # for VZDump Jobs +use PVE::RS::CalendarEvent; use base qw(PVE::RESTHandler); @@ -117,6 +118,16 @@ __PACKAGE__->register_method({ foreach my $jobid (sort { $order->{$a} <=> $order->{$b} } keys %$jobs) { my $job = $jobs->{$jobid}; next if $job->{type} ne 'vzdump'; + + if (my $schedule = $job->{schedule}) { + # vzdump jobs are cluster wide, there maybe was no local run + # so simply calculate from now + my $last_run = time(); + my $calspec = PVE::RS::CalendarEvent->new($schedule); + my $next_run = $calspec->compute_next_event($last_run); + $job->{'next-run'} = $next_run if defined($next_run); + } + push @$res, $job; } diff --git a/www/manager6/dc/Backup.js b/www/manager6/dc/Backup.js index 6395ea2b..e92ae4aa 100644 --- a/www/manager6/dc/Backup.js +++ b/www/manager6/dc/Backup.js @@ -765,6 +765,22 @@ Ext.define('PVE.dc.BackupView', { sorter: (a, b) => (a.data.comment || '').localeCompare(b.data.comment || ''), flex: 1, }, + { + text: gettext('Next Run'), + dataIndex: 'next-run', + width: 150, + renderer: function(value) { + if (!value) { + return '-'; + } + + let now = new Date(), next = new Date(value * 1000); + if (next < now) { + return gettext('pending'); + } + return Proxmox.Utils.render_timestamp(value); + }, + }, { header: gettext('Retention'), dataIndex: 'prune-backups',