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) {