58 lines
1.9 KiB
Rust
58 lines
1.9 KiB
Rust
use iota_daemon_lib::{DaemonRuntime, IpcServer, log_broadcaster};
|
|
use iota_logger::{self as logger, log, log_t};
|
|
use iota_storage::users::user_manager;
|
|
use iota_storage::util::config_util::CONFIG;
|
|
use std::path::PathBuf;
|
|
use std::sync::Arc;
|
|
use std::time::Duration;
|
|
use tokio::sync::broadcast;
|
|
|
|
fn socket_path() -> PathBuf {
|
|
std::env::var_os("IOTA_SOCKET")
|
|
.map(PathBuf::from)
|
|
.unwrap_or_else(|| PathBuf::from("/run/iota/iota.sock"))
|
|
}
|
|
|
|
#[tokio::main(flavor = "multi_thread")]
|
|
async fn main() {
|
|
logger::startup();
|
|
iota_storage::util::config_util::load_config();
|
|
if user_manager::load_users().await.is_err() {
|
|
log_t!("user_load_failed");
|
|
}
|
|
let runtime = Arc::new(DaemonRuntime::new());
|
|
runtime.spawn_system_monitor();
|
|
let (messages, _) = broadcast::channel(512);
|
|
log_broadcaster::spawn(messages.clone());
|
|
let state_updates = runtime.clone();
|
|
let state_messages = messages.clone();
|
|
tokio::spawn(async move {
|
|
loop {
|
|
if *state_updates.state.shutdown.read().await {
|
|
break;
|
|
}
|
|
let _ = state_messages.send(iota_ipc::DaemonMessage::StateUpdate(
|
|
state_updates.snapshot(),
|
|
));
|
|
tokio::time::sleep(Duration::from_millis(500)).await;
|
|
}
|
|
});
|
|
|
|
let port = CONFIG.load().port;
|
|
if !web_server::start(port).await {
|
|
log!("Failed to start the MTP web server on port {}", port);
|
|
}
|
|
let _ = omikron_connector::omikron_connection::get_omikron_connection().await;
|
|
|
|
let server = IpcServer::new(socket_path(), runtime.clone(), messages);
|
|
tokio::spawn(async move {
|
|
if let Err(error) = server.run().await {
|
|
eprintln!("iota-daemon IPC server failed: {error}");
|
|
}
|
|
});
|
|
log!("iota-daemon started");
|
|
while !*runtime.state.shutdown.read().await {
|
|
tokio::time::sleep(Duration::from_millis(250)).await;
|
|
}
|
|
log!("iota-daemon stopping");
|
|
}
|