src/tools/disks/lvm.rs: implement get_lvm_devices()
This commit is contained in:
		| @ -18,6 +18,8 @@ use proxmox::{io_bail, io_format_err}; | ||||
|  | ||||
| mod zfs; | ||||
| pub use zfs::*; | ||||
| mod lvm; | ||||
| pub use lvm::*; | ||||
|  | ||||
| bitflags! { | ||||
|     /// Ways a device is being used. | ||||
|  | ||||
							
								
								
									
										55
									
								
								src/tools/disks/lvm.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								src/tools/disks/lvm.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | ||||
| use std::collections::{HashSet, HashMap}; | ||||
|  | ||||
| use anyhow::{format_err, Error}; | ||||
| use serde_json::Value; | ||||
| use lazy_static::lazy_static; | ||||
|  | ||||
| lazy_static!{ | ||||
|     static ref LVM_UUIDS: HashSet<&'static str> = { | ||||
|         let mut set = HashSet::new(); | ||||
| 	set.insert("e6d6d379-f507-44c2-a23c-238f2a3df928"); | ||||
|         set | ||||
|     }; | ||||
| } | ||||
|  | ||||
| /// Get list of devices used by LVM (pvs). | ||||
| pub fn get_lvm_devices( | ||||
|     partition_type_map: &HashMap<String, Vec<String>>, | ||||
| ) -> Result<HashSet<String>, Error> { | ||||
|  | ||||
|     const PVS_BIN_PATH: &str = "/sbin/pvs"; | ||||
|  | ||||
|     let mut command = std::process::Command::new(PVS_BIN_PATH); | ||||
|     command.args(&["--reportformat", "json", "--noheadings", "--readonly", "-o", "pv_name"]); | ||||
|  | ||||
|     let output = command.output() | ||||
|         .map_err(|err| format_err!("failed to execute '{}' - {}", PVS_BIN_PATH, err))?; | ||||
|  | ||||
|     let output = crate::tools::command_output(output, None) | ||||
|         .map_err(|err| format_err!("pvs command failed: {}", err))?; | ||||
|  | ||||
|     let mut device_set: HashSet<String> = HashSet::new(); | ||||
|  | ||||
|     for device_list in partition_type_map.iter() | ||||
|         .filter_map(|(uuid, list)| if LVM_UUIDS.contains(uuid.as_str()) { Some(list) } else { None }) | ||||
|     { | ||||
|         for device in device_list { | ||||
|             device_set.insert(device.clone()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     let output: Value = output.parse()?; | ||||
|  | ||||
|     match output["report"][0]["pv"].as_array() { | ||||
|         Some(list) => { | ||||
|             for info in list { | ||||
|                 if let Some(pv_name) = info["pv_name"].as_str() { | ||||
|                     device_set.insert(pv_name.to_string()); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         None => return Ok(device_set), | ||||
|     } | ||||
|  | ||||
|     Ok(device_set) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user