diff --git a/Cargo.toml b/Cargo.toml index f7d3a37..05673af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,5 +18,7 @@ actix-files = "0.6" tokio = { version = "1", features = ["full"] } clap = { version = "4.4", features = ["derive"] } log = "0.4" + +[target.'cfg(target_os = "linux")'.dependencies] systemd-journal-logger = "1.0" diff --git a/setup.sh b/setup.sh index 016ce30..4dd5685 100644 --- a/setup.sh +++ b/setup.sh @@ -28,11 +28,15 @@ sudo ln -sf $INSTALL_DIR/timeturner $BIN_DIR/timeturner echo "✅ Binary installed to $INSTALL_DIR and linked to $BIN_DIR." # 4. Install systemd service file -echo "⚙️ Installing systemd service..." -sudo cp timeturner.service /etc/systemd/system/ -sudo systemctl daemon-reload -sudo systemctl enable timeturner.service -echo "✅ Systemd service installed and enabled." +if [[ "$(uname)" == "Linux" ]]; then + echo "⚙️ Installing systemd service for Linux..." + sudo cp timeturner.service /etc/systemd/system/ + sudo systemctl daemon-reload + sudo systemctl enable timeturner.service + echo "✅ Systemd service installed and enabled." +else + echo "⚠️ Skipping systemd service installation on non-Linux OS." +fi echo "" echo "--- Setup Complete ---" @@ -40,12 +44,14 @@ echo "The TimeTurner daemon is now installed." echo "The working directory is $INSTALL_DIR." echo "A default 'config.yml' will be created there on first run." echo "" -echo "To start the service, run:" -echo " sudo systemctl start timeturner.service" -echo "" -echo "To view live logs, run:" -echo " journalctl -u timeturner.service -f" -echo "" +if [[ "$(uname)" == "Linux" ]]; then + echo "To start the service, run:" + echo " sudo systemctl start timeturner.service" + echo "" + echo "To view live logs, run:" + echo " journalctl -u timeturner.service -f" + echo "" +fi echo "To run the interactive TUI instead, simply run from the project directory:" echo " cargo run" echo "Or from anywhere after installation:" diff --git a/src/main.rs b/src/main.rs index 2a2f8b8..652e1b4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -103,9 +103,16 @@ async fn main() { }); } else { println!("🚀 Starting TimeTurner daemon..."); - systemd_journal_logger::init().unwrap(); - log::set_max_level(log::LevelFilter::Info); - log::info!("TimeTurner daemon started. API server is running."); + #[cfg(target_os = "linux")] + { + systemd_journal_logger::init().unwrap(); + log::set_max_level(log::LevelFilter::Info); + log::info!("TimeTurner daemon started. API server is running."); + } + #[cfg(not(target_os = "linux"))] + { + println!("Daemon mode started. API server is running. Logging to system journal is only supported on Linux."); + } } // 6️⃣ Set up a LocalSet for the API server and main loop diff --git a/src/system.rs b/src/system.rs index fbee618..8362756 100644 --- a/src/system.rs +++ b/src/system.rs @@ -5,10 +5,18 @@ use std::process::Command; /// Check if Chrony is active pub fn ntp_service_active() -> bool { - if let Ok(output) = Command::new("systemctl").args(&["is-active", "chrony"]).output() { - output.status.success() - && String::from_utf8_lossy(&output.stdout).trim() == "active" - } else { + #[cfg(target_os = "linux")] + { + if let Ok(output) = Command::new("systemctl").args(&["is-active", "chrony"]).output() { + output.status.success() + && String::from_utf8_lossy(&output.stdout).trim() == "active" + } else { + false + } + } + #[cfg(not(target_os = "linux"))] + { + // systemctl is not available on non-Linux platforms. false } } @@ -16,8 +24,17 @@ pub fn ntp_service_active() -> bool { /// Toggle Chrony (not used yet) #[allow(dead_code)] pub fn ntp_service_toggle(start: bool) { - let action = if start { "start" } else { "stop" }; - let _ = Command::new("systemctl").args(&[action, "chrony"]).status(); + #[cfg(target_os = "linux")] + { + let action = if start { "start" } else { "stop" }; + let _ = Command::new("systemctl").args(&[action, "chrony"]).status(); + } + #[cfg(not(target_os = "linux"))] + { + // No-op on non-Linux. + // The parameter is unused, but the function is dead code anyway. + let _ = start; + } } pub fn trigger_sync(frame: &LtcFrame, config: &Config) -> Result {