xref: /openbmc/phosphor-certificate-manager/certs_manager.cpp (revision cfbc8dc8904bfdc1776e1a9f841fb48d00d6d968)
1*cfbc8dc8SJayanth Othayoth #include "certs_manager.hpp"
2*cfbc8dc8SJayanth Othayoth 
3*cfbc8dc8SJayanth Othayoth #include <experimental/filesystem>
4*cfbc8dc8SJayanth Othayoth #include <phosphor-logging/elog-errors.hpp>
5*cfbc8dc8SJayanth Othayoth #include <phosphor-logging/elog.hpp>
6*cfbc8dc8SJayanth Othayoth #include <phosphor-logging/log.hpp>
7*cfbc8dc8SJayanth Othayoth #include <sdbusplus/bus.hpp>
8*cfbc8dc8SJayanth Othayoth #include <xyz/openbmc_project/Common/error.hpp>
9*cfbc8dc8SJayanth Othayoth 
10*cfbc8dc8SJayanth Othayoth namespace phosphor
11*cfbc8dc8SJayanth Othayoth {
12*cfbc8dc8SJayanth Othayoth namespace certs
13*cfbc8dc8SJayanth Othayoth {
14*cfbc8dc8SJayanth Othayoth 
15*cfbc8dc8SJayanth Othayoth using namespace phosphor::logging;
16*cfbc8dc8SJayanth Othayoth using InternalFailure =
17*cfbc8dc8SJayanth Othayoth     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
18*cfbc8dc8SJayanth Othayoth 
19*cfbc8dc8SJayanth Othayoth void Manager::install(const std::string path)
20*cfbc8dc8SJayanth Othayoth {
21*cfbc8dc8SJayanth Othayoth     // TODO Validate the certificate file
22*cfbc8dc8SJayanth Othayoth 
23*cfbc8dc8SJayanth Othayoth     // Copy the certificate file
24*cfbc8dc8SJayanth Othayoth     copy(path, certPath);
25*cfbc8dc8SJayanth Othayoth 
26*cfbc8dc8SJayanth Othayoth     // Invoke type specific install function.
27*cfbc8dc8SJayanth Othayoth     auto iter = typeFuncMap.find(type);
28*cfbc8dc8SJayanth Othayoth     if (iter == typeFuncMap.end())
29*cfbc8dc8SJayanth Othayoth     {
30*cfbc8dc8SJayanth Othayoth         log<level::ERR>("Unsupported Type", entry("TYPE=%s", type.c_str()));
31*cfbc8dc8SJayanth Othayoth         elog<InternalFailure>();
32*cfbc8dc8SJayanth Othayoth     }
33*cfbc8dc8SJayanth Othayoth     iter->second();
34*cfbc8dc8SJayanth Othayoth }
35*cfbc8dc8SJayanth Othayoth 
36*cfbc8dc8SJayanth Othayoth void Manager::serverInstall()
37*cfbc8dc8SJayanth Othayoth {
38*cfbc8dc8SJayanth Othayoth     if (!unit.empty())
39*cfbc8dc8SJayanth Othayoth     {
40*cfbc8dc8SJayanth Othayoth         reload(unit);
41*cfbc8dc8SJayanth Othayoth     }
42*cfbc8dc8SJayanth Othayoth }
43*cfbc8dc8SJayanth Othayoth 
44*cfbc8dc8SJayanth Othayoth void Manager::clientInstall()
45*cfbc8dc8SJayanth Othayoth {
46*cfbc8dc8SJayanth Othayoth     // Do nothing now
47*cfbc8dc8SJayanth Othayoth }
48*cfbc8dc8SJayanth Othayoth 
49*cfbc8dc8SJayanth Othayoth void Manager::reload(const std::string& unit)
50*cfbc8dc8SJayanth Othayoth {
51*cfbc8dc8SJayanth Othayoth     constexpr auto SYSTEMD_SERVICE = "org.freedesktop.systemd1";
52*cfbc8dc8SJayanth Othayoth     constexpr auto SYSTEMD_OBJ_PATH = "/org/freedesktop/systemd1";
53*cfbc8dc8SJayanth Othayoth     constexpr auto SYSTEMD_INTERFACE = "org.freedesktop.systemd1.Manager";
54*cfbc8dc8SJayanth Othayoth 
55*cfbc8dc8SJayanth Othayoth     try
56*cfbc8dc8SJayanth Othayoth     {
57*cfbc8dc8SJayanth Othayoth         auto method = bus.new_method_call(SYSTEMD_SERVICE, SYSTEMD_OBJ_PATH,
58*cfbc8dc8SJayanth Othayoth                                           SYSTEMD_INTERFACE, "ReloadUnit");
59*cfbc8dc8SJayanth Othayoth 
60*cfbc8dc8SJayanth Othayoth         method.append(unit, "replace");
61*cfbc8dc8SJayanth Othayoth 
62*cfbc8dc8SJayanth Othayoth         bus.call_noreply(method);
63*cfbc8dc8SJayanth Othayoth     }
64*cfbc8dc8SJayanth Othayoth     catch (const sdbusplus::exception::SdBusError& e)
65*cfbc8dc8SJayanth Othayoth     {
66*cfbc8dc8SJayanth Othayoth         log<level::ERR>("Failed to reload service", entry("ERR=%s", e.what()),
67*cfbc8dc8SJayanth Othayoth                         entry("UNIT=%s", unit.c_str()));
68*cfbc8dc8SJayanth Othayoth         elog<InternalFailure>();
69*cfbc8dc8SJayanth Othayoth     }
70*cfbc8dc8SJayanth Othayoth }
71*cfbc8dc8SJayanth Othayoth 
72*cfbc8dc8SJayanth Othayoth void Manager::copy(const std::string& src, const std::string& dst)
73*cfbc8dc8SJayanth Othayoth {
74*cfbc8dc8SJayanth Othayoth     namespace fs = std::experimental::filesystem;
75*cfbc8dc8SJayanth Othayoth 
76*cfbc8dc8SJayanth Othayoth     try
77*cfbc8dc8SJayanth Othayoth     {
78*cfbc8dc8SJayanth Othayoth         auto path = fs::path(dst).parent_path();
79*cfbc8dc8SJayanth Othayoth         // create dst path folder by default
80*cfbc8dc8SJayanth Othayoth         fs::create_directories(path);
81*cfbc8dc8SJayanth Othayoth         fs::copy_file(src, dst, fs::copy_options::overwrite_existing);
82*cfbc8dc8SJayanth Othayoth     }
83*cfbc8dc8SJayanth Othayoth     catch (fs::filesystem_error& e)
84*cfbc8dc8SJayanth Othayoth     {
85*cfbc8dc8SJayanth Othayoth         log<level::ERR>("Failed to copy certificate", entry("ERR=%s", e.what()),
86*cfbc8dc8SJayanth Othayoth                         entry("SRC=%s", src.c_str()),
87*cfbc8dc8SJayanth Othayoth                         entry("DST=%s", dst.c_str()));
88*cfbc8dc8SJayanth Othayoth         elog<InternalFailure>();
89*cfbc8dc8SJayanth Othayoth     }
90*cfbc8dc8SJayanth Othayoth }
91*cfbc8dc8SJayanth Othayoth 
92*cfbc8dc8SJayanth Othayoth } // namespace certs
93*cfbc8dc8SJayanth Othayoth } // namespace phosphor
94