diff --git a/Cargo.lock b/Cargo.lock index 53dd676..37b95e8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -142,6 +142,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "cc" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" + [[package]] name = "cfg-expr" version = "0.11.0" @@ -157,6 +163,43 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "clap" +version = "4.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7db700bc935f9e43e88d00b0850dae18a63773cfbec6d8e070fccf7fef89a39" +dependencies = [ + "bitflags", + "clap_derive", + "clap_lex", + "is-terminal", + "once_cell", + "strsim", + "termcolor", +] + +[[package]] +name = "clap_derive" +version = "4.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0177313f9f02afc995627906bbd8967e2be069f5261954222dac78290c2b9014" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8" +dependencies = [ + "os_str_bytes", +] + [[package]] name = "core-foundation" version = "0.9.3" @@ -222,6 +265,27 @@ dependencies = [ "syn", ] +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "field-offset" version = "0.3.4" @@ -547,6 +611,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + [[package]] name = "indexmap" version = "1.9.2" @@ -558,12 +631,43 @@ dependencies = [ "serde", ] +[[package]] +name = "io-lifetimes" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46112a93252b123d31a119a8d1a1ac19deac4fac6e0e8b0df58f0d4e5870e63c" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "is-terminal" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189" +dependencies = [ + "hermit-abi", + "io-lifetimes", + "rustix", + "windows-sys", +] + [[package]] name = "itoa" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" +[[package]] +name = "lact-cli" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "lact-client", +] + [[package]] name = "lact-client" version = "0.1.0" @@ -641,6 +745,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "linux-raw-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + [[package]] name = "lock_api" version = "0.4.9" @@ -753,6 +863,12 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" +[[package]] +name = "os_str_bytes" +version = "6.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" + [[package]] name = "overload" version = "0.1.1" @@ -943,6 +1059,20 @@ dependencies = [ "semver", ] +[[package]] +name = "rustix" +version = "0.36.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4feacf7db682c6c329c4ede12649cd36ecab0f3be5b7d74e6a20304725db4549" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys", +] + [[package]] name = "ryu" version = "1.0.12" @@ -1066,6 +1196,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "syn" version = "1.0.107" @@ -1090,6 +1226,15 @@ dependencies = [ "version-compare", ] +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" version = "1.0.38" @@ -1325,6 +1470,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/lact-cli/Cargo.toml b/lact-cli/Cargo.toml new file mode 100644 index 0000000..cd5f303 --- /dev/null +++ b/lact-cli/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "lact-cli" +version = "0.1.0" +edition = "2021" + +[dependencies] +lact-client = { path = "../lact-client" } +anyhow = "1.0.68" +clap = { version = "4.0.32", features = ["derive"] } diff --git a/lact-cli/src/args.rs b/lact-cli/src/args.rs new file mode 100644 index 0000000..9ff3605 --- /dev/null +++ b/lact-cli/src/args.rs @@ -0,0 +1,35 @@ +use clap::{Parser, Subcommand}; +use lact_client::DaemonClient; + +#[derive(Parser)] +#[command(author, version, about)] +pub struct Args { + pub gpu_id: Option, + #[command(subcommand)] + pub subcommand: Command, +} + +#[derive(Subcommand)] +pub enum Command { + /// List GPUs + ListGpus, + /// Show GPU info + Info, +} + +impl Args { + pub fn gpu_ids(&self, client: &DaemonClient) -> Vec { + match self.gpu_id { + Some(ref id) => vec![id.clone()], + None => { + let buffer = client.list_devices().expect("Could not list GPUs"); + buffer + .inner() + .expect("Could not deserialize GPUs response") + .into_iter() + .map(|entry| entry.id.to_owned()) + .collect() + } + } + } +} diff --git a/lact-cli/src/main.rs b/lact-cli/src/main.rs new file mode 100644 index 0000000..0a2f04b --- /dev/null +++ b/lact-cli/src/main.rs @@ -0,0 +1,51 @@ +mod args; + +use anyhow::{Context, Result}; +use args::{Args, Command}; +use clap::Parser; +use lact_client::DaemonClient; + +fn main() -> Result<()> { + let args = Args::parse(); + let client = DaemonClient::connect()?; + + let f = match args.subcommand { + Command::ListGpus => list_gpus, + Command::Info => info, + }; + f(&args, &client) +} + +fn list_gpus(args: &Args, client: &DaemonClient) -> Result<()> { + let buffer = client.list_devices()?; + for entry in buffer.inner()? { + let id = entry.id; + if let Some(name) = entry.name { + println!("{id} ({name})"); + } else { + println!("{id}"); + } + } + Ok(()) +} + +fn info(args: &Args, client: &DaemonClient) -> Result<()> { + for id in args.gpu_ids(&client) { + let info_buffer = client.get_device_info(&id)?; + let info = info_buffer.inner()?; + let pci_info = info.pci_info.context("GPU reports no pci info")?; + + if let Some(ref vendor) = pci_info.device_pci_info.vendor { + println!("GPU Vendor: {vendor}"); + } + if let Some(ref model) = pci_info.device_pci_info.model { + println!("GPU Model: {model}"); + } + println!("Driver in use: {}", info.driver); + if let Some(ref vbios_version) = info.vbios_version { + println!("VBIOS version: {vbios_version}"); + } + println!("Link: {:?}", info.link_info); + } + Ok(()) +}