diff --git a/Cargo.lock b/Cargo.lock index afa871a..3a37f61 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1789,6 +1789,7 @@ dependencies = [ "soft-fido2", "soft-fido2-ctap", "soft-fido2-transport", + "systemd-journal-logger", "tempfile", "tokio", "toml", @@ -2619,6 +2620,16 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "systemd-journal-logger" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7266304d24ca5a4b230545fc558c80e18bd3e1d2eb1be149b6bcd04398d3e79c" +dependencies = [ + "log", + "rustix", +] + [[package]] name = "target-lexicon" version = "0.12.16" @@ -2644,7 +2655,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.2", "once_cell", "rustix", "windows-sys 0.61.2", diff --git a/Cargo.toml b/Cargo.toml index df45f5d..395d414 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,6 +32,7 @@ clap-serde-derive = "0.2" clap_complete = "4.5" log = "0.4" env_logger = "0.11" +systemd-journal-logger = "2.2.2" sha2 = "0.11" serde_cbor = "0.11.2" serde = { version = "1.0.228", features = ["derive"] } @@ -40,7 +41,7 @@ dirs = "6.0" prs-lib = "0.5" serde_json = "1.0" libc = "0.2" -nix = { version = "0.31", features = ["resource", "fs", "signal", "process", "dir"] } +nix = { version = "0.31", features = ["resource", "fs", "signal", "process", "dir", "user"] } notify-rust = "4.11" aes-gcm = "0.11" rand = "0.8" diff --git a/cmd/passless/Cargo.toml b/cmd/passless/Cargo.toml index 47610d2..2f5d150 100644 --- a/cmd/passless/Cargo.toml +++ b/cmd/passless/Cargo.toml @@ -34,6 +34,7 @@ soft-fido2-transport.workspace = true soft-fido2-ctap.workspace = true log.workspace = true env_logger.workspace = true +systemd-journal-logger.workspace = true sha2.workspace = true serde_cbor.workspace = true serde.workspace = true diff --git a/cmd/passless/src/main.rs b/cmd/passless/src/main.rs index 2c35b3c..6801f39 100644 --- a/cmd/passless/src/main.rs +++ b/cmd/passless/src/main.rs @@ -432,13 +432,29 @@ fn run() -> Result<()> { log::LevelFilter::Info }; - let env = Env::default() - .filter("PASSLESS_LOG_LEVEL") - .write_style("PASSLESS_LOG_STYLE"); - Builder::from_env(env) - .filter_level(log::LevelFilter::Debug) - .format_timestamp_millis() - .init(); + // Use syslog when running as systemd service + if systemd_journal_logger::connected_to_journal() + && let Ok(journal) = systemd_journal_logger::JournalLog::new() + { + // Assume only the agent is run as root + let syslog_identifier = if nix::unistd::Uid::effective().is_root() { + "passless-agent" + } else { + "passless" + }; + journal + .with_syslog_identifier(syslog_identifier.to_string()) + .install() + .expect("Logger was already installed."); + } else { + let env = Env::default() + .filter("PASSLESS_LOG_LEVEL") + .write_style("PASSLESS_LOG_STYLE"); + Builder::from_env(env) + .filter_level(log::LevelFilter::Debug) + .format_timestamp_millis() + .init(); + } log::set_max_level(log_level); // Load config: CLI args + config file + defaults (CLI takes precedence)