diff options
-rw-r--r-- | examples/scripts/init.sh | 45 | ||||
-rw-r--r-- | zoned/src/config.rs | 4 | ||||
-rw-r--r-- | zoned/src/error.rs | 3 | ||||
-rw-r--r-- | zoned/src/http.rs | 16 | ||||
-rw-r--r-- | zoned/src/main.rs | 4 | ||||
-rw-r--r-- | zoned/src/state.rs | 4 |
6 files changed, 70 insertions, 6 deletions
diff --git a/examples/scripts/init.sh b/examples/scripts/init.sh new file mode 100644 index 0000000..d9bfaf2 --- /dev/null +++ b/examples/scripts/init.sh @@ -0,0 +1,45 @@ +#!/usr/bin/sh + +temp=${ID##*(0)} +i=2 +while [ $i -ge 0 ] +do + # shellcheck disable=SC2034 # `address` variable used in eval + address[$i]=$((temp%256)) + temp=$((temp/256)) + i=$((i-1)) +done + +IFS='.' command eval 'nat="10.${address[*]}/8"' + +mkdir -p "${DIRECTORY}"/etc/systemd/resolved.conf.d +cat <<- END > "${DIRECTORY}"/etc/systemd/resolved.conf.d/llmnr.conf + [Resolve] + LLMNR=true +END + +cat <<- END > "${DIRECTORY}"/etc/systemd/network/00-host0.network + [Match] + Virtualization=container + Name=host0 + + [Network] + LinkLocalAddressing=0 + ConfigureWithoutCarrier=1 + Address=192.168.0.$((10+INSTANCE))/24 +END + +# shellcheck disable=SC2154 # `nat` variable assigned in eval +cat <<- END > "${DIRECTORY}"/etc/systemd/network/00-host9.network + [Match] + Name=host9 + + [Network] + LinkLocalAddressing=0 + ConfigureWithoutCarrier=1 + Address=$nat + Gateway=10.255.255.254 + LLMNR=false + DNS=146.163.252.126 + DNS=146.163.252.127 +END
\ No newline at end of file diff --git a/zoned/src/config.rs b/zoned/src/config.rs index 4e3a076..820abae 100644 --- a/zoned/src/config.rs +++ b/zoned/src/config.rs @@ -12,8 +12,8 @@ use crate::{Error, Result}; pub struct Config { pub ip_address: IpAddr, pub port: u16, + pub init_script: Option<PathBuf>, pub zfs: zone_zfs::Config, - pub nspawn: zone_nspawn::Config, } impl Default for Config { @@ -21,6 +21,7 @@ impl Default for Config { Self { ip_address: zone_core::DEFAULT_IP_ADDRESS, port: zone_core::DEFAULT_PORT, + init_script: None, zfs: Default::default(), } } @@ -105,6 +106,7 @@ mod tests { Config { ip_address: [192, 168, 1, 1].into(), port: 6555, + init_script: None, zfs: zone_zfs::Config { quota: 42_000_000u64.into(), pool_name: String::from("fool"), diff --git a/zoned/src/error.rs b/zoned/src/error.rs index 66d1e1b..922a352 100644 --- a/zoned/src/error.rs +++ b/zoned/src/error.rs @@ -14,6 +14,9 @@ pub enum Error { #[error("Zone Error: {0:?}")] Zone(String), + #[error("Script Error: {0:?}")] + Script(String), + #[error("Container Error: {0:?}")] Container(String), diff --git a/zoned/src/http.rs b/zoned/src/http.rs index df82908..4ed289a 100644 --- a/zoned/src/http.rs +++ b/zoned/src/http.rs @@ -5,7 +5,7 @@ use axum::{ routing::{get, post}, Json, Router, }; -use std::sync::Arc; +use std::{process::Command, sync::Arc}; use tracing::{info, instrument, warn}; use zone_core::{CloneOptions, Container, ContainerOptions, ContainerStatus, FilterContainer}; @@ -73,6 +73,20 @@ async fn clone_container( let name = format!("{}-{}", container.user, id); let root = state.zfs.clone_latest(name, (&container.template).into())?; + if let Some(script) = &state.config.init_script { + Command::new(script) + .env("DIRECTORY", &root) + .env("USER", &container.user) + .env("TEMPLATE", &container.template) + .status()? + .code() + .map_or(Ok(()), |code| { + Err(Error::Script(format!( + "Script exited with status code: {}", + code + ))) + })?; + }; let name = format!("{}-{}-{}", container.template, container.user, id); state.nspawn.create(root, name)?; diff --git a/zoned/src/main.rs b/zoned/src/main.rs index d6aee47..3d3f2dd 100644 --- a/zoned/src/main.rs +++ b/zoned/src/main.rs @@ -20,9 +20,7 @@ async fn main() -> Result<(), zoned::Error> { let config = Config::try_from(figment)?; - let shared_state = State::try_from(&config)?.into_arc(); - - let routes = http::build_routes().layer(Extension(shared_state)); + let routes = http::build_routes().layer(Extension(State::try_from(&config)?.into_arc())); let socket_addr = SocketAddr::from(config); diff --git a/zoned/src/state.rs b/zoned/src/state.rs index 9e9811f..d7da973 100644 --- a/zoned/src/state.rs +++ b/zoned/src/state.rs @@ -7,6 +7,7 @@ use crate::{Config, Error, Result}; #[derive(Debug)] pub struct State { + pub config: Config, pub zfs: ZFS, pub nspawn: NSpawn, } @@ -16,8 +17,9 @@ impl TryFrom<&Config> for State { fn try_from(val: &Config) -> Result<Self> { Ok(State { + config: val.to_owned(), zfs: zone_zfs::ZFS::custom(&val.zfs)?, - nspawn: zone_nspawn::NSpawn::custom(&val.nspawn)?, + nspawn: zone_nspawn::NSpawn, }) } } |