From a59c8e48d9ee2e1bc198737eb19d460adfd64ea6 Mon Sep 17 00:00:00 2001 From: Vladislav Ostapov Date: Thu, 30 Jan 2025 10:59:37 +0300 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D1=87=D0=B0:=20=D0=B8=D0=BC=D1=8F?= =?UTF-8?q?=20=D0=B2=D0=B5=D0=B1-=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- front-generator/render-params.json | 6 +- front-generator/template/common/widgets.j2 | 12 +- front-generator/template/main.html | 4 + src/terminal_api_driver.cpp | 121 ++++++++++++--------- static/main-scpc.html | 11 ++ static/main-tdma.html | 11 ++ 6 files changed, 111 insertions(+), 54 deletions(-) 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) %} + {{ widget.label }} + +{% 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(() => {})