repbuild r uses udisks

This commit is contained in:
Erin 2022-12-03 17:47:10 +01:00 committed by ondra05
parent 78a52f7102
commit 403e410797

View file

@ -11,7 +11,10 @@ use std::{
os::fd::AsRawFd, os::fd::AsRawFd,
process::Command, process::Command,
}; };
use udisks::{filesystem::UnMountOptions, manager::LoopSetupOptions}; use udisks::{
filesystem::{MountOptions, UnMountOptions},
manager::LoopSetupOptions,
};
struct Options { struct Options {
pub subcommand: Subcommand, pub subcommand: Subcommand,
@ -257,40 +260,52 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
// Setup loopback device for disk.img, with partitions // Setup loopback device for disk.img, with partitions
// FIXME: don't do ths if running without changes // FIXME: don't do ths if running without changes
Command::new("sudo") // Setup loop device
.arg("losetup") let disk_img = File::options().read(true).write(true).open("disk.img")?;
.args(["-P", "/dev/loop0", "disk.img"]) let dbus_conn = zbus::blocking::Connection::system()?;
.status() let loopdev = udisks::manager::UDisks2ManagerProxyBlocking::new(&dbus_conn)?
.unwrap(); .loop_setup(
disk_img.as_raw_fd().into(),
LoopSetupOptions {
no_user_interaction: true,
offset: 0,
size: 0,
readonly: false,
no_part_scan: false,
},
)?;
// mount the root fs to ./disk let parts = udisks::partition::PartitionTableProxyBlocking::builder(&dbus_conn)
Command::new("sudo") .destination("org.freedesktop.UDisks2")?
.arg("mount") .path(loopdev)?
.args(["/dev/loop0p1", "./disk"]) .build()?
.status() .partitions()?;
.unwrap();
let fsobjpath = parts.get(0).ok_or("missing boot partition")?;
let mountpoint =
udisks::filesystem::FilesystemProxyBlocking::builder(&dbus_conn)
.path(fsobjpath)?
.build()?
.mount(MountOptions {
no_user_interaction: true,
fs_type: String::new(),
mount_options: String::new(),
})?;
// copy the kernel over to ./disk/boot/kernel // copy the kernel over to ./disk/boot/kernel
Command::new("sudo") Command::new("cp")
.arg("cp")
.arg("./target/x86_64-ableos/debug/ableos") .arg("./target/x86_64-ableos/debug/ableos")
.arg("./disk/boot/kernel") .arg(format!("{mountpoint}/boot/kernel"))
.status() .status()
.unwrap(); .unwrap();
// unmount the root fs udisks::filesystem::FilesystemProxyBlocking::builder(&dbus_conn)
Command::new("sudo") .path(fsobjpath)?
.arg("umount") .build()?
.arg("./disk") .unmount(UnMountOptions {
.status() no_user_interaction: true,
.unwrap(); force: false,
})?;
// remove loopback device
Command::new("sudo")
.arg("losetup")
.args(["-d", "/dev/loop0"])
.status()
.unwrap();
// run qemu with "-S", "-gdb", "tcp:9000" // run qemu with "-S", "-gdb", "tcp:9000"
Command::new("qemu-system-x86_64") Command::new("qemu-system-x86_64")
@ -324,40 +339,48 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
// Setup loopback device for disk.img, with partitions // Setup loopback device for disk.img, with partitions
// FIXME: don't do ths if running without changes // FIXME: don't do ths if running without changes
Command::new("sudo") let disk_img = File::options().read(true).write(true).open("disk.img")?;
.arg("losetup") let dbus_conn = zbus::blocking::Connection::system()?;
.args(["-P", "/dev/loop0", "disk.img"]) let loopdev = udisks::manager::UDisks2ManagerProxyBlocking::new(&dbus_conn)?
.status() .loop_setup(
.unwrap(); disk_img.as_raw_fd().into(),
LoopSetupOptions {
no_user_interaction: true,
offset: 0,
size: 0,
readonly: false,
no_part_scan: false,
},
)?;
// mount the root fs to ./disk let parts = udisks::partition::PartitionTableProxyBlocking::builder(&dbus_conn)
Command::new("sudo") .destination("org.freedesktop.UDisks2")?
.arg("mount") .path(loopdev)?
.args(["/dev/loop0p1", "./disk"]) .build()?
.status() .partitions()?;
.unwrap();
let fsproxy = udisks::filesystem::FilesystemProxyBlocking::builder(&dbus_conn)
.path(&parts[0])?
.build()?;
// Obtain mountpoint
let mountpoint = loop {
if let Some(m) = fsproxy.mount_points()?.get(0) {
break m.to_string();
}
};
// copy the kernel over to ./disk/boot/kernel // copy the kernel over to ./disk/boot/kernel
Command::new("sudo") Command::new("cp")
.arg("cp")
.arg("./target/x86_64-ableos/release/ableos") .arg("./target/x86_64-ableos/release/ableos")
.arg("./disk/boot/kernel") .arg(format!("{mountpoint}/boot/kernel"))
.status() .status()
.unwrap(); .unwrap();
// unmount the root fs fsproxy.unmount(UnMountOptions {
Command::new("sudo") no_user_interaction: true,
.arg("umount") force: false,
.arg("./disk") })?;
.status()
.unwrap();
// remove loopback device
Command::new("sudo")
.arg("losetup")
.args(["-d", "/dev/loop0"])
.status()
.unwrap();
// run qemu // run qemu
Command::new("qemu-system-x86_64") Command::new("qemu-system-x86_64")