1 /*
2 // Copyright (c) 2018 Intel Corporation
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 #pragma once
17 #include "utils.hpp"
18 
19 #include <sdbusplus/timer.hpp>
20 
21 namespace phosphor
22 {
23 namespace service
24 {
25 
26 static constexpr const char* serviceConfigSrvName =
27     "xyz.openbmc_project.Control.Service.Manager";
28 static constexpr const char* serviceConfigIntfName =
29     "xyz.openbmc_project.Control.Service.Attributes";
30 static constexpr const char* sockAttrIntfName =
31     "xyz.openbmc_project.Control.Service.SocketAttributes";
32 static constexpr const char* srcCfgMgrBasePath =
33     "/xyz/openbmc_project/control/service";
34 static constexpr const char* sockAttrPropPort = "Port";
35 static constexpr const char* srvCfgPropMasked = "Masked";
36 static constexpr const char* srvCfgPropEnabled = "Enabled";
37 static constexpr const char* srvCfgPropRunning = "Running";
38 
39 enum class UpdatedProp
40 {
41     port = 1,
42     maskedState,
43     enabledState,
44     runningState
45 };
46 
47 using VariantType =
48     std::variant<std::string, int64_t, uint64_t, double, int32_t, uint32_t,
49                  int16_t, uint16_t, uint8_t, bool,
50                  std::vector<std::tuple<std::string, std::string>>>;
51 
52 class ServiceConfig
53 {
54   public:
55     ServiceConfig(sdbusplus::asio::object_server& srv_,
56                   std::shared_ptr<sdbusplus::asio::connection>& conn_,
57                   const std::string& objPath_, const std::string& baseUnitName,
58                   const std::string& instanceName,
59                   const std::string& serviceObjPath,
60                   const std::string& socketObjPath);
61     ~ServiceConfig() = default;
62 
63     std::shared_ptr<sdbusplus::asio::connection> conn;
64     uint8_t updatedFlag;
65 
66     void stopAndApplyUnitConfig(boost::asio::yield_context yield);
67     void restartUnitConfig(boost::asio::yield_context yield);
68     void startServiceRestartTimer();
69 
70   private:
71     sdbusplus::asio::object_server& server;
72     std::shared_ptr<sdbusplus::asio::dbus_interface> srvCfgIface;
73     std::shared_ptr<sdbusplus::asio::dbus_interface> sockAttrIface;
74 
75     bool internalSet = false;
76     std::string objPath;
77     std::string baseUnitName;
78     std::string instanceName;
79     std::string instantiatedUnitName;
80     std::string serviceObjectPath;
81     std::string socketObjectPath;
82     std::string overrideConfDir;
83 
84     // Properties
85     std::string activeState;
86     std::string subState;
87     uint16_t portNum;
88     std::vector<std::string> channelList;
89     std::string protocol;
90     std::string stateValue;
91     bool unitMaskedState = false;
92     bool unitEnabledState = false;
93     bool unitRunningState = false;
94 
95     // dropbear is handled specially because it is a socket-activated service.
96     bool isDropBearService = false;
97     std::string subStateValue;
98 
99     bool isMaskedOut();
100     void registerProperties();
101     void queryAndUpdateProperties();
102     void createSocketOverrideConf();
103     void updateServiceProperties(
104         const boost::container::flat_map<std::string, VariantType>&
105             propertyMap);
106     void updateSocketProperties(
107         const boost::container::flat_map<std::string, VariantType>&
108             propertyMap);
109     std::string getSocketUnitName();
110     std::string getServiceUnitName();
111 };
112 
113 } // namespace service
114 } // namespace phosphor
115