|
1 | 1 | //! Retrieve SMBIOS tables and extract information from them
|
2 | 2 |
|
| 3 | +use core::str::FromStr; |
3 | 4 | use std::prelude::v1::*;
|
4 | 5 |
|
5 | 6 | #[cfg(all(not(feature = "uefi"), not(target_os = "freebsd")))]
|
6 | 7 | use std::io::ErrorKind;
|
7 | 8 |
|
| 9 | +use crate::serialnum::FrameworkSerial; |
8 | 10 | use crate::util::{Config, Platform};
|
9 | 11 | use num_derive::FromPrimitive;
|
10 | 12 | use smbioslib::*;
|
@@ -303,3 +305,107 @@ fn kenv_get(name: &str) -> nix::Result<String> {
|
303 | 305 | Ok(value)
|
304 | 306 | }
|
305 | 307 | }
|
| 308 | + |
| 309 | +#[derive(Debug)] |
| 310 | +enum SmbiosSerialNumber { |
| 311 | + Mainboard = 1, |
| 312 | + Laptop, |
| 313 | + Camera, |
| 314 | + Display, |
| 315 | + Battery, |
| 316 | + Touchpad, |
| 317 | + Keyboard, |
| 318 | + Fingerprint, |
| 319 | + AudioDaughtercard, |
| 320 | + ACover, |
| 321 | + BCover, |
| 322 | + CCover, |
| 323 | + AntennaMain, |
| 324 | + AntennaAux, |
| 325 | + TouchpadFpc, |
| 326 | + FingerprintFfc, |
| 327 | + EdpCable, |
| 328 | + LcdCable, |
| 329 | + ThermalAssembly, |
| 330 | + WifiModule, |
| 331 | + Speaker, |
| 332 | + RamSlot1, |
| 333 | + RamSlot2, |
| 334 | + Ssd, |
| 335 | + AudioFfc, |
| 336 | +} |
| 337 | + |
| 338 | +pub fn dump_oem_strings(strings: &SMBiosStringSet) { |
| 339 | + for (i, s) in strings.into_iter().enumerate() { |
| 340 | + let idx = i + 1; |
| 341 | + let sn = match idx { |
| 342 | + 1 => Some(SmbiosSerialNumber::Mainboard), |
| 343 | + 2 => Some(SmbiosSerialNumber::Laptop), |
| 344 | + 3 => Some(SmbiosSerialNumber::Camera), |
| 345 | + 4 => Some(SmbiosSerialNumber::Display), |
| 346 | + 5 => Some(SmbiosSerialNumber::Battery), |
| 347 | + 6 => Some(SmbiosSerialNumber::Touchpad), |
| 348 | + 7 => Some(SmbiosSerialNumber::Keyboard), |
| 349 | + 8 => Some(SmbiosSerialNumber::Fingerprint), |
| 350 | + 10 => Some(SmbiosSerialNumber::AudioDaughtercard), |
| 351 | + 11 => Some(SmbiosSerialNumber::ACover), |
| 352 | + 12 => Some(SmbiosSerialNumber::BCover), |
| 353 | + 13 => Some(SmbiosSerialNumber::CCover), |
| 354 | + 14 => Some(SmbiosSerialNumber::AntennaMain), |
| 355 | + 15 => Some(SmbiosSerialNumber::AntennaAux), |
| 356 | + 16 => Some(SmbiosSerialNumber::TouchpadFpc), |
| 357 | + 17 => Some(SmbiosSerialNumber::FingerprintFfc), |
| 358 | + 18 => Some(SmbiosSerialNumber::EdpCable), |
| 359 | + 19 => Some(SmbiosSerialNumber::LcdCable), |
| 360 | + 20 => Some(SmbiosSerialNumber::ThermalAssembly), |
| 361 | + 21 => Some(SmbiosSerialNumber::WifiModule), |
| 362 | + 22 => Some(SmbiosSerialNumber::Speaker), |
| 363 | + 23 => Some(SmbiosSerialNumber::RamSlot1), |
| 364 | + 24 => Some(SmbiosSerialNumber::RamSlot2), |
| 365 | + 25 => Some(SmbiosSerialNumber::Ssd), |
| 366 | + 26 => Some(SmbiosSerialNumber::AudioFfc), |
| 367 | + _ => None, |
| 368 | + }; |
| 369 | + match sn { |
| 370 | + Some(SmbiosSerialNumber::RamSlot1) |
| 371 | + | Some(SmbiosSerialNumber::RamSlot2) |
| 372 | + | Some(SmbiosSerialNumber::Ssd) |
| 373 | + | Some(SmbiosSerialNumber::WifiModule) => { |
| 374 | + println!("{} {:<20} (Unused)", s, format!("{:?}", sn.unwrap())) |
| 375 | + } |
| 376 | + Some(SmbiosSerialNumber::Fingerprint) | Some(SmbiosSerialNumber::CCover) => { |
| 377 | + println!("{}", s); |
| 378 | + println!(" {:<20} (Only Pre-Built)", format!("{:?}", sn.unwrap())); |
| 379 | + if let Ok(serial) = FrameworkSerial::from_str(&format!("{:?}", s)) { |
| 380 | + println!( |
| 381 | + " {} (Config {}) by {}, {:>4} Phase ({:?}, Week {}, {})", |
| 382 | + serial.product, |
| 383 | + serial.cfg1, |
| 384 | + serial.oem, |
| 385 | + format!("{:?}", serial.cfg0), |
| 386 | + serial.day, |
| 387 | + serial.week, |
| 388 | + serial.year, |
| 389 | + ); |
| 390 | + } |
| 391 | + } |
| 392 | + Some(sn) => { |
| 393 | + println!("{}", s); |
| 394 | + println!(" {:?}", sn); |
| 395 | + if let Ok(serial) = FrameworkSerial::from_str(&format!("{:?}", s)) { |
| 396 | + println!( |
| 397 | + " {} (Config {}) by {}, {:>4} Phase ({:?}, Week {}, {})", |
| 398 | + serial.product, |
| 399 | + serial.cfg1, |
| 400 | + serial.oem, |
| 401 | + format!("{:?}", serial.cfg0), |
| 402 | + serial.day, |
| 403 | + serial.week, |
| 404 | + serial.year, |
| 405 | + ); |
| 406 | + } |
| 407 | + } |
| 408 | + _ => println!("{} Unknown/Reserved", s), |
| 409 | + } |
| 410 | + } |
| 411 | +} |
0 commit comments