networkmanager/
networkmanager.rs

1use crate::dbus_api::DBusAccessor;
2use crate::devices::Device;
3use crate::errors::Error;
4use crate::gen::OrgFreedesktopNetworkManager;
5use crate::types::ReloadFlag;
6use dbus::blocking::Connection;
7
8use num_traits::ToPrimitive;
9
10const NETWORK_MANAGER_BUS: &str = "org.freedesktop.NetworkManager";
11const NETWORK_MANAGER_PATH: &str = "/org/freedesktop/NetworkManager";
12
13pub struct NetworkManager<'a> {
14    dbus_accessor: DBusAccessor<'a>,
15}
16
17impl<'a> NetworkManager<'a> {
18    pub fn new(dbus_connection: &'a Connection) -> Self {
19        NetworkManager {
20            dbus_accessor: DBusAccessor::new(
21                dbus_connection,
22                NETWORK_MANAGER_BUS,
23                NETWORK_MANAGER_PATH,
24            ),
25        }
26    }
27
28    fn paths_to_devices(&self, paths: Vec<dbus::Path<'_>>) -> Result<Vec<Device<'_>>, Error> {
29        let mut res = Vec::new();
30        for path in paths {
31            res.push(Device::new(DBusAccessor::new(
32                self.dbus_accessor.connection,
33                &self.dbus_accessor.bus,
34                &path,
35            ))?);
36        }
37        Ok(res)
38    }
39
40    fn path_to_device(&self, path: dbus::Path<'_>) -> Result<Device<'_>, Error> {
41        Device::new(DBusAccessor::new(
42            self.dbus_accessor.connection,
43            &self.dbus_accessor.bus,
44            &path,
45        ))
46    }
47
48    /// Reloads NetworkManager by the given scope
49    pub fn reload(&self, flags: ReloadFlag) -> Result<(), Error> {
50        match ToPrimitive::to_u32(&flags) {
51            Some(x) => Ok(proxy!(self).reload(x)?),
52            None => Err(Error::UnsupportedType),
53        }
54    }
55
56    /// Returns only realized network devices
57    pub fn get_devices(&self) -> Result<Vec<Device<'_>>, Error> {
58        let dev_paths = proxy!(self).get_devices()?;
59        self.paths_to_devices(dev_paths)
60    }
61
62    /// Returns all the network devices
63    pub fn get_all_devices(&self) -> Result<Vec<Device<'_>>, Error> {
64        let dev_paths = proxy!(self).get_all_devices()?;
65        self.paths_to_devices(dev_paths)
66    }
67
68    pub fn get_device_by_ip_iface(&self, iface: &str) -> Result<Device<'_>, Error> {
69        let dev_path = proxy!(self).get_device_by_ip_iface(iface)?;
70        self.path_to_device(dev_path)
71    }
72
73    pub fn networking_enabled(&self) -> Result<bool, Error> {
74        Ok(proxy!(self).networking_enabled()?)
75    }
76
77    pub fn wireless_enabled(&self) -> Result<bool, Error> {
78        Ok(proxy!(self).wireless_enabled()?)
79    }
80
81    pub fn wireless_hardware_enabled(&self) -> Result<bool, Error> {
82        Ok(proxy!(self).wireless_hardware_enabled()?)
83    }
84
85    /// Shows if NetworkManager is currently starting up
86    pub fn startup(&self) -> Result<bool, Error> {
87        Ok(proxy!(self).startup()?)
88    }
89}