blob: d6a499296ed8946d8de0b4b99997456ce2037677 [file] [log] [blame]
Ratan Gupta453fed02019-12-14 09:39:47 +05301#pragma once
Ratan Gupta453fed02019-12-14 09:39:47 +05302#include <tinyxml2.h>
3
Ed Tanous04e438c2020-10-03 08:06:26 -07004#include <app.hpp>
Ratan Gupta453fed02019-12-14 09:39:47 +05305#include <async_resp.hpp>
Sunitha Harish97b0e432019-11-21 04:59:29 -06006#include <boost/algorithm/string.hpp>
7#include <boost/container/flat_set.hpp>
Manojkiran Eda5bb0ece2020-01-20 20:22:36 +05308#include <error_messages.hpp>
Sunitha Harish96330b92020-06-26 05:42:14 -05009#include <event_service_manager.hpp>
manojkiraneda0b631ae2019-12-03 17:54:28 +053010#include <ibm/locks.hpp>
11#include <nlohmann/json.hpp>
Sunitha Harish96330b92020-06-26 05:42:14 -050012#include <resource_messages.hpp>
Sunitha Harish97b0e432019-11-21 04:59:29 -060013#include <sdbusplus/message/types.hpp>
manojkiraneda0b631ae2019-12-03 17:54:28 +053014#include <utils/json_utils.hpp>
Sunitha Harish97b0e432019-11-21 04:59:29 -060015
Gunnar Mills1214b7e2020-06-04 10:11:30 -050016#include <filesystem>
17#include <fstream>
Gunnar Mills1214b7e2020-06-04 10:11:30 -050018
manojkiraneda0b631ae2019-12-03 17:54:28 +053019using SType = std::string;
20using SegmentFlags = std::vector<std::pair<std::string, uint32_t>>;
21using LockRequest = std::tuple<SType, SType, SType, uint64_t, SegmentFlags>;
22using LockRequests = std::vector<LockRequest>;
23using Rc = std::pair<bool, std::variant<uint32_t, LockRequest>>;
manojkiraneda402b5712019-12-13 17:07:09 +053024using RcGetLockList =
25 std::variant<std::string, std::vector<std::pair<uint32_t, LockRequests>>>;
26using ListOfSessionIds = std::vector<std::string>;
Ratan Gupta453fed02019-12-14 09:39:47 +053027namespace crow
28{
29namespace ibm_mc
30{
Gunnar Mills1214b7e2020-06-04 10:11:30 -050031constexpr const char* methodNotAllowedMsg = "Method Not Allowed";
32constexpr const char* resourceNotFoundMsg = "Resource Not Found";
33constexpr const char* contentNotAcceptableMsg = "Content Not Acceptable";
34constexpr const char* internalServerError = "Internal Server Error";
Sunitha Harish97b0e432019-11-21 04:59:29 -060035
Sunitha Harish7c0bbe72020-07-30 08:25:28 -050036constexpr size_t maxSaveareaDirSize =
37 10000000; // Allow save area dir size to be max 10MB
38constexpr size_t minSaveareaFileSize =
39 100; // Allow save area file size of minimum 100B
Asmitha Karunanithi5738de52020-07-17 02:03:31 -050040constexpr size_t maxSaveareaFileSize =
41 500000; // Allow save area file size upto 500KB
42constexpr size_t maxBroadcastMsgSize =
43 1000; // Allow Broadcast message size upto 1KB
44
Sunitha Harishdb81c072021-01-21 23:33:21 -060045inline void handleFilePut(const crow::Request& req,
46 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
Ed Tanous02379d32020-09-15 21:15:44 -070047 const std::string& fileID)
Sunitha Harish97b0e432019-11-21 04:59:29 -060048{
Sunitha Harish7c0bbe72020-07-30 08:25:28 -050049 std::error_code ec;
Sunitha Harish97b0e432019-11-21 04:59:29 -060050 // Check the content-type of the request
Sunitha Harish086d32c2021-02-01 02:11:49 -060051 boost::beast::string_view contentType = req.getHeaderValue("content-type");
52 if (!boost::iequals(contentType, "application/octet-stream"))
Sunitha Harish97b0e432019-11-21 04:59:29 -060053 {
Sunitha Harishdb81c072021-01-21 23:33:21 -060054 asyncResp->res.result(boost::beast::http::status::not_acceptable);
55 asyncResp->res.jsonValue["Description"] = contentNotAcceptableMsg;
Sunitha Harish97b0e432019-11-21 04:59:29 -060056 return;
57 }
Sunitha Harish086d32c2021-02-01 02:11:49 -060058 BMCWEB_LOG_DEBUG
59 << "File upload in application/octet-stream format. Continue..";
asmithakarun1c7b07c2019-09-09 03:42:59 -050060
61 BMCWEB_LOG_DEBUG
62 << "handleIbmPut: Request to create/update the save-area file";
Sunitha Harish3e919b52020-10-13 01:21:48 -050063 std::string_view path =
64 "/var/lib/bmcweb/ibm-management-console/configfiles";
65 if (!crow::ibm_utils::createDirectory(path))
Sunitha Harish97b0e432019-11-21 04:59:29 -060066 {
Sunitha Harishdb81c072021-01-21 23:33:21 -060067 asyncResp->res.result(boost::beast::http::status::not_found);
68 asyncResp->res.jsonValue["Description"] = resourceNotFoundMsg;
asmithakarun1c7b07c2019-09-09 03:42:59 -050069 return;
70 }
Sunitha Harish7c0bbe72020-07-30 08:25:28 -050071
asmithakarun1c7b07c2019-09-09 03:42:59 -050072 std::ofstream file;
Sunitha Harish3e919b52020-10-13 01:21:48 -050073 std::filesystem::path loc(
74 "/var/lib/bmcweb/ibm-management-console/configfiles");
Sunitha Harish97b0e432019-11-21 04:59:29 -060075
Sunitha Harish7c0bbe72020-07-30 08:25:28 -050076 // Get the current size of the savearea directory
77 std::filesystem::recursive_directory_iterator iter(loc, ec);
78 if (ec)
79 {
Sunitha Harishdb81c072021-01-21 23:33:21 -060080 asyncResp->res.result(
81 boost::beast::http::status::internal_server_error);
82 asyncResp->res.jsonValue["Description"] = internalServerError;
Sunitha Harish7c0bbe72020-07-30 08:25:28 -050083 BMCWEB_LOG_DEBUG << "handleIbmPut: Failed to prepare save-area "
84 "directory iterator. ec : "
85 << ec;
86 return;
87 }
88 std::uintmax_t saveAreaDirSize = 0;
89 for (auto& it : iter)
90 {
91 if (!std::filesystem::is_directory(it, ec))
92 {
93 if (ec)
94 {
Sunitha Harishdb81c072021-01-21 23:33:21 -060095 asyncResp->res.result(
96 boost::beast::http::status::internal_server_error);
97 asyncResp->res.jsonValue["Description"] = internalServerError;
Sunitha Harish7c0bbe72020-07-30 08:25:28 -050098 BMCWEB_LOG_DEBUG << "handleIbmPut: Failed to find save-area "
99 "directory . ec : "
100 << ec;
101 return;
102 }
103 std::uintmax_t fileSize = std::filesystem::file_size(it, ec);
104 if (ec)
105 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600106 asyncResp->res.result(
107 boost::beast::http::status::internal_server_error);
108 asyncResp->res.jsonValue["Description"] = internalServerError;
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500109 BMCWEB_LOG_DEBUG << "handleIbmPut: Failed to find save-area "
110 "file size inside the directory . ec : "
111 << ec;
112 return;
113 }
114 saveAreaDirSize += fileSize;
115 }
116 }
117 BMCWEB_LOG_DEBUG << "saveAreaDirSize: " << saveAreaDirSize;
118
119 // Get the file size getting uploaded
Ed Tanous3174e4d2020-10-07 11:41:22 -0700120 const std::string& data = req.body;
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500121 BMCWEB_LOG_DEBUG << "data length: " << data.length();
122
123 if (data.length() < minSaveareaFileSize)
124 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600125 asyncResp->res.result(boost::beast::http::status::bad_request);
126 asyncResp->res.jsonValue["Description"] =
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500127 "File size is less than minimum allowed size[100B]";
128 return;
129 }
130 if (data.length() > maxSaveareaFileSize)
asmithakarun1c7b07c2019-09-09 03:42:59 -0500131 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600132 asyncResp->res.result(boost::beast::http::status::bad_request);
133 asyncResp->res.jsonValue["Description"] =
Ratan Guptae46946a2020-05-11 13:22:59 +0530134 "File size exceeds maximum allowed size[500KB]";
asmithakarun1c7b07c2019-09-09 03:42:59 -0500135 return;
136 }
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500137
138 // Form the file path
139 loc /= fileID;
Asmitha Karunanithi10693fa2020-07-27 02:27:49 -0500140 BMCWEB_LOG_DEBUG << "Writing to the file: " << loc;
141
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500142 // Check if the same file exists in the directory
143 bool fileExists = std::filesystem::exists(loc, ec);
144 if (ec)
Asmitha Karunanithi10693fa2020-07-27 02:27:49 -0500145 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600146 asyncResp->res.result(
147 boost::beast::http::status::internal_server_error);
148 asyncResp->res.jsonValue["Description"] = internalServerError;
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500149 BMCWEB_LOG_DEBUG << "handleIbmPut: Failed to find if file exists. ec : "
150 << ec;
151 return;
Asmitha Karunanithi10693fa2020-07-27 02:27:49 -0500152 }
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500153
154 std::uintmax_t newSizeToWrite = 0;
155 if (fileExists)
156 {
157 // File exists. Get the current file size
158 std::uintmax_t currentFileSize = std::filesystem::file_size(loc, ec);
159 if (ec)
160 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600161 asyncResp->res.result(
162 boost::beast::http::status::internal_server_error);
163 asyncResp->res.jsonValue["Description"] = internalServerError;
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500164 BMCWEB_LOG_DEBUG << "handleIbmPut: Failed to find file size. ec : "
165 << ec;
166 return;
167 }
168 // Calculate the difference in the file size.
169 // If the data.length is greater than the existing file size, then
170 // calculate the difference. Else consider the delta size as zero -
171 // because there is no increase in the total directory size.
172 // We need to add the diff only if the incoming data is larger than the
173 // existing filesize
174 if (data.length() > currentFileSize)
175 {
176 newSizeToWrite = data.length() - currentFileSize;
177 }
178 BMCWEB_LOG_DEBUG << "newSizeToWrite: " << newSizeToWrite;
179 }
180 else
181 {
182 // This is a new file upload
183 newSizeToWrite = data.length();
184 }
185
186 // Calculate the total dir size before writing the new file
187 BMCWEB_LOG_DEBUG << "total new size: " << saveAreaDirSize + newSizeToWrite;
188
189 if ((saveAreaDirSize + newSizeToWrite) > maxSaveareaDirSize)
190 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600191 asyncResp->res.result(boost::beast::http::status::bad_request);
192 asyncResp->res.jsonValue["Description"] =
193 "File size does not fit in the savearea "
194 "directory maximum allowed size[10MB]";
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500195 return;
196 }
197
asmithakarun1c7b07c2019-09-09 03:42:59 -0500198 file.open(loc, std::ofstream::out);
Sunitha Harish3e919b52020-10-13 01:21:48 -0500199
200 // set the permission of the file to 600
201 std::filesystem::perms permission = std::filesystem::perms::owner_write |
202 std::filesystem::perms::owner_read;
203 std::filesystem::permissions(loc, permission);
204
asmithakarun1c7b07c2019-09-09 03:42:59 -0500205 if (file.fail())
206 {
207 BMCWEB_LOG_DEBUG << "Error while opening the file for writing";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600208 asyncResp->res.result(
209 boost::beast::http::status::internal_server_error);
210 asyncResp->res.jsonValue["Description"] =
211 "Error while creating the file";
asmithakarun1c7b07c2019-09-09 03:42:59 -0500212 return;
Sunitha Harish97b0e432019-11-21 04:59:29 -0600213 }
Ed Tanous3174e4d2020-10-07 11:41:22 -0700214 file << data;
Sunitha Harish3e919b52020-10-13 01:21:48 -0500215
Ed Tanous3174e4d2020-10-07 11:41:22 -0700216 std::string origin = "/ibm/v1/Host/ConfigFiles/" + fileID;
217 // Push an event
218 if (fileExists)
219 {
220 BMCWEB_LOG_DEBUG << "config file is updated";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600221 asyncResp->res.jsonValue["Description"] = "File Updated";
Ed Tanous3174e4d2020-10-07 11:41:22 -0700222
223 redfish::EventServiceManager::getInstance().sendEvent(
224 redfish::messages::resourceChanged(), origin, "IBMConfigFile");
225 }
Sunitha Harish97b0e432019-11-21 04:59:29 -0600226 else
227 {
Ed Tanous3174e4d2020-10-07 11:41:22 -0700228 BMCWEB_LOG_DEBUG << "config file is created";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600229 asyncResp->res.jsonValue["Description"] = "File Created";
Asmitha Karunanithi10693fa2020-07-27 02:27:49 -0500230
Ed Tanous3174e4d2020-10-07 11:41:22 -0700231 redfish::EventServiceManager::getInstance().sendEvent(
232 redfish::messages::resourceCreated(), origin, "IBMConfigFile");
asmithakarun1c7b07c2019-09-09 03:42:59 -0500233 }
Ratan Guptad3630cb2019-12-14 11:21:35 +0530234}
asmithakarun1c7b07c2019-09-09 03:42:59 -0500235
zhanghch058d1b46d2021-04-01 11:18:24 +0800236inline void
237 handleConfigFileList(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
Ratan Guptad3630cb2019-12-14 11:21:35 +0530238{
239 std::vector<std::string> pathObjList;
Sunitha Harish3e919b52020-10-13 01:21:48 -0500240 std::filesystem::path loc(
241 "/var/lib/bmcweb/ibm-management-console/configfiles");
Ratan Guptad3630cb2019-12-14 11:21:35 +0530242 if (std::filesystem::exists(loc) && std::filesystem::is_directory(loc))
243 {
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500244 for (const auto& file : std::filesystem::directory_iterator(loc))
Ratan Guptad3630cb2019-12-14 11:21:35 +0530245 {
Ed Tanous3174e4d2020-10-07 11:41:22 -0700246 const std::filesystem::path& pathObj = file.path();
Ratan Guptad3630cb2019-12-14 11:21:35 +0530247 pathObjList.push_back("/ibm/v1/Host/ConfigFiles/" +
248 pathObj.filename().string());
249 }
250 }
Sunitha Harishdb81c072021-01-21 23:33:21 -0600251 asyncResp->res.jsonValue["@odata.type"] =
252 "#IBMConfigFile.v1_0_0.IBMConfigFile";
253 asyncResp->res.jsonValue["@odata.id"] = "/ibm/v1/Host/ConfigFiles/";
254 asyncResp->res.jsonValue["Id"] = "ConfigFiles";
255 asyncResp->res.jsonValue["Name"] = "ConfigFiles";
Ratan Guptad3630cb2019-12-14 11:21:35 +0530256
Sunitha Harishdb81c072021-01-21 23:33:21 -0600257 asyncResp->res.jsonValue["Members"] = std::move(pathObjList);
258 asyncResp->res.jsonValue["Actions"]["#IBMConfigFiles.DeleteAll"] = {
Ratan Guptad3630cb2019-12-14 11:21:35 +0530259 {"target",
Sunitha Harishe56f2542020-07-22 02:38:59 -0500260 "/ibm/v1/Host/ConfigFiles/Actions/IBMConfigFiles.DeleteAll"}};
Sunitha Harishdb81c072021-01-21 23:33:21 -0600261 return;
Ratan Guptad3630cb2019-12-14 11:21:35 +0530262}
263
zhanghch058d1b46d2021-04-01 11:18:24 +0800264inline void
265 deleteConfigFiles(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
Ratan Guptad3630cb2019-12-14 11:21:35 +0530266{
267 std::vector<std::string> pathObjList;
268 std::error_code ec;
Sunitha Harish3e919b52020-10-13 01:21:48 -0500269 std::filesystem::path loc(
270 "/var/lib/bmcweb/ibm-management-console/configfiles");
Ratan Guptad3630cb2019-12-14 11:21:35 +0530271 if (std::filesystem::exists(loc) && std::filesystem::is_directory(loc))
272 {
273 std::filesystem::remove_all(loc, ec);
274 if (ec)
275 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600276 asyncResp->res.result(
277 boost::beast::http::status::internal_server_error);
278 asyncResp->res.jsonValue["Description"] = internalServerError;
Ratan Guptad3630cb2019-12-14 11:21:35 +0530279 BMCWEB_LOG_DEBUG << "deleteConfigFiles: Failed to delete the "
280 "config files directory. ec : "
281 << ec;
282 }
283 }
Sunitha Harishdb81c072021-01-21 23:33:21 -0600284 return;
asmithakarun1c7b07c2019-09-09 03:42:59 -0500285}
286
zhanghch058d1b46d2021-04-01 11:18:24 +0800287inline void
288 getLockServiceData(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
Ratan Gupta734a1c32019-12-14 11:53:48 +0530289{
Sunitha Harishdb81c072021-01-21 23:33:21 -0600290 asyncResp->res.jsonValue["@odata.type"] = "#LockService.v1_0_0.LockService";
291 asyncResp->res.jsonValue["@odata.id"] = "/ibm/v1/HMC/LockService/";
292 asyncResp->res.jsonValue["Id"] = "LockService";
293 asyncResp->res.jsonValue["Name"] = "LockService";
Ratan Gupta734a1c32019-12-14 11:53:48 +0530294
Sunitha Harishdb81c072021-01-21 23:33:21 -0600295 asyncResp->res.jsonValue["Actions"]["#LockService.AcquireLock"] = {
Ratan Gupta734a1c32019-12-14 11:53:48 +0530296 {"target", "/ibm/v1/HMC/LockService/Actions/LockService.AcquireLock"}};
Sunitha Harishdb81c072021-01-21 23:33:21 -0600297 asyncResp->res.jsonValue["Actions"]["#LockService.ReleaseLock"] = {
Ratan Gupta734a1c32019-12-14 11:53:48 +0530298 {"target", "/ibm/v1/HMC/LockService/Actions/LockService.ReleaseLock"}};
Sunitha Harishdb81c072021-01-21 23:33:21 -0600299 asyncResp->res.jsonValue["Actions"]["#LockService.GetLockList"] = {
Ratan Gupta734a1c32019-12-14 11:53:48 +0530300 {"target", "/ibm/v1/HMC/LockService/Actions/LockService.GetLockList"}};
Sunitha Harishdb81c072021-01-21 23:33:21 -0600301 return;
Ratan Gupta734a1c32019-12-14 11:53:48 +0530302}
303
Sunitha Harishdb81c072021-01-21 23:33:21 -0600304inline void handleFileGet(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
305 const std::string& fileID)
asmithakarun1c7b07c2019-09-09 03:42:59 -0500306{
307 BMCWEB_LOG_DEBUG << "HandleGet on SaveArea files on path: " << fileID;
Sunitha Harish3e919b52020-10-13 01:21:48 -0500308 std::filesystem::path loc(
309 "/var/lib/bmcweb/ibm-management-console/configfiles/" + fileID);
asmithakarun1c7b07c2019-09-09 03:42:59 -0500310 if (!std::filesystem::exists(loc))
311 {
312 BMCWEB_LOG_ERROR << loc << "Not found";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600313 asyncResp->res.result(boost::beast::http::status::not_found);
314 asyncResp->res.jsonValue["Description"] = resourceNotFoundMsg;
asmithakarun1c7b07c2019-09-09 03:42:59 -0500315 return;
316 }
317
318 std::ifstream readfile(loc.string());
319 if (!readfile)
320 {
321 BMCWEB_LOG_ERROR << loc.string() << "Not found";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600322 asyncResp->res.result(boost::beast::http::status::not_found);
323 asyncResp->res.jsonValue["Description"] = resourceNotFoundMsg;
asmithakarun1c7b07c2019-09-09 03:42:59 -0500324 return;
325 }
326
327 std::string contentDispositionParam =
328 "attachment; filename=\"" + fileID + "\"";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600329 asyncResp->res.addHeader("Content-Disposition", contentDispositionParam);
asmithakarun1c7b07c2019-09-09 03:42:59 -0500330 std::string fileData;
331 fileData = {std::istreambuf_iterator<char>(readfile),
332 std::istreambuf_iterator<char>()};
Sunitha Harishdb81c072021-01-21 23:33:21 -0600333 asyncResp->res.jsonValue["Data"] = fileData;
asmithakarun1c7b07c2019-09-09 03:42:59 -0500334 return;
335}
336
Sunitha Harishdb81c072021-01-21 23:33:21 -0600337inline void
338 handleFileDelete(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
339 const std::string& fileID)
asmithakarun1c7b07c2019-09-09 03:42:59 -0500340{
Sunitha Harish3e919b52020-10-13 01:21:48 -0500341 std::string filePath("/var/lib/bmcweb/ibm-management-console/configfiles/" +
342 fileID);
asmithakarun1c7b07c2019-09-09 03:42:59 -0500343 BMCWEB_LOG_DEBUG << "Removing the file : " << filePath << "\n";
Ed Tanous2c70f802020-09-28 14:29:23 -0700344 std::ifstream fileOpen(filePath.c_str());
345 if (static_cast<bool>(fileOpen))
Ed Tanous3174e4d2020-10-07 11:41:22 -0700346 {
asmithakarun1c7b07c2019-09-09 03:42:59 -0500347 if (remove(filePath.c_str()) == 0)
348 {
349 BMCWEB_LOG_DEBUG << "File removed!\n";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600350 asyncResp->res.jsonValue["Description"] = "File Deleted";
asmithakarun1c7b07c2019-09-09 03:42:59 -0500351 }
352 else
353 {
354 BMCWEB_LOG_ERROR << "File not removed!\n";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600355 asyncResp->res.result(
356 boost::beast::http::status::internal_server_error);
357 asyncResp->res.jsonValue["Description"] = internalServerError;
asmithakarun1c7b07c2019-09-09 03:42:59 -0500358 }
Ed Tanous3174e4d2020-10-07 11:41:22 -0700359 }
asmithakarun1c7b07c2019-09-09 03:42:59 -0500360 else
361 {
362 BMCWEB_LOG_ERROR << "File not found!\n";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600363 asyncResp->res.result(boost::beast::http::status::not_found);
364 asyncResp->res.jsonValue["Description"] = resourceNotFoundMsg;
Sunitha Harish97b0e432019-11-21 04:59:29 -0600365 }
366 return;
367}
368
zhanghch058d1b46d2021-04-01 11:18:24 +0800369inline void
370 handleBroadcastService(const crow::Request& req,
371 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500372{
373 std::string broadcastMsg;
374
zhanghch058d1b46d2021-04-01 11:18:24 +0800375 if (!redfish::json_util::readJson(req, asyncResp->res, "Message",
376 broadcastMsg))
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500377 {
378 BMCWEB_LOG_DEBUG << "Not a Valid JSON";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600379 asyncResp->res.result(boost::beast::http::status::bad_request);
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500380 return;
381 }
382 if (broadcastMsg.size() > maxBroadcastMsgSize)
383 {
384 BMCWEB_LOG_ERROR << "Message size exceeds maximum allowed size[1KB]";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600385 asyncResp->res.result(boost::beast::http::status::bad_request);
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500386 return;
387 }
388 redfish::EventServiceManager::getInstance().sendBroadcastMsg(broadcastMsg);
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500389 return;
390}
391
zhanghch058d1b46d2021-04-01 11:18:24 +0800392inline void handleFileUrl(const crow::Request& req,
393 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500394 const std::string& fileID)
Sunitha Harish97b0e432019-11-21 04:59:29 -0600395{
Ed Tanousb41187f2019-10-24 16:30:02 -0700396 if (req.method() == boost::beast::http::verb::put)
Sunitha Harish97b0e432019-11-21 04:59:29 -0600397 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600398 handleFilePut(req, asyncResp, fileID);
Sunitha Harish97b0e432019-11-21 04:59:29 -0600399 return;
400 }
Ed Tanousb41187f2019-10-24 16:30:02 -0700401 if (req.method() == boost::beast::http::verb::get)
asmithakarun1c7b07c2019-09-09 03:42:59 -0500402 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600403 handleFileGet(asyncResp, fileID);
asmithakarun1c7b07c2019-09-09 03:42:59 -0500404 return;
405 }
Ed Tanousb41187f2019-10-24 16:30:02 -0700406 if (req.method() == boost::beast::http::verb::delete_)
asmithakarun1c7b07c2019-09-09 03:42:59 -0500407 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600408 handleFileDelete(asyncResp, fileID);
asmithakarun1c7b07c2019-09-09 03:42:59 -0500409 return;
410 }
Sunitha Harish97b0e432019-11-21 04:59:29 -0600411}
Ratan Gupta453fed02019-12-14 09:39:47 +0530412
Sunitha Harishdb81c072021-01-21 23:33:21 -0600413inline void
414 handleAcquireLockAPI(const crow::Request& req,
415 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
416 std::vector<nlohmann::json> body)
manojkiraneda0b631ae2019-12-03 17:54:28 +0530417{
418 LockRequests lockRequestStructure;
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500419 for (auto& element : body)
manojkiraneda0b631ae2019-12-03 17:54:28 +0530420 {
421 std::string lockType;
422 uint64_t resourceId;
423
424 SegmentFlags segInfo;
425 std::vector<nlohmann::json> segmentFlags;
426
Sunitha Harishdb81c072021-01-21 23:33:21 -0600427 if (!redfish::json_util::readJson(element, asyncResp->res, "LockType",
428 lockType, "ResourceID", resourceId,
manojkiraneda0b631ae2019-12-03 17:54:28 +0530429 "SegmentFlags", segmentFlags))
430 {
431 BMCWEB_LOG_DEBUG << "Not a Valid JSON";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600432 asyncResp->res.result(boost::beast::http::status::bad_request);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530433 return;
434 }
435 BMCWEB_LOG_DEBUG << lockType;
436 BMCWEB_LOG_DEBUG << resourceId;
437
438 BMCWEB_LOG_DEBUG << "Segment Flags are present";
439
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500440 for (auto& e : segmentFlags)
manojkiraneda0b631ae2019-12-03 17:54:28 +0530441 {
442 std::string lockFlags;
443 uint32_t segmentLength;
444
Sunitha Harishdb81c072021-01-21 23:33:21 -0600445 if (!redfish::json_util::readJson(e, asyncResp->res, "LockFlag",
446 lockFlags, "SegmentLength",
447 segmentLength))
manojkiraneda0b631ae2019-12-03 17:54:28 +0530448 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600449 asyncResp->res.result(boost::beast::http::status::bad_request);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530450 return;
451 }
452
453 BMCWEB_LOG_DEBUG << "Lockflag : " << lockFlags;
454 BMCWEB_LOG_DEBUG << "SegmentLength : " << segmentLength;
455
456 segInfo.push_back(std::make_pair(lockFlags, segmentLength));
457 }
Manojkiran Eda566329e2020-05-22 12:36:17 +0530458 lockRequestStructure.push_back(
459 make_tuple(req.session->uniqueId, req.session->clientId, lockType,
460 resourceId, segInfo));
manojkiraneda0b631ae2019-12-03 17:54:28 +0530461 }
462
463 // print lock request into journal
464
Ed Tanous4e087512020-09-28 18:41:25 -0700465 for (auto& i : lockRequestStructure)
manojkiraneda0b631ae2019-12-03 17:54:28 +0530466 {
Ed Tanous4e087512020-09-28 18:41:25 -0700467 BMCWEB_LOG_DEBUG << std::get<0>(i);
468 BMCWEB_LOG_DEBUG << std::get<1>(i);
469 BMCWEB_LOG_DEBUG << std::get<2>(i);
470 BMCWEB_LOG_DEBUG << std::get<3>(i);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530471
Ed Tanous4e087512020-09-28 18:41:25 -0700472 for (const auto& p : std::get<4>(i))
manojkiraneda0b631ae2019-12-03 17:54:28 +0530473 {
474 BMCWEB_LOG_DEBUG << p.first << ", " << p.second;
475 }
476 }
477
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500478 const LockRequests& t = lockRequestStructure;
manojkiraneda0b631ae2019-12-03 17:54:28 +0530479
Ratan Gupta07386c62019-12-14 14:06:09 +0530480 auto varAcquireLock = crow::ibm_mc_lock::Lock::getInstance().acquireLock(t);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530481
482 if (varAcquireLock.first)
483 {
484 // Either validity failure of there is a conflict with itself
485
486 auto validityStatus =
487 std::get<std::pair<bool, int>>(varAcquireLock.second);
488
489 if ((!validityStatus.first) && (validityStatus.second == 0))
490 {
491 BMCWEB_LOG_DEBUG << "Not a Valid record";
492 BMCWEB_LOG_DEBUG << "Bad json in request";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600493 asyncResp->res.result(boost::beast::http::status::bad_request);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530494 return;
495 }
496 if (validityStatus.first && (validityStatus.second == 1))
497 {
498 BMCWEB_LOG_DEBUG << "There is a conflict within itself";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600499 asyncResp->res.result(boost::beast::http::status::bad_request);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530500 return;
501 }
502 }
503 else
504 {
505 auto conflictStatus =
506 std::get<crow::ibm_mc_lock::Rc>(varAcquireLock.second);
507 if (!conflictStatus.first)
508 {
509 BMCWEB_LOG_DEBUG << "There is no conflict with the locktable";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600510 asyncResp->res.result(boost::beast::http::status::ok);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530511
512 auto var = std::get<uint32_t>(conflictStatus.second);
513 nlohmann::json returnJson;
514 returnJson["id"] = var;
Sunitha Harishdb81c072021-01-21 23:33:21 -0600515 asyncResp->res.jsonValue["TransactionID"] = var;
manojkiraneda0b631ae2019-12-03 17:54:28 +0530516 return;
517 }
Ed Tanous3174e4d2020-10-07 11:41:22 -0700518 BMCWEB_LOG_DEBUG << "There is a conflict with the lock table";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600519 asyncResp->res.result(boost::beast::http::status::conflict);
Ed Tanous3174e4d2020-10-07 11:41:22 -0700520 auto var =
521 std::get<std::pair<uint32_t, LockRequest>>(conflictStatus.second);
522 nlohmann::json returnJson, segments;
523 nlohmann::json myarray = nlohmann::json::array();
524 returnJson["TransactionID"] = var.first;
525 returnJson["SessionID"] = std::get<0>(var.second);
526 returnJson["HMCID"] = std::get<1>(var.second);
527 returnJson["LockType"] = std::get<2>(var.second);
528 returnJson["ResourceID"] = std::get<3>(var.second);
529
530 for (auto& i : std::get<4>(var.second))
manojkiraneda0b631ae2019-12-03 17:54:28 +0530531 {
Ed Tanous3174e4d2020-10-07 11:41:22 -0700532 segments["LockFlag"] = i.first;
533 segments["SegmentLength"] = i.second;
534 myarray.push_back(segments);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530535 }
Ed Tanous3174e4d2020-10-07 11:41:22 -0700536
537 returnJson["SegmentFlags"] = myarray;
538
Sunitha Harishdb81c072021-01-21 23:33:21 -0600539 asyncResp->res.jsonValue["Record"] = returnJson;
Ed Tanous3174e4d2020-10-07 11:41:22 -0700540 return;
manojkiraneda0b631ae2019-12-03 17:54:28 +0530541 }
542}
Sunitha Harishdb81c072021-01-21 23:33:21 -0600543inline void
544 handleRelaseAllAPI(const crow::Request& req,
545 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
Manojkiran Eda5bb0ece2020-01-20 20:22:36 +0530546{
547 crow::ibm_mc_lock::Lock::getInstance().releaseLock(req.session->uniqueId);
Sunitha Harishdb81c072021-01-21 23:33:21 -0600548 asyncResp->res.result(boost::beast::http::status::ok);
Manojkiran Eda5bb0ece2020-01-20 20:22:36 +0530549 return;
550}
manojkiraneda0b631ae2019-12-03 17:54:28 +0530551
Ed Tanous02379d32020-09-15 21:15:44 -0700552inline void
Sunitha Harishdb81c072021-01-21 23:33:21 -0600553 handleReleaseLockAPI(const crow::Request& req,
554 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
Ed Tanous02379d32020-09-15 21:15:44 -0700555 const std::vector<uint32_t>& listTransactionIds)
manojkiraneda3b6dea62019-12-13 17:05:36 +0530556{
557 BMCWEB_LOG_DEBUG << listTransactionIds.size();
558 BMCWEB_LOG_DEBUG << "Data is present";
Ed Tanous4e087512020-09-28 18:41:25 -0700559 for (unsigned int listTransactionId : listTransactionIds)
manojkiraneda3b6dea62019-12-13 17:05:36 +0530560 {
Ed Tanous4e087512020-09-28 18:41:25 -0700561 BMCWEB_LOG_DEBUG << listTransactionId;
manojkiraneda3b6dea62019-12-13 17:05:36 +0530562 }
563
manojkiraneda3b6dea62019-12-13 17:05:36 +0530564 // validate the request ids
565
Ratan Gupta07386c62019-12-14 14:06:09 +0530566 auto varReleaselock = crow::ibm_mc_lock::Lock::getInstance().releaseLock(
Manojkiran Eda566329e2020-05-22 12:36:17 +0530567 listTransactionIds,
568 std::make_pair(req.session->clientId, req.session->uniqueId));
manojkiraneda3b6dea62019-12-13 17:05:36 +0530569
570 if (!varReleaselock.first)
571 {
572 // validation Failed
Sunitha Harishdb81c072021-01-21 23:33:21 -0600573 asyncResp->res.result(boost::beast::http::status::bad_request);
manojkiraneda3b6dea62019-12-13 17:05:36 +0530574 return;
575 }
Ed Tanous3174e4d2020-10-07 11:41:22 -0700576 auto statusRelease =
577 std::get<crow::ibm_mc_lock::RcRelaseLock>(varReleaselock.second);
578 if (statusRelease.first)
manojkiraneda3b6dea62019-12-13 17:05:36 +0530579 {
Ed Tanous3174e4d2020-10-07 11:41:22 -0700580 // The current hmc owns all the locks, so we already released
581 // them
Ed Tanous3174e4d2020-10-07 11:41:22 -0700582 return;
manojkiraneda3b6dea62019-12-13 17:05:36 +0530583 }
Ed Tanous3174e4d2020-10-07 11:41:22 -0700584
585 // valid rid, but the current hmc does not own all the locks
586 BMCWEB_LOG_DEBUG << "Current HMC does not own all the locks";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600587 asyncResp->res.result(boost::beast::http::status::unauthorized);
Ed Tanous3174e4d2020-10-07 11:41:22 -0700588
589 auto var = statusRelease.second;
590 nlohmann::json returnJson, segments;
591 nlohmann::json myArray = nlohmann::json::array();
592 returnJson["TransactionID"] = var.first;
593 returnJson["SessionID"] = std::get<0>(var.second);
594 returnJson["HMCID"] = std::get<1>(var.second);
595 returnJson["LockType"] = std::get<2>(var.second);
596 returnJson["ResourceID"] = std::get<3>(var.second);
597
598 for (auto& i : std::get<4>(var.second))
599 {
600 segments["LockFlag"] = i.first;
601 segments["SegmentLength"] = i.second;
602 myArray.push_back(segments);
603 }
604
605 returnJson["SegmentFlags"] = myArray;
Sunitha Harishdb81c072021-01-21 23:33:21 -0600606 asyncResp->res.jsonValue["Record"] = returnJson;
Ed Tanous3174e4d2020-10-07 11:41:22 -0700607 return;
manojkiraneda3b6dea62019-12-13 17:05:36 +0530608}
609
Sunitha Harishdb81c072021-01-21 23:33:21 -0600610inline void
611 handleGetLockListAPI(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
612 const ListOfSessionIds& listSessionIds)
manojkiraneda402b5712019-12-13 17:07:09 +0530613{
614 BMCWEB_LOG_DEBUG << listSessionIds.size();
615
Ratan Gupta07386c62019-12-14 14:06:09 +0530616 auto status =
617 crow::ibm_mc_lock::Lock::getInstance().getLockList(listSessionIds);
manojkiraneda402b5712019-12-13 17:07:09 +0530618 auto var = std::get<std::vector<std::pair<uint32_t, LockRequests>>>(status);
619
620 nlohmann::json lockRecords = nlohmann::json::array();
621
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500622 for (const auto& transactionId : var)
manojkiraneda402b5712019-12-13 17:07:09 +0530623 {
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500624 for (const auto& lockRecord : transactionId.second)
manojkiraneda402b5712019-12-13 17:07:09 +0530625 {
626 nlohmann::json returnJson;
627
628 returnJson["TransactionID"] = transactionId.first;
629 returnJson["SessionID"] = std::get<0>(lockRecord);
630 returnJson["HMCID"] = std::get<1>(lockRecord);
631 returnJson["LockType"] = std::get<2>(lockRecord);
632 returnJson["ResourceID"] = std::get<3>(lockRecord);
633
634 nlohmann::json segments;
635 nlohmann::json segmentInfoArray = nlohmann::json::array();
636
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500637 for (const auto& segment : std::get<4>(lockRecord))
manojkiraneda402b5712019-12-13 17:07:09 +0530638 {
639 segments["LockFlag"] = segment.first;
640 segments["SegmentLength"] = segment.second;
641 segmentInfoArray.push_back(segments);
642 }
643
644 returnJson["SegmentFlags"] = segmentInfoArray;
645 lockRecords.push_back(returnJson);
646 }
647 }
Sunitha Harishdb81c072021-01-21 23:33:21 -0600648 asyncResp->res.result(boost::beast::http::status::ok);
649 asyncResp->res.jsonValue["Records"] = lockRecords;
manojkiraneda402b5712019-12-13 17:07:09 +0530650}
651
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500652inline bool isValidConfigFileName(const std::string& fileName,
653 crow::Response& res)
654{
655 if (fileName.empty())
656 {
657 BMCWEB_LOG_ERROR << "Empty filename";
658 res.jsonValue["Description"] = "Empty file path in the url";
659 return false;
660 }
661
662 // ConfigFile name is allowed to take upper and lowercase letters,
663 // numbers and hyphen
664 std::size_t found = fileName.find_first_not_of(
665 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-");
666 if (found != std::string::npos)
667 {
668 BMCWEB_LOG_ERROR << "Unsupported character in filename: " << fileName;
669 res.jsonValue["Description"] = "Unsupported character in filename";
670 return false;
671 }
672
673 // Check the filename length
674 if (fileName.length() > 20)
675 {
676 BMCWEB_LOG_ERROR << "Name must be maximum 20 characters. "
677 "Input filename length is: "
678 << fileName.length();
679 res.jsonValue["Description"] = "Filename must be maximum 20 characters";
680 return false;
681 }
682
683 return true;
684}
685
Ed Tanous02379d32020-09-15 21:15:44 -0700686inline void requestRoutes(App& app)
Ratan Gupta453fed02019-12-14 09:39:47 +0530687{
688
689 // allowed only for admin
690 BMCWEB_ROUTE(app, "/ibm/v1/")
Ed Tanous432a8902021-06-14 15:28:56 -0700691 .privileges({{"ConfigureComponents", "ConfigureManager"}})
Ed Tanousb41187f2019-10-24 16:30:02 -0700692 .methods(boost::beast::http::verb::get)(
zhanghch058d1b46d2021-04-01 11:18:24 +0800693 [](const crow::Request&,
694 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600695 asyncResp->res.jsonValue["@odata.type"] =
Ratan Gupta453fed02019-12-14 09:39:47 +0530696 "#ibmServiceRoot.v1_0_0.ibmServiceRoot";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600697 asyncResp->res.jsonValue["@odata.id"] = "/ibm/v1/";
698 asyncResp->res.jsonValue["Id"] = "IBM Rest RootService";
699 asyncResp->res.jsonValue["Name"] = "IBM Service Root";
700 asyncResp->res.jsonValue["ConfigFiles"] = {
Ratan Gupta453fed02019-12-14 09:39:47 +0530701 {"@odata.id", "/ibm/v1/Host/ConfigFiles"}};
Sunitha Harishdb81c072021-01-21 23:33:21 -0600702 asyncResp->res.jsonValue["LockService"] = {
Ratan Gupta453fed02019-12-14 09:39:47 +0530703 {"@odata.id", "/ibm/v1/HMC/LockService"}};
Sunitha Harishdb81c072021-01-21 23:33:21 -0600704 asyncResp->res.jsonValue["BroadcastService"] = {
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500705 {"@odata.id", "/ibm/v1/HMC/BroadcastService"}};
Ratan Gupta453fed02019-12-14 09:39:47 +0530706 });
Sunitha Harish97b0e432019-11-21 04:59:29 -0600707
Ratan Guptad3630cb2019-12-14 11:21:35 +0530708 BMCWEB_ROUTE(app, "/ibm/v1/Host/ConfigFiles")
Ed Tanous432a8902021-06-14 15:28:56 -0700709 .privileges({{"ConfigureComponents", "ConfigureManager"}})
Ed Tanousb41187f2019-10-24 16:30:02 -0700710 .methods(boost::beast::http::verb::get)(
zhanghch058d1b46d2021-04-01 11:18:24 +0800711 [](const crow::Request&,
712 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
713 handleConfigFileList(asyncResp);
Ratan Guptad3630cb2019-12-14 11:21:35 +0530714 });
715
716 BMCWEB_ROUTE(app,
Sunitha Harishe56f2542020-07-22 02:38:59 -0500717 "/ibm/v1/Host/ConfigFiles/Actions/IBMConfigFiles.DeleteAll")
Ed Tanous432a8902021-06-14 15:28:56 -0700718 .privileges({{"ConfigureComponents", "ConfigureManager"}})
Ed Tanousb41187f2019-10-24 16:30:02 -0700719 .methods(boost::beast::http::verb::post)(
zhanghch058d1b46d2021-04-01 11:18:24 +0800720 [](const crow::Request&,
721 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
722 deleteConfigFiles(asyncResp);
Ratan Guptad3630cb2019-12-14 11:21:35 +0530723 });
724
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500725 BMCWEB_ROUTE(app, "/ibm/v1/Host/ConfigFiles/<str>")
Ed Tanous432a8902021-06-14 15:28:56 -0700726 .privileges({{"ConfigureComponents", "ConfigureManager"}})
zhanghch058d1b46d2021-04-01 11:18:24 +0800727 .methods(boost::beast::http::verb::put, boost::beast::http::verb::get,
728 boost::beast::http::verb::delete_)(
729 [](const crow::Request& req,
730 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
731 const std::string& fileName) {
732 BMCWEB_LOG_DEBUG << "ConfigFile : " << fileName;
733 // Validate the incoming fileName
734 if (!isValidConfigFileName(fileName, asyncResp->res))
735 {
736 asyncResp->res.result(
737 boost::beast::http::status::bad_request);
738 return;
739 }
740 handleFileUrl(req, asyncResp, fileName);
741 });
Ratan Gupta734a1c32019-12-14 11:53:48 +0530742
743 BMCWEB_ROUTE(app, "/ibm/v1/HMC/LockService")
Ed Tanous432a8902021-06-14 15:28:56 -0700744 .privileges({{"ConfigureComponents", "ConfigureManager"}})
Ed Tanousb41187f2019-10-24 16:30:02 -0700745 .methods(boost::beast::http::verb::get)(
zhanghch058d1b46d2021-04-01 11:18:24 +0800746 [](const crow::Request&,
747 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
748 getLockServiceData(asyncResp);
Ratan Gupta734a1c32019-12-14 11:53:48 +0530749 });
manojkiraneda0b631ae2019-12-03 17:54:28 +0530750
751 BMCWEB_ROUTE(app, "/ibm/v1/HMC/LockService/Actions/LockService.AcquireLock")
Ed Tanous432a8902021-06-14 15:28:56 -0700752 .privileges({{"ConfigureComponents", "ConfigureManager"}})
zhanghch058d1b46d2021-04-01 11:18:24 +0800753 .methods(boost::beast::http::verb::post)(
754 [](const crow::Request& req,
755 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
756 std::vector<nlohmann::json> body;
757 if (!redfish::json_util::readJson(req, asyncResp->res,
758 "Request", body))
759 {
760 BMCWEB_LOG_DEBUG << "Not a Valid JSON";
761 asyncResp->res.result(
762 boost::beast::http::status::bad_request);
763 return;
764 }
765 handleAcquireLockAPI(req, asyncResp, body);
766 });
manojkiraneda3b6dea62019-12-13 17:05:36 +0530767 BMCWEB_ROUTE(app, "/ibm/v1/HMC/LockService/Actions/LockService.ReleaseLock")
Ed Tanous432a8902021-06-14 15:28:56 -0700768 .privileges({{"ConfigureComponents", "ConfigureManager"}})
zhanghch058d1b46d2021-04-01 11:18:24 +0800769 .methods(boost::beast::http::verb::post)(
770 [](const crow::Request& req,
771 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
772 std::string type;
773 std::vector<uint32_t> listTransactionIds;
manojkiraneda3b6dea62019-12-13 17:05:36 +0530774
zhanghch058d1b46d2021-04-01 11:18:24 +0800775 if (!redfish::json_util::readJson(req, asyncResp->res, "Type",
776 type, "TransactionIDs",
777 listTransactionIds))
778 {
779 asyncResp->res.result(
780 boost::beast::http::status::bad_request);
781 return;
782 }
783 if (type == "Transaction")
784 {
785 handleReleaseLockAPI(req, asyncResp, listTransactionIds);
786 }
787 else if (type == "Session")
788 {
789 handleRelaseAllAPI(req, asyncResp);
790 }
791 else
792 {
793 BMCWEB_LOG_DEBUG << " Value of Type : " << type
794 << "is Not a Valid key";
795 redfish::messages::propertyValueNotInList(asyncResp->res,
796 type, "Type");
797 }
798 });
manojkiraneda402b5712019-12-13 17:07:09 +0530799 BMCWEB_ROUTE(app, "/ibm/v1/HMC/LockService/Actions/LockService.GetLockList")
Ed Tanous432a8902021-06-14 15:28:56 -0700800 .privileges({{"ConfigureComponents", "ConfigureManager"}})
zhanghch058d1b46d2021-04-01 11:18:24 +0800801 .methods(boost::beast::http::verb::post)(
802 [](const crow::Request& req,
803 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
804 ListOfSessionIds listSessionIds;
manojkiraneda402b5712019-12-13 17:07:09 +0530805
zhanghch058d1b46d2021-04-01 11:18:24 +0800806 if (!redfish::json_util::readJson(req, asyncResp->res,
807 "SessionIDs", listSessionIds))
808 {
809 asyncResp->res.result(
810 boost::beast::http::status::bad_request);
811 return;
812 }
813 handleGetLockListAPI(asyncResp, listSessionIds);
814 });
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500815
816 BMCWEB_ROUTE(app, "/ibm/v1/HMC/BroadcastService")
Ed Tanous432a8902021-06-14 15:28:56 -0700817 .privileges({{"ConfigureComponents", "ConfigureManager"}})
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500818 .methods(boost::beast::http::verb::post)(
zhanghch058d1b46d2021-04-01 11:18:24 +0800819 [](const crow::Request& req,
820 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
821 handleBroadcastService(req, asyncResp);
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500822 });
Ratan Gupta453fed02019-12-14 09:39:47 +0530823}
824
825} // namespace ibm_mc
826} // namespace crow