This commit is contained in:
Ilya Zlobintsev
2023-01-01 21:15:30 +02:00
parent 67957a4673
commit 5fe5f2e03e
4 changed files with 249 additions and 0 deletions

154
Cargo.lock generated
View File

@@ -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"

9
lact-cli/Cargo.toml Normal file
View File

@@ -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"] }

35
lact-cli/src/args.rs Normal file
View File

@@ -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<String>,
#[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<String> {
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()
}
}
}
}

51
lact-cli/src/main.rs Normal file
View File

@@ -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(())
}