durnitisp/src/icmp.rs

89 lines
2.8 KiB
Rust
Raw Normal View History

2020-12-24 15:48:50 -05:00
// Copyright 2020 Jeremy Wall
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
2020-12-24 23:19:05 -05:00
use ekko::{Ekko, EkkoResponse};
use gflags;
use log::{error, info};
use prometheus::{CounterVec, IntGaugeVec};
2020-12-24 15:48:50 -05:00
use std::sync::{Arc, RwLock};
2020-12-24 23:19:05 -05:00
use std::time::Duration;
2020-12-24 15:48:50 -05:00
2020-12-24 23:19:05 -05:00
gflags::define! {
2020-12-24 23:28:30 -05:00
/// The size in bytes of the ping requests.
2020-12-24 23:19:05 -05:00
--pingPayload = "durnitisp"
}
2020-12-24 15:48:50 -05:00
gflags::define! {
2020-12-24 23:28:30 -05:00
/// The size in bytes of the ping requests.
2020-12-24 23:19:05 -05:00
--pingTTL: u32 = 113
2020-12-24 15:48:50 -05:00
}
2020-12-24 23:19:05 -05:00
gflags::define! {
2020-12-24 23:28:30 -05:00
/// The size in bytes of the ping requests.
2020-12-24 23:19:05 -05:00
--pingTimeout: u64 = 2048
}
gflags::define! {
2020-12-24 23:28:30 -05:00
/// The size in bytes of the ping requests.
2020-12-24 23:19:05 -05:00
--maxHops: u8 = 50
2020-12-24 15:48:50 -05:00
}
pub fn start_echo_loop(
domain_name: &str,
stop_signal: Arc<RwLock<bool>>,
2020-12-24 23:19:05 -05:00
ping_latency_guage: IntGaugeVec,
ping_counter: CounterVec,
2020-12-24 15:48:50 -05:00
) {
2020-12-24 23:19:05 -05:00
info!("Pinging {}", domain_name);
let mut sender = Ekko::with_target(domain_name).unwrap();
2020-12-24 15:48:50 -05:00
loop {
{
// Limit the scope of this lock
if *stop_signal.read().unwrap() {
info!("Stopping ping thread for {}", domain_name);
return;
}
}
2020-12-24 23:19:05 -05:00
let response = sender
.send_with_timeout(MAXHOPS.flag, Some(Duration::from_millis(PINGTIMEOUT.flag)))
.unwrap();
match response {
EkkoResponse::DestinationResponse(r) => {
info!(
"ICMP: Reply from {}: time={}ms",
r.address.unwrap(),
r.elapsed.as_millis(),
);
ping_counter
.with(&prometheus::labels! {"result" => "ok", "domain" => domain_name})
.inc();
ping_latency_guage
.with(&prometheus::labels! {"domain" => domain_name})
.set(r.elapsed.as_millis() as i64);
}
EkkoResponse::ExceededResponse(r) => {
ping_counter
.with(&prometheus::labels! {"result" => "timedout", "domain" => domain_name})
.inc();
}
_ => {
ping_counter
.with(&prometheus::labels! {"result" => "err", "domain" => domain_name})
.inc();
error!("{:?}", response);
2020-12-24 15:48:50 -05:00
}
}
2020-12-24 23:19:05 -05:00
std::thread::sleep(Duration::from_secs(3));
2020-12-24 15:48:50 -05:00
}
}