From: Stoiko Ivanov Date: Mon, 16 Nov 2020 11:01:11 +0000 (+0100) Subject: Add API2 module for PBS configuration X-Git-Url: https://git.proxmox.com/?p=pmg-api.git;a=commitdiff_plain;h=5d031987c4b2b6cfea681a29204f92ed8a8172f2 Add API2 module for PBS configuration The module provides the API methods for creating/updating/listing/deleting PBS remotes Signed-off-by: Stoiko Ivanov --- diff --git a/src/Makefile b/src/Makefile index daa9d46..5add6af 100644 --- a/src/Makefile +++ b/src/Makefile @@ -137,6 +137,7 @@ LIBSOURCES = \ PMG/API2/Statistics.pm \ PMG/API2/MailTracker.pm \ PMG/API2/Backup.pm \ + PMG/API2/PBS/Remote.pm \ PMG/API2/Nodes.pm \ PMG/API2/Postfix.pm \ PMG/API2/Quarantine.pm \ diff --git a/src/PMG/API2/Config.pm b/src/PMG/API2/Config.pm index d4a9679..e11eb3f 100644 --- a/src/PMG/API2/Config.pm +++ b/src/PMG/API2/Config.pm @@ -25,6 +25,7 @@ use PMG::API2::Fetchmail; use PMG::API2::DestinationTLSPolicy; use PMG::API2::DKIMSign; use PMG::API2::SACustom; +use PMG::API2::PBS::Remote; use base qw(PVE::RESTHandler); @@ -93,6 +94,11 @@ __PACKAGE__->register_method({ path => 'customscores', }); +__PACKAGE__->register_method ({ + subclass => "PMG::API2::PBS::Remote", + path => 'pbs', +}); + __PACKAGE__->register_method ({ name => 'index', path => '', @@ -131,6 +137,7 @@ __PACKAGE__->register_method ({ push @$res, { section => 'regextest' }; push @$res, { section => 'tlspolicy' }; push @$res, { section => 'dkim' }; + push @$res, { section => 'pbs' }; return $res; }}); diff --git a/src/PMG/API2/PBS/Remote.pm b/src/PMG/API2/PBS/Remote.pm new file mode 100644 index 0000000..3af90c3 --- /dev/null +++ b/src/PMG/API2/PBS/Remote.pm @@ -0,0 +1,231 @@ +package PMG::API2::PBS::Remote; + +use strict; +use warnings; + +use PVE::SafeSyslog; +use PVE::Tools qw(extract_param); +use PVE::JSONSchema qw(get_standard_option); +use PVE::RESTHandler; +use PVE::PBSClient; + +use PMG::PBSConfig; + +use base qw(PVE::RESTHandler); + +__PACKAGE__->register_method ({ + name => 'list', + path => '', + method => 'GET', + description => "List all configured Proxmox Backup Server instances.", + permissions => { check => [ 'admin', 'audit' ] }, + proxyto => 'master', + protected => 1, + parameters => { + additionalProperties => 0, + properties => {} + }, + returns => { + type => "array", + items => PMG::PBSConfig->createSchema(1), + links => [ { rel => 'child', href => "{remote}" } ], + }, + code => sub { + my ($param) = @_; + + my $res = []; + + my $conf = PMG::PBSConfig->new(); + + if (defined($conf)) { + foreach my $remote (keys %{$conf->{ids}}) { + my $d = $conf->{ids}->{$remote}; + my $entry = { + remote => $remote, + server => $d->{server}, + datastore => $d->{datastore}, + username => $d->{username}, + disable => $d->{disable}, + }; + push @$res, $entry; + } + } + + return $res; + }}); + +__PACKAGE__->register_method ({ + name => 'create', + path => '', + method => 'POST', + description => "Add Proxmox Backup Server instance.", + permissions => { check => [ 'admin' ] }, + proxyto => 'master', + protected => 1, + parameters => PMG::PBSConfig->createSchema(1), + returns => { type => 'null' } , + code => sub { + my ($param) = @_; + + my $code = sub { + + my $conf = PMG::PBSConfig->new(); + $conf->{ids} //= {}; + my $ids = $conf->{ids}; + + my $remote = extract_param($param, 'remote'); + die "PBS remote '$remote' already exists\n" + if $ids->{$remote}; + + my $remotecfg = PMG::PBSConfig->check_config($remote, $param, 1); + + my $password = extract_param($remotecfg, 'password'); + + my $pbs = PVE::PBSClient->new($remotecfg, $remote, $conf->{secret_dir}); + $pbs->set_password($password) if defined($password); + + $ids->{$remote} = $remotecfg; + $conf->write(); + }; + + PMG::PBSConfig::lock_config($code, "add PBS remote failed"); + + return undef; + }}); + +__PACKAGE__->register_method ({ + name => 'read_config', + path => '{remote}', + method => 'GET', + description => "Get PBS remote configuration.", + proxyto => 'master', + permissions => { check => [ 'admin', 'audit' ] }, + parameters => { + additionalProperties => 1, + properties => { + remote => { + description => "Proxmox Backup Server ID.", + type => 'string', format => 'pve-configid', + }, + }, + }, + returns => {}, + code => sub { + my ($param) = @_; + + my $conf = PMG::PBSConfig->new(); + + my $remote = $param->{remote}; + + my $data = $conf->{ids}->{$remote}; + die "PBS remote '$remote' does not exist\n" if !$data; + + delete $data->{type}; + + $data->{digest} = $conf->{digest}; + $data->{remote} = $remote; + + return $data; + }}); + +__PACKAGE__->register_method ({ + name => 'update_config', + path => '{remote}', + method => 'PUT', + description => "Update PBS remote settings.", + permissions => { check => [ 'admin' ] }, + protected => 1, + proxyto => 'master', + parameters => PMG::PBSConfig->updateSchema(), + returns => { type => 'null' }, + code => sub { + my ($param) = @_; + + my $code = sub { + + my $conf = PMG::PBSConfig->new(); + my $ids = $conf->{ids}; + + my $digest = extract_param($param, 'digest'); + PVE::SectionConfig::assert_if_modified($conf, $digest); + + my $remote = extract_param($param, 'remote'); + + die "PBS remote '$remote' does not exist\n" + if !$ids->{$remote}; + + my $delete_str = extract_param($param, 'delete'); + die "no options specified\n" + if !$delete_str && !scalar(keys %$param); + + my $pbs = PVE::PBSClient->new($ids->{$remote}, $remote, $conf->{secret_dir}); + foreach my $opt (PVE::Tools::split_list($delete_str)) { + if ($opt eq 'password') { + $pbs->delete_password(); + } + + delete $ids->{$remote}->{$opt}; + } + + if (defined(my $password = extract_param($param, 'password'))) { + $pbs->set_password($password); + } + + my $remoteconfig = PMG::PBSConfig->check_config($remote, $param, 0, 1); + + foreach my $p (keys %$remoteconfig) { + $ids->{$remote}->{$p} = $remoteconfig->{$p}; + } + + $conf->write(); + }; + + PMG::PBSConfig::lock_config($code, "update PBS remote failed"); + + return undef; + }}); + +__PACKAGE__->register_method ({ + name => 'delete', + path => '{remote}', + method => 'DELETE', + description => "Delete an PBS remote", + permissions => { check => [ 'admin' ] }, + protected => 1, + proxyto => 'master', + parameters => { + additionalProperties => 0, + properties => { + remote => { + description => "Profile ID.", + type => 'string', format => 'pve-configid', + }, + } + }, + returns => { type => 'null' }, + code => sub { + my ($param) = @_; + + my $code = sub { + + my $conf = PMG::PBSConfig->new(); + my $ids = $conf->{ids}; + + my $remote = $param->{remote}; + + die "PBS remote '$remote' does not exist\n" + if !$ids->{$remote}; + + my $pbs = PVE::PBSClient->new($ids->{$remote}, $remote, $conf->{secret_dir}); + $pbs->delete_password($remote); + delete $ids->{$remote}; + + $conf->write(); + }; + + PMG::PBSConfig::lock_config($code, "delete PBS remote failed"); + + return undef; + }}); + +1;