init.rs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. use crate::utils::{dirs, tmpl};
  2. use chrono::Local;
  3. use log::LevelFilter;
  4. use log4rs::append::console::ConsoleAppender;
  5. use log4rs::append::file::FileAppender;
  6. use log4rs::config::{Appender, Config, Root};
  7. use log4rs::encode::pattern::PatternEncoder;
  8. use std::fs;
  9. use std::io::Write;
  10. use std::path::PathBuf;
  11. use tauri::PackageInfo;
  12. /// initialize this instance's log file
  13. fn init_log(log_dir: &PathBuf) {
  14. let local_time = Local::now().format("%Y-%m-%d-%H%M%S").to_string();
  15. let log_file = format!("{}.log", local_time);
  16. let log_file = log_dir.join(log_file);
  17. let time_format = "{d(%Y-%m-%d %H:%M:%S)} - {m}{n}";
  18. let stdout = ConsoleAppender::builder()
  19. .encoder(Box::new(PatternEncoder::new(time_format)))
  20. .build();
  21. let tofile = FileAppender::builder()
  22. .encoder(Box::new(PatternEncoder::new(time_format)))
  23. .build(log_file)
  24. .unwrap();
  25. let config = Config::builder()
  26. .appender(Appender::builder().build("stdout", Box::new(stdout)))
  27. .appender(Appender::builder().build("file", Box::new(tofile)))
  28. .build(
  29. Root::builder()
  30. .appenders(["stdout", "file"])
  31. .build(LevelFilter::Info),
  32. )
  33. .unwrap();
  34. log4rs::init_config(config).unwrap();
  35. }
  36. /// Initialize all the files from resources
  37. fn init_config(app_dir: &PathBuf) -> std::io::Result<()> {
  38. // target path
  39. let clash_path = app_dir.join("config.yaml");
  40. let verge_path = app_dir.join("verge.yaml");
  41. let profile_path = app_dir.join("profiles.yaml");
  42. if !clash_path.exists() {
  43. fs::File::create(clash_path)?.write(tmpl::CLASH_CONFIG)?;
  44. }
  45. if !verge_path.exists() {
  46. fs::File::create(verge_path)?.write(tmpl::VERGE_CONFIG)?;
  47. }
  48. if !profile_path.exists() {
  49. fs::File::create(profile_path)?.write(tmpl::PROFILES_CONFIG)?;
  50. }
  51. Ok(())
  52. }
  53. /// initialize app
  54. pub fn init_app(package_info: &PackageInfo) {
  55. // create app dir
  56. let app_dir = dirs::app_home_dir();
  57. let log_dir = dirs::app_logs_dir();
  58. let profiles_dir = dirs::app_profiles_dir();
  59. let res_dir = dirs::app_resources_dir(package_info);
  60. if !app_dir.exists() {
  61. fs::create_dir_all(&app_dir).unwrap();
  62. }
  63. if !log_dir.exists() {
  64. fs::create_dir_all(&log_dir).unwrap();
  65. }
  66. if !profiles_dir.exists() {
  67. fs::create_dir_all(&profiles_dir).unwrap();
  68. }
  69. init_log(&log_dir);
  70. if let Err(err) = init_config(&app_dir) {
  71. log::error!("{err}");
  72. }
  73. // copy the resource file
  74. let mmdb_path = app_dir.join("Country.mmdb");
  75. let mmdb_tmpl = res_dir.join("Country.mmdb");
  76. if !mmdb_path.exists() && mmdb_tmpl.exists() {
  77. fs::copy(mmdb_tmpl, mmdb_path).unwrap();
  78. }
  79. }