| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- // MIT License
- // Copyright(c) 2024 FastWeb - fwlua.com - nianhua
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files(the "Software"), to deal
- // in the Software without restriction, including without limitation the rights
- // to use, copy, modify, merge, publish, distribute, sublicense, and /or sell
- // copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions :
- // The above copyright notice and this permission notice shall be included in all
- // copies or substantial portions of the Software.
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- // SOFTWARE.
- // ## Additional Terms for Commercial Use
- // This software is licensed for personal, educational, and non - commercial use.
- // For commercial use or use within a company, organization, or institution, a
- // separate commercial license is required.To obtain a commercial license,
- // please contact
- // EMail:1585346868@qq.com
- // QQ:1585346868
- #include "config.h"
- #include <regex>
- #include "core/app.h"
- fastweb::config::config(fastweb::app* ptr):Interface(ptr)
- {
- }
- bool fastweb::config::open(const std::string& ini_filepath)
- {
- if (ylib::file::exist(ini_filepath) == false)
- {
- LOG_ERROR("not found file: " + ini_filepath);
- return false;
- }
- std::string temp_filepath = ylib::file::temp_filepath() + ".bak";
- if (ylib::file::copy(ini_filepath, temp_filepath) == false)
- {
- LOG_ERROR("Failed to copy temporary INI configuration file from '" + ini_filepath + "' to '" + temp_filepath + "'.");
- return false;
- }
- std::string src_content = ylib::file::read(temp_filepath);
- // EXE运行目录
- src_content = strutils::replace(src_content, "${current_dir}", strutils::replace(system::current_dir(),'\\','/'));
- // 配置文件目录
- {
- std::string ini_dir = ylib::file::parent_dir(ini_filepath);
- src_content = strutils::replace(strutils::replace(src_content, "${config_dir}", ini_dir), '\\', '/');
- }
-
- ylib::file::write(temp_filepath,src_content);
- if (m_ini.open(temp_filepath))
- {
- auto vars = extractVariableNames(ylib::file::read(temp_filepath));
- for (size_t i = 0; i < vars.size(); i++)
- {
- if (m_ini.read("variable", vars[i]) == "")
- {
- LOG_ERROR("Variable declaration not found or empty content: ${" + vars[i] + "}");
- return false;
- }
- src_content = strutils::replace(src_content, "${" + vars[i] + "}", m_ini.read("variable", vars[i]));
- }
- }
- ylib::file::write(temp_filepath,src_content);
- m_ini.close();
- m_ini.open(temp_filepath);
- cache();
- return true;
- }
- std::vector<std::string> fastweb::config::lua_lib_files()
- {
- std::vector<std::string> results;
- auto luas = ylib::file::traverse(app()->config->website.dir, "(.*\\.lua)");
- for_iter(iter, luas)
- {
- if (iter->second == IS_DIRECTORY)
- continue;
- std::string path = app()->config->website.dir +"/"+ strutils::replace(iter->first, '\\', '/');
- results.push_back(path);
- }
- // 去重
- std::sort(results.begin(), results.end());
- auto newEnd = std::unique(results.begin(), results.end());
- results.erase(newEnd, results.end());
-
- return results;
- }
- std::vector<std::string> fastweb::config::extractVariableNames(const std::string& text)
- {
- std::regex pattern("\\$\\{([^}]+)\\}"); // 使用捕获组提取中间的内容
- std::vector<std::string> results;
- // 使用 std::sregex_iterator 迭代所有匹配项
- auto begin = std::sregex_iterator(text.begin(), text.end(), pattern);
- auto end = std::sregex_iterator();
- for (std::sregex_iterator i = begin; i != end; ++i) {
- std::smatch match = *i;
- results.push_back(match[1]); // 仅添加捕获组的内容
- }
- return results;
- }
- void fastweb::config::cache()
- {
- scripts.module_dir = m_ini.read("scripts", "module_dir");
- scripts.lua_cache_size = ylib::stoi(m_ini.read("scripts", "lua_cache_size"));
- scripts.auto_update_sec = ylib::stoi(m_ini.read("scripts", "auto_update_sec"));
- website.dir = m_ini.read("website","dir");
- website.default_404 = m_ini.read("website", "default_404");
- website.default_index = strutils::split(m_ini.read("website", "default_index"), ',');
- website.session_dir = m_ini.read("website", "session_dir");
- website.session_timeout_sec = ylib::stoi(m_ini.read("website", "session_timeout_sec"));
- website.Initialization_script = m_ini.read("website", "Initialization_script");
- website.debug = m_ini.read("website", "debug") == "1";
- website.domain = strutils::split(m_ini.read("website", "domain"),',');
- website.direct_url_mapping = m_ini.read("website", "direct_url_mapping") == "1";
- log.enable = m_ini.read("log", "enable") == "1";
- log.dir = m_ini.read("log", "dir");
- log.name = m_ini.read("log", "name");
- log.sqlite = m_ini.read("log", "sqlite") == "1";
- //log.succ = m_ini.read("log", "succ") == "1";
- //log.info = m_ini.read("log", "info") == "1";
- //log.warn = m_ini.read("log", "warn") == "1";
- //log.error = m_ini.read("log", "error") == "1";
- // website 域名参数
- for(size_t i=0;i< website.domain.size();i++)
- {
- if (website.domain[i].empty())
- continue;
- struct config::domain dm;
- dm.port = ylib::stoi(m_ini.read(website.domain[i], "port"));
- dm.https = m_ini.read(website.domain[i],"https")=="1";
- dm.ssl.pem_key = ylib::file::read(m_ini.read(website.domain[i], "ssl_key"));
- dm.ssl.pem_cert = ylib::file::read(m_ini.read(website.domain[i], "ssl_pem"));
- dm.ssl.pem_ca = ylib::file::read(m_ini.read(website.domain[i], "ssl_ca"));
- dm.ssl.pem_password = m_ini.read(website.domain[i], "ssl_pwd");
- dm.ssl.type = (network::http::ssl_verify_type)ylib::stoi(m_ini.read(website.domain[i], "ssl_ver_type"));
- if (dm.port == 0)
- {
- LOG_ERROR("domain("+website.domain[i] + ") name unavailable, port is 0");
- continue;
- }
- if (dm.https)
- {
- dm.ssl.enable = true;
- if (dm.ssl.pem_key.empty())
- {
- LOG_ERROR("domain(" + website.domain[i] + ") ssl_key file is read as empty, please check the ssl_key");
- continue;
- }
- if (dm.ssl.pem_cert.empty())
- {
- LOG_ERROR("domain(" + website.domain[i] + ") ssl_pem file is read as empty, please check the ssl_pem");
- continue;
- }
- if (dm.ssl.type < 0 || dm.ssl.type > 3)
- {
- LOG_ERROR("domain(" + website.domain[i] + ") ssl_ver_type is not filled in correctly, it should be: 0~3");
- continue;
- }
- }
- domain.emplace(website.domain[i],dm);
- }
- }
|