src/main: Terminate on ctrl-c

This commit is contained in:
Max Inden 2020-04-10 11:50:11 +02:00
parent f7582c97c0
commit a9042bb1ed
No known key found for this signature in database
GPG Key ID: 5403C5464810BC26
3 changed files with 64 additions and 18 deletions

34
Cargo.lock generated
View File

@ -522,6 +522,16 @@ dependencies = [
"stream-cipher", "stream-cipher",
] ]
[[package]]
name = "ctrlc"
version = "3.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a4ba686dff9fa4c1c9636ce1010b0cf98ceb421361b0bb3d6faeec43bd217a7"
dependencies = [
"nix",
"winapi 0.3.8",
]
[[package]] [[package]]
name = "cuckoofilter" name = "cuckoofilter"
version = "0.3.2" version = "0.3.2"
@ -624,6 +634,15 @@ dependencies = [
"version_check", "version_check",
] ]
[[package]]
name = "exit-future"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e43f2f1833d64e33f15592464d6fdd70f349dda7b1a53088eb83cd94014008c5"
dependencies = [
"futures 0.3.4",
]
[[package]] [[package]]
name = "fake-simd" name = "fake-simd"
version = "0.1.2" version = "0.1.2"
@ -1139,7 +1158,9 @@ name = "kademlia-exporter"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"async-std", "async-std",
"ctrlc",
"env_logger", "env_logger",
"exit-future",
"futures 0.3.4", "futures 0.3.4",
"libp2p", "libp2p",
"libp2p-kad", "libp2p-kad",
@ -1767,6 +1788,19 @@ dependencies = [
"winapi 0.3.8", "winapi 0.3.8",
] ]
[[package]]
name = "nix"
version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363"
dependencies = [
"bitflags",
"cc",
"cfg-if",
"libc",
"void",
]
[[package]] [[package]]
name = "nodrop" name = "nodrop"
version = "0.1.14" version = "0.1.14"

View File

@ -15,4 +15,6 @@ libp2p-kad = "0.16.2"
prometheus = "0.7" prometheus = "0.7"
void = "1.0.2" void = "1.0.2"
tide = "0.6" tide = "0.6"
exit-future = "0.2"
ctrlc = "3"

View File

@ -1,16 +1,27 @@
use async_std::task; use async_std::task;
use prometheus::{Encoder, Registry, TextEncoder}; use prometheus::{Encoder, Registry, TextEncoder};
use std::error::Error; use std::{error::Error, sync::{Arc, Mutex}};
mod behaviour; mod behaviour;
mod exporter; mod exporter;
fn main() -> Result<(), Box<dyn Error>> { fn main() -> Result<(), Box<dyn Error>> {
let (signal, exit) = exit_future::signal();
let signal = Arc::new(Mutex::new(Some(signal)));
ctrlc::set_handler(move || {
println!("Got ctrlc");
match signal.lock().unwrap().take() {
Some(signal) => signal.fire().unwrap(),
None => {}
}
}).unwrap();
let registry = Registry::new(); let registry = Registry::new();
let exporter = exporter::Exporter::new(&registry)?; let exporter = exporter::Exporter::new(&registry)?;
let _metrics_server = std::thread::spawn(move || { let exit_clone = exit.clone();
task::block_on(async { let metrics_server = std::thread::spawn(move || {
let mut app = tide::with_state(registry); let mut app = tide::with_state(registry);
app.at("/metrics") app.at("/metrics")
.get(|req: tide::Request<prometheus::Registry>| async move { .get(|req: tide::Request<prometheus::Registry>| async move {
@ -21,14 +32,13 @@ fn main() -> Result<(), Box<dyn Error>> {
String::from_utf8(buffer).unwrap() String::from_utf8(buffer).unwrap()
}); });
app.listen("0.0.0.0:8080").await.unwrap(); let endpoint = app.listen("0.0.0.0:8080");
Result::<(), ()>::Ok(()) futures::pin_mut!(endpoint);
}) task::block_on(exit_clone.until(endpoint))
}); });
// Kick it off. task::block_on(exit.until(exporter));
let _listening = false;
task::block_on(exporter);
metrics_server.join().unwrap();
Ok(()) Ok(())
} }