summaryrefslogtreecommitdiffstats
path: root/mslverify/verify.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mslverify/verify.cpp')
-rw-r--r--mslverify/verify.cpp114
1 files changed, 114 insertions, 0 deletions
diff --git a/mslverify/verify.cpp b/mslverify/verify.cpp
new file mode 100644
index 0000000..1595166
--- /dev/null
+++ b/mslverify/verify.cpp
@@ -0,0 +1,114 @@
+/**
+ * Copyright © 2017 IBM Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <algorithm>
+#include <map>
+#include <string>
+#include "util.hpp"
+
+using namespace std::literals::string_literals;
+
+template <typename T>
+struct BusMeetsMSL
+{
+ std::string path;
+
+ BusMeetsMSL(const std::string& p)
+ :path(p) {}
+
+ auto operator()(const T& arg)
+ {
+ // Query each service hosting
+ // xyz.openbmc_project.Inventory.Decorator.MeetsMinimumShipLevel.
+
+ const auto& busName = arg.first;
+ return util::sdbusplus::getProperty<bool>(
+ busName,
+ path,
+ "xyz.openbmc_project.Inventory."
+ "Decorator.MeetsMinimumShipLevel"s,
+ "MeetsMinimumShipLevel"s);
+ }
+};
+
+template <typename T>
+struct PathMeetsMSL
+{
+ auto operator()(const T& arg)
+ {
+ // A given path in the mapper response is composed of
+ // a map of services/interfaces. Validate each service
+ // that hosts the MSL interface meets the MSL.
+
+ const auto& path = arg.first;
+ return std::all_of(
+ arg.second.begin(),
+ arg.second.end(),
+ BusMeetsMSL<typename decltype(arg.second)::value_type>(path));
+ }
+};
+
+int main(void)
+{
+ auto mslVerificationRequired =
+ util::sdbusplus::getProperty<bool>(
+ "/xyz/openbmc_project/control/minimum_ship_level_required"s,
+ "xyz.openbmc_project.Control.MinimumShipLevel"s,
+ "MinimumShipLevelRequired"s);
+
+ if (!mslVerificationRequired)
+ {
+ return 0;
+ }
+
+ // Obtain references to all objects hosting
+ // xyz.openbmc_project.Inventory.Decorator.MeetsMinimumShipLevel
+ // with a mapper subtree query. For each object, validate that
+ // the minimum ship level has been met.
+
+ using SubTreeType =
+ std::map<
+ std::string,
+ std::map<std::string, std::vector<std::string>>>;
+
+ auto subtree =
+ util::sdbusplus::callMethodAndRead<SubTreeType>(
+ "xyz.openbmc_project.ObjectMapper"s,
+ "/xyz/openbmc_project/object_mapper"s,
+ "xyz.openbmc_project.ObjectMapper"s,
+ "GetSubTree"s,
+ "/"s,
+ 0,
+ std::vector<std::string>{
+ "xyz.openbmc_project.Inventory"
+ ".Decorator.MeetsMinimumShipLevel"s});
+
+ auto result = std::all_of(
+ subtree.begin(),
+ subtree.end(),
+ PathMeetsMSL<SubTreeType::value_type>());
+
+ if (!result)
+ {
+ phosphor::logging::log<phosphor::logging::level::INFO>(
+ "The physical system configuration does not "
+ "satisfy the minimum ship level.");
+
+ return 1;
+ }
+
+ return 0;
+}
OpenPOWER on IntegriCloud