Compare commits
17 Commits
Author | SHA1 | Date | |
---|---|---|---|
ecad003fc0 | |||
624b50eb8c | |||
fd50d22ad4 | |||
6e2e87c1dc | |||
f2cb66ec29 | |||
0c13a7b258 | |||
201a936b4b | |||
c7e0d01d84 | |||
9fb659f779 | |||
37a086fb67 | |||
77ca11c563 | |||
24b7cb3144 | |||
df3b4c32a9 | |||
9c10606ff0 | |||
b8c492cb62 | |||
4d20bfaaec | |||
9d255103fe |
@ -34,7 +34,7 @@ pipeline:
|
||||
commands:
|
||||
- dpkg --add-architecture armel
|
||||
- apt-get update
|
||||
- apt-get install -y crossbuild-essential-armel libdbus-1-dev:armel --no-install-recommends
|
||||
- apt-get install -y crossbuild-essential-armel libdbus-1-dev:armel libdbus-1-3:armel --no-install-recommends
|
||||
- rustup target add arm-unknown-linux-gnueabi
|
||||
- PKG_CONFIG=arm-linux-gnueabi-pkg-config CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABI_LINKER=arm-linux-gnueabi-gcc cargo build --release --target arm-unknown-linux-gnueabi
|
||||
- mv target/arm-unknown-linux-gnueabi/release/alma alma-arm
|
||||
|
1093
Cargo.lock
generated
1093
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
20
Cargo.toml
20
Cargo.toml
@ -1,20 +1,20 @@
|
||||
[package]
|
||||
name = "alma"
|
||||
version = "0.11.0"
|
||||
version = "0.11.1"
|
||||
authors = ["Roey Darwish Dror, PurpleCow"]
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
which = "4.4"
|
||||
log = "0.4"
|
||||
structopt = "0.3"
|
||||
which = "7.0.3"
|
||||
log = "0.4.27"
|
||||
structopt = "0.3.26"
|
||||
tempfile = "3"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
toml = "0.7"
|
||||
byte-unit = "4.0"
|
||||
nix = "0.26"
|
||||
env_logger = "0.10"
|
||||
toml = "0.8.22"
|
||||
byte-unit = "5.1.6"
|
||||
nix = { version = "0.30.1", features = ["mount"] }
|
||||
env_logger = "0.11.8"
|
||||
pretty_env_logger = "0.5"
|
||||
dialoguer = "0.10"
|
||||
console = "0.15"
|
||||
dialoguer = "0.11"
|
||||
console = "0.15.11"
|
||||
anyhow = "1"
|
||||
|
@ -1,5 +1,6 @@
|
||||
# ALMA - Arch Linux Mobile Appliance
|
||||
|
||||

