main.rs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. use std::{process, thread};
  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 tty;
  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!("load config...");
  22. cfg::init_config_manager().await;
  23. println!("spawning tty...");
  24. tty::spawn_tty().await;
  25. println!("hello, this is No.1 process (as sysinit) '/usr/sbin/yukari'.");
  26. println!("this program is compile at {} {}", pkg_compile_date!(), pkg_compile_time!());
  27. println!();
  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(String::from("reaper"));
  33. let logger_sysinit = logmux.get_writer(String::from("sysinit"));
  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. let res = sys_init.prepare().await;
  48. println!("---- yukari sysinit phase end ----");
  49. match res {
  50. None => {
  51. println!("service management handover to supervisor");
  52. println!();
  53. println!("< PRESS ENTER > to enter maintenance shell.");
  54. sys_init.run().await;
  55. }
  56. Some(err) => {
  57. println!("[Error] error in sysinit phase: {:?}", err);
  58. println!();
  59. println!("< PRESS ENTER > to enter maintenance shell.");
  60. loop{
  61. let _ = tokio::time::sleep(Duration::from_secs(10));
  62. }
  63. }
  64. }
  65. });
  66. task_set.spawn_blocking(move || {
  67. //shell::shell_wait_enter();
  68. shell::shell_repl();
  69. });
  70. task_set.spawn( async move {
  71. zombie_reaper.reap().await;
  72. });
  73. task_set.join_next().await;
  74. println!("[FATAL] one of task exited. No.1 process will quit.");
  75. task_set.abort_all();
  76. println!("No.1 process quit. system will reboot after 5 seconds...");
  77. let _ = tokio::time::sleep(Duration::from_secs(5));
  78. syscall::power::safe_reboot();
  79. }