1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
use std::path::PathBuf;

use quire::validate::{Structure, Sequence};
use quire::validate::{Scalar};
use super::utils::ensure_dir;

#[derive(Deserialize)]
pub struct MasterConfig {
    pub runtime_dir: PathBuf,
    pub sandboxes_dir: PathBuf,
    pub processes_dir: PathBuf,
    pub state_dir: PathBuf,
    pub mount_dir: PathBuf,
    pub devfs_dir: PathBuf,
    pub default_log_dir: PathBuf,
    pub config_log_dir: Option<PathBuf>,
    pub stdio_log_dir: PathBuf,
    pub log_file: PathBuf,
    pub syslog_facility: Option<String>,
    pub syslog_app_name: String,
    pub log_level: String,
    pub cgroup_name: Option<String>,
    pub cgroup_controllers: Vec<String>,
}

impl MasterConfig {
    pub fn validator<'x>() -> Structure<'x> {
        Structure::new()
        .member("sandboxes_dir", Scalar::new().default("./sandboxes"))
        .member("processes_dir", Scalar::new().default("./processes"))
        .member("runtime_dir", Scalar::new().default("/run/lithos"))
        .member("state_dir", Scalar::new().default("state"))
        .member("mount_dir", Scalar::new().default("mnt"))
        .member("devfs_dir", Scalar::new()
            .default("/var/lib/lithos/dev"))
        .member("default_log_dir", Scalar::new().default("/var/log/lithos"))
        .member("syslog_facility", Scalar::new().optional())
        .member("syslog_app_name", Scalar::new().default("lithos"))
        .member("log_file", Scalar::new().default("master.log"))
        .member("log_level", Scalar::new().default("warn"))
        .member("config_log_dir", Scalar::new().optional()
            .default("/var/log/lithos/config"))
        .member("stdio_log_dir", Scalar::new()
            .default("/var/log/lithos/stderr"))
        .member("cgroup_name",
            Scalar::new().optional().default("lithos.slice"))
        .member("cgroup_controllers", Sequence::new(Scalar::new()))
    }
}

pub fn create_master_dirs(cfg: &MasterConfig) -> Result<(), String> {
    try!(ensure_dir(&cfg.runtime_dir)
        .map_err(|e| format!("Cant create runtime-dir: {}", e)));
    try!(ensure_dir(&cfg.runtime_dir.join(&cfg.state_dir))
        .map_err(|e| format!("Cant create state-dir: {}", e)));
    try!(ensure_dir(&cfg.runtime_dir.join(&cfg.mount_dir))
        .map_err(|e| format!("Cant create mount-dir: {}", e)));
    try!(ensure_dir(&cfg.default_log_dir)
        .map_err(|e| format!("Cant create log dir: {}", e)));
    if let Some(ref config_log_dir) = cfg.config_log_dir {
        ensure_dir(config_log_dir)
            .map_err(|e| format!("Cant create configuration log dir: {}", e))?;
    }
    try!(ensure_dir(&cfg.stdio_log_dir)
        .map_err(|e| format!("Cant create stdio log dir: {}", e)));
    return Ok(());
}