mirror of
https://github.com/LibreQoE/LibreQoS.git
synced 2025-02-25 18:55:32 -06:00
Make the SQL and unique id less dumb! Use the machine-id file that is automatically generated and hash it for node id.
This commit is contained in:
parent
84e4306b22
commit
e415d699db
@ -1,10 +1,15 @@
|
|||||||
use std::{path::Path, sync::atomic::AtomicI64, time::SystemTime};
|
use std::{path::Path, sync::atomic::AtomicI64, time::SystemTime};
|
||||||
use lqos_bus::anonymous::AnonymousUsageV1;
|
use lqos_bus::anonymous::AnonymousUsageV1;
|
||||||
use sqlite::Value;
|
use sqlite::{Value, State};
|
||||||
const DBPATH: &str = "anonymous.sqlite";
|
const DBPATH: &str = "anonymous.sqlite";
|
||||||
|
|
||||||
const SETUP_QUERY: &str =
|
const SETUP_QUERY: &str =
|
||||||
"CREATE TABLE submissions (
|
"CREATE TABLE nodes (
|
||||||
|
node_id TEXT PRIMARY KEY,
|
||||||
|
last_seen INTEGER NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE submissions (
|
||||||
id INTEGER PRIMARY KEY,
|
id INTEGER PRIMARY KEY,
|
||||||
date INTEGER,
|
date INTEGER,
|
||||||
node_id TEXT,
|
node_id TEXT,
|
||||||
@ -159,6 +164,33 @@ pub fn insert_stats_dump(stats: &AnonymousUsageV1, ip: &str) -> anyhow::Result<(
|
|||||||
statement.next()?;
|
statement.next()?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Find out if its a new host
|
||||||
|
let mut found = false;
|
||||||
|
let mut statement = cn.prepare("SELECT * FROM nodes WHERE node_id=:id")?;
|
||||||
|
statement.bind_iter::<_, (_, Value)>([
|
||||||
|
(":id", stats.node_id.clone().into()),
|
||||||
|
])?;
|
||||||
|
while let Ok(State::Row) = statement.next() {
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
if found {
|
||||||
|
log::info!("Updating last seen date for {}", stats.node_id);
|
||||||
|
let mut statement = cn.prepare("UPDATE nodes SET last_seen=:date WHERE node_id=:id")?;
|
||||||
|
statement.bind_iter::<_, (_, Value)>([
|
||||||
|
(":id", stats.node_id.clone().into()),
|
||||||
|
(":date", date.into()),
|
||||||
|
])?;
|
||||||
|
statement.next()?;
|
||||||
|
} else {
|
||||||
|
log::info!("New host: {}", stats.node_id);
|
||||||
|
let mut statement = cn.prepare("INSERT INTO nodes (node_id, last_seen) VALUES(:id, :date)")?;
|
||||||
|
statement.bind_iter::<_, (_, Value)>([
|
||||||
|
(":id", stats.node_id.clone().into()),
|
||||||
|
(":date", date.into()),
|
||||||
|
])?;
|
||||||
|
statement.next()?;
|
||||||
|
}
|
||||||
|
|
||||||
log::info!("Submitted");
|
log::info!("Submitted");
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -181,7 +213,7 @@ pub fn dump_all_to_string() -> anyhow::Result<String> {
|
|||||||
pub fn count_unique_node_ids() -> anyhow::Result<u64> {
|
pub fn count_unique_node_ids() -> anyhow::Result<u64> {
|
||||||
let mut result = 0;
|
let mut result = 0;
|
||||||
let cn = sqlite::open(DBPATH)?;
|
let cn = sqlite::open(DBPATH)?;
|
||||||
cn.iterate("SELECT COUNT(DISTINCT node_id) AS count FROM submissions;", |pairs| {
|
cn.iterate("SELECT COUNT(DISTINCT node_id) AS count FROM nodes;", |pairs| {
|
||||||
for &(_name, value) in pairs.iter() {
|
for &(_name, value) in pairs.iter() {
|
||||||
if let Some(val) = value {
|
if let Some(val) = value {
|
||||||
if let Ok(val) = val.parse::<u64>() {
|
if let Ok(val) = val.parse::<u64>() {
|
||||||
@ -198,7 +230,7 @@ pub fn count_unique_node_ids_this_week() -> anyhow::Result<u64> {
|
|||||||
let mut result = 0;
|
let mut result = 0;
|
||||||
let cn = sqlite::open(DBPATH)?;
|
let cn = sqlite::open(DBPATH)?;
|
||||||
let last_week = (get_sys_time_in_secs() - 604800).to_string();
|
let last_week = (get_sys_time_in_secs() - 604800).to_string();
|
||||||
cn.iterate(format!("SELECT COUNT(DISTINCT node_id) AS count FROM submissions WHERE date > {last_week};"), |pairs| {
|
cn.iterate(format!("SELECT COUNT(DISTINCT node_id) AS count FROM nodes WHERE last_seen > {last_week};"), |pairs| {
|
||||||
for &(_name, value) in pairs.iter() {
|
for &(_name, value) in pairs.iter() {
|
||||||
if let Some(val) = value {
|
if let Some(val) = value {
|
||||||
if let Ok(val) = val.parse::<u64>() {
|
if let Ok(val) = val.parse::<u64>() {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
//! Manages the `/etc/lqos.conf` file.
|
//! Manages the `/etc/lqos.conf` file.
|
||||||
use log::error;
|
use log::error;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::{path::Path, fs, process::Command};
|
use std::{fs, path::Path};
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
/// Represents the top-level of the `/etc/lqos.conf` file. Serialization
|
/// Represents the top-level of the `/etc/lqos.conf` file. Serialization
|
||||||
@ -179,23 +179,17 @@ impl EtcLqos {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn check_config(cfg: &mut EtcLqos) {
|
fn check_config(cfg: &mut EtcLqos) {
|
||||||
use sha2::Digest;
|
|
||||||
use sha2::digest::Update;
|
use sha2::digest::Update;
|
||||||
|
use sha2::Digest;
|
||||||
|
|
||||||
if cfg.node_id.is_none() {
|
if cfg.node_id.is_none() {
|
||||||
if let Ok(out) = Command::new("/bin/ip").args(["link"]).output() {
|
if let Ok(machine_id) = std::fs::read_to_string("/etc/machine-id") {
|
||||||
if let Ok(raw_ip_link) = String::from_utf8(out.stdout) {
|
let hash = sha2::Sha256::new().chain(machine_id).finalize();
|
||||||
let hash = sha2::Sha256::new().chain(raw_ip_link).finalize();
|
|
||||||
cfg.node_id = Some(format!("{:x}", hash));
|
cfg.node_id = Some(format!("{:x}", hash));
|
||||||
log::info!("Generated node ID: {:?}", cfg.node_id);
|
|
||||||
log::warn!("Please consider adding a line to your /etc/lqos.conf configuration:");
|
|
||||||
log::warn!("node_id = (big random number)");
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[derive(Error, Debug)]
|
#[derive(Error, Debug)]
|
||||||
pub enum EtcLqosError {
|
pub enum EtcLqosError {
|
||||||
#[error(
|
#[error(
|
||||||
|
Loading…
Reference in New Issue
Block a user