From 5f83d3f636f17109ea747be2f26433d9a20ba9cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Thu, 28 Oct 2021 15:00:54 +0200 Subject: [PATCH] sync: add group filtering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit like for manual pulls, but persisted in the sync job config and visible in the relevant GUI parts. GUI is read-only for now (and defaults to no filtering on creation), as this is a rather advanced feature that requires a complex GUI to be user-friendly (regex-freeform, type-combobox, remote group scanning + selector with additional freeform input). Signed-off-by: Fabian Grünbichler Reviewed-by: Dominik Csapak Signed-off-by: Thomas Lamprecht --- pbs-api-types/src/jobs.rs | 6 ++++++ src/api2/config/sync.rs | 5 +++++ src/api2/pull.rs | 2 +- www/config/SyncView.js | 8 +++++++- www/window/SyncJobEdit.js | 9 +++++++++ 5 files changed, 28 insertions(+), 2 deletions(-) diff --git a/pbs-api-types/src/jobs.rs b/pbs-api-types/src/jobs.rs index ec7b0843..419bdaf7 100644 --- a/pbs-api-types/src/jobs.rs +++ b/pbs-api-types/src/jobs.rs @@ -403,6 +403,10 @@ pub const GROUP_FILTER_LIST_SCHEMA: Schema = ArraySchema::new("List of group fil optional: true, schema: SYNC_SCHEDULE_SCHEMA, }, + groups: { + schema: GROUP_FILTER_LIST_SCHEMA, + optional: true, + }, } )] #[derive(Serialize,Deserialize,Clone,Updater)] @@ -422,6 +426,8 @@ pub struct SyncJobConfig { pub comment: Option, #[serde(skip_serializing_if="Option::is_none")] pub schedule: Option, + #[serde(skip_serializing_if="Option::is_none")] + pub groups: Option>, } #[api( diff --git a/src/api2/config/sync.rs b/src/api2/config/sync.rs index fba476da..890221e6 100644 --- a/src/api2/config/sync.rs +++ b/src/api2/config/sync.rs @@ -192,6 +192,8 @@ pub enum DeletableProperty { schedule, /// Delete the remove-vanished flag. remove_vanished, + /// Delete the groups property. + groups, } #[api( @@ -254,6 +256,7 @@ pub fn update_sync_job( DeletableProperty::comment => { data.comment = None; }, DeletableProperty::schedule => { data.schedule = None; }, DeletableProperty::remove_vanished => { data.remove_vanished = None; }, + DeletableProperty::groups => { data.groups = None; }, } } } @@ -271,6 +274,7 @@ pub fn update_sync_job( if let Some(remote) = update.remote { data.remote = remote; } if let Some(remote_store) = update.remote_store { data.remote_store = remote_store; } if let Some(owner) = update.owner { data.owner = Some(owner); } + if let Some(groups) = update.groups { data.groups = Some(groups); } let schedule_changed = data.schedule != update.schedule; if update.schedule.is_some() { data.schedule = update.schedule; } @@ -390,6 +394,7 @@ acl:1:/remote/remote1/remotestore1:write@pbs:RemoteSyncOperator owner: Some(write_auth_id.clone()), comment: None, remove_vanished: None, + groups: None, schedule: None, }; diff --git a/src/api2/pull.rs b/src/api2/pull.rs index d4a14f10..3d644202 100644 --- a/src/api2/pull.rs +++ b/src/api2/pull.rs @@ -50,7 +50,7 @@ impl TryFrom<&SyncJobConfig> for PullParameters { &sync_job.remote_store, sync_job.owner.as_ref().unwrap_or_else(|| Authid::root_auth_id()).clone(), sync_job.remove_vanished, - None, + sync_job.groups.clone(), ) } } diff --git a/www/config/SyncView.js b/www/config/SyncView.js index 7d7e751c..ee50b331 100644 --- a/www/config/SyncView.js +++ b/www/config/SyncView.js @@ -1,7 +1,7 @@ Ext.define('pbs-sync-jobs-status', { extend: 'Ext.data.Model', fields: [ - 'id', 'owner', 'remote', 'remote-store', 'store', 'schedule', + 'id', 'owner', 'remote', 'remote-store', 'store', 'schedule', 'groups', 'next-run', 'last-run-upid', 'last-run-state', 'last-run-endtime', { name: 'duration', @@ -214,6 +214,12 @@ Ext.define('PBS.config.SyncJobView', { flex: 2, sortable: true, }, + { + header: gettext('Backup Groups'), + dataIndex: 'groups', + renderer: v => v ? Ext.String.htmlEncode(v) : gettext('All'), + width: 80, + }, { header: gettext('Schedule'), dataIndex: 'schedule', diff --git a/www/window/SyncJobEdit.js b/www/window/SyncJobEdit.js index 47e65ae3..98ddb5ea 100644 --- a/www/window/SyncJobEdit.js +++ b/www/window/SyncJobEdit.js @@ -199,6 +199,15 @@ Ext.define('PBS.window.SyncJobEdit', { ], columnB: [ + { + fieldLabel: gettext('Backup Groups'), + xtype: 'displayfield', + name: 'groups', + renderer: v => v ? Ext.String.htmlEncode(v) : gettext('All'), + cbind: { + hidden: '{isCreate}', + }, + }, { fieldLabel: gettext('Comment'), xtype: 'proxmoxtextfield',