фича: имя веб-сервера

This commit is contained in:
2025-01-30 10:59:37 +03:00
parent 995a6156bc
commit a59c8e48d9
6 changed files with 111 additions and 54 deletions

View File

@@ -70,10 +70,17 @@ static const char* boolAsStr(bool value) {
class TerminalNetworkSettings {
public:
std::string managementIp, managementGateway, dataIp;
std::string managementIp, managementGateway, dataIp, serverName;
bool isL2 = true;
unsigned int dataMtu = 1500;
#ifdef MODEM_IS_SCPC
static constexpr const char* DEFAULT_SERVER_NAME = "RCSM-101";
#endif
#ifdef MODEM_IS_TDMA
static constexpr const char* DEFAULT_SERVER_NAME = "RCSM-101 TDMA";
#endif
TerminalNetworkSettings() = default;
TerminalNetworkSettings(const TerminalNetworkSettings& src) = default;
~TerminalNetworkSettings() = default;
@@ -86,6 +93,7 @@ public:
isL2 = true;
dataIp = "0.0.0.0";
dataMtu = 1500;
serverName = DEFAULT_SERVER_NAME;
}
};
@@ -113,6 +121,21 @@ static std::ostream& operator<<(std::ostream& out, CP_Result result) {
return out;
}
std::string makeTimepointFromMillis(int64_t unix_time_ms) {
// Преобразуем миллисекунды в микросекунды для std::chrono
auto time_point = std::chrono::time_point<std::chrono::system_clock,
std::chrono::microseconds>(std::chrono::microseconds(unix_time_ms * 1000));
auto tp = std::chrono::system_clock::to_time_t(time_point);
tm* t = std::localtime(&tp);
std::stringstream ss;
ss << std::put_time(t, "%y-%m-%d %H:%M:%S");
auto ms = (unix_time_ms % 1000);
ss << '.' << std::setw(3) << std::setfill('0') << ms;
return ss.str();
}
class api_driver::StatisticsLogger {
public:
StatisticsLogger(): timeStart(TIME_NOW()) {}
@@ -172,7 +195,7 @@ public:
if (!logEn) return;
if (this->logFile.is_open()) {
std::stringstream res;
res << TIME_NOW() - this->timeStart << '\t';
res << makeTimepointFromMillis(TIME_NOW()) << '\t';
res << item.cnt_ok << '\t';
res << item.cnt_bad << '\t';
res << item.fine_freq_dem << '\t';
@@ -295,26 +318,47 @@ private:
}
}
void unsafeLoadNetworkSettings(TerminalNetworkSettings& s) {
s.loadDefaults();
logCpApiError("api_driver::TerminalApiDaemon::unsafeLoadNetworkSettings()->CP_GetNetwork(addr)", CP_GetNetwork(sid, "addr", &s.managementIp));
// logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_GetNetwork(mask)", CP_GetNetwork(sid, "mask", &tmp));
// s.managementIp += "/";
// s.managementIp += std::to_string(calculateSubnetMask(tmp));
logCpApiError("api_driver::TerminalApiDaemon::unsafeLoadNetworkSettings()->CP_GetNetwork(gateway)", CP_GetNetwork(sid, "gateway", &s.managementGateway));
std::string nm; logCpApiError("api_driver::TerminalApiDaemon::unsafeLoadNetworkSettings()->CP_GetNetwork(mode)", CP_GetNetwork(sid, "mode", &nm));
if (nm == "tun") {
s.isL2 = false;
logCpApiError("api_driver::TerminalApiDaemon::unsafeLoadNetworkSettings()->CP_GetNetwork(addr_data)", CP_GetNetwork(sid, "addr_data", &s.dataIp));
} else {
s.isL2 = true;
}
logCpApiError("api_driver::TerminalApiDaemon::unsafeLoadNetworkSettings()->CP_GetNetwork(mode)", CP_GetNetwork(sid, "mode", &nm));
s.dataMtu = 1500;
logCpApiError("api_driver::TerminalApiDaemon::unsafeLoadNetworkSettings()->CP_GetNetwork(name_serv)", CP_GetNetwork(sid, "name_serv", &s.serverName));
if (s.serverName.empty()) {
s.serverName = TerminalNetworkSettings::DEFAULT_SERVER_NAME;
}
}
void unsafStoreNetworkSettings(TerminalNetworkSettings& s) {
logCpApiError("api_driver::TerminalApiDaemon::unsafStoreNetworkSettings()->CP_SetNetwork(mode)", CP_SetNetwork(sid, "mode", s.isL2 ? "tap" : "tun"));
logCpApiError("api_driver::TerminalApiDaemon::unsafStoreNetworkSettings()->CP_SetNetwork(addr)", CP_SetNetwork(sid, "addr", s.managementIp.c_str()));
if (!s.isL2) {
logCpApiError("api_driver::TerminalApiDaemon::unsafStoreNetworkSettings()->CP_SetNetwork(addr_data)", CP_SetNetwork(sid, "addr_data", s.dataIp.c_str()));
// TODO маска не устанавливается, потому что в API этого нет
}
logCpApiError("api_driver::TerminalApiDaemon::unsafStoreNetworkSettings()->CP_SetNetwork(mask)", CP_SetNetwork(sid, "mask", "255.255.255.0"));
logCpApiError("api_driver::TerminalApiDaemon::unsafStoreNetworkSettings()->CP_SetNetwork(gateway)", CP_SetNetwork(sid, "gateway", s.managementGateway.c_str()));
// TODO MTU не устанавливается, потому что в API этого нет
logCpApiError("api_driver::TerminalApiDaemon::unsafeLoadNetworkSettings()->CP_SetNetwork(name_serv)", CP_SetNetwork(sid, "name_serv", s.serverName.c_str()));
}
void updateNetworkSettings() {
TerminalNetworkSettings s;
std::lock_guard lock(this->cpApiMutex);
logCpApiError("api_driver::TerminalApiDaemon::updateNetworkSettings()->CP_GetNetwork(addr)", CP_GetNetwork(sid, "addr", &s.managementIp));
// s.managementIp = tmp + "/";
// tmp.clear(); logCpApiError("api_driver::TerminalApiDaemon::updateNetworkSettings()->CP_GetNetwork(mask)", CP_GetNetwork(sid, "mask", &tmp));
// s.managementIp += std::to_string(calculateSubnetMask(tmp));
logCpApiError("api_driver::TerminalApiDaemon::updateNetworkSettings()->CP_GetNetwork(gateway)", CP_GetNetwork(sid, "gateway", &s.managementGateway));
std::string nm; logCpApiError("api_driver::TerminalApiDaemon::updateNetworkSettings()->CP_GetNetwork(mode)", CP_GetNetwork(sid, "mode", &nm));
if (nm == "tun") {
s.isL2 = false;
logCpApiError("api_driver::TerminalApiDaemon::updateNetworkSettings()->CP_GetNetwork(addr_data)", CP_GetNetwork(sid, "addr_data", &s.dataIp));
// s.dataIp += "/24";
} else {
s.isL2 = true;
// s.dataIp = "0.0.0.0/24";
s.dataIp = "0.0.0.0";
}
s.dataMtu = 1500;
unsafeLoadNetworkSettings(s);
{
std::lock_guard lock2(this->networkSettingsMutex);
@@ -337,6 +381,7 @@ private:
{
std::lock_guard _lock(this->stateMutex);
this->deviceInitState = "Not connected to API";
this->networkSettings.loadDefaults();
}
unsigned int access{};
@@ -705,34 +750,10 @@ public:
std::lock_guard lock(this->cpApiMutex);
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetDmaDebug(begin_save_config)", CP_SetDmaDebug(sid, "begin_save_config", ""));
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetNetwork(mode)", CP_SetNetwork(sid, "mode", s.isL2 ? "tap" : "tun"));
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetNetwork(addr)", CP_SetNetwork(sid, "addr", s.managementIp.c_str()));
if (!s.isL2) {
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetNetwork(addr_data)", CP_SetNetwork(sid, "addr_data", s.dataIp.c_str()));
// TODO маска не устанавливается, потому что в API этого нет
}
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetNetwork(mask)", CP_SetNetwork(sid, "mask", "255.255.255.0"));
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_SetNetwork(gateway)", CP_SetNetwork(sid, "gateway", s.managementGateway.c_str()));
// TODO MTU не устанавливается, потому что в API этого нет
unsafStoreNetworkSettings(s);
if (readback) {
s.loadDefaults();
s.managementIp.clear();
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_GetNetwork(addr)", CP_GetNetwork(sid, "addr", &s.managementIp));
// logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_GetNetwork(mask)", CP_GetNetwork(sid, "mask", &tmp));
// s.managementIp += "/";
// s.managementIp += std::to_string(calculateSubnetMask(tmp));
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_GetNetwork(gateway)", CP_GetNetwork(sid, "gateway", &s.managementGateway));
std::string nm; logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_GetNetwork(mode)", CP_GetNetwork(sid, "mode", &nm));
if (nm == "tun") {
s.isL2 = false;
logCpApiError("api_driver::TerminalApiDaemon::setNetworkSettings()->CP_GetNetwork(addr_data)", CP_GetNetwork(sid, "addr_data", &s.dataIp));
} else {
s.isL2 = true;
s.dataIp = "0.0.0.0";
}
s.dataMtu = 1500;
unsafeLoadNetworkSettings(s);
{
std::lock_guard lock2(this->networkSettingsMutex);
this->networkSettings = s;
@@ -1085,11 +1106,12 @@ std::string api_driver::ApiDriver::loadSettings() const {
result << ",\"qosProfile\":" << qosClasses;
// сеть
result << ",\"netManagementIp\":\n" << buildEscapedString(network.managementIp);
result << ",\"netIsL2\":\n" << boolAsStr(network.isL2);
result << ",\"netManagementGateway\":\n" << buildEscapedString(network.managementGateway);
result << ",\"netDataIp\":\n" << buildEscapedString(network.dataIp);
result << ",\"netDataMtu\":\n" << network.dataMtu;
result << "\n,\"netManagementIp\":" << buildEscapedString(network.managementIp);
result << ",\"netIsL2\":" << boolAsStr(network.isL2);
result << ",\"netManagementGateway\":" << buildEscapedString(network.managementGateway);
result << ",\"netDataIp\":" << buildEscapedString(network.dataIp);
result << ",\"netDataMtu\":" << network.dataMtu;
result << ",\"netServerName\":" << buildEscapedString(network.serverName);
result << "}";
return result.str();
@@ -1275,6 +1297,7 @@ void api_driver::ApiDriver::setNetworkSettings(boost::property_tree::ptree &pt)
s.isL2 = pt.get<bool>("netIsL2");
s.dataIp = pt.get<std::string>("netDataIp");
s.dataMtu = pt.get<unsigned int>("netDataMtu");
s.serverName = pt.get<std::string>("netServerName");
daemon->setNetworkSettings(s);
}