main.rs 3.0 KB

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