main.rs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. use std::{process};
  2. use std::time::Duration;
  3. use tokio::task::JoinSet;
  4. use crate::reaper::Reaper;
  5. use pkg_compile_time::{pkg_compile_date, pkg_compile_time};
  6. mod shell;
  7. mod syscall;
  8. mod reaper;
  9. mod logger;
  10. mod sysinit;
  11. mod cfg;
  12. mod env;
  13. #[tokio::main(flavor = "multi_thread", worker_threads = 2)]
  14. async fn main() {
  15. println!("==== yukari - ELIP4NG Init Process. ====");
  16. println!();
  17. let pid = process::id();
  18. if pid != 1 {
  19. panic!("yukari must run as PID 1.");
  20. }
  21. println!("hello, this is No.1 process (as sysinit) 'yukari'.");
  22. println!("this program has been compiled at {} {}", pkg_compile_date!(), pkg_compile_time!());
  23. println!();
  24. println!("load config...");
  25. cfg::init_config_manager().await;
  26. logger::set_debug_mode_by_cfg().await;
  27. println!("you can < PRESS ENTER > at any time to enter maintenance shell.");
  28. println!();
  29. println!("---- yukari sysinit phase ----");
  30. let mut logmux = logger::Logger::new();
  31. let logger_reaper = logmux.get_writer(String::from("zombie_reaper"));
  32. let logger_env_load = logmux.get_writer(String::from("env_load"));
  33. let logger_sysinit = logmux.get_writer(String::from("sys_init"));
  34. let zombie_reaper_res = Reaper::new(logger_reaper);
  35. let mut zombie_reaper = match zombie_reaper_res {
  36. Ok(r) => {r}
  37. Err(err) => {
  38. panic!("zombie reaper system sysinit failed: {:?}", err);
  39. }
  40. };
  41. let mut sys_init = sysinit::SysInit::new(logger_sysinit);
  42. let mut task_set = JoinSet::new();
  43. task_set.spawn(async move {
  44. logmux.printing().await;
  45. });
  46. task_set.spawn(async move {
  47. env::load_env(logger_env_load).await;
  48. let res = sys_init.prepare().await;
  49. println!("---- yukari sysinit phase end ----");
  50. match res {
  51. None => {
  52. println!("service management handover to supervisor");
  53. println!();
  54. println!("< PRESS ENTER > to enter maintenance shell.");
  55. sys_init.run().await;
  56. }
  57. Some(err) => {
  58. println!("[Error] error in sysinit phase: {:?}", err);
  59. println!();
  60. println!("< PRESS ENTER > to enter maintenance shell.");
  61. loop{
  62. let _ = tokio::time::sleep(Duration::from_secs(10));
  63. }
  64. }
  65. }
  66. });
  67. task_set.spawn_blocking(move || {
  68. //shell::shell_wait_enter();
  69. shell::shell_repl();
  70. });
  71. task_set.spawn( async move {
  72. zombie_reaper.reap().await;
  73. });
  74. task_set.join_next().await;
  75. println!("[FATAL] one of task exited. No.1 process will quit.");
  76. task_set.abort_all();
  77. println!("No.1 process quit. system will reboot after 5 seconds...");
  78. let _ = tokio::time::sleep(Duration::from_secs(5));
  79. syscall::power::safe_reboot();
  80. }