From ac6f93523928ffb3810452aa43904a18e1e52719 Mon Sep 17 00:00:00 2001 From: Gvidas Juknevicius Date: Fri, 28 Aug 2026 10:52:56 +0300 Subject: [PATCH] Change to mysql, add extra fields, add changebale interval --- Cargo.lock | 343 ++++++++++++++++++ Cargo.toml | 4 +- .../2026-08-20-121835-0000_initial/up.sql | 27 +- src/config/cli.rs | 5 +- src/db/mod.rs | 6 +- src/db/models.rs | 14 +- src/db/schema.rs | 7 +- src/main.rs | 131 +++++-- 8 files changed, 481 insertions(+), 56 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dab7085..519ef84 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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" diff --git a/Cargo.toml b/Cargo.toml index 2b9e1f8..cb30cd6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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" diff --git a/migrations/2026-08-20-121835-0000_initial/up.sql b/migrations/2026-08-20-121835-0000_initial/up.sql index 78c132d..3cbbd25 100644 --- a/migrations/2026-08-20-121835-0000_initial/up.sql +++ b/migrations/2026-08-20-121835-0000_initial/up.sql @@ -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) ); diff --git a/src/config/cli.rs b/src/config/cli.rs index 1b6d7ee..8eba7ff 100644 --- a/src/config/cli.rs +++ b/src/config/cli.rs @@ -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)] diff --git a/src/db/mod.rs b/src/db/mod.rs index 38f70f3..7075e78 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -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 diff --git a/src/db/models.rs b/src/db/models.rs index 72bc051..651b019 100644 --- a/src/db/models.rs +++ b/src/db/models.rs @@ -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, } diff --git a/src/db/schema.rs b/src/db/schema.rs index f988cf1..c77f463 100644 --- a/src/db/schema.rs +++ b/src/db/schema.rs @@ -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, } } diff --git a/src/main.rs b/src/main.rs index 7107a01..d4a24f4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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>, + 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::(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::(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::(&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::(&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::(db).expect("Unparseble int") + }) + .unwrap_or_default(), + tx_ccq: get_val_from_cmd_output(antenna, val, "tx-ccq") + .map(|db| { + parse_int::parse::(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(), }); } }