110 lines
2.6 KiB
Rust
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();
|
|
}
|
|
}
|