1 #pragma once 2 #include "handler_config.hpp" 3 #include "image_handler.hpp" 4 #include "status.hpp" 5 #include "util.hpp" 6 7 #include <blobs-ipmid/blobs.hpp> 8 9 #include <cstdint> 10 #include <map> 11 #include <memory> 12 #include <optional> 13 #include <set> 14 #include <string> 15 #include <string_view> 16 #include <unordered_map> 17 #include <vector> 18 19 namespace ipmi_flash 20 { 21 22 class VersionBlobHandler : public blobs::GenericBlobInterface 23 { 24 public: 25 struct ActionPack 26 { 27 /** Only file operation action supported currently */ 28 std::unique_ptr<TriggerableActionInterface> onOpen; 29 }; 30 31 /** 32 * Create a VersionBlobHandler. 33 * 34 * @param[in] configs - list of blob configurations to support 35 */ 36 VersionBlobHandler(std::vector<HandlerConfig<ActionPack>>&& configs); 37 38 ~VersionBlobHandler() = default; 39 VersionBlobHandler(const VersionBlobHandler&) = delete; 40 VersionBlobHandler& operator=(const VersionBlobHandler&) = delete; 41 VersionBlobHandler(VersionBlobHandler&&) = default; 42 VersionBlobHandler& operator=(VersionBlobHandler&&) = default; 43 44 bool canHandleBlob(const std::string& path) override; 45 std::vector<std::string> getBlobIds() override; 46 bool deleteBlob(const std::string& path) override; 47 bool stat(const std::string&, blobs::BlobMeta* meta) override; 48 bool open(uint16_t session, uint16_t flags, 49 const std::string& path) override; 50 std::vector<uint8_t> read(uint16_t session, uint32_t offset, 51 uint32_t requestedSize) override; write(uint16_t,uint32_t,const std::vector<uint8_t> &)52 bool write(uint16_t, uint32_t, const std::vector<uint8_t>&) override 53 { 54 return false; /* not supported */ 55 }; writeMeta(uint16_t,uint32_t,const std::vector<uint8_t> &)56 bool writeMeta(uint16_t, uint32_t, const std::vector<uint8_t>&) override 57 { 58 return false; /* not supported */ 59 } commit(uint16_t,const std::vector<uint8_t> &)60 bool commit(uint16_t, const std::vector<uint8_t>&) override 61 { 62 return false; // not supported 63 } 64 bool close(uint16_t session) override; 65 bool stat(uint16_t session, blobs::BlobMeta* meta) override; 66 bool expire(uint16_t session) override; 67 68 private: 69 struct SessionInfo; 70 71 struct BlobInfo 72 { 73 Pinned<std::string> blobId; 74 std::unique_ptr<ActionPack> actions; 75 std::unique_ptr<ImageHandlerInterface> handler; 76 std::set<SessionInfo*> sessionsToUpdate; 77 }; 78 79 struct SessionInfo 80 { 81 BlobInfo* blob; 82 83 // A cached copy of the version data shared by all clients for a single 84 // execution of the version retrieval action. This is is null until the 85 // TriggerableAction has completed. If the action is an error, the 86 // shared object is nullopt. Otherwise, contains a vector of the version 87 // data when successfully read. 88 std::shared_ptr<const std::optional<std::vector<uint8_t>>> data; 89 }; 90 91 std::unordered_map<std::string_view, std::unique_ptr<BlobInfo>> blobInfoMap; 92 std::unordered_map<uint16_t, std::unique_ptr<SessionInfo>> sessionInfoMap; 93 }; 94 95 } // namespace ipmi_flash 96