diff options
Diffstat (limited to 'mslverify/verify.cpp')
-rw-r--r-- | mslverify/verify.cpp | 114 |
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; +} |