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 997A81FF15C for ; Wed, 13 Nov 2024 16:01:55 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 270F618BFA; Wed, 13 Nov 2024 16:01:50 +0100 (CET) From: Hannes Laimer To: pbs-devel@lists.proxmox.com Date: Wed, 13 Nov 2024 16:00:47 +0100 Message-Id: <20241113150102.164820-12-h.laimer@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20241113150102.164820-1-h.laimer@proxmox.com> References: <20241113150102.164820-1-h.laimer@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.023 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: [pbs-devel] [PATCH proxmox-backup v13 11/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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pbs-devel-bounces@lists.proxmox.com Sender: "pbs-devel" If a device houses multiple datastore, none of them will be mounted automatically. If a device only contains a single datastore it will be mounted automatically. The reason for not mounting multiple datastore automatically is that we don't know which is actually wanted, and since mounting all means also all have to be unmounted manually, it made sense to have the user choose which to mount. Signed-off-by: Hannes Laimer --- changes since v12: * make service not dynamic * don't logs UUIDs that don't contains known datastores debian/proxmox-backup-server.install | 1 + debian/proxmox-backup-server.udev | 3 + etc/Makefile | 3 +- etc/removable-device-attach@.service | 8 +++ src/bin/proxmox_backup_manager/datastore.rs | 62 ++++++++++++++++++++- 5 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 etc/removable-device-attach@.service diff --git a/debian/proxmox-backup-server.install b/debian/proxmox-backup-server.install index 79757ead..ff581e3d 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..b206b9ca 100644 --- a/etc/Makefile +++ b/etc/Makefile @@ -2,12 +2,13 @@ include ../defines.mk UNITS := \ proxmox-backup-daily-update.timer \ + removable-device-attach@.service \ DYNAMIC_UNITS := \ proxmox-backup-banner.service \ proxmox-backup-daily-update.service \ proxmox-backup.service \ - proxmox-backup-proxy.service + proxmox-backup-proxy.service \ all: $(UNITS) $(DYNAMIC_UNITS) pbs-enterprise.list diff --git a/etc/removable-device-attach@.service b/etc/removable-device-attach@.service new file mode 100644 index 00000000..e10d1ea3 --- /dev/null +++ b/etc/removable-device-attach@.service @@ -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 f2795b39..05f35279 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,62 @@ async fn delete_datastore(mut param: Value, rpcenv: &mut dyn RpcEnvironment) -> Ok(()) } +#[api( + protected: true, + input: { + properties: { + uuid: { + type: String, + 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 matching_stores = data.as_array().map_or(Vec::new(), |list| { + list.iter() + .filter_map(Value::as_object) + .filter(|store| store.get("backing-device").map_or(false, |d| d.eq(&uuid))) + .collect() + }); + + if matching_stores.len() != 1 { + return Ok(Value::Null); + } + + let store_name = matching_stores + .get(0) + .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 +296,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.5 _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel