Skip to content

Commit b23aae3

Browse files
committed
Chore: add signal-handling to run-blocking
1 parent 3e9e42b commit b23aae3

File tree

4 files changed

+69
-6
lines changed

4 files changed

+69
-6
lines changed

rust/Cargo.lock

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/crates/greenbone-scanner-framework/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ tokio-rustls = { workspace = true }
2020
tracing = { workspace = true }
2121
uuid = { workspace = true }
2222
futures = { workspace = true }
23+
signal-hook-tokio = { version = "0.4.0", features = ["futures-v0_3"] }
24+
signal-hook = "0.4.3"
2325

2426
[dev-dependencies]
2527
insta = { workspace = true }

rust/crates/greenbone-scanner-framework/src/lib.rs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::{
55
pin::Pin,
66
sync::{
77
Arc, RwLock,
8-
atomic::{AtomicUsize, Ordering},
8+
atomic::{AtomicI32, AtomicUsize, Ordering},
99
},
1010
};
1111

@@ -51,6 +51,10 @@ mod post_scans_id;
5151
mod tls;
5252
use post_scans::PostScansHandler;
5353
use post_scans_id::{PostScansId, PostScansIdHandler};
54+
55+
use futures::stream::StreamExt;
56+
use signal_hook::consts::signal::*;
57+
use signal_hook_tokio::Signals;
5458
use tokio::net::TcpListener;
5559

5660
pub trait ExternalError: core::error::Error + Send + Sync + 'static {}
@@ -375,8 +379,29 @@ impl RuntimeBuilder<runtime_builder_states::DeleteScanIDSet> {
375379
}
376380
}
377381

382+
static RUN: AtomicI32 = AtomicI32::new(0);
383+
384+
async fn handle_signals(mut signals: Signals) {
385+
while let Some(signal) = signals.next().await {
386+
match signal {
387+
SIGHUP => {
388+
tracing::info!("Ignoring SIGHUP signal.");
389+
}
390+
SIGTERM | SIGINT | SIGQUIT => {
391+
tracing::info!(signal, "Exit based on signal.");
392+
RUN.store(128 + signal, Ordering::Relaxed);
393+
}
394+
_ => unreachable!(),
395+
}
396+
}
397+
}
398+
378399
impl RuntimeBuilder<runtime_builder_states::End> {
379-
pub async fn run_blocking(self) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
400+
pub async fn run_blocking(self) -> Result<i32, Box<dyn std::error::Error + Send + Sync>> {
401+
let signals = Signals::new([SIGHUP, SIGTERM, SIGINT, SIGQUIT])?;
402+
let _handle_guard = signals.handle();
403+
tokio::task::spawn(handle_signals(signals));
404+
380405
let scanner = Arc::new(self.build_scanner());
381406
let tls_config = match &self.tls {
382407
Some(x) => Some(tls::tls_config(x)?),
@@ -395,7 +420,7 @@ impl RuntimeBuilder<runtime_builder_states::End> {
395420
let config = Arc::new(tls_config.config);
396421
let tls_acceptor = tokio_rustls::TlsAcceptor::from(config);
397422

398-
loop {
423+
while RUN.load(Ordering::Relaxed) == 0 {
399424
let (tcp_stream, _remote_addr) = incoming.accept().await?;
400425
let tls_acceptor = tls_acceptor.clone();
401426
let identifier = tls_config.client_identifier.clone();
@@ -433,7 +458,7 @@ impl RuntimeBuilder<runtime_builder_states::End> {
433458
} else {
434459
use hyper::server::conn::http1::Builder;
435460
tracing::info!("listening on http://{}", self.listener_address);
436-
loop {
461+
while RUN.load(Ordering::Relaxed) == 0 {
437462
let (tcp_stream, _remote_addr) = incoming.accept().await?;
438463
let ctx = scanner.clone();
439464
let handlers = handlers.clone();
@@ -459,6 +484,7 @@ impl RuntimeBuilder<runtime_builder_states::End> {
459484
});
460485
}
461486
}
487+
Ok(RUN.load(Ordering::Relaxed))
462488
}
463489
}
464490

rust/src/openvasd/main.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ mod vts;
1818
use sqlx::migrate::Migrator;
1919
use std::{
2020
marker::{Send, Sync},
21+
process::ExitCode,
2122
sync::Arc,
2223
};
2324

@@ -59,8 +60,7 @@ async fn setup_sqlite(config: &Config) -> Result<SqlitePool> {
5960
Ok(result)
6061
}
6162

62-
#[tokio::main]
63-
async fn main() -> Result<()> {
63+
async fn _main() -> Result<i32> {
6464
let config = Config::load();
6565
let _guard = config.logging.init();
6666

@@ -111,3 +111,14 @@ async fn main() -> Result<()> {
111111
.run_blocking()
112112
.await
113113
}
114+
115+
#[tokio::main]
116+
async fn main() -> ExitCode {
117+
match _main().await {
118+
Ok(x) => ExitCode::from(x as u8),
119+
Err(error) => {
120+
tracing::error!(%error, "Unexpected error result");
121+
ExitCode::from(1)
122+
}
123+
}
124+
}

0 commit comments

Comments
 (0)