diff --git a/front-generator/template/common/admin-methods.js.j2 b/front-generator/template/common/admin-methods.js.j2 index 407738b..b7863f7 100644 --- a/front-generator/template/common/admin-methods.js.j2 +++ b/front-generator/template/common/admin-methods.js.j2 @@ -52,6 +52,18 @@ } this.submitStatus.firmwareUpgrade = false }, + {% if modem == 'tdma' %} + async settingsPerformFirmwareUpgradeOta() { + if (this.submitStatus.firmwareUpgradeOta) { return } + this.submitStatus.firmwareUpgradeOta = true + try { + await fetch('/api/doFirmwareUpgrade?ota=1', { method: 'POST' }) + } catch (e) { + console.log("failed to perform upgrade firmware: ", e) + } + this.submitStatus.firmwareUpgradeOta = false + }, + {% endif %} doModemReboot() { if (this.submitStatus.modemReboot !== null) { diff --git a/front-generator/template/common/admin.html.j2 b/front-generator/template/common/admin.html.j2 index b02e1d9..3eedc7c 100644 --- a/front-generator/template/common/admin.html.j2 +++ b/front-generator/template/common/admin.html.j2 @@ -21,14 +21,21 @@
+ -

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

+

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

+
+

Ручное обновление

- -
{% endraw %} + + {% endraw %}{% if modem == 'tdma' %} +

Обновление "по воздуху"

+ + {% endif %} + diff --git a/front-generator/template/main.html b/front-generator/template/main.html index 1d3c261..9712063 100644 --- a/front-generator/template/main.html +++ b/front-generator/template/main.html @@ -97,6 +97,9 @@ {% endfor %} firmwareUpload: false, firmwareUpgrade: false, + {% if modem == 'tdma' %} + firmwareUpgradeOta: false, + {% endif %} // когда модем перезагружается, тут должен быть счетчик. Направление счета - к нулю modemReboot: null }, diff --git a/src/main.cpp b/src/main.cpp index e41a004..73c2f30 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -26,6 +26,7 @@ namespace ssl = boost::asio::ssl; // from constexpr const char* REBOOT_COMMAND = "web-action reboot"; constexpr const char* UPGRADE_COMMAND = "web-action upgrade"; +constexpr const char* FIRMWARE_LOCATION = "/tmp/firmware.zip"; namespace mime_types = http::server::mime_types; @@ -63,7 +64,7 @@ class ServerResources { bool upgradeOrRebootRunning = false; static void onUploadFirmware(const http::server::Request& req) { - std::ofstream f("/tmp/firmware.zip", std::ios::binary); + std::ofstream f(FIRMWARE_LOCATION, std::ios::binary); if (f.is_open()) { f.write(req.payload.data(), static_cast(req.payload.size())); @@ -76,11 +77,27 @@ class ServerResources { void doTerminalUpgrade() const { api->executeInApi([](TSID sid) { CP_SetDmaDebug(sid, "begin_save_config", ""); - system(UPGRADE_COMMAND); + std::string cmd(UPGRADE_COMMAND); + cmd += " "; + cmd += FIRMWARE_LOCATION; + system(cmd.c_str()); CP_SetDmaDebug(sid, "save_config", ""); }); } +#ifdef MODEM_IS_TDMA + void doTerminalUpgradeOta() const { + api->executeInApi([&](TSID sid) { + CP_SetDmaDebug(sid, "begin_save_config", ""); + std::string cmd(UPGRADE_COMMAND); + cmd += " "; + cmd += api->getOtaFileLocation(); + system(cmd.c_str()); + CP_SetDmaDebug(sid, "save_config", ""); + }); + } +#endif + public: #if defined(MODEM_IS_TDMA) static constexpr const char* INDEX_HTML = "/main-tdma.html"; @@ -432,7 +449,15 @@ public: return; } this->upgradeOrRebootRunning = true; +#ifdef MODEM_IS_TDMA + if (req.url->params.find("ota") != req.url->params.end()) { + doTerminalUpgradeOta(); + } else { + doTerminalUpgrade(); + } +#else doTerminalUpgrade(); +#endif rep.status = http::server::ok; rep.headers.clear(); rep.headers.push_back({.name = "Content-Type", .value = toString(mime_types::json)}); diff --git a/src/terminal_api_driver.cpp b/src/terminal_api_driver.cpp index d39f59c..584c454 100644 --- a/src/terminal_api_driver.cpp +++ b/src/terminal_api_driver.cpp @@ -1377,6 +1377,15 @@ void api_driver::ApiDriver::executeInApi(const std::function& ca BOOST_LOG_TRIVIAL(error) << "ApiDriver::executeInApi(): failed to exec with error: " << e.what(); } } + +#ifdef MODEM_IS_TDMA +std::string api_driver::ApiDriver::getOtaFileLocation() const { + device_state s{}; + daemon->getState(nullptr, nullptr, &s); + return s.cur_image; +} +#endif + #ifdef MODEM_IS_SCPC std::string api_driver::ApiDriver::getLoggingStatisticsSettings() { return this->daemon->statsLogs.getSettings(); diff --git a/src/terminal_api_driver.h b/src/terminal_api_driver.h index 83a2515..3b5a255 100644 --- a/src/terminal_api_driver.h +++ b/src/terminal_api_driver.h @@ -87,6 +87,10 @@ namespace api_driver { void readLoggingStatistics(std::vector& out, int timeStart = -1, int timeEnd = -1, bool ordering = false, int maxItems = -1); #endif +#ifdef MODEM_IS_TDMA + std::string getOtaFileLocation() const; +#endif + static std::string loadSysInfo(); ~ApiDriver(); diff --git a/static/main-scpc.html b/static/main-scpc.html index 08fbbc2..d3a2815 100644 --- a/static/main-scpc.html +++ b/static/main-scpc.html @@ -538,16 +538,20 @@
+ -

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

+

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

+
+

Ручное обновление

- -
+ + +

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

diff --git a/static/main-tdma.html b/static/main-tdma.html index 0c35651..5c6a5fc 100644 --- a/static/main-tdma.html +++ b/static/main-tdma.html @@ -274,16 +274,22 @@
+ -

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

+

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

+
+

Ручное обновление

- -
+ +

Обновление "по воздуху"

+ + +

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

@@ -326,6 +332,7 @@ network: false, firmwareUpload: false, firmwareUpgrade: false, + firmwareUpgradeOta: false, // когда модем перезагружается, тут должен быть счетчик. Направление счета - к нулю modemReboot: null }, @@ -744,6 +751,16 @@ } this.submitStatus.firmwareUpgrade = false }, + async settingsPerformFirmwareUpgradeOta() { + if (this.submitStatus.firmwareUpgradeOta) { return } + this.submitStatus.firmwareUpgradeOta = true + try { + await fetch('/api/doFirmwareUpgrade?ota=1', { method: 'POST' }) + } catch (e) { + console.log("failed to perform upgrade firmware: ", e) + } + this.submitStatus.firmwareUpgradeOta = false + }, doModemReboot() { if (this.submitStatus.modemReboot !== null) {