1use serde::{Deserialize, Serialize};
17use zlink::{proxy, ReplyError};
18
19#[proxy("io.systemd.Unit")]
21pub trait Unit {
22 async fn list(&mut self, name: Option<&str>) -> zlink::Result<Result<ListOutput, UnitError>>;
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct ListOutput {
34 pub context: Option<UnitContext>,
36 pub runtime: Option<UnitRuntime>,
38}
39
40#[derive(Debug, Clone, Serialize, Deserialize)]
42pub struct UnitContext {
43 #[serde(rename = "Service")]
44 pub service: Option<ServiceContext>,
45 #[serde(rename = "Exec")]
46 pub exec: Option<ExecContext>,
47 #[serde(rename = "Timer")]
48 pub timer: Option<TimerContext>,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize)]
53pub struct ExecContext {
54 #[serde(rename = "TimeoutCleanUSec")]
57 pub timeout_clean_usec: Option<u64>,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize)]
62pub struct TimerContext {
63 #[serde(rename = "Unit")]
65 pub unit: Option<String>,
66 #[serde(rename = "AccuracyUSec")]
67 pub accuracy_usec: Option<u64>,
68 #[serde(rename = "RandomizedDelayUSec")]
69 pub randomized_delay_usec: Option<u64>,
70 #[serde(rename = "FixedRandomDelay")]
71 pub fixed_random_delay: Option<bool>,
72 #[serde(rename = "Persistent")]
73 pub persistent: Option<bool>,
74 #[serde(rename = "RemainAfterElapse")]
75 pub remain_after_elapse: Option<bool>,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
80pub struct ServiceContext {
81 #[serde(rename = "Type")]
83 pub r#type: Option<String>,
84 #[serde(rename = "RestartUSec")]
86 pub restart_usec: Option<u64>,
87 #[serde(rename = "WatchdogUSec")]
94 pub watchdog_usec: Option<u64>,
95}
96
97#[derive(Debug, Clone, Serialize, Deserialize)]
99pub struct UnitRuntime {
100 #[serde(rename = "StateChangeTimestamp")]
101 pub state_change_timestamp: Option<Timestamp>,
102 #[serde(rename = "ActiveEnterTimestamp")]
103 pub active_enter_timestamp: Option<Timestamp>,
104 #[serde(rename = "InactiveExitTimestamp")]
105 pub inactive_exit_timestamp: Option<Timestamp>,
106 #[serde(rename = "ActiveExitTimestamp")]
109 pub active_exit_timestamp: Option<Timestamp>,
110 #[serde(rename = "CGroup")]
111 pub cgroup: Option<CGroupRuntime>,
112 #[serde(rename = "Service")]
113 pub service: Option<ServiceRuntime>,
114 #[serde(rename = "Timer")]
115 pub timer: Option<TimerRuntime>,
116}
117
118#[derive(Debug, Clone, Serialize, Deserialize)]
120pub struct TimerRuntime {
121 #[serde(rename = "NextElapseUSecRealtime")]
123 pub next_elapse_usec_realtime: Option<u64>,
124 #[serde(rename = "NextElapseUSecMonotonic")]
125 pub next_elapse_usec_monotonic: Option<u64>,
126 #[serde(rename = "LastTriggerUSec")]
128 pub last_trigger_usec: Option<Timestamp>,
129}
130
131#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
133pub struct Timestamp {
134 pub realtime: Option<u64>,
135 pub monotonic: Option<u64>,
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize)]
141pub struct CGroupRuntime {
142 #[serde(rename = "Path")]
144 pub path: Option<String>,
145 #[serde(rename = "CPUUsageNSec")]
146 pub cpu_usage_nsec: Option<u64>,
147 #[serde(rename = "MemoryCurrent")]
148 pub memory_current: Option<u64>,
149 #[serde(rename = "MemoryAvailable")]
150 pub memory_available: Option<u64>,
151 #[serde(rename = "TasksCurrent")]
152 pub tasks_current: Option<u64>,
153 #[serde(rename = "IOReadBytes")]
154 pub io_read_bytes: Option<u64>,
155 #[serde(rename = "IOReadOperations")]
156 pub io_read_operations: Option<u64>,
157}
158
159#[derive(Debug, Clone, Serialize, Deserialize)]
161pub struct ServiceRuntime {
162 #[serde(rename = "MainPID")]
164 pub main_pid: Option<ProcessId>,
165 #[serde(rename = "StatusErrno")]
167 pub status_errno: Option<i32>,
168 #[serde(rename = "NRestarts")]
170 pub n_restarts: Option<u32>,
171}
172
173#[derive(Debug, Clone, Serialize, Deserialize)]
175pub struct ProcessId {
176 pub pid: Option<u32>,
177}
178
179#[derive(Debug, Clone, PartialEq, ReplyError)]
181#[zlink(interface = "io.systemd.Unit")]
182pub enum UnitError {
183 NoSuchUnit,
185}
186
187impl std::fmt::Display for UnitError {
188 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
189 match self {
190 UnitError::NoSuchUnit => write!(f, "No such unit"),
191 }
192 }
193}
194
195impl std::error::Error for UnitError {}