Skip to content

Commit fec71b5

Browse files
committed
feat: add networks support
1 parent 126ce2c commit fec71b5

9 files changed

Lines changed: 262 additions & 15 deletions

File tree

src/config/deserialize.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,30 @@ struct ConfigWrapper<'a> {
2121
struct InfoConfig<'a> {
2222
#[serde(default, borrow)]
2323
disks: Option<DisksInfoConfig<'a>>,
24+
#[serde(default, borrow)]
25+
networks: Option<NetworksInfoConfig<'a>>,
2426
}
2527

2628
#[derive(Debug, Deserialize)]
2729
struct DisksInfoConfig<'a> {
2830
#[serde(default, borrow)]
2931
exclude: Option<Vec<&'a str>>,
32+
#[serde(default, borrow)]
33+
include: Option<Vec<&'a str>>,
34+
}
35+
36+
#[derive(Debug, Deserialize)]
37+
struct NetworksInfoConfig<'a> {
38+
#[serde(default, borrow)]
39+
exclude: Option<Vec<&'a str>>,
40+
#[serde(default, borrow)]
41+
include: Option<Vec<&'a str>>,
42+
#[serde(default)]
43+
private_only: Option<bool>,
44+
#[serde(default)]
45+
assigned_only: Option<bool>,
46+
#[serde(default)]
47+
ignore_loopback: Option<bool>,
3048
}
3149

3250
#[derive(Debug, Deserialize)]
@@ -212,6 +230,17 @@ impl<'de: 'static> serde::Deserialize<'de> for super::Config {
212230
.disks
213231
.map(|disks| super::DisksInfoConfig {
214232
exclude: disks.exclude.unwrap_or_default(),
233+
include: disks.include,
234+
})
235+
.unwrap_or_default(),
236+
networks: info
237+
.networks
238+
.map(|networks| super::NetworksInfoConfig {
239+
exclude: networks.exclude.unwrap_or_default(),
240+
include: networks.include,
241+
private_only: networks.private_only.unwrap_or(true),
242+
assigned_only: networks.assigned_only.unwrap_or(true),
243+
ignore_loopback: networks.ignore_loopback.unwrap_or(true),
215244
})
216245
.unwrap_or_default(),
217246
})

src/config/mod.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,47 @@ pub struct Config {
3131
#[derive(Debug, Default, Decode, Encode)]
3232
pub struct InfoConfig<'a> {
3333
pub disks: DisksInfoConfig<'a>,
34+
pub networks: NetworksInfoConfig<'a>,
3435
}
3536

3637
#[derive(Debug, Decode, Encode)]
3738
pub struct DisksInfoConfig<'a> {
3839
pub exclude: Vec<&'a str>,
40+
pub include: Option<Vec<&'a str>>,
41+
}
42+
43+
#[derive(Debug, Decode, Encode)]
44+
pub struct NetworksInfoConfig<'a> {
45+
pub exclude: Vec<&'a str>,
46+
pub include: Option<Vec<&'a str>>,
47+
pub private_only: bool,
48+
pub assigned_only: bool,
49+
pub ignore_loopback: bool,
3950
}
4051

4152
impl<'a> Default for DisksInfoConfig<'a> {
4253
fn default() -> Self {
4354
Self {
55+
include: None,
4456
exclude: vec!["/boot", "/etc", "/snapd", "/docker"],
4557
}
4658
}
4759
}
4860

