summaryrefslogtreecommitdiff
path: root/include/image_upload.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/image_upload.hpp')
-rw-r--r--include/image_upload.hpp137
1 files changed, 0 insertions, 137 deletions
diff --git a/include/image_upload.hpp b/include/image_upload.hpp
deleted file mode 100644
index f6a0dfc49e..0000000000
--- a/include/image_upload.hpp
+++ /dev/null
@@ -1,137 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-// SPDX-FileCopyrightText: Copyright OpenBMC Authors
-#pragma once
-
-#include "app.hpp"
-#include "async_resp.hpp"
-#include "dbus_singleton.hpp"
-#include "dbus_utility.hpp"
-#include "http_request.hpp"
-#include "io_context_singleton.hpp"
-#include "logging.hpp"
-#include "ossl_random.hpp"
-
-#include <boost/asio/error.hpp>
-#include <boost/asio/steady_timer.hpp>
-#include <boost/beast/http/status.hpp>
-#include <boost/beast/http/verb.hpp>
-#include <sdbusplus/bus/match.hpp>
-#include <sdbusplus/message.hpp>
-#include <sdbusplus/message/native_types.hpp>
-
-#include <algorithm>
-#include <chrono>
-#include <cstdio>
-#include <fstream>
-#include <functional>
-#include <memory>
-#include <ranges>
-#include <string>
-
-namespace crow
-{
-namespace image_upload
-{
-
-// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
-static std::unique_ptr<sdbusplus::bus::match_t> fwUpdateMatcher;
-
-inline void uploadImageHandler(
- const crow::Request& req,
- const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
-{
- // Only allow one FW update at a time
- if (fwUpdateMatcher != nullptr)
- {
- asyncResp->res.addHeader("Retry-After", "30");
- asyncResp->res.result(boost::beast::http::status::service_unavailable);
- return;
- }
- // Make this const static so it survives outside this method
- static boost::asio::steady_timer timeout(getIoContext(),
- std::chrono::seconds(5));
-
- timeout.expires_after(std::chrono::seconds(15));
-
- auto timeoutHandler = [asyncResp](const boost::system::error_code& ec) {
- fwUpdateMatcher = nullptr;
- if (ec == boost::asio::error::operation_aborted)
- {
- // expected, we were canceled before the timer completed.
- return;
- }
- BMCWEB_LOG_ERROR("Timed out waiting for Version interface");
-
- if (ec)
- {
- BMCWEB_LOG_ERROR("Async_wait failed {}", ec);
- return;
- }
-
- asyncResp->res.result(boost::beast::http::status::bad_request);
- asyncResp->res.jsonValue["data"]["description"] =
- "Version already exists or failed to be extracted";
- asyncResp->res.jsonValue["message"] = "400 Bad Request";
- asyncResp->res.jsonValue["status"] = "error";
- };
-
- std::function<void(sdbusplus::message_t&)> callback =
- [asyncResp](sdbusplus::message_t& m) {
- BMCWEB_LOG_DEBUG("Match fired");
-
- sdbusplus::message::object_path path;
- dbus::utility::DBusInterfacesMap interfaces;
- m.read(path, interfaces);
-
- if (std::ranges::find_if(interfaces, [](const auto& i) {
- return i.first == "xyz.openbmc_project.Software.Version";
- }) != interfaces.end())
- {
- timeout.cancel();
- std::string leaf = path.filename();
- if (leaf.empty())
- {
- leaf = path.str;
- }
-
- asyncResp->res.jsonValue["data"] = leaf;
- asyncResp->res.jsonValue["message"] = "200 OK";
- asyncResp->res.jsonValue["status"] = "ok";
- BMCWEB_LOG_DEBUG("ending response");
- fwUpdateMatcher = nullptr;
- }
- };
- fwUpdateMatcher = std::make_unique<sdbusplus::bus::match_t>(
- *crow::connections::systemBus,
- "interface='org.freedesktop.DBus.ObjectManager',type='signal',"
- "member='InterfacesAdded',path='/xyz/openbmc_project/software'",
- callback);
-
- std::string filepath("/tmp/images/" + bmcweb::getRandomUUID());
- BMCWEB_LOG_DEBUG("Writing file to {}", filepath);
- std::ofstream out(filepath, std::ofstream::out | std::ofstream::binary |
- std::ofstream::trunc);
- out << req.body();
- out.close();
- timeout.async_wait(timeoutHandler);
-}
-
-inline void requestRoutes(App& app)
-{
- BMCWEB_ROUTE(app, "/upload/image/<str>")
- .privileges({{"ConfigureComponents", "ConfigureManager"}})
- .methods(boost::beast::http::verb::post, boost::beast::http::verb::put)(
- [](const crow::Request& req,
- const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
- const std::string&) { uploadImageHandler(req, asyncResp); });
-
- BMCWEB_ROUTE(app, "/upload/image")
- .privileges({{"ConfigureComponents", "ConfigureManager"}})
- .methods(boost::beast::http::verb::post, boost::beast::http::verb::put)(
- [](const crow::Request& req,
- const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
- uploadImageHandler(req, asyncResp);
- });
-}
-} // namespace image_upload
-} // namespace crow