summaryrefslogtreecommitdiffstats
path: root/log_manager.cpp
diff options
context:
space:
mode:
authorAdriana Kobylak <anoo@us.ibm.com>2016-11-14 14:46:23 -0600
committerPatrick Williams <patrick@stwcx.xyz>2016-12-08 17:48:49 +0000
commit8f7941edf6843109d3da69900976b04b42d78aa4 (patch)
tree6b06f1b525f065772f75a2b0c0aa2d3fe99d36ed /log_manager.cpp
parent88eb10904410567b290242daa338e5e3c13d0502 (diff)
downloadphosphor-logging-8f7941edf6843109d3da69900976b04b42d78aa4.tar.gz
phosphor-logging-8f7941edf6843109d3da69900976b04b42d78aa4.zip
log_manager: Use sdbus++
Change-Id: Id2ad6a75b6ee3f7226c7cfd274dba24de89f9363 Signed-off-by: Adriana Kobylak <anoo@us.ibm.com>
Diffstat (limited to 'log_manager.cpp')
-rw-r--r--log_manager.cpp148
1 files changed, 36 insertions, 112 deletions
diff --git a/log_manager.cpp b/log_manager.cpp
index 21e99a8..a3e49e9 100644
--- a/log_manager.cpp
+++ b/log_manager.cpp
@@ -7,65 +7,38 @@
#include <systemd/sd-bus.h>
#include <systemd/sd-journal.h>
#include "log.hpp"
+#include "log_manager.hpp"
-using namespace phosphor;
+namespace phosphor
+{
+namespace logging
+{
-/*
- * @fn commit()
- * @brief Create an error/event log based on specified id and metadata variable
- * names that includes the journal message and the metadata values.
- */
-auto commit(sd_bus_message *msg, void *userdata, sd_bus_error *error)
+void Manager::commit(uint64_t transactionId, std::string errMsg)
{
// TODO Change /tmp path to a permanent location on flash
constexpr const auto path = "/tmp/elog";
constexpr const auto msgIdStr = "_PID";
- // Read PID
- int rc = -1;
- char *msgId = nullptr;
- rc = sd_bus_message_read(msg, "s", &msgId);
- if (rc < 0)
- {
- logging::log<logging::level::ERR>("Failed to read msg id",
- logging::entry("DESCRIPTION=%s", strerror(-rc)));
- return sd_bus_reply_method_return(msg, "i", rc);
- }
-
// Create log file
std::string filename{};
filename.append(path);
// TODO Create error logs in their own separate dir once permanent location
- // on flash is determined. Ex: ../msgId/1
- filename.append(msgId);
+ // on flash is determined. Ex: ../transactionId/1
std::ofstream efile;
efile.open(filename);
efile << "{" << std::endl;
- // Read metadata variables passed as array of strings and store in vector
- // TODO Read required metadata fields from header file instead
- rc = sd_bus_message_enter_container(msg, SD_BUS_TYPE_ARRAY, "s");
- if (rc < 0)
- {
- logging::log<logging::level::ERR>("Failed to read metadata vars",
- logging::entry("DESCRIPTION=%s", strerror(-rc)));
- return sd_bus_reply_method_return(msg, nullptr);
- }
- const char* metaVar = nullptr;
+ //const char* metaVar = nullptr;
std::vector<const char*> metaList;
- while ((rc = sd_bus_message_read_basic(msg, 's', &metaVar)) > 0)
- {
- metaList.push_back(metaVar);
- }
- sd_bus_message_exit_container(msg);
sd_journal *j = nullptr;
- rc = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY);
+ int rc = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY);
if (rc < 0)
{
logging::log<logging::level::ERR>("Failed to open journal",
logging::entry("DESCRIPTION=%s", strerror(-rc)));
- return sd_bus_reply_method_return(msg, nullptr);
+ return;
}
// Read the journal from the end to get the most recent entry first.
@@ -83,12 +56,16 @@ auto commit(sd_bus_message *msg, void *userdata, sd_bus_error *error)
continue;
}
std::string result(data);
- if (result.find(msgId) == std::string::npos)
+// TODO String msgid is now an int transaction id. This piece will be
+// uncommented and reworked with the upcoming change to read the metadata
+// fields from the header file.
+#if 0
+ if (result.find(msgid) == std::string::npos)
{
// Match not found, continue to next journal entry
continue;
}
-
+#endif
// Match found, write to file
// TODO This is a draft format based on the redfish event logs written
// in json, the final openbmc format is to be determined
@@ -128,87 +105,34 @@ auto commit(sd_bus_message *msg, void *userdata, sd_bus_error *error)
efile << "}" << std::endl;
efile.close();
- return sd_bus_reply_method_return(msg, nullptr);
+ return;
}
-constexpr sdbusplus::vtable::vtable_t log_vtable[] =
+Manager::Manager(sdbusplus::bus::bus &&bus,
+ const char* busname,
+ const char* obj) :
+ details::ServerObject<details::ManagerIface>(bus, obj),
+ _bus(std::move(bus)),
+ _manager(sdbusplus::server::manager::manager(_bus, obj))
{
- sdbusplus::vtable::start(),
- sdbusplus::vtable::method("Commit", "sas", "", commit),
- sdbusplus::vtable::end()
-};
+ _bus.request_name(busname);
+}
-int main(int argc, char *argv[])
+void Manager::run() noexcept
{
- constexpr const auto dbusLogObj = "/xyz/openbmc_project/Logging";
- constexpr const auto dbusLogName = "xyz.openbmc_project.Logging";
- int rc = -1;
- sd_bus *bus = nullptr;
-
- rc = sd_bus_open_system(&bus);
- if (rc < 0)
+ while(true)
{
- logging::log<logging::level::ERR>("Failed to open system bus",
- logging::entry("DESCRIPTION=%s", strerror(-rc)));
- goto cleanup;
- }
-
- rc = sd_bus_add_object_manager(bus, nullptr, dbusLogObj);
- if (rc < 0)
- {
- logging::log<logging::level::ERR>("Failed to add object mgr",
- logging::entry("DESCRIPTION=%s", strerror(-rc)));
- goto cleanup;
- }
-
- rc = sd_bus_add_object_vtable(bus,
- nullptr,
- dbusLogObj,
- dbusLogName,
- log_vtable,
- nullptr);
- if (rc < 0)
- {
- logging::log<logging::level::ERR>("Failed to add vtable",
- logging::entry("DESCRIPTION=%s", strerror(-rc)));
- goto cleanup;
- }
-
- rc = sd_bus_request_name(bus, dbusLogName, 0);
- if (rc < 0)
- {
- logging::log<logging::level::ERR>("Failed to acquire service name",
- logging::entry("DESCRIPTION=%s", strerror(-rc)));
- }
- else
- {
- for(;;)
+ try
{
- rc = sd_bus_process(bus, nullptr);
- if (rc < 0)
- {
- logging::log<logging::level::ERR>("Failed to connect to bus",
- logging::entry("DESCRIPTION=%s", strerror(-rc)));
- break;
- }
- if (rc > 0)
- {
- continue;
- }
-
- rc = sd_bus_wait(bus, (uint64_t) - 1);
- if (rc < 0)
- {
- logging::log<logging::level::ERR>("Failed to wait on bus",
- logging::entry("DESCRIPTION=%s", strerror(-rc)));
- break;
- }
+ _bus.process_discard();
+ _bus.wait();
+ }
+ catch (std::exception &e)
+ {
+ std::cerr << e.what() << std::endl;
}
}
-
-cleanup:
- sd_bus_unref(bus);
-
- return rc;
}
+} // namespace logging
+} // namepsace phosphor
OpenPOWER on IntegriCloud