blob: 34befd7fb1b27dde62963479aa3392533835e3a7 [file] [log] [blame]
Ratan Gupta453fed02019-12-14 09:39:47 +05301#pragma once
Ratan Gupta453fed02019-12-14 09:39:47 +05302
Ed Tanous04e438c2020-10-03 08:06:26 -07003#include <app.hpp>
Ratan Gupta453fed02019-12-14 09:39:47 +05304#include <async_resp.hpp>
Ed Tanous11ba3972022-07-11 09:50:41 -07005#include <boost/algorithm/string/predicate.hpp>
Sunitha Harish97b0e432019-11-21 04:59:29 -06006#include <boost/container/flat_set.hpp>
Manojkiran Eda5bb0ece2020-01-20 20:22:36 +05307#include <error_messages.hpp>
Sunitha Harish96330b92020-06-26 05:42:14 -05008#include <event_service_manager.hpp>
manojkiraneda0b631ae2019-12-03 17:54:28 +05309#include <ibm/locks.hpp>
10#include <nlohmann/json.hpp>
Sunitha Harish96330b92020-06-26 05:42:14 -050011#include <resource_messages.hpp>
Sunitha Harish97b0e432019-11-21 04:59:29 -060012#include <sdbusplus/message/types.hpp>
manojkiraneda0b631ae2019-12-03 17:54:28 +053013#include <utils/json_utils.hpp>
Sunitha Harish97b0e432019-11-21 04:59:29 -060014
Gunnar Mills1214b7e2020-06-04 10:11:30 -050015#include <filesystem>
16#include <fstream>
Gunnar Mills1214b7e2020-06-04 10:11:30 -050017
manojkiraneda0b631ae2019-12-03 17:54:28 +053018using SType = std::string;
19using SegmentFlags = std::vector<std::pair<std::string, uint32_t>>;
20using LockRequest = std::tuple<SType, SType, SType, uint64_t, SegmentFlags>;
21using LockRequests = std::vector<LockRequest>;
22using Rc = std::pair<bool, std::variant<uint32_t, LockRequest>>;
manojkiraneda402b5712019-12-13 17:07:09 +053023using RcGetLockList =
24 std::variant<std::string, std::vector<std::pair<uint32_t, LockRequests>>>;
25using ListOfSessionIds = std::vector<std::string>;
Ratan Gupta453fed02019-12-14 09:39:47 +053026namespace crow
27{
28namespace ibm_mc
29{
Gunnar Mills1214b7e2020-06-04 10:11:30 -050030constexpr const char* methodNotAllowedMsg = "Method Not Allowed";
31constexpr const char* resourceNotFoundMsg = "Resource Not Found";
32constexpr const char* contentNotAcceptableMsg = "Content Not Acceptable";
33constexpr const char* internalServerError = "Internal Server Error";
Sunitha Harish97b0e432019-11-21 04:59:29 -060034
Sunitha Harish7c0bbe72020-07-30 08:25:28 -050035constexpr size_t maxSaveareaDirSize =
Sunitha Harishf8a43472022-08-08 02:07:12 -050036 25000000; // Allow save area dir size to be max 25MB
Sunitha Harish7c0bbe72020-07-30 08:25:28 -050037constexpr size_t minSaveareaFileSize =
38 100; // Allow save area file size of minimum 100B
Asmitha Karunanithi5738de52020-07-17 02:03:31 -050039constexpr size_t maxSaveareaFileSize =
40 500000; // Allow save area file size upto 500KB
41constexpr size_t maxBroadcastMsgSize =
42 1000; // Allow Broadcast message size upto 1KB
43
Sunitha Harishdb81c072021-01-21 23:33:21 -060044inline void handleFilePut(const crow::Request& req,
45 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
Ed Tanous02379d32020-09-15 21:15:44 -070046 const std::string& fileID)
Sunitha Harish97b0e432019-11-21 04:59:29 -060047{
Sunitha Harish7c0bbe72020-07-30 08:25:28 -050048 std::error_code ec;
Sunitha Harish97b0e432019-11-21 04:59:29 -060049 // Check the content-type of the request
Sunitha Harish086d32c2021-02-01 02:11:49 -060050 boost::beast::string_view contentType = req.getHeaderValue("content-type");
51 if (!boost::iequals(contentType, "application/octet-stream"))
Sunitha Harish97b0e432019-11-21 04:59:29 -060052 {
Sunitha Harishdb81c072021-01-21 23:33:21 -060053 asyncResp->res.result(boost::beast::http::status::not_acceptable);
54 asyncResp->res.jsonValue["Description"] = contentNotAcceptableMsg;
Sunitha Harish97b0e432019-11-21 04:59:29 -060055 return;
56 }
Sunitha Harish086d32c2021-02-01 02:11:49 -060057 BMCWEB_LOG_DEBUG
58 << "File upload in application/octet-stream format. Continue..";
asmithakarun1c7b07c2019-09-09 03:42:59 -050059
60 BMCWEB_LOG_DEBUG
61 << "handleIbmPut: Request to create/update the save-area file";
Sunitha Harish3e919b52020-10-13 01:21:48 -050062 std::string_view path =
63 "/var/lib/bmcweb/ibm-management-console/configfiles";
64 if (!crow::ibm_utils::createDirectory(path))
Sunitha Harish97b0e432019-11-21 04:59:29 -060065 {
Sunitha Harishdb81c072021-01-21 23:33:21 -060066 asyncResp->res.result(boost::beast::http::status::not_found);
67 asyncResp->res.jsonValue["Description"] = resourceNotFoundMsg;
asmithakarun1c7b07c2019-09-09 03:42:59 -050068 return;
69 }
Sunitha Harish7c0bbe72020-07-30 08:25:28 -050070
asmithakarun1c7b07c2019-09-09 03:42:59 -050071 std::ofstream file;
Sunitha Harish3e919b52020-10-13 01:21:48 -050072 std::filesystem::path loc(
73 "/var/lib/bmcweb/ibm-management-console/configfiles");
Sunitha Harish97b0e432019-11-21 04:59:29 -060074
Sunitha Harish7c0bbe72020-07-30 08:25:28 -050075 // Get the current size of the savearea directory
76 std::filesystem::recursive_directory_iterator iter(loc, ec);
77 if (ec)
78 {
Sunitha Harishdb81c072021-01-21 23:33:21 -060079 asyncResp->res.result(
80 boost::beast::http::status::internal_server_error);
81 asyncResp->res.jsonValue["Description"] = internalServerError;
Sunitha Harish7c0bbe72020-07-30 08:25:28 -050082 BMCWEB_LOG_DEBUG << "handleIbmPut: Failed to prepare save-area "
83 "directory iterator. ec : "
84 << ec;
85 return;
86 }
87 std::uintmax_t saveAreaDirSize = 0;
Ed Tanous9eb808c2022-01-25 10:19:23 -080088 for (const auto& it : iter)
Sunitha Harish7c0bbe72020-07-30 08:25:28 -050089 {
90 if (!std::filesystem::is_directory(it, ec))
91 {
92 if (ec)
93 {
Sunitha Harishdb81c072021-01-21 23:33:21 -060094 asyncResp->res.result(
95 boost::beast::http::status::internal_server_error);
96 asyncResp->res.jsonValue["Description"] = internalServerError;
Sunitha Harish7c0bbe72020-07-30 08:25:28 -050097 BMCWEB_LOG_DEBUG << "handleIbmPut: Failed to find save-area "
98 "directory . ec : "
99 << ec;
100 return;
101 }
102 std::uintmax_t fileSize = std::filesystem::file_size(it, ec);
103 if (ec)
104 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600105 asyncResp->res.result(
106 boost::beast::http::status::internal_server_error);
107 asyncResp->res.jsonValue["Description"] = internalServerError;
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500108 BMCWEB_LOG_DEBUG << "handleIbmPut: Failed to find save-area "
109 "file size inside the directory . ec : "
110 << ec;
111 return;
112 }
113 saveAreaDirSize += fileSize;
114 }
115 }
116 BMCWEB_LOG_DEBUG << "saveAreaDirSize: " << saveAreaDirSize;
117
118 // Get the file size getting uploaded
Ed Tanous3174e4d2020-10-07 11:41:22 -0700119 const std::string& data = req.body;
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500120 BMCWEB_LOG_DEBUG << "data length: " << data.length();
121
122 if (data.length() < minSaveareaFileSize)
123 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600124 asyncResp->res.result(boost::beast::http::status::bad_request);
125 asyncResp->res.jsonValue["Description"] =
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500126 "File size is less than minimum allowed size[100B]";
127 return;
128 }
129 if (data.length() > maxSaveareaFileSize)
asmithakarun1c7b07c2019-09-09 03:42:59 -0500130 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600131 asyncResp->res.result(boost::beast::http::status::bad_request);
132 asyncResp->res.jsonValue["Description"] =
Ratan Guptae46946a2020-05-11 13:22:59 +0530133 "File size exceeds maximum allowed size[500KB]";
asmithakarun1c7b07c2019-09-09 03:42:59 -0500134 return;
135 }
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500136
137 // Form the file path
138 loc /= fileID;
Ed Tanous8cc8ede2022-02-28 10:20:59 -0800139 BMCWEB_LOG_DEBUG << "Writing to the file: " << loc.string();
Asmitha Karunanithi10693fa2020-07-27 02:27:49 -0500140
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500141 // Check if the same file exists in the directory
142 bool fileExists = std::filesystem::exists(loc, ec);
143 if (ec)
Asmitha Karunanithi10693fa2020-07-27 02:27:49 -0500144 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600145 asyncResp->res.result(
146 boost::beast::http::status::internal_server_error);
147 asyncResp->res.jsonValue["Description"] = internalServerError;
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500148 BMCWEB_LOG_DEBUG << "handleIbmPut: Failed to find if file exists. ec : "
149 << ec;
150 return;
Asmitha Karunanithi10693fa2020-07-27 02:27:49 -0500151 }
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500152
153 std::uintmax_t newSizeToWrite = 0;
154 if (fileExists)
155 {
156 // File exists. Get the current file size
157 std::uintmax_t currentFileSize = std::filesystem::file_size(loc, ec);
158 if (ec)
159 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600160 asyncResp->res.result(
161 boost::beast::http::status::internal_server_error);
162 asyncResp->res.jsonValue["Description"] = internalServerError;
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500163 BMCWEB_LOG_DEBUG << "handleIbmPut: Failed to find file size. ec : "
164 << ec;
165 return;
166 }
167 // Calculate the difference in the file size.
168 // If the data.length is greater than the existing file size, then
169 // calculate the difference. Else consider the delta size as zero -
170 // because there is no increase in the total directory size.
171 // We need to add the diff only if the incoming data is larger than the
172 // existing filesize
173 if (data.length() > currentFileSize)
174 {
175 newSizeToWrite = data.length() - currentFileSize;
176 }
177 BMCWEB_LOG_DEBUG << "newSizeToWrite: " << newSizeToWrite;
178 }
179 else
180 {
181 // This is a new file upload
182 newSizeToWrite = data.length();
183 }
184
185 // Calculate the total dir size before writing the new file
186 BMCWEB_LOG_DEBUG << "total new size: " << saveAreaDirSize + newSizeToWrite;
187
188 if ((saveAreaDirSize + newSizeToWrite) > maxSaveareaDirSize)
189 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600190 asyncResp->res.result(boost::beast::http::status::bad_request);
191 asyncResp->res.jsonValue["Description"] =
192 "File size does not fit in the savearea "
Sunitha Harishf8a43472022-08-08 02:07:12 -0500193 "directory maximum allowed size[25MB]";
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500194 return;
195 }
196
asmithakarun1c7b07c2019-09-09 03:42:59 -0500197 file.open(loc, std::ofstream::out);
Sunitha Harish3e919b52020-10-13 01:21:48 -0500198
199 // set the permission of the file to 600
200 std::filesystem::perms permission = std::filesystem::perms::owner_write |
201 std::filesystem::perms::owner_read;
202 std::filesystem::permissions(loc, permission);
203
asmithakarun1c7b07c2019-09-09 03:42:59 -0500204 if (file.fail())
205 {
206 BMCWEB_LOG_DEBUG << "Error while opening the file for writing";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600207 asyncResp->res.result(
208 boost::beast::http::status::internal_server_error);
209 asyncResp->res.jsonValue["Description"] =
210 "Error while creating the file";
asmithakarun1c7b07c2019-09-09 03:42:59 -0500211 return;
Sunitha Harish97b0e432019-11-21 04:59:29 -0600212 }
Ed Tanous3174e4d2020-10-07 11:41:22 -0700213 file << data;
Sunitha Harish3e919b52020-10-13 01:21:48 -0500214
Ed Tanous3174e4d2020-10-07 11:41:22 -0700215 std::string origin = "/ibm/v1/Host/ConfigFiles/" + fileID;
216 // Push an event
217 if (fileExists)
218 {
219 BMCWEB_LOG_DEBUG << "config file is updated";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600220 asyncResp->res.jsonValue["Description"] = "File Updated";
Ed Tanous3174e4d2020-10-07 11:41:22 -0700221
222 redfish::EventServiceManager::getInstance().sendEvent(
223 redfish::messages::resourceChanged(), origin, "IBMConfigFile");
224 }
Sunitha Harish97b0e432019-11-21 04:59:29 -0600225 else
226 {
Ed Tanous3174e4d2020-10-07 11:41:22 -0700227 BMCWEB_LOG_DEBUG << "config file is created";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600228 asyncResp->res.jsonValue["Description"] = "File Created";
Asmitha Karunanithi10693fa2020-07-27 02:27:49 -0500229
Ed Tanous3174e4d2020-10-07 11:41:22 -0700230 redfish::EventServiceManager::getInstance().sendEvent(
231 redfish::messages::resourceCreated(), origin, "IBMConfigFile");
asmithakarun1c7b07c2019-09-09 03:42:59 -0500232 }
Ratan Guptad3630cb2019-12-14 11:21:35 +0530233}
asmithakarun1c7b07c2019-09-09 03:42:59 -0500234
zhanghch058d1b46d2021-04-01 11:18:24 +0800235inline void
236 handleConfigFileList(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
Ratan Guptad3630cb2019-12-14 11:21:35 +0530237{
238 std::vector<std::string> pathObjList;
Sunitha Harish3e919b52020-10-13 01:21:48 -0500239 std::filesystem::path loc(
240 "/var/lib/bmcweb/ibm-management-console/configfiles");
Ratan Guptad3630cb2019-12-14 11:21:35 +0530241 if (std::filesystem::exists(loc) && std::filesystem::is_directory(loc))
242 {
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500243 for (const auto& file : std::filesystem::directory_iterator(loc))
Ratan Guptad3630cb2019-12-14 11:21:35 +0530244 {
Ed Tanous3174e4d2020-10-07 11:41:22 -0700245 const std::filesystem::path& pathObj = file.path();
cm-jishnu5a193962022-12-02 03:45:27 -0600246 if (std::filesystem::is_regular_file(pathObj))
247 {
248 pathObjList.push_back("/ibm/v1/Host/ConfigFiles/" +
249 pathObj.filename().string());
250 }
Ratan Guptad3630cb2019-12-14 11:21:35 +0530251 }
252 }
Sunitha Harishdb81c072021-01-21 23:33:21 -0600253 asyncResp->res.jsonValue["@odata.type"] =
254 "#IBMConfigFile.v1_0_0.IBMConfigFile";
255 asyncResp->res.jsonValue["@odata.id"] = "/ibm/v1/Host/ConfigFiles/";
256 asyncResp->res.jsonValue["Id"] = "ConfigFiles";
257 asyncResp->res.jsonValue["Name"] = "ConfigFiles";
Ratan Guptad3630cb2019-12-14 11:21:35 +0530258
Sunitha Harishdb81c072021-01-21 23:33:21 -0600259 asyncResp->res.jsonValue["Members"] = std::move(pathObjList);
260 asyncResp->res.jsonValue["Actions"]["#IBMConfigFiles.DeleteAll"] = {
Ratan Guptad3630cb2019-12-14 11:21:35 +0530261 {"target",
Sunitha Harishe56f2542020-07-22 02:38:59 -0500262 "/ibm/v1/Host/ConfigFiles/Actions/IBMConfigFiles.DeleteAll"}};
Ratan Guptad3630cb2019-12-14 11:21:35 +0530263}
264
zhanghch058d1b46d2021-04-01 11:18:24 +0800265inline void
266 deleteConfigFiles(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
Ratan Guptad3630cb2019-12-14 11:21:35 +0530267{
Ratan Guptad3630cb2019-12-14 11:21:35 +0530268 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 }
asmithakarun1c7b07c2019-09-09 03:42:59 -0500284}
285
zhanghch058d1b46d2021-04-01 11:18:24 +0800286inline void
287 getLockServiceData(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
Ratan Gupta734a1c32019-12-14 11:53:48 +0530288{
Sunitha Harishdb81c072021-01-21 23:33:21 -0600289 asyncResp->res.jsonValue["@odata.type"] = "#LockService.v1_0_0.LockService";
290 asyncResp->res.jsonValue["@odata.id"] = "/ibm/v1/HMC/LockService/";
291 asyncResp->res.jsonValue["Id"] = "LockService";
292 asyncResp->res.jsonValue["Name"] = "LockService";
Ratan Gupta734a1c32019-12-14 11:53:48 +0530293
Sunitha Harishdb81c072021-01-21 23:33:21 -0600294 asyncResp->res.jsonValue["Actions"]["#LockService.AcquireLock"] = {
Ratan Gupta734a1c32019-12-14 11:53:48 +0530295 {"target", "/ibm/v1/HMC/LockService/Actions/LockService.AcquireLock"}};
Sunitha Harishdb81c072021-01-21 23:33:21 -0600296 asyncResp->res.jsonValue["Actions"]["#LockService.ReleaseLock"] = {
Ratan Gupta734a1c32019-12-14 11:53:48 +0530297 {"target", "/ibm/v1/HMC/LockService/Actions/LockService.ReleaseLock"}};
Sunitha Harishdb81c072021-01-21 23:33:21 -0600298 asyncResp->res.jsonValue["Actions"]["#LockService.GetLockList"] = {
Ratan Gupta734a1c32019-12-14 11:53:48 +0530299 {"target", "/ibm/v1/HMC/LockService/Actions/LockService.GetLockList"}};
Ratan Gupta734a1c32019-12-14 11:53:48 +0530300}
301
Sunitha Harishdb81c072021-01-21 23:33:21 -0600302inline void handleFileGet(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
303 const std::string& fileID)
asmithakarun1c7b07c2019-09-09 03:42:59 -0500304{
305 BMCWEB_LOG_DEBUG << "HandleGet on SaveArea files on path: " << fileID;
Sunitha Harish3e919b52020-10-13 01:21:48 -0500306 std::filesystem::path loc(
307 "/var/lib/bmcweb/ibm-management-console/configfiles/" + fileID);
cm-jishnu5a193962022-12-02 03:45:27 -0600308 if (!std::filesystem::exists(loc) || !std::filesystem::is_regular_file(loc))
asmithakarun1c7b07c2019-09-09 03:42:59 -0500309 {
Sunitha Harishf8a43472022-08-08 02:07:12 -0500310 BMCWEB_LOG_ERROR << loc.string() << " Not found";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600311 asyncResp->res.result(boost::beast::http::status::not_found);
312 asyncResp->res.jsonValue["Description"] = resourceNotFoundMsg;
asmithakarun1c7b07c2019-09-09 03:42:59 -0500313 return;
314 }
315
316 std::ifstream readfile(loc.string());
317 if (!readfile)
318 {
Sunitha Harishf8a43472022-08-08 02:07:12 -0500319 BMCWEB_LOG_ERROR << loc.string() << " Not found";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600320 asyncResp->res.result(boost::beast::http::status::not_found);
321 asyncResp->res.jsonValue["Description"] = resourceNotFoundMsg;
asmithakarun1c7b07c2019-09-09 03:42:59 -0500322 return;
323 }
324
325 std::string contentDispositionParam =
326 "attachment; filename=\"" + fileID + "\"";
Ed Tanousd9f6c622022-03-17 09:12:17 -0700327 asyncResp->res.addHeader(boost::beast::http::field::content_disposition,
328 contentDispositionParam);
asmithakarun1c7b07c2019-09-09 03:42:59 -0500329 std::string fileData;
330 fileData = {std::istreambuf_iterator<char>(readfile),
331 std::istreambuf_iterator<char>()};
Sunitha Harishdb81c072021-01-21 23:33:21 -0600332 asyncResp->res.jsonValue["Data"] = fileData;
asmithakarun1c7b07c2019-09-09 03:42:59 -0500333}
334
Sunitha Harishdb81c072021-01-21 23:33:21 -0600335inline void
336 handleFileDelete(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
337 const std::string& fileID)
asmithakarun1c7b07c2019-09-09 03:42:59 -0500338{
Sunitha Harish3e919b52020-10-13 01:21:48 -0500339 std::string filePath("/var/lib/bmcweb/ibm-management-console/configfiles/" +
340 fileID);
asmithakarun1c7b07c2019-09-09 03:42:59 -0500341 BMCWEB_LOG_DEBUG << "Removing the file : " << filePath << "\n";
Ed Tanous2c70f802020-09-28 14:29:23 -0700342 std::ifstream fileOpen(filePath.c_str());
343 if (static_cast<bool>(fileOpen))
Ed Tanous3174e4d2020-10-07 11:41:22 -0700344 {
asmithakarun1c7b07c2019-09-09 03:42:59 -0500345 if (remove(filePath.c_str()) == 0)
346 {
347 BMCWEB_LOG_DEBUG << "File removed!\n";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600348 asyncResp->res.jsonValue["Description"] = "File Deleted";
asmithakarun1c7b07c2019-09-09 03:42:59 -0500349 }
350 else
351 {
352 BMCWEB_LOG_ERROR << "File not removed!\n";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600353 asyncResp->res.result(
354 boost::beast::http::status::internal_server_error);
355 asyncResp->res.jsonValue["Description"] = internalServerError;
asmithakarun1c7b07c2019-09-09 03:42:59 -0500356 }
Ed Tanous3174e4d2020-10-07 11:41:22 -0700357 }
asmithakarun1c7b07c2019-09-09 03:42:59 -0500358 else
359 {
360 BMCWEB_LOG_ERROR << "File not found!\n";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600361 asyncResp->res.result(boost::beast::http::status::not_found);
362 asyncResp->res.jsonValue["Description"] = resourceNotFoundMsg;
Sunitha Harish97b0e432019-11-21 04:59:29 -0600363 }
Sunitha Harish97b0e432019-11-21 04:59:29 -0600364}
365
zhanghch058d1b46d2021-04-01 11:18:24 +0800366inline void
367 handleBroadcastService(const crow::Request& req,
368 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500369{
370 std::string broadcastMsg;
371
Willy Tu15ed6782021-12-14 11:03:16 -0800372 if (!redfish::json_util::readJsonPatch(req, asyncResp->res, "Message",
373 broadcastMsg))
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500374 {
375 BMCWEB_LOG_DEBUG << "Not a Valid JSON";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600376 asyncResp->res.result(boost::beast::http::status::bad_request);
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500377 return;
378 }
379 if (broadcastMsg.size() > maxBroadcastMsgSize)
380 {
381 BMCWEB_LOG_ERROR << "Message size exceeds maximum allowed size[1KB]";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600382 asyncResp->res.result(boost::beast::http::status::bad_request);
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500383 return;
384 }
385 redfish::EventServiceManager::getInstance().sendBroadcastMsg(broadcastMsg);
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500386}
387
zhanghch058d1b46d2021-04-01 11:18:24 +0800388inline void handleFileUrl(const crow::Request& req,
389 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500390 const std::string& fileID)
Sunitha Harish97b0e432019-11-21 04:59:29 -0600391{
Ed Tanousb41187f2019-10-24 16:30:02 -0700392 if (req.method() == boost::beast::http::verb::put)
Sunitha Harish97b0e432019-11-21 04:59:29 -0600393 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600394 handleFilePut(req, asyncResp, fileID);
Sunitha Harish97b0e432019-11-21 04:59:29 -0600395 return;
396 }
Ed Tanousb41187f2019-10-24 16:30:02 -0700397 if (req.method() == boost::beast::http::verb::get)
asmithakarun1c7b07c2019-09-09 03:42:59 -0500398 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600399 handleFileGet(asyncResp, fileID);
asmithakarun1c7b07c2019-09-09 03:42:59 -0500400 return;
401 }
Ed Tanousb41187f2019-10-24 16:30:02 -0700402 if (req.method() == boost::beast::http::verb::delete_)
asmithakarun1c7b07c2019-09-09 03:42:59 -0500403 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600404 handleFileDelete(asyncResp, fileID);
asmithakarun1c7b07c2019-09-09 03:42:59 -0500405 return;
406 }
Sunitha Harish97b0e432019-11-21 04:59:29 -0600407}
Ratan Gupta453fed02019-12-14 09:39:47 +0530408
Sunitha Harishdb81c072021-01-21 23:33:21 -0600409inline void
410 handleAcquireLockAPI(const crow::Request& req,
411 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
412 std::vector<nlohmann::json> body)
manojkiraneda0b631ae2019-12-03 17:54:28 +0530413{
414 LockRequests lockRequestStructure;
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500415 for (auto& element : body)
manojkiraneda0b631ae2019-12-03 17:54:28 +0530416 {
417 std::string lockType;
Ed Tanous543f4402022-01-06 13:12:53 -0800418 uint64_t resourceId = 0;
manojkiraneda0b631ae2019-12-03 17:54:28 +0530419
420 SegmentFlags segInfo;
421 std::vector<nlohmann::json> segmentFlags;
422
Sunitha Harishdb81c072021-01-21 23:33:21 -0600423 if (!redfish::json_util::readJson(element, asyncResp->res, "LockType",
424 lockType, "ResourceID", resourceId,
manojkiraneda0b631ae2019-12-03 17:54:28 +0530425 "SegmentFlags", segmentFlags))
426 {
427 BMCWEB_LOG_DEBUG << "Not a Valid JSON";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600428 asyncResp->res.result(boost::beast::http::status::bad_request);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530429 return;
430 }
431 BMCWEB_LOG_DEBUG << lockType;
432 BMCWEB_LOG_DEBUG << resourceId;
433
434 BMCWEB_LOG_DEBUG << "Segment Flags are present";
435
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500436 for (auto& e : segmentFlags)
manojkiraneda0b631ae2019-12-03 17:54:28 +0530437 {
438 std::string lockFlags;
Ed Tanous543f4402022-01-06 13:12:53 -0800439 uint32_t segmentLength = 0;
manojkiraneda0b631ae2019-12-03 17:54:28 +0530440
Sunitha Harishdb81c072021-01-21 23:33:21 -0600441 if (!redfish::json_util::readJson(e, asyncResp->res, "LockFlag",
442 lockFlags, "SegmentLength",
443 segmentLength))
manojkiraneda0b631ae2019-12-03 17:54:28 +0530444 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600445 asyncResp->res.result(boost::beast::http::status::bad_request);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530446 return;
447 }
448
449 BMCWEB_LOG_DEBUG << "Lockflag : " << lockFlags;
450 BMCWEB_LOG_DEBUG << "SegmentLength : " << segmentLength;
451
452 segInfo.push_back(std::make_pair(lockFlags, segmentLength));
453 }
Ed Tanousbb759e32022-08-02 17:07:54 -0700454
455 lockRequestStructure.push_back(make_tuple(
456 req.session->uniqueId, req.session->clientId.value_or(""), lockType,
457 resourceId, segInfo));
manojkiraneda0b631ae2019-12-03 17:54:28 +0530458 }
459
460 // print lock request into journal
461
Ed Tanous4e087512020-09-28 18:41:25 -0700462 for (auto& i : lockRequestStructure)
manojkiraneda0b631ae2019-12-03 17:54:28 +0530463 {
Ed Tanous4e087512020-09-28 18:41:25 -0700464 BMCWEB_LOG_DEBUG << std::get<0>(i);
465 BMCWEB_LOG_DEBUG << std::get<1>(i);
466 BMCWEB_LOG_DEBUG << std::get<2>(i);
467 BMCWEB_LOG_DEBUG << std::get<3>(i);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530468
Ed Tanous4e087512020-09-28 18:41:25 -0700469 for (const auto& p : std::get<4>(i))
manojkiraneda0b631ae2019-12-03 17:54:28 +0530470 {
471 BMCWEB_LOG_DEBUG << p.first << ", " << p.second;
472 }
473 }
474
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500475 const LockRequests& t = lockRequestStructure;
manojkiraneda0b631ae2019-12-03 17:54:28 +0530476
Ratan Gupta07386c62019-12-14 14:06:09 +0530477 auto varAcquireLock = crow::ibm_mc_lock::Lock::getInstance().acquireLock(t);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530478
479 if (varAcquireLock.first)
480 {
481 // Either validity failure of there is a conflict with itself
482
483 auto validityStatus =
484 std::get<std::pair<bool, int>>(varAcquireLock.second);
485
486 if ((!validityStatus.first) && (validityStatus.second == 0))
487 {
488 BMCWEB_LOG_DEBUG << "Not a Valid record";
489 BMCWEB_LOG_DEBUG << "Bad json in request";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600490 asyncResp->res.result(boost::beast::http::status::bad_request);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530491 return;
492 }
493 if (validityStatus.first && (validityStatus.second == 1))
494 {
Sunitha Harish3e7ab702022-08-08 02:08:39 -0500495 BMCWEB_LOG_ERROR << "There is a conflict within itself";
Sunitha Harishf8a43472022-08-08 02:07:12 -0500496 asyncResp->res.result(boost::beast::http::status::conflict);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530497 return;
498 }
499 }
500 else
501 {
502 auto conflictStatus =
503 std::get<crow::ibm_mc_lock::Rc>(varAcquireLock.second);
504 if (!conflictStatus.first)
505 {
506 BMCWEB_LOG_DEBUG << "There is no conflict with the locktable";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600507 asyncResp->res.result(boost::beast::http::status::ok);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530508
509 auto var = std::get<uint32_t>(conflictStatus.second);
510 nlohmann::json returnJson;
511 returnJson["id"] = var;
Sunitha Harishdb81c072021-01-21 23:33:21 -0600512 asyncResp->res.jsonValue["TransactionID"] = var;
manojkiraneda0b631ae2019-12-03 17:54:28 +0530513 return;
514 }
Ed Tanous3174e4d2020-10-07 11:41:22 -0700515 BMCWEB_LOG_DEBUG << "There is a conflict with the lock table";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600516 asyncResp->res.result(boost::beast::http::status::conflict);
Ed Tanous3174e4d2020-10-07 11:41:22 -0700517 auto var =
518 std::get<std::pair<uint32_t, LockRequest>>(conflictStatus.second);
Ed Tanouse05aec52022-01-25 10:28:56 -0800519 nlohmann::json returnJson;
520 nlohmann::json segments;
Ed Tanous3174e4d2020-10-07 11:41:22 -0700521 nlohmann::json myarray = nlohmann::json::array();
522 returnJson["TransactionID"] = var.first;
523 returnJson["SessionID"] = std::get<0>(var.second);
524 returnJson["HMCID"] = std::get<1>(var.second);
525 returnJson["LockType"] = std::get<2>(var.second);
526 returnJson["ResourceID"] = std::get<3>(var.second);
527
Ed Tanous02cad962022-06-30 16:50:15 -0700528 for (const auto& i : std::get<4>(var.second))
manojkiraneda0b631ae2019-12-03 17:54:28 +0530529 {
Ed Tanous3174e4d2020-10-07 11:41:22 -0700530 segments["LockFlag"] = i.first;
531 segments["SegmentLength"] = i.second;
532 myarray.push_back(segments);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530533 }
Ed Tanous3174e4d2020-10-07 11:41:22 -0700534
535 returnJson["SegmentFlags"] = myarray;
Sunitha Harish3e7ab702022-08-08 02:08:39 -0500536 BMCWEB_LOG_ERROR << "Conflicting lock record: " << returnJson;
Sunitha Harishdb81c072021-01-21 23:33:21 -0600537 asyncResp->res.jsonValue["Record"] = returnJson;
Ed Tanous3174e4d2020-10-07 11:41:22 -0700538 return;
manojkiraneda0b631ae2019-12-03 17:54:28 +0530539 }
540}
Sunitha Harishdb81c072021-01-21 23:33:21 -0600541inline void
542 handleRelaseAllAPI(const crow::Request& req,
543 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
Manojkiran Eda5bb0ece2020-01-20 20:22:36 +0530544{
545 crow::ibm_mc_lock::Lock::getInstance().releaseLock(req.session->uniqueId);
Sunitha Harishdb81c072021-01-21 23:33:21 -0600546 asyncResp->res.result(boost::beast::http::status::ok);
Manojkiran Eda5bb0ece2020-01-20 20:22:36 +0530547}
manojkiraneda0b631ae2019-12-03 17:54:28 +0530548
Ed Tanous02379d32020-09-15 21:15:44 -0700549inline void
Sunitha Harishdb81c072021-01-21 23:33:21 -0600550 handleReleaseLockAPI(const crow::Request& req,
551 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
Ed Tanous02379d32020-09-15 21:15:44 -0700552 const std::vector<uint32_t>& listTransactionIds)
manojkiraneda3b6dea62019-12-13 17:05:36 +0530553{
554 BMCWEB_LOG_DEBUG << listTransactionIds.size();
555 BMCWEB_LOG_DEBUG << "Data is present";
Ed Tanous4e087512020-09-28 18:41:25 -0700556 for (unsigned int listTransactionId : listTransactionIds)
manojkiraneda3b6dea62019-12-13 17:05:36 +0530557 {
Ed Tanous4e087512020-09-28 18:41:25 -0700558 BMCWEB_LOG_DEBUG << listTransactionId;
manojkiraneda3b6dea62019-12-13 17:05:36 +0530559 }
560
manojkiraneda3b6dea62019-12-13 17:05:36 +0530561 // validate the request ids
562
Ratan Gupta07386c62019-12-14 14:06:09 +0530563 auto varReleaselock = crow::ibm_mc_lock::Lock::getInstance().releaseLock(
Ed Tanousbb759e32022-08-02 17:07:54 -0700564 listTransactionIds, std::make_pair(req.session->clientId.value_or(""),
565 req.session->uniqueId));
manojkiraneda3b6dea62019-12-13 17:05:36 +0530566
567 if (!varReleaselock.first)
568 {
569 // validation Failed
Sunitha Harish3e7ab702022-08-08 02:08:39 -0500570 BMCWEB_LOG_ERROR << "handleReleaseLockAPI: validation failed";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600571 asyncResp->res.result(boost::beast::http::status::bad_request);
manojkiraneda3b6dea62019-12-13 17:05:36 +0530572 return;
573 }
Ed Tanous3174e4d2020-10-07 11:41:22 -0700574 auto statusRelease =
575 std::get<crow::ibm_mc_lock::RcRelaseLock>(varReleaselock.second);
576 if (statusRelease.first)
manojkiraneda3b6dea62019-12-13 17:05:36 +0530577 {
Ed Tanous3174e4d2020-10-07 11:41:22 -0700578 // The current hmc owns all the locks, so we already released
579 // them
Ed Tanous3174e4d2020-10-07 11:41:22 -0700580 return;
manojkiraneda3b6dea62019-12-13 17:05:36 +0530581 }
Ed Tanous3174e4d2020-10-07 11:41:22 -0700582
583 // valid rid, but the current hmc does not own all the locks
584 BMCWEB_LOG_DEBUG << "Current HMC does not own all the locks";
Sunitha Harishdb81c072021-01-21 23:33:21 -0600585 asyncResp->res.result(boost::beast::http::status::unauthorized);
Ed Tanous3174e4d2020-10-07 11:41:22 -0700586
587 auto var = statusRelease.second;
Ed Tanouse05aec52022-01-25 10:28:56 -0800588 nlohmann::json returnJson;
589 nlohmann::json segments;
Ed Tanous3174e4d2020-10-07 11:41:22 -0700590 nlohmann::json myArray = nlohmann::json::array();
591 returnJson["TransactionID"] = var.first;
592 returnJson["SessionID"] = std::get<0>(var.second);
593 returnJson["HMCID"] = std::get<1>(var.second);
594 returnJson["LockType"] = std::get<2>(var.second);
595 returnJson["ResourceID"] = std::get<3>(var.second);
596
Ed Tanous02cad962022-06-30 16:50:15 -0700597 for (const auto& i : std::get<4>(var.second))
Ed Tanous3174e4d2020-10-07 11:41:22 -0700598 {
599 segments["LockFlag"] = i.first;
600 segments["SegmentLength"] = i.second;
601 myArray.push_back(segments);
602 }
603
604 returnJson["SegmentFlags"] = myArray;
Sunitha Harish3e7ab702022-08-08 02:08:39 -0500605 BMCWEB_LOG_DEBUG << "handleReleaseLockAPI: lockrecord: " << returnJson;
Sunitha Harishdb81c072021-01-21 23:33:21 -0600606 asyncResp->res.jsonValue["Record"] = returnJson;
manojkiraneda3b6dea62019-12-13 17:05:36 +0530607}
608
Sunitha Harishdb81c072021-01-21 23:33:21 -0600609inline void
610 handleGetLockListAPI(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
611 const ListOfSessionIds& listSessionIds)
manojkiraneda402b5712019-12-13 17:07:09 +0530612{
613 BMCWEB_LOG_DEBUG << listSessionIds.size();
614
Ratan Gupta07386c62019-12-14 14:06:09 +0530615 auto status =
616 crow::ibm_mc_lock::Lock::getInstance().getLockList(listSessionIds);
manojkiraneda402b5712019-12-13 17:07:09 +0530617 auto var = std::get<std::vector<std::pair<uint32_t, LockRequests>>>(status);
618
619 nlohmann::json lockRecords = nlohmann::json::array();
620
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500621 for (const auto& transactionId : var)
manojkiraneda402b5712019-12-13 17:07:09 +0530622 {
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500623 for (const auto& lockRecord : transactionId.second)
manojkiraneda402b5712019-12-13 17:07:09 +0530624 {
625 nlohmann::json returnJson;
626
627 returnJson["TransactionID"] = transactionId.first;
628 returnJson["SessionID"] = std::get<0>(lockRecord);
629 returnJson["HMCID"] = std::get<1>(lockRecord);
630 returnJson["LockType"] = std::get<2>(lockRecord);
631 returnJson["ResourceID"] = std::get<3>(lockRecord);
632
633 nlohmann::json segments;
634 nlohmann::json segmentInfoArray = nlohmann::json::array();
635
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500636 for (const auto& segment : std::get<4>(lockRecord))
manojkiraneda402b5712019-12-13 17:07:09 +0530637 {
638 segments["LockFlag"] = segment.first;
639 segments["SegmentLength"] = segment.second;
640 segmentInfoArray.push_back(segments);
641 }
642
643 returnJson["SegmentFlags"] = segmentInfoArray;
644 lockRecords.push_back(returnJson);
645 }
646 }
Sunitha Harishdb81c072021-01-21 23:33:21 -0600647 asyncResp->res.result(boost::beast::http::status::ok);
648 asyncResp->res.jsonValue["Records"] = lockRecords;
manojkiraneda402b5712019-12-13 17:07:09 +0530649}
650
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500651inline bool isValidConfigFileName(const std::string& fileName,
652 crow::Response& res)
653{
654 if (fileName.empty())
655 {
656 BMCWEB_LOG_ERROR << "Empty filename";
657 res.jsonValue["Description"] = "Empty file path in the url";
658 return false;
659 }
660
661 // ConfigFile name is allowed to take upper and lowercase letters,
662 // numbers and hyphen
663 std::size_t found = fileName.find_first_not_of(
664 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-");
665 if (found != std::string::npos)
666 {
667 BMCWEB_LOG_ERROR << "Unsupported character in filename: " << fileName;
668 res.jsonValue["Description"] = "Unsupported character in filename";
669 return false;
670 }
671
672 // Check the filename length
673 if (fileName.length() > 20)
674 {
675 BMCWEB_LOG_ERROR << "Name must be maximum 20 characters. "
676 "Input filename length is: "
677 << fileName.length();
678 res.jsonValue["Description"] = "Filename must be maximum 20 characters";
679 return false;
680 }
681
682 return true;
683}
684
Ed Tanous02379d32020-09-15 21:15:44 -0700685inline void requestRoutes(App& app)
Ratan Gupta453fed02019-12-14 09:39:47 +0530686{
687
688 // allowed only for admin
689 BMCWEB_ROUTE(app, "/ibm/v1/")
Ed Tanous432a8902021-06-14 15:28:56 -0700690 .privileges({{"ConfigureComponents", "ConfigureManager"}})
Ed Tanousb41187f2019-10-24 16:30:02 -0700691 .methods(boost::beast::http::verb::get)(
zhanghch058d1b46d2021-04-01 11:18:24 +0800692 [](const crow::Request&,
693 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700694 asyncResp->res.jsonValue["@odata.type"] =
695 "#ibmServiceRoot.v1_0_0.ibmServiceRoot";
696 asyncResp->res.jsonValue["@odata.id"] = "/ibm/v1/";
697 asyncResp->res.jsonValue["Id"] = "IBM Rest RootService";
698 asyncResp->res.jsonValue["Name"] = "IBM Service Root";
699 asyncResp->res.jsonValue["ConfigFiles"]["@odata.id"] =
700 "/ibm/v1/Host/ConfigFiles";
701 asyncResp->res.jsonValue["LockService"]["@odata.id"] =
702 "/ibm/v1/HMC/LockService";
703 asyncResp->res.jsonValue["BroadcastService"]["@odata.id"] =
704 "/ibm/v1/HMC/BroadcastService";
705 });
Sunitha Harish97b0e432019-11-21 04:59:29 -0600706
Ratan Guptad3630cb2019-12-14 11:21:35 +0530707 BMCWEB_ROUTE(app, "/ibm/v1/Host/ConfigFiles")
Ed Tanous432a8902021-06-14 15:28:56 -0700708 .privileges({{"ConfigureComponents", "ConfigureManager"}})
Ed Tanousb41187f2019-10-24 16:30:02 -0700709 .methods(boost::beast::http::verb::get)(
zhanghch058d1b46d2021-04-01 11:18:24 +0800710 [](const crow::Request&,
711 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700712 handleConfigFileList(asyncResp);
713 });
Ratan Guptad3630cb2019-12-14 11:21:35 +0530714
715 BMCWEB_ROUTE(app,
Sunitha Harishe56f2542020-07-22 02:38:59 -0500716 "/ibm/v1/Host/ConfigFiles/Actions/IBMConfigFiles.DeleteAll")
Ed Tanous432a8902021-06-14 15:28:56 -0700717 .privileges({{"ConfigureComponents", "ConfigureManager"}})
Ed Tanousb41187f2019-10-24 16:30:02 -0700718 .methods(boost::beast::http::verb::post)(
zhanghch058d1b46d2021-04-01 11:18:24 +0800719 [](const crow::Request&,
720 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700721 deleteConfigFiles(asyncResp);
722 });
Ratan Guptad3630cb2019-12-14 11:21:35 +0530723
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500724 BMCWEB_ROUTE(app, "/ibm/v1/Host/ConfigFiles/<str>")
Ed Tanous432a8902021-06-14 15:28:56 -0700725 .privileges({{"ConfigureComponents", "ConfigureManager"}})
zhanghch058d1b46d2021-04-01 11:18:24 +0800726 .methods(boost::beast::http::verb::put, boost::beast::http::verb::get,
727 boost::beast::http::verb::delete_)(
728 [](const crow::Request& req,
729 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
730 const std::string& fileName) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700731 BMCWEB_LOG_DEBUG << "ConfigFile : " << fileName;
732 // Validate the incoming fileName
733 if (!isValidConfigFileName(fileName, asyncResp->res))
734 {
735 asyncResp->res.result(boost::beast::http::status::bad_request);
736 return;
737 }
738 handleFileUrl(req, asyncResp, fileName);
739 });
Ratan Gupta734a1c32019-12-14 11:53:48 +0530740
741 BMCWEB_ROUTE(app, "/ibm/v1/HMC/LockService")
Ed Tanous432a8902021-06-14 15:28:56 -0700742 .privileges({{"ConfigureComponents", "ConfigureManager"}})
Ed Tanousb41187f2019-10-24 16:30:02 -0700743 .methods(boost::beast::http::verb::get)(
zhanghch058d1b46d2021-04-01 11:18:24 +0800744 [](const crow::Request&,
745 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700746 getLockServiceData(asyncResp);
747 });
manojkiraneda0b631ae2019-12-03 17:54:28 +0530748
749 BMCWEB_ROUTE(app, "/ibm/v1/HMC/LockService/Actions/LockService.AcquireLock")
Ed Tanous432a8902021-06-14 15:28:56 -0700750 .privileges({{"ConfigureComponents", "ConfigureManager"}})
zhanghch058d1b46d2021-04-01 11:18:24 +0800751 .methods(boost::beast::http::verb::post)(
752 [](const crow::Request& req,
753 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700754 std::vector<nlohmann::json> body;
755 if (!redfish::json_util::readJsonAction(req, asyncResp->res, "Request",
756 body))
757 {
758 BMCWEB_LOG_DEBUG << "Not a Valid JSON";
759 asyncResp->res.result(boost::beast::http::status::bad_request);
760 return;
761 }
762 handleAcquireLockAPI(req, asyncResp, body);
763 });
manojkiraneda3b6dea62019-12-13 17:05:36 +0530764 BMCWEB_ROUTE(app, "/ibm/v1/HMC/LockService/Actions/LockService.ReleaseLock")
Ed Tanous432a8902021-06-14 15:28:56 -0700765 .privileges({{"ConfigureComponents", "ConfigureManager"}})
zhanghch058d1b46d2021-04-01 11:18:24 +0800766 .methods(boost::beast::http::verb::post)(
767 [](const crow::Request& req,
768 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700769 std::string type;
770 std::vector<uint32_t> listTransactionIds;
manojkiraneda3b6dea62019-12-13 17:05:36 +0530771
Ed Tanous002d39b2022-05-31 08:59:27 -0700772 if (!redfish::json_util::readJsonPatch(req, asyncResp->res, "Type",
773 type, "TransactionIDs",
774 listTransactionIds))
775 {
776 asyncResp->res.result(boost::beast::http::status::bad_request);
777 return;
778 }
779 if (type == "Transaction")
780 {
781 handleReleaseLockAPI(req, asyncResp, listTransactionIds);
782 }
783 else if (type == "Session")
784 {
785 handleRelaseAllAPI(req, asyncResp);
786 }
787 else
788 {
789 BMCWEB_LOG_DEBUG << " Value of Type : " << type
790 << "is Not a Valid key";
791 redfish::messages::propertyValueNotInList(asyncResp->res, type,
792 "Type");
793 }
794 });
manojkiraneda402b5712019-12-13 17:07:09 +0530795 BMCWEB_ROUTE(app, "/ibm/v1/HMC/LockService/Actions/LockService.GetLockList")
Ed Tanous432a8902021-06-14 15:28:56 -0700796 .privileges({{"ConfigureComponents", "ConfigureManager"}})
zhanghch058d1b46d2021-04-01 11:18:24 +0800797 .methods(boost::beast::http::verb::post)(
798 [](const crow::Request& req,
799 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700800 ListOfSessionIds listSessionIds;
manojkiraneda402b5712019-12-13 17:07:09 +0530801
Ed Tanous002d39b2022-05-31 08:59:27 -0700802 if (!redfish::json_util::readJsonPatch(req, asyncResp->res,
803 "SessionIDs", listSessionIds))
804 {
805 asyncResp->res.result(boost::beast::http::status::bad_request);
806 return;
807 }
808 handleGetLockListAPI(asyncResp, listSessionIds);
809 });
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500810
811 BMCWEB_ROUTE(app, "/ibm/v1/HMC/BroadcastService")
Ed Tanous432a8902021-06-14 15:28:56 -0700812 .privileges({{"ConfigureComponents", "ConfigureManager"}})
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500813 .methods(boost::beast::http::verb::post)(
zhanghch058d1b46d2021-04-01 11:18:24 +0800814 [](const crow::Request& req,
815 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700816 handleBroadcastService(req, asyncResp);
817 });
Ratan Gupta453fed02019-12-14 09:39:47 +0530818}
819
820} // namespace ibm_mc
821} // namespace crow