добавил обновление прошивки из веб морды
This commit is contained in:
28
src/main.cpp
28
src/main.cpp
@@ -80,6 +80,19 @@ class ServerResources {
|
||||
std::unique_ptr<api_driver::ApiDriver> api;
|
||||
http::auth::AuthProvider auth{};
|
||||
|
||||
void doTerminaFwUpdate(const http::server::Request& req) {
|
||||
std::ofstream f("/tmp/firmware.zip", std::ios::binary);
|
||||
|
||||
if (f.is_open()) {
|
||||
f.write(req.payload.data(), static_cast<long>(req.payload.size()));
|
||||
f.close();
|
||||
|
||||
system("do-terminal-update.sh");
|
||||
} else {
|
||||
throw std::runtime_error("File is not open");
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
static constexpr const char* INDEX_HTML = "static/main.html";
|
||||
static constexpr const char* LOGIN_HTML = "static/login.html";
|
||||
@@ -322,6 +335,21 @@ public:
|
||||
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
|
||||
}
|
||||
}));
|
||||
|
||||
s.resources.emplace_back(std::make_unique<http::auth::AuthRequiredResource>("/api/firmwareUpdate", this->auth, http::auth::User::UPDATE_FIRMWARE, [this](const auto& req, auto& rep) {
|
||||
if (req.method != "PUT") {
|
||||
http::server::stockReply(http::server::bad_request, rep);
|
||||
}
|
||||
this->doTerminaFwUpdate(req);
|
||||
|
||||
rep.status = http::server::ok;
|
||||
rep.headers.clear();
|
||||
rep.headers.push_back({.name = "Content-Type", .value = toString(mime_types::json)});
|
||||
std::string result = R"({"status":"ok","fwsize":)";
|
||||
result += std::to_string(req.payload.size());
|
||||
result += "}";
|
||||
rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size());
|
||||
}));
|
||||
}
|
||||
|
||||
~ServerResources() = default;
|
||||
|
@@ -1,6 +1,5 @@
|
||||
#include "request_parser.hpp"
|
||||
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include "request.hpp"
|
||||
|
||||
@@ -14,16 +13,16 @@ namespace http::server {
|
||||
*/
|
||||
static bool requestBodySizeResolver(Request& req, size_t reqSize) {
|
||||
// разрешаем тело только для POST запросов
|
||||
if (req.method != "POST") {
|
||||
return false;
|
||||
if (req.method == "POST") {
|
||||
return reqSize < 0x4000; // 16кб на все POST-запросы к API будет более чем достаточно
|
||||
}
|
||||
|
||||
// для обновления прошивки разрешаем большое тело
|
||||
if (req.url->path == "/api/firmwareUpdate") {
|
||||
// это для обновления прошивки
|
||||
if (req.method == "PUT" && req.url->path == "/api/firmwareUpdate") {
|
||||
return reqSize <= HTTP_MAX_PAYLOAD;
|
||||
}
|
||||
|
||||
return reqSize < 0x4000; // 16кб на все POST-запросы к API будет более чем достаточно
|
||||
return false;
|
||||
}
|
||||
|
||||
static void parseParams(Url& u, const std::string& query) {
|
||||
@@ -277,7 +276,7 @@ namespace http::server {
|
||||
if (content_len.empty()) {
|
||||
return good;
|
||||
}
|
||||
contentLenghtHeader = std::stol(content_len);
|
||||
contentLenghtHeader = std::stoul(content_len);
|
||||
if (contentLenghtHeader == 0) {
|
||||
return good;
|
||||
}
|
||||
|
Reference in New Issue
Block a user