config.cpp 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "config.h"
  2. #include <regex>
  3. bool config::open(const std::string& ini_filepath)
  4. {
  5. if (ylib::file::exist(ini_filepath) == false)
  6. {
  7. LOG_ERROR("not found file: " + ini_filepath);
  8. return false;
  9. }
  10. std::string temp_filepath = ylib::file::temp_filepath() + ".bak";
  11. if (ylib::file::copy(ini_filepath, temp_filepath) == false)
  12. {
  13. LOG_ERROR("Failed to copy temporary INI configuration file from '" + ini_filepath + "' to '" + temp_filepath + "'.");
  14. return false;
  15. }
  16. std::string src_content = ylib::file::read(temp_filepath);
  17. src_content = strutils::replace(src_content, "${current_dir}", strutils::replace(system::current_dir(),'\\','/'));
  18. ylib::file::write(temp_filepath,src_content);
  19. if (m_ini.open(temp_filepath))
  20. {
  21. auto vars = extractVariableNames(ylib::file::read(temp_filepath));
  22. for (size_t i = 0; i < vars.size(); i++)
  23. {
  24. if (m_ini.read("variable", vars[i]) == "")
  25. {
  26. LOG_ERROR("Variable declaration not found or empty content: ${" + vars[i] + "}");
  27. return false;
  28. }
  29. src_content = strutils::replace(src_content, "${" + vars[i] + "}", m_ini.read("variable", vars[i]));
  30. }
  31. }
  32. ylib::file::write(temp_filepath,src_content);
  33. m_ini.close();
  34. m_ini.open(temp_filepath);
  35. cache();
  36. return true;
  37. }
  38. std::vector<std::string> config::extractVariableNames(const std::string& text)
  39. {
  40. std::regex pattern("\\$\\{([^}]+)\\}"); // 使用捕获组提取中间的内容
  41. std::vector<std::string> results;
  42. // 使用 std::sregex_iterator 迭代所有匹配项
  43. auto begin = std::sregex_iterator(text.begin(), text.end(), pattern);
  44. auto end = std::sregex_iterator();
  45. for (std::sregex_iterator i = begin; i != end; ++i) {
  46. std::smatch match = *i;
  47. results.push_back(match[1]); // 仅添加捕获组的内容
  48. }
  49. return results;
  50. }
  51. void config::cache()
  52. {
  53. server.address = m_ini.read("server", "address");
  54. server.port = ylib::stoi(m_ini.read("server", "port"));
  55. scripts.app_dir = m_ini.read("scripts","app_dir");
  56. scripts.lib_dir = m_ini.read("scripts", "lib_dir");
  57. scripts.lua_cache_size = ylib::stoi(m_ini.read("scripts", "lua_cache_size"));
  58. scripts.app_mapping_dir = m_ini.read("scripts", "app_mapping_dir");
  59. scripts.auto_update_sec = ylib::stoi(m_ini.read("scripts", "auto_update_sec"));
  60. website.static_dir = m_ini.read("website","static_dir");
  61. website.default_404 = m_ini.read("website", "default_404");
  62. website.default_index = strutils::split(m_ini.read("website", "default_index"), ',');
  63. website.session_dir = m_ini.read("website", "session_dir");
  64. website.session_timeout_sec = ylib::stoi(m_ini.read("website", "session_timeout_sec"));
  65. website.Initialization_script = m_ini.read("website", "Initialization_script");
  66. website.debug = m_ini.read("website", "debug") == "1";
  67. {
  68. ylib::json interceptors = ylib::json::from(m_ini.read("website", "interceptor_scripts"));
  69. for (size_t i = 0; i < interceptors.size(); i++)
  70. {
  71. if (interceptors[i].size() != 2)
  72. {
  73. LOG_WARN("Interceptor configuration, if the "+std::to_string(i) + "th array has non 2 members, this interceptor will be invalidated.");
  74. continue;
  75. }
  76. website::__interceptor inr;
  77. inr.filepath = interceptors[i][0].to<std::string>();
  78. inr.regex_express = interceptors[i][1].to<std::string>();
  79. website.interceptor_scripts.push_back(inr);
  80. }
  81. }
  82. }