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 ULTRASUCK | {{ stat_device.zynq }} °C |
Температура FPGA | {{ stat_device.fpga }} °C |
- Эти настройки пока недоступны, но скоро разработчик это поправит. А пока смотри на крокодила, или купи разработчику банку пива колы для ускорения процесса) -
-Версия ПО | {{ param.firmware.firmwareVersion }} |
---|---|
ID модема | {{ param.firmware.modemUid }} |
Серийный номер | {{ param.firmware.modemSn }} |
MAC интерфейса управления | {{ param.firmware.macManagement }} |
MAC интерфейса управления | {{ param.firmware.macData }} |
+ Эти настройки пока недоступны, но скоро разработчик это поправит. А пока смотри на крокодила, или купи разработчику банку пива колы для ускорения процесса) +
+Последнее обновление статистики: {{ lastUpdateTime }}