blob: 5b9fb8744e1a8ecfdb25cef66d8f9835e6e89457 [file] [log] [blame]
Patrick Venture3ecb3502019-05-17 11:03:51 -07001/*
2 * Copyright 2019 Google Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Patrick Venturecf066ac2019-08-06 09:03:47 -070017#include "general_systemd.hpp"
Patrick Venture3ecb3502019-05-17 11:03:51 -070018
19#include "status.hpp"
20
21#include <fstream>
22#include <memory>
23#include <sdbusplus/bus.hpp>
24#include <string>
25#include <vector>
26
Patrick Venture1d5a31c2019-05-20 11:38:22 -070027namespace ipmi_flash
Patrick Venture3ecb3502019-05-17 11:03:51 -070028{
29
Patrick Venture1d66fe62019-06-03 14:57:27 -070030std::unique_ptr<TriggerableActionInterface>
Patrick Venturecf066ac2019-08-06 09:03:47 -070031 SystemdWithStatusFile::CreateSystemdWithStatusFile(
32 sdbusplus::bus::bus&& bus, const std::string& path,
33 const std::string& service, const std::string& mode)
Patrick Venture3ecb3502019-05-17 11:03:51 -070034{
Patrick Venture29af1e32019-08-05 13:42:28 -070035 return std::make_unique<SystemdWithStatusFile>(std::move(bus), path,
36 service, mode);
Patrick Venture3ecb3502019-05-17 11:03:51 -070037}
38
Patrick Venture29af1e32019-08-05 13:42:28 -070039bool SystemdWithStatusFile::trigger()
Patrick Venture3ecb3502019-05-17 11:03:51 -070040{
41 static constexpr auto systemdService = "org.freedesktop.systemd1";
42 static constexpr auto systemdRoot = "/org/freedesktop/systemd1";
43 static constexpr auto systemdInterface = "org.freedesktop.systemd1.Manager";
44
45 auto method = bus.new_method_call(systemdService, systemdRoot,
46 systemdInterface, "StartUnit");
47 method.append(triggerService);
Patrick Ventureee614ec2019-08-05 12:08:44 -070048 method.append(mode);
Patrick Venture3ecb3502019-05-17 11:03:51 -070049
50 try
51 {
52 bus.call_noreply(method);
53 }
54 catch (const sdbusplus::exception::SdBusError& ex)
55 {
56 /* TODO: Once logging supports unit-tests, add a log message to test
57 * this failure.
58 */
59 return false;
60 }
61
62 return true;
63}
64
Patrick Venture29af1e32019-08-05 13:42:28 -070065void SystemdWithStatusFile::abort()
Patrick Venture3ecb3502019-05-17 11:03:51 -070066{
67 /* TODO: Implement this. */
68}
69
Patrick Venture29af1e32019-08-05 13:42:28 -070070ActionStatus SystemdWithStatusFile::status()
Patrick Venture3ecb3502019-05-17 11:03:51 -070071{
Patrick Ventureda66fd82019-06-03 11:11:24 -070072 ActionStatus result = ActionStatus::unknown;
Patrick Venture3ecb3502019-05-17 11:03:51 -070073
74 std::ifstream ifs;
75 ifs.open(checkPath);
76 if (ifs.good())
77 {
78 /*
79 * Check for the contents of the file, accepting:
80 * running, success, or failed.
81 */
82 std::string status;
83 ifs >> status;
84 if (status == "running")
85 {
Patrick Ventureda66fd82019-06-03 11:11:24 -070086 result = ActionStatus::running;
Patrick Venture3ecb3502019-05-17 11:03:51 -070087 }
88 else if (status == "success")
89 {
Patrick Ventureda66fd82019-06-03 11:11:24 -070090 result = ActionStatus::success;
Patrick Venture3ecb3502019-05-17 11:03:51 -070091 }
92 else if (status == "failed")
93 {
Patrick Ventureda66fd82019-06-03 11:11:24 -070094 result = ActionStatus::failed;
Patrick Venture3ecb3502019-05-17 11:03:51 -070095 }
96 }
97
98 return result;
99}
100
Patrick Venture29af1e32019-08-05 13:42:28 -0700101const std::string SystemdWithStatusFile::getMode() const
Patrick Ventureee614ec2019-08-05 12:08:44 -0700102{
103 return mode;
104}
105
Patrick Venturee0216d22019-08-21 10:17:39 -0700106std::unique_ptr<TriggerableActionInterface>
107 SystemdNoFile::CreateSystemdNoFile(sdbusplus::bus::bus&& bus,
108 const std::string& service,
109 const std::string& mode)
110{
111 return std::make_unique<SystemdNoFile>(std::move(bus), service, mode);
112}
113
114bool SystemdNoFile::trigger()
115{
116 static constexpr auto systemdService = "org.freedesktop.systemd1";
117 static constexpr auto systemdRoot = "/org/freedesktop/systemd1";
118 static constexpr auto systemdInterface = "org.freedesktop.systemd1.Manager";
119
120 auto method = bus.new_method_call(systemdService, systemdRoot,
121 systemdInterface, "StartUnit");
122 method.append(triggerService);
123 method.append(mode);
124
125 try
126 {
127 bus.call_noreply(method);
128 state = ActionStatus::running;
129 return true;
130 }
131 catch (const sdbusplus::exception::SdBusError& ex)
132 {
133 /* TODO: Once logging supports unit-tests, add a log message to test
134 * this failure.
135 */
136 state = ActionStatus::failed;
137 return false;
138 }
139}
140
141void SystemdNoFile::abort()
142{
143 return;
144}
145
146ActionStatus SystemdNoFile::status()
147{
148 return state;
149}
150
151const std::string SystemdNoFile::getMode() const
152{
153 return mode;
154}
155
Patrick Venture1d5a31c2019-05-20 11:38:22 -0700156} // namespace ipmi_flash