tof_control/switch_control/
switch_info.rs1use snmp::SyncSession;
2use std::time::Duration;
3
4use crate::helper::switch_type::{SwitchInfo, SwitchError};
5use super::switch_util::{snmp_get_integer, snmp_get_unsigned32, snmp_get_octetstring, snmp_get_octetstring_raw};
6
7impl SwitchInfo {
8 pub fn new(ip_addr: &str) -> Self {
9 match Self::read_info(ip_addr) {
10 Ok(switch_info) => {
11 switch_info
12 }
13 Err(_) => {
14 Self {
15 hostname: "".to_string(),
16 uptime: "".to_string(),
17 mac_address: "".to_string(),
18 cpu_load: [u8::MAX, u8::MAX, u8::MAX],
19 ps_status: [u8::MAX, u8::MAX],
20 }
21 }
22 }
23 }
24 pub fn read_info(ip_addr: &str) -> Result<SwitchInfo, SwitchError> {
25 let mut snmp_session = SyncSession::new(ip_addr, b"public", Some(Duration::from_secs(2)), 0)?;
26
27 let hostname = Self::read_hostname(&mut snmp_session)?;
28 let uptime = Self::read_uptime(&mut snmp_session)?;
29 let mac_address = Self::read_mac_address(&mut snmp_session)?;
30 let cpu_load = Self::read_cpu_load(&mut snmp_session)?;
31 let ps_status = Self::read_ps_status(&mut snmp_session)?;
32
33 Ok(
34 SwitchInfo {
35 hostname,
36 uptime,
37 mac_address,
38 cpu_load,
39 ps_status,
40 }
41 )
42 }
43 pub fn read_hostname(session: &mut SyncSession) -> Result<String, SwitchError> {
44 let oid = ".1.3.6.1.4.1.38477.1.50.1.24.1.2.1.1";
45 let hostname = snmp_get_octetstring(oid, session)?;
46
47 Ok(hostname)
48 }
49 pub fn read_uptime(session: &mut SyncSession) -> Result<String, SwitchError> {
50 let oid = ".1.3.6.1.4.1.38477.1.50.1.24.1.3.4.1";
51 let uptime = snmp_get_octetstring(oid, session)?;
52
53 Ok(uptime)
54 }
55 pub fn read_mac_address(session: &mut SyncSession) -> Result<String, SwitchError> {
56 let oid = ".1.3.6.1.4.1.38477.1.50.1.24.1.3.5.1";
57 let mac_address_vec = snmp_get_octetstring_raw(oid, session)?;
58 let mut mac_address: String = Default::default();
59 let mut vec_len = mac_address_vec.len();
60 for octet in mac_address_vec.iter() {
61 let octet_hex = format!("{:02X}", octet);
62 if vec_len == 1 {
63 mac_address = mac_address + &octet_hex;
64 } else {
65 mac_address = mac_address + &octet_hex + "-";
66 vec_len -= 1;
67 }
68 }
69
70 Ok(mac_address)
71 }
72 pub fn read_cpu_load(session: &mut SyncSession) -> Result<[u8; 3], SwitchError> {
73 let oid_100ms = ".1.3.6.1.4.1.38477.1.50.1.24.1.3.1.1";
74 let oid_1s = ".1.3.6.1.4.1.38477.1.50.1.24.1.3.1.2";
75 let oid_10s = ".1.3.6.1.4.1.38477.1.50.1.24.1.3.1.3";
76
77 let cpu_load_avg_100ms = snmp_get_unsigned32(oid_100ms, session)? as u8;
78 let cpu_load_avg_1s = snmp_get_unsigned32(oid_1s, session)? as u8;
79 let cpu_load_avg_10s = snmp_get_unsigned32(oid_10s, session)? as u8;
80
81 Ok([cpu_load_avg_100ms, cpu_load_avg_1s, cpu_load_avg_10s])
82 }
83 pub fn read_ps_status(session: &mut SyncSession) -> Result<[u8; 2], SwitchError> {
84 let oid_main = ".1.3.6.1.4.1.38477.1.50.1.24.1.3.2.1.3.1.1";
85 let oid_redundant = ".1.3.6.1.4.1.38477.1.50.1.24.1.3.2.1.3.1.2";
86
87 let main_ps_status = snmp_get_integer(oid_main, session)? as u8;
88 let redundant_ps_status = snmp_get_integer(oid_redundant, session)? as u8;
89
90 Ok([main_ps_status, redundant_ps_status])
91 }
92 }