2024-12-11 23:23:48 +08:00
|
|
|
#include "client.h"
|
2025-01-06 16:25:39 +08:00
|
|
|
#include "config.h"
|
2024-12-16 14:21:39 +08:00
|
|
|
#include "version.h"
|
2025-01-06 16:25:39 +08:00
|
|
|
#include <CLI11.hpp>
|
2024-12-16 09:40:57 +08:00
|
|
|
#include <iostream>
|
2025-01-06 16:25:39 +08:00
|
|
|
#include <regex>
|
2024-12-11 08:44:14 +08:00
|
|
|
|
2024-12-11 23:23:48 +08:00
|
|
|
std::shared_ptr<spdlog::logger> g_Logger = nullptr;
|
2025-01-06 16:25:39 +08:00
|
|
|
std::shared_ptr<CServerConfig> g_Config = nullptr;
|
|
|
|
|
2025-01-06 18:59:11 +08:00
|
|
|
int parse_cmd(int argc, char** argv, CmdParam& param)
|
2024-12-16 09:40:57 +08:00
|
|
|
{
|
2025-01-06 16:25:39 +08:00
|
|
|
std::string intro("transmc cmd introduce.");
|
|
|
|
CLI::App app(intro);
|
|
|
|
|
|
|
|
app.add_option("-n, --number", param.use_config, "使用服务器地址组(值为使用--show中显示的序号)");
|
|
|
|
app.add_option("-a, --append", param.appendValue, "添加服务器地址组(地址格式:127.0.0.1:9898)");
|
|
|
|
app.add_flag("-s, --show", param.showValue, "查看服务器地址组");
|
|
|
|
app.add_option("-r, --remove", param.removeValue, "移除服务器地址组(值为使用--show中显示的序号)");
|
2025-01-06 18:59:11 +08:00
|
|
|
|
|
|
|
if (argc == 1) {
|
|
|
|
std::cout << app.help() << std::endl;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
// 这里的 CLI11_PARSE 在程序没有输入或者仅输入--help(-h)时,会直接返回,后面代码都不会执行。
|
|
|
|
// 当有自定义的参数被输入时,后面代码会执行。
|
2025-01-06 16:25:39 +08:00
|
|
|
try {
|
|
|
|
CLI11_PARSE(app, argc, argv);
|
|
|
|
} catch (const CLI::ParseError& e) {
|
2025-01-06 18:59:11 +08:00
|
|
|
return app.exit(e);
|
2025-01-06 16:25:39 +08:00
|
|
|
}
|
2025-01-06 18:59:11 +08:00
|
|
|
param.parsed = true;
|
|
|
|
return 0;
|
2024-12-16 09:40:57 +08:00
|
|
|
}
|
|
|
|
|
2025-01-06 16:25:39 +08:00
|
|
|
bool exec_cmd(const CmdParam& param, bool& run)
|
2024-12-16 09:40:57 +08:00
|
|
|
{
|
2025-01-06 16:25:39 +08:00
|
|
|
run = false;
|
|
|
|
// 如果是展示
|
|
|
|
if (param.showValue) {
|
|
|
|
std::vector<TransmSet> set;
|
|
|
|
if (!g_Config->read_ini(set)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
for (const auto& item : set) {
|
|
|
|
g_Logger->info("{} => {}:{}", item.group, item.ip, item.port);
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if (param.use_config != -1) {
|
|
|
|
run = true;
|
|
|
|
return true;
|
2024-12-16 09:40:57 +08:00
|
|
|
}
|
2025-01-06 16:25:39 +08:00
|
|
|
if (!param.appendValue.empty() && !param.removeValue.empty()) {
|
|
|
|
g_Logger->error("append and remove can't simultaneous operate!");
|
2024-12-16 09:40:57 +08:00
|
|
|
return false;
|
|
|
|
}
|
2025-01-06 16:25:39 +08:00
|
|
|
if (!param.appendValue.empty()) {
|
|
|
|
std::regex rg(R"(([^:]+):(\d+))");
|
|
|
|
std::smatch match;
|
|
|
|
if (!std::regex_search(param.appendValue, match, rg)) {
|
|
|
|
g_Logger->error("append invalid format!");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
std::string ip = match[1].str();
|
|
|
|
std::string port = match[2].str();
|
|
|
|
if (!g_Config->append_ini(ip, std::stol(port))) {
|
|
|
|
g_Logger->error("add {}:{} failed.", ip, port);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
g_Logger->info("add {}:{} success.", ip, port);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if (!param.removeValue.empty()) {
|
|
|
|
if (!g_Config->remove_ini(std::stol(param.removeValue))) {
|
2025-01-06 18:59:11 +08:00
|
|
|
g_Logger->error("remove config num=[{}] failed, please check!", param.removeValue);
|
2025-01-06 16:25:39 +08:00
|
|
|
return false;
|
|
|
|
}
|
2025-01-06 18:59:11 +08:00
|
|
|
g_Logger->info("remove config num=[{}] success!", param.removeValue);
|
2025-01-06 16:25:39 +08:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
g_Logger->error("not matched!", param.removeValue);
|
|
|
|
return false;
|
2024-12-16 09:40:57 +08:00
|
|
|
}
|
2024-12-11 10:22:14 +08:00
|
|
|
|
2024-12-16 09:40:57 +08:00
|
|
|
int main(int argc, char* argv[])
|
2024-12-11 08:44:14 +08:00
|
|
|
{
|
2024-12-16 14:12:02 +08:00
|
|
|
auto log_path = ofen::COfPath::to_full("client.log");
|
|
|
|
g_Logger = get_logger("client", log_path);
|
2025-01-06 16:25:39 +08:00
|
|
|
g_Config = std::make_shared<CServerConfig>(g_Logger);
|
|
|
|
if (!g_Config->baseInit()) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool run = false;
|
|
|
|
CmdParam param;
|
2025-01-06 18:59:11 +08:00
|
|
|
parse_cmd(argc, argv, param);
|
|
|
|
if (!param.parsed) {
|
2025-01-06 16:25:39 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (!exec_cmd(param, run)) {
|
|
|
|
g_Logger->error("exec_cmd failed!");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (!run) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::vector<TransmSet> set;
|
|
|
|
if (!g_Config->read_ini(set)) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
TransmSet use;
|
|
|
|
if (!g_Config->get_ini(set, param.use_config, use)) {
|
2025-01-06 18:59:11 +08:00
|
|
|
g_Logger->error("Not found config by num:[{}]", param.use_config);
|
2024-12-16 09:40:57 +08:00
|
|
|
return -1;
|
|
|
|
}
|
2025-01-06 18:59:11 +08:00
|
|
|
g_Logger->info("Configure At {} under {} on {}", VERSION_BUILD_DATE, VERSION_GIT_HASH,
|
|
|
|
VERSION_GIT_BRANCH);
|
2025-01-06 16:25:39 +08:00
|
|
|
g_Logger->info("use ip:[{}], port:[{}]", use.ip, use.port);
|
2024-12-11 23:23:48 +08:00
|
|
|
CClient client(g_Logger);
|
2025-01-06 16:25:39 +08:00
|
|
|
client.run(use.ip, std::to_string(use.port));
|
|
|
|
g_Logger->info("exit ==========");
|
2024-12-11 08:44:14 +08:00
|
|
|
return 0;
|
|
|
|
}
|