blob: 5867556d1971770b4db22ba5bb07d6285156e049 [file] [log] [blame]
James Feist1df06a42019-04-11 14:23:04 -07001/*
2// Copyright (c) 2018 Intel Corporation
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15*/
Brad Bishop1fb9f3f2020-08-28 08:15:13 -040016/// \file EntityManager.hpp
James Feist1df06a42019-04-11 14:23:04 -070017
18#pragma once
19
James Feist733f7652019-11-13 14:32:29 -080020#include "Utils.hpp"
21
James Feist1df06a42019-04-11 14:23:04 -070022#include <systemd/sd-journal.h>
23
James Feist733f7652019-11-13 14:32:29 -080024#include <boost/container/flat_map.hpp>
James Feist1a996582019-05-14 15:10:06 -070025#include <nlohmann/json.hpp>
James Feist4dc617b2020-05-01 09:54:47 -070026#include <sdbusplus/asio/object_server.hpp>
James Feist8c505da2020-05-28 10:06:33 -070027
28#include <iostream>
29#include <list>
James Feist1df06a42019-04-11 14:23:04 -070030#include <string>
31
James Feist733f7652019-11-13 14:32:29 -080032using DBusProbeObjectT = boost::container::flat_map<
33 std::string,
34 std::vector<boost::container::flat_map<std::string, BasicVariantType>>>;
35
James Feist7d807752019-11-13 14:47:57 -080036using FoundDeviceT =
37 std::vector<boost::container::flat_map<std::string, BasicVariantType>>;
38
James Feist733f7652019-11-13 14:32:29 -080039struct PerformScan : std::enable_shared_from_this<PerformScan>
40{
41
42 PerformScan(nlohmann::json& systemConfiguration,
43 nlohmann::json& missingConfigurations,
44 std::list<nlohmann::json>& configurations,
James Feist4dc617b2020-05-01 09:54:47 -070045 sdbusplus::asio::object_server& objServer,
46 std::function<void()>&& callback);
James Feist733f7652019-11-13 14:32:29 -080047 void run(void);
48 virtual ~PerformScan();
49 nlohmann::json& _systemConfiguration;
50 nlohmann::json& _missingConfigurations;
51 std::list<nlohmann::json> _configurations;
James Feist4dc617b2020-05-01 09:54:47 -070052 sdbusplus::asio::object_server& objServer;
53 std::function<void()> _callback;
James Feist733f7652019-11-13 14:32:29 -080054 bool _passed = false;
55 bool powerWasOn = isPowerOn();
56 DBusProbeObjectT dbusProbeObjects;
57 std::vector<std::string> passedProbes;
58};
59
James Feist7d807752019-11-13 14:47:57 -080060// this class finds the needed dbus fields and on destruction runs the probe
61struct PerformProbe : std::enable_shared_from_this<PerformProbe>
62{
63 PerformProbe(const std::vector<std::string>& probeCommand,
64 std::shared_ptr<PerformScan>& scanPtr,
65 std::function<void(FoundDeviceT&)>&& callback);
66 virtual ~PerformProbe();
67
68 std::vector<std::string> _probeCommand;
69 std::shared_ptr<PerformScan> scan;
70 std::function<void(FoundDeviceT&)> _callback;
71};
72
James Feist1a996582019-05-14 15:10:06 -070073inline void logDeviceAdded(const nlohmann::json& record)
James Feist1df06a42019-04-11 14:23:04 -070074{
75
James Feist1ffa4a42020-04-22 18:27:17 -070076 if (!deviceHasLogging(record))
77 {
78 return;
79 }
James Feist1a996582019-05-14 15:10:06 -070080 auto findType = record.find("Type");
81 auto findAsset =
82 record.find("xyz.openbmc_project.Inventory.Decorator.Asset");
83
84 std::string model = "Unkown";
85 std::string type = "Unknown";
86 std::string sn = "Unkown";
87
88 if (findType != record.end())
89 {
90 type = findType->get<std::string>();
91 }
92 if (findAsset != record.end())
93 {
94 auto findModel = findAsset->find("Model");
95 auto findSn = findAsset->find("SerialNumber");
96 if (findModel != findAsset->end())
97 {
98 model = findModel->get<std::string>();
99 }
100 if (findSn != findAsset->end())
101 {
James Feistf5125b02019-06-06 11:27:43 -0700102 const std::string* getSn = findSn->get_ptr<const std::string*>();
103 if (getSn != nullptr)
104 {
105 sn = *getSn;
106 }
107 else
108 {
109 sn = findSn->dump();
110 }
James Feist1a996582019-05-14 15:10:06 -0700111 }
112 }
113
James Feist1df06a42019-04-11 14:23:04 -0700114 sd_journal_send("MESSAGE=%s", "Inventory Added", "PRIORITY=%i", LOG_ERR,
115 "REDFISH_MESSAGE_ID=%s", "OpenBMC.0.1.InventoryAdded",
James Feist1a996582019-05-14 15:10:06 -0700116 "REDFISH_MESSAGE_ARGS=%s,%s,%s", model.c_str(),
117 type.c_str(), sn.c_str(), NULL);
James Feist1df06a42019-04-11 14:23:04 -0700118}
119
James Feist1a996582019-05-14 15:10:06 -0700120inline void logDeviceRemoved(const nlohmann::json& record)
James Feist1df06a42019-04-11 14:23:04 -0700121{
James Feist1ffa4a42020-04-22 18:27:17 -0700122 if (!deviceHasLogging(record))
123 {
124 return;
125 }
James Feist1a996582019-05-14 15:10:06 -0700126 auto findType = record.find("Type");
127 auto findAsset =
128 record.find("xyz.openbmc_project.Inventory.Decorator.Asset");
129
130 std::string model = "Unkown";
131 std::string type = "Unknown";
132 std::string sn = "Unkown";
133
134 if (findType != record.end())
135 {
136 type = findType->get<std::string>();
137 }
138 if (findAsset != record.end())
139 {
140 auto findModel = findAsset->find("Model");
141 auto findSn = findAsset->find("SerialNumber");
142 if (findModel != findAsset->end())
143 {
144 model = findModel->get<std::string>();
145 }
146 if (findSn != findAsset->end())
147 {
James Feistf5125b02019-06-06 11:27:43 -0700148 const std::string* getSn = findSn->get_ptr<const std::string*>();
149 if (getSn != nullptr)
150 {
151 sn = *getSn;
152 }
153 else
154 {
155 sn = findSn->dump();
156 }
James Feist1a996582019-05-14 15:10:06 -0700157 }
158 }
James Feist1df06a42019-04-11 14:23:04 -0700159
160 sd_journal_send("MESSAGE=%s", "Inventory Removed", "PRIORITY=%i", LOG_ERR,
161 "REDFISH_MESSAGE_ID=%s", "OpenBMC.0.1.InventoryRemoved",
James Feist1a996582019-05-14 15:10:06 -0700162 "REDFISH_MESSAGE_ARGS=%s,%s,%s", model.c_str(),
163 type.c_str(), sn.c_str(), NULL);
James Feist4dc617b2020-05-01 09:54:47 -0700164}