Skip to main content

unifly_api/controller/session_queries/
system.rs

1use 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}