From a0068579b45b418bac369eaf09b13794ef88dd37 Mon Sep 17 00:00:00 2001 From: lukas-heiligenbrunner Date: Mon, 5 Dec 2022 23:18:32 +0100 Subject: [PATCH] add lsblk parser --- src/main.rs | 8 ++++- src/parser/lsblk_parser.rs | 66 ++++++++++++++++++++++++++++++++++++++ src/parser/mod.rs | 3 +- 3 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 src/parser/lsblk_parser.rs diff --git a/src/main.rs b/src/main.rs index f6d782f..10e1f3c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,6 +4,7 @@ mod parser; extern crate rocket; use rocket::serde::json::Json; +use crate::parser::lsblk_parser::{Disk, parse_lsblk}; use crate::parser::mdstat_parser::{MdRaidSystem, parse_mdstat}; #[get("/raiddevices")] @@ -11,11 +12,16 @@ fn get_raid_devices() -> Json { Json(parse_mdstat()) } +#[get("/disks")] +fn get_disks() -> Json> { + Json(parse_lsblk()) +} + #[rocket::main] async fn main() -> Result<(), rocket::Error> { println!("init"); let _rocket = rocket::build() - .mount("/api", routes![get_raid_devices]) + .mount("/api", routes![get_raid_devices, get_disks]) .launch() .await?; diff --git a/src/parser/lsblk_parser.rs b/src/parser/lsblk_parser.rs new file mode 100644 index 0000000..5cd20e5 --- /dev/null +++ b/src/parser/lsblk_parser.rs @@ -0,0 +1,66 @@ +use std::process::Command; +use rocket::serde::json::{serde_json}; +use rocket::serde::{Serialize, Deserialize}; + +#[derive(Serialize)] +#[serde(crate = "rocket::serde")] +pub struct Disk { + name: String, + size: u64, +} + +#[derive(Serialize, Deserialize)] +#[serde(crate = "rocket::serde")] +struct ChildDevice { + name: String, + #[serde(rename = "maj:min")] + majmin: String, + rm: bool, + size: u64, + ro: bool, + #[serde(rename = "type")] + kind: String, + mountpoints: Vec>, +} + +#[derive(Serialize, Deserialize)] +#[serde(crate = "rocket::serde")] +struct Blockdevice { + name: String, + #[serde(rename = "type")] + kind: String, + size: u64, + #[serde(rename = "maj:min")] + majmin: String, + rm: bool, + ro: bool, + mountpoints: Vec>, + children: Option>, +} + +#[derive(Serialize, Deserialize)] +#[serde(crate = "rocket::serde")] +struct LsblkT { + blockdevices: Vec, +} + +pub fn parse_lsblk() -> Vec { + let output = Command::new("lsblk") + .arg("-J") + .arg("-b")// sizes in bytes + .arg("-p") // complete device path + .output() + .expect("failed to execute process"); + + let out = output.stdout; + let out = String::from_utf8(out).unwrap(); + + let v: LsblkT = serde_json::from_str(out.as_str()).unwrap(); + + let mut disks: Vec = Vec::new(); + for d in v.blockdevices { + if d.kind != "disk" { continue; }; + disks.push(Disk { name: d.name, size: d.size }); + } + disks +} \ No newline at end of file diff --git a/src/parser/mod.rs b/src/parser/mod.rs index c9559f7..31db31b 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -1 +1,2 @@ -pub mod mdstat_parser; \ No newline at end of file +pub mod mdstat_parser; +pub mod lsblk_parser; \ No newline at end of file