From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 0C27420EC8F for ; Thu, 25 Apr 2024 07:33:09 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id A4B1B1A5D3; Thu, 25 Apr 2024 07:33:14 +0200 (CEST) Mime-Version: 1.0 Date: Thu, 25 Apr 2024 07:32:40 +0200 Message-Id: From: "Hannes Laimer" To: "Wolfgang Bumiller" X-Mailer: aerc 0.17.0-78-g4ffbaa6b3946 References: <20240423083000.28002-1-h.laimer@proxmox.com> <20240423083000.28002-13-h.laimer@proxmox.com> In-Reply-To: X-SPAM-LEVEL: Spam detection results: 0 AWL 0.009 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: Re: [pbs-devel] [PATCH proxmox-backup v9 12/26] add auto-mounting for removable datastores X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Backup Server development discussion Cc: pbs-devel@lists.proxmox.com Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pbs-devel-bounces@lists.proxmox.com Sender: "pbs-devel" On Wed Apr 24, 2024 at 3:18 PM CEST, Wolfgang Bumiller wrote: > On Tue, Apr 23, 2024 at 10:29:46AM +0200, Hannes Laimer wrote: > > Signed-off-by: Hannes Laimer > > --- > > debian/proxmox-backup-server.install | 1 + > > debian/proxmox-backup-server.udev | 3 ++ > > etc/Makefile | 3 +- > > etc/removable-device-attach@.service.in | 8 +++ > > src/bin/proxmox_backup_manager/datastore.rs | 56 ++++++++++++++++++++- > > 5 files changed, 69 insertions(+), 2 deletions(-) > > create mode 100644 etc/removable-device-attach@.service.in > > > > diff --git a/debian/proxmox-backup-server.install b/debian/proxmox-backup-server.install > > index ee114ea3..cda01069 100644 > > --- a/debian/proxmox-backup-server.install > > +++ b/debian/proxmox-backup-server.install > > @@ -4,6 +4,7 @@ etc/proxmox-backup-daily-update.service /lib/systemd/system/ > > etc/proxmox-backup-daily-update.timer /lib/systemd/system/ > > etc/proxmox-backup-proxy.service /lib/systemd/system/ > > etc/proxmox-backup.service /lib/systemd/system/ > > +etc/removable-device-attach@.service /lib/systemd/system/ > > usr/bin/pmt > > usr/bin/pmtx > > usr/bin/proxmox-tape > > diff --git a/debian/proxmox-backup-server.udev b/debian/proxmox-backup-server.udev > > index afdfb2bc..e21b8bc7 100644 > > --- a/debian/proxmox-backup-server.udev > > +++ b/debian/proxmox-backup-server.udev > > @@ -16,3 +16,6 @@ SUBSYSTEM=="scsi_generic", SUBSYSTEMS=="scsi", ATTRS{type}=="1", ENV{ID_SCSI_SER > > SYMLINK+="tape/by-id/scsi-$env{ID_SCSI_SERIAL}-sg" > > > > LABEL="persistent_storage_tape_end" > > + > > +# triggers the mounting of a removable device > > +ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_UUID}!="", TAG+="systemd", ENV{SYSTEMD_WANTS}="removable-device-attach@$env{ID_FS_UUID}" > > \ No newline at end of file > > diff --git a/etc/Makefile b/etc/Makefile > > index 42f639f6..730de4f8 100644 > > --- a/etc/Makefile > > +++ b/etc/Makefile > > @@ -7,7 +7,8 @@ DYNAMIC_UNITS := \ > > proxmox-backup-banner.service \ > > proxmox-backup-daily-update.service \ > > proxmox-backup.service \ > > - proxmox-backup-proxy.service > > + proxmox-backup-proxy.service \ > > + removable-device-attach@.service > > > > all: $(UNITS) $(DYNAMIC_UNITS) pbs-enterprise.list > > > > diff --git a/etc/removable-device-attach@.service.in b/etc/removable-device-attach@.service.in > > new file mode 100644 > > index 00000000..e10d1ea3 > > --- /dev/null > > +++ b/etc/removable-device-attach@.service.in > > @@ -0,0 +1,8 @@ > > +[Unit] > > +Description=Try to mount the removable device of a datastore with uuid '%i'. > > +After=proxmox-backup-proxy.service > > +Requires=proxmox-backup-proxy.service > > + > > +[Service] > > +Type=simple > > +ExecStart=/usr/sbin/proxmox-backup-manager datastore uuid-mount %i > > diff --git a/src/bin/proxmox_backup_manager/datastore.rs b/src/bin/proxmox_backup_manager/datastore.rs > > index f8462459..7575d0c5 100644 > > --- a/src/bin/proxmox_backup_manager/datastore.rs > > +++ b/src/bin/proxmox_backup_manager/datastore.rs > > @@ -1,4 +1,4 @@ > > -use anyhow::{format_err, Error}; > > +use anyhow::{bail, format_err, Error}; > > use serde_json::Value; > > > > use proxmox_router::{cli::*, ApiHandler, RpcEnvironment}; > > @@ -195,6 +195,56 @@ async fn delete_datastore(mut param: Value, rpcenv: &mut dyn RpcEnvironment) -> > > Ok(()) > > } > > > > +#[api( > > + protected: true, > > + input: { > > + properties: { > > + uuid: { > > + type: String, > > + format: &proxmox_schema::api_types::UUID_FORMAT, > > ^ Don't use a format here. If we only accept "real" uuids we cannot use > "weird" devices like FAT where UUIDs look different. > we currently already have it in our docs that we only "support" ext4, xfs or zfs. Also AFAIK FSs that have not "weird" UUID formats tend to also have no problems with permissions > > + description: "The UUID of the device that should be mounted", > > + }, > > + "output-format": { > > + schema: OUTPUT_FORMAT, > > + optional: true, > > + }, > > + }, > > + }, > > +)] > > +/// Try mounting a removable datastore given the UUID. > > +async fn uuid_mount(param: Value, rpcenv: &mut dyn RpcEnvironment) -> Result { > > + let uuid = param["uuid"] > > + .as_str() > > + .ok_or_else(|| format_err!("uuid has to be specified"))?; > > + > > + let info = &api2::config::datastore::API_METHOD_LIST_DATASTORES; > > + let data: Value = match info.handler { > > + ApiHandler::Sync(handler) => (handler)(serde_json::json!({}), info, rpcenv)?, > > + _ => unreachable!(), > > + }; > > + > > + let store_name = data.as_array().and_then(|list| { > > + list.iter() > > + .filter_map(Value::as_object) > > + .find(|store| store.get("backing-device").map_or(false, |d| d.eq(&uuid))) > > + .and_then(|s| s.get("name").and_then(Value::as_str)) > > + }); > > + > > + if let Some(store_name) = store_name { > > + let info = &api2::admin::datastore::API_METHOD_MOUNT; > > + let mount_param = serde_json::json!({ > > + "store": store_name, > > + }); > > + let result = match info.handler { > > + ApiHandler::Sync(handler) => (handler)(mount_param, info, rpcenv)?, > > + _ => unreachable!(), > > + }; > > + crate::wait_for_local_worker(result.as_str().unwrap()).await?; > > + return Ok(Value::Null); > > + } > > + bail!("'{uuid}' is not associated with any datastore") > > +} > > + > > pub fn datastore_commands() -> CommandLineInterface { > > let cmd_def = CliCommandMap::new() > > .insert("list", CliCommand::new(&API_METHOD_LIST_DATASTORES)) > > @@ -240,6 +290,10 @@ pub fn datastore_commands() -> CommandLineInterface { > > pbs_config::datastore::complete_calendar_event, > > ), > > ) > > + .insert( > > + "uuid-mount", > > + CliCommand::new(&API_METHOD_UUID_MOUNT).arg_param(&["uuid"]), > > + ) > > .insert( > > "remove", > > CliCommand::new(&API_METHOD_DELETE_DATASTORE) > > -- > > 2.39.2 _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel