services/src/updater.rs

110 lines
2.6 KiB
Rust

mod check;
use crate::check::check;
use ::services::{
get_config,
models::{Scans, Services},
schema::{
scans::{dsl::scans, installation},
services::dsl::*,
},
};
use std::net::IpAddr;
use diesel::{
associations::HasTable, Connection, ExpressionMethods, QueryDsl, RunQueryDsl, SelectableHelper,
SqliteConnection,
};
use dns_lookup::lookup_host;
#[tokio::main]
async fn main() {
let config = get_config();
let mut conn = SqliteConnection::establish(&config.database)
.unwrap_or_else(|_| panic!("Error connecting to database"));
for service in services
.limit(300)
.select(Services::as_select())
.load(&mut conn)
.expect("Error loading services")
{
let result_ipv6 = match check(&service.url, Some(6)).await {
Ok(_) => "ok".to_string(),
Err(e) => e,
};
let result_ipv4 = match check(&service.url, Some(4)).await {
Ok(_) => "ok".to_string(),
Err(e) => e,
};
diesel::insert_into(scans::table())
.values(Scans {
id: None,
installation: service.url.to_string(),
timestamp: std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs() as i64,
result_ipv6: result_ipv6.clone(),
result_ipv4: result_ipv4.clone(),
})
.execute(&mut conn)
.unwrap();
let installation_scans = scans
.filter(installation.eq(service.url.to_string()))
.limit(100)
.select(Scans::as_select())
.load(&mut conn)
.unwrap();
let ipv6_successes = installation_scans
.iter()
.filter(|s| s.result_ipv6 == "ok")
.count();
let ipv4_successes = installation_scans
.iter()
.filter(|s| s.result_ipv4 == "ok")
.count();
let scans_nb = installation_scans.len();
let ips: Vec<std::net::IpAddr> =
match lookup_host(reqwest::Url::parse(&service.url).unwrap().domain().unwrap()) {
Ok(i) => i,
Err(_) => vec![],
};
let service_new = check(&service.url, None).await.unwrap_or(service);
let mut addr_ipv6 = vec![];
let mut addr_ipv4 = vec![];
for ip in ips {
match ip {
IpAddr::V6(ip) => addr_ipv6.push(ip.to_string()),
IpAddr::V4(ip) => addr_ipv4.push(ip.to_string()),
};
}
diesel::update(services.find(&service_new.url))
.set((
url.eq(&service_new.url),
software.eq(&service_new.software),
server.eq(&service_new.server),
ipv6.eq(&result_ipv6),
ipv4.eq(&result_ipv4),
availability_ipv6
.eq(((ipv6_successes as f32 / scans_nb as f32 * 100.0) as u8).to_string()),
availability_ipv4
.eq(((ipv4_successes as f32 / scans_nb as f32 * 100.0) as u8).to_string()),
address_ipv6.eq(&addr_ipv6.join(",")),
address_ipv4.eq(&addr_ipv4.join(",")),
))
.execute(&mut conn)
.unwrap();
}
}