Change to mysql, add extra fields, add changebale interval

This commit is contained in:
2026-08-28 10:52:56 +03:00
parent 6395a8e672
commit ac6f935239
8 changed files with 481 additions and 56 deletions

343
Cargo.lock generated
View File

@@ -227,6 +227,15 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
[[package]]
name = "cmake"
version = "0.1.58"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678"
dependencies = [
"cc",
]
[[package]]
name = "colorchoice"
version = "1.0.5"
@@ -318,7 +327,10 @@ dependencies = [
"diesel_derives",
"downcast-rs",
"itoa",
"mysqlclient-sys",
"percent-encoding",
"pq-sys",
"url",
]
[[package]]
@@ -354,6 +366,17 @@ dependencies = [
"syn 2.0.118",
]
[[package]]
name = "displaydoc"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.118",
]
[[package]]
name = "downcast-rs"
version = "2.0.2"
@@ -437,6 +460,15 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
[[package]]
name = "form_urlencoded"
version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
dependencies = [
"percent-encoding",
]
[[package]]
name = "futures"
version = "0.3.34"
@@ -564,6 +596,12 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "humantime"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15"
[[package]]
name = "iana-time-zone"
version = "0.1.65"
@@ -588,12 +626,115 @@ dependencies = [
"cc",
]
[[package]]
name = "icu_collections"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c"
dependencies = [
"displaydoc",
"potential_utf",
"utf8_iter",
"yoke",
"zerofrom",
"zerovec",
]
[[package]]
name = "icu_locale_core"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29"
dependencies = [
"displaydoc",
"litemap",
"tinystr",
"writeable",
"zerovec",
]
[[package]]
name = "icu_normalizer"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4"
dependencies = [
"icu_collections",
"icu_normalizer_data",
"icu_properties",
"icu_provider",
"smallvec",
"zerovec",
]
[[package]]
name = "icu_normalizer_data"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38"
[[package]]
name = "icu_properties"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de"
dependencies = [
"icu_collections",
"icu_locale_core",
"icu_properties_data",
"icu_provider",
"zerotrie",
"zerovec",
]
[[package]]
name = "icu_properties_data"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14"
[[package]]
name = "icu_provider"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421"
dependencies = [
"displaydoc",
"icu_locale_core",
"writeable",
"yoke",
"zerofrom",
"zerotrie",
"zerovec",
]
[[package]]
name = "ident_case"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]]
name = "idna"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
dependencies = [
"idna_adapter",
"smallvec",
"utf8_iter",
]
[[package]]
name = "idna_adapter"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
dependencies = [
"icu_normalizer",
"icu_properties",
]
[[package]]
name = "indexmap"
version = "2.14.0"
@@ -664,6 +805,21 @@ version = "0.2.186"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
[[package]]
name = "link-cplusplus"
version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f78c730aaa7d0b9336a299029ea49f9ee53b0ed06e9202e8cb7db9bae7b8c82"
dependencies = [
"cc",
]
[[package]]
name = "litemap"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"
[[package]]
name = "lock_api"
version = "0.4.14"
@@ -757,6 +913,30 @@ dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "mysqlclient-src"
version = "0.2.2+9.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5918bf2cec3b9a991a82fe9a9e0773997255b7bb6d11a50e8200bdfee9f2953"
dependencies = [
"cmake",
"link-cplusplus",
"openssl-sys",
]
[[package]]
name = "mysqlclient-sys"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92ed7312f0cfc4032aea6f8ea2abb4d288e4413e33bf0c80ad30eef8aa8fb9d8"
dependencies = [
"mysqlclient-src",
"openssl-sys",
"pkg-config",
"semver",
"vcpkg",
]
[[package]]
name = "nom"
version = "7.1.3"
@@ -788,6 +968,18 @@ version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
[[package]]
name = "openssl-sys"
version = "0.9.117"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695"
dependencies = [
"cc",
"libc",
"pkg-config",
"vcpkg",
]
[[package]]
name = "papergrid"
version = "0.18.0"
@@ -833,6 +1025,12 @@ dependencies = [
"num-traits",
]
[[package]]
name = "percent-encoding"
version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
name = "pin-project-lite"
version = "0.2.17"
@@ -860,6 +1058,15 @@ dependencies = [
"portable-atomic",
]
[[package]]
name = "potential_utf"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564"
dependencies = [
"zerovec",
]
[[package]]
name = "pq-sys"
version = "0.7.5"
@@ -1014,6 +1221,12 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "semver"
version = "1.0.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
[[package]]
name = "serde"
version = "1.0.228"
@@ -1104,6 +1317,12 @@ dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "stable_deref_trait"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
[[package]]
name = "strsim"
version = "0.11.1"
@@ -1138,6 +1357,17 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "synstructure"
version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.118",
]
[[package]]
name = "tabled"
version = "0.21.0"
@@ -1194,6 +1424,16 @@ dependencies = [
"syn 2.0.118",
]
[[package]]
name = "tinystr"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d"
dependencies = [
"displaydoc",
"zerovec",
]
[[package]]
name = "tokio"
version = "1.52.3"
@@ -1311,6 +1551,24 @@ version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
name = "url"
version = "2.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
dependencies = [
"form_urlencoded",
"idna",
"percent-encoding",
"serde",
]
[[package]]
name = "utf8_iter"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "utf8parse"
version = "0.2.2"
@@ -1354,9 +1612,11 @@ dependencies = [
"diesel_migrations",
"env_logger",
"futures",
"humantime",
"lazy_static",
"log",
"mikrotik-rs",
"mysqlclient-sys",
"parse_int",
"regex",
"serde",
@@ -1570,12 +1830,95 @@ version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1"
[[package]]
name = "writeable"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
[[package]]
name = "yoke"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca"
dependencies = [
"stable_deref_trait",
"yoke-derive",
"zerofrom",
]
[[package]]
name = "yoke-derive"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.118",
"synstructure",
]
[[package]]
name = "zerofrom"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df"
dependencies = [
"zerofrom-derive",
]
[[package]]
name = "zerofrom-derive"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.118",
"synstructure",
]
[[package]]
name = "zeroize"
version = "1.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
[[package]]
name = "zerotrie"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf"
dependencies = [
"displaydoc",
"yoke",
"zerofrom",
]
[[package]]
name = "zerovec"
version = "0.11.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239"
dependencies = [
"yoke",
"zerofrom",
"zerovec-derive",
]
[[package]]
name = "zerovec-derive"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.118",
]
[[package]]
name = "zmij"
version = "1.0.21"

