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