init: Introduce a json format for services
While I would have like to use toml, something inside the toml crate seems to be using randomness, which is not yet available when init starts.
This commit is contained in:
Generated
+2
@@ -1108,6 +1108,8 @@ dependencies = [
|
||||
"config",
|
||||
"daemon",
|
||||
"libredox",
|
||||
"serde",
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"cmd": "nulld",
|
||||
"type": { "scheme": "null" }
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"cmd": "randd",
|
||||
"args": ["rand"],
|
||||
"type": { "scheme": "rand" }
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"cmd": "rtcd",
|
||||
"type": "oneshot"
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
# Various daemons that relibc needs to function.
|
||||
rtcd
|
||||
scheme null nulld
|
||||
scheme zero zerod
|
||||
scheme rand randd
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"cmd": "zerod",
|
||||
"type": { "scheme": "zero" }
|
||||
}
|
||||
@@ -6,6 +6,8 @@ license = "MIT"
|
||||
|
||||
[dependencies]
|
||||
libredox.workspace = true
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
|
||||
config = { path = "../config" }
|
||||
daemon = { path = "../daemon" }
|
||||
|
||||
+9
-2
@@ -1,12 +1,13 @@
|
||||
use std::collections::BTreeMap;
|
||||
use std::env;
|
||||
use std::ffi::OsString;
|
||||
use std::ffi::{OsStr, OsString};
|
||||
use std::io::Result;
|
||||
use std::path::Path;
|
||||
use std::{env, fs};
|
||||
|
||||
use libredox::flag::{O_RDONLY, O_WRONLY};
|
||||
|
||||
use crate::script::Command;
|
||||
use crate::service::Service;
|
||||
|
||||
mod script;
|
||||
mod service;
|
||||
@@ -74,6 +75,12 @@ fn switch_root(prefix: &Path, etcdir: &Path, config: &mut InitConfig) {
|
||||
}
|
||||
|
||||
fn run(file: &Path, config: &mut InitConfig) -> Result<()> {
|
||||
if file.extension() == Some(OsStr::new("service")) {
|
||||
let service: Service = serde_json::from_str(&fs::read_to_string(file).unwrap()).unwrap();
|
||||
service.spawn(&config.envs);
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let (script, errors) = script::Script::from_file(file)?;
|
||||
|
||||
for error in errors {
|
||||
|
||||
+8
-2
@@ -2,15 +2,21 @@ use std::collections::BTreeMap;
|
||||
use std::ffi::OsString;
|
||||
use std::process::Command;
|
||||
|
||||
#[derive(Debug)]
|
||||
use serde::Deserialize;
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
pub struct Service {
|
||||
pub cmd: String,
|
||||
#[serde(default)]
|
||||
pub args: Vec<String>,
|
||||
#[serde(default)]
|
||||
pub envs: BTreeMap<String, String>,
|
||||
#[serde(rename = "type")]
|
||||
pub type_: ServiceType,
|
||||
}
|
||||
|
||||
#[derive(Debug, Default)]
|
||||
#[derive(Debug, Default, Deserialize)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum ServiceType {
|
||||
#[default]
|
||||
Notify,
|
||||
|
||||
Reference in New Issue
Block a user