|
@@ -0,0 +1,102 @@
|
|
|
+#[cfg(target_os = "linux")]
|
|
|
+fn main() {
|
|
|
+ use pico_args::Arguments;
|
|
|
+ use std::{
|
|
|
+ fs::{self, Permissions},
|
|
|
+ os::unix::fs::PermissionsExt,
|
|
|
+ path::PathBuf,
|
|
|
+ process::{self, Command},
|
|
|
+ };
|
|
|
+
|
|
|
+ // Find output folder from command line arguments
|
|
|
+ let mut args = Arguments::from_env();
|
|
|
+ let name: String = match args.value_from_str("--name") {
|
|
|
+ Ok(Some(name)) => {
|
|
|
+ println!("output directory is: dumps/{}", name);
|
|
|
+ name
|
|
|
+ }
|
|
|
+ _ => {
|
|
|
+ eprintln!(
|
|
|
+ "usage: acpi-dumper --name [NAME]\n\
|
|
|
+ the acpi tables will be dumped to the dumps/[name] directory"
|
|
|
+ );
|
|
|
+ process::exit(-1);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // Check lshw is installed
|
|
|
+ match Command::new("lshw").arg("-version").output() {
|
|
|
+ Ok(output) => {
|
|
|
+ println!(
|
|
|
+ "found lshw version: {}",
|
|
|
+ String::from_utf8(output.stderr)
|
|
|
+ .expect("lshw returned invalid utf-8")
|
|
|
+ .rsplit_terminator(' ')
|
|
|
+ .next()
|
|
|
+ .unwrap_or("unknown")
|
|
|
+ .trim_end()
|
|
|
+ );
|
|
|
+ }
|
|
|
+ Err(e) => {
|
|
|
+ eprintln!("error: lshw failed to execute ({}) - please check that it is installed", e);
|
|
|
+ process::exit(-1);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ if unsafe { libc::geteuid() } != 0 {
|
|
|
+ eprintln!("error: please re-run with root privileges");
|
|
|
+ process::exit(-1);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Create output folder
|
|
|
+ let mut out_path = PathBuf::from("./dumps");
|
|
|
+ out_path.push(name);
|
|
|
+ fs::create_dir(&out_path).expect("failed to create output directory");
|
|
|
+ fs::set_permissions(&out_path, Permissions::from_mode(0o777))
|
|
|
+ .expect("failed to set permissions for output directory");
|
|
|
+
|
|
|
+ println!("dumping acpi tables...");
|
|
|
+
|
|
|
+ // Loop over the ACPI tables, dump their contents
|
|
|
+ for file in fs::read_dir("/sys/firmware/acpi/tables")
|
|
|
+ .expect("failed to access acpi tables, check permissions")
|
|
|
+ .filter_map(|entry| entry.ok()) // Ignore failures
|
|
|
+ .filter(|entry| entry.metadata().unwrap().is_file())
|
|
|
+ {
|
|
|
+ let table_signature = file.file_name().into_string().expect("invalid utf-8 file name in acpi tables");
|
|
|
+
|
|
|
+ // All tables have a 4 letter signature (apart from SSDTs)
|
|
|
+ if table_signature.len() == 4 || &table_signature[..4] != "SSDT" {
|
|
|
+ // Read table
|
|
|
+ let data = fs::read(file.path()).expect("failed to read acpi table");
|
|
|
+ out_path.push(table_signature + ".bin");
|
|
|
+
|
|
|
+ // Dump table to disk
|
|
|
+ fs::write(&out_path, data).expect("failed to write acpi table");
|
|
|
+
|
|
|
+ // Allow anyone to read or write the file
|
|
|
+ fs::set_permissions(&out_path, Permissions::from_mode(0o666))
|
|
|
+ .expect("failed to set permissions of dumped acpi table");
|
|
|
+ out_path.pop();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ println!("done!");
|
|
|
+
|
|
|
+ println!("capturing lshw output...");
|
|
|
+ let lshw_info = Command::new("lshw").output().expect("failed to get hardware information from lshw");
|
|
|
+
|
|
|
+ // Write lshw output to disk
|
|
|
+ let lshw_info = String::from_utf8(lshw_info.stdout).expect("lshw returned invalid utf-8");
|
|
|
+ out_path.push("lshw.txt");
|
|
|
+ fs::write(&out_path, lshw_info).expect("failed to write lshw dump");
|
|
|
+ fs::set_permissions(&out_path, Permissions::from_mode(0o666))
|
|
|
+ .expect("failed to set permissions of dumped acpi table");
|
|
|
+ out_path.pop();
|
|
|
+ println!("done!");
|
|
|
+}
|
|
|
+
|
|
|
+#[cfg(not(target_os = "linux"))]
|
|
|
+fn main() {
|
|
|
+ std::compilation_error!("acpi-dumper currently only supports linux");
|
|
|
+}
|