61+
impl<'a> Default for NetworksInfoConfig<'a> {
62+
fn default() -> Self {
63+
Self {
64+
include: None,
65+
exclude: vec![
66+
"br-", "docker", "veth", "tun", "tap", "wg", "virbr", "vmnet",
67+
],
68+
private_only: true,
69+
assigned_only: true,
70+
ignore_loopback: true,
71+
}
72+
}
73+
}
74+
4975
#[derive(Debug, Decode, Encode)]
5076
pub struct ColorOption {
5177
pub header: Option<ColorWrapper>,

src/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use afetch::system::kernel::get_kernel;
1010
use afetch::system::loadavg::get_loadavg;
1111
use afetch::system::memory::get_memory;
1212
use afetch::system::motherboard::get_motherboard;
13+
use afetch::system::networks::get_networks;
1314
use afetch::system::product::get_product;
1415
use afetch::system::uptime::get_uptime;
1516
use afetch::system::{InfoGroup, InfoKind, InfoResult};
@@ -44,6 +45,7 @@ fn main() -> Result<(), FetchInfoError> {
4445
InfoKind::Loadavg => get_loadavg(language_func, fields, &config),
4546
InfoKind::Memory => get_memory(language_func, fields, &config),
4647
InfoKind::Motherboard => get_motherboard(language_func, fields, &config),
48+
InfoKind::Networks => get_networks(language_func, fields, &config),
4749
InfoKind::Product => get_product(language_func, fields, &config),
4850
InfoKind::Uptime => get_uptime(language_func, fields, &config),
4951
},

src/system/disk.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::config::Config;
22
use crate::error::FetchInfoError;
33
use crate::filtered_values;
4+
use crate::system::disks::ignore_disk;
45
use crate::system::{InfoField, InfoGroup, InfoResult, InfoValue};
56
use crate::util::ToOptionString;
67
use crate::util::convert_to_readable_unity;
@@ -16,13 +17,7 @@ pub fn get_disk(
1617
for disk in Disks::new_with_refreshed_list().list() {
1718
let mount_point = disk.mount_point().to_string_lossy().to_string();
1819

19-
if config
20-
.parameters
21-
.disks
22-
.exclude
23-
.iter()
24-
.any(|ignore| mount_point.starts_with(ignore))
25-
{
20+
if ignore_disk(config, &mount_point) {
2621
continue;
2722
}
2823

src/system/disks.rs

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,32 +14,29 @@ pub fn get_disks(
1414
let mut available_space = 0;
1515
let mut total_space = 0;
1616
let mut count = 0;
17+
let mut count_filtered = 0;
1718

1819
for disk in
1920
Disks::new_with_refreshed_list_specifics(DiskRefreshKind::nothing().with_storage()).list()
2021
{
2122
let mount_point = disk.mount_point().to_string_lossy().to_string();
23+
count += 1;
2224

23-
if config
24-
.parameters
25-
.disks
26-
.exclude
27-
.iter()
28-
.any(|ignore| mount_point.starts_with(ignore))
29-
{
25+
if ignore_disk(config, &mount_point) {
3026
continue;
3127
}
3228

3329
available_space += disk.available_space();
3430
total_space += disk.total_space();
35-
count += 1;
31+
count_filtered += 1;
3632
}
3733

3834
Ok(InfoResult::Single(InfoGroup {
3935
values: filtered_values!(
4036
fields,
4137
[
4238
(InfoField::DisksCount, count.to_string()),
39+
(InfoField::DisksCountFiltered, count_filtered.to_string()),
4340
(
4441
InfoField::DisksAvailableSpace,
4542
convert_to_readable_unity(available_space as f64)
@@ -56,3 +53,22 @@ pub fn get_disks(
5653
),
5754
}))
5855
}
56+
57+
pub(crate) fn ignore_disk(config: &Config, mount_point: &str) -> bool {
58+
config
59+
.parameters
60+
.disks
61+
.exclude
62+
.iter()
63+
.any(|ignore| mount_point.starts_with(ignore))
64+
|| config
65+
.parameters
66+
.disks
67+
.include
68+
.as_ref()
69+
.is_some_and(|include| {
70+
!include
71+
.iter()
72+
.any(|&include| mount_point.starts_with(include))
73+
})
74+
}

src/system/mod.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pub mod kernel;
1212
pub mod loadavg;
1313
pub mod memory;
1414
pub mod motherboard;
15+
pub mod networks;
1516
pub mod product;
1617
pub mod uptime;
1718

@@ -30,6 +31,7 @@ pub enum InfoKind {
3031
Loadavg,
3132
Memory,
3233
Motherboard,
34+
Networks,
3335
Product,
3436
Uptime,
3537
}
@@ -77,6 +79,7 @@ impl InfoKind {
7779
],
7880
Self::Disks => &[
7981
InfoField::DisksCount,
82+
InfoField::DisksCountFiltered,
8083
InfoField::DisksAvailableSpace,
8184
InfoField::DisksUsedSpace,
8285
InfoField::DisksTotalSpace,
@@ -104,6 +107,21 @@ impl InfoKind {
104107
InfoField::MotherboardVendorName,
105108
InfoField::MotherboardVersion,
106109
],
110+
Self::Networks => &[
111+
InfoField::NetworkName,
112+
InfoField::NetworkFirstIp,
113+
InfoField::NetworkPreferFirstIpv4,
114+
InfoField::NetworkPreferFirstIpv6,
115+
InfoField::NetworkAllIp,
116+
InfoField::NetworkMacAddress,
117+
InfoField::NetworkMaximumTransferUnit,
118+
InfoField::NetworkErrorsOnReceived,
119+
InfoField::NetworkErrorsOnTransmitted,
120+
InfoField::NetworkPacketsReceived,
121+
InfoField::NetworkPacketsTransmitted,
122+
InfoField::NetworkReceived,
123+
InfoField::NetworkTransmitted,
124+
],
107125
Self::Product => &[
108126
InfoField::ProductFamily,
109127
InfoField::ProductName,
@@ -128,6 +146,7 @@ impl InfoKind {
128146
Self::Loadavg => "{loadavg_one}, {loadavg_five}, {loadavg_fifteen}",
129147
Self::Memory => "{memory_used} / {memory_total}",
130148
Self::Motherboard => "{motherboard_name} {motherboard_version}",
149+
Self::Networks => "{network_prefer_first_ipv6}",
131150
Self::Product => "{product_name} {product_version}",
132151
Self::Uptime => "{uptime}",
133152
}
@@ -144,6 +163,7 @@ impl InfoKind {
144163
Self::Loadavg => "loadavg",
145164
Self::Memory => "memory",
146165
Self::Motherboard => "motherboard",
166+
Self::Networks => "networks",
147167
Self::Product => "host",
148168
Self::Uptime => "uptime",
149169
}
@@ -185,6 +205,7 @@ pub enum InfoField {
185205
DiskWrittenSinceBoot,
186206
DiskReadSinceBoot,
187207
DisksCount,
208+
DisksCountFiltered,
188209
DisksAvailableSpace,
189210
DisksUsedSpace,
190211
DisksTotalSpace,
@@ -206,6 +227,19 @@ pub enum InfoField {
206227
MotherboardSerialNumber,
207228
MotherboardVendorName,
208229
MotherboardVersion,
230+
NetworkName,
231+
NetworkFirstIp,
232+
NetworkPreferFirstIpv4,
233+
NetworkPreferFirstIpv6,
234+
NetworkAllIp,
235+
NetworkMacAddress,
236+
NetworkMaximumTransferUnit,
237+
NetworkErrorsOnReceived,
238+
NetworkErrorsOnTransmitted,
239+
NetworkPacketsReceived,
240+
NetworkPacketsTransmitted,
241+
NetworkReceived,
242+
NetworkTransmitted,
209243
ProductFamily,
210244
ProductName,
211245
ProductSerialNumber,
@@ -253,6 +287,7 @@ impl InfoField {
253287
Self::DiskWrittenSinceBoot => "disk_written_since_boot",
254288
Self::DiskReadSinceBoot => "disk_read_since_boot",
255289
Self::DisksCount => "disks_count",
290+
Self::DisksCountFiltered => "disks_count_filtered",
256291
Self::DisksAvailableSpace => "disks_available_space",
257292
Self::DisksUsedSpace => "disks_used_space",
258293
Self::DisksTotalSpace => "disks_total_space",
@@ -274,6 +309,19 @@ impl InfoField {
274309
Self::MotherboardSerialNumber => "motherboard_serial_number",
275310
Self::MotherboardVendorName => "motherboard_vendor_name",
276311
Self::MotherboardVersion => "motherboard_version",
312+
Self::NetworkName => "network_name",
313+
Self::NetworkPreferFirstIpv4 => "network_prefer_first_ipv4",
314+
Self::NetworkPreferFirstIpv6 => "network_prefer_first_ipv6",
315+
Self::NetworkFirstIp => "network_first_ip",
316+
Self::NetworkAllIp => "network_all_ip",
317+
Self::NetworkMacAddress => "network_mac_address",
318+
Self::NetworkMaximumTransferUnit => "network_maximum_transfer_unit",
319+
Self::NetworkErrorsOnReceived => "network_errors_on_received",
320+
Self::NetworkErrorsOnTransmitted => "network_errors_on_transmitted",
321+
Self::NetworkPacketsReceived => "network_packets_received",
322+
Self::NetworkPacketsTransmitted => "network_packets_transmitted",
323+
Self::NetworkReceived => "network_received",
324+
Self::NetworkTransmitted => "network_transmitted",
277325
Self::ProductFamily => "product_family",
278326
Self::ProductName => "product_name",
279327
Self::ProductSerialNumber => "product_serial_number",

0 commit comments

Comments
 (0)