123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- use std::{process, thread};
- use std::time::Duration;
- use tokio::task::JoinSet;
- use crate::reaper::Reaper;
- use pkg_compile_time::{pkg_compile_date, pkg_compile_time};
- mod shell;
- mod syscall;
- mod reaper;
- mod logger;
- mod sysinit;
- mod cfg;
- mod tty;
- #[tokio::main(flavor = "multi_thread", worker_threads = 2)]
- async fn main() {
- println!("==== yukari - ELIP4NG Init Process. ====");
- println!();
- let pid = process::id();
- if pid != 1 {
- panic!("yukari must run as PID 1.");
- }
- println!("load config...");
- cfg::init_config_manager().await;
- println!("spawning tty...");
- tty::spawn_tty().await;
- println!("hello, this is No.1 process (as sysinit) '/usr/sbin/yukari'.");
- println!("this program is compile at {} {}", pkg_compile_date!(), pkg_compile_time!());
- println!();
- println!("you can < PRESS ENTER > at any time to enter maintenance shell.");
- println!();
- println!("---- yukari sysinit phase ----");
- let mut logmux = logger::Logger::new();
- let logger_reaper = logmux.get_writer(String::from("reaper"));
- let logger_sysinit = logmux.get_writer(String::from("sysinit"));
- let zombie_reaper_res = Reaper::new(logger_reaper);
- let mut zombie_reaper = match zombie_reaper_res {
- Ok(r) => {r}
- Err(err) => {
- panic!("zombie reaper system sysinit failed: {:?}", err);
- }
- };
- let mut sys_init = sysinit::SysInit::new(logger_sysinit);
- let mut task_set = JoinSet::new();
- task_set.spawn(async move {
- logmux.printing().await;
- });
- task_set.spawn(async move {
- let res = sys_init.prepare().await;
- println!("---- yukari sysinit phase end ----");
- match res {
- None => {
- println!("service management handover to supervisor");
- println!();
- println!("< PRESS ENTER > to enter maintenance shell.");
- sys_init.run().await;
- }
- Some(err) => {
- println!("[Error] error in sysinit phase: {:?}", err);
- println!();
- println!("< PRESS ENTER > to enter maintenance shell.");
- loop{
- let _ = tokio::time::sleep(Duration::from_secs(10));
- }
- }
- }
- });
- task_set.spawn_blocking(move || {
- //shell::shell_wait_enter();
- shell::shell_repl();
- });
- task_set.spawn( async move {
- zombie_reaper.reap().await;
- });
- task_set.join_next().await;
- println!("[FATAL] one of task exited. No.1 process will quit.");
- task_set.abort_all();
- println!("No.1 process quit. system will reboot after 5 seconds...");
- let _ = tokio::time::sleep(Duration::from_secs(5));
- syscall::power::safe_reboot();
- }
|