1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use kubos_telemetry_db::Database;
use log::info;
use serde_json::{self, Value};
use std::net::{SocketAddr, UdpSocket};
use std::sync::{Arc, Mutex};
pub struct DirectUdp {
db: Arc<Mutex<Database>>,
}
impl DirectUdp {
pub fn new(db: Arc<Mutex<Database>>) -> Self {
DirectUdp { db }
}
pub fn start(&self, url: String) {
let socket = UdpSocket::bind(url.parse::<SocketAddr>().unwrap()).unwrap();
info!("Direct UDP listening on: {}", socket.local_addr().unwrap());
loop {
let mut buf = [0; 4096];
let (size, _peer) = socket
.recv_from(&mut buf)
.map_err(|err| format!("Failed to receive a message: {}", err))
.unwrap();
if let Ok(msg) = serde_json::from_slice(&buf[0..(size)]) {
let _res = self.process(msg);
}
}
}
fn process(&self, message: Value) -> Result<(), String> {
let timestamp = serde_json::from_value::<f64>(message["timestamp"].clone()).ok();
let subsystem = serde_json::from_value::<String>(message["subsystem"].clone())
.map_err(|err| format!("Failed to parse subsystem parameter: {}", err))?;
let param = serde_json::from_value::<String>(message["parameter"].clone())
.map_err(|err| format!("Failed to parse parameter parameter: {}", err))?;
let value = serde_json::from_value::<String>(message["value"].clone())
.map_err(|err| format!("Failed to parse value parameter: {}", err))?;
if let Some(time) = timestamp {
self.db
.lock()
.map_err(|err| format!("{}", err))?
.insert(time, &subsystem, ¶m, &value)
.map_err(|err| format!("{}", err))?;
} else {
self.db
.lock()
.map_err(|err| format!("{}", err))?
.insert_systime(&subsystem, ¶m, &value)
.map_err(|err| format!("{}", err))?;
}
Ok(())
}
}