correctly void and fill uts namespaces
This commit is contained in:
parent
3f377ff0d9
commit
ae803f0a95
@ -169,6 +169,7 @@ impl<'a> Spawner<'a> {
|
|||||||
let mut builder = VoidBuilder::new();
|
let mut builder = VoidBuilder::new();
|
||||||
builder.mount("/entrypoint", "/entrypoint");
|
builder.mount("/entrypoint", "/entrypoint");
|
||||||
|
|
||||||
|
// TODO: move the weird logic out of this part
|
||||||
for env in &spec.environment {
|
for env in &spec.environment {
|
||||||
match env {
|
match env {
|
||||||
Environment::Filesystem {
|
Environment::Filesystem {
|
||||||
@ -177,6 +178,13 @@ impl<'a> Spawner<'a> {
|
|||||||
} => {
|
} => {
|
||||||
builder.mount(environment_path, environment_path);
|
builder.mount(environment_path, environment_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Environment::Hostname(name) => {
|
||||||
|
builder.set_hostname(name);
|
||||||
|
}
|
||||||
|
Environment::DomainName(name) => {
|
||||||
|
builder.set_domain_name(name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,6 +244,7 @@ impl<'a> Spawner<'a> {
|
|||||||
builder.keep_fd(fd);
|
builder.keep_fd(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: move the weird logic out of this part
|
||||||
for env in &spec.environment {
|
for env in &spec.environment {
|
||||||
match env {
|
match env {
|
||||||
Environment::Filesystem {
|
Environment::Filesystem {
|
||||||
@ -244,6 +253,13 @@ impl<'a> Spawner<'a> {
|
|||||||
} => {
|
} => {
|
||||||
builder.mount(environment_path, environment_path);
|
builder.mount(environment_path, environment_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Environment::Hostname(name) => {
|
||||||
|
builder.set_hostname(name);
|
||||||
|
}
|
||||||
|
Environment::DomainName(name) => {
|
||||||
|
builder.set_domain_name(name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -307,6 +323,13 @@ impl<'a> Spawner<'a> {
|
|||||||
} => {
|
} => {
|
||||||
builder.mount(host_path, environment_path);
|
builder.mount(host_path, environment_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Environment::Hostname(name) => {
|
||||||
|
builder.set_hostname(name);
|
||||||
|
}
|
||||||
|
Environment::DomainName(name) => {
|
||||||
|
builder.set_domain_name(name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -114,6 +114,9 @@ pub enum Environment {
|
|||||||
host_path: PathBuf,
|
host_path: PathBuf,
|
||||||
environment_path: PathBuf,
|
environment_path: PathBuf,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
Hostname(String),
|
||||||
|
DomainName(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, PartialEq, Eq, Hash, Debug)]
|
#[derive(Serialize, Deserialize, PartialEq, Eq, Hash, Debug)]
|
||||||
|
38
src/void.rs
38
src/void.rs
@ -13,7 +13,7 @@ use std::path::{Path, PathBuf};
|
|||||||
use nix::fcntl::{FcntlArg, FdFlag};
|
use nix::fcntl::{FcntlArg, FdFlag};
|
||||||
use nix::mount::{mount, umount2, MntFlags, MsFlags};
|
use nix::mount::{mount, umount2, MntFlags, MsFlags};
|
||||||
use nix::sys::signal::{signal, SigHandler, Signal};
|
use nix::sys::signal::{signal, SigHandler, Signal};
|
||||||
use nix::unistd::{close, getgid, getuid, pivot_root, Gid, Pid, Uid};
|
use nix::unistd::{close, getgid, getuid, pivot_root, sethostname, Gid, Pid, Uid};
|
||||||
|
|
||||||
use close_fds::CloseFdsBuilder;
|
use close_fds::CloseFdsBuilder;
|
||||||
|
|
||||||
@ -28,6 +28,9 @@ impl fmt::Display for VoidHandle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct VoidBuilder {
|
pub struct VoidBuilder {
|
||||||
|
hostname: Option<String>,
|
||||||
|
domain_name: Option<String>,
|
||||||
|
|
||||||
mounts: HashMap<PathBuf, PathBuf>,
|
mounts: HashMap<PathBuf, PathBuf>,
|
||||||
fds: HashSet<RawFd>,
|
fds: HashSet<RawFd>,
|
||||||
}
|
}
|
||||||
@ -35,11 +38,23 @@ pub struct VoidBuilder {
|
|||||||
impl VoidBuilder {
|
impl VoidBuilder {
|
||||||
pub fn new() -> VoidBuilder {
|
pub fn new() -> VoidBuilder {
|
||||||
VoidBuilder {
|
VoidBuilder {
|
||||||
|
hostname: None,
|
||||||
|
domain_name: None,
|
||||||
mounts: HashMap::new(),
|
mounts: HashMap::new(),
|
||||||
fds: HashSet::new(),
|
fds: HashSet::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_hostname<T: Into<String>>(&mut self, hostname: T) -> &mut Self {
|
||||||
|
self.hostname = Some(hostname.into());
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_domain_name<T: Into<String>>(&mut self, domain_name: T) -> &mut Self {
|
||||||
|
self.domain_name = Some(domain_name.into());
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
pub fn mount<T1: AsRef<Path>, T2: AsRef<Path>>(&mut self, src: T1, dst: T2) -> &mut Self {
|
pub fn mount<T1: AsRef<Path>, T2: AsRef<Path>>(&mut self, src: T1, dst: T2) -> &mut Self {
|
||||||
self.mounts.insert(src.as_ref().into(), dst.as_ref().into());
|
self.mounts.insert(src.as_ref().into(), dst.as_ref().into());
|
||||||
self
|
self
|
||||||
@ -128,7 +143,16 @@ impl VoidBuilder {
|
|||||||
* parent values for each of these.
|
* parent values for each of these.
|
||||||
*/
|
*/
|
||||||
fn void_uts_namespace(&self) -> Result<()> {
|
fn void_uts_namespace(&self) -> Result<()> {
|
||||||
// TODO: void uts namespace
|
sethostname(self.hostname.as_deref().unwrap_or("void")).map_err(|e| Error::Nix {
|
||||||
|
msg: "sethostname",
|
||||||
|
src: e,
|
||||||
|
})?;
|
||||||
|
|
||||||
|
setdomainname(self.domain_name.as_deref().unwrap_or("(none)")).map_err(|e| Error::Nix {
|
||||||
|
msg: "setdomainname",
|
||||||
|
src: e,
|
||||||
|
})?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -342,3 +366,13 @@ impl VoidBuilder {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn setdomainname<S: AsRef<std::ffi::OsStr>>(name: S) -> nix::Result<()> {
|
||||||
|
use std::os::unix::ffi::OsStrExt;
|
||||||
|
|
||||||
|
let ptr = name.as_ref().as_bytes().as_ptr() as *const libc::c_char;
|
||||||
|
let len = name.as_ref().len() as libc::size_t;
|
||||||
|
|
||||||
|
let res = unsafe { libc::setdomainname(ptr, len) };
|
||||||
|
nix::Error::result(res).map(drop)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user