From: Stoiko Ivanov <s.ivanov@proxmox.com>
To: pmg-devel@lists.proxmox.com
Subject: [pmg-devel] [PATCH pmg-api v3 3/7] Add API2 module for PBS configuration
Date: Mon, 16 Nov 2020 12:01:11 +0100 [thread overview]
Message-ID: <20201116110118.7483-5-s.ivanov@proxmox.com> (raw)
In-Reply-To: <20201116110118.7483-1-s.ivanov@proxmox.com>
The module provides the API methods for creating/updating/listing/deleting
PBS remotes
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
---
src/Makefile | 1 +
src/PMG/API2/Config.pm | 7 ++
src/PMG/API2/PBS/Remote.pm | 231 +++++++++++++++++++++++++++++++++++++
3 files changed, 239 insertions(+)
create mode 100644 src/PMG/API2/PBS/Remote.pm
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;
--
2.20.1
next prev parent reply other threads:[~2020-11-16 11:02 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-16 11:01 [pmg-devel] [PATCH pve-common/pmg-api/pmg-gui v3] add initial PBS integration Stoiko Ivanov
2020-11-16 11:01 ` [pmg-devel] [PATCH pve-common v3 1/1] add PBSClient module Stoiko Ivanov
2020-11-17 8:49 ` [pmg-devel] applied: " Thomas Lamprecht
2020-11-16 11:01 ` [pmg-devel] [PATCH pmg-api v3 1/7] debian: drop duplicate ', ' in dependencies Stoiko Ivanov
2020-11-16 11:01 ` [pmg-devel] [PATCH pmg-api v3 2/7] add initial SectionConfig for PBS Stoiko Ivanov
2020-11-16 11:01 ` Stoiko Ivanov [this message]
2020-11-16 11:01 ` [pmg-devel] [PATCH pmg-api v3 4/7] Add API2 module for per-node backups to PBS Stoiko Ivanov
2020-11-16 11:01 ` [pmg-devel] [PATCH pmg-api v3 5/7] pbs-integration: add CLI calls to pmgbackup Stoiko Ivanov
2020-11-16 11:01 ` [pmg-devel] [PATCH pmg-api v3 6/7] add scheduled backup to PBS remotes Stoiko Ivanov
2020-11-16 11:01 ` [pmg-devel] [PATCH pmg-api v3 7/7] add /etc/pmg/pbs to cluster-sync Stoiko Ivanov
2020-11-16 11:01 ` [pmg-devel] [PATCH pmg-gui v3 1/3] Make Backup/Restore panel a menuentry Stoiko Ivanov
2020-11-16 11:01 ` [pmg-devel] [PATCH pmg-gui v3 2/3] refactor RestoreWindow for PBS Stoiko Ivanov
2020-11-16 11:01 ` [pmg-devel] [PATCH pmg-gui v3 3/3] add PBSConfig tab to Backup menu Stoiko Ivanov
2020-11-17 17:22 ` [pmg-devel] applied-series: [PATCH pve-common/pmg-api/pmg-gui v3] add initial PBS integration Thomas Lamprecht
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201116110118.7483-5-s.ivanov@proxmox.com \
--to=s.ivanov@proxmox.com \
--cc=pmg-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox