tof_control/switch_control/
switch_info.rs

1use 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    // pub fn print_switch_info(ip_addr: &str) {
93    //     let switch_info = Self::new(ip_addr);
94
95    //     println!("Switch Info");
96    //     println!("\tHostname:       {}", switch_info.hostname);
97    //     println!("\tUptime:         {}", switch_info.uptime);
98    //     println!("\tMac Address:    {}", switch_info.mac_address);
99    // }
100}