fix unix listener

This commit is contained in:
Robin Appelman 2026-03-27 21:57:07 +01:00
commit 81ec03a6ec
3 changed files with 40 additions and 10 deletions

23
Cargo.lock generated
View file

@ -1,6 +1,6 @@
# This file is automatically @generated by Cargo. # This file is automatically @generated by Cargo.
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3 version = 4
[[package]] [[package]]
name = "addr2line" name = "addr2line"
@ -380,6 +380,16 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "errno"
version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
dependencies = [
"libc",
"windows-sys 0.52.0",
]
[[package]] [[package]]
name = "eyre" name = "eyre"
version = "0.6.12" version = "0.6.12"
@ -1179,6 +1189,16 @@ version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "signal-hook-registry"
version = "1.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
dependencies = [
"errno",
"libc",
]
[[package]] [[package]]
name = "slab" name = "slab"
version = "0.4.12" version = "0.4.12"
@ -1294,6 +1314,7 @@ dependencies = [
"libc", "libc",
"mio", "mio",
"pin-project-lite", "pin-project-lite",
"signal-hook-registry",
"socket2", "socket2",
"tokio-macros", "tokio-macros",
"windows-sys 0.61.2", "windows-sys 0.61.2",

View file

@ -7,7 +7,7 @@ rust-version = "1.85.0"
[dependencies] [dependencies]
rumqttc = "0.25.1" rumqttc = "0.25.1"
tokio = { version = "1.50.0", features = ["macros", "rt-multi-thread"] } tokio = { version = "1.50.0", features = ["macros", "rt-multi-thread", "signal"] }
dashmap = "6.1.0" dashmap = "6.1.0"
jzon = "0.12.5" jzon = "0.12.5"
warp = { version = "0.4.2", features = ["server"] } warp = { version = "0.4.2", features = ["server"] }

View file

@ -5,13 +5,13 @@ mod topic;
use crate::config::{Config, ListenConfig}; use crate::config::{Config, ListenConfig};
use crate::device::{ use crate::device::{
format_device_state, format_dsmr_state, format_mi_temp_state, format_rf_temp_state, Device, Device, DeviceStates, format_device_state, format_dsmr_state, format_mi_temp_state,
DeviceStates, format_rf_temp_state,
}; };
use crate::mqtt::mqtt_stream; use crate::mqtt::mqtt_stream;
use crate::topic::Topic; use crate::topic::Topic;
use clap::Parser; use clap::Parser;
use color_eyre::{eyre::WrapErr, Result}; use color_eyre::{Result, eyre::WrapErr};
use pin_utils::pin_mut; use pin_utils::pin_mut;
use rumqttc::{AsyncClient, Publish, QoS}; use rumqttc::{AsyncClient, Publish, QoS};
@ -20,9 +20,9 @@ use std::pin::Pin;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::time::Instant; use std::time::Instant;
use tokio::net::UnixListener; use tokio::net::UnixListener;
use tokio::signal::ctrl_c;
use tokio::task::spawn; use tokio::task::spawn;
use tokio::time::{sleep, Duration}; use tokio::time::{Duration, sleep};
use tokio_stream::wrappers::UnixListenerStream;
use tokio_stream::{Stream, StreamExt}; use tokio_stream::{Stream, StreamExt};
use warp::Filter; use warp::Filter;
@ -97,14 +97,23 @@ async fn serve(device_states: Arc<Mutex<DeviceStates>>, config: Config) {
response response
}); });
let cancel = async { ctrl_c().await.unwrap() };
match config.listen { match config.listen {
ListenConfig::Ip { address, port } => { ListenConfig::Ip { address, port } => {
warp::serve(metrics).run((address, port)).await; warp::serve(metrics)
.bind((address, port))
.await
.graceful(cancel)
.run()
.await;
} }
ListenConfig::Unix { socket: path } => { ListenConfig::Unix { socket: path } => {
let listener = UnixListener::bind(path).unwrap(); let listener = UnixListener::bind(path).unwrap();
let incoming = UnixListenerStream::new(listener); warp::serve(metrics)
warp::serve(metrics).incoming(incoming); .incoming(listener)
.graceful(cancel)
.run()
.await;
} }
} }
} }