mirror of
https://git.proxmox.com/git/pve-manager
synced 2025-08-10 18:02:34 +00:00
fix #2609 api: backupinfo: add non job specific endpoint
Adds a new api endpoint at cluster/backupinfo for cluster wide backup stuff. This is necessary because cluster/backup expects a backup job ID at the next level and thus other endpoints are hard to impossible to implement under that hierarchy. The only api endpoint available for now is the `not_backed_up` which returns a list of all guests which are not covered by any backup job. The top level index endpoint is left unsused for now to be available for a more generic summary endpoint in the future. Signed-off-by: Aaron Lauterer <a.lauterer@proxmox.com>
This commit is contained in:
parent
01ad47af9e
commit
f26c7b54e0
145
PVE/API2/BackupInfo.pm
Normal file
145
PVE/API2/BackupInfo.pm
Normal file
@ -0,0 +1,145 @@
|
||||
package PVE::API2::BackupInfo;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Digest::SHA;
|
||||
|
||||
use PVE::SafeSyslog;
|
||||
use PVE::Tools qw(extract_param);
|
||||
use PVE::Cluster qw(cfs_lock_file cfs_read_file cfs_write_file);
|
||||
use PVE::RESTHandler;
|
||||
use PVE::RPCEnvironment;
|
||||
use PVE::JSONSchema;
|
||||
use PVE::Storage;
|
||||
use PVE::Exception qw(raise_param_exc);
|
||||
use PVE::VZDump;
|
||||
use PVE::VZDump::Common;
|
||||
|
||||
use base qw(PVE::RESTHandler);
|
||||
|
||||
sub map_job_vmids {
|
||||
my ($job_included_guests, $included_vmids) = @_;
|
||||
|
||||
for my $node_vmids (values %{$job_included_guests}) {
|
||||
for my $vmid (@{$node_vmids}) {
|
||||
$included_vmids->{$vmid} = 1;
|
||||
}
|
||||
}
|
||||
|
||||
return $included_vmids;
|
||||
}
|
||||
|
||||
sub get_included_vmids {
|
||||
my $included_vmids = {};
|
||||
my $vzconf = cfs_read_file('vzdump.cron');
|
||||
|
||||
my $all_jobs = $vzconf->{jobs} || [];
|
||||
|
||||
for my $job (@$all_jobs) {
|
||||
my $job_included_guests = PVE::VZDump::get_included_guests($job);
|
||||
$included_vmids = map_job_vmids($job_included_guests, $included_vmids);
|
||||
}
|
||||
|
||||
return $included_vmids;
|
||||
}
|
||||
|
||||
__PACKAGE__->register_method({
|
||||
name => 'get_backupinfo',
|
||||
path => '',
|
||||
method => 'GET',
|
||||
protected => 1,
|
||||
description => "Stub, waits for future use.",
|
||||
parameters => {
|
||||
additionalProperties => 0,
|
||||
properties => {},
|
||||
},
|
||||
returns => {
|
||||
type => 'string',
|
||||
description => 'Shows stub message',
|
||||
},
|
||||
code => sub {
|
||||
return "Stub endpoint. There is nothing here yet.";
|
||||
}});
|
||||
|
||||
__PACKAGE__->register_method({
|
||||
name => 'get_guests_not_in_backup',
|
||||
path => 'not_backed_up',
|
||||
method => 'GET',
|
||||
protected => 1,
|
||||
description => "Shows all guests which are not covered by any backup job.",
|
||||
permissions => {
|
||||
check => ['perm', '/', ['Sys.Audit']],
|
||||
},
|
||||
parameters => {
|
||||
additionalProperties => 0,
|
||||
properties => {},
|
||||
},
|
||||
returns => {
|
||||
type => 'array',
|
||||
description => 'Contains the guest objects.',
|
||||
items => {
|
||||
type => 'object',
|
||||
properties => {
|
||||
vmid => {
|
||||
type => 'integer',
|
||||
description => 'VMID of the guest.',
|
||||
},
|
||||
name => {
|
||||
type => 'string',
|
||||
description => 'Name of the guest',
|
||||
optional => 1,
|
||||
},
|
||||
type => {
|
||||
type => 'string',
|
||||
description => 'Type of the guest.',
|
||||
enum => ['qemu', 'lxc'],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
code => sub {
|
||||
my $rpcenv = PVE::RPCEnvironment::get();
|
||||
my $user = $rpcenv->get_user();
|
||||
my $rrd = PVE::Cluster::rrd_dump();
|
||||
my $included_vmids = get_included_vmids();
|
||||
my $vmlist = PVE::Cluster::get_vmlist();
|
||||
my @vmids = ( keys %{$vmlist->{ids}} );
|
||||
|
||||
# remove VMIDs to which the user has no permission to not leak infos
|
||||
# like the guest name
|
||||
my @allowed_vmids = grep {
|
||||
$rpcenv->check($user, "/vms/$_", [ 'VM.Audit' ], 1);
|
||||
} @vmids;
|
||||
|
||||
my $result = [];
|
||||
|
||||
for my $vmid (@allowed_vmids) {
|
||||
|
||||
next if $included_vmids->{$vmid};
|
||||
|
||||
my $type = $vmlist->{ids}->{$vmid}->{type};
|
||||
my $node = $vmlist->{ids}->{$vmid}->{node};
|
||||
|
||||
my $conf;
|
||||
my $name = "";
|
||||
|
||||
if ($type eq 'qemu') {
|
||||
$conf = PVE::QemuConfig->load_config($vmid, $node);
|
||||
$name = $conf->{name};
|
||||
} elsif ($type eq 'lxc') {
|
||||
$conf = PVE::LXC::Config->load_config($vmid, $node);
|
||||
$name = $conf->{hostname};
|
||||
} else {
|
||||
die "VMID $vmid is neither Qemu nor LXC guest\n";
|
||||
}
|
||||
|
||||
push @{$result}, {
|
||||
vmid => int($vmid),
|
||||
name => $name,
|
||||
type => $type,
|
||||
};
|
||||
}
|
||||
|
||||
return $result;
|
||||
}});
|
||||
1;
|
@ -23,6 +23,7 @@ use PVE::Tools qw(extract_param);
|
||||
use PVE::API2::ACMEAccount;
|
||||
use PVE::API2::ACMEPlugin;
|
||||
use PVE::API2::Backup;
|
||||
use PVE::API2::BackupInfo;
|
||||
use PVE::API2::Cluster::Ceph;
|
||||
use PVE::API2::ClusterConfig;
|
||||
use PVE::API2::Firewall::Cluster;
|
||||
@ -57,6 +58,11 @@ __PACKAGE__->register_method ({
|
||||
path => 'backup',
|
||||
});
|
||||
|
||||
__PACKAGE__->register_method ({
|
||||
subclass => "PVE::API2::BackupInfo",
|
||||
path => 'backupinfo',
|
||||
});
|
||||
|
||||
__PACKAGE__->register_method ({
|
||||
subclass => "PVE::API2::HAConfig",
|
||||
path => 'ha',
|
||||
|
@ -10,6 +10,7 @@ PERLSOURCE = \
|
||||
Subscription.pm \
|
||||
VZDump.pm \
|
||||
Backup.pm \
|
||||
BackupInfo.pm \
|
||||
Cluster.pm \
|
||||
HAConfig.pm \
|
||||
Nodes.pm \
|
||||
|
Loading…
Reference in New Issue
Block a user