Skip to content

Commit

Permalink
Merge pull request #33 from AOSC-Dev/feat/tmpfs/config
Browse files Browse the repository at this point in the history
Implement #30

Closes #30
  • Loading branch information
xtexx authored Dec 15, 2024
2 parents 432814b + 169775f commit 3f31c53
Show file tree
Hide file tree
Showing 8 changed files with 231 additions and 156 deletions.
64 changes: 41 additions & 23 deletions src/actions/container.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,13 @@ use dialoguer::{theme::ColorfulTheme, Confirm, Input};
use git2::Repository;
use nix::unistd::sync;
use rand::random;
use std::{
ffi::OsStr,
fs,
path::{Path, PathBuf},
};
use std::{collections::HashMap, ffi::OsStr, fs, path::Path};

use crate::{
actions::{ensure_host_sanity, OMA_UPDATE_SCRIPT},
actions::OMA_UPDATE_SCRIPT,
common::*,
config, error, info,
config::{self, InstanceConfig},
error, info,
machine::{self, get_container_ns_name, inspect_instance, spawn_container},
network::download_file_progress,
overlayfs, warn,
Expand Down Expand Up @@ -159,33 +156,25 @@ pub fn load_os(url: &str, sha256: Option<String>, tarball: bool) -> Result<()> {
pub fn config_os(instance: Option<&str>) -> Result<()> {
let config;
let mut prev_volatile = None;
if let Ok(c) = config::read_config() {
if let Ok(c) = config::workspace_config() {
prev_volatile = Some(c.volatile_mount);
config = config::ask_for_config(Some(c));
} else {
config = config::ask_for_config(None);
}
let path;
if let Some(instance) = instance {
let man = &mut *overlayfs::get_overlayfs_manager(instance)?;
path = man.get_config_layer()?;
} else {
path = PathBuf::from(CIEL_DIST_DIR);
}
if let Ok(c) = config {
info!("Shutting down instance(s) before applying config...");
info!("Shutting down instance(s) before saving config...");
if let Some(instance) = instance {
container_down(instance)?;
} else {
for_each_instance(&container_down)?;
}
config::apply_config(path, &c)?;
fs::create_dir_all(CIEL_DATA_DIR)?;
fs::write(
Path::new(CIEL_DATA_DIR).join("config.toml"),
c.save_config()?,
)?;
info!("Configurations applied.");
info!("Configurations saved.");
let volatile_changed = if let Some(prev_voltile) = prev_volatile {
prev_voltile != c.volatile_mount
} else {
Expand All @@ -208,9 +197,15 @@ pub fn config_os(instance: Option<&str>) -> Result<()> {

/// Mount the filesystem of the instance
pub fn mount_fs(instance: &str) -> Result<()> {
let config = config::read_config()?;
let workspace_config = config::workspace_config()?;
let instance_config = config::InstanceConfig::load(instance)?;

let man = &mut *overlayfs::get_overlayfs_manager(instance)?;
man.set_volatile(config.volatile_mount)?;
man.set_volatile(workspace_config.volatile_mount)?;

config::apply_config(man.get_config_layer()?, &workspace_config, &instance_config)?;
info!("{}: configuration applied.", instance);

machine::mount_layers(man, instance)?;
info!("{}: filesystem mounted.", instance);

Expand Down Expand Up @@ -281,13 +276,32 @@ fn get_instance_ns_name(instance: &str) -> Result<String> {
pub fn start_container(instance: &str) -> Result<String> {
let ns_name = get_instance_ns_name(instance)?;
let inst = inspect_instance(instance, &ns_name)?;
let (mut extra_options, mounts) = ensure_host_sanity()?;

let workspace_config = config::workspace_config().unwrap_or_default();
let instance_config = InstanceConfig::load(instance)?;

let mut extra_options = Vec::new();
extra_options.extend_from_slice(&workspace_config.extra_options);
extra_options.extend_from_slice(&instance_config.nspawn_options);

let mut mounts = HashMap::new();
mounts.insert("/tree".to_string(), "TREE".to_string());
mounts.insert("/var/cache/apt/archives".to_string(), "CACHE".to_string());
if workspace_config.local_sources {
mounts.insert("/var/cache/acbs/tarballs".to_string(), "SRCS".to_string());
}
mounts.insert(
"/debs".to_string(),
format!("{}/debs", get_output_directory(workspace_config.sep_mount)),
);

if std::env::var("CIEL_OFFLINE").is_ok() {
// FIXME: does not work with current version of systemd
// add the offline option (private-network means don't share the host network)
extra_options.push("--private-network".to_string());
info!("{}: network disconnected.", instance);
info!("{}: network isolated.", instance);
}

if !inst.mounted {
mount_fs(instance)?;
}
Expand Down Expand Up @@ -353,14 +367,18 @@ pub fn rollback_container(instance: &str) -> Result<()> {
#[inline]
pub fn add_instance(instance: &str, tmpfs: bool) -> Result<()> {
overlayfs::create_new_instance_fs(CIEL_INST_DIR, instance, tmpfs)?;
info!("{}: instance created.", instance);

let mut config = InstanceConfig::default();
if tmpfs {
warn!(
"{}: tmpfs is an experimental feature, use at your own risk!",
instance
);
config.tmpfs = Some(Default::default());
}
config.save(instance)?;

info!("{}: instance created.", instance);
Ok(())
}

Expand Down
37 changes: 0 additions & 37 deletions src/actions/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,46 +12,9 @@ pub use self::container::*;
pub use self::onboarding::onboarding;
pub use self::packaging::*;

const DEFAULT_MOUNTS: &[(&str, &str)] = &[
("OUTPUT/debs/", "/debs/"),
("TREE", "/tree"),
("SRCS", "/var/cache/acbs/tarballs"),
("CACHE", "/var/cache/apt/archives"),
];
const APT_UPDATE_SCRIPT: &str = r#"export DEBIAN_FRONTEND=noninteractive;apt-get update -y --allow-releaseinfo-change && apt-get -y -o Dpkg::Options::="--force-confnew" full-upgrade --autoremove --purge && apt autoclean"#;
const OMA_UPDATE_SCRIPT: &str = r#"oma upgrade -y --force-confnew --no-progress --force-unsafe-io && oma autoremove -y --remove-config && oma clean"#;

type MountOptions = (Vec<String>, Vec<(String, &'static str)>);
/// Ensure that the directories exist and mounted
pub fn ensure_host_sanity() -> Result<MountOptions, std::io::Error> {
use crate::warn;

let mut extra_options = Vec::new();
let mut mounts: Vec<(String, &str)> = DEFAULT_MOUNTS
.iter()
.map(|x| (x.0.to_string(), x.1))
.collect();
if let Ok(c) = crate::config::read_config() {
extra_options = c.extra_options;
if !c.local_sources {
// remove SRCS
mounts.swap_remove(2);
}
if c.sep_mount {
mounts.push((format!("{}/debs", get_output_directory(true)), "/debs/"));
mounts.swap_remove(0);
}
} else {
warn!("This workspace is not yet configured, default settings are used.");
}

for mount in &mounts {
std::fs::create_dir_all(&mount.0)?;
}

Ok((extra_options, mounts))
}

/// A convenience function for iterating over all the instances while executing the actions
#[inline]
pub fn for_each_instance<F: Fn(&str) -> Result<()>>(func: &F) -> Result<()> {
Expand Down
5 changes: 2 additions & 3 deletions src/actions/onboarding.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,13 +85,12 @@ pub fn onboarding(custom_tarball: Option<&String>, arch: Option<&str>) -> Result
fs::remove_file("TREE").ok();
download_git(GIT_TREE_URL, Path::new("TREE"))?;
}
config::apply_config(CIEL_DIST_DIR, &config)?;
info!("Applying configurations...");
info!("Saving configurations...");
fs::write(
Path::new(CIEL_DATA_DIR).join("config.toml"),
config.save_config()?,
)?;
info!("Configurations applied.");
info!("Configurations saved.");
let cwd = std::env::current_dir()?;
let mut output_dir_name = "OUTPUT".to_string();

Expand Down
4 changes: 2 additions & 2 deletions src/actions/packaging.rs
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ pub fn packages_stage_select<S: AsRef<str>, K: Clone + ExactSizeIterator<Item =

/// Fetch all the source packages in one go
pub fn package_fetch<S: AsRef<str>>(instance: &str, packages: &[S]) -> Result<i32> {
let conf = config::read_config();
let conf = config::workspace_config();
if conf.is_err() {
return Err(anyhow!("Please configure this workspace first!"));
}
Expand All @@ -281,7 +281,7 @@ pub fn package_build<S: AsRef<str>, K: Clone + ExactSizeIterator<Item = S>>(
state: Option<BuildCheckPoint>,
settings: BuildSettings,
) -> Result<i32> {
let conf = config::read_config();
let conf = config::workspace_config();
if conf.is_err() {
return Err(anyhow!("Please configure this workspace first!"));
}
Expand Down
Loading

0 comments on commit 3f31c53

Please sign in to comment.