mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-31 04:23:40 +00:00
* start consolidating * add start-cli flash-os * combine install and setup and refactor all * use http * undo mock * fix translation * translations * use dialogservice wrapper * better ST messaging on setup * only warn on update if breakages (#3097) * finish setup wizard and ui language-keyboard feature * fix typo * wip: localization * remove start-tunnel readme * switch to posix strings for language internal * revert mock * translate backend strings * fix missing about text * help text for args * feat: add "Add new gateway" option (#3098) * feat: add "Add new gateway" option * Update web/projects/ui/src/app/routes/portal/components/form/controls/select.component.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * add translation --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Matt Hill <mattnine@protonmail.com> * fix dns selection * keyboard keymap also * ability to shutdown after install * revert mock * working setup flow + manifest localization * (mostly) redundant localization on frontend * version bump * omit live medium from disk list and better space management * ignore missing package archive on 035 migration * fix device migration * add i18n helper to sdk * fix install over 0.3.5.1 * fix grub config --------- Co-authored-by: Matt Hill <mattnine@protonmail.com> Co-authored-by: Matt Hill <MattDHill@users.noreply.github.com> Co-authored-by: Alex Inkin <alexander@inkin.ru> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
98 lines
2.8 KiB
Rust
98 lines
2.8 KiB
Rust
use std::collections::BTreeSet;
|
|
|
|
use imbl_value::InternedString;
|
|
use serde::{Deserialize, Serialize};
|
|
use tokio::process::Command;
|
|
use ts_rs::TS;
|
|
|
|
use crate::prelude::*;
|
|
use crate::util::Invoke;
|
|
|
|
const KNOWN_CLASSES: &[&str] = &["processor", "display"];
|
|
|
|
#[derive(Clone, Debug, Deserialize, Serialize, TS)]
|
|
#[serde(tag = "class")]
|
|
#[serde(rename_all = "camelCase")]
|
|
#[ts(export)]
|
|
pub enum LshwDevice {
|
|
Processor(LshwProcessor),
|
|
Display(LshwDisplay),
|
|
}
|
|
impl LshwDevice {
|
|
pub fn class(&self) -> &'static str {
|
|
match self {
|
|
Self::Processor(_) => "processor",
|
|
Self::Display(_) => "display",
|
|
}
|
|
}
|
|
#[instrument(skip_all)]
|
|
pub fn from_value(value: &Value) -> Option<Self> {
|
|
match value["class"].as_str() {
|
|
Some("processor") => Some(LshwDevice::Processor(LshwProcessor::from_value(value))),
|
|
Some("display") => Some(LshwDevice::Display(LshwDisplay::from_value(value))),
|
|
_ => None,
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, Debug, Deserialize, Serialize, TS)]
|
|
pub struct LshwProcessor {
|
|
pub product: Option<InternedString>,
|
|
pub vendor: Option<InternedString>,
|
|
pub capabilities: BTreeSet<InternedString>,
|
|
}
|
|
impl LshwProcessor {
|
|
#[instrument(skip_all)]
|
|
fn from_value(value: &Value) -> Self {
|
|
Self {
|
|
product: value["product"].as_str().map(From::from),
|
|
vendor: value["vendor"].as_str().map(From::from),
|
|
capabilities: value["capabilities"]
|
|
.as_object()
|
|
.into_iter()
|
|
.flat_map(|o| o.keys())
|
|
.map(|k| k.clone())
|
|
.collect(),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, Debug, Deserialize, Serialize, TS)]
|
|
pub struct LshwDisplay {
|
|
pub product: Option<InternedString>,
|
|
pub vendor: Option<InternedString>,
|
|
pub capabilities: BTreeSet<InternedString>,
|
|
pub driver: Option<InternedString>,
|
|
}
|
|
impl LshwDisplay {
|
|
#[instrument(skip_all)]
|
|
fn from_value(value: &Value) -> Self {
|
|
Self {
|
|
product: value["product"].as_str().map(From::from),
|
|
vendor: value["vendor"].as_str().map(From::from),
|
|
capabilities: value["capabilities"]
|
|
.as_object()
|
|
.into_iter()
|
|
.flat_map(|o| o.keys())
|
|
.map(|k| k.clone())
|
|
.collect(),
|
|
driver: value["configuration"]["driver"].as_str().map(From::from),
|
|
}
|
|
}
|
|
}
|
|
|
|
pub async fn lshw() -> Result<Vec<LshwDevice>, Error> {
|
|
let mut cmd = Command::new("lshw");
|
|
cmd.arg("-json");
|
|
for class in KNOWN_CLASSES {
|
|
cmd.arg("-class").arg(*class);
|
|
}
|
|
Ok(
|
|
serde_json::from_slice::<Vec<Value>>(&cmd.invoke(crate::ErrorKind::Lshw).await?)
|
|
.with_kind(crate::ErrorKind::Deserialization)?
|
|
.iter()
|
|
.filter_map(LshwDevice::from_value)
|
|
.collect(),
|
|
)
|
|
}
|