Final Release of Version 1.0

This commit is contained in:
Breadway 2026-05-13 22:01:42 +08:00
parent 434fe1721c
commit 425b746780
34 changed files with 3129 additions and 567 deletions

View file

@ -71,7 +71,10 @@ fn hyprland_event_socket() -> Result<PathBuf> {
.collect();
match sockets.len() {
0 => Err(anyhow!("no Hyprland instance found in {}", hypr_dir.display())),
0 => Err(anyhow!(
"no Hyprland instance found in {}",
hypr_dir.display()
)),
1 => Ok(sockets.remove(0)),
n => {
warn!("found {n} Hyprland instances, using first");

View file

@ -1,21 +1,21 @@
use anyhow::Result;
use async_trait::async_trait;
use bread_shared::RawEvent;
use tokio::sync::{mpsc, watch, RwLock};
use tracing::info;
use serde::Serialize;
use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::{mpsc, watch, RwLock};
use tracing::info;
use crate::core::config::Config;
use crate::core::supervisor::spawn_supervised;
pub mod hyprland;
pub mod network;
pub mod power;
pub mod udev;
pub mod network_rtnetlink;
pub mod power;
pub mod power_upower;
pub mod udev;
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "snake_case")]
@ -71,7 +71,7 @@ impl Manager {
}
if self.config.adapters.hyprland.enabled {
self.spawn_adapter(hyprland::HyprlandAdapter::default());
self.spawn_adapter(hyprland::HyprlandAdapter);
}
if self.config.adapters.power.enabled {
@ -92,7 +92,7 @@ impl Manager {
if let Ok(adapter) = rt {
self.spawn_adapter(adapter);
} else {
self.spawn_adapter(network::NetworkAdapter::default());
self.spawn_adapter(network::NetworkAdapter);
}
}

View file

@ -70,7 +70,14 @@ impl Adapter for RtnetlinkAdapter {
"netns_id": netns_id,
"netns_fd": netns_fd
});
let _ = tx.send(RawEvent { source: AdapterSource::Network, kind: kind.to_string(), payload, timestamp: bread_shared::now_unix_ms() }).await;
let _ = tx
.send(RawEvent {
source: AdapterSource::Network,
kind: kind.to_string(),
payload,
timestamp: bread_shared::now_unix_ms(),
})
.await;
}
}
netlink_packet_core::NetlinkPayload::InnerMessage(RtnlMessage::NewRoute(route)) => {
@ -86,17 +93,32 @@ impl Adapter for RtnetlinkAdapter {
"gateway": gateway_ip,
"table": route.header.table
});
let _ = tx.send(RawEvent { source: AdapterSource::Network, kind: "route.default.changed".to_string(), payload, timestamp: bread_shared::now_unix_ms() }).await;
let _ = tx
.send(RawEvent {
source: AdapterSource::Network,
kind: "route.default.changed".to_string(),
payload,
timestamp: bread_shared::now_unix_ms(),
})
.await;
}
}
netlink_packet_core::NetlinkPayload::InnerMessage(RtnlMessage::NewAddress(addr)) => {
netlink_packet_core::NetlinkPayload::InnerMessage(RtnlMessage::NewAddress(
addr,
)) => {
let address = addr.nlas.iter().find_map(|nla| match nla {
netlink_packet_route::address::nlas::Nla::Address(bytes) => Some(bytes.clone()),
netlink_packet_route::address::nlas::Nla::Local(bytes) => Some(bytes.clone()),
netlink_packet_route::address::nlas::Nla::Address(bytes) => {
Some(bytes.clone())
}
netlink_packet_route::address::nlas::Nla::Local(bytes) => {
Some(bytes.clone())
}
_ => None,
});
let label = addr.nlas.iter().find_map(|nla| match nla {
netlink_packet_route::address::nlas::Nla::Label(label) => Some(label.clone()),
netlink_packet_route::address::nlas::Nla::Label(label) => {
Some(label.clone())
}
_ => None,
});
let ip = address.as_deref().and_then(ip_from_bytes);
@ -107,16 +129,31 @@ impl Adapter for RtnetlinkAdapter {
"address": ip,
"label": label
});
let _ = tx.send(RawEvent { source: AdapterSource::Network, kind: "address.added".to_string(), payload, timestamp: bread_shared::now_unix_ms() }).await;
let _ = tx
.send(RawEvent {
source: AdapterSource::Network,
kind: "address.added".to_string(),
payload,
timestamp: bread_shared::now_unix_ms(),
})
.await;
}
netlink_packet_core::NetlinkPayload::InnerMessage(RtnlMessage::DelAddress(addr)) => {
netlink_packet_core::NetlinkPayload::InnerMessage(RtnlMessage::DelAddress(
addr,
)) => {
let address = addr.nlas.iter().find_map(|nla| match nla {
netlink_packet_route::address::nlas::Nla::Address(bytes) => Some(bytes.clone()),
netlink_packet_route::address::nlas::Nla::Local(bytes) => Some(bytes.clone()),
netlink_packet_route::address::nlas::Nla::Address(bytes) => {
Some(bytes.clone())
}
netlink_packet_route::address::nlas::Nla::Local(bytes) => {
Some(bytes.clone())
}
_ => None,
});
let label = addr.nlas.iter().find_map(|nla| match nla {
netlink_packet_route::address::nlas::Nla::Label(label) => Some(label.clone()),
netlink_packet_route::address::nlas::Nla::Label(label) => {
Some(label.clone())
}
_ => None,
});
let ip = address.as_deref().and_then(ip_from_bytes);
@ -127,7 +164,14 @@ impl Adapter for RtnetlinkAdapter {
"address": ip,
"label": label
});
let _ = tx.send(RawEvent { source: AdapterSource::Network, kind: "address.removed".to_string(), payload, timestamp: bread_shared::now_unix_ms() }).await;
let _ = tx
.send(RawEvent {
source: AdapterSource::Network,
kind: "address.removed".to_string(),
payload,
timestamp: bread_shared::now_unix_ms(),
})
.await;
}
_ => {
debug!("unhandled netlink message");

View file

@ -6,8 +6,8 @@ use serde_json::json;
use std::collections::HashMap;
use tokio::sync::mpsc;
use tracing::{debug, info};
use zbus::{Message, MessageStream};
use zbus::zvariant::{OwnedObjectPath, OwnedValue};
use zbus::{Message, MessageStream};
use super::Adapter;

View file

@ -165,7 +165,11 @@ fn enumerate_with_udev(subsystems: &[String]) -> Result<Vec<ScannedDevice>> {
.or_else(|| dev.sysname().to_str().map(ToString::to_string))
.unwrap_or_else(|| "unknown".to_string());
let id = dev.syspath().to_string_lossy().to_string();
out.push(ScannedDevice { id, name, subsystem });
out.push(ScannedDevice {
id,
name,
subsystem,
});
}
Ok(out)