From 9258008d008832aa01018caecb832df6390d5481 Mon Sep 17 00:00:00 2001 From: Artiom Divak Date: Wed, 14 Jun 2023 10:55:26 +0300 Subject: [PATCH] Set Log Level For Node And Agent The APIs of the node and the agent are connected. The API of Agent is internal. So if the user wants to change the log level for the agent he needs to use the public API of the node Signed-off-by: Artiom Divak --- data/org.containers.hirte.Node.xml | 4 +- data/org.containers.hirte.internal.Agent.xml | 4 +- src/agent/agent.c | 22 +++++++++++ src/libhirte/common/cfg.c | 2 +- src/manager/node.c | 39 +++++++++++++++++++- 5 files changed, 67 insertions(+), 4 deletions(-) diff --git a/data/org.containers.hirte.Node.xml b/data/org.containers.hirte.Node.xml index f239625e90..c4372a05ff 100644 --- a/data/org.containers.hirte.Node.xml +++ b/data/org.containers.hirte.Node.xml @@ -58,7 +58,9 @@ - + + + diff --git a/data/org.containers.hirte.internal.Agent.xml b/data/org.containers.hirte.internal.Agent.xml index 89df62e8a1..9f951c19aa 100644 --- a/data/org.containers.hirte.internal.Agent.xml +++ b/data/org.containers.hirte.internal.Agent.xml @@ -72,7 +72,9 @@ - + + + diff --git a/src/agent/agent.c b/src/agent/agent.c index 0d1063ff4e..25e8e236f7 100644 --- a/src/agent/agent.c +++ b/src/agent/agent.c @@ -1333,6 +1333,27 @@ static int agent_method_disable_metrics(sd_bus_message *m, void *userdata, UNUSE return sd_bus_reply_method_return(m, ""); } +/************************************************************************* + ************** org.containers.hirte.Agent.SetNodeLogLevel *************** + ************************************************************************/ + +static int agent_method_set_log_level( + UNUSED sd_bus_message *m, UNUSED void *userdata, UNUSED sd_bus_error *ret_error) { + const char *level = NULL; + int r = sd_bus_message_read(m, "s", &level); + if (r < 0) { + return sd_bus_reply_method_errorf( + m, SD_BUS_ERROR_FAILED, "Failed to read the parameter: %s", strerror(-r)); + } + LogLevel loglevel = string_to_log_level(level); + if (loglevel == LOG_LEVEL_INVALID) { + return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_FAILED, "Invalid input for log level"); + } + hirte_log_set_level(loglevel); + hirte_log_infof("Log level changed to %s", level); + return r; +} + static const sd_bus_vtable internal_agent_vtable[] = { SD_BUS_VTABLE_START(0), @@ -1348,6 +1369,7 @@ static const sd_bus_vtable internal_agent_vtable[] = { SD_BUS_METHOD("Unsubscribe", "s", "", agent_method_unsubscribe, 0), SD_BUS_METHOD("EnableMetrics", "", "", agent_method_enable_metrics, 0), SD_BUS_METHOD("DisableMetrics", "", "", agent_method_disable_metrics, 0), + SD_BUS_METHOD("SetLogLevel", "s", "", agent_method_set_log_level, 0), SD_BUS_SIGNAL_WITH_NAMES("JobDone", "us", SD_BUS_PARAM(id) SD_BUS_PARAM(result), 0), SD_BUS_SIGNAL_WITH_NAMES("JobStateChanged", "us", SD_BUS_PARAM(id) SD_BUS_PARAM(state), 0), SD_BUS_SIGNAL_WITH_NAMES( diff --git a/src/libhirte/common/cfg.c b/src/libhirte/common/cfg.c index b26786712c..6d3b66270b 100644 --- a/src/libhirte/common/cfg.c +++ b/src/libhirte/common/cfg.c @@ -337,4 +337,4 @@ const char *cfg_dump(struct config *config) { } } return cfg_info; -} \ No newline at end of file +} diff --git a/src/manager/node.c b/src/manager/node.c index 181df41bf5..8fcc00de0e 100644 --- a/src/manager/node.c +++ b/src/manager/node.c @@ -28,6 +28,7 @@ static int node_method_stop_unit(sd_bus_message *m, void *userdata, UNUSED sd_bu static int node_method_restart_unit(sd_bus_message *m, void *userdata, UNUSED sd_bus_error *ret_error); static int node_method_reload_unit(sd_bus_message *m, void *userdata, UNUSED sd_bus_error *ret_error); static int node_method_passthrough_to_agent(sd_bus_message *m, void *userdata, UNUSED sd_bus_error *ret_error); +static int node_method_set_log_level(sd_bus_message *m, void *userdata, UNUSED sd_bus_error *ret_error); static int node_property_get_nodename( sd_bus *bus, const char *path, @@ -61,7 +62,7 @@ static const sd_bus_vtable node_vtable[] = { SD_BUS_METHOD("SetUnitProperties", "sba(sv)", "", node_method_set_unit_properties, 0), SD_BUS_METHOD("EnableUnitFiles", "asbb", "ba(sss)", node_method_passthrough_to_agent, 0), SD_BUS_METHOD("DisableUnitFiles", "asb", "a(sss)", node_method_passthrough_to_agent, 0), - SD_BUS_METHOD("Reload", "", "", node_method_passthrough_to_agent, 0), + SD_BUS_METHOD("SetNodeLogLevel", "s", "", node_method_set_log_level, 0), SD_BUS_PROPERTY("Name", "s", node_property_get_nodename, 0, SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("Status", "s", node_property_get_status, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), SD_BUS_VTABLE_END @@ -1511,6 +1512,42 @@ static int node_method_reload_unit(sd_bus_message *m, void *userdata, UNUSED sd_ return node_run_unit_lifecycle_method(m, (Node *) userdata, "reload", "ReloadUnit"); } +/************************************************************************* + ********** org.containers.hirte.Node.SetLogLevel ******************* + ************************************************************************/ + +static int node_method_set_log_level(sd_bus_message *m, UNUSED void *userdata, UNUSED sd_bus_error *ret_error) { + const char *level = NULL; + Node *node = (Node *) userdata; + sd_bus_error error = SD_BUS_ERROR_NULL; + _cleanup_sd_bus_message_ sd_bus_message *sub_m = NULL; + + int r = sd_bus_message_read(m, "s", &level); + if (r < 0) { + return r; + } + LogLevel loglevel = string_to_log_level(level); + if (loglevel == LOG_LEVEL_INVALID) { + return r; + } + r = sd_bus_call_method( + node->agent_bus, + HIRTE_AGENT_DBUS_NAME, + INTERNAL_AGENT_OBJECT_PATH, + INTERNAL_AGENT_INTERFACE, + "SetLogLevel", + &error, + &sub_m, + "s", + level); + if (r < 0) { + hirte_log_errorf("Failed to set log level call: %s", error.message); + sd_bus_error_free(&error); + return false; + } + return 1; +} + static int send_agent_simple_message(Node *node, const char *method, const char *arg) { _cleanup_sd_bus_message_ sd_bus_message *m = NULL; int r = sd_bus_message_new_method_call(