diff --git a/src/api2/node/disks.rs b/src/api2/node/disks.rs index b65b4d96..6ea97abe 100644 --- a/src/api2/node/disks.rs +++ b/src/api2/node/disks.rs @@ -11,7 +11,7 @@ use crate::tools::disks::{ get_disks, get_smart_data, }; -use crate::api2::types::NODE_SCHEMA; +use crate::api2::types::{NODE_SCHEMA, BLOCKDEVICE_NAME_SCHEMA}; #[api( protected: true, @@ -72,8 +72,7 @@ pub fn list_disks( schema: NODE_SCHEMA, }, disk: { - description: "Block device name.", - type: String, + schema: BLOCKDEVICE_NAME_SCHEMA, }, healthonly: { description: "If true returns only the health status.", diff --git a/src/api2/types.rs b/src/api2/types.rs index e613714b..bcf95e87 100644 --- a/src/api2/types.rs +++ b/src/api2/types.rs @@ -74,6 +74,8 @@ const_regex!{ pub CERT_FINGERPRINT_SHA256_REGEX = r"^(?:[0-9a-fA-F][0-9a-fA-F])(?::[0-9a-fA-F][0-9a-fA-F]){31}$"; pub ACL_PATH_REGEX = concat!(r"^(?:/|", r"(?:/", PROXMOX_SAFE_ID_REGEX_STR!(), ")+", r")$"); + + pub BLOCKDEVICE_NAME_REGEX = r"^(:?(:?h|s|x?v)d[a-z]+)|(:?nvme\d+n\d+)$"; } pub const SYSTEMD_DATETIME_FORMAT: ApiStringFormat = @@ -133,6 +135,8 @@ pub const CIDR_V6_FORMAT: ApiStringFormat = pub const CIDR_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&CIDR_REGEX); +pub const BLOCKDEVICE_NAME_FORMAT: ApiStringFormat = + ApiStringFormat::Pattern(&BLOCKDEVICE_NAME_REGEX); pub const PASSWORD_SCHEMA: Schema = StringSchema::new("Password.") .format(&PASSWORD_FORMAT) @@ -353,6 +357,11 @@ pub const PROXMOX_GROUP_ID_SCHEMA: Schema = StringSchema::new("Group ID") .max_length(64) .schema(); +pub const BLOCKDEVICE_NAME_SCHEMA: Schema = StringSchema::new("Block device name (/sys/block/).") + .format(&BLOCKDEVICE_NAME_FORMAT) + .min_length(3) + .max_length(64) + .schema(); // Complex type definitions diff --git a/src/bin/proxmox_backup_manager/disk.rs b/src/bin/proxmox_backup_manager/disk.rs index 83a1e236..86338bd3 100644 --- a/src/bin/proxmox_backup_manager/disk.rs +++ b/src/bin/proxmox_backup_manager/disk.rs @@ -48,8 +48,7 @@ fn list_disks(mut param: Value, rpcenv: &mut dyn RpcEnvironment) -> Result) -> Vec { let mut list = Vec::new(); - let dir = match crate::tools::fs::scan_subdir(libc::AT_FDCWD, "/sys/block", &BLOCKDEV_REGEX) { + let dir = match crate::tools::fs::scan_subdir(libc::AT_FDCWD, "/sys/block", &BLOCKDEVICE_NAME_REGEX) { Ok(dir) => dir, Err(_) => return list, };