From 7ef9dda6cf206d48b4fad1ae8a799a1fc16fa34b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C5=91rik=20Levente?= <33373714+Levminer@users.noreply.github.com> Date: Sun, 8 Dec 2024 18:03:21 +0100 Subject: [PATCH] Daemon run as linux service --- Cargo.lock | 108 +++++++++++++++++++++++++++ platforms/unix/daemon/Cargo.toml | 1 + platforms/unix/daemon/src/main.rs | 23 ++++++ platforms/unix/daemon/src/service.rs | 57 ++++++++++++++ 4 files changed, 189 insertions(+) create mode 100644 platforms/unix/daemon/src/service.rs diff --git a/Cargo.lock b/Cargo.lock index 621b3cb..19c77a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -91,6 +91,55 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +dependencies = [ + "anstyle", + "windows-sys 0.59.0", +] + [[package]] name = "anyhow" version = "1.0.92" @@ -810,6 +859,46 @@ dependencies = [ "inout", ] +[[package]] +name = "clap" +version = "4.5.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + [[package]] name = "cocoa" version = "0.26.0" @@ -840,6 +929,12 @@ dependencies = [ "objc", ] +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + [[package]] name = "combine" version = "4.6.7" @@ -951,6 +1046,7 @@ dependencies = [ "async-channel 2.3.1", "axum", "axum-extra", + "clap", "ezrtc", "futures", "futures-util", @@ -2627,6 +2723,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itoa" version = "0.4.8" @@ -6520,6 +6622,12 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "uuid" version = "1.11.0" diff --git a/platforms/unix/daemon/Cargo.toml b/platforms/unix/daemon/Cargo.toml index 04179c6..733b6e2 100644 --- a/platforms/unix/daemon/Cargo.toml +++ b/platforms/unix/daemon/Cargo.toml @@ -25,3 +25,4 @@ ezrtc = "0.5.0" webrtc = "0.11" async-channel = "2.3.1" wol-rs = "1" +clap = { version = "4.5.23", features = ["derive"] } diff --git a/platforms/unix/daemon/src/main.rs b/platforms/unix/daemon/src/main.rs index 577e8d8..b060dd4 100644 --- a/platforms/unix/daemon/src/main.rs +++ b/platforms/unix/daemon/src/main.rs @@ -8,6 +8,7 @@ use axum::{ routing::get, Router, }; +use clap::Parser; use ezrtc::host::EzRTCHost; use ezrtc::socket::DataChannelHandler; use futures::{sink::SinkExt, stream::StreamExt}; @@ -31,6 +32,8 @@ use webrtc::data_channel::RTCDataChannel; use webrtc::ice_transport::ice_server::RTCIceServer; use wol::{send_wol, MacAddr}; +mod service; + #[derive(Serialize, Deserialize)] pub struct GenericMessage { pub r#type: String, @@ -44,8 +47,20 @@ pub struct AppState { settings: Settings, } +/// Modern hardware monitor with remote monitoring. +#[derive(Parser, Debug)] +#[command(version, about, long_about = None)] +struct Args { + /// Setup coresd to run as a service + #[arg(required = false, long, short = 's')] + service: bool, +} + #[tokio::main] async fn main() { + // Parse arguments + let args = Args::parse(); + // Logger CombinedLogger::init(vec![TermLogger::new( LevelFilter::Info, @@ -55,6 +70,14 @@ async fn main() { )]) .unwrap(); + if args.service { + service::setup_service(); + } else { + warn!( + "You are running coresd as an executable, to setup it as a service, run `sudo ./coresd --service`" + ); + } + // Get settings let settings = get_settings(); info!("Connection code: {:?}", settings.connection_code); diff --git a/platforms/unix/daemon/src/service.rs b/platforms/unix/daemon/src/service.rs new file mode 100644 index 0000000..f9385f3 --- /dev/null +++ b/platforms/unix/daemon/src/service.rs @@ -0,0 +1,57 @@ +use log::{error, info}; + +pub fn setup_service() { + // copy current executable to /bin as sudo + let current_exe = std::env::current_exe().expect("Failed to get current executable"); + let status = std::fs::copy(current_exe, "/bin/coresd"); + + if let Err(e) = status { + error!( + "Failed to copy executable to /bin, please run as root! Error: {}", + e + ); + std::process::exit(1); + } + + let file_contents = "[Unit] +Description=coresd +After=network.target + +[Service] +User=root +ExecStart=/bin/coresd +Restart=always + +[Install] +WantedBy=multi-user.target"; + + // create service file + let status = std::fs::write("/etc/systemd/system/coresd.service", file_contents); + + if let Err(e) = status { + error!( + "Failed to create coresd service file, please run as root! Error: {}", + e + ); + std::process::exit(1); + } + + // enable service + std::process::Command::new("sudo") + .arg("systemctl") + .arg("enable") + .arg("coresd") + .status() + .expect("Failed to enable coresd service"); + + // start service + std::process::Command::new("sudo") + .arg("systemctl") + .arg("start") + .arg("coresd") + .status() + .expect("Failed to start coresd service"); + + info!("Service created successfully, please run `sudo systemctl status coresd` for more information"); + std::process::exit(0); +}