use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Process {
#[serde(default)]
pub terminal: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub console_size: Option<ConsoleSize>,
pub cwd: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub env: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub args: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub rlimits: Vec<Rlimit>,
#[serde(skip_serializing_if = "Option::is_none")]
pub apparmor_profile: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub capabilities: Option<Capabilities>,
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub no_new_privileges: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub oom_score_adj: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub selinux_label: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<User>,
#[serde(skip_serializing_if = "Option::is_none")]
pub io_priority: Option<IoPriority>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scheduler: Option<Scheduler>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exec_cpu_affinity: Option<ExecCpuAffinity>,
}
impl Default for Process {
fn default() -> Self {
Self {
terminal: false,
console_size: None,
cwd: "/".to_string(),
env: vec![
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin".to_string(),
"TERM=xterm".to_string(),
],
args: vec!["sh".to_string()],
rlimits: vec![Rlimit {
rlimit_type: "RLIMIT_NOFILE".to_string(),
soft: 1024,
hard: 1024,
}],
apparmor_profile: None,
capabilities: Some(Capabilities::default()),
no_new_privileges: false,
oom_score_adj: None,
selinux_label: None,
user: Some(User::default()),
io_priority: None,
scheduler: None,
exec_cpu_affinity: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConsoleSize {
pub height: u32,
pub width: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Rlimit {
#[serde(rename = "type")]
pub rlimit_type: String,
pub soft: u64,
pub hard: u64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Capabilities {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub effective: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub bounding: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub inheritable: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub permitted: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub ambient: Vec<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct User {
#[serde(default)]
pub uid: u32,
#[serde(default)]
pub gid: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub umask: Option<u32>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub additional_gids: Vec<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IoPriority {
pub class: String,
pub priority: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Scheduler {
pub policy: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub nice: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub priority: Option<i32>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub flags: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub runtime: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deadline: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub period: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExecCpuAffinity {
#[serde(skip_serializing_if = "Option::is_none")]
pub initial: Option<String>,
#[serde(rename = "final", skip_serializing_if = "Option::is_none")]
pub final_affinity: Option<String>,
}