View File

@@ -12,8 +12,9 @@ anyhow = "1.0.103"
camino = { version = "1.2.4", features = ["serde1"] }
chrono = "0.4.45"
clap = { version = "4.6.1", features = ["derive"] }
diesel = { version = "2.3.12", features = ["chrono", "postgres"] }
diesel = { version = "2.3.12", features = ["chrono", "postgres", "mysql"] }
diesel_migrations = "2.3.2"
mysqlclient-sys = { version = "0.5", features = ["bundled"] }
env_logger = "0.11.11"
futures = "0.3.34"
lazy_static = "1.5.0"
@@ -26,3 +27,4 @@ serde_json = "1.0.150"
tabled = { version = "0.21.0", features = ["ansi"] }
tokio = { version = "1.52.3", features = ["full"] }
toml = "1.1.2"
humantime = "2.4.0"

View File

@@ -1,17 +1,24 @@
CREATE TABLE IF NOT EXISTS antennas (
id BIGSERIAL PRIMARY KEY NOT NULL,
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name TEXT NOT NULL,
ip TEXT NOT NULL UNIQUE,
error TEXT
ip VARCHAR(15) NOT NULL UNIQUE,
error TEXT,
last_error_t TIMESTAMP NULL
);
CREATE TABLE IF NOT EXISTS client_readings (
id BIGSERIAL PRIMARY KEY NOT NULL,
ip TEXT NOT NULL,
mac TEXT NOT NULL,
antenna_ip TEXT NOT NULL REFERENCES antennas(ip),
db_reading INTEGER NOT NULL,
read_at TIMESTAMP NOT NULL DEFAULT NOW()
id BIGINT AUTO_INCREMENT PRIMARY KEY,
ip VARCHAR(15) NOT NULL,
mac VARCHAR(17) NOT NULL,
antenna_ip VARCHAR(15) NOT NULL,
db_reading INT NOT NULL,
read_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
tx_ccq INT,
rx_ccq INT,
radio_name VARCHAR(255),
tx_rate VARCHAR(50),
rx_rate VARCHAR(50),
CONSTRAINT fk_client_readings_antenna FOREIGN KEY (antenna_ip) REFERENCES antennas(ip)
);

