1cf066aceSPatrick Venture #pragma once
2cf066aceSPatrick Venture 
3cf066aceSPatrick Venture #include "status.hpp"
4cf066aceSPatrick Venture 
5cf066aceSPatrick Venture #include <sdbusplus/bus.hpp>
6b22ebbf3SWilliam A. Kennington III #include <sdbusplus/bus/match.hpp>
79b37b095SPatrick Venture 
89b37b095SPatrick Venture #include <memory>
9cf066aceSPatrick Venture #include <string>
10cf066aceSPatrick Venture 
11cf066aceSPatrick Venture namespace ipmi_flash
12cf066aceSPatrick Venture {
13cf066aceSPatrick Venture 
14b22ebbf3SWilliam A. Kennington III class SystemdNoFile : public TriggerableActionInterface
15b22ebbf3SWilliam A. Kennington III {
16b22ebbf3SWilliam A. Kennington III   public:
17b22ebbf3SWilliam A. Kennington III     static std::unique_ptr<TriggerableActionInterface>
18*40fbb0c6SPatrick Williams         CreateSystemdNoFile(sdbusplus::bus_t&& bus, const std::string& service,
19b22ebbf3SWilliam A. Kennington III                             const std::string& mode);
20b22ebbf3SWilliam A. Kennington III 
SystemdNoFile(sdbusplus::bus_t && bus,const std::string & service,const std::string & mode)21*40fbb0c6SPatrick Williams     SystemdNoFile(sdbusplus::bus_t&& bus, const std::string& service,
22b22ebbf3SWilliam A. Kennington III                   const std::string& mode) :
23b22ebbf3SWilliam A. Kennington III         bus(std::move(bus)),
24b22ebbf3SWilliam A. Kennington III         triggerService(service), mode(mode)
259b37b095SPatrick Venture     {}
26b22ebbf3SWilliam A. Kennington III 
27b22ebbf3SWilliam A. Kennington III     SystemdNoFile(const SystemdNoFile&) = delete;
28b22ebbf3SWilliam A. Kennington III     SystemdNoFile& operator=(const SystemdNoFile&) = delete;
29b22ebbf3SWilliam A. Kennington III     // sdbusplus match requires us to be pinned
30b22ebbf3SWilliam A. Kennington III     SystemdNoFile(SystemdNoFile&&) = delete;
31b22ebbf3SWilliam A. Kennington III     SystemdNoFile& operator=(SystemdNoFile&&) = delete;
32b22ebbf3SWilliam A. Kennington III 
33b22ebbf3SWilliam A. Kennington III     bool trigger() override;
34b22ebbf3SWilliam A. Kennington III     void abort() override;
35b22ebbf3SWilliam A. Kennington III     ActionStatus status() override;
36b22ebbf3SWilliam A. Kennington III 
37b22ebbf3SWilliam A. Kennington III     const std::string& getMode() const;
38b22ebbf3SWilliam A. Kennington III 
39b22ebbf3SWilliam A. Kennington III   private:
40*40fbb0c6SPatrick Williams     sdbusplus::bus_t bus;
41b22ebbf3SWilliam A. Kennington III     const std::string triggerService;
42b22ebbf3SWilliam A. Kennington III     const std::string mode;
43b22ebbf3SWilliam A. Kennington III 
44*40fbb0c6SPatrick Williams     std::optional<sdbusplus::bus::match_t> jobMonitor;
45b22ebbf3SWilliam A. Kennington III     std::optional<std::string> job;
46b22ebbf3SWilliam A. Kennington III     ActionStatus currentStatus = ActionStatus::unknown;
47b22ebbf3SWilliam A. Kennington III 
48*40fbb0c6SPatrick Williams     void match(sdbusplus::message_t& m);
49b22ebbf3SWilliam A. Kennington III };
50b22ebbf3SWilliam A. Kennington III 
51cf066aceSPatrick Venture /**
52cf066aceSPatrick Venture  * Representation of what is used for triggering an action with systemd and
53cf066aceSPatrick Venture  * checking the result by reading a file.
54cf066aceSPatrick Venture  */
55b22ebbf3SWilliam A. Kennington III class SystemdWithStatusFile : public SystemdNoFile
56cf066aceSPatrick Venture {
57cf066aceSPatrick Venture   public:
58cf066aceSPatrick Venture     /**
59cf066aceSPatrick Venture      * Create a default SystemdWithStatusFile object that uses systemd to
60cf066aceSPatrick Venture      * trigger the process.
61cf066aceSPatrick Venture      *
62cf066aceSPatrick Venture      * @param[in] bus - an sdbusplus handler for a bus to use.
63cf066aceSPatrick Venture      * @param[in] path - the path to check for verification status.
64cf066aceSPatrick Venture      * @param[in] service - the systemd service to start to trigger
65cf066aceSPatrick Venture      * verification.
66cf066aceSPatrick Venture      * @param[in] mode - the job-mode when starting the systemd Unit.
67cf066aceSPatrick Venture      */
68cf066aceSPatrick Venture     static std::unique_ptr<TriggerableActionInterface>
69*40fbb0c6SPatrick Williams         CreateSystemdWithStatusFile(sdbusplus::bus_t&& bus,
70cf066aceSPatrick Venture                                     const std::string& path,
71cf066aceSPatrick Venture                                     const std::string& service,
72cf066aceSPatrick Venture                                     const std::string& mode);
73cf066aceSPatrick Venture 
SystemdWithStatusFile(sdbusplus::bus_t && bus,const std::string & path,const std::string & service,const std::string & mode)74*40fbb0c6SPatrick Williams     SystemdWithStatusFile(sdbusplus::bus_t&& bus, const std::string& path,
75cf066aceSPatrick Venture                           const std::string& service, const std::string& mode) :
76b22ebbf3SWilliam A. Kennington III         SystemdNoFile(std::move(bus), service, mode),
77b22ebbf3SWilliam A. Kennington III         checkPath(path)
789b37b095SPatrick Venture     {}
79cf066aceSPatrick Venture 
8093f3c550SWilliam A. Kennington III     bool trigger() override;
81cf066aceSPatrick Venture     ActionStatus status() override;
82cf066aceSPatrick Venture 
83cf066aceSPatrick Venture   private:
84cf066aceSPatrick Venture     const std::string checkPath;
85e0216d23SPatrick Venture };
86e0216d23SPatrick Venture 
87cf066aceSPatrick Venture } // namespace ipmi_flash
88