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