View File

@@ -91,7 +91,10 @@ pub enum CliCommand {
#[command(subcommand)]
command: CliDeviceCommand,
},
BesWifi,
BesWifi {
#[arg(long, short = 'i', value_parser = humantime::parse_duration, default_value="5m")]
interval: std::time::Duration,
},
#[default]
#[clap(skip)]

View File

@@ -1,4 +1,4 @@
use diesel::pg::PgConnection;
use diesel::MysqlConnection as DbConnection;
use diesel::prelude::*;
use diesel_migrations::{EmbeddedMigrations, MigrationHarness, embed_migrations};
@@ -7,8 +7,8 @@ pub mod schema;
pub const MIGRATIONS: EmbeddedMigrations = embed_migrations!();
pub fn init_db(database_url: &str) -> PgConnection {
let mut connection = PgConnection::establish(database_url)
pub fn init_db(database_url: &str) -> DbConnection {
let mut connection = DbConnection::establish(database_url)
.unwrap_or_else(|e| panic!("Error connecting to database: {e}"));
connection

View File

@@ -4,7 +4,7 @@ use diesel::prelude::*;
#[derive(Debug, Queryable, Selectable)]
#[diesel(table_name = crate::db::schema::antennas)]
#[diesel(check_for_backend(diesel::pg::Pg))]
#[diesel(check_for_backend(diesel::mysql::Mysql))]
pub struct Antenna {
pub id: i64,
pub name: String,
@@ -22,7 +22,7 @@ pub struct NewAntenna {
#[derive(Debug, Queryable, Selectable)]
#[diesel(table_name = crate::db::schema::client_readings)]
#[diesel(check_for_backend(diesel::pg::Pg))]
#[diesel(check_for_backend(diesel::mysql::Mysql))]
pub struct ClientReading {
pub id: i64,
pub ip: String,
@@ -30,6 +30,11 @@ pub struct ClientReading {
pub antenna_ip: String,
pub db_reading: i32,
pub read_at: NaiveDateTime,
pub tx_ccq: i32,
pub rx_ccq: i32,
pub radio_name: String,
pub tx_rate: String,
pub rx_rate: String,
}
#[derive(Debug, Insertable)]
@@ -39,4 +44,9 @@ pub struct NewClientReading {
pub mac: String,
pub antenna_ip: String,
pub db_reading: i32,
pub tx_ccq: i32,
pub rx_ccq: i32,
pub radio_name: String,
pub tx_rate: String,
pub rx_rate: String,
}

View File

@@ -1,4 +1,4 @@
// @generated automatically by Diesel CLI.
// Written manually because diesel cant fucking read the db properly for some reason
diesel::table! {
antennas (id) {
@@ -17,6 +17,11 @@ diesel::table! {
antenna_ip -> Text,
db_reading -> Int4,
read_at -> Timestamp,
tx_ccq -> Int4,
rx_ccq -> Int4,
radio_name -> Varchar,
tx_rate -> Varchar,
rx_rate -> Varchar,
}
}

View File

@@ -55,7 +55,7 @@ async fn main() -> anyhow::Result<()> {
mt_commander::MtCommander::init(cfg.clone())?;
match &cfg.cli.command {
CliCommand::BesWifi => {
CliCommand::BesWifi { interval } => {
let mut conn = db::init_db(&cfg.db_url);
for host in &cfg.hosts {
@@ -66,7 +66,7 @@ async fn main() -> anyhow::Result<()> {
ip: host.ip.to_string(),
error: None,
})
.on_conflict(antennas::ip)
.on_conflict(diesel::dsl::DuplicatedKeys)
.do_update()
.set((
antennas::name.eq(host.name.clone()),
@@ -93,7 +93,7 @@ async fn main() -> anyhow::Result<()> {
let v6_cmd = "/interface/wireless/registration-table/print";
let v7_cmd = "/interface/wifi/registration-table/print";
let mut interval = time::interval(Duration::from_mins(3));
let mut interval = time::interval(*interval);
loop {
interval.tick().await;
@@ -104,54 +104,109 @@ async fn main() -> anyhow::Result<()> {
);
let mut records = Vec::new();
fn get_val_from_cmd_output<'a, T>(
antenna: &ConfigHost,
command_output: &'a HashMap<String, Option<T>>,
key: &str,
) -> anyhow::Result<&'a T> {
match command_output.get(key) {
Some(Some(val)) => Ok(val),
Some(None) => {
log::warn!(
"[{} | {}] Value of '{key}' was none",
antenna.ip,
antenna.name
);
anyhow::bail!(
"[{} | {}] Value of '{key}' was none",
antenna.ip,
antenna.name
)
}
None => {
log::warn!(
"[{} | {}] Unable to find '{key}' in command output",
antenna.ip,
antenna.name
);
anyhow::bail!(
"[{} | {}] Unable to find '{key}' in command output",
antenna.ip,
antenna.name
)
}
}
}
for (antenna, res) in v6_res?.iter().chain(v7_res?.iter()) {
match res {
Ok(vals) if antenna.tags.contains(&"v7".to_string()) => {
for val in vals {
let client_ip = String::new();
let Some(client_mac) = val.get("mac-address").unwrap() else {
todo!("Do err")
};
let Some(client_db) = val.get("signal").unwrap() else {
todo!("Do err")
};
let client_db =
parse_int::parse::<i32>(client_db).expect("Unparseble number");
records.push(NewClientReading {
ip: client_ip.clone(),
mac: client_mac.clone(),
ip: Default::default(),
mac: get_val_from_cmd_output(antenna, val, "mac-address")
.cloned()
.unwrap_or_default(),
antenna_ip: antenna.ip.to_string(),
db_reading: client_db,
db_reading: get_val_from_cmd_output(antenna, val, "signal")
.map(|db| {
parse_int::parse::<i32>(db).expect("Unparseble int")
})
.unwrap_or_default(),
radio_name: Default::default(),
rx_ccq: Default::default(),
tx_ccq: Default::default(),
tx_rate: get_val_from_cmd_output(antenna, val, "tx-rate")
.cloned()
.unwrap_or_default(),
rx_rate: get_val_from_cmd_output(antenna, val, "rx-rate")
.cloned()
.unwrap_or_default(),
});
}
}
Ok(vals) if antenna.tags.contains(&"v6".to_string()) => {
for val in vals {
let client_ip;
if let Some(ip) = val.get("last-ip") {
client_ip = ip.clone().unwrap();
} else {
client_ip = String::new();
}
let Some(client_mac) = val.get("mac-address").unwrap() else {
todo!("Do err")
};
let Some(mut client_db) =
val.get("signal-strength").unwrap().clone()
else {
todo!("Do err")
};
if client_db.contains("@") {
client_db = client_db.split('@').nth(0).unwrap().to_string();
}
let client_db =
parse_int::parse::<i32>(&client_db).expect("Unparseble number");
records.push(NewClientReading {
ip: client_ip.clone(),
mac: client_mac.clone(),
ip: get_val_from_cmd_output(antenna, val, "last-ip")
.cloned()
.unwrap_or_default(),
mac: get_val_from_cmd_output(antenna, val, "mac-address")
.cloned()
.unwrap_or_default(),
antenna_ip: antenna.ip.to_string(),
db_reading: client_db,
db_reading: get_val_from_cmd_output(
antenna,
val,
"signal-strength",
)
.cloned()
.map(|mut db| {
if db.contains('@') {
db = db.split('@').nth(0).unwrap().to_string();
}
parse_int::parse::<i32>(&db).expect("Unparseble int")
})
.unwrap_or_default(),
radio_name: get_val_from_cmd_output(antenna, val, "radio-name")
.cloned()
.unwrap_or_default(),
rx_ccq: get_val_from_cmd_output(antenna, val, "rx-ccq")
.map(|db| {
parse_int::parse::<i32>(db).expect("Unparseble int")
})
.unwrap_or_default(),
tx_ccq: get_val_from_cmd_output(antenna, val, "tx-ccq")
.map(|db| {
parse_int::parse::<i32>(db).expect("Unparseble int")
})
.unwrap_or_default(),
tx_rate: get_val_from_cmd_output(antenna, val, "tx-rate")
.cloned()
.unwrap_or_default(),
rx_rate: get_val_from_cmd_output(antenna, val, "rx-rate")
.cloned()
.unwrap_or_default(),
});
}
}