1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
7#[serde(rename_all = "camelCase")]
8pub struct Process {
9 #[serde(default)]
11 pub terminal: bool,
12
13 #[serde(skip_serializing_if = "Option::is_none")]
15 pub console_size: Option<ConsoleSize>,
16
17 pub cwd: String,
20
21 #[serde(default, skip_serializing_if = "Vec::is_empty")]
23 pub env: Vec<String>,
24
25 #[serde(default, skip_serializing_if = "Vec::is_empty")]
27 pub args: Vec<String>,
28
29 #[serde(default, skip_serializing_if = "Vec::is_empty")]
31 pub rlimits: Vec<Rlimit>,
32
33 #[serde(skip_serializing_if = "Option::is_none")]
35 pub apparmor_profile: Option<String>,
36
37 #[serde(skip_serializing_if = "Option::is_none")]
39 pub capabilities: Option<Capabilities>,
40
41 #[serde(default, skip_serializing_if = "std::ops::Not::not")]
43 pub no_new_privileges: bool,
44
45 #[serde(skip_serializing_if = "Option::is_none")]
47 pub oom_score_adj: Option<i32>,
48
49 #[serde(skip_serializing_if = "Option::is_none")]
51 pub selinux_label: Option<String>,
52
53 #[serde(skip_serializing_if = "Option::is_none")]
55 pub user: Option<User>,
56
57 #[serde(skip_serializing_if = "Option::is_none")]
59 pub io_priority: Option<IoPriority>,
60
61 #[serde(skip_serializing_if = "Option::is_none")]
63 pub scheduler: Option<Scheduler>,
64
65 #[serde(skip_serializing_if = "Option::is_none")]
67 pub exec_cpu_affinity: Option<ExecCpuAffinity>,
68}
69
70impl Default for Process {
71 fn default() -> Self {
72 Self {
73 terminal: false,
74 console_size: None,
75 cwd: "/".to_string(),
76 env: vec![
77 "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin".to_string(),
78 "TERM=xterm".to_string(),
79 ],
80 args: vec!["sh".to_string()],
81 rlimits: vec![Rlimit {
82 rlimit_type: "RLIMIT_NOFILE".to_string(),
83 soft: 1024,
84 hard: 1024,
85 }],
86 apparmor_profile: None,
87 capabilities: Some(Capabilities::default()),
88 no_new_privileges: false,
89 oom_score_adj: None,
90 selinux_label: None,
91 user: Some(User::default()),
92 io_priority: None,
93 scheduler: None,
94 exec_cpu_affinity: None,
95 }
96 }
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize)]
101pub struct ConsoleSize {
102 pub height: u32,
104 pub width: u32,
106}
107
108#[derive(Debug, Clone, Serialize, Deserialize)]
110pub struct Rlimit {
111 #[serde(rename = "type")]
113 pub rlimit_type: String,
114 pub soft: u64,
116 pub hard: u64,
118}
119
120#[derive(Debug, Clone, Default, Serialize, Deserialize)]
122pub struct Capabilities {
123 #[serde(default, skip_serializing_if = "Vec::is_empty")]
125 pub effective: Vec<String>,
126 #[serde(default, skip_serializing_if = "Vec::is_empty")]
128 pub bounding: Vec<String>,
129 #[serde(default, skip_serializing_if = "Vec::is_empty")]
131 pub inheritable: Vec<String>,
132 #[serde(default, skip_serializing_if = "Vec::is_empty")]
134 pub permitted: Vec<String>,
135 #[serde(default, skip_serializing_if = "Vec::is_empty")]
137 pub ambient: Vec<String>,
138}
139
140#[derive(Debug, Clone, Default, Serialize, Deserialize)]
142#[serde(rename_all = "camelCase")]
143pub struct User {
144 #[serde(default)]
146 pub uid: u32,
147 #[serde(default)]
149 pub gid: u32,
150 #[serde(skip_serializing_if = "Option::is_none")]
152 pub umask: Option<u32>,
153 #[serde(default, skip_serializing_if = "Vec::is_empty")]
155 pub additional_gids: Vec<u32>,
156}
157
158#[derive(Debug, Clone, Serialize, Deserialize)]
160pub struct IoPriority {
161 pub class: String,
163 pub priority: i32,
165}
166
167#[derive(Debug, Clone, Serialize, Deserialize)]
169pub struct Scheduler {
170 pub policy: String,
172 #[serde(skip_serializing_if = "Option::is_none")]
174 pub nice: Option<i32>,
175 #[serde(skip_serializing_if = "Option::is_none")]
177 pub priority: Option<i32>,
178 #[serde(default, skip_serializing_if = "Vec::is_empty")]
180 pub flags: Vec<String>,
181 #[serde(skip_serializing_if = "Option::is_none")]
183 pub runtime: Option<u64>,
184 #[serde(skip_serializing_if = "Option::is_none")]
186 pub deadline: Option<u64>,
187 #[serde(skip_serializing_if = "Option::is_none")]
189 pub period: Option<u64>,
190}
191
192#[derive(Debug, Clone, Serialize, Deserialize)]
194pub struct ExecCpuAffinity {
195 #[serde(skip_serializing_if = "Option::is_none")]
197 pub initial: Option<String>,
198 #[serde(rename = "final", skip_serializing_if = "Option::is_none")]
200 pub final_affinity: Option<String>,
201}