From 484a6abe083e2e2e1def550dc32d2a587433648f Mon Sep 17 00:00:00 2001 From: Vladislav Ostapov Date: Wed, 13 Nov 2024 17:44:42 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B2=D1=81=D0=B5=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=B2=20=D0=B2=D0=B5=D0=B1,=20=D1=81=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B0=D0=BB=20cleanup=20=D0=B8=D0=BD=D1=82=D0=B5?= =?UTF-8?q?=D1=80=D1=84=D0=B5=D0=B9=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/connection.cpp | 6 +- src/terminal_api_driver.cpp | 78 +++++++++ static/fields.css | 8 +- static/main.html | 304 ++++++++++++++++++++++++++++++++---- 4 files changed, 362 insertions(+), 34 deletions(-) diff --git a/src/server/connection.cpp b/src/server/connection.cpp index 500a17c..39f9d75 100644 --- a/src/server/connection.cpp +++ b/src/server/connection.cpp @@ -87,7 +87,11 @@ namespace http::server { } void SslConnection::stop() { - stream_.shutdown(); + try { + stream_.shutdown(); + } catch (std::exception& e) { + BOOST_LOG_TRIVIAL(warning) << "SslConnection::stop(): Can't shutdown ssl socket: " << e.what(); + } } SslConnection::~SslConnection() = default; diff --git a/src/terminal_api_driver.cpp b/src/terminal_api_driver.cpp index 8680259..e36e886 100644 --- a/src/terminal_api_driver.cpp +++ b/src/terminal_api_driver.cpp @@ -15,6 +15,33 @@ typedef boost::property_tree::ptree::path_type json_path; static constexpr const char* DEFAULT_QOS_CLASSES = R"({"rt1":[],"rt2":[],"rt3":[],"cd":[]})"; +static int calculateSubnetMask(const std::string& subnet_mask) { + int mask = 0; + std::istringstream iss(subnet_mask); + std::string octet; + while (std::getline(iss, octet, '.')) { + int octet_value = std::stoi(octet); + for (int i = 7; i >= 0; i--) { + if (octet_value & (1 << i)) { + mask++; + } + } + } + return mask; +} + +class TerminalNetworkSettings { +public: + std::string managementIp, managementGateway, mode, dataIp; + unsigned int dataMtu = 1500; + + TerminalNetworkSettings() = default; + TerminalNetworkSettings(const TerminalNetworkSettings& src) = default; + ~TerminalNetworkSettings() = default; + + TerminalNetworkSettings& operator= (const TerminalNetworkSettings& src) = default; +}; + /** * Этот демон нужен для того, чтобы получать статистику из API, а так же корректно сохранять настройки */ @@ -67,6 +94,31 @@ private: } } + void updateNetworkSettings() { + TerminalNetworkSettings s; + std::string tmp; + std::lock_guard lock(this->cpApiMutex); + CP_GetNetwork(sid, "addr", &s.managementIp); + CP_GetNetwork(sid, "mask", &tmp); + s.managementIp += "/"; + s.managementIp += std::to_string(calculateSubnetMask(tmp)); + CP_GetNetwork(sid, "gateway", &s.managementGateway); + tmp.clear(); CP_GetNetwork(sid, "mode", &tmp); + if (tmp == "tun") { + s.mode = "l3"; + CP_GetNetwork(sid, "addr_data", &s.dataIp); + } else { + s.mode = "l2"; + s.dataIp = "0.0.0.0/24"; + } + s.dataMtu = 1500; + + { + std::lock_guard lock2(this->networkSettingsMutex); + this->networkSettings = s; + } + } + void updateQos() { bool tmp1; std::string tmp2; std::scoped_lock lock{this->cpApiMutex}; @@ -120,6 +172,15 @@ private: BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon::updateSettings(): " << e.what(); } }}, + // обновление кеша настроек сети (делается отдельно) + {.lastUpdate = 0, .periodMs = CACHE_SETTINGS_UPDATE_MS, .callback = [this]() { + try { + this->updateSettings(); + BOOST_LOG_TRIVIAL(debug) << "api_driver::TerminalApiDaemon::updateSettings(): success update!"; + } catch (std::exception& e) { + BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon::updateSettings(): " << e.what(); + } + }}, // обновление кеша QoS {.lastUpdate = 0, .periodMs = CACHE_QOS_UPDATE_MS, .callback = [this]() { try { @@ -164,6 +225,9 @@ private: DPDI_parmeters dpdiSettings{}; buc_lnb_settings bucLnbSettings{}; + std::shared_mutex networkSettingsMutex; + TerminalNetworkSettings networkSettings; + std::shared_mutex qosSettingsMutex; bool qosEnabled; std::string qosClassesJson; @@ -202,6 +266,11 @@ public: } } + void getNetworkSettings(TerminalNetworkSettings& dest) { + std::shared_lock lock(this->networkSettingsMutex); + dest = this->networkSettings; + } + void getQosSettings(bool& isEnabled, std::string& json) { std::shared_lock lock(this->settingsMutex); isEnabled = this->qosEnabled; @@ -454,7 +523,9 @@ std::string api_driver::ApiDriver::loadSettings() const { ACM_parameters_serv_ acmSettings{}; DPDI_parmeters dpdiSettings{}; buc_lnb_settings bucLnb{}; + TerminalNetworkSettings network; daemon->getSettings(&modSettings, &demodSettings, &acmSettings, &dpdiSettings, &bucLnb); + daemon->getNetworkSettings(network); // uint32_t modulatorModcod; // { @@ -528,6 +599,13 @@ std::string api_driver::ApiDriver::loadSettings() const { result << ",\n\"qos.enabled\":" << boolAsStr(qosEnabled); result << ",\"qos.profile\":" << qosClasses; + // сеть + result << ",\"network.managementIp\":\n" << buildEscapedString(network.managementIp); + result << ",\"network.managementGateway\":\n" << buildEscapedString(network.managementGateway); + result << ",\"network.mode\":\n" << buildEscapedString(network.mode); + result << ",\"network.dataIp\":\n" << buildEscapedString(network.dataIp); + result << ",\"network.dataMtu\":\n" << network.dataMtu; + result << "}"; return result.str(); } diff --git a/static/fields.css b/static/fields.css index 0450463..596461d 100644 --- a/static/fields.css +++ b/static/fields.css @@ -85,11 +85,11 @@ padding: 1em; } -.tabs-item-flex-container th { +.settings-set-container th { text-align: left; padding-right: 1em; } -.tabs-item-flex-container td { +.settings-set-container td { min-width: 10em; } .tabs-item-flex-container h2 { @@ -124,6 +124,10 @@ label { border-bottom: solid 2px var(--brand-text); } +.settings-set-container input:invalid { + border: solid 1px var(--text-bad); +} + /* костыль для браузеров, которые некорректно стилизуют элементы option */ select * { background: var(--bg-selected); diff --git a/static/main.html b/static/main.html index aef947b..48d3c49 100644 --- a/static/main.html +++ b/static/main.html @@ -106,7 +106,7 @@ - +
Температура ADRV{{ stat_device.adrv }} °C
Температура ZYNQ ULTRASUCK{{ stat_device.zynq }} °C
Температура ZYNQ {{ stat_device.zynq }} °C
Температура FPGA{{ stat_device.fpga }} °C
@@ -421,7 +421,7 @@ -
+

Настройки QoS

- + +

Настройки TCP-акселерации

+
+ + +
+
-
-

- Эти настройки пока недоступны, но скоро разработчик это поправит. А пока смотри на крокодила, или купи разработчику банку пива колы для ускорения процесса) -

- krokodil - +
+

Настройки сети

+
+

Интерфейс управления

+ + + +

Интерфейс данных

+ + + +
+
+

Отладка

+ + + + + + +
+
+

Управление ПО

+ + + + + + + + +
Версия ПО{{ param.firmware.firmwareVersion }}
ID модема{{ param.firmware.modemUid }}
Серийный номер{{ param.firmware.modemSn }}
MAC интерфейса управления{{ param.firmware.macManagement }}
MAC интерфейса управления{{ param.firmware.macData }}
+
+ +
+
+ +
+ +

Обновление ПО

+ + +
+ +

Последнее обновление статистики: {{ lastUpdateTime }}

@@ -531,13 +638,12 @@