use std::sync::Arc;
use crate::tls_loader::TlsLoader;
#[cfg(unix)]
pub fn register_sighup_handler(tls_loader: Arc<TlsLoader>) {
use tokio::signal::unix::{signal, SignalKind};
tokio::spawn(async move {
let mut stream = match signal(SignalKind::hangup()) {
Ok(s) => s,
Err(e) => {
tracing::error!("Failed to register SIGHUP handler: {}", e);
return;
},
};
tracing::info!("SIGHUP handler registered for TLS certificate reload");
loop {
stream.recv().await;
tracing::info!("Received SIGHUP, reloading TLS certificates");
match tls_loader.reload().await {
Ok(()) => {
tracing::info!("TLS certificates reloaded successfully");
},
Err(e) => {
tracing::error!("Failed to reload TLS certificates: {}", e);
},
}
}
});
}
#[cfg(not(unix))]
pub fn register_sighup_handler(_tls_loader: Arc<TlsLoader>) {
tracing::debug!("SIGHUP handler not available on this platform");
}
pub async fn wait_for_shutdown_signal() -> Result<(), std::io::Error> {
#[cfg(unix)]
{
use tokio::signal::unix::{signal, SignalKind};
let mut sigterm = signal(SignalKind::terminate())?;
let mut sigint = signal(SignalKind::interrupt())?;
tokio::select! {
_ = sigterm.recv() => {
tracing::info!("Received SIGTERM");
}
_ = sigint.recv() => {
tracing::info!("Received SIGINT");
}
}
}
#[cfg(not(unix))]
{
tokio::signal::ctrl_c().await?;
tracing::info!("Received Ctrl+C");
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use crate::config::TlsConfig;
use std::path::PathBuf;
fn valid_cert_paths() -> (PathBuf, PathBuf) {
let dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("tests")
.join("fixtures");
(dir.join("valid_cert.pem"), dir.join("valid_key.pem"))
}
#[tokio::test]
async fn test_sighup_handler_registration() {
let (cert_path, key_path) = valid_cert_paths();
let config = TlsConfig::new(cert_path, key_path);
let loader = Arc::new(TlsLoader::new(config).expect("should create loader"));
register_sighup_handler(loader);
tokio::time::sleep(tokio::time::Duration::from_millis(10)).await;
}
#[cfg(not(unix))]
#[test]
fn test_non_unix_noop() {
}
#[tokio::test]
async fn test_shutdown_signal_setup() {
}
}