From 4f1f1ba88e9b65cd27870431d07557b5884bc323 Mon Sep 17 00:00:00 2001 From: "Crom (Thibaut CHARLES)" Date: Thu, 14 Feb 2019 08:21:22 +0100 Subject: [PATCH] WIP --- Cargo.lock | 35 +- Cargo.toml | 7 +- src/config.rs | 8 - src/filter.rs | 83 + src/main.rs | 107 +- src/message.rs | 33 +- src/monitor.rs | 2 +- .../monitor => monitors}/dhcp_leases.rs | 79 +- src/monitors/dummy_sender.rs | 75 + src/monitors/mod.rs | 18 + src/monitors/rnetmon.sublime-workspace | 3357 +++++++++++++++++ .../monitor => monitors}/wifi_availability.rs | 21 +- src/output.rs | 45 +- src/outputs/espeak.rs | 38 + src/outputs/light_beewi_bbl227.rs | 298 ++ src/outputs/mod.rs | 20 + src/outputs/stdout.rs | 27 + src/plugins/mod.rs | 2 - src/plugins/monitor/mod.rs | 15 - src/plugins/monitor/tester.rs | 27 - src/plugins/output/bluetooth_lightbulb.rs | 37 - src/plugins/output/espeak.rs | 19 - src/plugins/output/mod.rs | 14 - src/plugins/output/stdout.rs | 14 - 24 files changed, 4131 insertions(+), 250 deletions(-) delete mode 100644 src/config.rs create mode 100644 src/filter.rs rename src/{plugins/monitor => monitors}/dhcp_leases.rs (63%) create mode 100644 src/monitors/dummy_sender.rs create mode 100644 src/monitors/mod.rs create mode 100644 src/monitors/rnetmon.sublime-workspace rename src/{plugins/monitor => monitors}/wifi_availability.rs (75%) create mode 100644 src/outputs/espeak.rs create mode 100644 src/outputs/light_beewi_bbl227.rs create mode 100644 src/outputs/mod.rs create mode 100644 src/outputs/stdout.rs delete mode 100644 src/plugins/mod.rs delete mode 100644 src/plugins/monitor/mod.rs delete mode 100644 src/plugins/monitor/tester.rs delete mode 100644 src/plugins/output/bluetooth_lightbulb.rs delete mode 100644 src/plugins/output/espeak.rs delete mode 100644 src/plugins/output/mod.rs delete mode 100644 src/plugins/output/stdout.rs diff --git a/Cargo.lock b/Cargo.lock index baf4f6f..8fdb65d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. [[package]] name = "aho-corasick" version = "0.6.9" @@ -15,6 +17,11 @@ dependencies = [ "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "byteorder" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "cc" version = "1.0.28" @@ -216,16 +223,20 @@ dependencies = [ "getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "globset 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)", "serde_yaml 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)", + "simplelog 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde" version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde_derive 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "serde_derive" @@ -248,6 +259,16 @@ dependencies = [ "yaml-rust 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "simplelog" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "syn" version = "0.15.26" @@ -258,6 +279,15 @@ dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "term" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "thread_local" version = "0.3.6" @@ -326,6 +356,7 @@ dependencies = [ [metadata] "checksum aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9a933f4e58658d7b12defcf96dc5c720f20832deebe3e0a19efd3b6aaeeb9e" "checksum blurz 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b1bc2df4d0f1d373b324672d9966aca3f5ba1f03d69edad6240144774539ea59" +"checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" "checksum cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4a8b715cb4597106ea87c7c84b2f1d452c7492033765df7f32651e66fcf749" "checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" @@ -355,7 +386,9 @@ dependencies = [ "checksum serde 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)" = "534b8b91a95e0f71bca3ed5824752d558da048d4248c91af873b63bd60519752" "checksum serde_derive 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)" = "a915306b0f1ac5607797697148c223bedeaa36bcc2e28a01441cd638cc6567b4" "checksum serde_yaml 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0887a8e097a69559b56aa2526bf7aff7c3048cf627dff781f0b56a6001534593" +"checksum simplelog 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e95345f185d5adeb8ec93459d2dc99654e294cc6ccf5b75414d8ea262de9a13" "checksum syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)" = "f92e629aa1d9c827b2bb8297046c1ccffc57c99b947a680d3ccff1f136a3bee9" +"checksum term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6b677dd1e8214ea1ef4297f85dbcbed8e8cdddb561040cc998ca2551c37561" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" diff --git a/Cargo.toml b/Cargo.toml index 713fdc8..4dccb3d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,11 +6,12 @@ edition = "2018" [dependencies] libloading = "0.5.0" -serde = "1.0" +serde = { version = "1.0", features = ["derive"] } serde_yaml = "0.8" -serde_derive = "1.0" getopts = "0.2" blurz = "0.4.0" regex = "1" chrono = "0.4" -globset = "0.3" \ No newline at end of file +globset = "0.3" +log = "0.4" +simplelog = "0.5" \ No newline at end of file diff --git a/src/config.rs b/src/config.rs deleted file mode 100644 index 7ba3ace..0000000 --- a/src/config.rs +++ /dev/null @@ -1,8 +0,0 @@ -use serde_derive::*; -use std::collections::HashMap; - -#[derive(Debug, PartialEq, Serialize, Deserialize)] -pub struct Config { - pub monitors: Vec>, - pub outputs: Vec>, -} diff --git a/src/filter.rs b/src/filter.rs new file mode 100644 index 0000000..b505200 --- /dev/null +++ b/src/filter.rs @@ -0,0 +1,83 @@ +use globset::{Glob, GlobMatcher}; + +pub use std::collections::HashMap; + +use log::{info, trace, warn}; + +use crate::message::*; + +#[derive(Debug)] +pub struct Filter { + level: Level, + include_types: Vec, + exclude_types: Vec, +} + +impl Filter { + pub fn new(config: &HashMap) -> Self { + let filter_node = config + .get("filter") + .unwrap_or(&serde_yaml::Mapping::new().into()) + .clone(); + + let include_types = match filter_node.get("include_types") { + Some(v) => v + .as_sequence() + .expect("include_types must be a list of strings") + .into_iter() + .map(|x| { + Glob::new(x.as_str().expect("filter must be a list of strings")) + .expect("Invalid glob pattern") + .compile_matcher() + }) + .collect(), + None => vec![], + }; + let exclude_types = match filter_node.get("exclude_types") { + Some(v) => v + .as_sequence() + .expect("exclude_types must be a list of strings") + .into_iter() + .map(|x| { + Glob::new(x.as_str().expect("filter must be a list of strings")) + .expect("Invalid glob pattern") + .compile_matcher() + }) + .collect(), + None => vec![], + }; + + let level = match filter_node.get("level") { + Some(l) => Level::try_from(l.as_str().expect("Level must be a string")) + .expect("Unknown level name"), + None => Level::Notice, + }; + + Filter { + level: level, + include_types: include_types, + exclude_types: exclude_types, + } + } + + pub fn is_message_allowed(&self, message: &Message) -> bool { + if message.level < self.level { + return false; + } + for exc in &self.exclude_types { + if exc.is_match(&message.msg_type) { + return false; + } + } + if self.include_types.len() > 0 { + for exc in &self.include_types { + if exc.is_match(&message.msg_type) { + return true; + } + } + return false; + } else { + return true; + } + } +} diff --git a/src/main.rs b/src/main.rs index 94b6276..95368b0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,25 +1,37 @@ -mod config; +#![feature(unrestricted_attribute_tokens)] +#![feature(custom_attribute)] +#![feature(try_from)] + +mod filter; mod message; mod monitor; +mod monitors; mod output; -mod plugins; +mod outputs; extern crate getopts; -extern crate serde_derive; +extern crate globset; +extern crate log; extern crate serde_yaml; +extern crate simplelog; +use getopts::Options; +use serde::Deserialize; +use std::collections::HashMap; use std::env; use std::fs::File; use std::io::prelude::*; use std::sync::mpsc; use std::thread; -use getopts::Options; - -use crate::config::*; +use crate::filter::*; use crate::message::*; -use crate::monitor::*; -use crate::output::*; + +#[derive(Debug, Deserialize)] +pub struct AppConfig { + pub monitors: Vec>, + pub outputs: Vec>, +} fn main() { let args: Vec = env::args().collect(); @@ -33,6 +45,8 @@ fn main() { "config.yaml", ); opts.optflag("h", "help", "print this help menu"); + opts.optflag("v", "verbose", "Switch to DEBUG output"); + opts.optflag("q", "quiet", "Switch to WARNING output"); let matches = match opts.parse(&args[1..]) { Ok(m) => m, @@ -44,6 +58,30 @@ fn main() { return; } + let level; + if matches.opt_present("v") && matches.opt_present("q") { + panic!("-v and -q are mutually exclusive"); + } + if matches.opt_present("v") { + level = simplelog::LevelFilter::Debug; + } else if matches.opt_present("q") { + level = simplelog::LevelFilter::Warn; + } else { + level = simplelog::LevelFilter::Info; + } + + simplelog::TermLogger::init( + level, + simplelog::Config { + time: Some(simplelog::Level::Debug), + level: Some(simplelog::Level::Error), + target: Some(simplelog::Level::Info), + location: Some(simplelog::Level::Debug), + time_format: None, + }, + ) + .unwrap(); + // Parse config let config_path = matches.opt_str("c").unwrap_or("./config.yaml".to_owned()); @@ -52,7 +90,7 @@ fn main() { config_file .read_to_string(&mut config_content) .expect("Could not read configuration file"); - let config: Config = + let config: AppConfig = serde_yaml::from_str(&config_content).expect("Invalid config file content"); // Monitors -> dispatcher channel @@ -60,40 +98,53 @@ fn main() { // Instantiate monitor threads and structs for mon_config in config.monitors { - let name = mon_config - .get("name") - .expect("Missing `name` key for monitor") + let mon_type = mon_config + .get("type") + .expect("Missing `type` key for monitor") .as_str() - .expect("Key `name` for monitor is not a string"); - - println!("Loading monitor: {}", name); + .expect("Key `type` for monitor is not a string") + .to_owned(); let snd = mon_sender.clone(); - let mut mon = plugins::monitor::factory(name, &mon_config); - thread::spawn(move || loop { - mon.run(&snd); + + thread::spawn(move || { + log::info!("+> monitor: {}", mon_type); + match monitors::factory(&mon_type, &mon_config) { + Ok(mut mon) => loop { + mon.run(&snd); + }, + Err(e) => log::error!("Cannot instantiate monitor {}: {}", mon_type, e), + } }); } // Instantiate output threads and structs + // let mut outputs: Vec<(Box, Filter)> = vec![]; let mut output_senders: Vec> = vec![]; for out_config in config.outputs { - let name = out_config - .get("name") - .expect("Missing `name` key for monitor") + let out_type = out_config + .get("type") + .expect("Missing `type` key for output") .as_str() - .expect("Key `name` for monitor is not a string"); - - println!("Loading output: {}", name); + .expect("Key `type` for output is not a string") + .to_owned(); let (out_sender, out_receiver) = mpsc::channel(); output_senders.push(out_sender); - let mut output = plugins::output::factory(name, &out_config); + let filter = Filter::new(&out_config); - thread::spawn(move || loop { - let message = out_receiver.recv().unwrap(); - output.process_message(message); + thread::spawn(move || { + log::info!("+> output: {}", out_type); + match outputs::factory(&out_type, &out_config) { + Ok(mut output) => loop { + let message = out_receiver.recv().unwrap(); + if filter.is_message_allowed(&message) { + output.process_message(message); + } + }, + Err(e) => log::error!("Cannot instantiate output {}: {}", out_type, e), + } }); } let output_senders = output_senders; diff --git a/src/message.rs b/src/message.rs index d4eab40..1d0c96e 100644 --- a/src/message.rs +++ b/src/message.rs @@ -1,10 +1,33 @@ -#[derive(Debug, Clone)] +use serde::Deserialize; +pub use std::convert::TryFrom; + +// pub type Level = u8; + +#[derive(Debug, Clone, Eq, PartialEq, PartialOrd, Hash, Deserialize)] pub enum Level { Debug = 0, - Info = 10, - Warning = 20, - Error = 30, - Critical = 40, + Notice = 1, + Anomaly = 2, + Issue = 3, + Critical = 4, +} + +impl TryFrom<&str> for Level { + type Error = (); + fn try_from(level: &str) -> Result { + match serde_yaml::from_str(level) { + Ok(v) => v, + _ => Err(()), + } + // match level { + // "Debug" => Ok(Level::Debug), + // "Notice" => Ok(Level::Notice), + // "Anomaly" => Ok(Level::Anomaly), + // "Issue" => Ok(Level::Issue), + // "Critical" => Ok(Level::Critical), + // _ => Err(()), + // } + } } #[derive(Debug, Clone)] diff --git a/src/monitor.rs b/src/monitor.rs index 9f06a41..07eddd7 100644 --- a/src/monitor.rs +++ b/src/monitor.rs @@ -4,7 +4,7 @@ pub use std::collections::HashMap; pub use std::sync::mpsc; pub trait Monitor { - fn new(config: &HashMap) -> Self + fn new(config: &HashMap) -> Result> where Self: Sized; fn run(&mut self, sender: &mpsc::Sender); diff --git a/src/plugins/monitor/dhcp_leases.rs b/src/monitors/dhcp_leases.rs similarity index 63% rename from src/plugins/monitor/dhcp_leases.rs rename to src/monitors/dhcp_leases.rs index 3afb7f3..b6b8b48 100644 --- a/src/plugins/monitor/dhcp_leases.rs +++ b/src/monitors/dhcp_leases.rs @@ -1,6 +1,6 @@ pub use crate::message::*; pub use crate::monitor::*; -use serde_derive::*; +use serde::Deserialize; extern crate regex; use regex::Regex; @@ -15,39 +15,49 @@ pub struct DHCPLeases { rgx_date_start: Regex, rgx_date_ends: Regex, } -#[derive(Debug, PartialEq, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Deserialize)] struct DHCPLeasesConfig { + #[serde(default)] path: String, - mac_rules: HashMap>, + #[serde(default)] + mac_rules: HashMap>>, } impl Monitor for DHCPLeases { - fn new(config: &HashMap) -> Self { - let config_node = config.get("config").expect("Missing `config` key").clone(); - let config = - serde_yaml::from_value(config_node).expect("Invalid config for wifi_availability"); + fn new( + config: &HashMap, + ) -> Result> { + let config_node = config + .get("config") + .unwrap_or(&serde_yaml::Mapping::new().into()) + .clone(); + let config = serde_yaml::from_value(config_node).expect("Invalid config for dhcp_leases"); // Regex compilation let rgx_lease = Regex::new(r"(?s)lease\s+(\d+(?:\.\d+){3})\s*\{\n?(.*?)\}").unwrap(); let rgx_mac = - Regex::new(r"^\s*hardware\s+ethernet\s([a-f0-9]{2}(?:\:[a-f0-9]{2}){5})\s*;").unwrap(); + Regex::new(r"^\s*hardware\s+ethernet\s([a-f0-9]{2}(?::[a-f0-9]{2}){5})\s*;").unwrap(); let rgx_date_start = Regex::new(r"^\s*starts\s+(.*?)\s*;").unwrap(); let rgx_date_ends = Regex::new(r"^\s*ends\s+(.*?)\s*;").unwrap(); - DHCPLeases { + Ok(DHCPLeases { config: config, rgx_lease: rgx_lease, rgx_mac: rgx_mac, rgx_date_start: rgx_date_start, rgx_date_ends: rgx_date_ends, - } + }) } fn run(&mut self, sender: &mpsc::Sender) { use std::fs::File; use std::io::prelude::*; + let config_file_path = match self.config.path.len() { + 0 => "/var/lib/dhcp/dhcpd.leases", + _ => &self.config.path, + }; let mut config_file = - File::open(&self.config.path).expect("Could not open DHCP leases file"); + File::open(config_file_path).expect("Could not open DHCP leases file"); let mut config_content = String::new(); config_file .read_to_string(&mut config_content) @@ -91,19 +101,26 @@ impl Monitor for DHCPLeases { if starts <= now && now < ends { // Lease is active if let Some(rules) = self.config.mac_rules.get(mac) { - for rule in rules { - if content.find(rule).is_none() { - unauthorized_macs.push(mac.to_owned()); + // Found rules + if let Some(rules_list) = rules { + // Rules contains one or more entries + for rule in rules_list { + if content.find(rule).is_none() { + unauthorized_macs.push(mac.to_owned()); - sender - .send(Message { - emitter: "dhcp_leases".to_owned(), - level: Level::Error, - msg_type: "dhcp_leases.unauthorized_mac.rule".to_owned(), - text: format!("Mismatching rule '{}' for device {}", rule, mac), - }) - .unwrap(); - break; + sender + .send(Message { + emitter: "dhcp_leases".to_owned(), + level: Level::Issue, + msg_type: "dhcp_leases.unauthorized_mac.rule".to_owned(), + text: format!( + "Mismatching rule '{}' for device {}", + rule, mac + ), + }) + .unwrap(); + break; + } } } } else { @@ -112,7 +129,7 @@ impl Monitor for DHCPLeases { sender .send(Message { emitter: "dhcp_leases".to_owned(), - level: Level::Error, + level: Level::Issue, msg_type: "dhcp_leases.unauthorized_mac.unknown".to_owned(), text: format!("Unauthorized device on network: {}", mac), }) @@ -121,7 +138,19 @@ impl Monitor for DHCPLeases { } } - if unauthorized_macs.len() > 0 {} + if unauthorized_macs.len() > 0 { + sender + .send(Message { + emitter: "dhcp_leases".to_owned(), + level: Level::Issue, + msg_type: "dhcp_leases.unknown_mac".to_owned(), + text: format!( + "The following macs are not allowed: {:?}", + unauthorized_macs + ), + }) + .unwrap(); + } // let leases: Vec<(&str, &str)> = lease_rgx // .captures_iter(&config_content) diff --git a/src/monitors/dummy_sender.rs b/src/monitors/dummy_sender.rs new file mode 100644 index 0000000..96dfab7 --- /dev/null +++ b/src/monitors/dummy_sender.rs @@ -0,0 +1,75 @@ +pub use crate::message::{Level, Message}; +pub use crate::monitor::*; + +use serde::Deserialize; + +#[derive(Debug)] +pub struct DummySender { + cnt: i64, + config: DummySenderConfig, +} +#[derive(Debug, Deserialize)] +struct DummySenderConfig { + #[serde(default)] + message: Option, + #[serde(default)] + level: Option, + #[serde(default)] + msg_type: Option, + #[serde(default)] + period: Option, +} + +impl Monitor for DummySender { + fn new( + config: &HashMap, + ) -> Result> { + let config_node = config + .get("config") + .unwrap_or(&serde_yaml::Mapping::new().into()) + .clone(); + let config: DummySenderConfig = + serde_yaml::from_value(config_node).expect("Invalid config for dummy_sender"); + + Ok(DummySender { + cnt: 0, + config: config, + }) + } + fn run(&mut self, sender: &mpsc::Sender) { + log::info!( + "Sending message {} from {:?}", + self.cnt, + std::thread::current().id() + ); + sender + .send(Message { + emitter: "dummy_sender".to_owned(), + level: match &self.config.level { + Some(l) => l.clone(), + None => Level::Notice, + }, + msg_type: match &self.config.msg_type { + Some(s) => s.to_owned(), + None => "dummy_sender.message".to_owned(), + }, + text: match &self.config.message { + Some(s) => s.to_owned(), + None => format!( + "This is message {} from {:?}", + self.cnt, + std::thread::current().id() + ), + }, + }) + .unwrap(); + + self.cnt += 1; + + let delay_ms = match self.config.period { + Some(sec) => (sec * 1000.0) as u64, + None => 2000, + }; + std::thread::sleep(std::time::Duration::from_millis(delay_ms)); + } +} diff --git a/src/monitors/mod.rs b/src/monitors/mod.rs new file mode 100644 index 0000000..6ce06dc --- /dev/null +++ b/src/monitors/mod.rs @@ -0,0 +1,18 @@ +pub mod dhcp_leases; +pub mod dummy_sender; +pub mod wifi_availability; + +use crate::monitor::*; +use std::collections::HashMap; + +pub fn factory( + name: &str, + config: &HashMap, +) -> Result, Box> { + match name { + "dummy_sender" => Ok(Box::new(dummy_sender::DummySender::new(&config)?)), + "wifi_availability" => Ok(Box::new(wifi_availability::WifiAvailability::new(&config)?)), + "dhcp_leases" => Ok(Box::new(dhcp_leases::DHCPLeases::new(&config)?)), + _ => panic!("Unknown monitor name: {}", name), + } +} diff --git a/src/monitors/rnetmon.sublime-workspace b/src/monitors/rnetmon.sublime-workspace new file mode 100644 index 0000000..0bffac7 --- /dev/null +++ b/src/monitors/rnetmon.sublime-workspace @@ -0,0 +1,3357 @@ +{ + "auto_complete": + { + "selected_items": + [ + [ + "from", + "from_str Function (de.rs) : pub fn from_str(s: &str) -> Result where T: DeserializeOwned, " + ], + [ + "serde", + "serde_yaml Crate (lib.rs) : " + ], + [ + "Gattc", + "BluetoothGATTCharacteristic" + ], + [ + "println", + "println\tprintln!(…)" + ], + [ + "unwrap", + "unwrap_or Function (option.rs) : pub fn unwrap_or(self, def: T) -> T " + ], + [ + "print", + "println! Macro (macros.rs) : macro_rules! println { " + ], + [ + "impl", + "impl\timpl … { … }" + ], + [ + "Des", + "Deserialize Trait (mod.rs) : pub trait Deserialize<'de>: Sized " + ], + [ + "fr", + "from_millis Function (time.rs) : pub const fn from_millis(millis: u64) -> Duration" + ], + [ + "for", + "for\tfor … in … { … }" + ], + [ + "is_no", + "is_some Function (option.rs) : pub fn is_some(&self) -> bool " + ], + [ + "err", + "eprintln! Macro (macros.rs) : macro_rules! eprintln { " + ], + [ + "unwra", + "unwrap_or_else Function (result.rs) : pub fn unwrap_or_else T>(self, op: F) -> T" + ], + [ + "level", + "Level" + ], + [ + "Err", + "Err EnumVariant (result.rs) : Err(#[stable(feature = \" \", since = \" \")] E)," + ], + [ + "Ord", + "PartialOrd Trait (cmp.rs) : pub trait PartialOrd: PartialEq" + ], + [ + "len", + "len Function (vec.rs) : pub fn len(&self) -> usize " + ], + [ + "SystemTime", + "SystemTime Struct (time.rs) : pub struct SystemTime(time::SystemTime)\\ " + ], + [ + "from_str", + "parse_from_str Function (datetime.rs) : pub fn parse_from_str(s: &str, fmt: &str) -> ParseResult>" + ], + [ + "capturefirst", + "captures Function (re_unicode.rs) : pub fn captures<'t>(&self, text: &'t str) -> Option> " + ], + [ + "rgx", + "rgx_mac StructField (dhcp_leases.rs) : rgx_mac: Regex " + ], + [ + "prin", + "println\tprintln!(…)" + ], + [ + "config_con", + "config_content Let (dhcp_leases.rs) : let mut config_content = String::new()\\ " + ], + [ + "ca", + "captures Function (re_unicode.rs) : pub fn captures<'t>(&self, text: &'t str) -> Option> " + ], + [ + "monitor", + "monitor Module (monitor.rs) : /home/crom/GitProjects/rnetmon/src/monitor.rs " + ], + [ + "clone", + "clone Function (clone.rs) : fn clone(&self) -> Self " + ], + [ + "imp", + "impl-trait\timpl … for … { … }" + ], + [ + "slee", + "sleep_ms Function (mod.rs) : pub fn sleep_ms(ms: u32) " + ], + [ + "unequipp", + "GetPCItemLastUnequippedBy\tobject()" + ], + [ + "Timer", + "QueryTimer\t⋄string()" + ], + [ + "CleanerSet", + "Cleaner_SetInt\t⋄void()" + ], + [ + "CasSpell", + "ActionCastSpellAtObject\tvoid()" + ], + [ + "EffectNWN", + "EffectNWN2SpecialEffectFile\teffect()" + ], + [ + "GetHitPo", + "GetCurrentHitPoints\tint()" + ], + [ + "GetMax", + "GetMaxHitPoints\tint()" + ], + [ + "getitemprop", + "GetItemPropertyParam1Value\tint()" + ], + [ + "Campaign", + "DeleteCampaignVariable\tvoid()" + ], + [ + "CreateItemOb", + "CreateItemOnObjectCheckVoid\t⋄void()" + ], + [ + "CreateItemonobj", + "CreateItemOnObjectCheckVoid\t⋄void()" + ], + [ + "strre", + "GetStringByStrRef" + ], + [ + "GetItemProperty", + "GetItemPropertyCostTableValue" + ], + [ + "getitempropert", + "GetItemPropertyType" + ], + [ + "TrnType", + "TrnPacketTypeToPayload\ttemplate" + ], + [ + "TrnNWN", + "TrnNWN2MegatilePayload\tstruct" + ], + [ + "str", + "string\tmodule" + ], + [ + "inden", + "indentLevels\tvariable" + ], + [ + "yaml", + "YamlParseException\tclass" + ], + [ + "Yaml", + "YamlParseException\tclass" + ], + [ + "Scala", + "ScalarType\tenum" + ], + [ + "gffT", + "gffTypeToStringType\tfunction" + ], + [ + "jsonT", + "jsonTypeToGffType\tfunction" + ], + [ + "Json", + "JSON_TYPE\tenum" + ], + [ + "ObjectPre", + "ObjectPreValue\tenum member" + ], + [ + "node", + "nodeStack\tvariable" + ], + [ + "rea", + "rawRead\tfunction" + ], + [ + "Gffexc", + "GffTypeException\tclass" + ], + [ + "mai", + "MAIN\tvariable" + ], + [ + "tas", + "taskPool\tfunction" + ], + [ + "int", + "Int64\tenum member" + ], + [ + "GfTy", + "GffTypeException\tclass" + ], + [ + "struct", + "Struct\tenum member" + ], + [ + "Gff", + "GffTypeException\tclass" + ], + [ + "GffTy", + "GffTypeException\tclass" + ], + [ + "structC", + "structContainer\tvariable" + ], + [ + "isSom", + "isSomeString\tvariable" + ], + [ + "In", + "Invalid\tenum member" + ], + [ + "exolo", + "exoLocStringContainer\tvariable" + ], + [ + "exoLo", + "exoLocStringID\tvariable" + ], + [ + "string", + "stringContainer\tvariable" + ], + [ + "float", + "Float\tenum member" + ], + [ + "floa", + "Float\tenum member" + ], + [ + "right", + "rightJustify\tfunction" + ], + [ + "exoLoc", + "exoLocStringContainerOrder\tvariable" + ], + [ + "shell", + "spawnShell\tfunction" + ], + [ + "fields", + "fieldDatas\tvariable" + ], + [ + "ex", + "exoLocStringContainer\tvariable" + ], + [ + "exoS", + "exoLocStringID\tvariable" + ], + [ + "field", + "field_data_count\tvariable" + ], + [ + "reg", + "registerStruct\tfunction" + ], + [ + "padding-", + "padding-bottom" + ], + [ + "inline", + "inline-block" + ], + [ + "b", + "buildPath\tfunction" + ], + [ + "defa", + "defaultGetoptPrinter\tfunction" + ], + [ + "match", + "matchFirst\tfunction" + ], + [ + "replace", + "replaceAll\tfunction" + ], + [ + "Ex", + "ExoLocString\tenum member" + ], + [ + "by", + "byValue\tkeyword" + ], + [ + "build", + "buildNormalizedPath\tfunction" + ], + [ + "dir", + "DirEntry\tstruct" + ], + [ + "set", + "setState\tfunction" + ], + [ + "getValue", + "getValueAsInt\tfunction" + ], + [ + "value", + "setValue\tfunction" + ], + [ + "Spin", + "SpinButton\tmodule" + ], + [ + "border", + "border-radius" + ], + [ + "back", + "background-color" + ], + [ + "borde", + "border-radius" + ], + [ + "backc", + "background-color" + ], + [ + "ar", + "article\tTag" + ], + [ + "bac", + "background-color" + ], + [ + "wa", + "timedWait\tfunction" + ], + [ + "notify", + "notifyAll\tfunction" + ], + [ + "msecs", + "milliseconds" + ], + [ + "battery", + "Battery" + ], + [ + "m_value", + "m_lastvalue" + ], + [ + "Range", + "RefRange\tstruct" + ], + [ + "ran", + "range\tmodule" + ], + [ + "con", + "container\tmodule" + ], + [ + "m_l", + "m_long" + ], + [ + "GetD", + "GetDistanceTo\tfunction" + ], + [ + "EART", + "EARTH_RADIUS_M\tvariable" + ], + [ + "EAR", + "EARTH_RADIUS_M\tvariable" + ], + [ + "Get", + "GetDistanceTo\tfunction" + ], + [ + "rad", + "EARTH_RADIUS" + ], + [ + "Ra", + "EARTH_RADIUS" + ], + [ + "ata", + "atan2\tfunction" + ], + [ + "targ", + "targetposition\tfunction" + ], + [ + "sailha", + "sailhandler" + ], + [ + "m_fd", + "m_fDanger" + ], + [ + "m", + "maina\tint main(char[][] args) { … }" + ], + [ + "background-c", + "background-color" + ], + [ + "GP", + "GPS" + ], + [ + "ma", + "main\tmain()" + ], + [ + "lo", + "logger\tLogger for Module" + ], + [ + "pr", + "property" + ] + ] + }, + "buffers": + [ + { + "file": "/home/crom/GitProjects/rnetmon/src/main.rs", + "settings": + { + "buffer_size": 3634, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "file": "wifi_availability.rs", + "settings": + { + "buffer_size": 1847, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "contents": "Searching 1798 files for \"wifi_availability\" (regex)\n\n/home/crom/GitProjects/rnetmon/config.yaml:\n 1 monitors:\n 2: # - type: wifi_availability\n 3 # config:\n 4 # iface: lo\n\n/home/crom/GitProjects/rnetmon/src/plugins/monitor/dhcp_leases.rs:\n 30 let config_node = config.get(\"config\").expect(\"Missing `config` key\").clone();\n 31 let config =\n 32: serde_yaml::from_value(config_node).expect(\"Invalid config for wifi_availability\");\n 33 \n 34 // Regex compilation\n\n/home/crom/GitProjects/rnetmon/src/plugins/monitor/mod.rs:\n 1 pub mod dhcp_leases;\n 2 pub mod tester;\n 3: pub mod wifi_availability;\n 4 \n 5 use crate::monitor::*;\n .\n 12 match name {\n 13 \"tester\" => Ok(Box::new(tester::Tester::new(&config)?)),\n 14: \"wifi_availability\" => Ok(Box::new(wifi_availability::WifiAvailability::new(&config)?)),\n 15 \"dhcp_leases\" => Ok(Box::new(dhcp_leases::DHCPLeases::new(&config)?)),\n 16 _ => panic!(\"Unknown monitor name: {}\", name),\n\n/home/crom/GitProjects/rnetmon/src/plugins/monitor/wifi_availability.rs:\n 23 let config_node = config.get(\"config\").expect(\"Missing `config` key\").clone();\n 24 let config =\n 25: serde_yaml::from_value(config_node).expect(\"Invalid config for wifi_availability\");\n 26 \n 27 let wa = WifiAvailability { config: config };\n ..\n 46 sender\n 47 .send(Message {\n 48: emitter: \"wifi_availability\".to_owned(),\n 49 msg_type: \"ping.failed\".to_owned(),\n 50 level: Level::Issue,\n\n/home/crom/GitProjects/rnetmon/src/plugins/output/light_beewi_bbl227.rs:\n 47 let config_node = config.get(\"config\").expect(\"Missing `config` key\").clone();\n 48 let config: BluetoothLightbulbConfig =\n 49: serde_yaml::from_value(config_node).expect(\"Invalid config for wifi_availability\");\n 50 \n 51 let types = config\n\n/home/crom/GitProjects/rnetmon/target/armv7-unknown-linux-gnueabihf/debug/deps/rnetmon-ef12f41aabb434dd.d:\n 1: /home/crom/GitProjects/rnetmon/target/armv7-unknown-linux-gnueabihf/debug/deps/rnetmon-ef12f41aabb434dd: src/main.rs src/config.rs src/filter.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/espeak.rs src/plugins/output/light_beewi_bbl227.rs src/plugins/output/stdout.rs\n 2 \n 3: /home/crom/GitProjects/rnetmon/target/armv7-unknown-linux-gnueabihf/debug/deps/rnetmon-ef12f41aabb434dd.d: src/main.rs src/config.rs src/filter.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/espeak.rs src/plugins/output/light_beewi_bbl227.rs src/plugins/output/stdout.rs\n 4 \n 5 src/main.rs:\n .\n 13 src/plugins/monitor/dhcp_leases.rs:\n 14 src/plugins/monitor/tester.rs:\n 15: src/plugins/monitor/wifi_availability.rs:\n 16 src/plugins/output/mod.rs:\n 17 src/plugins/output/espeak.rs:\n\n/home/crom/GitProjects/rnetmon/target/armv7-unknown-linux-gnueabihf/debug/incremental/rnetmon-1lm47pv16mhxn/s-f9efvhetd8-ksxuk-working/query-cache.bin:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/rnetmon:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/rnetmon-238a178017264c74.d:\n 1: /home/crom/GitProjects/rnetmon/target/debug/rnetmon-238a178017264c74: /home/crom/GitProjects/rnetmon/src/config.rs /home/crom/GitProjects/rnetmon/src/main.rs /home/crom/GitProjects/rnetmon/src/message.rs /home/crom/GitProjects/rnetmon/src/monitor.rs /home/crom/GitProjects/rnetmon/src/output.rs /home/crom/GitProjects/rnetmon/src/plugins/mod.rs /home/crom/GitProjects/rnetmon/src/plugins/monitor/dhcp_leases.rs /home/crom/GitProjects/rnetmon/src/plugins/monitor/mod.rs /home/crom/GitProjects/rnetmon/src/plugins/monitor/tester.rs /home/crom/GitProjects/rnetmon/src/plugins/monitor/wifi_availability.rs /home/crom/GitProjects/rnetmon/src/plugins/output/bluetooth_lightbulb.rs /home/crom/GitProjects/rnetmon/src/plugins/output/espeak.rs /home/crom/GitProjects/rnetmon/src/plugins/output/mod.rs /home/crom/GitProjects/rnetmon/src/plugins/output/stdout.rs\n 2 \n\n/home/crom/GitProjects/rnetmon/target/debug/rnetmon.d:\n 1: /home/crom/GitProjects/rnetmon/target/debug/rnetmon: /home/crom/GitProjects/rnetmon/src/config.rs /home/crom/GitProjects/rnetmon/src/filter.rs /home/crom/GitProjects/rnetmon/src/main.rs /home/crom/GitProjects/rnetmon/src/message.rs /home/crom/GitProjects/rnetmon/src/monitor.rs /home/crom/GitProjects/rnetmon/src/output.rs /home/crom/GitProjects/rnetmon/src/plugins/mod.rs /home/crom/GitProjects/rnetmon/src/plugins/monitor/dhcp_leases.rs /home/crom/GitProjects/rnetmon/src/plugins/monitor/mod.rs /home/crom/GitProjects/rnetmon/src/plugins/monitor/tester.rs /home/crom/GitProjects/rnetmon/src/plugins/monitor/wifi_availability.rs /home/crom/GitProjects/rnetmon/src/plugins/output/espeak.rs /home/crom/GitProjects/rnetmon/src/plugins/output/light_beewi_bbl227.rs /home/crom/GitProjects/rnetmon/src/plugins/output/mod.rs /home/crom/GitProjects/rnetmon/src/plugins/output/stdout.rs\n 2 \n\n/home/crom/GitProjects/rnetmon/target/debug/.fingerprint/rnetmon-238a178017264c74/dep-test-bin-rnetmon-238a178017264c74:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/.fingerprint/rnetmon-2f68d582b1cab24a/dep-test-bin-rnetmon-2f68d582b1cab24a:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/.fingerprint/rnetmon-641472a79bc73fce/dep-bin-rnetmon-641472a79bc73fce:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/.fingerprint/rnetmon-696c9855391286e3/dep-bin-rnetmon-696c9855391286e3:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/.fingerprint/rnetmon-7ac19c71e70c70c7/dep-bin-rnetmon-7ac19c71e70c70c7:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/.fingerprint/rnetmon-8ff14028215791d9/dep-bin-rnetmon-8ff14028215791d9:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/.fingerprint/rnetmon-9aa17165b219e329/dep-test-bin-rnetmon-9aa17165b219e329:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/.fingerprint/rnetmon-a5b94b69a2bf83ca/dep-bin-rnetmon-a5b94b69a2bf83ca:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/.fingerprint/rnetmon-a659334cf0559bbd/dep-test-bin-rnetmon-a659334cf0559bbd:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/.fingerprint/rnetmon-ac68ffedd33b88da/dep-test-bin-rnetmon-ac68ffedd33b88da:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/.fingerprint/rnetmon-be61085b78c60df7/dep-test-bin-rnetmon-be61085b78c60df7:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/.fingerprint/rnetmon-e5cf0bf78e4f0f7d/dep-bin-rnetmon-e5cf0bf78e4f0f7d:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/.fingerprint/rnetmon-ec414ea949c6ee7c/dep-test-bin-rnetmon-ec414ea949c6ee7c:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-234e7825a6ee60e0.d:\n 1: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-234e7825a6ee60e0.rmeta: src/main.rs src/config.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 2 \n 3: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-234e7825a6ee60e0.d: src/main.rs src/config.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 4 \n 5 src/main.rs:\n .\n 12 src/plugins/monitor/dhcp_leases.rs:\n 13 src/plugins/monitor/tester.rs:\n 14: src/plugins/monitor/wifi_availability.rs:\n 15 src/plugins/output/mod.rs:\n 16 src/plugins/output/bluetooth_lightbulb.rs:\n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-238a178017264c74.d:\n 1: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-238a178017264c74: src/main.rs src/config.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 2 \n 3: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-238a178017264c74.d: src/main.rs src/config.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 4 \n 5 src/main.rs:\n .\n 12 src/plugins/monitor/dhcp_leases.rs:\n 13 src/plugins/monitor/tester.rs:\n 14: src/plugins/monitor/wifi_availability.rs:\n 15 src/plugins/output/mod.rs:\n 16 src/plugins/output/bluetooth_lightbulb.rs:\n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-2f68d582b1cab24a.d:\n 1: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-2f68d582b1cab24a.rmeta: src/main.rs src/config.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 2 \n 3: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-2f68d582b1cab24a.d: src/main.rs src/config.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 4 \n 5 src/main.rs:\n .\n 11 src/plugins/monitor/mod.rs:\n 12 src/plugins/monitor/tester.rs:\n 13: src/plugins/monitor/wifi_availability.rs:\n 14 src/plugins/output/mod.rs:\n 15 src/plugins/output/bluetooth_lightbulb.rs:\n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-641472a79bc73fce:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-641472a79bc73fce.d:\n 1: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-641472a79bc73fce: src/main.rs src/config.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 2 \n 3: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-641472a79bc73fce.d: src/main.rs src/config.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 4 \n 5 src/main.rs:\n .\n 12 src/plugins/monitor/dhcp_leases.rs:\n 13 src/plugins/monitor/tester.rs:\n 14: src/plugins/monitor/wifi_availability.rs:\n 15 src/plugins/output/mod.rs:\n 16 src/plugins/output/bluetooth_lightbulb.rs:\n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-696c9855391286e3.d:\n 1: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-696c9855391286e3.rmeta: src/main.rs src/config.rs src/filter.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/espeak.rs src/plugins/output/light_beewi_bbl227.rs src/plugins/output/stdout.rs\n 2 \n 3: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-696c9855391286e3.d: src/main.rs src/config.rs src/filter.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/espeak.rs src/plugins/output/light_beewi_bbl227.rs src/plugins/output/stdout.rs\n 4 \n 5 src/main.rs:\n .\n 13 src/plugins/monitor/dhcp_leases.rs:\n 14 src/plugins/monitor/tester.rs:\n 15: src/plugins/monitor/wifi_availability.rs:\n 16 src/plugins/output/mod.rs:\n 17 src/plugins/output/espeak.rs:\n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-7ac19c71e70c70c7.d:\n 1: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-7ac19c71e70c70c7.rmeta: src/main.rs src/config.rs src/filter.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 2 \n 3: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-7ac19c71e70c70c7.d: src/main.rs src/config.rs src/filter.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 4 \n 5 src/main.rs:\n .\n 13 src/plugins/monitor/dhcp_leases.rs:\n 14 src/plugins/monitor/tester.rs:\n 15: src/plugins/monitor/wifi_availability.rs:\n 16 src/plugins/output/mod.rs:\n 17 src/plugins/output/bluetooth_lightbulb.rs:\n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-8ff14028215791d9.d:\n 1: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-8ff14028215791d9.rmeta: src/main.rs src/config.rs src/filter.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 2 \n 3: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-8ff14028215791d9.d: src/main.rs src/config.rs src/filter.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 4 \n 5 src/main.rs:\n .\n 13 src/plugins/monitor/dhcp_leases.rs:\n 14 src/plugins/monitor/tester.rs:\n 15: src/plugins/monitor/wifi_availability.rs:\n 16 src/plugins/output/mod.rs:\n 17 src/plugins/output/bluetooth_lightbulb.rs:\n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-9aa17165b219e329.d:\n 1: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-9aa17165b219e329.rmeta: src/main.rs src/config.rs src/filter.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 2 \n 3: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-9aa17165b219e329.d: src/main.rs src/config.rs src/filter.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 4 \n 5 src/main.rs:\n .\n 13 src/plugins/monitor/dhcp_leases.rs:\n 14 src/plugins/monitor/tester.rs:\n 15: src/plugins/monitor/wifi_availability.rs:\n 16 src/plugins/output/mod.rs:\n 17 src/plugins/output/bluetooth_lightbulb.rs:\n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-a5b94b69a2bf83ca:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-a5b94b69a2bf83ca.d:\n 1: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-a5b94b69a2bf83ca: src/main.rs src/config.rs src/filter.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/espeak.rs src/plugins/output/light_beewi_bbl227.rs src/plugins/output/stdout.rs\n 2 \n 3: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-a5b94b69a2bf83ca.d: src/main.rs src/config.rs src/filter.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/espeak.rs src/plugins/output/light_beewi_bbl227.rs src/plugins/output/stdout.rs\n 4 \n 5 src/main.rs:\n .\n 13 src/plugins/monitor/dhcp_leases.rs:\n 14 src/plugins/monitor/tester.rs:\n 15: src/plugins/monitor/wifi_availability.rs:\n 16 src/plugins/output/mod.rs:\n 17 src/plugins/output/espeak.rs:\n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-a659334cf0559bbd.d:\n 1: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-a659334cf0559bbd.rmeta: src/main.rs src/config.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 2 \n 3: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-a659334cf0559bbd.d: src/main.rs src/config.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 4 \n 5 src/main.rs:\n .\n 12 src/plugins/monitor/dhcp_leases.rs:\n 13 src/plugins/monitor/tester.rs:\n 14: src/plugins/monitor/wifi_availability.rs:\n 15 src/plugins/output/mod.rs:\n 16 src/plugins/output/bluetooth_lightbulb.rs:\n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-ac68ffedd33b88da.d:\n 1: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-ac68ffedd33b88da.rmeta: src/main.rs src/config.rs src/filter.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/espeak.rs src/plugins/output/light_beewi_bbl227.rs src/plugins/output/stdout.rs\n 2 \n 3: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-ac68ffedd33b88da.d: src/main.rs src/config.rs src/filter.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/espeak.rs src/plugins/output/light_beewi_bbl227.rs src/plugins/output/stdout.rs\n 4 \n 5 src/main.rs:\n .\n 13 src/plugins/monitor/dhcp_leases.rs:\n 14 src/plugins/monitor/tester.rs:\n 15: src/plugins/monitor/wifi_availability.rs:\n 16 src/plugins/output/mod.rs:\n 17 src/plugins/output/espeak.rs:\n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-be61085b78c60df7.d:\n 1: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-be61085b78c60df7.rmeta: src/main.rs src/config.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 2 \n 3: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-be61085b78c60df7.d: src/main.rs src/config.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 4 \n 5 src/main.rs:\n .\n 12 src/plugins/monitor/dhcp_leases.rs:\n 13 src/plugins/monitor/tester.rs:\n 14: src/plugins/monitor/wifi_availability.rs:\n 15 src/plugins/output/mod.rs:\n 16 src/plugins/output/bluetooth_lightbulb.rs:\n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-e5cf0bf78e4f0f7d:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-e5cf0bf78e4f0f7d.d:\n 1: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-e5cf0bf78e4f0f7d: src/main.rs src/config.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 2 \n 3: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-e5cf0bf78e4f0f7d.d: src/main.rs src/config.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 4 \n 5 src/main.rs:\n .\n 11 src/plugins/monitor/mod.rs:\n 12 src/plugins/monitor/tester.rs:\n 13: src/plugins/monitor/wifi_availability.rs:\n 14 src/plugins/output/mod.rs:\n 15 src/plugins/output/bluetooth_lightbulb.rs:\n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-ec414ea949c6ee7c.d:\n 1: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-ec414ea949c6ee7c.rmeta: src/main.rs src/config.rs src/filter.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 2 \n 3: /home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-ec414ea949c6ee7c.d: src/main.rs src/config.rs src/filter.rs src/message.rs src/monitor.rs src/output.rs src/plugins/mod.rs src/plugins/monitor/mod.rs src/plugins/monitor/dhcp_leases.rs src/plugins/monitor/tester.rs src/plugins/monitor/wifi_availability.rs src/plugins/output/mod.rs src/plugins/output/bluetooth_lightbulb.rs src/plugins/output/espeak.rs src/plugins/output/stdout.rs\n 4 \n 5 src/main.rs:\n .\n 13 src/plugins/monitor/dhcp_leases.rs:\n 14 src/plugins/monitor/tester.rs:\n 15: src/plugins/monitor/wifi_availability.rs:\n 16 src/plugins/output/mod.rs:\n 17 src/plugins/output/bluetooth_lightbulb.rs:\n\n/home/crom/GitProjects/rnetmon/target/debug/incremental/rnetmon-1dzmpyvui8c1k/s-f96aduk77d-1b0ggx8-3ctjb53xixpz0/query-cache.bin:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/incremental/rnetmon-3pk1ens8xawjk/s-f9efwbi4fl-em62s2-rcqxjkapxz28/query-cache.bin:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/incremental/rnetmon-3sr0z6ilguz0e/s-f93539hz08-1snl4vg-2i4jpj02yawr3/query-cache.bin:\n \n\n848 matches across 43 files\n\n\nSearching 1794 files for \"Invalid config for wifi_availability\" (regex)\n\n/home/crom/GitProjects/rnetmon/src/plugins/monitor/dhcp_leases.rs:\n 30 let config_node = config.get(\"config\").expect(\"Missing `config` key\").clone();\n 31 let config =\n 32: serde_yaml::from_value(config_node).expect(\"Invalid config for wifi_availability\");\n 33 \n 34 // Regex compilation\n\n/home/crom/GitProjects/rnetmon/src/plugins/monitor/wifi_availability.rs:\n 23 let config_node = config.get(\"config\").expect(\"Missing `config` key\").clone();\n 24 let config =\n 25: serde_yaml::from_value(config_node).expect(\"Invalid config for wifi_availability\");\n 26 \n 27 let wa = WifiAvailability { config: config };\n\n/home/crom/GitProjects/rnetmon/target/armv7-unknown-linux-gnueabihf/debug/incremental/rnetmon-1lm47pv16mhxn/s-f9efvhetd8-ksxuk-working/query-cache.bin:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/rnetmon:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-641472a79bc73fce:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-a5b94b69a2bf83ca:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-e5cf0bf78e4f0f7d:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/incremental/rnetmon-1dzmpyvui8c1k/s-f96aduk77d-1b0ggx8-3ctjb53xixpz0/query-cache.bin:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/incremental/rnetmon-3pk1ens8xawjk/s-f9eg9d8858-3s7bjz-1k0i8d5ruk1ef/query-cache.bin:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/incremental/rnetmon-3sr0z6ilguz0e/s-f93539hz08-1snl4vg-2i4jpj02yawr3/query-cache.bin:\n \n\n17 matches across 10 files\n\n\nSearching 2188 files for \"try_from\" (regex)\n\n/home/crom/GitProjects/rnetmon/src/filter.rs:\n 42 \n 43 let level = match config.get(\"level\") {\n 44: Some(l) => Level::try_from(l.as_str().expect(\"Level must be a string\"))\n 45 .expect(\"Unknown level name\"),\n 46 None => Level::Notice,\n\n/home/crom/GitProjects/rnetmon/src/main.rs:\n 1 #![feature(unrestricted_attribute_tokens)]\n 2 #![feature(custom_attribute)]\n 3: #![feature(try_from)]\n 4 \n 5 mod config;\n\n/home/crom/GitProjects/rnetmon/src/message.rs:\n 15 impl TryFrom<&str> for Level {\n 16 type Error = ();\n 17: fn try_from(level: &str) -> Result {\n 18 match serde_yaml::from_str(level) {\n 19 Ok(v) => v,\n\n/home/crom/GitProjects/rnetmon/target/armv7-unknown-linux-gnueabihf/debug/deps/libdbus-9633d95e997d081a.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/armv7-unknown-linux-gnueabihf/debug/deps/libgetopts-18c382240f641ec8.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/armv7-unknown-linux-gnueabihf/debug/deps/libregex-c6d45e00f51c3096.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/armv7-unknown-linux-gnueabihf/debug/deps/libregex-e16d1d557fa5ca5f.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/armv7-unknown-linux-gnueabihf/debug/deps/libregex_syntax-01dba473c5106bea.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/armv7-unknown-linux-gnueabihf/debug/deps/libregex_syntax-741c388e12628042.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/armv7-unknown-linux-gnueabihf/debug/deps/libtime-e0f003bfb0787b7c.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/armv7-unknown-linux-gnueabihf/debug/deps/libucd_util-32ed87629c3dac53.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/armv7-unknown-linux-gnueabihf/debug/deps/libutf8_ranges-a1ac2716429b447b.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/armv7-unknown-linux-gnueabihf/debug/deps/libyaml_rust-66593fe2518ccdb9.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/rnetmon:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/byteorder-3a894519f313dad0/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/byteorder-3a894519f313dad0/build_script_build-3a894519f313dad0:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/libc-44f8a77494e5a86c/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/libc-44f8a77494e5a86c/build_script_build-44f8a77494e5a86c:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/libc-76c62ee31fe99990/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/libc-76c62ee31fe99990/build_script_build-76c62ee31fe99990:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/libdbus-sys-59f52d027a236fe2/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/libdbus-sys-59f52d027a236fe2/build_script_build-59f52d027a236fe2:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/libdbus-sys-98a12cb68af52b69/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/libdbus-sys-98a12cb68af52b69/build_script_build-98a12cb68af52b69:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/libdbus-sys-d352eab481238319/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/libdbus-sys-d352eab481238319/build_script_build-d352eab481238319:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/libloading-6ee81d13072eece9/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/libloading-6ee81d13072eece9/build_script_build-6ee81d13072eece9:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/libloading-a9434998151237c7/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/libloading-a9434998151237c7/build_script_build-a9434998151237c7:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/libloading-b75e6bf5b77d03d5/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/libloading-b75e6bf5b77d03d5/build_script_build-b75e6bf5b77d03d5:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/memchr-1581720b2bf328f4/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/memchr-1581720b2bf328f4/build_script_build-1581720b2bf328f4:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/memchr-a5854d302c426e35/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/memchr-a5854d302c426e35/build_script_build-a5854d302c426e35:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/memchr-e000d34e11b6e086/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/memchr-e000d34e11b6e086/build_script_build-e000d34e11b6e086:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/num-integer-69e6b6c79a56a7e6/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/num-integer-69e6b6c79a56a7e6/build_script_build-69e6b6c79a56a7e6:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/num-integer-919fc5a313ac6d06/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/num-integer-919fc5a313ac6d06/build_script_build-919fc5a313ac6d06:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/num-traits-9882d9aa55126543/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/num-traits-9882d9aa55126543/build_script_build-9882d9aa55126543:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/num-traits-cab15d419d85d7a2/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/num-traits-cab15d419d85d7a2/build_script_build-cab15d419d85d7a2:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/parking_lot_core-2c509067616ff32d/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/parking_lot_core-2c509067616ff32d/build_script_build-2c509067616ff32d:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/proc-macro2-19d7c9d802d9b4d3/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/proc-macro2-19d7c9d802d9b4d3/build_script_build-19d7c9d802d9b4d3:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/proc-macro2-916952ec67804e87/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/proc-macro2-916952ec67804e87/build_script_build-916952ec67804e87:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/proc-macro2-b874c35cbe2be150/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/proc-macro2-b874c35cbe2be150/build_script_build-b874c35cbe2be150:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/rand_pcg-3917dd433a801e62/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/rand_pcg-3917dd433a801e62/build_script_build-3917dd433a801e62:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/regex-08d485a6eabf9c31/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/regex-08d485a6eabf9c31/build_script_build-08d485a6eabf9c31:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/regex-6f01465eb3b11a19/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/regex-6f01465eb3b11a19/build_script_build-6f01465eb3b11a19:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/regex-92a9b8412bd2d4af/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/regex-92a9b8412bd2d4af/build_script_build-92a9b8412bd2d4af:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/regex-9ddc7718f5954824/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/regex-9ddc7718f5954824/build_script_build-9ddc7718f5954824:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/regex-9f27c7e2dd620ef5/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/regex-9f27c7e2dd620ef5/build_script_build-9f27c7e2dd620ef5:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/regex-cb7d57eba47bfa54/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/regex-cb7d57eba47bfa54/build_script_build-cb7d57eba47bfa54:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/serde-31c70d8973bdf96a/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/serde-31c70d8973bdf96a/build_script_build-31c70d8973bdf96a:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/serde-9861190844ad1393/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/serde-9861190844ad1393/build_script_build-9861190844ad1393:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/serde-e940922c04de727a/build-script-build:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/build/serde-e940922c04de727a/build_script_build-e940922c04de727a:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libcc-28aac6d626825c8c.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libcc-9a91916b1e5b5a93.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libcc-efe142e21115be96.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libdbus-5370150bde909a26.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libdbus-66102fb270c3a374.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libdbus-dc4322a34a33b056.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libgetopts-0a7ca5de3a0c7e4b.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libgetopts-10454989a6695657.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libgetopts-4e642cdcd7f12b6d.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libpkg_config-609b455772a24e68.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libpkg_config-84662dc169fd5356.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libpkg_config-89e488796e3518e5.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libproc_macro2-56178c47c9a11f84.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libproc_macro2-9dab45e5aff1e374.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libproc_macro2-dcf3341c8a50a172.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libregex-06f505e2d97b4f5c.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libregex-2197364896bbc133.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libregex-540d239279aa4244.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libregex-b03de8b9e10bb09f.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libregex-e33cef0911102a95.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libregex_syntax-03d239e7c5da781c.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libregex_syntax-2e6991c10bef869c.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libregex_syntax-b4c5157e7ddefbc3.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libregex_syntax-e4444c2270591e9c.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libregex_syntax-ec500a84b377eba9.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libsemver_parser-54004f256fc5da21.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libsyn-09bb09747ce96876.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libsyn-b769955a197fa5e8.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libsyn-fd0919d7b456208c.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libtime-997d3212d1e81c3c.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libtime-cc2332ffdf75f188.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libucd_util-9710b59841887c1e.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libucd_util-ad6afe0fbb2f0d68.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libucd_util-d5cf693042a1136c.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libutf8_ranges-47c508db6fa365a3.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libutf8_ranges-67c531dab6a61fcf.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libutf8_ranges-e0fb380be303d24a.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libyaml_rust-1e92c63d07f712c3.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libyaml_rust-221951868adc411d.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/libyaml_rust-785813eca8d12d92.rlib:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-11c284fac1b31443:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-3f919cc6ceaf1545:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-641472a79bc73fce:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-a5b94b69a2bf83ca:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-c3d4c6c432769bf3:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/deps/rnetmon-e5cf0bf78e4f0f7d:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/incremental/rnetmon-1t06bq18wxg7x/s-f9gh2rzju1-181j7co-3rd6zsfm6ee9b/query-cache.bin:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/incremental/rnetmon-3eivy7may9qz0/s-f9ghfqelq9-2aiyma-2egeaq9pwg5cz/query-cache.bin:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/incremental/rnetmon-3fvqfykmgetjc/s-f9ghk70krt-re92vj-3fzu1k061n1l6/query-cache.bin:\n \n\n/home/crom/GitProjects/rnetmon/target/debug/incremental/rnetmon-3pk1ens8xawjk/s-f9gh39m4zq-1k1ex7w-dqgftqd42ik4/query-cache.bin:\n \n\n1165 matches across 124 files\n", + "settings": + { + "buffer_size": 40769, + "line_ending": "Unix", + "name": "Find Results", + "scratch": true + } + }, + { + "file": "/home/crom/GitProjects/rnetmon/rnetmon.sublime-project", + "settings": + { + "buffer_size": 74, + "line_ending": "Unix" + } + }, + { + "file": "/home/crom/GitProjects/rnetmon/src/config.rs", + "settings": + { + "buffer_size": 225, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "contents": "\n BRANCH: On branch `master` tracking `origin/master`.\n ROOT: ~/GitProjects/rnetmon\n HEAD: d030beb WIP\n\n UNSTAGED:\n Cargo.lock\n Cargo.toml\n config.yaml\n src/config.rs\n src/main.rs\n src/message.rs\n src/monitor.rs\n src/output.rs\n src/plugins/monitor/dhcp_leases.rs\n src/plugins/monitor/mod.rs\n - src/plugins/monitor/tester.rs\n src/plugins/monitor/wifi_availability.rs\n - src/plugins/output/bluetooth_lightbulb.rs\n src/plugins/output/espeak.rs\n src/plugins/output/mod.rs\n src/plugins/output/stdout.rs\n\n UNTRACKED:\n leases.example.txt\n src/filter.rs\n src/plugins/monitor/dummy_sender.rs\n src/plugins/output/light_beewi_bbl227.rs\n\n ################### ###############\n ## SELECTED FILE ## ## ALL FILES ##\n ################### ###############\n\n [o] open file [a] stage all unstaged files\n [s] stage file [A] stage all unstaged and untracked files\n [u] unstage file [U] unstage all staged files\n [d] discard changes to file [D] discard all unstaged changes\n [h] open file on remote\n [M] launch external merge tool\n\n [l] diff file inline [f] diff all files\n [e] diff file [F] diff all cached files\n\n ############# #############\n ## ACTIONS ## ## STASHES ##\n ############# #############\n\n [c] commit [t][a] apply stash\n [C] commit, including unstaged [t][p] pop stash\n [m] amend previous commit [t][s] show stash\n [p] push current branch [t][c] create stash\n [t][u] create stash including untracked files\n [i] ignore file [t][g] create stash of staged changes only\n [I] ignore pattern [t][d] drop stash\n\n [B] abort merge\n\n ###########\n ## OTHER ##\n ###########\n\n [r] refresh status\n [?] toggle this help menu\n [tab] transition to next dashboard\n [SHIFT-tab] transition to previous dashboard\n [.] move cursor to next file\n [,] move cursor to previous file\n\n-\n\n", + "settings": + { + "buffer_size": 2271, + "line_ending": "Unix", + "name": "STATUS: rnetmon", + "read_only": true, + "scratch": true + } + }, + { + "file": "/home/crom/GitProjects/rnetmon/src/plugins/output/light_beewi_bbl227.rs", + "settings": + { + "buffer_size": 9489, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "file": "/home/crom/GitProjects/bulbcontrol/src/main.rs", + "settings": + { + "buffer_size": 8050, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "file": "/home/crom/GitProjects/rnetmon/src/plugins/output/espeak.rs", + "settings": + { + "buffer_size": 1043, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "file": "/home/crom/GitProjects/rnetmon/config.yaml", + "settings": + { + "buffer_size": 1410, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "file": "/home/crom/GitProjects/rnetmon/src/message.rs", + "settings": + { + "buffer_size": 909, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "file": "dummy_sender.rs", + "settings": + { + "buffer_size": 1958, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "file": "/home/crom/GitProjects/rnetmon/src/output.rs", + "settings": + { + "buffer_size": 265, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "file": "/home/crom/GitProjects/rnetmon/src/filter.rs", + "settings": + { + "buffer_size": 2285, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "file": "/home/crom/GitProjects/rnetmon/Cargo.toml", + "settings": + { + "buffer_size": 285, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "file": "/home/crom/GitProjects/rnetmon/Cargo.lock", + "settings": + { + "buffer_size": 16581, + "line_ending": "Unix" + } + }, + { + "file": "/home/crom/GitProjects/rnetmon/src/plugins/output/stdout.rs", + "settings": + { + "buffer_size": 707, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "file": "/home/crom/GitProjects/rnetmon/src/plugins/output/mod.rs", + "settings": + { + "buffer_size": 592, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "contents": "Package Control Messages\n========================\n\nRustFmt\n-------\n\n ## Installation\n \n Make sure you have the `rustfmt` executable in your $PATH. Install it with Cargo:\n \n ```sh\n cargo install rustfmt\n ```\n \n If the plugin can't find the executable, open Preferences → Package Settings →\n RustFmt → Settings. Run `which rustfmt` and set the resulting path as the\n `executable` setting. On my MacOS system, the path looks like this:\n \n ```sublime-settings\n \"executable\": \"/Users/username/.cargo/bin/rustfmt\"\n ```\n\n\nRustFmt\n-------\n\n ## Installation\n \n Make sure you have the `rustfmt` executable in your $PATH. Install it with Cargo:\n \n ```sh\n cargo install rustfmt\n ```\n \n If the plugin can't find the executable, open Preferences → Package Settings →\n RustFmt → Settings. Run `which rustfmt` and set the resulting path as the\n `executable` setting. On my MacOS system, the path looks like this:\n \n ```sublime-settings\n \"executable\": \"/Users/username/.cargo/bin/rustfmt\"\n ```\n", + "settings": + { + "buffer_size": 1011, + "line_ending": "Unix", + "name": "Package Control Messages", + "read_only": true, + "scratch": true + } + }, + { + "file": "/home/crom/GitProjects/rnetmon/src/monitor.rs", + "settings": + { + "buffer_size": 299, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "file": "mod.rs", + "settings": + { + "buffer_size": 608, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "contents": "pub use crate::message::*;\npub use crate::monitor::*;\nuse serde::Deserialize;\n\nextern crate regex;\nuse regex::Regex;\nextern crate chrono;\nuse chrono::{DateTime, Local};\n\n#[derive(Debug)]\npub struct DHCPLeases {\n config: DHCPLeasesConfig,\n rgx_lease: Regex,\n rgx_mac: Regex,\n rgx_date_start: Regex,\n rgx_date_ends: Regex,\n}\n#[derive(Debug, PartialEq, Deserialize)]\nstruct DHCPLeasesConfig {\n #[serde(default)]\n path: String,\n #[serde(default)]\n mac_rules: HashMap>>,\n}\n\nimpl Monitor for DHCPLeases {\n fn new(\n config: &HashMap,\n ) -> Result> {\n let config_node = config\n .get(\"config\")\n .unwrap_or(&serde_yaml::Mapping::new().into())\n .clone();\n let config = serde_yaml::from_value(config_node).expect(\"Invalid config for dhcp_leases\");\n\n // Regex compilation\n let rgx_lease = Regex::new(r\"(?s)lease\\s+(\\d+(?:\\.\\d+){3})\\s*\\{\\n?(.*?)\\}\").unwrap();\n let rgx_mac =\n Regex::new(r\"^\\s*hardware\\s+ethernet\\s([a-f0-9]{2}(?::[a-f0-9]{2}){5})\\s*;\").unwrap();\n let rgx_date_start = Regex::new(r\"^\\s*starts\\s+(.*?)\\s*;\").unwrap();\n let rgx_date_ends = Regex::new(r\"^\\s*ends\\s+(.*?)\\s*;\").unwrap();\n\n Ok(DHCPLeases {\n config: config,\n rgx_lease: rgx_lease,\n rgx_mac: rgx_mac,\n rgx_date_start: rgx_date_start,\n rgx_date_ends: rgx_date_ends,\n })\n }\n fn run(&mut self, sender: &mpsc::Sender) {\n use std::fs::File;\n use std::io::prelude::*;\n\n let config_file_path = match self.config.path.len() {\n 0 => \"/var/lib/dhcp/dhcpd.leases\",\n _ => &self.config.path,\n };\n let mut config_file =\n File::open(config_file_path).expect(\"Could not open DHCP leases file\");\n let mut config_content = String::new();\n config_file\n .read_to_string(&mut config_content)\n .expect(\"Could not read DHCP leases file\");\n\n let mut unauthorized_macs: Vec = vec![];\n\n for cap in self.rgx_lease.captures_iter(&config_content) {\n let ip = cap.get(1).unwrap().as_str();\n let content = cap.get(2).unwrap().as_str();\n\n let mac = self\n .rgx_mac\n .captures(content)\n .expect(\"No 'hardware ethernet' field found for MAC address\")\n .get(0)\n .unwrap()\n .as_str();\n let starts_str = self\n .rgx_date_start\n .captures(content)\n .expect(\"No 'starts' field found in lease\")\n .get(0)\n .unwrap()\n .as_str();\n let starts =\n chrono::naive::NaiveDateTime::parse_from_str(starts_str, \"%U %Y/%m/%d %H:%M:%S\")\n .expect(\"Bad date format\");\n let ends_str = self\n .rgx_date_ends\n .captures(content)\n .expect(\"No 'ends' field found in lease\")\n .get(0)\n .unwrap()\n .as_str();\n let ends =\n chrono::naive::NaiveDateTime::parse_from_str(ends_str, \"%U %Y/%m/%d %H:%M:%S\")\n .expect(\"Bad date format\");\n\n let now = Local::now().naive_local();\n if starts <= now && now < ends {\n // Lease is active\n if let Some(rules) = self.config.mac_rules.get(mac) {\n if rules.is_some() {\n for rule in rules.unwrap() {\n if content.find(rule).is_none() {\n unauthorized_macs.push(mac.to_owned());\n\n sender\n .send(Message {\n emitter: \"dhcp_leases\".to_owned(),\n level: Level::Issue,\n msg_type: \"dhcp_leases.unauthorized_mac.rule\".to_owned(),\n text: format!(\"Mismatching rule '{}' for device {}\", rule, mac),\n })\n .unwrap();\n break;\n }\n }\n }\n } else {\n unauthorized_macs.push(mac.to_owned());\n\n sender\n .send(Message {\n emitter: \"dhcp_leases\".to_owned(),\n level: Level::Issue,\n msg_type: \"dhcp_leases.unauthorized_mac.unknown\".to_owned(),\n text: format!(\"Unauthorized device on network: {}\", mac),\n })\n .unwrap();\n }\n }\n }\n\n if unauthorized_macs.len() > 0 {\n sender\n .send(Message {\n emitter: \"dhcp_leases\".to_owned(),\n level: Level::Issue,\n msg_type: \"dhcp_leases.unknown_mac\".to_owned(),\n text: format!(\n \"The following macs are not allowed: {:?}\",\n unauthorized_macs\n ),\n })\n .unwrap();\n }\n\n // let leases: Vec<(&str, &str)> = lease_rgx\n // .captures_iter(&config_content)\n // .map(|c| (c.get(1).unwrap().as_str(), c.get(2).unwrap().as_str()))\n // .collect();\n // println!(\"{:?}\", leases);\n // let cap = lease_rgx.captures(config_content);\n\n // sender\n // .send(Message {\n // emitter: \"dhcp_leases\".to_owned(),\n // level: 10,\n // msg_type: \"string\".to_owned(),\n // text: format!(\"frfr\"),\n // })\n // .unwrap();\n\n std::thread::sleep(std::time::Duration::from_millis(2000));\n }\n}\n\n/*\n\nlease 192.168.0.26 {\n starts 4 2018/08/16 22:31:22;\n ends 4 2018/08/16 23:01:22;\n tstp 4 2018/08/16 23:01:22;\n cltt 4 2018/08/16 22:31:22;\n binding state free;\n hardware ethernet 84:4b:f5:16:f4:94;\n}\n*/\n", + "file": "dhcp_leases.rs", + "file_size": 6186, + "file_write_time": 131944862877054881, + "settings": + { + "buffer_size": 6322, + "encoding": "UTF-8", + "line_ending": "Unix" + } + }, + { + "file": "/home/crom/GitProjects/rnetmon/leases.example.txt", + "settings": + { + "buffer_size": 9585, + "encoding": "UTF-8", + "line_ending": "Unix", + "name": "leases.example" + } + } + ], + "build_system": "Packages/Rust Enhanced/RustEnhanced.sublime-build", + "build_system_choices": + [ + [ + [ + [ + "Packages/Makefile/Make.sublime-build", + "" + ], + [ + "Packages/Makefile/Make.sublime-build", + "Clean" + ] + ], + [ + "Packages/Makefile/Make.sublime-build", + "" + ] + ], + [ + [ + [ + "Packages/Rust Enhanced/RustEnhanced.sublime-build", + "" + ], + [ + "Packages/Rust Enhanced/RustEnhanced.sublime-build", + "Automatic" + ], + [ + "Packages/Rust Enhanced/RustEnhanced.sublime-build", + "Run" + ], + [ + "Packages/Rust Enhanced/RustEnhanced.sublime-build", + "Run (with args)..." + ], + [ + "Packages/Rust Enhanced/RustEnhanced.sublime-build", + "Check" + ], + [ + "Packages/Rust Enhanced/RustEnhanced.sublime-build", + "Test" + ], + [ + "Packages/Rust Enhanced/RustEnhanced.sublime-build", + "Test (with args)..." + ], + [ + "Packages/Rust Enhanced/RustEnhanced.sublime-build", + "Bench" + ], + [ + "Packages/Rust Enhanced/RustEnhanced.sublime-build", + "Clean" + ], + [ + "Packages/Rust Enhanced/RustEnhanced.sublime-build", + "Document" + ], + [ + "Packages/Rust Enhanced/RustEnhanced.sublime-build", + "Clippy" + ], + [ + "Packages/Rust Enhanced/RustEnhanced.sublime-build", + "Script" + ] + ], + [ + "Packages/Rust Enhanced/RustEnhanced.sublime-build", + "Check" + ] + ], + [ + [ + [ + "Packages/STNeverwinterScript/nwscript.sublime-build", + "" + ], + [ + "Packages/STNeverwinterScript/nwscript.sublime-build", + "Rebuild everything" + ] + ], + [ + "Packages/STNeverwinterScript/nwscript.sublime-build", + "Rebuild everything" + ] + ], + [ + [ + [ + "Packages/User/STNeverwinterScript/nwscript.sublime-build", + "" + ], + [ + "Packages/User/STNeverwinterScript/nwscript.sublime-build", + "Rebuild everything" + ] + ], + [ + "Packages/User/STNeverwinterScript/nwscript.sublime-build", + "" + ] + ] + ], + "build_varint": "", + "command_palette": + { + "height": 392.0, + "last_filter": "", + "selected_items": + [ + [ + "move", + "File: Move" + ], + [ + "rename", + "File: Rename" + ], + [ + "upp", + "Convert Case: Upper Case" + ], + [ + "rustfm", + "RustFmt: Format Buffer" + ], + [ + "ww", + "Word Wrap: Toggle" + ], + [ + "pull", + "git: pull with rebase" + ], + [ + "remo", + "Package Control: Remove Package" + ], + [ + "install", + "Package Control: Install Package" + ], + [ + "ren", + "File: Rename" + ], + [ + "push", + "git: push" + ], + [ + "gst", + "git: status" + ], + [ + "cance", + "Build: Cancel" + ], + [ + "format", + "RustFormat: Format File" + ], + [ + "remove", + "Package Control: Remove Package" + ], + [ + "insta", + "Package Control: Install Package" + ], + [ + "checkout", + "git: checkout" + ], + [ + "glo", + "git: log" + ], + [ + "chec", + "git: checkout" + ], + [ + "tableed", + "Table Editor: Set table syntax 'MultiMarkdown' for current view" + ], + [ + "slang", + "Dictionaries: Set Language" + ], + [ + "tableedse", + "Table Editor: Set table syntax 'MultiMarkdown' for current view" + ], + [ + "current synta", + "Table Editor: Set table syntax 'MultiMarkdown' for current view" + ], + [ + "enable", + "Table Editor: Enable for current syntax" + ], + [ + "table editor", + "Table Editor: Set table syntax 'MultiMarkdown' for current view" + ], + [ + "table", + "Table Editor: Enable for current syntax" + ], + [ + "ssmd", + "Set Syntax: Markdown GFM" + ], + [ + "sort", + "Sort Lines" + ], + [ + "dele", + "File: Delete" + ], + [ + "dif", + "git: diff current file inline" + ], + [ + "pullre", + "git: pull with rebase" + ], + [ + "amend", + "git: amend previous commit" + ], + [ + "check", + "git: checkout" + ], + [ + "stash", + "git: stash save" + ], + [ + "comme", + "Toggle Comment" + ], + [ + "tospac", + "Indentation: Convert to Spaces" + ], + [ + "disable", + "Package Control: Disable Package" + ], + [ + "checkou", + "git: checkout new branch" + ], + [ + "forma", + "Format: Javascript" + ], + [ + "ssjs", + "Set Syntax: JSON" + ], + [ + "num", + "Snippet: Enumeration" + ], + [ + "incre", + "Emmet: Increment Number by 1" + ], + [ + "show", + "SublimeLinter: Show All Errors" + ], + [ + "ssc++", + "Set Syntax: C++" + ], + [ + "ssc", + "Set Syntax: C" + ], + [ + "erro", + "SublimeLinter: Show All Errors" + ], + [ + "filepa", + "File: Copy Path" + ], + [ + "blame", + "git: blame current file" + ], + [ + "dupl", + "File: Duplicate" + ], + [ + "ssnws", + "Set Syntax: Neverwinter Script" + ], + [ + "ssnw", + "Set Syntax: Neverwinter Script" + ], + [ + "build", + "Build With: nwscript" + ], + [ + "buildw", + "Build With: nwscript" + ], + [ + "reinde", + "Indentation: Reindent Lines" + ], + [ + "uni", + "Permute Lines: Unique" + ], + [ + "reforma", + "SublimeAStyleFormatter: Format Current File" + ], + [ + "uniq", + "Permute Lines: Unique" + ], + [ + "boiler", + "Snippet: htmlboiler" + ], + [ + "anaconlint", + "Anaconda: Disable linting on this file" + ], + [ + "anaconda", + "Anaconda: Disable linting on this file" + ], + [ + "linter", + "SublimeLinter: Disable Linter" + ], + [ + "log", + "git: log current file" + ], + [ + "ssdocker", + "Set Syntax: Dockerfile" + ], + [ + "tags", + "git: tags" + ], + [ + "g pull", + "git: pull" + ], + [ + "tosp", + "Indentation: Convert to Spaces" + ], + [ + "tospa", + "Indentation: Convert to Spaces" + ], + [ + "totabs", + "Indentation: Convert to Tabs" + ], + [ + "tota", + "View: Toggle Tabs" + ], + [ + "giso", + "Gist: Open Gist" + ], + [ + "low", + "Convert Case: Lower Case" + ], + [ + "rebase", + "git: rebase" + ], + [ + "Build: ", + "Build: Cancel" + ], + [ + "restart", + "DKit: Restart DCD Autocompletion Server" + ], + [ + "Build: doc", + "Build With: Project - Documentation" + ], + [ + "restar", + "DKit: Restart DCD Autocompletion Server" + ], + [ + "ssgene", + "Set Syntax: Json Generic Object Elements" + ], + [ + "json", + "Set Syntax: Json Generic Object Elements" + ], + [ + "ssjson", + "Set Syntax: JSON" + ], + [ + "re", + "DKit: Restart DCD Autocompletion Server" + ], + [ + "def", + "DKit: Goto Definition" + ], + [ + "ssya", + "Set Syntax: YAML" + ], + [ + "g check", + "git: checkout" + ], + [ + "g branch", + "git: checkout new branch" + ], + [ + "commit", + "git: commit" + ], + [ + "puh", + "git: push" + ], + [ + "ssdd", + "Set Syntax: D-dmd" + ], + [ + "newsynt", + "PackageDev: New YAML Syntax Definition" + ], + [ + "convert", + "PackageDev: Convert (YAML, JSON, PList) to…" + ], + [ + "ssd", + "Set Syntax: D" + ], + [ + "renae", + "File: Rename" + ], + [ + "ssdb", + "Set Syntax: d-build" + ], + [ + "rest", + "DKit: Restart DCD Autocompletion Server" + ], + [ + "prev", + "Markdown Preview: Preview in Browser" + ], + [ + "canc", + "Build: Cancel" + ], + [ + "ame", + "git: amend previous commit" + ], + [ + "am", + "git: amend previous commit" + ], + [ + "break", + "SublimeGDB: Open Breakpoint View" + ], + [ + "newv", + "File: New View into File" + ], + [ + "reind", + "Indentation: Reindent Lines" + ], + [ + "inde", + "Indentation: Reindent Lines" + ], + [ + "coffee", + "Set Syntax: CoffeeScript (Angular.js)" + ], + [ + "tos", + "Indentation: Convert to Spaces" + ], + [ + "statu", + "git: status" + ], + [ + "g push", + "git: push" + ], + [ + "spaces", + "Indentation: Convert to Spaces" + ], + [ + "ssht", + "Set Syntax: HTML" + ], + [ + "dcd", + "DKit: Restart DCD Autocompletion Server" + ], + [ + "sta", + "git: status" + ], + [ + "ssts", + "Set Syntax: TypeScript" + ], + [ + "rena", + "File: Rename" + ], + [ + "diff", + "git: diff current file inline" + ], + [ + "comm", + "git: commit" + ], + [ + "stat", + "git: status" + ], + [ + "view", + "File: New View into File" + ], + [ + "dkit", + "DKit: Restart DCD Autocompletion Server" + ], + [ + "res", + "DKit: Restart DCD Autocompletion Server" + ], + [ + "lintth", + "SublimeLinter: Lint This View" + ], + [ + "lin", + "SublimeLinter: Lint This View" + ], + [ + "sublimel", + "SublimeLinter: Toggle Linter" + ], + [ + "type", + "Set Syntax: TypeScript" + ], + [ + "sstyp", + "Set Syntax: TypeScript" + ], + [ + "tot", + "Indentation: Convert to Tabs" + ], + [ + "rein", + "Indentation: Reindent Lines" + ], + [ + "jade", + "Set Syntax: Jade" + ], + [ + "sstext", + "Set Syntax: Plain Text" + ], + [ + "ss", + "Set Syntax: HTML" + ], + [ + "resta", + "DKit: Restart DCD Autocompletion Server" + ], + [ + "rot", + "Rot13 Selection" + ] + ], + "width": 605.0 + }, + "console": + { + "height": 209.0, + "history": + [ + "import urllib.request,os,hashlib; h = '7183a2d3e96f11eeadd761d777e62404e330c659d4bb41d3bdf022e94cab3cd0'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)" + ] + }, + "distraction_free": + { + "menu_visible": true, + "show_minimap": false, + "show_open_files": false, + "show_tabs": false, + "side_bar_visible": false, + "status_bar_visible": false + }, + "expanded_folders": + [ + "/home/crom/GitProjects/rnetmon", + "/home/crom/GitProjects/rnetmon/src", + "/home/crom/GitProjects/rnetmon/src/plugins", + "/home/crom/GitProjects/rnetmon/src/plugins/monitor", + "/home/crom/GitProjects/rnetmon/src/plugins/output" + ], + "file_history": + [ + "/home/crom/GitProjects/rnetmon/src/plugins/output/light_beewi_bbl227.rs", + "/home/crom/.local/share/icons/hicolor/13x256/apps/961C_NWN2Launcher.0.png", + "/home/crom/GitProjects/rnetmon/src/plugins/output/bluetooth_lightbulb.rs", + "/home/crom/GitProjects/informo/specs/content/information-distribution/signature.md", + "/home/crom/.openvpn/home.tcharles.fr.ovpn", + "/home/crom/.config/sublime-text-3/Packages/Table Editor/README.md", + "/home/crom/.config/sublime-text-3/Packages/Table Editor/Default (Linux).sublime-keymap", + "/home/crom/GitProjects/informo/specs/content/matrix/trust-authorities.md", + "/home/crom/GitProjects/informo/specs/content/matrix/pings.md", + "/home/crom/GitProjects/informo/specs/content/matrix/users.md", + "/home/crom/GitProjects/informo/specs/content/matrix/__events.md", + "/home/crom/GitProjects/informo/specs/content/matrix/__usage.md", + "/home/crom/GitProjects/informo/specs/content/matrix/articles.md", + "/home/crom/GitProjects/informo/specs/content/matrix/sources.md", + "/home/crom/GitProjects/informo/specs/layouts/index.html", + "/home/crom/GitProjects/informo/specs/static/images/trust-level-graph.svg", + "/home/crom/GitProjects/informo/specs/static/images/trust-level-graph-userdef2.svg", + "/home/crom/GitProjects/informo/specs/content/trust-management/trust-level.md", + "/home/crom/GitProjects/informo/specs/content/trust-management/trust-authority.md", + "/home/crom/GitProjects/informo/specs/content/introduction/about-this-documentation.md", + "/home/crom/GitProjects/informo/specs/content/introduction/scsp.md", + "/home/crom/GitProjects/informo/specs/content/information-distribution/source.md", + "/home/crom/GitProjects/informo/specs/content/information-distribution/article.md", + "/home/crom/GitProjects/informo/specs/content/introduction/_index.md", + "/home/crom/GitProjects/informo/specs/content/information-distribution/_index.md", + "/home/crom/GitProjects/informo/specs/layouts/partials/custom-footer_del.html", + "/home/crom/GitProjects/informo/specs/config.toml", + "/home/crom/GitProjects/informo/specs/static/images/trust-level-simple.svg", + "/home/crom/GitProjects/informo/specs/static/images/trust-level-ltl.svg", + "/home/crom/GitProjects/informo/specs/EXAMPLE_NOCOMMIT", + "/home/crom/GitProjects/informo/specs/static/js/auto-render.min.js", + "/home/crom/GitProjects/informo/specs/content/trust/ta.md", + "/home/crom/GitProjects/informo/specs/content/trust-management/_index.md", + "/home/crom/GitProjects/informo/specs/content/informo-core-team/trust-authority.md", + "/home/crom/GitProjects/informo/specs/content/informo-core-team/official-room.md", + "/home/crom/GitProjects/informo/specs/.gitignore", + "/home/crom/GitProjects/informo/specs/content/trust/event-signature.md", + "/home/crom/GitProjects/informo/specs/content/trust", + "/home/crom/GitProjects/informo/specs/content/trust/_index.md", + "/home/crom/GitProjects/informo/specs/content/matrix/events.md", + "/home/crom/GitProjects/informo/specs/content/matrix/_index.md", + "/home/crom/GitProjects/informo/specs/content/matrix/usage.md", + "/home/crom/GitProjects/informo/specs/content/test.md", + "/home/crom/GitProjects/informo/specs/content/intro/_index.md", + "/home/crom/GitProjects/informo/specs/layouts/partials/menu-footer.html", + "/home/crom/GitProjects/informo/specs/README.md", + "/home/crom/GitProjects/informo/specs/layouts/partials/custom-footer.html", + "/home/crom/GitProjects/informo/specs/content/trust/source.md", + "/home/crom/GitProjects/informo/specs/themes/hugo-theme-learn/exampleSite/content/cont/_index.fr.md", + "/home/crom/GitProjects/informo/specs/content/informo-team/key-management.md", + "/home/crom/GitProjects/informo/specs/content/informo-team/_index.md", + "/home/crom/GitProjects/informo/specs/content/informo-team/ta.md", + "/home/crom/GitProjects/informo/specs/content/intro/terminology.md", + "/home/crom/GitProjects/informo/specs/content/_index.md", + "/home/crom/GitProjects/informo/specs/public/css/theme-green.css", + "/home/crom/GitProjects/informo/specs/static/css/theme-informo.css", + "/home/crom/GitProjects/informo/specs/public/js/learn.js", + "/home/crom/GitProjects/informo/specs/themes/hugo-theme-learn/exampleSite/content/basics/style-customization/_index.en.md", + "/home/crom/GitProjects/informo/specs/content/terminology.md", + "/home/crom/GitProjects/informo/specs/themes/hugo-theme-learn/exampleSite/content/basics/_index.en.md", + "/home/crom/GitProjects/informo/specs/themes/hugo-theme-learn/exampleSite/content/basics/_index.fr.md", + "/home/crom/GitProjects/informo/specs/themes/hugo-theme-learn/exampleSite/content/cont/_index.en.md", + "/home/crom/GitProjects/informo/specs/content/trust/browsing.md", + "/home/crom/GitProjects/informo/specs/themes/hugo-theme-learn/.gitignore", + "/home/crom/GitProjects/informo/specs/layouts/partials/logo.html", + "/home/crom/GitProjects/informo/specs/static/css/theme-mine.css", + "/home/crom/GitProjects/informo/specs/content/client-design/_index.md", + "/tmp/mozilla_crom0/Community Script Library - Full package-3-2012-05-30/nwscript_i.nss", + "/tmp/mozilla_crom0/Community Script Library - Full package-3-2012-05-30/nwgui.nss", + "/tmp/mozilla_crom0/Community Script Library - Full package-3-2012-05-30/nwscript_c.nss", + "/tmp/mozilla_crom0/Community Script Library - Full package-3-2012-05-30/nwscript.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/_CSLCore_Nwnx.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/test_main.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/test_sec.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/bgaurile_dial_exec.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/dorn_dial_cond.nss", + "/opt/NWNScriptCompiler/Scripts/metrics_inc.nss", + "/home/crom/.config/sublime-text-3/Packages/GoSublime/CHANGELOG.md", + "/tmp/AuroraServerNWScript.log", + "/tmp/mozilla_crom0/AuroraServerNWScript.log", + "/home/crom/Documents/Neverwinter Nights 2/override/LcdaClientSrc/lcdagui.hak/lcda_issues.xml", + "/tmp/conv", + "/tmp/errors.txt", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/_misc.nss", + "/home/crom/Documents/Neverwinter Nights 2/override/LcdaClientSrc/lcda2da.hak/iprp_costtable.2da", + "/home/crom/Documents/Neverwinter Nights 2/override/LcdaClientSrc/lcda2da.hak/iprp_weightcost.2da", + "/home/crom/Documents/Neverwinter Nights 2/override/LcdaClientSrc/lcda2da.hak/iprp_soakcost.2da", + "/home/crom/Documents/Neverwinter Nights 2/override/LcdaClientSrc/lcda2da.hak/iprp_bonuscost.2da", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/module_area_fallback_onenter.nss", + "/home/crom/GitProjects/TestLcda.html", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/gb_comp_heart.nss", + "/home/crom/Documents/Neverwinter Nights 2/override/LcdaClientSrc/dev/dev-gui/playerloginx2.xml", + "/home/crom/Documents/Neverwinter Nights 2/NWN2Server/NWNX4/xp_craft.txt", + "/home/crom/.config/sublime-text-3/Packages/STNeverwinterScript/nwscript.py", + "/home/crom/Documents/Neverwinter Nights 2/NWN2Server/NWNX4/xp_mysql.txt", + "/home/crom/Documents/Neverwinter Nights 2/NWN2Server/NWNX4/xp_fix.txt", + "/home/crom/Documents/Neverwinter Nights 2/NWN2Server/NWNX4/xp_bugfix.txt", + "/home/crom/Documents/Neverwinter Nights 2/NWN2Server/NWNX4/AuroraServerNWScript.log", + "/home/crom/Documents/Neverwinter Nights 2/NWN2Server/NWNX4/xp_fastboot.txt", + "/home/crom/Documents/Neverwinter Nights 2/NWN2Server/NWNX4/nwnx.txt", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/dorn_trigger_onenter.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/dorn_onused.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/dorn_area_init.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/dm_ajoutmembreguilde.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/cita_enigme1_erreur.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/cmi_ginc_polymorph.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/dial_creationsac.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/dial_marchandage_echange.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/dial_remplirsac.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/dial_don_objet.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/dial_recompense_unique.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/chambreluth_reservation.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/artisanat_arbre_attaque.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/_opjf.nss", + "/home/crom/.config/sublime-text-3/Packages/STNeverwinterScript/Main.sublime-menu", + "/home/crom/.config/sublime-text-3/Packages/STNeverwinterScript/README.md", + "/tmp/Main.sublime-menu", + "/tmp/Default.sublime-commands", + "/tmp/plugin.py", + "/home/crom/.config/sublime-text-3/Installed Packages/GitGutter.sublime-package", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/death_special.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/ot_placeable_ondeath.nss", + "/home/crom/Documents/Neverwinter Nights 2/override/LcdaClientSrc/lcda2da.hak/itempropdef.2da", + "/home/crom/Documents/Neverwinter Nights 2/override/LcdaClientSrc/lcda2da.hak/iprp_abilities.2da", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/ot_findetourcombat.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/ot_tyrannoeil.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/module_area_fallback_onuserevent.nss", + "/home/crom/Documents/Neverwinter Nights 2/modules/LcdaDev/difficulty_inc.nss" + ], + "find": + { + "height": 39.0 + }, + "find_in_files": + { + "height": 190.0, + "where_history": + [ + "" + ] + }, + "find_state": + { + "case_sensitive": false, + "find_history": + [ + "try_from", + "pattern", + "types", + "repeat", + "speed", + "200", + "100", + "reduc", + " * mult", + "duration", + "tester", + "Tester", + "pub struct Tester {\n", + "Some", + "cfg.color", + "color", + " = \"HashMap::new()\"", + "Invalid config for wifi_availability", + "wifi_availability", + "levels", + "10", + "Level::", + "Weird", + "Level", + "(u8)", + "u64", + "Debug", + " = ", + "name", + "mon_type", + "name", + "&self.session", + "u8(", + ": u8", + "name", + "is_none", + "monitor", + "Box::new(", + "executable", + "tch", + "tcharles", + "include_types", + "exclude_types", + "to_string", + "rule", + "_self", + "self", + "[0-9]", + "\\d", + "leaseRgx", + "lease\\s+\\d+\\.\\d+", + "WifiAvailability", + "tester", + "Tester", + "receive", + "hashmap", + "Stdout", + ">,", + "WifiAvailability", + "Stdout", + "outputSenders", + "Threads", + "monitorThreads", + "emitter", + "outputThreads", + "receiver", + "sender", + "monitors", + "rcv" + ], + "highlight": true, + "in_selection": false, + "preserve_case": false, + "regex": true, + "replace_history": + [ + ], + "reverse": false, + "show_context": true, + "use_buffer2": true, + "whole_word": false, + "wrap": true + }, + "groups": + [ + { + "selected": 3, + "sheets": + [ + { + "buffer": 0, + "file": "/home/crom/GitProjects/rnetmon/src/main.rs", + "semi_transient": false, + "settings": + { + "buffer_size": 3634, + "regions": + { + }, + "selection": + [ + [ + 2725, + 2725 + ] + ], + "settings": + { + "SL.154.region_keys": + [ + ], + "SL.206.region_keys": + [ + ], + "SL.45.region_keys": + [ + ], + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "syntax": "Packages/Rust Enhanced/RustEnhanced.sublime-syntax", + "tab_size": 4, + "translate_tabs_to_spaces": true + }, + "translation.x": 0.0, + "translation.y": 1071.0, + "zoom_level": 1.0 + }, + "stack_index": 6, + "type": "text" + }, + { + "buffer": 1, + "file": "wifi_availability.rs", + "semi_transient": false, + "settings": + { + "buffer_size": 1847, + "regions": + { + }, + "selection": + [ + [ + 274, + 274 + ] + ], + "settings": + { + "SL.486.region_keys": + [ + ], + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "syntax": "Packages/Rust Enhanced/RustEnhanced.sublime-syntax", + "tab_size": 4, + "translate_tabs_to_spaces": true + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 19, + "type": "text" + }, + { + "buffer": 2, + "semi_transient": false, + "settings": + { + "buffer_size": 40769, + "regions": + { + "match": + { + "flags": 112, + "regions": + [ + [ + 134, + 151 + ], + [ + 470, + 487 + ], + [ + 661, + 678 + ], + [ + 836, + 853 + ], + [ + 870, + 887 + ], + [ + 1350, + 1367 + ], + [ + 1560, + 1577 + ], + [ + 2014, + 2031 + ], + [ + 2512, + 2529 + ], + [ + 2995, + 3012 + ], + [ + 3283, + 3300 + ], + [ + 4270, + 4287 + ], + [ + 5221, + 5238 + ], + [ + 7591, + 7608 + ], + [ + 8031, + 8048 + ], + [ + 8320, + 8337 + ], + [ + 8787, + 8804 + ], + [ + 9227, + 9244 + ], + [ + 9516, + 9533 + ], + [ + 9954, + 9971 + ], + [ + 10359, + 10376 + ], + [ + 10640, + 10657 + ], + [ + 11196, + 11213 + ], + [ + 11636, + 11653 + ], + [ + 11925, + 11942 + ], + [ + 12412, + 12429 + ], + [ + 12865, + 12882 + ], + [ + 13153, + 13170 + ], + [ + 13627, + 13644 + ], + [ + 14081, + 14098 + ], + [ + 14370, + 14387 + ], + [ + 14857, + 14874 + ], + [ + 15311, + 15328 + ], + [ + 15600, + 15617 + ], + [ + 16087, + 16104 + ], + [ + 16541, + 16558 + ], + [ + 16830, + 16847 + ], + [ + 17400, + 17417 + ], + [ + 17853, + 17870 + ], + [ + 18141, + 18158 + ], + [ + 18601, + 18618 + ], + [ + 19041, + 19058 + ], + [ + 19330, + 19347 + ], + [ + 19817, + 19834 + ], + [ + 20270, + 20287 + ], + [ + 20558, + 20575 + ], + [ + 21018, + 21035 + ], + [ + 21458, + 21475 + ], + [ + 21747, + 21764 + ], + [ + 22268, + 22285 + ], + [ + 22673, + 22690 + ], + [ + 22954, + 22971 + ], + [ + 23441, + 23458 + ], + [ + 23895, + 23912 + ], + [ + 24184, + 24201 + ], + [ + 25076, + 25112 + ], + [ + 25419, + 25455 + ], + [ + 26680, + 26688 + ], + [ + 26980, + 26988 + ], + [ + 27146, + 27154 + ] + ], + "scope": "" + } + }, + "selection": + [ + [ + 27150, + 27150 + ] + ], + "settings": + { + "default_dir": "/home/crom/GitProjects/rnetmon/src/plugins/monitor", + "detect_indentation": false, + "git_gutter_is_enabled": false, + "line_numbers": false, + "output_tag": 3, + "result_base_dir": "", + "result_file_regex": "^([^ \t].*):$", + "result_line_regex": "^ +([0-9]+):", + "scroll_past_end": true, + "syntax": "Packages/Default/Find Results.hidden-tmLanguage" + }, + "translation.x": 0.0, + "translation.y": 8840.0, + "zoom_level": 1.0 + }, + "stack_index": 1, + "type": "text" + }, + { + "buffer": 3, + "file": "/home/crom/GitProjects/rnetmon/rnetmon.sublime-project", + "semi_transient": true, + "settings": + { + "buffer_size": 74, + "regions": + { + }, + "selection": + [ + [ + 74, + 74 + ] + ], + "settings": + { + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "syntax": "Packages/PackageDev/Package/Sublime Text Project/Sublime Text Project.sublime-syntax" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 0, + "type": "text" + }, + { + "buffer": 4, + "file": "/home/crom/GitProjects/rnetmon/src/config.rs", + "semi_transient": false, + "settings": + { + "buffer_size": 225, + "regions": + { + }, + "selection": + [ + [ + 225, + 225 + ] + ], + "settings": + { + "SL.490.region_keys": + [ + ], + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "syntax": "Packages/Rust Enhanced/RustEnhanced.sublime-syntax" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 4, + "type": "text" + }, + { + "buffer": 5, + "semi_transient": false, + "settings": + { + "buffer_size": 2271, + "regions": + { + }, + "selection": + [ + [ + 265, + 265 + ] + ], + "settings": + { + "SL.155.region_keys": + [ + ], + "SL.46.region_keys": + [ + ], + "__vi_external_disable": false, + "default_dir": "/home/crom/GitProjects/rnetmon/src", + "git_gutter_is_enabled": false, + "git_savvy.help_hidden": false, + "git_savvy.interface": "status", + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "git_savvy.status_view": true, + "git_savvy.tabbable": true, + "syntax": "Packages/GitSavvy/syntax/status.sublime-syntax", + "tab_size": 2 + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 15, + "type": "text" + }, + { + "buffer": 6, + "file": "/home/crom/GitProjects/rnetmon/src/plugins/output/light_beewi_bbl227.rs", + "semi_transient": false, + "settings": + { + "buffer_size": 9489, + "regions": + { + }, + "selection": + [ + [ + 3378, + 3378 + ] + ], + "settings": + { + "SL.483.region_keys": + [ + ], + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "syntax": "Packages/Rust Enhanced/RustEnhanced.sublime-syntax", + "tab_size": 4, + "translate_tabs_to_spaces": true + }, + "translation.x": 0.0, + "translation.y": 714.0, + "zoom_level": 1.0 + }, + "stack_index": 10, + "type": "text" + }, + { + "buffer": 7, + "file": "/home/crom/GitProjects/bulbcontrol/src/main.rs", + "semi_transient": false, + "settings": + { + "buffer_size": 8050, + "regions": + { + }, + "selection": + [ + [ + 4149, + 4149 + ] + ], + "settings": + { + "SL.523.region_keys": + [ + ], + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/bulbcontrol", + "syntax": "Packages/Rust Enhanced/RustEnhanced.sublime-syntax", + "tab_size": 4, + "translate_tabs_to_spaces": true + }, + "translation.x": 0.0, + "translation.y": 408.0, + "zoom_level": 1.0 + }, + "stack_index": 20, + "type": "text" + }, + { + "buffer": 8, + "file": "/home/crom/GitProjects/rnetmon/src/plugins/output/espeak.rs", + "semi_transient": false, + "settings": + { + "buffer_size": 1043, + "regions": + { + }, + "selection": + [ + [ + 265, + 265 + ] + ], + "settings": + { + "SL.214.region_keys": + [ + ], + "SL.48.region_keys": + [ + ], + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "open_with_edit": true, + "syntax": "Packages/Rust Enhanced/RustEnhanced.sublime-syntax" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 18, + "type": "text" + }, + { + "buffer": 9, + "file": "/home/crom/GitProjects/rnetmon/config.yaml", + "semi_transient": false, + "settings": + { + "buffer_size": 1410, + "regions": + { + }, + "selection": + [ + [ + 947, + 947 + ] + ], + "settings": + { + "SL.158.region_keys": + [ + ], + "SL.463.region_keys": + [ + ], + "SL.49.region_keys": + [ + ], + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "syntax": "Packages/YAML/YAML.sublime-syntax" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 9, + "type": "text" + }, + { + "buffer": 10, + "file": "/home/crom/GitProjects/rnetmon/src/message.rs", + "semi_transient": false, + "settings": + { + "buffer_size": 909, + "regions": + { + }, + "selection": + [ + [ + 483, + 483 + ] + ], + "settings": + { + "SL.156.region_keys": + [ + ], + "SL.169.region_keys": + [ + ], + "SL.464.region_keys": + [ + ], + "SL.50.region_keys": + [ + ], + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "syntax": "Packages/Rust Enhanced/RustEnhanced.sublime-syntax" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 2, + "type": "text" + }, + { + "buffer": 11, + "file": "dummy_sender.rs", + "semi_transient": false, + "settings": + { + "buffer_size": 1958, + "regions": + { + }, + "selection": + [ + [ + 1837, + 1837 + ] + ], + "settings": + { + "SL.155.region_keys": + [ + ], + "SL.157.region_keys": + [ + ], + "SL.215.region_keys": + [ + ], + "SL.465.region_keys": + [ + ], + "SL.51.region_keys": + [ + ], + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "syntax": "Packages/Rust Enhanced/RustEnhanced.sublime-syntax" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 14, + "type": "text" + }, + { + "buffer": 12, + "file": "/home/crom/GitProjects/rnetmon/src/output.rs", + "semi_transient": false, + "settings": + { + "buffer_size": 265, + "regions": + { + }, + "selection": + [ + [ + 265, + 265 + ] + ], + "settings": + { + "SL.158.region_keys": + [ + ], + "SL.163.region_keys": + [ + ], + "SL.53.region_keys": + [ + ], + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "syntax": "Packages/Rust Enhanced/RustEnhanced.sublime-syntax" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 7, + "type": "text" + }, + { + "buffer": 13, + "file": "/home/crom/GitProjects/rnetmon/src/filter.rs", + "semi_transient": false, + "settings": + { + "buffer_size": 2285, + "regions": + { + }, + "selection": + [ + [ + 1648, + 1648 + ] + ], + "settings": + { + "SL.476.region_keys": + [ + ], + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "open_with_edit": true, + "syntax": "Packages/Rust Enhanced/RustEnhanced.sublime-syntax", + "tab_size": 4, + "translate_tabs_to_spaces": true + }, + "translation.x": 0.0, + "translation.y": 242.0, + "zoom_level": 1.0 + }, + "stack_index": 5, + "type": "text" + }, + { + "buffer": 14, + "file": "/home/crom/GitProjects/rnetmon/Cargo.toml", + "semi_transient": false, + "settings": + { + "buffer_size": 285, + "regions": + { + }, + "selection": + [ + [ + 284, + 284 + ] + ], + "settings": + { + "SL.54.region_keys": + [ + ], + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "syntax": "Packages/TOML/TOML.sublime-syntax" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 8, + "type": "text" + }, + { + "buffer": 15, + "file": "/home/crom/GitProjects/rnetmon/Cargo.lock", + "semi_transient": false, + "settings": + { + "buffer_size": 16581, + "regions": + { + }, + "selection": + [ + [ + 0, + 0 + ] + ], + "settings": + { + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "syntax": "Packages/TOML/TOML.sublime-syntax" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 21, + "type": "text" + }, + { + "buffer": 16, + "file": "/home/crom/GitProjects/rnetmon/src/plugins/output/stdout.rs", + "semi_transient": false, + "settings": + { + "buffer_size": 707, + "regions": + { + }, + "selection": + [ + [ + 707, + 707 + ] + ], + "settings": + { + "SL.159.region_keys": + [ + ], + "SL.166.region_keys": + [ + ], + "SL.55.region_keys": + [ + ], + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "syntax": "Packages/Rust Enhanced/RustEnhanced.sublime-syntax" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 17, + "type": "text" + }, + { + "buffer": 17, + "file": "/home/crom/GitProjects/rnetmon/src/plugins/output/mod.rs", + "semi_transient": false, + "settings": + { + "buffer_size": 592, + "regions": + { + }, + "selection": + [ + [ + 528, + 528 + ] + ], + "settings": + { + "SL.160.region_keys": + [ + ], + "SL.56.region_keys": + [ + ], + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "syntax": "Packages/Rust Enhanced/RustEnhanced.sublime-syntax" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 16, + "type": "text" + }, + { + "buffer": 18, + "semi_transient": false, + "settings": + { + "buffer_size": 1011, + "regions": + { + }, + "selection": + [ + [ + 1011, + 1011 + ] + ], + "settings": + { + "SL.161.region_keys": + [ + ], + "SL.57.region_keys": + [ + ], + "auto_indent": false, + "default_dir": "/home/crom/GitProjects/rnetmon/src/plugins/monitor", + "git_gutter_is_enabled": false, + "syntax": "Packages/Text/Plain text.tmLanguage", + "tab_width": 2, + "word_wrap": true + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 22, + "type": "text" + }, + { + "buffer": 19, + "file": "/home/crom/GitProjects/rnetmon/src/monitor.rs", + "semi_transient": false, + "settings": + { + "buffer_size": 299, + "regions": + { + }, + "selection": + [ + [ + 170, + 170 + ] + ], + "settings": + { + "SL.157.region_keys": + [ + ], + "SL.162.region_keys": + [ + ], + "SL.218.region_keys": + [ + ], + "SL.58.region_keys": + [ + ], + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "syntax": "Packages/Rust Enhanced/RustEnhanced.sublime-syntax" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 3, + "type": "text" + }, + { + "buffer": 20, + "file": "mod.rs", + "semi_transient": false, + "settings": + { + "buffer_size": 608, + "regions": + { + }, + "selection": + [ + [ + 350, + 350 + ] + ], + "settings": + { + "SL.163.region_keys": + [ + ], + "SL.59.region_keys": + [ + ], + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "syntax": "Packages/Rust Enhanced/RustEnhanced.sublime-syntax" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 13, + "type": "text" + }, + { + "buffer": 21, + "file": "dhcp_leases.rs", + "semi_transient": false, + "settings": + { + "buffer_size": 6322, + "regions": + { + }, + "selection": + [ + [ + 910, + 910 + ] + ], + "settings": + { + "SL.169.region_keys": + [ + ], + "SL.216.region_keys": + [ + ], + "SL.475.region_keys": + [ + ], + "SL.60.region_keys": + [ + ], + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "open_with_edit": true, + "syntax": "Packages/Rust Enhanced/RustEnhanced.sublime-syntax", + "tab_size": 4, + "translate_tabs_to_spaces": true + }, + "translation.x": 0.0, + "translation.y": 133.0, + "zoom_level": 1.0 + }, + "stack_index": 12, + "type": "text" + } + ] + }, + { + "selected": 0, + "sheets": + [ + { + "buffer": 22, + "file": "/home/crom/GitProjects/rnetmon/leases.example.txt", + "semi_transient": false, + "settings": + { + "buffer_size": 9585, + "regions": + { + }, + "selection": + [ + [ + 9503, + 9503 + ] + ], + "settings": + { + "SL.61.region_keys": + [ + ], + "auto_name": "leases.example", + "git_gutter_is_enabled": true, + "git_savvy.repo_path": "/home/crom/GitProjects/rnetmon", + "syntax": "Packages/MarkdownEditing/Markdown.sublime-syntax" + }, + "translation.x": 0.0, + "translation.y": 5964.0, + "zoom_level": 1.0 + }, + "stack_index": 11, + "type": "text" + } + ] + } + ], + "incremental_find": + { + "height": 27.0 + }, + "input": + { + "height": 78.0 + }, + "layout": + { + "cells": + [ + [ + 0, + 0, + 1, + 1 + ], + [ + 1, + 0, + 2, + 1 + ] + ], + "cols": + [ + 0.0, + 0.590238936317, + 1.0 + ], + "rows": + [ + 0.0, + 1.0 + ] + }, + "menu_visible": true, + "output.GitSavvy": + { + "height": 128.0 + }, + "output.SublimeLinter": + { + "height": 317.0 + }, + "output.astyle_error_message": + { + "height": 0.0 + }, + "output.exec": + { + "height": 200.0 + }, + "output.find_results": + { + "height": 0.0 + }, + "output.mdpopups": + { + "height": 0.0 + }, + "output.show_commit_info": + { + "height": 116.0 + }, + "pinned_build_system": "Packages/Rust Enhanced/RustEnhanced.sublime-build", + "project": "rnetmon.sublime-project", + "replace": + { + "height": 50.0 + }, + "save_all_on_build": true, + "select_file": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + [ + "main", + "~/GitProjects/bulbcontrol/src/main.rs" + ], + [ + "article", + "content/information-distribution/article.md" + ], + [ + "source", + "content/information-distribution/source.md" + ], + [ + "todo", + "TODO" + ], + [ + "trust-level-graph", + "static/images/trust-level-graph.svg" + ], + [ + "trusta", + "content/trust-management/trust-authority.md" + ], + [ + "trust-level", + "content/trust-management/trust-level.md" + ], + [ + "autorender", + "static/js/auto-render.min.js" + ], + [ + "green", + "public/css/theme-green.css" + ], + [ + "gitign", + "themes/hugo-theme-learn/.gitignore" + ], + [ + "icewall", + "specatk_s_auriltemple_icewall.nss" + ], + [ + "aurilinc", + "auriltemple_inc.nss" + ], + [ + "xml", + "lcda_auril_cannon.xml" + ], + [ + "casieribeexml", + "LcdaClientSrc/lcdagui.hak/lcda_casieribee.xml" + ], + [ + "project", + "LcdaDev/LcdaDev.sublime-project" + ], + [ + "moduleused", + "LcdaDev/module_usedobject.nss" + ], + [ + "rac", + "LcdaDev/racines_inc.nss" + ], + [ + "misc", + "LcdaDev/_misc.nss" + ], + [ + "nwsc", + "/opt/NWNScriptCompiler/Scripts/nwscript.NSS" + ], + [ + "terrain", + "LcdaClientSrc/lcda2da.hak/terrainmaterials.2da" + ], + [ + "_csl", + "LcdaDev/_CSLCore_Nwnx.nss" + ], + [ + "class", + "LcdaClientSrc/lcda2da.hak/classes.2da" + ], + [ + "racia", + "LcdaClientSrc/lcda2da.hak/racialsubtypes.2da" + ], + [ + "nwscr", + "/opt/NWNScriptCompiler/Scripts/nwscript.NSS" + ], + [ + "baseitem", + "LcdaClientSrc/lcda2da.hak/baseitems.2da" + ], + [ + "onact", + "LcdaDev/module_onactivate.nss" + ], + [ + "IPRP_BONUSCOST", + "LcdaClientSrc/lcda2da.hak/iprp_bonuscost.2da" + ], + [ + "costta", + "LcdaClientSrc/lcda2da.hak/iprp_costtable.2da" + ], + [ + "iprpa", + "LcdaClientSrc/lcda2da.hak/iprp_abilities.2da" + ], + [ + "IPRP_SRCOST", + "LcdaClientSrc/lcda2da.hak/iprp_srcost.2da" + ], + [ + "cost", + "LcdaClientSrc/lcda2da.hak/iprp_costtable.2da" + ], + [ + "itemprop", + "LcdaClientSrc/lcda2da.hak/itempropdef.2da" + ], + [ + "", + "/opt/NWNScriptCompiler/Scripts/nwscript.NSS" + ], + [ + "libforge", + "LcdaDev/lib_forge_epique.nss" + ], + [ + "overland", + "LcdaDev/overland_inc.nss" + ], + [ + "onuneq", + "LcdaDev/module_onunequipped.nss" + ], + [ + "onequi", + "LcdaDev/module_onequipeditem.nss" + ], + [ + "coffreloo", + "LcdaDev/module_coffreloot.nss" + ], + [ + "cleanerinc", + "LcdaDev/cleaner_inc.nss" + ], + [ + "nwnx_tim", + "LcdaDev/nwnx_time.nss" + ], + [ + "cleaner_inc", + "LcdaDev/cleaner_inc.nss" + ], + [ + "baseite", + "LcdaClientSrc/lcda2da.hak/baseitems.2da" + ], + [ + "nwscrip", + "/opt/NWNScriptCompiler/Scripts/nwscript.NSS" + ], + [ + "base2da", + "LcdaClientSrc/lcda2da.hak/baseitems.2da" + ], + [ + "racialsub", + "LcdaClientSrc/lcda2da.hak/racialsubtypes.2da" + ], + [ + "deathspe", + "LcdaDev/death_special.nss" + ], + [ + "coffreloot", + "LcdaDev/module_coffreloot.nss" + ], + [ + "cls_feat_sdthf", + "LcdaClientSrc/lcda2da.hak/cls_feat_sdthf.2DA" + ], + [ + "race_feat_drow", + "LcdaClientSrc/lcda2da.hak/race_feat_drow.2da" + ], + [ + "racial2da", + "LcdaClientSrc/lcda2da.hak/racialsubtypes.2da" + ], + [ + "clsfeatwar", + "LcdaClientSrc/lcda2da.hak/cls_feat_warrdark.2da" + ], + [ + "cls_feat_barb", + "LcdaClientSrc/lcda2da.hak/cls_feat_barb.2da" + ], + [ + "difficul", + "LcdaDev/difficulty_inc.nss" + ], + [ + "coffre", + "LcdaDev/module_coffreloot.nss" + ], + [ + "vared", + "LcdaDev/gui_vareditor_ok.nss" + ], + [ + "hench_o0_ai", + "LcdaDev/hench_o0_ai.nss" + ], + [ + "champbataille_distribuercamp", + "LcdaDev/champbataille_distribuercamp.nss" + ], + [ + "dindet", + "LcdaDev/module_findetourcombat.nss" + ], + [ + "cleanervar", + "LcdaDev/cleaner_dial_ga_setvar.nss" + ], + [ + "qs_grp", + "LcdaDev/qs_grp_node_givegold.nss" + ], + [ + "dialgasetv", + "LcdaDev/cleaner_dial_ga_setvar.nss" + ], + [ + "cleaner", + "LcdaDev/cleaner_dial_gc_getvar.nss" + ], + [ + "guiissues", + "LcdaClientSrc/lcdagui.hak/lcda_issues.xml" + ], + [ + "moduleonauth", + "LcdaDev/module_onclientauthsuccess.nss" + ], + [ + "feat", + "LcdaClientSrc/lcda2da.hak/feat.2da" + ], + [ + "abili", + "LcdaClientSrc/lcda2da.hak/iprp_abilities.2da" + ], + [ + "skill", + "LcdaClientSrc/lcda2da.hak/skills.2da" + ], + [ + "categori.2da", + "LcdaClientSrc/lcda2da.hak/categories.2da" + ], + [ + "teleport", + "LcdaDev/gen_onused_teleport.nss" + ], + [ + "telepo", + "LcdaDev/dialogue_teleportationwp.nss" + ], + [ + "diffic", + "LcdaDev/difficulty_inc.nss" + ], + [ + "onspawn", + "LcdaDev/cleaner_onspawn_createitems.nss" + ], + [ + "cita_dialogue_statue1", + "LcdaDev/cita_dialogue_statue1.nss" + ], + [ + "moduleondea", + "LcdaDev/module_ondeath.nss" + ], + [ + "_misc", + "LcdaDev/_misc.nss" + ], + [ + "bossin", + "LcdaDev/ot_boss_inc.nss" + ], + [ + "illithionda", + "LcdaDev/illithids_ondamaged_boss.nss" + ], + [ + "_fon", + "LcdaDev/_fonctions_xp.nss" + ], + [ + "convend", + "LcdaDev/dorn_onconvend.nss" + ], + [ + "dialgadama", + "LcdaDev/dial_ga_damage.NSS" + ], + [ + "cutscene.nss", + "LcdaDev/dial_ga_cutscene.nss" + ], + [ + "charge2da", + "LcdaClientSrc/lcda2da.hak/iprp_chargecost.2da" + ], + [ + "iprpcos", + "LcdaClientSrc/lcda2da.hak/iprp_costtable.2da" + ], + [ + "iprp_weightcost", + "LcdaClientSrc/lcda2da.hak/iprp_weightcost.2da" + ], + [ + "iprp_soakcost", + "LcdaClientSrc/lcda2da.hak/iprp_soakcost.2da" + ], + [ + "iprp_bonuscost", + "LcdaClientSrc/lcda2da.hak/iprp_bonuscost.2da" + ], + [ + "param.2da", + "LcdaClientSrc/lcda2da.hak/iprp_paramtable.2da" + ], + [ + "costt", + "LcdaClientSrc/lcda2da.hak/iprp_costtable.2da" + ], + [ + "itempropde", + "LcdaClientSrc/lcda2da.hak/itempropdef.2da" + ], + [ + "modeareafall", + "LcdaDev/module_area_fallback_onenter.nss" + ], + [ + "modulearea", + "LcdaDev/module_area_onenter.nss" + ], + [ + "module_area", + "LcdaDev/module_area_onuserevent.nss" + ], + [ + "nw_o2_coninclude", + "LcdaDev/nw_o2_coninclude.nss" + ], + [ + "moduledow", + "LcdaDev/moduledownloaderresources.xml" + ], + [ + "gui_portr", + "LcdaDev/gui_portraits.nss" + ], + [ + "dialgagivei", + "LcdaDev/dial_ga_give_item.NSS" + ], + [ + "onclientauth", + "LcdaDev/module_onclientauthsuccess.nss" + ], + [ + "moduleload", + "LcdaDev/module_onmoduleload.nss" + ], + [ + "otfinde", + "LcdaDev/ot_findetourcombat.nss" + ], + [ + "mainmen", + "LcdaClientSrc/lcdagui.hak/mainmenu.xml" + ], + [ + "playerlogin", + "LcdaClientSrc/dev/dev-gui/playerloginx2.xml" + ], + [ + "creationi", + "LcdaDev/_fonctions_creationitem.nss" + ], + [ + "death", + "LcdaDev/death_special.nss" + ], + [ + "deathspec", + "LcdaDev/death_special.nss" + ], + [ + "findet", + "LcdaDev/ot_findetourcombat.nss" + ], + [ + "otplacea", + "LcdaDev/ot_placeable_ondeath.nss" + ], + [ + "tyrann", + "LcdaDev/ot_tyrannoeil.nss" + ], + [ + "fallbackon", + "LcdaDev/module_area_fallback_onuserevent.nss" + ], + [ + "coffrea", + "LcdaDev/module_coffres_aleatoires.nss" + ], + [ + "iprp_abilities", + "LcdaClientSrc/lcda2da.hak/iprp_abilities.2da" + ], + [ + "itempropdef", + "LcdaClientSrc/lcda2da.hak/itempropdef.2da" + ], + [ + "zoneen", + "LcdaDev/module_zone_entree.nss" + ], + [ + "eboueur", + "LcdaDev/module_eboueur_exit.nss" + ], + [ + "charde", + "app/chars/details.template.html" + ], + [ + "projec", + "LcdaAccountManager.sublime-project" + ], + [ + "travi", + ".travis.yml" + ], + [ + "config", + "config.json" + ], + [ + "app", + "public/app/app.component.ts" + ], + [ + "hudactionpublisher", + "libhud/action-publisher.c" + ], + [ + "widget", + "src/gtk/Widget.d" + ], + [ + "listboxr", + "src/gtk/ListBoxRow.d" + ], + [ + "adjust", + "src/gtk/Adjustment.d" + ], + [ + "gtkty", + "src/gtkc/gtktypes.d" + ], + [ + "mainw", + "src/gtk/MainWindow.d" + ], + [ + "cairot", + "src/gtkc/cairotypes.d" + ], + [ + "region", + "src/cairo/Region.d" + ], + [ + "listg", + "src/glib/ListG.d" + ], + [ + "event", + "src/gdk/Event.d" + ] + ], + "width": 0.0 + }, + "select_project": + { + "height": 500.0, + "last_filter": "", + "selected_items": + [ + [ + "", + "~/SublimeProjects/voilier.sublime-project" + ] + ], + "width": 380.0 + }, + "select_symbol": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + ], + "width": 0.0 + }, + "selected_group": 0, + "settings": + { + }, + "show_minimap": true, + "show_open_files": true, + "show_tabs": true, + "side_bar_visible": true, + "side_bar_width": 261.0, + "status_bar_visible": true, + "template_settings": + { + } +} diff --git a/src/plugins/monitor/wifi_availability.rs b/src/monitors/wifi_availability.rs similarity index 75% rename from src/plugins/monitor/wifi_availability.rs rename to src/monitors/wifi_availability.rs index 10dfb43..13d8145 100644 --- a/src/plugins/monitor/wifi_availability.rs +++ b/src/monitors/wifi_availability.rs @@ -1,22 +1,29 @@ -use crate::message::Message; +use crate::message::{Level, Message}; use crate::monitor::*; -use serde_derive::*; +use serde::Deserialize; #[derive(Debug)] pub struct WifiAvailability { config: WifiAvailabilityConfig, } -#[derive(Debug, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Deserialize)] struct WifiAvailabilityConfig { iface: String, ssid: String, + #[serde(default)] essid: Vec, + #[serde(default)] ping_targets: Vec, } impl Monitor for WifiAvailability { - fn new(config: &HashMap) -> Self { - let config_node = config.get("config").expect("Missing `config` key").clone(); + fn new( + config: &HashMap, + ) -> Result> { + let config_node = config + .get("config") + .unwrap_or(&serde_yaml::Mapping::new().into()) + .clone(); let config = serde_yaml::from_value(config_node).expect("Invalid config for wifi_availability"); @@ -24,7 +31,7 @@ impl Monitor for WifiAvailability { // Activate iface //ip link set wlan0 up - wa + Ok(wa) } fn run(&mut self, sender: &mpsc::Sender) { // iw dev wlan0 link: get is connected @@ -43,7 +50,7 @@ impl Monitor for WifiAvailability { .send(Message { emitter: "wifi_availability".to_owned(), msg_type: "ping.failed".to_owned(), - level: 10, + level: Level::Issue, text: format!("Cannot ping {}", target), }) .unwrap(); diff --git a/src/output.rs b/src/output.rs index 136abed..783e17e 100644 --- a/src/output.rs +++ b/src/output.rs @@ -1,52 +1,9 @@ -extern crate globset; - pub use std::collections::HashMap; -use globset::Glob; -use std::iter::Map; - use crate::message::*; -#[derive(Debug)] -pub struct Filter { - level: Level, - types: Vec, -} - -impl Filter { - fn new(config: &HashMap) -> Self { - let mut globs = vec![]; - - let types = config - .get("types") - .expect("Missing types key") - .as_sequence() - .expect("types must be a list of strings") - .iter() - .map(|x| { - Glob::new(x.as_str().expect("filter must be a list of strings")) - .expect("Invalid glob pattern") - .compile_matcher() - }) - .collect(); - - // let glob = Glob::new("*.rs")?.compile_matcher(); - Filter { - level: config.get("level").to.unwrap_or(Level::Debug), - types: types, - } - } - - // fn is_message_filtered(&self, message: Message) -> bool { - // if message.level < self.level{ - // return true - // } - // if - // } -} - pub trait Output { - fn new(config: &HashMap) -> Self + fn new(config: &HashMap) -> Result> where Self: Sized; fn process_message(&mut self, message: Message); diff --git a/src/outputs/espeak.rs b/src/outputs/espeak.rs new file mode 100644 index 0000000..80ca716 --- /dev/null +++ b/src/outputs/espeak.rs @@ -0,0 +1,38 @@ +use crate::message::Message; +pub use crate::output::*; +use serde::Deserialize; + +#[derive(Debug)] +pub struct Espeak { + config: EspeakConfig, +} +#[derive(Debug, Deserialize)] +struct EspeakConfig { + #[serde(default = "espeak".to_owned())] + espeak: String, + #[serde(default = vec![])] + args: Vec, +} + +impl Output for Espeak { + fn new( + config: &HashMap, + ) -> Result> { + let node = config + .get("config") + .unwrap_or(&serde_yaml::Value::Null) + .clone(); + let cfg = serde_yaml::from_value(node).expect("Invalid config for Espeak"); + + Ok(Espeak { config: cfg }) + } + fn process_message(&mut self, message: Message) { + use std::process::{Command, Stdio}; + Command::new(&self.config.espeak) + .args(&self.config.args) + .arg(message.text) + .stdout(Stdio::null()) + .status() + .expect("failed to execute process"); + } +} diff --git a/src/outputs/light_beewi_bbl227.rs b/src/outputs/light_beewi_bbl227.rs new file mode 100644 index 0000000..bb498d2 --- /dev/null +++ b/src/outputs/light_beewi_bbl227.rs @@ -0,0 +1,298 @@ +extern crate blurz; + +use blurz::bluetooth_adapter::BluetoothAdapter; +use blurz::bluetooth_device::BluetoothDevice; +use blurz::bluetooth_gatt_characteristic::BluetoothGATTCharacteristic; +use blurz::bluetooth_gatt_service::BluetoothGATTService; +use blurz::bluetooth_session::BluetoothSession; +use globset::{Glob, GlobMatcher}; +use serde::Deserialize; + +use crate::message::{Level, Message}; +pub use crate::output::*; + +pub struct BluetoothLightbulb { + config: BluetoothLightbulbConfig, + session: BluetoothSession, + levels: HashMap, + msg_types: Vec<(GlobMatcher, LightConfig)>, +} +#[derive(Debug, Deserialize)] +struct BluetoothLightbulbConfig { + #[serde(default)] + mac: HashMap, + #[serde(default)] + levels: HashMap, + #[serde(default)] + msg_types: HashMap, +} +#[derive(Debug, Clone, Deserialize)] +enum Animation { + None, + Smooth, + Bounce, + Blink, + RampUp, + RampDown, +} +#[derive(Debug, Clone, Deserialize)] +struct LightConfig { + #[serde(default)] + color: Option, + #[serde(default)] + animation: Option, + #[serde(default)] + repeat: Option, + #[serde(default)] + speed: Option, +} +impl LightConfig { + fn merge(&mut self, other: &Self) { + if other.color.is_some() { + self.color = other.color; + } + if other.animation.is_some() { + self.animation = other.animation.clone(); + } + if other.repeat.is_some() { + self.repeat = other.repeat; + } + if other.speed.is_some() { + self.speed = other.speed; + } + } +} +impl BluetoothLightbulb { + fn set_color(&self, characs: &Vec, r: f64, g: f64, b: f64) { + let r = (r * 255.0) as u8; + let g = (g * 255.0) as u8; + let b = (b * 255.0) as u8; + + // println!("r={} g={} b={}", r, g, b); + for charac in characs { + charac + .write_value(vec![0x55, 0x13, r, g, b, '\r' as u8, '\n' as u8], None) + .unwrap(); + } + } + + fn initiate_scan(&self, adapter: &BluetoothAdapter) { + if !adapter.is_discovering().unwrap() { + log::info!("bluetooth adapter {}: Set scan ON", adapter.get_id()); + adapter + .start_discovery() + .expect("Cannot activate scanning on bluetooth device"); + } + } +} + +impl Output for BluetoothLightbulb { + fn new( + config: &HashMap, + ) -> Result> { + let config_node = config + .get("config") + .unwrap_or(&serde_yaml::Mapping::new().into()) + .clone(); + let config: BluetoothLightbulbConfig = + serde_yaml::from_value(config_node).expect("Invalid config for light_beewi_bbl227"); + + let msg_types = config + .msg_types + .iter() + .map(|(k, v)| { + ( + Glob::new(k) + .expect("Invalid glob pattern") + .compile_matcher(), + v.clone(), + ) + }) + .collect(); + let levels = config + .levels + .iter() + .map(|(k, v)| (k.clone(), v.clone())) + .collect(); + + let session = + BluetoothSession::create_session(None).expect("Could not initialize bluetooth session"); + + let ret = BluetoothLightbulb { + config: config, + msg_types: msg_types, + levels: levels, + session: session, + }; + + // Initialize bluetooth device + let adapter = + BluetoothAdapter::init(&ret.session).expect("Could not initialize bluetooth adapter"); + // Power on + if !adapter.is_powered().unwrap() { + log::info!("bluetooth adapter {}: Set power ON", adapter.get_id()); + adapter + .set_powered(true) + .expect("Cannot power on bluetooth device"); + } + // Start scan + ret.initiate_scan(&adapter); + + Ok(ret) + } + fn process_message(&mut self, message: Message) { + let adapter = + BluetoothAdapter::init(&self.session).expect("Could not initialize bluetooth adapter"); + + let mut characs = vec![]; + let mut found_macs: HashMap = HashMap::new(); + for mac in self.config.mac.keys() { + found_macs.insert(mac.to_owned(), false); + } + + for dev_path in adapter.get_device_list().unwrap() { + let device = BluetoothDevice::new(&self.session, dev_path); + + let addr = device.get_address().unwrap(); + if self.config.mac.contains_key(&addr) { + if !device.is_connected().unwrap() { + log::info!("Connecting to {}", addr); + match device.connect(5000) { + Ok(_) => { + let power = device.get_tx_power().expect("Could not request tx power"); + log::info!("Connected to {}, tx power={}", addr, power); + } + Err(e) => { + log::error!("Could not connect to {}: {}", addr, e); + continue; + } + } + } + + for srv_path in device.get_gatt_services().unwrap() { + let service = BluetoothGATTService::new(&self.session, srv_path); + let service_uuid = service.get_uuid().unwrap(); + + if service_uuid == "a8b3fff0-4834-4051-89d0-3de95cddd318" { + for charac_path in service.get_gatt_characteristics().unwrap() { + let charac = BluetoothGATTCharacteristic::new( + &self.session, + charac_path.clone(), + ); + let charac_uuid = charac.get_uuid().unwrap(); + + if charac_uuid == "a8b3fff1-4834-4051-89d0-3de95cddd318" { + characs.push(charac); + found_macs.insert(addr.clone(), true); + } + } + } + } + } + } + + let macs_not_found: HashMap = found_macs + .into_iter() + .filter(|(_, v)| *v == false) + .collect(); + + if macs_not_found.len() > 0 { + log::warn!( + "Could not find configured lightbulbs: {:?}", + macs_not_found.keys() + ); + self.initiate_scan(&adapter); + return; + } + + // find out color & pattern to play + let mut cfg = LightConfig { + color: Some(0xffffff), + animation: Some(Animation::Smooth), + repeat: Some(1), + speed: Some(1.0), + }; + for (type_glob, type_cfg) in &self.msg_types { + if type_glob.is_match(&message.msg_type) { + cfg.merge(type_cfg); + break; + } + } + if let Some(level_cfg) = self.levels.get(&message.level) { + cfg.merge(level_cfg); + } + + let color = cfg.color.unwrap(); + let r = ((color >> 16) & 0xff) as f64 / 255.0; + let g = ((color >> 8) & 0xff) as f64 / 255.0; + let b = ((color >> 0) & 0xff) as f64 / 255.0; + let anim = cfg.animation.unwrap(); + let speed = cfg.speed.unwrap(); + + // Play animation + log::debug!("Playing {:?} {:?}", anim, color); + + for _ in 0..cfg.repeat.unwrap() { + match anim { + Animation::None => { + self.set_color(&characs, r, g, b); + std::thread::sleep(std::time::Duration::from_millis((2000.0 / speed) as u64)); + } + Animation::Bounce => { + for _ in 0..4 { + self.set_color(&characs, r, g, b); + std::thread::sleep(std::time::Duration::from_millis( + (250.0 / speed) as u64, + )); + self.set_color(&characs, r * 0.5, g * 0.5, b * 0.5); + std::thread::sleep(std::time::Duration::from_millis( + (250.0 / speed) as u64, + )); + } + } + Animation::Smooth => { + for i in 0..10 { + let mult = i as f64 / 10.0; + self.set_color(&characs, r * mult, g * mult, b * mult); + } + for i in 0..10 { + let mult = 1.0 - (i as f64 / 10.0); + self.set_color(&characs, r * mult, g * mult, b * mult); + } + } + Animation::Blink => { + for i in 0..4 { + let (r, g, b) = match i % 2 { + 0 => (r, g, b), + _ => (0.0, 0.0, 0.0), + }; + self.set_color(&characs, r, g, b); + std::thread::sleep(std::time::Duration::from_millis( + (400.0 / speed) as u64, + )); + } + } + Animation::RampUp => { + for i in 0..20 { + let mult = i as f64 / 20.0; + self.set_color(&characs, r * mult, g * mult, b * mult); + } + std::thread::sleep(std::time::Duration::from_millis(100)); + self.set_color(&characs, 0.0, 0.0, 0.0); + std::thread::sleep(std::time::Duration::from_millis(100)); + } + Animation::RampDown => { + self.set_color(&characs, r, g, b); + std::thread::sleep(std::time::Duration::from_millis(100)); + for i in 1..20 { + let mult = 1.0 - (i as f64 / 20.0); + self.set_color(&characs, r * mult, g * mult, b * mult); + } + self.set_color(&characs, 0.0, 0.0, 0.0); + std::thread::sleep(std::time::Duration::from_millis(100)); + } + } + } + self.set_color(&characs, 0.0, 0.0, 0.0); + } +} diff --git a/src/outputs/mod.rs b/src/outputs/mod.rs new file mode 100644 index 0000000..cc00aac --- /dev/null +++ b/src/outputs/mod.rs @@ -0,0 +1,20 @@ +pub mod espeak; +pub mod light_beewi_bbl227; +pub mod stdout; + +use crate::output::*; +use std::collections::HashMap; + +pub fn factory( + name: &str, + config: &HashMap, +) -> Result, Box> { + match name { + "stdout" => Ok(Box::new(stdout::Stdout::new(&config)?)), + "espeak" => Ok(Box::new(espeak::Espeak::new(&config)?)), + "light_beewi_bbl227" => Ok(Box::new(light_beewi_bbl227::BluetoothLightbulb::new( + &config, + )?)), + _ => panic!("Unknown monitor name: {}", name), + } +} diff --git a/src/outputs/stdout.rs b/src/outputs/stdout.rs new file mode 100644 index 0000000..5ffb7c7 --- /dev/null +++ b/src/outputs/stdout.rs @@ -0,0 +1,27 @@ +use crate::message::*; +pub use crate::output::*; + +#[derive(Debug)] +pub struct Stdout {} + +impl Output for Stdout { + fn new( + _config: &HashMap, + ) -> Result> { + Ok(Stdout {}) + } + fn process_message(&mut self, message: Message) { + log::info!( + "{}{}: {}\x1B[m", + match message.level { + Level::Debug => "\x1B[2m", + Level::Notice => "", + Level::Anomaly => "\x1B[33m", + Level::Issue => "\x1B[31m", + Level::Critical => "\x1B[31;40;1m", + }, + message.msg_type, + message.text + ); + } +} diff --git a/src/plugins/mod.rs b/src/plugins/mod.rs deleted file mode 100644 index 69bcf7a..0000000 --- a/src/plugins/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod monitor; -pub mod output; diff --git a/src/plugins/monitor/mod.rs b/src/plugins/monitor/mod.rs deleted file mode 100644 index 9072b06..0000000 --- a/src/plugins/monitor/mod.rs +++ /dev/null @@ -1,15 +0,0 @@ -pub mod dhcp_leases; -pub mod tester; -pub mod wifi_availability; - -use crate::monitor::*; -use std::collections::HashMap; - -pub fn factory(name: &str, config: &HashMap) -> Box { - match name { - "tester" => Box::new(tester::Tester::new(&config)), - "wifi_availability" => Box::new(wifi_availability::WifiAvailability::new(&config)), - "dhcp_leases" => Box::new(dhcp_leases::DHCPLeases::new(&config)), - _ => panic!("Unknown monitor name: {}", name), - } -} diff --git a/src/plugins/monitor/tester.rs b/src/plugins/monitor/tester.rs deleted file mode 100644 index e59a341..0000000 --- a/src/plugins/monitor/tester.rs +++ /dev/null @@ -1,27 +0,0 @@ -pub use crate::message::Message; -pub use crate::monitor::*; - -#[derive(Debug)] -pub struct Tester { - cnt: i64, -} - -impl Monitor for Tester { - fn new(config: &HashMap) -> Self { - Tester { cnt: 0 } - } - fn run(&mut self, sender: &mpsc::Sender) { - println!("-- Sending message {}", self.cnt); - sender - .send(Message { - emitter: "tester".to_string(), - level: 10, - msg_type: "string".to_string(), - text: format!("This is message number {}", self.cnt), - }) - .unwrap(); - - self.cnt += 1; - std::thread::sleep(std::time::Duration::from_millis(2000)); - } -} diff --git a/src/plugins/output/bluetooth_lightbulb.rs b/src/plugins/output/bluetooth_lightbulb.rs deleted file mode 100644 index 9495037..0000000 --- a/src/plugins/output/bluetooth_lightbulb.rs +++ /dev/null @@ -1,37 +0,0 @@ -extern crate blurz; - -// use blurz::bluetooth_adapter::BluetoothAdapter; -// use blurz::bluetooth_device::BluetoothDevice; -// use blurz::bluetooth_gatt_characteristic::BluetoothGATTCharacteristic; -// use blurz::bluetooth_gatt_service::BluetoothGATTService; - -// use crate::message::Message; -// pub use crate::output::*; -// use serde_derive::*; - -// #[derive(Debug)] -// pub struct BluetoothLightbulb<'a> { -// config: BluetoothLightbulbConfig, -// adapter: BluetoothAdapter<'a>, -// } -// #[derive(Debug, PartialEq, Serialize, Deserialize)] -// struct BluetoothLightbulbConfig { -// mac: Vec, -// } - -// impl Output for BluetoothLightbulb { -// fn new(config: &HashMap) -> Self { -// let config_node = config.get("config").expect("Missing `config` key").clone(); -// let config = -// serde_yaml::from_value(config_node).expect("Invalid config for wifi_availability"); - -// let adapter = BluetoothAdapter::init().expect("Cannot initialize bluetooth adapter"); - -// BluetoothLightbulb { config: config } -// } -// fn process_message(&mut self, message: Message) { -// println!("Received message: {:?}", message); - -// let device = Device::new(dev_path); -// } -// } diff --git a/src/plugins/output/espeak.rs b/src/plugins/output/espeak.rs deleted file mode 100644 index b08ef7f..0000000 --- a/src/plugins/output/espeak.rs +++ /dev/null @@ -1,19 +0,0 @@ -use crate::message::Message; -pub use crate::output::*; - -#[derive(Debug)] -pub struct Espeak {} - -impl Output for Espeak { - fn new(config: &HashMap) -> Self { - Espeak {} - } - fn process_message(&mut self, message: Message) { - use std::process::{Command, Stdio}; - let res = Command::new("espeak") - .arg(message.text) - .stdout(Stdio::null()) - .status() - .expect("failed to execute process"); - } -} diff --git a/src/plugins/output/mod.rs b/src/plugins/output/mod.rs deleted file mode 100644 index cf211d1..0000000 --- a/src/plugins/output/mod.rs +++ /dev/null @@ -1,14 +0,0 @@ -pub mod bluetooth_lightbulb; -pub mod espeak; -pub mod stdout; - -use crate::output::*; -use std::collections::HashMap; - -pub fn factory(name: &str, config: &HashMap) -> Box { - match name { - "stdout" => Box::new(stdout::Stdout::new(&config)), - "espeak" => Box::new(espeak::Espeak::new(&config)), - _ => panic!("Unknown monitor name: {}", name), - } -} diff --git a/src/plugins/output/stdout.rs b/src/plugins/output/stdout.rs deleted file mode 100644 index 8df8ce5..0000000 --- a/src/plugins/output/stdout.rs +++ /dev/null @@ -1,14 +0,0 @@ -use crate::message::Message; -pub use crate::output::*; - -#[derive(Debug)] -pub struct Stdout {} - -impl Output for Stdout { - fn new(config: &HashMap) -> Self { - Stdout {} - } - fn process_message(&mut self, message: Message) { - println!("Received message: {:?}", message); - } -}