diff --git a/front-generator/render-params.json b/front-generator/render-params.json
index 10b995e..a5d5461 100644
--- a/front-generator/render-params.json
+++ b/front-generator/render-params.json
@@ -107,7 +107,8 @@
"values": [{"label": "Маршрутизатор", "value": "false"}, {"label": "Коммутатор", "value": "true"}]
},
{"widget": "ip-address", "label": "Интерфейс данных (/24)", "name": "netDataIp", "v_show": "paramNetwork.netIsL2 === false"},
- {"widget": "number", "label": "MTU интерфейса данных", "name": "netDataMtu", "min": 1500, "step": 1, "max": 2000}
+ {"widget": "number", "label": "MTU интерфейса данных", "name": "netDataMtu", "min": 1500, "step": 1, "max": 2000},
+ {"widget": "text", "label": "Имя веб-сервера", "name": "netServerName"}
]
}
]
@@ -321,7 +322,8 @@
"values": [{"label": "Маршрутизатор", "value": "false"}, {"label": "Коммутатор", "value": "true"}]
},
{"widget": "ip-address", "label": "Интерфейс данных (/24)", "name": "netDataIp", "v_show": "paramNetwork.netIsL2 === false"},
- {"widget": "number", "label": "MTU интерфейса данных", "name": "netDataMtu", "min": 1500, "step": 1, "max": 2000}
+ {"widget": "number", "label": "MTU интерфейса данных", "name": "netDataMtu", "min": 1500, "step": 1, "max": 2000},
+ {"widget": "text", "label": "Имя веб-сервера", "name": "netServerName"}
]
}
]
diff --git a/front-generator/template/common/widgets.j2 b/front-generator/template/common/widgets.j2
index 923397c..e4441da 100644
--- a/front-generator/template/common/widgets.j2
+++ b/front-generator/template/common/widgets.j2
@@ -59,6 +59,11 @@
{% endmacro %}
+{% macro build_widget_text(param_group, widget) %}{% endmacro %}
+
{% macro build_widget(param_group, widget) %}{% if widget.widget == 'flex-container' %}{{ build_widget_flex_container(param_group, widget) }}
{% elif widget.widget == 'settings-container' %}{{ build_widget_settings_container(param_group, widget) }}
{% elif widget.widget == 'h2' %}
{{ widget.label }}
@@ -73,21 +78,22 @@
{% elif widget.widget == 'modulation-modcod' %}{{ build_widget_modulation_modcod(param_group, widget) }}
{% elif widget.widget == 'modulation-speed' %}{{ build_widget_modulation_speed(param_group, widget) }}
{% elif widget.widget == 'ip-address' %}{{ build_widget_ip_address(param_group, widget) }}
+{% elif widget.widget == 'text' %}{{ build_widget_text(param_group, widget) }}
{% else %}Widget '{{ widget.widget }}' not defined!
{{ widget }}
{% endif %}
{% endmacro %}
{% macro build_getter_js(param_group, widget) %}{% if widget.widget in ['flex-container', 'settings-container', 'h2', 'h3', 'submit', 'watch', 'watch-expr'] %}null{%
-elif widget.widget in ['checkbox', 'number', 'select', 'ip-address', 'modulation-modcod', 'modulation-speed'] %}this.param{{ param_group | title }}.{{ widget.name }}{%
+elif widget.widget in ['checkbox', 'number', 'select', 'ip-address', 'modulation-modcod', 'modulation-speed', 'text'] %}this.param{{ param_group | title }}.{{ widget.name }}{%
elif widget.widget == 'number-int' %}parseFloat(this.param{{ param_group | title }}.{{ widget.name }}.replace(/[^0-9,.]/g, '').replace(',', '.')){%
else %}Widget '{{ widget.widget }}' not defined!
{{ widget }}
{% endif %}{% endmacro %}
{% macro build_setter_js(param_group, widget, expr) %}{% if widget.widget in ['flex-container', 'settings-container', 'h2', 'h3', 'submit', 'watch', 'watch-expr'] %}null{%
-elif widget.widget in ['checkbox', 'number', 'select', 'ip-address', 'modulation-modcod', 'modulation-speed'] %}this.param{{ param_group | title }}.{{ widget.name }} = {{ expr }}{%
+elif widget.widget in ['checkbox', 'number', 'select', 'ip-address', 'modulation-modcod', 'modulation-speed', 'text'] %}this.param{{ param_group | title }}.{{ widget.name }} = {{ expr }}{%
elif widget.widget == 'number-int' %}this.param{{ param_group | title }}.{{ widget.name }} = this.inputFormatNumber({{ expr }}, {{ js_build_number_number_validator(widget) }}){%
else %}Widget '{{ widget.widget }}' not defined!
{{ widget }}
{% endif %}{% endmacro %}
{% macro build_setter(param_group, widget, expr) %}{% if widget.widget in ['flex-container', 'settings-container', 'h2', 'h3', 'submit', 'watch', 'watch-expr'] %}null{%
-elif widget.widget in ['checkbox', 'number', 'select', 'ip-address', 'modulation-modcod', 'modulation-speed'] %}param{{ param_group | title }}.{{ widget.name }} = {{ expr }}{%
+elif widget.widget in ['checkbox', 'number', 'select', 'ip-address', 'modulation-modcod', 'modulation-speed', 'text'] %}param{{ param_group | title }}.{{ widget.name }} = {{ expr }}{%
elif widget.widget == 'number-int' %}param{{ param_group | title }}.{{ widget.name }} = inputFormatNumber({{ expr }}, {{ js_build_number_number_validator(widget) }}){%
else %}Widget '{{ widget.widget }}' not defined!
{{ widget }}
{% endif %}{% endmacro %}
diff --git a/front-generator/template/main.html b/front-generator/template/main.html
index 26be629..8bfdfad 100644
--- a/front-generator/template/main.html
+++ b/front-generator/template/main.html
@@ -186,6 +186,10 @@
{% if 'qos' in tab_names_array %}
this.updateQosSettings(vals)
{% endif %}
+
+ if ('netServerName' in vals['settings']) {
+ document.getElementsByTagName('title')[0].innerText = vals['settings']['netServerName']
+ }
}
doFetchSettings().then(() => {})
diff --git a/src/terminal_api_driver.cpp b/src/terminal_api_driver.cpp
index 0b3ac93..72bdcbe 100644
--- a/src/terminal_api_driver.cpp
+++ b/src/terminal_api_driver.cpp
@@ -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::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("netIsL2");
s.dataIp = pt.get("netDataIp");
s.dataMtu = pt.get("netDataMtu");
+ s.serverName = pt.get("netServerName");
daemon->setNetworkSettings(s);
}
diff --git a/static/main-scpc.html b/static/main-scpc.html
index 26a0258..02abf42 100644
--- a/static/main-scpc.html
+++ b/static/main-scpc.html
@@ -514,6 +514,10 @@
+
@@ -639,6 +643,7 @@
netIsL2: false,
netDataIp: null,
netDataMtu: 1500,
+ netServerName: null,
},
// ========== include end from 'common/all-params-data.js.j2'
@@ -871,6 +876,7 @@
"netIsL2": this.paramNetwork.netIsL2,
"netDataIp": this.paramNetwork.netDataIp,
"netDataMtu": this.paramNetwork.netDataMtu,
+ "netServerName": this.paramNetwork.netServerName,
}
this.submitStatus.network = true
@@ -944,6 +950,7 @@
this.paramNetwork.netIsL2 = vals["settings"]["netIsL2"]
this.paramNetwork.netDataIp = vals["settings"]["netDataIp"]
this.paramNetwork.netDataMtu = vals["settings"]["netDataMtu"]
+ this.paramNetwork.netServerName = vals["settings"]["netServerName"]
},
// ========== include end from 'common/all-params-methods.js.j2'
@@ -1379,6 +1386,10 @@
this.updateTcpaccelSettings(vals)
this.updateNetworkSettings(vals)
this.updateQosSettings(vals)
+
+ if ('netServerName' in vals['settings']) {
+ document.getElementsByTagName('title')[0].innerText = vals['settings']['netServerName']
+ }
}
doFetchSettings().then(() => {})
diff --git a/static/main-tdma.html b/static/main-tdma.html
index aa57eac..27f2858 100644
--- a/static/main-tdma.html
+++ b/static/main-tdma.html
@@ -221,6 +221,10 @@
+
@@ -310,6 +314,7 @@
netIsL2: false,
netDataIp: null,
netDataMtu: 1500,
+ netServerName: null,
},
// ========== include end from 'common/all-params-data.js.j2'
@@ -471,6 +476,7 @@
"netIsL2": this.paramNetwork.netIsL2,
"netDataIp": this.paramNetwork.netDataIp,
"netDataMtu": this.paramNetwork.netDataMtu,
+ "netServerName": this.paramNetwork.netServerName,
}
this.submitStatus.network = true
@@ -508,6 +514,7 @@
this.paramNetwork.netIsL2 = vals["settings"]["netIsL2"]
this.paramNetwork.netDataIp = vals["settings"]["netDataIp"]
this.paramNetwork.netDataMtu = vals["settings"]["netDataMtu"]
+ this.paramNetwork.netServerName = vals["settings"]["netServerName"]
},
// ========== include end from 'common/all-params-methods.js.j2'
@@ -675,6 +682,10 @@
this.updateRxtxSettings(vals)
this.updateBuclnbSettings(vals)
this.updateNetworkSettings(vals)
+
+ if ('netServerName' in vals['settings']) {
+ document.getElementsByTagName('title')[0].innerText = vals['settings']['netServerName']
+ }
}
doFetchSettings().then(() => {})