|
||||
---
|
||||
Almost every live Linux distribution out there is meant for a specific purpose, whether it's data
|
||||
rescue, privacy, penetration testing or anything else. There are some more generic distributions
|
||||
but all of them are based on squashfs, meaning that changes don't persist reboots.
|
||||
@ -33,7 +34,6 @@ date without having to boot it. Encrypting the root partition is as easy as prov
|
||||
- [Similar projects](#similar-projects)
|
||||
- [Useful Resources](#useful-resources)
|
||||
---
|
||||
|
||||
## Installation
|
||||
|
||||
You can either build the project using cargo build or install the `alma-aur` package.
|
||||
|
@ -6,7 +6,7 @@ use structopt::StructOpt;
|
||||
/// Parse size argument as bytes
|
||||
/// e.g. 10GB, 10GiB, etc.
|
||||
fn parse_bytes(src: &str) -> Result<Byte, &'static str> {
|
||||
Byte::from_str(src).map_err(|_| "Invalid image size")
|
||||
Byte::parse_str(src, false).map_err(|_| "Invalid image size")
|
||||
}
|
||||
|
||||
#[derive(StructOpt)]
|
||||
|
10
src/aur.rs
10
src/aur.rs
@ -37,10 +37,10 @@ impl FromStr for AurHelper {
|
||||
install_command: vec![
|
||||
String::from("yay"),
|
||||
String::from("-S"),
|
||||
String::from("--nocleanmenu"),
|
||||
String::from("--nodiffmenu"),
|
||||
String::from("--noeditmenu"),
|
||||
String::from("--noupgrademenu"),
|
||||
String::from("--cleanmenu=false"),
|
||||
String::from("--diffmenu=false"),
|
||||
String::from("--editmenu=false"),
|
||||
String::from(""),
|
||||
String::from("--useask"),
|
||||
String::from("--removemake"),
|
||||
String::from("--norebuild"),
|
||||
@ -49,7 +49,7 @@ impl FromStr for AurHelper {
|
||||
String::from("--answerclean"),
|
||||
String::from("None"),
|
||||
String::from("--mflags"),
|
||||
String::from("--noconfirm"),
|
||||
String::from(""),
|
||||
],
|
||||
}),
|
||||
_ => Err(anyhow!("Error parsing AUR helper string: {}", s)),
|
||||
|
@ -9,8 +9,8 @@ SystemMaxUse=16M
|
||||
|
||||
pub const BASE_PACKAGES: [&str; 9] = [
|
||||
"base",
|
||||
"linux61",
|
||||
"linux61-broadcom-wl",
|
||||
"linux612",
|
||||
"linux612-broadcom-wl",
|
||||
"linux-firmware",
|
||||
"grub",
|
||||
"efibootmgr",
|
||||
|
28
src/main.rs
28
src/main.rs
@ -78,7 +78,7 @@ fn create_image(path: &Path, size: Byte, overwrite: bool) -> anyhow::Result<Loop
|
||||
}
|
||||
let file = options.open(path).context("Error creating the image")?;
|
||||
|
||||
file.set_len(size.get_bytes() as u64)
|
||||
file.set_len(size.as_u64())
|
||||
.context("Error creating the image")?;
|
||||
}
|
||||
|
||||
@ -166,7 +166,7 @@ fn create(command: args::CreateCommand) -> anyhow::Result<()> {
|
||||
|
||||
sgdisk
|
||||
.execute()
|
||||
.args(&[
|
||||
.args([
|
||||
"-Z",
|
||||
"-o",
|
||||
&format!("--new=1::+{}M", boot_size),
|
||||
@ -175,7 +175,7 @@ fn create(command: args::CreateCommand) -> anyhow::Result<()> {
|
||||
"--typecode=1:EF00",
|
||||
"--typecode=2:EF02",
|
||||
])
|
||||
.arg(&disk_path)
|
||||
.arg(disk_path)
|
||||
.run()
|
||||
.context("Partitioning error")?;
|
||||
|
||||
@ -270,14 +270,14 @@ fn create(command: args::CreateCommand) -> anyhow::Result<()> {
|
||||
arch_chroot
|
||||
.execute()
|
||||
.arg(mount_point.path())
|
||||
.args(&["passwd", "-d", "root"])
|
||||
.args(["passwd", "-d", "root"])
|
||||
.run()
|
||||
.context("Failed to delete the root password")?;
|
||||
|
||||
info!("Setting locale");
|
||||
fs::OpenOptions::new()
|
||||
.append(true)
|
||||
.write(true)
|
||||
//.write(true)
|
||||
.open(mount_point.path().join("etc/locale.gen"))
|
||||
.and_then(|mut locale_gen| locale_gen.write_all(b"en_US.UTF-8 UTF-8\n"))
|
||||
.context("Failed to create locale.gen")?;
|
||||
@ -298,7 +298,7 @@ fn create(command: args::CreateCommand) -> anyhow::Result<()> {
|
||||
arch_chroot
|
||||
.execute()
|
||||
.arg(mount_point.path())
|
||||
.args(&["useradd", "-m", "aur"])
|
||||
.args(["useradd", "-m", "aur"])
|
||||
.run()
|
||||
.context("Failed to create temporary user to install AUR packages")?;
|
||||
|
||||
@ -309,7 +309,7 @@ fn create(command: args::CreateCommand) -> anyhow::Result<()> {
|
||||
arch_chroot
|
||||
.execute()
|
||||
.arg(mount_point.path())
|
||||
.args(&["sudo", "-u", "aur"])
|
||||
.args(["sudo", "-u", "aur"])
|
||||
.arg("git")
|
||||
.arg("clone")
|
||||
.arg(format!(
|
||||
@ -323,7 +323,7 @@ fn create(command: args::CreateCommand) -> anyhow::Result<()> {
|
||||
arch_chroot
|
||||
.execute()
|
||||
.arg(mount_point.path())
|
||||
.args(&[
|
||||
.args([
|
||||
"bash",
|
||||
"-c",
|
||||
&format!(
|
||||
@ -337,7 +337,7 @@ fn create(command: args::CreateCommand) -> anyhow::Result<()> {
|
||||
arch_chroot
|
||||
.execute()
|
||||
.arg(mount_point.path())
|
||||
.args(&["sudo", "-u", "aur"])
|
||||
.args(["sudo", "-u", "aur"])
|
||||
.args(&command.aur_helper.install_command)
|
||||
.args(aur_pacakges)
|
||||
.run()
|
||||
@ -347,7 +347,7 @@ fn create(command: args::CreateCommand) -> anyhow::Result<()> {
|
||||
arch_chroot
|
||||
.execute()
|
||||
.arg(mount_point.path())
|
||||
.args(&["userdel", "-r", "aur"])
|
||||
.args(["userdel", "-r", "aur"])
|
||||
.run()
|
||||
.context("Failed to delete temporary aur user")?;
|
||||
|
||||
@ -413,7 +413,7 @@ fn create(command: args::CreateCommand) -> anyhow::Result<()> {
|
||||
arch_chroot
|
||||
.execute()
|
||||
.arg(mount_point.path())
|
||||
.args(&["systemctl", "enable", "NetworkManager"])
|
||||
.args(["systemctl", "enable", "NetworkManager"])
|
||||
.run()
|
||||
.context("Failed to enable NetworkManager")?;
|
||||
|
||||
@ -433,7 +433,7 @@ fn create(command: args::CreateCommand) -> anyhow::Result<()> {
|
||||
arch_chroot
|
||||
.execute()
|
||||
.arg(mount_point.path())
|
||||
.args(&["mkinitcpio", "-p", "linux61"])
|
||||
.args(["mkinitcpio", "-p", "linux612"])
|
||||
.run()
|
||||
.context("Failed to run mkinitcpio - do you have the base and linux packages installed?")?;
|
||||
|
||||
@ -444,7 +444,7 @@ fn create(command: args::CreateCommand) -> anyhow::Result<()> {
|
||||
.expect("No tool for blkid")
|
||||
.execute()
|
||||
.arg(root_partition_base.path())
|
||||
.args(&["-o", "value", "-s", "UUID"])
|
||||
.args(["-o", "value", "-s", "UUID"])
|
||||
.run_text_output()
|
||||
.context("Failed to run blkid")?;
|
||||
let trimmed = uuid.trim();
|
||||
@ -467,7 +467,7 @@ fn create(command: args::CreateCommand) -> anyhow::Result<()> {
|
||||
arch_chroot
|
||||
.execute()
|
||||
.arg(mount_point.path())
|
||||
.args(&["bash", "-c"])
|
||||
.args(["bash", "-c"])
|
||||
.arg(format!("grub-install --target=i386-pc --boot-directory /boot {} && grub-install --target=x86_64-efi --efi-directory /boot --boot-directory /boot --removable && grub-mkconfig -o /boot/grub/grub.cfg", disk_path.display()))
|
||||
.run().context("Failed to install grub")?;
|
||||
|
||||
|
@ -73,7 +73,7 @@ impl<'t, 'o> EncryptedDevice<'t, 'o> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'t, 'o> Drop for EncryptedDevice<'t, 'o> {
|
||||
impl Drop for EncryptedDevice<'_, '_> {
|
||||
fn drop(&mut self) {
|
||||
if self._close().is_err() {
|
||||
warn!("Error closing {}", self.name);
|
||||
@ -81,7 +81,7 @@ impl<'t, 'o> Drop for EncryptedDevice<'t, 'o> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'t, 'o> BlockDevice for EncryptedDevice<'t, 'o> {
|
||||
impl BlockDevice for EncryptedDevice<'_, '_> {
|
||||
fn path(&self) -> &Path {
|
||||
&self.path
|
||||
}
|
||||
|
@ -14,7 +14,7 @@ impl LoopDevice {
|
||||
let losetup = Tool::find("losetup")?;
|
||||
let output = losetup
|
||||
.execute()
|
||||
.args(&["--find", "-P", "--show"])
|
||||
.args(["--find", "-P", "--show"])
|
||||
.arg(file)
|
||||
.output()
|
||||
.context("Error creating the image")?;
|
||||
|
@ -23,7 +23,7 @@ impl<'a> MountStack<'a> {
|
||||
filesystem: &'a Filesystem,
|
||||
target: PathBuf,
|
||||
options: Option<&str>,
|
||||
) -> nix::Result<()> {
|
||||
) -> Result<(), nix::Error> {
|
||||
let source = filesystem.block().path();
|
||||
debug!("Mounting {:?} to {:?}", filesystem, target);
|
||||
mount(
|
||||
@ -42,7 +42,7 @@ impl<'a> MountStack<'a> {
|
||||
source: PathBuf,
|
||||
target: PathBuf,
|
||||
options: Option<&str>,
|
||||
) -> nix::Result<()> {
|
||||
) -> Result<(), nix::Error> {
|
||||
debug!("Mounting {:?} to {:?}", source, target);
|
||||
mount::<_, _, str, _>(
|
||||
Some(&source),
|
||||
@ -78,7 +78,7 @@ impl<'a> MountStack<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Drop for MountStack<'a> {
|
||||
impl Drop for MountStack<'_> {
|
||||
fn drop(&mut self) {
|
||||
self._umount().ok();
|
||||
}
|
||||
|
@ -17,7 +17,7 @@ impl<'a> Partition<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> BlockDevice for Partition<'a> {
|
||||
impl BlockDevice for Partition<'_> {
|
||||
fn path(&self) -> &Path {
|
||||
&self.path
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
use anyhow::Context;
|
||||
use byte_unit::Byte;
|
||||
use byte_unit::{Byte, UnitType};
|
||||
use std::{fmt, fs};
|
||||
|
||||
#[derive(Debug)]
|
||||
@ -17,7 +17,7 @@ impl fmt::Display for Device {
|
||||
"{} {} ({})",
|
||||
self.vendor,
|
||||
self.model,
|
||||
self.size.get_appropriate_unit(true)
|
||||
self.size.get_appropriate_unit(UnitType::Decimal)
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -60,11 +60,11 @@ pub fn get_storage_devices(allow_non_removable: bool) -> anyhow::Result<Vec<Devi
|
||||
vendor: fs::read_to_string(entry.path().join("device/vendor"))
|
||||
.map(trimmed)
|
||||
.context("Error querying storage devices")?,
|
||||
size: Byte::from_bytes(
|
||||
size: Byte::from_u64(
|
||||
fs::read_to_string(entry.path().join("size"))
|
||||
.context("Error querying storage devices")?
|
||||
.trim()
|
||||
.parse::<u128>()
|
||||
.parse::<u64>()
|
||||
.context("Could not parse block size to unsigned integer (u128)")?
|
||||
* 512,
|
||||
),
|
||||
|
@ -73,10 +73,9 @@ impl<'a> StorageDevice<'a> {
|
||||
let name = if self
|
||||
.name
|
||||
.chars()
|
||||
.rev()
|
||||
.next()
|
||||
.next_back()
|
||||
.expect("Storage device name is empty")
|
||||
.is_digit(10)
|
||||
.is_ascii_digit()
|
||||
{
|
||||
format!("{}p{}", self.name, index)
|
||||
} else {
|
||||
@ -93,10 +92,10 @@ impl<'a> StorageDevice<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> BlockDevice for StorageDevice<'a> {
|
||||
impl BlockDevice for StorageDevice<'_> {
|
||||
fn path(&self) -> &Path {
|
||||
&self.path
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Origin for StorageDevice<'a> {}
|
||||
impl Origin for StorageDevice<'_> {}
|
||||
|
@ -12,7 +12,7 @@ pub fn qemu(command: args::QemuCommand) -> anyhow::Result<()> {
|
||||
let qemu = Tool::find("qemu-system-x86_64")?;
|
||||
|
||||
let mut run = qemu.execute();
|
||||
run.args(&[
|
||||
run.args([
|
||||
"-m",
|
||||
"4G",
|
||||
"-netdev",
|
||||
@ -33,7 +33,7 @@ pub fn qemu(command: args::QemuCommand) -> anyhow::Result<()> {
|
||||
|
||||
if PathBuf::from("/dev/kvm").exists() {
|
||||
debug!("KVM is enabled");
|
||||
run.args(&["-enable-kvm", "-cpu", "host"]);
|
||||
run.args(["-enable-kvm", "-cpu", "host"]);
|
||||
}
|
||||
|
||||
let err = run.exec();
|
||||
|
Loading…
x
Reference in New Issue
Block a user