blob: 103017bf09c7cb9d0a52d7bf3e7d4d0924bade43 [file] [log] [blame]
Ratan Gupta453fed02019-12-14 09:39:47 +05301#pragma once
Ratan Gupta453fed02019-12-14 09:39:47 +05302
Ed Tanous3ccb3ad2023-01-13 17:40:03 -08003#include "app.hpp"
4#include "async_resp.hpp"
5#include "error_messages.hpp"
6#include "event_service_manager.hpp"
7#include "ibm/locks.hpp"
8#include "resource_messages.hpp"
Ed Tanous18f8f602023-07-18 10:07:23 -07009#include "str_utility.hpp"
Ed Tanous3ccb3ad2023-01-13 17:40:03 -080010#include "utils/json_utils.hpp"
11
Sunitha Harish97b0e432019-11-21 04:59:29 -060012#include <boost/container/flat_set.hpp>
manojkiraneda0b631ae2019-12-03 17:54:28 +053013#include <nlohmann/json.hpp>
Sunitha Harish97b0e432019-11-21 04:59:29 -060014#include <sdbusplus/message/types.hpp>
15
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 =
Sunitha Harishf8a43472022-08-08 02:07:12 -050037 25000000; // Allow save area dir size to be max 25MB
Sunitha Harish7c0bbe72020-07-30 08:25:28 -050038constexpr size_t minSaveareaFileSize =
Patrick Williams89492a12023-05-10 07:51:34 -050039 100; // Allow save area file size of minimum 100B
Asmitha Karunanithi5738de52020-07-17 02:03:31 -050040constexpr size_t maxSaveareaFileSize =
Patrick Williams89492a12023-05-10 07:51:34 -050041 500000; // Allow save area file size upto 500KB
Asmitha Karunanithi5738de52020-07-17 02:03:31 -050042constexpr size_t maxBroadcastMsgSize =
Patrick Williams89492a12023-05-10 07:51:34 -050043 1000; // Allow Broadcast message size upto 1KB
Asmitha Karunanithi5738de52020-07-17 02:03:31 -050044
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");
Ed Tanous18f8f602023-07-18 10:07:23 -070052 if (!bmcweb::asciiIEquals(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 }
Ed Tanous62598e32023-07-17 17:06:25 -070058 BMCWEB_LOG_DEBUG(
59 "File upload in application/octet-stream format. Continue..");
asmithakarun1c7b07c2019-09-09 03:42:59 -050060
Ed Tanous62598e32023-07-17 17:06:25 -070061 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;
Ed Tanous62598e32023-07-17 17:06:25 -070083 BMCWEB_LOG_DEBUG("handleIbmPut: Failed to prepare save-area "
84 "directory iterator. ec : {}",
85 ec.message());
Sunitha Harish7c0bbe72020-07-30 08:25:28 -050086 return;
87 }
88 std::uintmax_t saveAreaDirSize = 0;
Ed Tanous9eb808c2022-01-25 10:19:23 -080089 for (const auto& it : iter)
Sunitha Harish7c0bbe72020-07-30 08:25:28 -050090 {
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;
Ed Tanous62598e32023-07-17 17:06:25 -070098 BMCWEB_LOG_DEBUG("handleIbmPut: Failed to find save-area "
99 "directory . ec : {}",
100 ec.message());
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500101 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;
Ed Tanous62598e32023-07-17 17:06:25 -0700109 BMCWEB_LOG_DEBUG("handleIbmPut: Failed to find save-area "
110 "file size inside the directory . ec : {}",
111 ec.message());
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500112 return;
113 }
114 saveAreaDirSize += fileSize;
115 }
116 }
Ed Tanous62598e32023-07-17 17:06:25 -0700117 BMCWEB_LOG_DEBUG("saveAreaDirSize: {}", saveAreaDirSize);
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500118
119 // Get the file size getting uploaded
Ed Tanous33c6b582023-02-14 15:05:48 -0800120 const std::string& data = req.body();
Ed Tanous62598e32023-07-17 17:06:25 -0700121 BMCWEB_LOG_DEBUG("data length: {}", data.length());
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500122
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;
Ed Tanous62598e32023-07-17 17:06:25 -0700140 BMCWEB_LOG_DEBUG("Writing to the file: {}", loc.string());
Asmitha Karunanithi10693fa2020-07-27 02:27:49 -0500141
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;
Ed Tanous62598e32023-07-17 17:06:25 -0700149 BMCWEB_LOG_DEBUG("handleIbmPut: Failed to find if file exists. ec : {}",
150 ec.message());
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500151 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;
Ed Tanous62598e32023-07-17 17:06:25 -0700164 BMCWEB_LOG_DEBUG("handleIbmPut: Failed to find file size. ec : {}",
165 ec.message());
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500166 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 }
Ed Tanous62598e32023-07-17 17:06:25 -0700178 BMCWEB_LOG_DEBUG("newSizeToWrite: {}", newSizeToWrite);
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500179 }
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
Ed Tanous62598e32023-07-17 17:06:25 -0700187 BMCWEB_LOG_DEBUG("total new size: {}", saveAreaDirSize + newSizeToWrite);
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500188
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 "
Sunitha Harishf8a43472022-08-08 02:07:12 -0500194 "directory maximum allowed size[25MB]";
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 {
Ed Tanous62598e32023-07-17 17:06:25 -0700207 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 {
Ed Tanous62598e32023-07-17 17:06:25 -0700220 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 }
Sunitha Harish97b0e432019-11-21 04:59:29 -0600223 else
224 {
Ed Tanous62598e32023-07-17 17:06:25 -0700225 BMCWEB_LOG_DEBUG("config file is created");
Sunitha Harishdb81c072021-01-21 23:33:21 -0600226 asyncResp->res.jsonValue["Description"] = "File Created";
asmithakarun1c7b07c2019-09-09 03:42:59 -0500227 }
Ratan Guptad3630cb2019-12-14 11:21:35 +0530228}
asmithakarun1c7b07c2019-09-09 03:42:59 -0500229
zhanghch058d1b46d2021-04-01 11:18:24 +0800230inline void
231 handleConfigFileList(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
Ratan Guptad3630cb2019-12-14 11:21:35 +0530232{
233 std::vector<std::string> pathObjList;
Sunitha Harish3e919b52020-10-13 01:21:48 -0500234 std::filesystem::path loc(
235 "/var/lib/bmcweb/ibm-management-console/configfiles");
Ratan Guptad3630cb2019-12-14 11:21:35 +0530236 if (std::filesystem::exists(loc) && std::filesystem::is_directory(loc))
237 {
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500238 for (const auto& file : std::filesystem::directory_iterator(loc))
Ratan Guptad3630cb2019-12-14 11:21:35 +0530239 {
Ed Tanous3174e4d2020-10-07 11:41:22 -0700240 const std::filesystem::path& pathObj = file.path();
cm-jishnu5a193962022-12-02 03:45:27 -0600241 if (std::filesystem::is_regular_file(pathObj))
242 {
Patrick Williamsb2ba3072023-05-12 10:27:39 -0500243 pathObjList.emplace_back("/ibm/v1/Host/ConfigFiles/" +
244 pathObj.filename().string());
cm-jishnu5a193962022-12-02 03:45:27 -0600245 }
Ratan Guptad3630cb2019-12-14 11:21:35 +0530246 }
247 }
Sunitha Harishdb81c072021-01-21 23:33:21 -0600248 asyncResp->res.jsonValue["@odata.type"] =
249 "#IBMConfigFile.v1_0_0.IBMConfigFile";
250 asyncResp->res.jsonValue["@odata.id"] = "/ibm/v1/Host/ConfigFiles/";
251 asyncResp->res.jsonValue["Id"] = "ConfigFiles";
252 asyncResp->res.jsonValue["Name"] = "ConfigFiles";
Ratan Guptad3630cb2019-12-14 11:21:35 +0530253
Sunitha Harishdb81c072021-01-21 23:33:21 -0600254 asyncResp->res.jsonValue["Members"] = std::move(pathObjList);
255 asyncResp->res.jsonValue["Actions"]["#IBMConfigFiles.DeleteAll"] = {
Ratan Guptad3630cb2019-12-14 11:21:35 +0530256 {"target",
Sunitha Harishe56f2542020-07-22 02:38:59 -0500257 "/ibm/v1/Host/ConfigFiles/Actions/IBMConfigFiles.DeleteAll"}};
Ratan Guptad3630cb2019-12-14 11:21:35 +0530258}
259
zhanghch058d1b46d2021-04-01 11:18:24 +0800260inline void
261 deleteConfigFiles(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
Ratan Guptad3630cb2019-12-14 11:21:35 +0530262{
Ratan Guptad3630cb2019-12-14 11:21:35 +0530263 std::error_code ec;
Sunitha Harish3e919b52020-10-13 01:21:48 -0500264 std::filesystem::path loc(
265 "/var/lib/bmcweb/ibm-management-console/configfiles");
Ratan Guptad3630cb2019-12-14 11:21:35 +0530266 if (std::filesystem::exists(loc) && std::filesystem::is_directory(loc))
267 {
268 std::filesystem::remove_all(loc, ec);
269 if (ec)
270 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600271 asyncResp->res.result(
272 boost::beast::http::status::internal_server_error);
273 asyncResp->res.jsonValue["Description"] = internalServerError;
Ed Tanous62598e32023-07-17 17:06:25 -0700274 BMCWEB_LOG_DEBUG("deleteConfigFiles: Failed to delete the "
275 "config files directory. ec : {}",
276 ec.message());
Ratan Guptad3630cb2019-12-14 11:21:35 +0530277 }
278 }
asmithakarun1c7b07c2019-09-09 03:42:59 -0500279}
280
zhanghch058d1b46d2021-04-01 11:18:24 +0800281inline void
282 getLockServiceData(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
Ratan Gupta734a1c32019-12-14 11:53:48 +0530283{
Sunitha Harishdb81c072021-01-21 23:33:21 -0600284 asyncResp->res.jsonValue["@odata.type"] = "#LockService.v1_0_0.LockService";
285 asyncResp->res.jsonValue["@odata.id"] = "/ibm/v1/HMC/LockService/";
286 asyncResp->res.jsonValue["Id"] = "LockService";
287 asyncResp->res.jsonValue["Name"] = "LockService";
Ratan Gupta734a1c32019-12-14 11:53:48 +0530288
Sunitha Harishdb81c072021-01-21 23:33:21 -0600289 asyncResp->res.jsonValue["Actions"]["#LockService.AcquireLock"] = {
Ratan Gupta734a1c32019-12-14 11:53:48 +0530290 {"target", "/ibm/v1/HMC/LockService/Actions/LockService.AcquireLock"}};
Sunitha Harishdb81c072021-01-21 23:33:21 -0600291 asyncResp->res.jsonValue["Actions"]["#LockService.ReleaseLock"] = {
Ratan Gupta734a1c32019-12-14 11:53:48 +0530292 {"target", "/ibm/v1/HMC/LockService/Actions/LockService.ReleaseLock"}};
Sunitha Harishdb81c072021-01-21 23:33:21 -0600293 asyncResp->res.jsonValue["Actions"]["#LockService.GetLockList"] = {
Ratan Gupta734a1c32019-12-14 11:53:48 +0530294 {"target", "/ibm/v1/HMC/LockService/Actions/LockService.GetLockList"}};
Ratan Gupta734a1c32019-12-14 11:53:48 +0530295}
296
Sunitha Harishdb81c072021-01-21 23:33:21 -0600297inline void handleFileGet(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
298 const std::string& fileID)
asmithakarun1c7b07c2019-09-09 03:42:59 -0500299{
Ed Tanous62598e32023-07-17 17:06:25 -0700300 BMCWEB_LOG_DEBUG("HandleGet on SaveArea files on path: {}", fileID);
Sunitha Harish3e919b52020-10-13 01:21:48 -0500301 std::filesystem::path loc(
302 "/var/lib/bmcweb/ibm-management-console/configfiles/" + fileID);
cm-jishnu5a193962022-12-02 03:45:27 -0600303 if (!std::filesystem::exists(loc) || !std::filesystem::is_regular_file(loc))
asmithakarun1c7b07c2019-09-09 03:42:59 -0500304 {
Ed Tanous62598e32023-07-17 17:06:25 -0700305 BMCWEB_LOG_WARNING("{} Not found", loc.string());
Sunitha Harishdb81c072021-01-21 23:33:21 -0600306 asyncResp->res.result(boost::beast::http::status::not_found);
307 asyncResp->res.jsonValue["Description"] = resourceNotFoundMsg;
asmithakarun1c7b07c2019-09-09 03:42:59 -0500308 return;
309 }
310
311 std::ifstream readfile(loc.string());
312 if (!readfile)
313 {
Ed Tanous62598e32023-07-17 17:06:25 -0700314 BMCWEB_LOG_WARNING("{} Not found", loc.string());
Sunitha Harishdb81c072021-01-21 23:33:21 -0600315 asyncResp->res.result(boost::beast::http::status::not_found);
316 asyncResp->res.jsonValue["Description"] = resourceNotFoundMsg;
asmithakarun1c7b07c2019-09-09 03:42:59 -0500317 return;
318 }
319
Patrick Williams89492a12023-05-10 07:51:34 -0500320 std::string contentDispositionParam = "attachment; filename=\"" + fileID +
321 "\"";
Ed Tanousd9f6c622022-03-17 09:12:17 -0700322 asyncResp->res.addHeader(boost::beast::http::field::content_disposition,
323 contentDispositionParam);
asmithakarun1c7b07c2019-09-09 03:42:59 -0500324 std::string fileData;
325 fileData = {std::istreambuf_iterator<char>(readfile),
326 std::istreambuf_iterator<char>()};
Sunitha Harishdb81c072021-01-21 23:33:21 -0600327 asyncResp->res.jsonValue["Data"] = fileData;
asmithakarun1c7b07c2019-09-09 03:42:59 -0500328}
329
Sunitha Harishdb81c072021-01-21 23:33:21 -0600330inline void
331 handleFileDelete(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
332 const std::string& fileID)
asmithakarun1c7b07c2019-09-09 03:42:59 -0500333{
Sunitha Harish3e919b52020-10-13 01:21:48 -0500334 std::string filePath("/var/lib/bmcweb/ibm-management-console/configfiles/" +
335 fileID);
Ed Tanous62598e32023-07-17 17:06:25 -0700336 BMCWEB_LOG_DEBUG("Removing the file : {}", filePath);
Ed Tanous2c70f802020-09-28 14:29:23 -0700337 std::ifstream fileOpen(filePath.c_str());
338 if (static_cast<bool>(fileOpen))
Ed Tanous3174e4d2020-10-07 11:41:22 -0700339 {
asmithakarun1c7b07c2019-09-09 03:42:59 -0500340 if (remove(filePath.c_str()) == 0)
341 {
Ed Tanous62598e32023-07-17 17:06:25 -0700342 BMCWEB_LOG_DEBUG("File removed!");
Sunitha Harishdb81c072021-01-21 23:33:21 -0600343 asyncResp->res.jsonValue["Description"] = "File Deleted";
asmithakarun1c7b07c2019-09-09 03:42:59 -0500344 }
345 else
346 {
Ed Tanous62598e32023-07-17 17:06:25 -0700347 BMCWEB_LOG_ERROR("File not removed!");
Sunitha Harishdb81c072021-01-21 23:33:21 -0600348 asyncResp->res.result(
349 boost::beast::http::status::internal_server_error);
350 asyncResp->res.jsonValue["Description"] = internalServerError;
asmithakarun1c7b07c2019-09-09 03:42:59 -0500351 }
Ed Tanous3174e4d2020-10-07 11:41:22 -0700352 }
asmithakarun1c7b07c2019-09-09 03:42:59 -0500353 else
354 {
Ed Tanous62598e32023-07-17 17:06:25 -0700355 BMCWEB_LOG_WARNING("File not found!");
Sunitha Harishdb81c072021-01-21 23:33:21 -0600356 asyncResp->res.result(boost::beast::http::status::not_found);
357 asyncResp->res.jsonValue["Description"] = resourceNotFoundMsg;
Sunitha Harish97b0e432019-11-21 04:59:29 -0600358 }
Sunitha Harish97b0e432019-11-21 04:59:29 -0600359}
360
zhanghch058d1b46d2021-04-01 11:18:24 +0800361inline void
362 handleBroadcastService(const crow::Request& req,
363 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500364{
365 std::string broadcastMsg;
366
Willy Tu15ed6782021-12-14 11:03:16 -0800367 if (!redfish::json_util::readJsonPatch(req, asyncResp->res, "Message",
368 broadcastMsg))
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500369 {
Ed Tanous62598e32023-07-17 17:06:25 -0700370 BMCWEB_LOG_DEBUG("Not a Valid JSON");
Sunitha Harishdb81c072021-01-21 23:33:21 -0600371 asyncResp->res.result(boost::beast::http::status::bad_request);
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500372 return;
373 }
374 if (broadcastMsg.size() > maxBroadcastMsgSize)
375 {
Ed Tanous62598e32023-07-17 17:06:25 -0700376 BMCWEB_LOG_ERROR("Message size exceeds maximum allowed size[1KB]");
Sunitha Harishdb81c072021-01-21 23:33:21 -0600377 asyncResp->res.result(boost::beast::http::status::bad_request);
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500378 return;
379 }
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500380}
381
zhanghch058d1b46d2021-04-01 11:18:24 +0800382inline void handleFileUrl(const crow::Request& req,
383 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500384 const std::string& fileID)
Sunitha Harish97b0e432019-11-21 04:59:29 -0600385{
Ed Tanousb41187f2019-10-24 16:30:02 -0700386 if (req.method() == boost::beast::http::verb::put)
Sunitha Harish97b0e432019-11-21 04:59:29 -0600387 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600388 handleFilePut(req, asyncResp, fileID);
Sunitha Harish97b0e432019-11-21 04:59:29 -0600389 return;
390 }
Ed Tanousb41187f2019-10-24 16:30:02 -0700391 if (req.method() == boost::beast::http::verb::get)
asmithakarun1c7b07c2019-09-09 03:42:59 -0500392 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600393 handleFileGet(asyncResp, fileID);
asmithakarun1c7b07c2019-09-09 03:42:59 -0500394 return;
395 }
Ed Tanousb41187f2019-10-24 16:30:02 -0700396 if (req.method() == boost::beast::http::verb::delete_)
asmithakarun1c7b07c2019-09-09 03:42:59 -0500397 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600398 handleFileDelete(asyncResp, fileID);
asmithakarun1c7b07c2019-09-09 03:42:59 -0500399 return;
400 }
Sunitha Harish97b0e432019-11-21 04:59:29 -0600401}
Ratan Gupta453fed02019-12-14 09:39:47 +0530402
Sunitha Harishdb81c072021-01-21 23:33:21 -0600403inline void
404 handleAcquireLockAPI(const crow::Request& req,
405 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
406 std::vector<nlohmann::json> body)
manojkiraneda0b631ae2019-12-03 17:54:28 +0530407{
408 LockRequests lockRequestStructure;
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500409 for (auto& element : body)
manojkiraneda0b631ae2019-12-03 17:54:28 +0530410 {
411 std::string lockType;
Ed Tanous543f4402022-01-06 13:12:53 -0800412 uint64_t resourceId = 0;
manojkiraneda0b631ae2019-12-03 17:54:28 +0530413
414 SegmentFlags segInfo;
415 std::vector<nlohmann::json> segmentFlags;
416
Sunitha Harishdb81c072021-01-21 23:33:21 -0600417 if (!redfish::json_util::readJson(element, asyncResp->res, "LockType",
418 lockType, "ResourceID", resourceId,
manojkiraneda0b631ae2019-12-03 17:54:28 +0530419 "SegmentFlags", segmentFlags))
420 {
Ed Tanous62598e32023-07-17 17:06:25 -0700421 BMCWEB_LOG_DEBUG("Not a Valid JSON");
Sunitha Harishdb81c072021-01-21 23:33:21 -0600422 asyncResp->res.result(boost::beast::http::status::bad_request);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530423 return;
424 }
Ed Tanous62598e32023-07-17 17:06:25 -0700425 BMCWEB_LOG_DEBUG("{}", lockType);
426 BMCWEB_LOG_DEBUG("{}", resourceId);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530427
Ed Tanous62598e32023-07-17 17:06:25 -0700428 BMCWEB_LOG_DEBUG("Segment Flags are present");
manojkiraneda0b631ae2019-12-03 17:54:28 +0530429
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500430 for (auto& e : segmentFlags)
manojkiraneda0b631ae2019-12-03 17:54:28 +0530431 {
432 std::string lockFlags;
Ed Tanous543f4402022-01-06 13:12:53 -0800433 uint32_t segmentLength = 0;
manojkiraneda0b631ae2019-12-03 17:54:28 +0530434
Sunitha Harishdb81c072021-01-21 23:33:21 -0600435 if (!redfish::json_util::readJson(e, asyncResp->res, "LockFlag",
436 lockFlags, "SegmentLength",
437 segmentLength))
manojkiraneda0b631ae2019-12-03 17:54:28 +0530438 {
Sunitha Harishdb81c072021-01-21 23:33:21 -0600439 asyncResp->res.result(boost::beast::http::status::bad_request);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530440 return;
441 }
442
Ed Tanous62598e32023-07-17 17:06:25 -0700443 BMCWEB_LOG_DEBUG("Lockflag : {}", lockFlags);
444 BMCWEB_LOG_DEBUG("SegmentLength : {}", segmentLength);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530445
Patrick Williamsad539542023-05-12 10:10:08 -0500446 segInfo.emplace_back(std::make_pair(lockFlags, segmentLength));
manojkiraneda0b631ae2019-12-03 17:54:28 +0530447 }
Ed Tanousbb759e32022-08-02 17:07:54 -0700448
Patrick Williamsad539542023-05-12 10:10:08 -0500449 lockRequestStructure.emplace_back(make_tuple(
Ed Tanousbb759e32022-08-02 17:07:54 -0700450 req.session->uniqueId, req.session->clientId.value_or(""), lockType,
451 resourceId, segInfo));
manojkiraneda0b631ae2019-12-03 17:54:28 +0530452 }
453
454 // print lock request into journal
455
Ed Tanous4e087512020-09-28 18:41:25 -0700456 for (auto& i : lockRequestStructure)
manojkiraneda0b631ae2019-12-03 17:54:28 +0530457 {
Ed Tanous62598e32023-07-17 17:06:25 -0700458 BMCWEB_LOG_DEBUG("{}", std::get<0>(i));
459 BMCWEB_LOG_DEBUG("{}", std::get<1>(i));
460 BMCWEB_LOG_DEBUG("{}", std::get<2>(i));
461 BMCWEB_LOG_DEBUG("{}", std::get<3>(i));
manojkiraneda0b631ae2019-12-03 17:54:28 +0530462
Ed Tanous4e087512020-09-28 18:41:25 -0700463 for (const auto& p : std::get<4>(i))
manojkiraneda0b631ae2019-12-03 17:54:28 +0530464 {
Ed Tanous62598e32023-07-17 17:06:25 -0700465 BMCWEB_LOG_DEBUG("{}, {}", p.first, p.second);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530466 }
467 }
468
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500469 const LockRequests& t = lockRequestStructure;
manojkiraneda0b631ae2019-12-03 17:54:28 +0530470
Ratan Gupta07386c62019-12-14 14:06:09 +0530471 auto varAcquireLock = crow::ibm_mc_lock::Lock::getInstance().acquireLock(t);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530472
473 if (varAcquireLock.first)
474 {
475 // Either validity failure of there is a conflict with itself
476
477 auto validityStatus =
478 std::get<std::pair<bool, int>>(varAcquireLock.second);
479
480 if ((!validityStatus.first) && (validityStatus.second == 0))
481 {
Ed Tanous62598e32023-07-17 17:06:25 -0700482 BMCWEB_LOG_DEBUG("Not a Valid record");
483 BMCWEB_LOG_DEBUG("Bad json in request");
Sunitha Harishdb81c072021-01-21 23:33:21 -0600484 asyncResp->res.result(boost::beast::http::status::bad_request);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530485 return;
486 }
487 if (validityStatus.first && (validityStatus.second == 1))
488 {
Ed Tanous62598e32023-07-17 17:06:25 -0700489 BMCWEB_LOG_ERROR("There is a conflict within itself");
Sunitha Harishf8a43472022-08-08 02:07:12 -0500490 asyncResp->res.result(boost::beast::http::status::conflict);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530491 return;
492 }
493 }
494 else
495 {
496 auto conflictStatus =
497 std::get<crow::ibm_mc_lock::Rc>(varAcquireLock.second);
498 if (!conflictStatus.first)
499 {
Ed Tanous62598e32023-07-17 17:06:25 -0700500 BMCWEB_LOG_DEBUG("There is no conflict with the locktable");
Sunitha Harishdb81c072021-01-21 23:33:21 -0600501 asyncResp->res.result(boost::beast::http::status::ok);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530502
503 auto var = std::get<uint32_t>(conflictStatus.second);
504 nlohmann::json returnJson;
505 returnJson["id"] = var;
Sunitha Harishdb81c072021-01-21 23:33:21 -0600506 asyncResp->res.jsonValue["TransactionID"] = var;
manojkiraneda0b631ae2019-12-03 17:54:28 +0530507 return;
508 }
Ed Tanous62598e32023-07-17 17:06:25 -0700509 BMCWEB_LOG_DEBUG("There is a conflict with the lock table");
Sunitha Harishdb81c072021-01-21 23:33:21 -0600510 asyncResp->res.result(boost::beast::http::status::conflict);
Ed Tanous3174e4d2020-10-07 11:41:22 -0700511 auto var =
512 std::get<std::pair<uint32_t, LockRequest>>(conflictStatus.second);
Ed Tanouse05aec52022-01-25 10:28:56 -0800513 nlohmann::json returnJson;
514 nlohmann::json segments;
Ed Tanous3174e4d2020-10-07 11:41:22 -0700515 nlohmann::json myarray = nlohmann::json::array();
516 returnJson["TransactionID"] = var.first;
517 returnJson["SessionID"] = std::get<0>(var.second);
518 returnJson["HMCID"] = std::get<1>(var.second);
519 returnJson["LockType"] = std::get<2>(var.second);
520 returnJson["ResourceID"] = std::get<3>(var.second);
521
Ed Tanous02cad962022-06-30 16:50:15 -0700522 for (const auto& i : std::get<4>(var.second))
manojkiraneda0b631ae2019-12-03 17:54:28 +0530523 {
Ed Tanous3174e4d2020-10-07 11:41:22 -0700524 segments["LockFlag"] = i.first;
525 segments["SegmentLength"] = i.second;
526 myarray.push_back(segments);
manojkiraneda0b631ae2019-12-03 17:54:28 +0530527 }
Ed Tanous3174e4d2020-10-07 11:41:22 -0700528
529 returnJson["SegmentFlags"] = myarray;
Ed Tanous62598e32023-07-17 17:06:25 -0700530 BMCWEB_LOG_ERROR("Conflicting lock record: {}", returnJson);
Sunitha Harishdb81c072021-01-21 23:33:21 -0600531 asyncResp->res.jsonValue["Record"] = returnJson;
Ed Tanous3174e4d2020-10-07 11:41:22 -0700532 return;
manojkiraneda0b631ae2019-12-03 17:54:28 +0530533 }
534}
Sunitha Harishdb81c072021-01-21 23:33:21 -0600535inline void
536 handleRelaseAllAPI(const crow::Request& req,
537 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
Manojkiran Eda5bb0ece2020-01-20 20:22:36 +0530538{
539 crow::ibm_mc_lock::Lock::getInstance().releaseLock(req.session->uniqueId);
Sunitha Harishdb81c072021-01-21 23:33:21 -0600540 asyncResp->res.result(boost::beast::http::status::ok);
Manojkiran Eda5bb0ece2020-01-20 20:22:36 +0530541}
manojkiraneda0b631ae2019-12-03 17:54:28 +0530542
Ed Tanous02379d32020-09-15 21:15:44 -0700543inline void
Sunitha Harishdb81c072021-01-21 23:33:21 -0600544 handleReleaseLockAPI(const crow::Request& req,
545 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
Ed Tanous02379d32020-09-15 21:15:44 -0700546 const std::vector<uint32_t>& listTransactionIds)
manojkiraneda3b6dea62019-12-13 17:05:36 +0530547{
Ed Tanous62598e32023-07-17 17:06:25 -0700548 BMCWEB_LOG_DEBUG("{}", listTransactionIds.size());
549 BMCWEB_LOG_DEBUG("Data is present");
Ed Tanous4e087512020-09-28 18:41:25 -0700550 for (unsigned int listTransactionId : listTransactionIds)
manojkiraneda3b6dea62019-12-13 17:05:36 +0530551 {
Ed Tanous62598e32023-07-17 17:06:25 -0700552 BMCWEB_LOG_DEBUG("{}", listTransactionId);
manojkiraneda3b6dea62019-12-13 17:05:36 +0530553 }
554
manojkiraneda3b6dea62019-12-13 17:05:36 +0530555 // validate the request ids
556
Ratan Gupta07386c62019-12-14 14:06:09 +0530557 auto varReleaselock = crow::ibm_mc_lock::Lock::getInstance().releaseLock(
Ed Tanousbb759e32022-08-02 17:07:54 -0700558 listTransactionIds, std::make_pair(req.session->clientId.value_or(""),
559 req.session->uniqueId));
manojkiraneda3b6dea62019-12-13 17:05:36 +0530560
561 if (!varReleaselock.first)
562 {
563 // validation Failed
Ed Tanous62598e32023-07-17 17:06:25 -0700564 BMCWEB_LOG_ERROR("handleReleaseLockAPI: validation failed");
Sunitha Harishdb81c072021-01-21 23:33:21 -0600565 asyncResp->res.result(boost::beast::http::status::bad_request);
manojkiraneda3b6dea62019-12-13 17:05:36 +0530566 return;
567 }
Ed Tanous3174e4d2020-10-07 11:41:22 -0700568 auto statusRelease =
569 std::get<crow::ibm_mc_lock::RcRelaseLock>(varReleaselock.second);
570 if (statusRelease.first)
manojkiraneda3b6dea62019-12-13 17:05:36 +0530571 {
Ed Tanous3174e4d2020-10-07 11:41:22 -0700572 // The current hmc owns all the locks, so we already released
573 // them
Ed Tanous3174e4d2020-10-07 11:41:22 -0700574 return;
manojkiraneda3b6dea62019-12-13 17:05:36 +0530575 }
Ed Tanous3174e4d2020-10-07 11:41:22 -0700576
577 // valid rid, but the current hmc does not own all the locks
Ed Tanous62598e32023-07-17 17:06:25 -0700578 BMCWEB_LOG_DEBUG("Current HMC does not own all the locks");
Sunitha Harishdb81c072021-01-21 23:33:21 -0600579 asyncResp->res.result(boost::beast::http::status::unauthorized);
Ed Tanous3174e4d2020-10-07 11:41:22 -0700580
581 auto var = statusRelease.second;
Ed Tanouse05aec52022-01-25 10:28:56 -0800582 nlohmann::json returnJson;
583 nlohmann::json segments;
Ed Tanous3174e4d2020-10-07 11:41:22 -0700584 nlohmann::json myArray = nlohmann::json::array();
585 returnJson["TransactionID"] = var.first;
586 returnJson["SessionID"] = std::get<0>(var.second);
587 returnJson["HMCID"] = std::get<1>(var.second);
588 returnJson["LockType"] = std::get<2>(var.second);
589 returnJson["ResourceID"] = std::get<3>(var.second);
590
Ed Tanous02cad962022-06-30 16:50:15 -0700591 for (const auto& i : std::get<4>(var.second))
Ed Tanous3174e4d2020-10-07 11:41:22 -0700592 {
593 segments["LockFlag"] = i.first;
594 segments["SegmentLength"] = i.second;
595 myArray.push_back(segments);
596 }
597
598 returnJson["SegmentFlags"] = myArray;
Ed Tanous62598e32023-07-17 17:06:25 -0700599 BMCWEB_LOG_DEBUG("handleReleaseLockAPI: lockrecord: {}", returnJson);
Sunitha Harishdb81c072021-01-21 23:33:21 -0600600 asyncResp->res.jsonValue["Record"] = returnJson;
manojkiraneda3b6dea62019-12-13 17:05:36 +0530601}
602
Sunitha Harishdb81c072021-01-21 23:33:21 -0600603inline void
604 handleGetLockListAPI(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
605 const ListOfSessionIds& listSessionIds)
manojkiraneda402b5712019-12-13 17:07:09 +0530606{
Ed Tanous62598e32023-07-17 17:06:25 -0700607 BMCWEB_LOG_DEBUG("{}", listSessionIds.size());
manojkiraneda402b5712019-12-13 17:07:09 +0530608
Ratan Gupta07386c62019-12-14 14:06:09 +0530609 auto status =
610 crow::ibm_mc_lock::Lock::getInstance().getLockList(listSessionIds);
manojkiraneda402b5712019-12-13 17:07:09 +0530611 auto var = std::get<std::vector<std::pair<uint32_t, LockRequests>>>(status);
612
613 nlohmann::json lockRecords = nlohmann::json::array();
614
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500615 for (const auto& transactionId : var)
manojkiraneda402b5712019-12-13 17:07:09 +0530616 {
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500617 for (const auto& lockRecord : transactionId.second)
manojkiraneda402b5712019-12-13 17:07:09 +0530618 {
619 nlohmann::json returnJson;
620
621 returnJson["TransactionID"] = transactionId.first;
622 returnJson["SessionID"] = std::get<0>(lockRecord);
623 returnJson["HMCID"] = std::get<1>(lockRecord);
624 returnJson["LockType"] = std::get<2>(lockRecord);
625 returnJson["ResourceID"] = std::get<3>(lockRecord);
626
627 nlohmann::json segments;
628 nlohmann::json segmentInfoArray = nlohmann::json::array();
629
Gunnar Mills1214b7e2020-06-04 10:11:30 -0500630 for (const auto& segment : std::get<4>(lockRecord))
manojkiraneda402b5712019-12-13 17:07:09 +0530631 {
632 segments["LockFlag"] = segment.first;
633 segments["SegmentLength"] = segment.second;
634 segmentInfoArray.push_back(segments);
635 }
636
637 returnJson["SegmentFlags"] = segmentInfoArray;
638 lockRecords.push_back(returnJson);
639 }
640 }
Sunitha Harishdb81c072021-01-21 23:33:21 -0600641 asyncResp->res.result(boost::beast::http::status::ok);
642 asyncResp->res.jsonValue["Records"] = lockRecords;
manojkiraneda402b5712019-12-13 17:07:09 +0530643}
644
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500645inline bool isValidConfigFileName(const std::string& fileName,
646 crow::Response& res)
647{
648 if (fileName.empty())
649 {
Ed Tanous62598e32023-07-17 17:06:25 -0700650 BMCWEB_LOG_ERROR("Empty filename");
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500651 res.jsonValue["Description"] = "Empty file path in the url";
652 return false;
653 }
654
655 // ConfigFile name is allowed to take upper and lowercase letters,
656 // numbers and hyphen
657 std::size_t found = fileName.find_first_not_of(
658 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-");
659 if (found != std::string::npos)
660 {
Ed Tanous62598e32023-07-17 17:06:25 -0700661 BMCWEB_LOG_ERROR("Unsupported character in filename: {}", fileName);
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500662 res.jsonValue["Description"] = "Unsupported character in filename";
663 return false;
664 }
665
666 // Check the filename length
667 if (fileName.length() > 20)
668 {
Ed Tanous62598e32023-07-17 17:06:25 -0700669 BMCWEB_LOG_ERROR("Name must be maximum 20 characters. "
670 "Input filename length is: {}",
671 fileName.length());
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500672 res.jsonValue["Description"] = "Filename must be maximum 20 characters";
673 return false;
674 }
675
676 return true;
677}
678
Ed Tanous02379d32020-09-15 21:15:44 -0700679inline void requestRoutes(App& app)
Ratan Gupta453fed02019-12-14 09:39:47 +0530680{
Ratan Gupta453fed02019-12-14 09:39:47 +0530681 // allowed only for admin
682 BMCWEB_ROUTE(app, "/ibm/v1/")
Ed Tanous432a8902021-06-14 15:28:56 -0700683 .privileges({{"ConfigureComponents", "ConfigureManager"}})
Ed Tanousb41187f2019-10-24 16:30:02 -0700684 .methods(boost::beast::http::verb::get)(
zhanghch058d1b46d2021-04-01 11:18:24 +0800685 [](const crow::Request&,
686 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700687 asyncResp->res.jsonValue["@odata.type"] =
688 "#ibmServiceRoot.v1_0_0.ibmServiceRoot";
689 asyncResp->res.jsonValue["@odata.id"] = "/ibm/v1/";
690 asyncResp->res.jsonValue["Id"] = "IBM Rest RootService";
691 asyncResp->res.jsonValue["Name"] = "IBM Service Root";
692 asyncResp->res.jsonValue["ConfigFiles"]["@odata.id"] =
693 "/ibm/v1/Host/ConfigFiles";
694 asyncResp->res.jsonValue["LockService"]["@odata.id"] =
695 "/ibm/v1/HMC/LockService";
696 asyncResp->res.jsonValue["BroadcastService"]["@odata.id"] =
697 "/ibm/v1/HMC/BroadcastService";
Patrick Williams5a39f772023-10-20 11:20:21 -0500698 });
Sunitha Harish97b0e432019-11-21 04:59:29 -0600699
Ratan Guptad3630cb2019-12-14 11:21:35 +0530700 BMCWEB_ROUTE(app, "/ibm/v1/Host/ConfigFiles")
Ed Tanous432a8902021-06-14 15:28:56 -0700701 .privileges({{"ConfigureComponents", "ConfigureManager"}})
Ed Tanousb41187f2019-10-24 16:30:02 -0700702 .methods(boost::beast::http::verb::get)(
zhanghch058d1b46d2021-04-01 11:18:24 +0800703 [](const crow::Request&,
704 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700705 handleConfigFileList(asyncResp);
Patrick Williams5a39f772023-10-20 11:20:21 -0500706 });
Ratan Guptad3630cb2019-12-14 11:21:35 +0530707
708 BMCWEB_ROUTE(app,
Sunitha Harishe56f2542020-07-22 02:38:59 -0500709 "/ibm/v1/Host/ConfigFiles/Actions/IBMConfigFiles.DeleteAll")
Ed Tanous432a8902021-06-14 15:28:56 -0700710 .privileges({{"ConfigureComponents", "ConfigureManager"}})
Ed Tanousb41187f2019-10-24 16:30:02 -0700711 .methods(boost::beast::http::verb::post)(
zhanghch058d1b46d2021-04-01 11:18:24 +0800712 [](const crow::Request&,
713 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700714 deleteConfigFiles(asyncResp);
Patrick Williams5a39f772023-10-20 11:20:21 -0500715 });
Ratan Guptad3630cb2019-12-14 11:21:35 +0530716
Sunitha Harish7c0bbe72020-07-30 08:25:28 -0500717 BMCWEB_ROUTE(app, "/ibm/v1/Host/ConfigFiles/<str>")
Ed Tanous432a8902021-06-14 15:28:56 -0700718 .privileges({{"ConfigureComponents", "ConfigureManager"}})
zhanghch058d1b46d2021-04-01 11:18:24 +0800719 .methods(boost::beast::http::verb::put, boost::beast::http::verb::get,
720 boost::beast::http::verb::delete_)(
721 [](const crow::Request& req,
722 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
723 const std::string& fileName) {
Ed Tanous62598e32023-07-17 17:06:25 -0700724 BMCWEB_LOG_DEBUG("ConfigFile : {}", fileName);
Ed Tanous002d39b2022-05-31 08:59:27 -0700725 // Validate the incoming fileName
726 if (!isValidConfigFileName(fileName, asyncResp->res))
727 {
728 asyncResp->res.result(boost::beast::http::status::bad_request);
729 return;
730 }
731 handleFileUrl(req, asyncResp, fileName);
Patrick Williams5a39f772023-10-20 11:20:21 -0500732 });
Ratan Gupta734a1c32019-12-14 11:53:48 +0530733
734 BMCWEB_ROUTE(app, "/ibm/v1/HMC/LockService")
Ed Tanous432a8902021-06-14 15:28:56 -0700735 .privileges({{"ConfigureComponents", "ConfigureManager"}})
Ed Tanousb41187f2019-10-24 16:30:02 -0700736 .methods(boost::beast::http::verb::get)(
zhanghch058d1b46d2021-04-01 11:18:24 +0800737 [](const crow::Request&,
738 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700739 getLockServiceData(asyncResp);
Patrick Williams5a39f772023-10-20 11:20:21 -0500740 });
manojkiraneda0b631ae2019-12-03 17:54:28 +0530741
742 BMCWEB_ROUTE(app, "/ibm/v1/HMC/LockService/Actions/LockService.AcquireLock")
Ed Tanous432a8902021-06-14 15:28:56 -0700743 .privileges({{"ConfigureComponents", "ConfigureManager"}})
zhanghch058d1b46d2021-04-01 11:18:24 +0800744 .methods(boost::beast::http::verb::post)(
745 [](const crow::Request& req,
746 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700747 std::vector<nlohmann::json> body;
748 if (!redfish::json_util::readJsonAction(req, asyncResp->res, "Request",
749 body))
750 {
Ed Tanous62598e32023-07-17 17:06:25 -0700751 BMCWEB_LOG_DEBUG("Not a Valid JSON");
Ed Tanous002d39b2022-05-31 08:59:27 -0700752 asyncResp->res.result(boost::beast::http::status::bad_request);
753 return;
754 }
755 handleAcquireLockAPI(req, asyncResp, body);
Patrick Williams5a39f772023-10-20 11:20:21 -0500756 });
manojkiraneda3b6dea62019-12-13 17:05:36 +0530757 BMCWEB_ROUTE(app, "/ibm/v1/HMC/LockService/Actions/LockService.ReleaseLock")
Ed Tanous432a8902021-06-14 15:28:56 -0700758 .privileges({{"ConfigureComponents", "ConfigureManager"}})
zhanghch058d1b46d2021-04-01 11:18:24 +0800759 .methods(boost::beast::http::verb::post)(
760 [](const crow::Request& req,
761 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700762 std::string type;
763 std::vector<uint32_t> listTransactionIds;
manojkiraneda3b6dea62019-12-13 17:05:36 +0530764
Ed Tanous002d39b2022-05-31 08:59:27 -0700765 if (!redfish::json_util::readJsonPatch(req, asyncResp->res, "Type",
766 type, "TransactionIDs",
767 listTransactionIds))
768 {
769 asyncResp->res.result(boost::beast::http::status::bad_request);
770 return;
771 }
772 if (type == "Transaction")
773 {
774 handleReleaseLockAPI(req, asyncResp, listTransactionIds);
775 }
776 else if (type == "Session")
777 {
778 handleRelaseAllAPI(req, asyncResp);
779 }
780 else
781 {
Ed Tanous62598e32023-07-17 17:06:25 -0700782 BMCWEB_LOG_DEBUG(" Value of Type : {}is Not a Valid key", type);
Ed Tanous002d39b2022-05-31 08:59:27 -0700783 redfish::messages::propertyValueNotInList(asyncResp->res, type,
784 "Type");
785 }
Patrick Williams5a39f772023-10-20 11:20:21 -0500786 });
manojkiraneda402b5712019-12-13 17:07:09 +0530787 BMCWEB_ROUTE(app, "/ibm/v1/HMC/LockService/Actions/LockService.GetLockList")
Ed Tanous432a8902021-06-14 15:28:56 -0700788 .privileges({{"ConfigureComponents", "ConfigureManager"}})
zhanghch058d1b46d2021-04-01 11:18:24 +0800789 .methods(boost::beast::http::verb::post)(
790 [](const crow::Request& req,
791 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700792 ListOfSessionIds listSessionIds;
manojkiraneda402b5712019-12-13 17:07:09 +0530793
Ed Tanous002d39b2022-05-31 08:59:27 -0700794 if (!redfish::json_util::readJsonPatch(req, asyncResp->res,
795 "SessionIDs", listSessionIds))
796 {
797 asyncResp->res.result(boost::beast::http::status::bad_request);
798 return;
799 }
800 handleGetLockListAPI(asyncResp, listSessionIds);
Patrick Williams5a39f772023-10-20 11:20:21 -0500801 });
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500802
803 BMCWEB_ROUTE(app, "/ibm/v1/HMC/BroadcastService")
Ed Tanous432a8902021-06-14 15:28:56 -0700804 .privileges({{"ConfigureComponents", "ConfigureManager"}})
Asmitha Karunanithi5738de52020-07-17 02:03:31 -0500805 .methods(boost::beast::http::verb::post)(
zhanghch058d1b46d2021-04-01 11:18:24 +0800806 [](const crow::Request& req,
807 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700808 handleBroadcastService(req, asyncResp);
Patrick Williams5a39f772023-10-20 11:20:21 -0500809 });
Ratan Gupta453fed02019-12-14 09:39:47 +0530810}
811
812} // namespace ibm_mc
813} // namespace crow