#pragma once #include "config.h" #include "types.hpp" #include <sdbusplus/server.hpp> #include <xyz/openbmc_project/Association/Definitions/server.hpp> #include <xyz/openbmc_project/Software/Activation/server.hpp> #include <xyz/openbmc_project/Software/ExtendedVersion/server.hpp> namespace phosphor { namespace software { namespace updater { namespace sdbusRule = sdbusplus::bus::match::rules; using ActivationInherit = sdbusplus::server::object::object< sdbusplus::xyz::openbmc_project::Software::server::ExtendedVersion, sdbusplus::xyz::openbmc_project::Software::server::Activation, sdbusplus::xyz::openbmc_project::Association::server::Definitions>; /** @class Activation * @brief OpenBMC activation software management implementation. * @details A concrete implementation for * xyz.openbmc_project.Software.Activation DBus API. */ class Activation : public ActivationInherit { public: using Status = Activations; /** @brief Constructs Activation Software Manager * * @param[in] bus - The Dbus bus object * @param[in] path - The Dbus object path * @param[in] versionId - The software version id * @param[in] extVersion - The extended version * @param[in] activationStatus - The status of Activation * @param[in] assocs - Association objects */ Activation(sdbusplus::bus::bus& bus, const std::string& path, const std::string& versionId, const std::string& extVersion, sdbusplus::xyz::openbmc_project::Software::server::Activation:: Activations activationStatus, const AssociationList& assocs) : ActivationInherit(bus, path.c_str(), true), versionId(versionId), bus(bus), path(path), systemdSignals( bus, sdbusRule::type::signal() + sdbusRule::member("JobRemoved") + sdbusRule::path("/org/freedesktop/systemd1") + sdbusRule::interface("org.freedesktop.systemd1.Manager"), std::bind(&Activation::unitStateChange, this, std::placeholders::_1)) { // Set Properties. extendedVersion(extVersion); activation(activationStatus); associations(assocs); // Emit deferred signal. emit_object_added(); } /** @brief Overloaded Activation property setter function * * @param[in] value - One of Activation::Activations * * @return Success or exception thrown */ Activations activation(Activations value) override; /** @brief Activation */ using ActivationInherit::activation; /** @brief Overloaded requestedActivation property setter function * * @param[in] value - One of Activation::RequestedActivations * * @return Success or exception thrown */ RequestedActivations requestedActivation(RequestedActivations value) override; /** @brief Version id */ std::string versionId; private: /** @brief Check if systemd state change is relevant to this object * * Instance specific interface to handle the detected systemd state * change * * @param[in] msg - Data associated with subscribed signal * */ void unitStateChange(sdbusplus::message::message& msg); /** @brief Start PSU update */ void startActivation(); /** @brief Finish PSU update */ void finishActivation(); /** @brief Persistent sdbusplus DBus bus connection */ sdbusplus::bus::bus& bus; /** @brief Persistent DBus object path */ std::string path; /** @brief Used to subscribe to dbus systemd signals */ sdbusplus::bus::match_t systemdSignals; /** @brief The PSU update systemd unit */ std::string psuUpdateUnit; }; } // namespace updater } // namespace software } // namespace phosphor