1 #ifndef _MANAGEMENT_CLIENT_H
2 #define _MANAGEMENT_CLIENT_H
13 #include <client_http.hpp>
14 #include <server_http.hpp>
15 #include <config_category.h>
16 #include <service_record.h>
21 #include <rapidjson/document.h>
22 #include <asset_tracking.h>
23 #include <json_utils.h>
25 #include <bearer_token.h>
29 using HttpClient = SimpleWeb::Client<SimpleWeb::HTTP>;
30 using HttpServer = SimpleWeb::Server<SimpleWeb::HTTP>;
31 using namespace rapidjson;
49 bool unregisterService();
50 bool restartService();
52 bool getServices(std::vector<ServiceRecord *>& services);
53 bool getServices(std::vector<ServiceRecord *>& services,
const std::string& type);
54 bool registerCategory(
const std::string& categoryName);
55 bool registerCategoryChild(
const std::string& categoryName);
56 bool unregisterCategory(
const std::string& categoryName);
59 std::string setCategoryItemValue(
const std::string& categoryName,
60 const std::string& itemName,
61 const std::string& itemValue);
62 std::string addChildCategories(
const std::string& parentCategory,
63 const std::vector<std::string>& children);
64 std::vector<AssetTrackingTuple*>&
65 getAssetTrackingTuples(
const std::string serviceName =
"");
66 std::vector<StorageAssetTrackingTuple*>&
67 getStorageAssetTrackingTuples(
const std::string serviceName);
70 const std::string& assetName,
71 const std::string& event,
const std::string & dp,
const unsigned int& c);
73 bool addAssetTrackingTuple(
const std::string& service,
74 const std::string& plugin,
75 const std::string& asset,
76 const std::string& event);
78 bool addStorageAssetTrackingTuple(
const std::string& service,
79 const std::string& plugin,
80 const std::string& asset,
81 const std::string& event,
82 const bool& deprecated =
false,
83 const std::string& datapoints =
"",
84 const int& count = 0);
86 HttpClient *getHttpClient();
87 bool addAuditEntry(
const std::string& serviceName,
88 const std::string& severity,
89 const std::string& details);
90 std::string& getRegistrationBearerToken()
92 std::lock_guard<std::mutex> guard(m_bearer_token_mtx);
93 return m_bearer_token;
95 void setNewBearerToken(
const std::string& bearerToken)
97 std::lock_guard<std::mutex> guard(m_bearer_token_mtx);
98 m_bearer_token = bearerToken;
102 bool verifyAccessBearerToken(std::shared_ptr<HttpServer::Request> request);
103 bool refreshBearerToken(
const std::string& currentToken,
104 std::string& newToken);
105 std::string& getBearerToken() {
return m_bearer_token; };
106 bool addProxy(
const std::string& serviceName,
107 const std::string& operation,
108 const std::string& publicEnpoint,
109 const std::string& privateEndpoint);
110 bool addProxy(
const std::string& serviceName,
111 const std::map<std::string,
112 std::vector<std::pair<std::string, std::string> > >& endpoints);
113 bool deleteProxy(
const std::string& serviceName);
114 const std::string getUrlbase() {
return m_urlbase.str(); }
115 ACL getACL(
const std::string& aclName);
117 const std::string& assetName,
118 const std::string& event);
119 int validateDatapoints(std::string dp1, std::string dp2);
121 std::string getAlertByKey(
const std::string& key);
122 bool raiseAlert(
const std::string& key,
const std::string& message,
const std::string& urgency=
"normal");
123 bool clearAlert(
const std::string& key);
126 std::ostringstream m_urlbase;
127 std::map<std::thread::id, HttpClient *> m_client_map;
128 HttpClient *m_client;
131 std::map<std::string, std::string> m_categories;
134 std::string m_bearer_token;
136 std::map<std::string, BearerToken> m_received_tokens;
138 std::mutex m_mtx_rTokens;
140 std::mutex m_mtx_client_map;
142 std::mutex m_bearer_token_mtx;
146 template<
class T>
bool addCategory(
const T& t,
bool keepOriginalItems =
false)
149 std::string blockedCharacter = {};
150 if (!isValidIdentifier(t.getName(), blockedCharacter))
152 m_logger->
error(
"The category name %s contains %s invalid character(s).", blockedCharacter.c_str(), t.getName().c_str());
155 std::string url =
"/fledge/service/category";
158 std::ostringstream payload;
159 payload <<
"{ \"key\" : \"" << JSONescape(t.getName());
160 payload <<
"\", \"description\" : \"" << JSONescape(t.getDescription());
161 if (! t.getDisplayName().empty() ) {
162 payload <<
"\", \"display_name\" : \"" << JSONescape(t.getDisplayName());
164 payload <<
"\", \"value\" : " << t.itemsToJSON();
175 if (keepOriginalItems)
177 url +=
"?keep_original_items=true";
183 auto res = this->getHttpClient()->request(
"POST", url.c_str(), payload.str());
186 std::string response = res->content.string();
188 doc.Parse(response.c_str());
189 if (doc.HasParseError())
191 m_logger->
error(
"Failed to parse result of adding a category: %s\n",
195 else if (doc.HasMember(
"message"))
197 m_logger->
error(
"Failed to add configuration category: %s.",
198 doc[
"message"].GetString());
205 }
catch (
const SimpleWeb::system_error &e) {
206 m_logger->
error(
"Add config category failed %s.", e.what());