blob: 2aa8f473d429882fb779c788b999fbb30e5378d7 [file] [log] [blame]
/*
// Copyright (c) 2018 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
*/
#pragma once
#include "utils.hpp"
#include <sdbusplus/timer.hpp>
namespace phosphor
{
namespace service
{
static constexpr const char* serviceConfigSrvName =
"xyz.openbmc_project.Control.Service.Manager";
static constexpr const char* serviceConfigIntfName =
"xyz.openbmc_project.Control.Service.Attributes";
static constexpr const char* sockAttrIntfName =
"xyz.openbmc_project.Control.Service.SocketAttributes";
static constexpr const char* srcCfgMgrBasePath =
"/xyz/openbmc_project/control/service";
static constexpr const char* sockAttrPropPort = "Port";
static constexpr const char* srvCfgPropMasked = "Masked";
static constexpr const char* srvCfgPropEnabled = "Enabled";
static constexpr const char* srvCfgPropRunning = "Running";
#ifdef USB_CODE_UPDATE
static constexpr const char* usbCodeUpdateUnitName = "phosphor_usb_code_update";
#endif
enum class UpdatedProp
{
port = 1,
maskedState,
enabledState,
runningState
};
using VariantType =
std::variant<std::string, int64_t, uint64_t, double, int32_t, uint32_t,
int16_t, uint16_t, uint8_t, bool,
std::vector<std::tuple<std::string, std::string>>>;
class ServiceConfig
{
public:
ServiceConfig(sdbusplus::asio::object_server& srv_,
std::shared_ptr<sdbusplus::asio::connection>& conn_,
const std::string& objPath_, const std::string& baseUnitName,
const std::string& instanceName,
const std::string& serviceObjPath,
const std::string& socketObjPath);
~ServiceConfig() = default;
std::shared_ptr<sdbusplus::asio::connection> conn;
uint8_t updatedFlag;
void stopAndApplyUnitConfig(boost::asio::yield_context yield);
void restartUnitConfig(boost::asio::yield_context yield);
void startServiceRestartTimer();
#ifdef USB_CODE_UPDATE
void saveUSBCodeUpdateStateToFile(const bool& maskedState,
const bool& enabledState);
void getUSBCodeUpdateStateFromFile();
void setUSBCodeUpdateState(const bool& state);
#endif
private:
sdbusplus::asio::object_server& server;
std::shared_ptr<sdbusplus::asio::dbus_interface> srvCfgIface;
std::shared_ptr<sdbusplus::asio::dbus_interface> sockAttrIface;
bool internalSet = false;
std::string objPath;
std::string baseUnitName;
std::string instanceName;
std::string instantiatedUnitName;
std::string serviceObjectPath;
std::string socketObjectPath;
std::string overrideConfDir;
// Properties
std::string activeState;
std::string subState;
uint16_t portNum;
std::vector<std::string> channelList;
std::string protocol;
std::string stateValue;
bool unitMaskedState = false;
bool unitEnabledState = false;
bool unitRunningState = false;
bool isSocketActivatedService = false;
std::string subStateValue;
bool isMaskedOut();
void registerProperties();
void queryAndUpdateProperties();
void createSocketOverrideConf();
void updateServiceProperties(
const boost::container::flat_map<std::string, VariantType>&
propertyMap);
void updateSocketProperties(
const boost::container::flat_map<std::string, VariantType>&
propertyMap);
std::string getSocketUnitName();
std::string getServiceUnitName();
};
} // namespace service
} // namespace phosphor