unifly_api/controller/session_queries/
system.rs1use crate::controller::Controller;
2use crate::controller::support::{convert_health_summaries, require_session};
3use crate::core_error::CoreError;
4use crate::model::{Alarm, HealthSummary, SysInfo, SystemInfo};
5
6impl Controller {
7 pub async fn is_dpi_enabled(&self) -> Result<bool, CoreError> {
8 let guard = self.inner.session_client.lock().await;
9 let session = require_session(guard.as_ref())?;
10 let settings = session.get_site_settings().await?;
11 let enabled = settings
12 .iter()
13 .find(|s| s.get("key").and_then(|v| v.as_str()) == Some("dpi"))
14 .and_then(|s| s.get("enabled"))
15 .and_then(serde_json::Value::as_bool)
16 .unwrap_or(false);
17 Ok(enabled)
18 }
19
20 pub async fn list_alarms(&self) -> Result<Vec<Alarm>, CoreError> {
21 let guard = self.inner.session_client.lock().await;
22 let session = require_session(guard.as_ref())?;
23 let raw = session.list_alarms().await?;
24 Ok(raw.into_iter().map(Alarm::from).collect())
25 }
26
27 pub async fn get_system_info(&self) -> Result<SystemInfo, CoreError> {
28 {
29 let guard = self.inner.integration_client.lock().await;
30 if let Some(ic) = guard.as_ref() {
31 let info = ic.get_info().await?;
32 let fields = &info.fields;
33 return Ok(SystemInfo {
34 controller_name: fields
35 .get("applicationName")
36 .or_else(|| fields.get("name"))
37 .and_then(|value| value.as_str())
38 .map(String::from),
39 version: fields
40 .get("applicationVersion")
41 .or_else(|| fields.get("version"))
42 .and_then(|value| value.as_str())
43 .unwrap_or("unknown")
44 .to_owned(),
45 build: fields
46 .get("build")
47 .and_then(|value| value.as_str())
48 .map(String::from),
49 hostname: fields
50 .get("hostname")
51 .and_then(|value| value.as_str())
52 .map(String::from),
53 ip: None,
54 uptime_secs: fields.get("uptime").and_then(serde_json::Value::as_u64),
55 update_available: fields
56 .get("isUpdateAvailable")
57 .or_else(|| fields.get("update_available"))
58 .and_then(serde_json::Value::as_bool),
59 });
60 }
61 }
62
63 let guard = self.inner.session_client.lock().await;
64 let session = require_session(guard.as_ref())?;
65 let raw = session.get_sysinfo().await?;
66 Ok(SystemInfo {
67 controller_name: raw
68 .get("controller_name")
69 .or_else(|| raw.get("name"))
70 .and_then(|value| value.as_str())
71 .map(String::from),
72 version: raw
73 .get("version")
74 .and_then(|value| value.as_str())
75 .unwrap_or("unknown")
76 .to_owned(),
77 build: raw
78 .get("build")
79 .and_then(|value| value.as_str())
80 .map(String::from),
81 hostname: raw
82 .get("hostname")
83 .and_then(|value| value.as_str())
84 .map(String::from),
85 ip: raw
86 .get("ip_addrs")
87 .and_then(|value| value.as_array())
88 .and_then(|values| values.first())
89 .and_then(|value| value.as_str())
90 .and_then(|value| value.parse().ok()),
91 uptime_secs: raw.get("uptime").and_then(serde_json::Value::as_u64),
92 update_available: raw
93 .get("update_available")
94 .and_then(serde_json::Value::as_bool),
95 })
96 }
97
98 pub async fn get_site_health(&self) -> Result<Vec<HealthSummary>, CoreError> {
99 let guard = self.inner.session_client.lock().await;
100 let session = require_session(guard.as_ref())?;
101 let raw = session.get_health().await?;
102 Ok(convert_health_summaries(raw))
103 }
104
105 pub async fn get_sysinfo(&self) -> Result<SysInfo, CoreError> {
106 let guard = self.inner.session_client.lock().await;
107 let session = require_session(guard.as_ref())?;
108 let raw = session.get_sysinfo().await?;
109 Ok(SysInfo {
110 timezone: raw
111 .get("timezone")
112 .and_then(|value| value.as_str())
113 .map(String::from),
114 autobackup: raw.get("autobackup").and_then(serde_json::Value::as_bool),
115 hostname: raw
116 .get("hostname")
117 .and_then(|value| value.as_str())
118 .map(String::from),
119 ip_addrs: raw
120 .get("ip_addrs")
121 .and_then(|value| value.as_array())
122 .map(|values| {
123 values
124 .iter()
125 .filter_map(|value| value.as_str().map(String::from))
126 .collect()
127 })
128 .unwrap_or_default(),
129 live_chat: raw
130 .get("live_chat")
131 .and_then(|value| value.as_str())
132 .map(String::from),
133 #[allow(clippy::as_conversions, clippy::cast_possible_truncation)]
134 data_retention_days: raw
135 .get("data_retention_days")
136 .and_then(serde_json::Value::as_u64)
137 .map(|value| value as u32),
138 extra: raw,
139 })
140 }
141}