turn UPID into an API type
It's a string-type. Implement Serialize via Display, Deserialize via FromStr and add an API_SCHEMA so that it can be used as a type within the #[api] macro. Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
		
				
					committed by
					
						 Dietmar Maurer
						Dietmar Maurer
					
				
			
			
				
	
			
			
			
						parent
						
							4ea831bfa1
						
					
				
				
					commit
					11e1e27a42
				
			| @ -2,9 +2,9 @@ use std::sync::atomic::{AtomicUsize, Ordering}; | |||||||
|  |  | ||||||
| use anyhow::{bail, Error}; | use anyhow::{bail, Error}; | ||||||
| use chrono::Local; | use chrono::Local; | ||||||
| use lazy_static::lazy_static; |  | ||||||
| use regex::Regex; |  | ||||||
|  |  | ||||||
|  | use proxmox::api::schema::{ApiStringFormat, Schema, StringSchema}; | ||||||
|  | use proxmox::const_regex; | ||||||
| use proxmox::sys::linux::procfs; | use proxmox::sys::linux::procfs; | ||||||
|  |  | ||||||
| use crate::api2::types::Userid; | use crate::api2::types::Userid; | ||||||
| @ -20,6 +20,7 @@ use crate::api2::types::Userid; | |||||||
| /// ``` | /// ``` | ||||||
| /// Please note that we use tokio, so a single thread can run multiple | /// Please note that we use tokio, so a single thread can run multiple | ||||||
| /// tasks. | /// tasks. | ||||||
|  | // #[api] - manually implemented API type | ||||||
| #[derive(Debug, Clone)] | #[derive(Debug, Clone)] | ||||||
| pub struct UPID { | pub struct UPID { | ||||||
|     /// The Unix PID |     /// The Unix PID | ||||||
| @ -40,7 +41,26 @@ pub struct UPID { | |||||||
|     pub node: String, |     pub node: String, | ||||||
| } | } | ||||||
|  |  | ||||||
|  | proxmox::forward_serialize_to_display!(UPID); | ||||||
|  | proxmox::forward_deserialize_to_from_str!(UPID); | ||||||
|  |  | ||||||
|  | const_regex! { | ||||||
|  |     pub PROXMOX_UPID_REGEX = concat!( | ||||||
|  |         r"^UPID:(?P<node>[a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?):(?P<pid>[0-9A-Fa-f]{8}):", | ||||||
|  |         r"(?P<pstart>[0-9A-Fa-f]{8,9}):(?P<task_id>[0-9A-Fa-f]{8,16}):(?P<starttime>[0-9A-Fa-f]{8}):", | ||||||
|  |         r"(?P<wtype>[^:\s]+):(?P<wid>[^:\s]*):(?P<userid>[^:\s]+):$" | ||||||
|  |     ); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | pub const PROXMOX_UPID_FORMAT: ApiStringFormat = | ||||||
|  |     ApiStringFormat::Pattern(&PROXMOX_UPID_REGEX); | ||||||
|  |  | ||||||
| impl UPID { | impl UPID { | ||||||
|  |     pub const API_SCHEMA: Schema = StringSchema::new("Unique Process/Task Identifier") | ||||||
|  |         .min_length("UPID:N:12345678:12345678:12345678:::".len()) | ||||||
|  |         .max_length(128) // arbitrary | ||||||
|  |         .format(&PROXMOX_UPID_FORMAT) | ||||||
|  |         .schema(); | ||||||
|  |  | ||||||
|     /// Create a new UPID |     /// Create a new UPID | ||||||
|     pub fn new( |     pub fn new( | ||||||
| @ -92,17 +112,7 @@ impl std::str::FromStr for UPID { | |||||||
|     type Err = Error; |     type Err = Error; | ||||||
|  |  | ||||||
|     fn from_str(s: &str) -> Result<Self, Self::Err> { |     fn from_str(s: &str) -> Result<Self, Self::Err> { | ||||||
|  |         if let Some(cap) = PROXMOX_UPID_REGEX.captures(s) { | ||||||
|         lazy_static! { |  | ||||||
|             static ref REGEX: Regex = Regex::new(concat!( |  | ||||||
|                 r"^UPID:(?P<node>[a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?):(?P<pid>[0-9A-Fa-f]{8}):", |  | ||||||
|                 r"(?P<pstart>[0-9A-Fa-f]{8,9}):(?P<task_id>[0-9A-Fa-f]{8,16}):(?P<starttime>[0-9A-Fa-f]{8}):", |  | ||||||
|                 r"(?P<wtype>[^:\s]+):(?P<wid>[^:\s]*):(?P<userid>[^:\s]+):$" |  | ||||||
|             )).unwrap(); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         if let Some(cap) = REGEX.captures(s) { |  | ||||||
|  |  | ||||||
|             Ok(UPID { |             Ok(UPID { | ||||||
|                 pid: i32::from_str_radix(&cap["pid"], 16).unwrap(), |                 pid: i32::from_str_radix(&cap["pid"], 16).unwrap(), | ||||||
|                 pstart: u64::from_str_radix(&cap["pstart"], 16).unwrap(), |                 pstart: u64::from_str_radix(&cap["pstart"], 16).unwrap(), | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user