добавил все настройки в веб, сделал cleanup интерфейса
This commit is contained in:
parent
9577ac844d
commit
484a6abe08
@ -87,7 +87,11 @@ namespace http::server {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SslConnection::stop() {
|
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;
|
SslConnection::~SslConnection() = default;
|
||||||
|
@ -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 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, а так же корректно сохранять настройки
|
* Этот демон нужен для того, чтобы получать статистику из 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() {
|
void updateQos() {
|
||||||
bool tmp1; std::string tmp2;
|
bool tmp1; std::string tmp2;
|
||||||
std::scoped_lock lock{this->cpApiMutex};
|
std::scoped_lock lock{this->cpApiMutex};
|
||||||
@ -120,6 +172,15 @@ private:
|
|||||||
BOOST_LOG_TRIVIAL(error) << "api_driver::TerminalApiDaemon::updateSettings(): " << e.what();
|
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
|
// обновление кеша QoS
|
||||||
{.lastUpdate = 0, .periodMs = CACHE_QOS_UPDATE_MS, .callback = [this]() {
|
{.lastUpdate = 0, .periodMs = CACHE_QOS_UPDATE_MS, .callback = [this]() {
|
||||||
try {
|
try {
|
||||||
@ -164,6 +225,9 @@ private:
|
|||||||
DPDI_parmeters dpdiSettings{};
|
DPDI_parmeters dpdiSettings{};
|
||||||
buc_lnb_settings bucLnbSettings{};
|
buc_lnb_settings bucLnbSettings{};
|
||||||
|
|
||||||
|
std::shared_mutex networkSettingsMutex;
|
||||||
|
TerminalNetworkSettings networkSettings;
|
||||||
|
|
||||||
std::shared_mutex qosSettingsMutex;
|
std::shared_mutex qosSettingsMutex;
|
||||||
bool qosEnabled;
|
bool qosEnabled;
|
||||||
std::string qosClassesJson;
|
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) {
|
void getQosSettings(bool& isEnabled, std::string& json) {
|
||||||
std::shared_lock lock(this->settingsMutex);
|
std::shared_lock lock(this->settingsMutex);
|
||||||
isEnabled = this->qosEnabled;
|
isEnabled = this->qosEnabled;
|
||||||
@ -454,7 +523,9 @@ std::string api_driver::ApiDriver::loadSettings() const {
|
|||||||
ACM_parameters_serv_ acmSettings{};
|
ACM_parameters_serv_ acmSettings{};
|
||||||
DPDI_parmeters dpdiSettings{};
|
DPDI_parmeters dpdiSettings{};
|
||||||
buc_lnb_settings bucLnb{};
|
buc_lnb_settings bucLnb{};
|
||||||
|
TerminalNetworkSettings network;
|
||||||
daemon->getSettings(&modSettings, &demodSettings, &acmSettings, &dpdiSettings, &bucLnb);
|
daemon->getSettings(&modSettings, &demodSettings, &acmSettings, &dpdiSettings, &bucLnb);
|
||||||
|
daemon->getNetworkSettings(network);
|
||||||
|
|
||||||
// uint32_t modulatorModcod;
|
// uint32_t modulatorModcod;
|
||||||
// {
|
// {
|
||||||
@ -528,6 +599,13 @@ std::string api_driver::ApiDriver::loadSettings() const {
|
|||||||
result << ",\n\"qos.enabled\":" << boolAsStr(qosEnabled);
|
result << ",\n\"qos.enabled\":" << boolAsStr(qosEnabled);
|
||||||
result << ",\"qos.profile\":" << qosClasses;
|
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 << "}";
|
result << "}";
|
||||||
return result.str();
|
return result.str();
|
||||||
}
|
}
|
||||||
|
@ -85,11 +85,11 @@
|
|||||||
padding: 1em;
|
padding: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tabs-item-flex-container th {
|
.settings-set-container th {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
padding-right: 1em;
|
padding-right: 1em;
|
||||||
}
|
}
|
||||||
.tabs-item-flex-container td {
|
.settings-set-container td {
|
||||||
min-width: 10em;
|
min-width: 10em;
|
||||||
}
|
}
|
||||||
.tabs-item-flex-container h2 {
|
.tabs-item-flex-container h2 {
|
||||||
@ -124,6 +124,10 @@ label {
|
|||||||
border-bottom: solid 2px var(--brand-text);
|
border-bottom: solid 2px var(--brand-text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.settings-set-container input:invalid {
|
||||||
|
border: solid 1px var(--text-bad);
|
||||||
|
}
|
||||||
|
|
||||||
/* костыль для браузеров, которые некорректно стилизуют элементы option */
|
/* костыль для браузеров, которые некорректно стилизуют элементы option */
|
||||||
select * {
|
select * {
|
||||||
background: var(--bg-selected);
|
background: var(--bg-selected);
|
||||||
|
304
static/main.html
304
static/main.html
@ -106,7 +106,7 @@
|
|||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><th>Температура ADRV</th><td>{{ stat_device.adrv }} °C</td></tr>
|
<tr><th>Температура ADRV</th><td>{{ stat_device.adrv }} °C</td></tr>
|
||||||
<tr><th>Температура ZYNQ ULTRASUCK</th><td>{{ stat_device.zynq }} °C</td></tr>
|
<tr><th>Температура ZYNQ <span hidden>ULTRASUCK</span></th><td>{{ stat_device.zynq }} °C</td></tr>
|
||||||
<tr><th>Температура FPGA</th><td>{{ stat_device.fpga }} °C</td></tr>
|
<tr><th>Температура FPGA</th><td>{{ stat_device.fpga }} °C</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@ -421,7 +421,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<button class="action-button" @click="settingsSubmitBucLnb()">Сохранить <span class="submit-spinner" v-show="submitStatus.bucLnb"></span></button>
|
<button class="action-button" @click="settingsSubmitBucLnb()">Сохранить <span class="submit-spinner" v-show="submitStatus.bucLnb"></span></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="tabs-body-item" v-if="activeTab === 'qos'">
|
<div class="tabs-body-item" v-if="activeTab === 'qos' && settingFetchComplete">
|
||||||
<h2>Настройки QoS</h2>
|
<h2>Настройки QoS</h2>
|
||||||
<div class="settings-set-container">
|
<div class="settings-set-container">
|
||||||
<label>
|
<label>
|
||||||
@ -478,19 +478,32 @@
|
|||||||
</summary>
|
</summary>
|
||||||
<label>
|
<label>
|
||||||
<span>VLAN ID</span>
|
<span>VLAN ID</span>
|
||||||
<input v-model="filter.vlan" type="text">
|
<!-- singleVlanExpr: (([0-9]{1,4}-[0-9]{1,4})|([0-9]{1,4}))-->
|
||||||
|
<!-- expr: ^(((single,)+single)|single)$-->
|
||||||
|
<input v-model="filter.vlan" type="text" pattern="^((((([0-9]{1,4}-[0-9]{1,4})|([0-9]{1,4})),)+(([0-9]{1,4}-[0-9]{1,4})|([0-9]{1,4})))|(([0-9]{1,4}-[0-9]{1,4})|([0-9]{1,4})))$">
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>Протокол L3</span>
|
<span>Протокол L3</span>
|
||||||
<input v-model="filter.proto" type="text">
|
<select v-model="filter.proto" multiple>
|
||||||
|
<option value="ah">AH</option>
|
||||||
|
<option value="comp">COMP</option>
|
||||||
|
<option value="dccp">DCCP</option>
|
||||||
|
<option value="esp">ESP</option>
|
||||||
|
<option value="icmp">ICMP</option>
|
||||||
|
<!-- <option value="icmpv6">ICMPv6</option>-->
|
||||||
|
<option value="sctp">SCTP</option>
|
||||||
|
<option value="tcp">TCP</option>
|
||||||
|
<option value="udp">UDP</option>
|
||||||
|
<option value="udplite">UDP LITE</option>
|
||||||
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>Порт источника</span>
|
<span>Порт источника</span>
|
||||||
<input v-model="filter.sport" type="text">
|
<input v-model="filter.sport" type="text" pattern="^((((([0-9]{1,5}-[0-9]{1,5})|([0-9]{1,5})),)+(([0-9]{1,5}-[0-9]{1,5})|([0-9]{1,5})))|(([0-9]{1,5}-[0-9]{1,5})|([0-9]{1,5})))$">
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>Порт назначения</span>
|
<span>Порт назначения</span>
|
||||||
<input v-model="filter.dport" type="text">
|
<input v-model="filter.dport" type="text" pattern="^((((([0-9]{1,5}-[0-9]{1,5})|([0-9]{1,5})),)+(([0-9]{1,5}-[0-9]{1,5})|([0-9]{1,5})))|(([0-9]{1,5}-[0-9]{1,5})|([0-9]{1,5})))$">
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span>IP источника</span>
|
<span>IP источника</span>
|
||||||
@ -512,17 +525,111 @@
|
|||||||
</details>
|
</details>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<button class="action-button" @click="settingsSubmitQoS()">Применить <span class="submit-spinner" v-show="submitStatus.qos"></span></button>
|
<button class="action-button" @click="settingsSubmitQoS()">Применить <span class="submit-spinner" v-show="submitStatus.qos"></span></button>
|
||||||
|
|
||||||
|
<h2>Настройки TCP-акселерации</h2>
|
||||||
|
<div class="settings-set-container">
|
||||||
|
<label>
|
||||||
|
<span>Активировать акселерацию</span>
|
||||||
|
<span class="toggle-input"><input type="checkbox" v-model="tcpAccel.en" /><span class="slider"></span></span>
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Максимальное количество соединений</span>
|
||||||
|
<input type="number" v-model="tcpAccel.maxConnections" min="1" max="10000" />
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<button class="action-button" @click="settingsSubmitTcpAccel()">Применить <span class="submit-spinner" v-show="submitStatus.tcpAccel"></span></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="tabs-body-item" v-if="activeTab === 'admin'">
|
<div class="tabs-body-item" v-if="activeTab === 'admin' && settingFetchComplete">
|
||||||
<p>
|
<h2>Настройки сети</h2>
|
||||||
Эти настройки пока недоступны, но скоро разработчик это поправит. А пока смотри на крокодила, или купи разработчику банку <span style="text-decoration: line-through;">пива</span> колы для ускорения процесса)
|
<div class="settings-set-container">
|
||||||
</p>
|
<h3>Интерфейс управления</h3>
|
||||||
<img loading="lazy" src="/images/krokodil_vzryvaetsya_hd.gif" alt="krokodil">
|
<label>
|
||||||
<video preload="auto" controls style="max-width: 100%">
|
<span>IP адрес/маска</span>
|
||||||
<source src="/vid/video_2024-11-06_15-49-35.mp4" type="video/mp4" />
|
<input v-model="param.network.managementIp" required type="text" pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}$">
|
||||||
</video>
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Шлюз интерфейса управления</span>
|
||||||
|
<input v-model="param.network.managementGateway" type="text" pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}$">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Режим модема</span>
|
||||||
|
<select v-model="param.network.mode">
|
||||||
|
<option value="l2">Коммутатор</option>
|
||||||
|
<option value="l3">Маршрутизатор</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
<h3>Интерфейс данных</h3>
|
||||||
|
<label v-if="param.network.mode === 'l3'">
|
||||||
|
<span>IP адрес/маска</span>
|
||||||
|
<input v-model="param.network.dataIp" required type="text" pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}$">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>MTU</span>
|
||||||
|
<input v-model="param.network.dataMtu" required type="number" min="1500" max="9000">
|
||||||
|
</label>
|
||||||
|
<button class="action-button" @click="settingsSubmitNetwork()">Применить <span class="submit-spinner" v-show="submitStatus.network"></span></button>
|
||||||
|
</div>
|
||||||
|
<div class="settings-set-container">
|
||||||
|
<h3>Отладка</h3>
|
||||||
|
<label>
|
||||||
|
<span>Передача отладочной информации</span>
|
||||||
|
<span class="toggle-input">
|
||||||
|
<input type="checkbox" v-model="param.debugSend.en" />
|
||||||
|
<span class="slider"></span>
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
<label v-if="param.debugSend.en">
|
||||||
|
<span>IP адрес получателя</span>
|
||||||
|
<input v-model="param.debugSend.receiverIp" required type="text" pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}$">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Порт для CinC</span>
|
||||||
|
<input v-model="param.debugSend.portCinC" type="number" pattern="^[0-9]{1,5}$">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Порт для CinC</span>
|
||||||
|
<input v-model="param.debugSend.portData" type="number" pattern="^[0-9]{1,5}$">
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Таймаут</span>
|
||||||
|
<input v-model="param.debugSend.timeout" type="number" pattern="^[0-9]+$">
|
||||||
|
</label>
|
||||||
|
<button class="action-button" @click="settingsSubmitDebugSend()">Применить <span class="submit-spinner" v-show="submitStatus.network"></span></button>
|
||||||
|
</div>
|
||||||
|
<div class="settings-set-container">
|
||||||
|
<h3>Управление ПО</h3>
|
||||||
|
<table>
|
||||||
|
<tbody>
|
||||||
|
<tr><th>Версия ПО</th><td>{{ param.firmware.firmwareVersion }}</td></tr>
|
||||||
|
<tr><th>ID модема</th><td>{{ param.firmware.modemUid }}</td></tr>
|
||||||
|
<tr><th>Серийный номер</th><td>{{ param.firmware.modemSn }}</td></tr>
|
||||||
|
<tr><th>MAC интерфейса управления</th><td>{{ param.firmware.macManagement }}</td></tr>
|
||||||
|
<tr><th>MAC интерфейса управления</th><td>{{ param.firmware.macData }}</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<div>
|
||||||
|
<button class="dangerous-button">Перезагрузить модем</button>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<button class="dangerous-button">Сбросить модем до заводских настроек</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3>Обновление ПО</h3>
|
||||||
|
<label>
|
||||||
|
<span>Порт для CinC</span>
|
||||||
|
<input type="file" accept="application/zip">
|
||||||
|
</label>
|
||||||
|
<button class="dangerous-button" @click="settingsUploadUpdate()">Обновить встроенное ПО</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div hidden>
|
||||||
|
<p>
|
||||||
|
Эти настройки пока недоступны, но скоро разработчик это поправит. А пока смотри на крокодила, или купи разработчику банку <span style="text-decoration: line-through;">пива</span> колы для ускорения процесса)
|
||||||
|
</p>
|
||||||
|
<div><img loading="lazy" src="/images/krokodil_vzryvaetsya_hd.gif" alt="krokodil"></div>
|
||||||
|
<div><video preload="auto" controls style="max-width: 100%"><source src="/vid/video_2024-11-06_15-49-35.mp4" type="video/mp4" /></video></div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p>Последнее обновление статистики: {{ lastUpdateTime }}</p>
|
<p>Последнее обновление статистики: {{ lastUpdateTime }}</p>
|
||||||
</div>
|
</div>
|
||||||
@ -531,13 +638,12 @@
|
|||||||
<!-- Версия для разработки включает в себя возможность вывода в консоль полезных уведомлений -->
|
<!-- Версия для разработки включает в себя возможность вывода в консоль полезных уведомлений -->
|
||||||
<script src="/js/vue.js"></script>
|
<script src="/js/vue.js"></script>
|
||||||
<script>
|
<script>
|
||||||
window.addEventListener('load', updateHeaderHeight);
|
|
||||||
window.addEventListener('resize', updateHeaderHeight);
|
|
||||||
|
|
||||||
function updateHeaderHeight() {
|
function updateHeaderHeight() {
|
||||||
const header = document.querySelector('header');
|
const header = document.querySelector('header');
|
||||||
document.body.style.setProperty('--header-height', `${header.offsetHeight}px`);
|
document.body.style.setProperty('--header-height', `${header.offsetHeight}px`);
|
||||||
}
|
}
|
||||||
|
window.addEventListener('load', updateHeaderHeight);
|
||||||
|
window.addEventListener('resize', updateHeaderHeight);
|
||||||
|
|
||||||
// const router = useRouter();
|
// const router = useRouter();
|
||||||
const availableTabs = ['monitoring', 'setup', 'qos', 'admin']
|
const availableTabs = ['monitoring', 'setup', 'qos', 'admin']
|
||||||
@ -689,6 +795,9 @@
|
|||||||
cinc: false,
|
cinc: false,
|
||||||
bucLnb: false,
|
bucLnb: false,
|
||||||
qos: false,
|
qos: false,
|
||||||
|
network: false,
|
||||||
|
debugSend: false,
|
||||||
|
tcpAccel: false,
|
||||||
},
|
},
|
||||||
|
|
||||||
stat_rx: {
|
stat_rx: {
|
||||||
@ -804,6 +913,29 @@
|
|||||||
refClk10M: false, // подача опоры 10MHz
|
refClk10M: false, // подача опоры 10MHz
|
||||||
autoStart: false
|
autoStart: false
|
||||||
},
|
},
|
||||||
|
|
||||||
|
network: {
|
||||||
|
managementIp: '', // 0.0.0.0/24
|
||||||
|
managementGateway: '',
|
||||||
|
mode: String, // l2 | l3
|
||||||
|
dataIp: '', //
|
||||||
|
dataMtu: 1500
|
||||||
|
},
|
||||||
|
debugSend: {
|
||||||
|
en: false,
|
||||||
|
receiverIp: '0.0.0.0', // 0.0.0.0
|
||||||
|
portCinC: 0,
|
||||||
|
portData: 0,
|
||||||
|
timeout: 0
|
||||||
|
},
|
||||||
|
// эти "настройки" - read only
|
||||||
|
firmware: {
|
||||||
|
firmwareVersion: '?',
|
||||||
|
modemUid: '?',
|
||||||
|
modemSn: '?',
|
||||||
|
macManagement: '?',
|
||||||
|
macData: '?',
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
qos: {
|
qos: {
|
||||||
@ -814,6 +946,11 @@
|
|||||||
cd: [],
|
cd: [],
|
||||||
},
|
},
|
||||||
|
|
||||||
|
tcpAccel: {
|
||||||
|
en: false,
|
||||||
|
maxConnections: 128
|
||||||
|
},
|
||||||
|
|
||||||
testState: false,
|
testState: false,
|
||||||
initState: '',
|
initState: '',
|
||||||
lastUpdateTime: new Date(),
|
lastUpdateTime: new Date(),
|
||||||
@ -1017,7 +1154,14 @@
|
|||||||
for (const fi in qc.filters) {
|
for (const fi in qc.filters) {
|
||||||
let filter = {}
|
let filter = {}
|
||||||
if (qc['filters'][fi].vlan !== "") { filter['vlan'] = qc['filters'][fi].vlan }
|
if (qc['filters'][fi].vlan !== "") { filter['vlan'] = qc['filters'][fi].vlan }
|
||||||
if (qc['filters'][fi].proto !== "") { filter['proto'] = qc['filters'][fi].proto }
|
if (qc['filters'][fi].proto !== "") {
|
||||||
|
let tmp = "";
|
||||||
|
for (let pid = 0; pid < qc['filters'][fi].proto.length; pid++) {
|
||||||
|
if (pid !== 0) { tmp += ',' }
|
||||||
|
tmp += qc['filters'][fi].proto[pid]
|
||||||
|
}
|
||||||
|
filter['proto'] = tmp
|
||||||
|
}
|
||||||
if (qc['filters'][fi].sport !== "") { filter['sport'] = qc['filters'][fi].sport }
|
if (qc['filters'][fi].sport !== "") { filter['sport'] = qc['filters'][fi].sport }
|
||||||
if (qc['filters'][fi].dport !== "") { filter['dport'] = qc['filters'][fi].dport }
|
if (qc['filters'][fi].dport !== "") { filter['dport'] = qc['filters'][fi].dport }
|
||||||
if (qc['filters'][fi].ip_src !== "") { filter['ip.src'] = qc['filters'][fi].ip_src }
|
if (qc['filters'][fi].ip_src !== "") { filter['ip.src'] = qc['filters'][fi].ip_src }
|
||||||
@ -1060,6 +1204,79 @@
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
settingsSubmitTcpAccel() {
|
||||||
|
if (this.submitStatus.tcpAccel) { return }
|
||||||
|
this.submitStatus.tcpAccel = true
|
||||||
|
fetch('/api/set/tcpAccel', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
"tcpAccel.en": this.tcpAccel.en,
|
||||||
|
"tcpAccel.maxConnections": this.tcpAccel.maxConnections
|
||||||
|
})
|
||||||
|
}).then(async (resp) => {
|
||||||
|
this.submitStatus.tcpAccel = false
|
||||||
|
this.updateNetworkSettings(await resp.json())
|
||||||
|
}).catch((reason) => {
|
||||||
|
this.submitStatus.tcpAccel = false
|
||||||
|
alert(`Ошибка при применении настроек: ${reason}`)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
settingsSubmitNetwork() {
|
||||||
|
if (this.submitStatus.network) { return }
|
||||||
|
let query = {
|
||||||
|
"network.managementIp": this.param.network.managementIp,
|
||||||
|
"network.managementGateway": this.param.network.managementGateway,
|
||||||
|
"network.mode": this.param.network.mode,
|
||||||
|
"network.dataIp": this.param.network.dataIp,
|
||||||
|
"network.dataMtu": this.param.network.dataMtu
|
||||||
|
}
|
||||||
|
if (confirm('Вы уверены, что хотите сохранить настройки сети? После этого модем может стать недоступным.')) {
|
||||||
|
this.submitStatus.network = true
|
||||||
|
fetch('/api/set/network', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify(query)
|
||||||
|
}).then(async (resp) => {
|
||||||
|
this.submitStatus.network = false
|
||||||
|
this.updateNetworkSettings(await resp.json())
|
||||||
|
}).catch((reason) => {
|
||||||
|
this.submitStatus.network = false
|
||||||
|
alert(`Ошибка при применении настроек: ${reason}`)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
settingsSubmitDebugSend() {
|
||||||
|
if (this.submitStatus.debugSend) { return }
|
||||||
|
let query = {
|
||||||
|
"debugSend.en": this.param.debugSend.en,
|
||||||
|
"debugSend.receiverIp": this.param.debugSend.receiverIp,
|
||||||
|
"debugSend.portCinC": this.param.debugSend.portCinC,
|
||||||
|
"debugSend.portData": this.param.debugSend.portData,
|
||||||
|
"debugSend.timeout": this.param.debugSend.timeout
|
||||||
|
}
|
||||||
|
this.submitStatus.debugSend = true
|
||||||
|
fetch('/api/set/debugSend', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify(query)
|
||||||
|
}).then(async (resp) => {
|
||||||
|
this.submitStatus.debugSend = false
|
||||||
|
this.updateNetworkSettings(await resp.json())
|
||||||
|
}).catch((reason) => {
|
||||||
|
this.submitStatus.debugSend = false
|
||||||
|
alert(`Ошибка при применении настроек: ${reason}`)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
performUpdateSettings(reloadParts) {
|
performUpdateSettings(reloadParts) {
|
||||||
const doFetchSettings = async () => {
|
const doFetchSettings = async () => {
|
||||||
let d = await fetch("/api/get/settings")
|
let d = await fetch("/api/get/settings")
|
||||||
@ -1176,7 +1393,7 @@
|
|||||||
result.filters.push({
|
result.filters.push({
|
||||||
isEnabled: !qc['filters'][fi].hasOwnProperty('disabled'),
|
isEnabled: !qc['filters'][fi].hasOwnProperty('disabled'),
|
||||||
vlan: qc['filters'][fi].hasOwnProperty('vlan') ? qc['filters'][fi]['vlan'] : '',
|
vlan: qc['filters'][fi].hasOwnProperty('vlan') ? qc['filters'][fi]['vlan'] : '',
|
||||||
proto: qc['filters'][fi].hasOwnProperty('proto') ? qc['filters'][fi]['proto'] : '',
|
proto: qc['filters'][fi].hasOwnProperty('proto') ? qc['filters'][fi]['proto'].split(',') : [],
|
||||||
sport: qc['filters'][fi].hasOwnProperty('sport') ? qc['filters'][fi]['sport'] : '',
|
sport: qc['filters'][fi].hasOwnProperty('sport') ? qc['filters'][fi]['sport'] : '',
|
||||||
dport: qc['filters'][fi].hasOwnProperty('dport') ? qc['filters'][fi]['dport'] : '',
|
dport: qc['filters'][fi].hasOwnProperty('dport') ? qc['filters'][fi]['dport'] : '',
|
||||||
ip_src: qc['filters'][fi].hasOwnProperty('ip.src') ? qc['filters'][fi]['ip.src'] : '',
|
ip_src: qc['filters'][fi].hasOwnProperty('ip.src') ? qc['filters'][fi]['ip.src'] : '',
|
||||||
@ -1196,12 +1413,39 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
updateNetworkSettings(vals) {
|
||||||
|
this.submitStatus.network = false
|
||||||
|
this.param.network.managementIp = vals["settings"]["network.managementIp"]
|
||||||
|
this.param.network.managementGateway = vals["settings"]["network.managementGateway"]
|
||||||
|
this.param.network.mode = vals["settings"]["network.mode"]
|
||||||
|
this.param.network.dataIp = vals["settings"]["network.dataIp"]
|
||||||
|
this.param.network.dataMtu = vals["settings"]["network.dataMtu"]
|
||||||
|
},
|
||||||
|
|
||||||
|
updateDebugSendSettings(vals) {
|
||||||
|
this.submitStatus.debugSend = false
|
||||||
|
this.param.debugSend.en = vals["settings"]["debugSend.en"]
|
||||||
|
this.param.debugSend.receiverIp = vals["settings"]["debugSend.receiverIp"]
|
||||||
|
this.param.debugSend.portCinC = vals["settings"]["debugSend.portCinC"]
|
||||||
|
this.param.debugSend.portData = vals["settings"]["debugSend.portData"]
|
||||||
|
this.param.debugSend.timeout = vals["settings"]["debugSend.timeout"]
|
||||||
|
},
|
||||||
|
|
||||||
updateSettings(vals) {
|
updateSettings(vals) {
|
||||||
this.settingFetchComplete = true
|
this.settingFetchComplete = true
|
||||||
this.updateRxTxSettings(vals)
|
this.updateRxTxSettings(vals)
|
||||||
this.updateCincSettings(vals)
|
this.updateCincSettings(vals)
|
||||||
this.updateBucLnbSettings(vals)
|
this.updateBucLnbSettings(vals)
|
||||||
this.updateQosSettings(vals)
|
this.updateQosSettings(vals)
|
||||||
|
this.updateNetworkSettings(vals)
|
||||||
|
this.updateDebugSendSettings(vals)
|
||||||
|
|
||||||
|
// и отдельно тут обновим настройки прошивки
|
||||||
|
this.param.firmware.firmwareVersion = vals["settings"]["firmware.firmwareVersion"]
|
||||||
|
this.param.firmware.modemUid = vals["settings"]["firmware.modemUid"]
|
||||||
|
this.param.firmware.modemSn = vals["settings"]["firmware.modemSn"]
|
||||||
|
this.param.firmware.macManagement = vals["settings"]["firmware.macManagement"]
|
||||||
|
this.param.firmware.macData = vals["settings"]["firmware.macData"]
|
||||||
},
|
},
|
||||||
|
|
||||||
// addQosClass()
|
// addQosClass()
|
||||||
@ -1225,7 +1469,7 @@
|
|||||||
let rule = {
|
let rule = {
|
||||||
isEnabled: true,
|
isEnabled: true,
|
||||||
vlan: "",
|
vlan: "",
|
||||||
proto: "",
|
proto: [],
|
||||||
sport: "",
|
sport: "",
|
||||||
dport: "",
|
dport: "",
|
||||||
ip_src: "",
|
ip_src: "",
|
||||||
@ -1263,10 +1507,7 @@
|
|||||||
let result = ""
|
let result = ""
|
||||||
let isFirst = true;
|
let isFirst = true;
|
||||||
for (const key in filter) {
|
for (const key in filter) {
|
||||||
if (key === "isEnabled") {
|
if (key === "isEnabled" || !filter[key] || (key === "proto" && filter['proto'].length === 0)) {
|
||||||
continue
|
|
||||||
}
|
|
||||||
if (!filter[key]) {
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if (isFirst) {
|
if (isFirst) {
|
||||||
@ -1287,10 +1528,7 @@
|
|||||||
result = ""
|
result = ""
|
||||||
isFirst = true;
|
isFirst = true;
|
||||||
for (const key in filter) {
|
for (const key in filter) {
|
||||||
if (key === "isEnabled") {
|
if (key === "isEnabled" || !filter[key] || (key === "proto" && filter['proto'].length === 0)) {
|
||||||
continue
|
|
||||||
}
|
|
||||||
if (!filter[key]) {
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if (isFirst) {
|
if (isFirst) {
|
||||||
@ -1307,8 +1545,12 @@
|
|||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
const doFetchStatistics = async () => {
|
const doFetchStatistics = async () => {
|
||||||
let d = await fetch("/api/get/statistics")
|
try {
|
||||||
this.updateStatistics(await d.json())
|
let d = await fetch("/api/get/statistics")
|
||||||
|
this.updateStatistics(await d.json())
|
||||||
|
} catch (e) {
|
||||||
|
this.initState = "Ошибка обновления статистики"
|
||||||
|
}
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
doFetchStatistics()
|
doFetchStatistics()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user