diff --git a/README.md b/README.md index 2b70e61..ff306f8 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,5 @@ sessiond-hooks --config PATH [--log-target stderr|syslog] For each login session, `sessiond-hooks` applies this function to the session's context and spawns `init` with `args`. The `restart` policy controls what happens -when the hook exits: `Never` disables restarts, `Failure` restarts only after a -failed exit, and `Always` restarts after every exit. `delay` is the restart +when the hook exits, `delay` is the restart delay in seconds. diff --git a/src/main.rs b/src/main.rs index d63a62c..d21f55f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -89,13 +89,23 @@ impl ManagedSession { cmd.env(key, value); } - log::info!(init:? = self.config.init, args:? = self.config.args, - session_id = self.id, uid = self.uid, env_count = self.envs.len(); "spawning hook"); + log::info!( + init:? = self.config.init, + args:? = self.config.args, + session_id = self.id, + uid = self.uid, + env_count = self.envs.len(); + "spawning hook" + ); let mut child = match cmd.spawn() { Ok(child) => child, Err(err) => { - log::error!(init:? = self.config.init, uid = self.uid, error:% = err; - "failed to spawn hook"); + log::error!( + init:? = self.config.init, + uid = self.uid, + error:% = err; + "failed to spawn hook" + ); return; } }; @@ -111,7 +121,11 @@ impl ManagedSession { let pidfd = match rustix::process::pidfd_open(pid, rustix::process::PidfdFlags::empty()) { Ok(pidfd) => pidfd, Err(err) => { - log::error!(pid = child.id(), error:% = err; "cannot open pidfd for hook"); + log::error!( + pid = child.id(), + error:% = err; + "cannot open pidfd for hook" + ); let _ = child.kill(); let _ = child.wait(); return; @@ -137,7 +151,10 @@ impl ManagedSession { .iter_mut() .find(|session| session.id == session_id) else { - log::debug!(session_id; "discarding child-exit event for removed session"); + log::debug!( + session_id; + "discarding child-exit event for removed session" + ); return Ok(calloop::PostAction::Remove); }; @@ -151,27 +168,39 @@ impl ManagedSession { let restart_delay = session.config.restart.delay; let restart = timer::Timer::from_duration(time::Duration::from_secs(restart_delay)); - if let Err(error) = state - .loop_handle - .insert_source(restart, move |_, _, state| { - if let Some(session) = state - .managed_sessions - .iter_mut() - .find(|session| session.id == session_id) - { - log::info!(session_id = session.id, uid = session.uid, delay_seconds = restart_delay; "restarting hook"); - session.run_hook(state.loop_handle.clone()); - } else { - log::debug!(session_id; "discarding restart for removed session"); - } - - timer::TimeoutAction::Drop - }) { - log::error!(session_id, error:% = error; "failed to schedule restart"); + if let Err(error) = + state + .loop_handle + .insert_source(restart, move |_, _, state| { + if let Some(session) = state + .managed_sessions + .iter_mut() + .find(|session| session.id == session_id) + { + log::info!(session_id = session.id, + uid = session.uid, + delay_seconds = restart_delay; + "restarting hook" + ); + session.run_hook(state.loop_handle.clone()); + } + + timer::TimeoutAction::Drop + }) + { + log::error!( + session_id, + error:% = error; + "failed to schedule restart" + ); } } } - log::info!(session_id, status:% = status; "hook exited"); + log::info!( + session_id, + status:% = status; + "hook exited" + ); session.hook = None; @@ -180,7 +209,11 @@ impl ManagedSession { Ok(calloop::PostAction::Continue) }) { - log::error!(session_id, error:% = err; "failed to supervise hook"); + log::error!( + session_id, + error:% = err; + "failed to supervise hook" + ); if let Some(child) = &mut self.hook { let _ = child.kill(); let _ = child.wait();