2020-06-20 13:27:21 +00:00
|
|
|
use std::{fs, path::Path};
|
2020-06-13 23:02:16 +00:00
|
|
|
use serde::Deserialize;
|
2020-06-20 17:43:19 +00:00
|
|
|
use std::collections::BTreeMap;
|
2020-06-13 23:02:16 +00:00
|
|
|
use toml;
|
2020-06-14 22:53:39 +00:00
|
|
|
use tokio;
|
|
|
|
use crate::processes;
|
2020-06-13 23:02:16 +00:00
|
|
|
|
|
|
|
#[derive(Deserialize, Debug)]
|
|
|
|
pub struct Service {
|
|
|
|
pub name: String,
|
2020-06-20 17:43:19 +00:00
|
|
|
pub level: u16,
|
2020-06-13 23:02:16 +00:00
|
|
|
pub start: Start,
|
|
|
|
pub stop: Option<Stop>,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Deserialize, Debug)]
|
|
|
|
pub struct Start {
|
|
|
|
pub command: String,
|
|
|
|
pub args: Vec<String>
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Deserialize, Debug)]
|
|
|
|
pub struct Stop {
|
|
|
|
pub command: String,
|
|
|
|
pub args: Vec<String>
|
|
|
|
}
|
|
|
|
|
2020-06-20 17:43:19 +00:00
|
|
|
pub fn get_services() -> BTreeMap<u16, Vec<Service>> {
|
|
|
|
let mut services = BTreeMap::new();
|
2020-06-20 13:27:21 +00:00
|
|
|
let mini_dir = Path::new("/etc/mini/");
|
|
|
|
|
|
|
|
if mini_dir.exists() && mini_dir.is_dir() {
|
|
|
|
|
|
|
|
let dir = fs::read_dir(mini_dir).unwrap();
|
|
|
|
|
|
|
|
for file in dir {
|
|
|
|
// TODO: check ext
|
|
|
|
let svc_file_contents = fs::read_to_string(file.unwrap().path()).unwrap();
|
|
|
|
let svc : Service = toml::from_str(&svc_file_contents).unwrap();
|
2020-06-20 17:43:19 +00:00
|
|
|
|
|
|
|
let lvl = services.entry(svc.level).or_insert(Vec::new());
|
|
|
|
lvl.push(svc);
|
2020-06-20 13:27:21 +00:00
|
|
|
}
|
2020-06-13 23:02:16 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
services
|
|
|
|
}
|
2020-06-14 22:53:39 +00:00
|
|
|
|
|
|
|
pub async fn launch_services() {
|
|
|
|
let services = get_services();
|
|
|
|
|
2020-06-20 17:43:19 +00:00
|
|
|
for (level, svc_list) in services {
|
|
|
|
for s in svc_list {
|
|
|
|
tokio::spawn(async move {
|
|
|
|
println!("starting {}[{}]", s.name, level);
|
|
|
|
let args: Vec<&str> = s.start.args.iter().map(|e| e.as_str()).collect();
|
|
|
|
processes::run(&s.start.command, &args[..]).await;
|
|
|
|
});
|
|
|
|
}
|
2020-06-14 22:53:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn stop_services() {
|
|
|
|
let services = get_services();
|
|
|
|
|
2020-06-20 17:43:19 +00:00
|
|
|
for (level, svc_list) in services.iter().rev() {
|
|
|
|
for s in svc_list {
|
|
|
|
println!("stopping {}[{}]", s.name, level);
|
|
|
|
if let Some(stop) = &s.stop {
|
|
|
|
let args: Vec<&str> = stop.args.iter().map(|e| e.as_str()).collect();
|
|
|
|
processes::sync_run_wait(&stop.command, &args[..]);
|
|
|
|
}
|
2020-06-14 22:53:39 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|