1
0
Fork 0
mirror of https://forgejo.ellis.link/continuwuation/continuwuity.git synced 2025-09-30 18:42:05 +00:00

feat: Send notifications to systemd when a reload is triggered

This commit is contained in:
Ginger 2025-09-24 08:51:39 -04:00
parent f45ceedb8a
commit fd6910558e
6 changed files with 17 additions and 6 deletions

1
Cargo.lock generated
View file

@ -1121,6 +1121,7 @@ dependencies = [
"reqwest", "reqwest",
"ruma", "ruma",
"rustyline-async", "rustyline-async",
"sd-notify",
"serde", "serde",
"serde_json", "serde_json",
"serde_yml", "serde_yml",

View file

@ -156,6 +156,7 @@ sentry_telemetry = [
] ]
systemd = [ systemd = [
"conduwuit-router/systemd", "conduwuit-router/systemd",
"conduwuit-service/systemd"
] ]
journald = [ # This is a stub on non-unix platforms journald = [ # This is a stub on non-unix platforms
"dep:tracing-journald", "dep:tracing-journald",

View file

@ -40,7 +40,6 @@ io_uring = [
"conduwuit-admin/io_uring", "conduwuit-admin/io_uring",
"conduwuit-api/io_uring", "conduwuit-api/io_uring",
"conduwuit-service/io_uring", "conduwuit-service/io_uring",
"conduwuit-api/io_uring",
] ]
jemalloc = [ jemalloc = [
"conduwuit-admin/jemalloc", "conduwuit-admin/jemalloc",

View file

@ -65,7 +65,7 @@ pub(crate) async fn start(server: Arc<Server>) -> Result<Arc<Services>> {
let services = Services::build(server).await?.start().await?; let services = Services::build(server).await?.start().await?;
#[cfg(all(feature = "systemd", target_os = "linux"))] #[cfg(all(feature = "systemd", target_os = "linux"))]
sd_notify::notify(true, &[sd_notify::NotifyState::Ready]) sd_notify::notify(false, &[sd_notify::NotifyState::Ready])
.expect("failed to notify systemd of ready state"); .expect("failed to notify systemd of ready state");
debug!("Started"); debug!("Started");
@ -78,7 +78,7 @@ pub(crate) async fn stop(services: Arc<Services>) -> Result<()> {
debug!("Shutting down..."); debug!("Shutting down...");
#[cfg(all(feature = "systemd", target_os = "linux"))] #[cfg(all(feature = "systemd", target_os = "linux"))]
sd_notify::notify(true, &[sd_notify::NotifyState::Stopping]) sd_notify::notify(false, &[sd_notify::NotifyState::Stopping])
.expect("failed to notify systemd of stopping state"); .expect("failed to notify systemd of stopping state");
// Wait for all completions before dropping or we'll lose them to the module // Wait for all completions before dropping or we'll lose them to the module

View file

@ -67,6 +67,9 @@ release_max_log_level = [
"tracing/max_level_trace", "tracing/max_level_trace",
"tracing/release_max_level_info", "tracing/release_max_level_info",
] ]
systemd = [
"dep:sd-notify",
]
url_preview = [ url_preview = [
"dep:image", "dep:image",
"dep:webpage", "dep:webpage",
@ -119,5 +122,9 @@ blurhash.optional = true
recaptcha-verify = { version = "0.1.5", default-features = false } recaptcha-verify = { version = "0.1.5", default-features = false }
ctor.workspace = true ctor.workspace = true
[target.'cfg(all(unix, target_os = "linux"))'.dependencies]
sd-notify.workspace = true
sd-notify.optional = true
[lints] [lints]
workspace = true workspace = true

View file

@ -45,13 +45,16 @@ impl Deref for Service {
fn handle_reload(&self) -> Result { fn handle_reload(&self) -> Result {
if self.server.config.config_reload_signal { if self.server.config.config_reload_signal {
#[cfg(all(feature = "systemd", target_os = "linux"))] #[cfg(all(feature = "systemd", target_os = "linux"))]
sd_notify::notify(true, &[sd_notify::NotifyState::Reloading]) sd_notify::notify(false, &[
sd_notify::NotifyState::Reloading,
sd_notify::NotifyState::monotonic_usec_now().expect("Failed to read monotonic time"),
])
.expect("failed to notify systemd of reloading state"); .expect("failed to notify systemd of reloading state");
self.reload(iter::empty())?; self.reload(iter::empty())?;
#[cfg(all(feature = "systemd", target_os = "linux"))] #[cfg(all(feature = "systemd", target_os = "linux"))]
sd_notify::notify(true, &[sd_notify::NotifyState::Ready]) sd_notify::notify(false, &[sd_notify::NotifyState::Ready])
.expect("failed to notify systemd of ready state"); .expect("failed to notify systemd of ready state");
} }