aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/scripts/init.sh45
-rw-r--r--zoned/src/config.rs4
-rw-r--r--zoned/src/error.rs3
-rw-r--r--zoned/src/http.rs16
-rw-r--r--zoned/src/main.rs4
-rw-r--r--zoned/src/state.rs4
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,
})
}
}