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:
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(),
|
||||||
|
Loading…
Reference in New Issue
Block a user