Private
Public Access
1
0

Adds kordophoned, basic dbus interface

This commit is contained in:
2025-02-11 23:15:24 -08:00
parent 16c202734c
commit fddc45c62a
9 changed files with 365 additions and 10 deletions

188
Cargo.lock generated
View File

@@ -1,6 +1,6 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
version = 4
[[package]]
name = "addr2line"
@@ -41,6 +41,15 @@ dependencies = [
"libc",
]
[[package]]
name = "ansi_term"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
dependencies = [
"winapi",
]
[[package]]
name = "anstream"
version = "0.6.15"
@@ -113,6 +122,17 @@ dependencies = [
"syn",
]
[[package]]
name = "atty"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
dependencies = [
"hermit-abi 0.1.19",
"libc",
"winapi",
]
[[package]]
name = "autocfg"
version = "1.2.0"
@@ -190,6 +210,21 @@ dependencies = [
"windows-targets 0.52.4",
]
[[package]]
name = "clap"
version = "2.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
dependencies = [
"ansi_term",
"atty",
"bitflags 1.3.2",
"strsim 0.8.0",
"textwrap",
"unicode-width",
"vec_map",
]
[[package]]
name = "clap"
version = "4.5.20"
@@ -209,7 +244,7 @@ dependencies = [
"anstream",
"anstyle",
"clap_lex",
"strsim",
"strsim 0.11.1",
]
[[package]]
@@ -282,7 +317,7 @@ dependencies = [
"ident_case",
"proc-macro2",
"quote",
"strsim",
"strsim 0.11.1",
"syn",
]
@@ -297,6 +332,59 @@ dependencies = [
"syn",
]
[[package]]
name = "dbus"
version = "0.9.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b"
dependencies = [
"futures-channel",
"futures-util",
"libc",
"libdbus-sys",
"winapi",
]
[[package]]
name = "dbus-codegen"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a76dc35ce83e4e9fa089b4fabe66c757b27bd504dc2179c97a01b36d3e874fb0"
dependencies = [
"clap 2.34.0",
"dbus",
"xml-rs",
]
[[package]]
name = "dbus-crossroads"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3a4c83437187544ba5142427746835061b330446ca8902eabd70e4afb8f76de0"
dependencies = [
"dbus",
]
[[package]]
name = "dbus-tokio"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "007688d459bc677131c063a3a77fb899526e17b7980f390b69644bdbc41fad13"
dependencies = [
"dbus",
"libc",
"tokio",
]
[[package]]
name = "dbus-tree"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f456e698ae8e54575e19ddb1f9b7bce2298568524f215496b248eb9498b4f508"
dependencies = [
"dbus",
]
[[package]]
name = "deranged"
version = "0.3.11"
@@ -390,9 +478,9 @@ dependencies = [
[[package]]
name = "env_logger"
version = "0.11.5"
version = "0.11.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d"
checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0"
dependencies = [
"anstream",
"anstyle",
@@ -531,6 +619,15 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "hermit-abi"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
dependencies = [
"libc",
]
[[package]]
name = "hermit-abi"
version = "0.3.9"
@@ -708,12 +805,27 @@ dependencies = [
"uuid",
]
[[package]]
name = "kordophoned"
version = "0.1.0"
dependencies = [
"dbus",
"dbus-codegen",
"dbus-crossroads",
"dbus-tokio",
"dbus-tree",
"env_logger",
"kordophone",
"log",
"tokio",
]
[[package]]
name = "kpcli"
version = "0.1.0"
dependencies = [
"anyhow",
"clap",
"clap 4.5.20",
"dotenv",
"kordophone",
"kordophone-db",
@@ -735,6 +847,15 @@ version = "0.2.153"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
[[package]]
name = "libdbus-sys"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06085512b750d640299b79be4bad3d2fa90a9c00b1fd9e1b46364f66f0485c72"
dependencies = [
"pkg-config",
]
[[package]]
name = "libsqlite3-sys"
version = "0.30.1"
@@ -763,9 +884,9 @@ dependencies = [
[[package]]
name = "log"
version = "0.4.22"
version = "0.4.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f"
[[package]]
name = "memchr"
@@ -809,7 +930,7 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec"
dependencies = [
"hermit-abi",
"hermit-abi 0.3.9",
"libc",
"wasi",
"windows-sys",
@@ -1204,6 +1325,12 @@ dependencies = [
"windows-sys",
]
[[package]]
name = "strsim"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
[[package]]
name = "strsim"
version = "0.11.1"
@@ -1242,6 +1369,15 @@ dependencies = [
"winapi-util",
]
[[package]]
name = "textwrap"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
dependencies = [
"unicode-width",
]
[[package]]
name = "time"
version = "0.3.37"
@@ -1443,6 +1579,12 @@ version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]]
name = "vec_map"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
[[package]]
name = "want"
version = "0.3.1"
@@ -1513,6 +1655,22 @@ version = "0.2.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d"
[[package]]
name = "winapi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
dependencies = [
"winapi-i686-pc-windows-gnu",
"winapi-x86_64-pc-windows-gnu",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
version = "0.1.9"
@@ -1522,6 +1680,12 @@ dependencies = [
"windows-sys",
]
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows-core"
version = "0.52.0"
@@ -1662,3 +1826,9 @@ checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b"
dependencies = [
"memchr",
]
[[package]]
name = "xml-rs"
version = "0.8.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4"

View File

@@ -2,6 +2,7 @@
members = [
"kordophone",
"kordophone-db",
"kordophoned",
"kpcli"
]
resolver = "2"

18
kordophoned/Cargo.toml Normal file
View File

@@ -0,0 +1,18 @@
[package]
name = "kordophoned"
version = "0.1.0"
edition = "2021"
[dependencies]
dbus = "0.9.7"
dbus-crossroads = "0.5.2"
dbus-tokio = "0.7.6"
dbus-tree = "0.9.2"
env_logger = "0.11.6"
kordophone = { path = "../kordophone" }
log = "0.4.25"
tokio = { version = "1", features = ["full"] }
[build-dependencies]
dbus-codegen = "0.10.0"
dbus-crossroads = "0.5.1"

24
kordophoned/build.rs Normal file
View File

@@ -0,0 +1,24 @@
const KORDOPHONE_XML: &str = "include/net.buzzert.kordophonecd.Server.xml";
fn main() {
let out_dir = std::env::var("OUT_DIR").unwrap();
let out_path = std::path::Path::new(&out_dir).join("kordophone-server.rs");
let opts = dbus_codegen::GenOpts {
connectiontype: dbus_codegen::ConnectionType::Nonblock,
methodtype: None, // Set to None for crossroads
crossroads: true,
..Default::default()
};
let xml = std::fs::read_to_string(KORDOPHONE_XML)
.expect("Error reading server dbus interface");
let output = dbus_codegen::generate(&xml, &opts)
.expect("Error generating server dbus interface");
std::fs::write(out_path, output)
.expect("Error writing server dbus code");
println!("cargo:rerun-if-changed={}", KORDOPHONE_XML);
}

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<node name="/">
<interface name="net.buzzert.kordophone.Server">
<method name="GetVersion">
<arg type="s" name="version" direction="out" />
</method>
</interface>
</node>

View File

@@ -0,0 +1,11 @@
use std::sync::Arc;
pub struct Daemon {
pub version: String,
}
impl Daemon {
pub fn new() -> Self {
Self { version: "0.1.0".to_string() }
}
}

View File

@@ -0,0 +1,93 @@
use crate::{dbus::interface::OBJECT_PATH, daemon::Daemon};
use crossroads::Crossroads;
use dbus::{
channel::{MatchingReceiver, Sender},
message::MatchRule,
nonblock::SyncConnection,
Path,
};
use dbus_crossroads as crossroads;
use dbus_tokio::connection;
use dbus_tree::{DataType, MethodErr};
use log::info;
use std::{future::Future, sync::Arc, thread};
mod dbus_interface {
#![allow(unused)]
include!(concat!(env!("OUT_DIR"), "/kordophone-server.rs"));
}
use dbus_interface::NetBuzzertKordophoneServer;
pub struct Endpoint {
connection: Arc<SyncConnection>,
daemon: Arc<Daemon>,
}
impl Endpoint {
pub fn new(daemon: Arc<Daemon>) -> Self {
let (resource, connection) = connection::new_session_sync().unwrap();
// The resource is a task that should be spawned onto a tokio compatible
// reactor ASAP. If the resource ever finishes, you lost connection to D-Bus.
//
// To shut down the connection, both call _handle.abort() and drop the connection.
let _handle = tokio::spawn(async {
let err = resource.await;
panic!("Lost connection to D-Bus: {}", err);
});
Self { connection, daemon }
}
pub async fn start(&self) {
use crate::dbus::interface;
self.connection
.request_name(interface::NAME, false, true, false)
.await
.expect("Unable to acquire dbus name");
let mut cr = Crossroads::new();
// Enable async support for the crossroads instance.
// (Currently irrelevant since dbus generates sync code)
cr.set_async_support(Some((
self.connection.clone(),
Box::new(|x| {
tokio::spawn(x);
}),
)));
// Register the daemon as a D-Bus object.
let token = dbus_interface::register_net_buzzert_kordophone_server(&mut cr);
cr.insert(OBJECT_PATH, &[token], self.daemon.clone());
// Start receiving messages.
self.connection.start_receive(
MatchRule::new_method_call(),
Box::new(move |msg, conn|
cr.handle_message(msg, conn).is_ok()
),
);
info!(target: "dbus", "DBus server started");
}
pub fn send_signal<S>(&self, signal: S) -> Result<u32, ()>
where
S: dbus::message::SignalArgs + dbus::arg::AppendAll,
{
let message = signal.to_emit_message(&Path::new(OBJECT_PATH).unwrap());
self.connection.send(message)
}
}
impl NetBuzzertKordophoneServer for Arc<Daemon> {
fn get_version(&mut self) -> Result<String, MethodErr> {
Ok(self.version.clone())
}
}

View File

@@ -0,0 +1,6 @@
pub mod endpoint;
pub mod interface {
pub static NAME: &str = "net.buzzert.kordophonecd";
pub static OBJECT_PATH: &str = "/net/buzzert/kordophone/Server";
}

24
kordophoned/src/main.rs Normal file
View File

@@ -0,0 +1,24 @@
mod dbus;
mod daemon;
use std::future;
use std::sync::Arc;
use log::LevelFilter;
fn initialize_logging() {
env_logger::Builder::from_default_env()
.filter_level(LevelFilter::Info)
.format_timestamp_secs()
.init();
}
#[tokio::main]
async fn main() {
initialize_logging();
let daemon = Arc::new(daemon::Daemon::new());
let endpoint = Arc::new(dbus::endpoint::Endpoint::new(daemon));
endpoint.start().await;
future::pending::<()>().await;
unreachable!()
}