[pbs-devel] [PATCH proxmox-backup 08/12] api2/admin/datastore: add get/set_protection
Fabian Ebner
f.ebner at proxmox.com
Fri Sep 10 14:43:36 CEST 2021
Am 06.09.21 um 12:57 schrieb Dominik Csapak:
> for gettin/setting the protected flag for snapshots (akin to notes)
>
For notes, there is a 'show' command, but not for protected. Is there an
other way to query the current protection of a single snapshot via
proxmox-backup-client?
I'm working on bug #3307, which is the same feature for PVE and for
integration with the PBS plugin it would be nicer to query only the
single snapshot. Or should I list the whole group and extract the info
from there instead?
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
> src/api2/admin/datastore.rs | 101 ++++++++++++++++++++++++++++++++++++
> 1 file changed, 101 insertions(+)
>
> diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs
> index f88fd105..572c65a9 100644
> --- a/src/api2/admin/datastore.rs
> +++ b/src/api2/admin/datastore.rs
> @@ -1751,6 +1751,101 @@ pub fn set_notes(
> Ok(())
> }
>
> +#[api(
> + input: {
> + properties: {
> + store: {
> + schema: DATASTORE_SCHEMA,
> + },
> + "backup-type": {
> + schema: BACKUP_TYPE_SCHEMA,
> + },
> + "backup-id": {
> + schema: BACKUP_ID_SCHEMA,
> + },
> + "backup-time": {
> + schema: BACKUP_TIME_SCHEMA,
> + },
> + },
> + },
> + access: {
> + permission: &Permission::Privilege(&["datastore", "{store}"], PRIV_DATASTORE_AUDIT | PRIV_DATASTORE_BACKUP, true),
> + },
> +)]
> +/// Query protection for a specific backup
> +pub fn get_protection(
> + store: String,
> + backup_type: String,
> + backup_id: String,
> + backup_time: i64,
> + rpcenv: &mut dyn RpcEnvironment,
> +) -> Result<bool, Error> {
> + let datastore = DataStore::lookup_datastore(&store)?;
> +
> + let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
> + let backup_dir = BackupDir::new(backup_type, backup_id, backup_time)?;
> +
> + check_priv_or_backup_owner(&datastore, backup_dir.group(), &auth_id, PRIV_DATASTORE_AUDIT)?;
> +
> + let protected_path = backup_dir.protected_file(datastore.base_path());
> +
> + Ok(protected_path.exists())
> +}
> +
> +#[api(
> + input: {
> + properties: {
> + store: {
> + schema: DATASTORE_SCHEMA,
> + },
> + "backup-type": {
> + schema: BACKUP_TYPE_SCHEMA,
> + },
> + "backup-id": {
> + schema: BACKUP_ID_SCHEMA,
> + },
> + "backup-time": {
> + schema: BACKUP_TIME_SCHEMA,
> + },
> + protected: {
> + description: "Enable/disable protection.",
> + },
> + },
> + },
> + access: {
> + permission: &Permission::Privilege(&["datastore", "{store}"],
> + PRIV_DATASTORE_MODIFY | PRIV_DATASTORE_BACKUP,
> + true),
> + },
> +)]
> +/// En- or disable protection for a specific backup
> +pub fn set_protection(
> + store: String,
> + backup_type: String,
> + backup_id: String,
> + backup_time: i64,
> + protected: bool,
> + rpcenv: &mut dyn RpcEnvironment,
> +) -> Result<(), Error> {
> + let datastore = DataStore::lookup_datastore(&store)?;
> +
> + let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
> + let backup_dir = BackupDir::new(backup_type, backup_id, backup_time)?;
> +
> + check_priv_or_backup_owner(&datastore, backup_dir.group(), &auth_id, PRIV_DATASTORE_MODIFY)?;
> +
> + let protected_path = backup_dir.protected_file(datastore.base_path());
> + if protected {
> + std::fs::File::create(protected_path)
> + .map_err(|err| format_err!("could not create protection file: {}", err))?;
> + } else {
> + std::fs::remove_file(protected_path)
> + .map_err(|err| format_err!("could not remove protection file: {}", err))?;
> + }
> +
> + Ok(())
> +}
> +
> #[api(
> input: {
> properties: {
> @@ -1899,6 +1994,12 @@ const DATASTORE_INFO_SUBDIRS: SubdirMap = &[
> .get(&API_METHOD_GET_NOTES)
> .put(&API_METHOD_SET_NOTES)
> ),
> + (
> + "protected",
> + &Router::new()
> + .get(&API_METHOD_GET_PROTECTION)
> + .put(&API_METHOD_SET_PROTECTION)
> + ),
> (
> "prune",
> &Router::new()
>
More information about the pbs-devel
mailing list