summaryrefslogtreecommitdiff
path: root/src/settings/nm-agent-manager.c
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2015-08-21 12:51:20 +0200
committerThomas Haller <thaller@redhat.com>2015-08-25 16:37:44 +0200
commit214faf4695563d5d601653251ae5f95c0220105c (patch)
tree5aa29f9e37ca46b71d5e61868de69559c6d48385 /src/settings/nm-agent-manager.c
parent0b3e0215386adc54cc79920bc71bf5a0b65069c4 (diff)
downloadNetworkManager-214faf4695563d5d601653251ae5f95c0220105c.tar.gz
agent-manager: refactor logging in agent-manager
Diffstat (limited to 'src/settings/nm-agent-manager.c')
-rw-r--r--src/settings/nm-agent-manager.c226
1 files changed, 144 insertions, 82 deletions
diff --git a/src/settings/nm-agent-manager.c b/src/settings/nm-agent-manager.c
index baacc30a6d..3ed2e57916 100644
--- a/src/settings/nm-agent-manager.c
+++ b/src/settings/nm-agent-manager.c
@@ -40,6 +40,42 @@
#include "nmdbus-agent-manager.h"
+NM_DEFINE_SINGLETON_INSTANCE (NMAgentManager);
+
+#define _NMLOG_PREFIX_NAME "agent-manager"
+#define _NMLOG_DOMAIN LOGD_AGENTS
+#define _NMLOG(level, agent, ...) \
+ G_STMT_START { \
+ if (nm_logging_enabled ((level), (_NMLOG_DOMAIN))) { \
+ char __prefix1[32]; \
+ char __prefix2[128]; \
+ NMSecretAgent *__agent = (agent); \
+ \
+ if (!(self)) \
+ g_snprintf (__prefix1, sizeof (__prefix1), "%s%s", ""_NMLOG_PREFIX_NAME"", "[]"); \
+ else if ((self) != singleton_instance) \
+ g_snprintf (__prefix1, sizeof (__prefix1), "%s[%p]", ""_NMLOG_PREFIX_NAME"", (self)); \
+ else \
+ g_strlcpy (__prefix1, _NMLOG_PREFIX_NAME, sizeof (__prefix1)); \
+ if (__agent) { \
+ g_snprintf (__prefix2, sizeof (__prefix2), \
+ ": req[%p, %s]", \
+ __agent, \
+ nm_secret_agent_get_description (__agent)); \
+ } else \
+ __prefix2[0] = '\0'; \
+ _nm_log ((level), (_NMLOG_DOMAIN), 0, \
+ "%s%s: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__), \
+ __prefix1, __prefix2 _NM_UTILS_MACRO_REST(__VA_ARGS__)); \
+ } \
+ } G_STMT_END
+
+#define LOG_REQ_FMT "[%p/%s%s%s]"
+#define LOG_REQ_ARG(req) (req), NM_PRINT_FMT_QUOTE_STRING ((req)->detail)
+
+#define LOG_REQ2_FMT "[%p/%s%s%s/%s%s%s]"
+#define LOG_REQ2_ARG(req) (req), NM_PRINT_FMT_QUOTE_STRING ((req)->parent.detail), NM_PRINT_FMT_QUOTE_STRING ((req)->setting_name)
+
G_DEFINE_TYPE (NMAgentManager, nm_agent_manager, NM_TYPE_EXPORTED_OBJECT)
#define NM_AGENT_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
@@ -94,8 +130,7 @@ remove_agent (NMAgentManager *self, const char *owner)
if (!agent)
return FALSE;
- nm_log_dbg (LOGD_AGENTS, "(%s) agent unregistered or disappeared",
- nm_secret_agent_get_description (agent));
+ _LOGD (agent, "agent unregistered or disappeared");
/* Remove this agent from any in-progress secrets requests */
g_hash_table_iter_init (&iter, priv->requests);
@@ -221,8 +256,7 @@ agent_register_permissions_done (NMAuthChain *chain,
sender = nm_secret_agent_get_dbus_owner (agent);
g_hash_table_insert (priv->agents, g_strdup (sender), agent);
- nm_log_dbg (LOGD_AGENTS, "(%s) agent registered",
- nm_secret_agent_get_description (agent));
+ _LOGD (agent, "agent registered");
g_dbus_method_invocation_return_value (context, NULL);
/* Signal an agent was registered */
@@ -308,8 +342,7 @@ impl_agent_manager_register_with_capabilities (NMAgentManager *self,
g_signal_connect (agent, NM_SECRET_AGENT_DISCONNECTED,
G_CALLBACK (agent_disconnected_cb), self);
- nm_log_dbg (LOGD_AGENTS, "(%s) requesting permissions",
- nm_secret_agent_get_description (agent));
+ _LOGD (agent, "requesting permissions");
/* Kick off permissions requests for this agent */
chain = nm_auth_chain_new_subject (subject, context, agent_register_permissions_done, self);
@@ -388,6 +421,8 @@ typedef void (*RequestCancelFunc) (Request *req);
/* Basic secrets request structure */
struct _Request {
+ NMAgentManager *self;
+
guint32 reqid;
char *detail;
char *verb;
@@ -417,6 +452,7 @@ static guint32 next_req_id = 1;
static Request *
request_new (gsize struct_size,
+ NMAgentManager *self,
const char *detail,
const char *verb,
NMAuthSubject *subject,
@@ -430,6 +466,7 @@ request_new (gsize struct_size,
Request *req;
req = g_malloc0 (struct_size);
+ req->self = g_object_ref (self);
req->reqid = next_req_id++;
req->detail = g_strdup (detail);
req->verb = g_strdup (verb);
@@ -460,6 +497,9 @@ request_free (Request *req)
g_free (req->detail);
g_free (req->verb);
g_slist_free_full (req->pending, g_object_unref);
+
+ g_object_unref (req->self);
+
memset (req, 0, sizeof (Request));
g_free (req);
}
@@ -525,9 +565,13 @@ agent_compare_func (gconstpointer aa, gconstpointer bb, gpointer user_data)
static void
request_add_agent (Request *req, NMSecretAgent *agent)
{
+ NMAgentManager *self;
+
g_return_if_fail (req != NULL);
g_return_if_fail (agent != NULL);
+ self = req->self;
+
if (req->add_agent_callback && !req->add_agent_callback (req, agent))
return;
@@ -538,18 +582,16 @@ request_add_agent (Request *req, NMSecretAgent *agent)
agent_uid = nm_secret_agent_get_owner_uid (agent);
subject_uid = nm_auth_subject_get_unix_process_uid (req->subject);
if (agent_uid != subject_uid) {
- nm_log_dbg (LOGD_AGENTS, "(%s) agent ignored for secrets request %p/%s "
- "(uid %ld not required %ld)",
- nm_secret_agent_get_description (agent),
- req, req->detail,
- (long)agent_uid, (long)subject_uid);
+ _LOGD (agent, "agent ignored for secrets request "LOG_REQ_FMT" "
+ "(uid %ld not required %ld)",
+ LOG_REQ_ARG (req),
+ (long) agent_uid, (long) subject_uid);
return;
}
}
- nm_log_dbg (LOGD_AGENTS, "(%s) agent allowed for secrets request %p/%s",
- nm_secret_agent_get_description (agent),
- req, req->detail);
+ _LOGD (agent, "agent allowed for secrets request "LOG_REQ_FMT,
+ LOG_REQ_ARG (req));
/* Add this agent to the list, sorted appropriately */
req->pending = g_slist_insert_sorted_with_data (req->pending,
@@ -573,8 +615,11 @@ request_add_agents (NMAgentManager *self, Request *req)
static void
request_next_agent (Request *req)
{
+ NMAgentManager *self;
GError *error = NULL;
+ self = req->self;
+
if (req->current) {
if (req->current_call_id)
nm_secret_agent_cancel_secrets (req->current, req->current_call_id);
@@ -587,9 +632,8 @@ request_next_agent (Request *req)
req->current = req->pending->data;
req->pending = g_slist_remove (req->pending, req->current);
- nm_log_dbg (LOGD_AGENTS, "(%s) agent %s secrets for request %p/%s",
- nm_secret_agent_get_description (req->current),
- req->verb, req, req->detail);
+ _LOGD (req->current, "agent %s secrets for request "LOG_REQ_FMT,
+ req->verb, LOG_REQ_ARG (req));
req->next_callback (req);
} else {
@@ -605,18 +649,22 @@ request_next_agent (Request *req)
static void
request_remove_agent (Request *req, NMSecretAgent *agent, GSList **pending_reqs)
{
+ NMAgentManager *self;
+
g_return_if_fail (req != NULL);
g_return_if_fail (agent != NULL);
+ self = req->self;
+
req->pending = g_slist_remove (req->pending, agent);
if (agent == req->current) {
- nm_log_dbg (LOGD_AGENTS, "(%s) current agent removed from secrets request %p/%s",
- nm_secret_agent_get_description (agent), req, req->detail);
+ _LOGD (agent, "current agent removed from secrets request "LOG_REQ_FMT,
+ LOG_REQ_ARG (req));
*pending_reqs = g_slist_prepend (*pending_reqs, req);
} else {
- nm_log_dbg (LOGD_AGENTS, "(%s) agent removed from secrets request %p/%s",
- nm_secret_agent_get_description (agent), req, req->detail);
+ _LOGD (agent, "agent removed from secrets request "LOG_REQ_FMT,
+ LOG_REQ_ARG (req));
}
}
@@ -673,16 +721,18 @@ connection_request_free (gpointer data)
static gboolean
connection_request_add_agent (Request *parent, NMSecretAgent *agent)
{
+ NMAgentManager *self;
ConnectionRequest *req = (ConnectionRequest *) parent;
NMAuthSubject *subject = nm_secret_agent_get_subject(agent);
+ self = parent->self;
+
/* Ensure the caller's username exists in the connection's permissions,
* or that the permissions is empty (ie, visible by everyone).
*/
if (!nm_auth_is_subject_in_acl (req->connection, subject, NULL)) {
- nm_log_dbg (LOGD_AGENTS, "(%s) agent ignored for secrets request %p/%s (not in ACL)",
- nm_secret_agent_get_description (agent),
- parent, parent->detail);
+ _LOGD (agent, "agent ignored for secrets request "LOG_REQ_FMT" (not in ACL)",
+ LOG_REQ_ARG (parent));
/* Connection not visible to this agent's user */
return FALSE;
}
@@ -691,7 +741,8 @@ connection_request_add_agent (Request *parent, NMSecretAgent *agent)
}
static ConnectionRequest *
-connection_request_new_get (NMConnection *connection,
+connection_request_new_get (NMAgentManager *self,
+ NMConnection *connection,
NMAuthSubject *subject,
GVariant *existing_secrets,
const char *setting_name,
@@ -710,6 +761,7 @@ connection_request_new_get (NMConnection *connection,
ConnectionRequest *req;
req = (ConnectionRequest *) request_new (sizeof (ConnectionRequest),
+ self,
nm_connection_get_id (connection),
verb,
subject,
@@ -735,7 +787,8 @@ connection_request_new_get (NMConnection *connection,
}
static ConnectionRequest *
-connection_request_new_other (NMConnection *connection,
+connection_request_new_other (NMAgentManager *self,
+ NMConnection *connection,
NMAuthSubject *subject,
const char *verb,
RequestCompleteFunc complete_callback,
@@ -745,6 +798,7 @@ connection_request_new_other (NMConnection *connection,
ConnectionRequest *req;
req = (ConnectionRequest *) request_new (sizeof (ConnectionRequest),
+ self,
nm_connection_get_id (connection),
verb,
subject,
@@ -766,6 +820,7 @@ get_done_cb (NMSecretAgent *agent,
GError *error,
gpointer user_data)
{
+ NMAgentManager *self;
Request *parent = user_data;
ConnectionRequest *req = user_data;
GVariant *setting_secrets;
@@ -776,20 +831,20 @@ get_done_cb (NMSecretAgent *agent,
g_return_if_fail (call_id == parent->current_call_id);
g_return_if_fail (agent == parent->current);
+ self = parent->self;
+
parent->current_call_id = NULL;
if (error) {
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
- nm_log_dbg (LOGD_AGENTS, "(%s) get secrets request cancelled: %p/%s/%s",
- nm_secret_agent_get_description (agent),
- req, parent->detail, req->setting_name);
+ _LOGD (agent, "get secrets request cancelled: "LOG_REQ2_FMT,
+ LOG_REQ2_ARG (req));
return;
}
- nm_log_dbg (LOGD_AGENTS, "(%s) agent failed secrets request %p/%s/%s: %s",
- nm_secret_agent_get_description (agent),
- req, parent->detail, req->setting_name,
- error->message);
+ _LOGD (agent, "agent failed secrets request "LOG_REQ2_FMT": %s",
+ LOG_REQ2_ARG (req),
+ error->message);
if (g_error_matches (error, NM_SECRET_AGENT_ERROR, NM_SECRET_AGENT_ERROR_USER_CANCELED)) {
error = g_error_new_literal (NM_AGENT_MANAGER_ERROR,
@@ -808,17 +863,15 @@ get_done_cb (NMSecretAgent *agent,
/* Ensure the setting we wanted secrets for got returned and has something in it */
setting_secrets = g_variant_lookup_value (secrets, req->setting_name, NM_VARIANT_TYPE_SETTING);
if (!setting_secrets || !g_variant_n_children (setting_secrets)) {
- nm_log_dbg (LOGD_AGENTS, "(%s) agent returned no secrets for request %p/%s/%s",
- nm_secret_agent_get_description (agent),
- req, parent->detail, req->setting_name);
+ _LOGD (agent, "agent returned no secrets for request "LOG_REQ2_FMT,
+ LOG_REQ2_ARG (req));
/* Try the next agent */
request_next_agent (parent);
return;
}
- nm_log_dbg (LOGD_AGENTS, "(%s) agent returned secrets for request %p/%s/%s",
- nm_secret_agent_get_description (agent),
- req, parent->detail, req->setting_name);
+ _LOGD (agent, "agent returned secrets for request "LOG_REQ2_FMT,
+ LOG_REQ2_ARG (req));
/* Get the agent's username */
pw = getpwuid (nm_secret_agent_get_owner_uid (agent));
@@ -914,17 +967,19 @@ get_agent_modify_auth_cb (NMAuthChain *chain,
GDBusMethodInvocation *context,
gpointer user_data)
{
+ NMAgentManager *self;
Request *parent = user_data;
ConnectionRequest *req = user_data;
const char *perm;
+ self = parent->self;
+
req->chain = NULL;
if (error) {
- nm_log_dbg (LOGD_AGENTS, "(%s) agent %p/%s/%s MODIFY check error: (%d) %s",
- nm_secret_agent_get_description (parent->current),
- req, parent->detail, req->setting_name,
- error->code, error->message ? error->message : "(unknown)");
+ _LOGD (parent->current, "agent "LOG_REQ2_FMT" MODIFY check error: (%d) %s",
+ LOG_REQ2_ARG (req),
+ error->code, error->message ? error->message : "(unknown)");
/* Try the next agent */
request_next_agent (parent);
} else {
@@ -937,10 +992,9 @@ get_agent_modify_auth_cb (NMAuthChain *chain,
if (nm_auth_chain_get_result (chain, perm) == NM_AUTH_CALL_RESULT_YES)
req->current_has_modify = TRUE;
- nm_log_dbg (LOGD_AGENTS, "(%s) agent %p/%s/%s MODIFY check result %s",
- nm_secret_agent_get_description (parent->current),
- req, parent->detail, req->setting_name,
- req->current_has_modify ? "YES" : "NO");
+ _LOGD (parent->current, "agent "LOG_REQ2_FMT" MODIFY check result %s",
+ LOG_REQ2_ARG (req),
+ req->current_has_modify ? "YES" : "NO");
get_agent_request_secrets (req, req->current_has_modify);
}
@@ -994,10 +1048,13 @@ has_system_secrets (NMConnection *connection)
static void
get_next_cb (Request *parent)
{
+ NMAgentManager *self;
ConnectionRequest *req = (ConnectionRequest *) parent;
NMSettingConnection *s_con;
const char *agent_dbus_owner, *perm;
+ self = parent->self;
+
req->current_has_modify = FALSE;
agent_dbus_owner = nm_secret_agent_get_dbus_owner (parent->current);
@@ -1010,8 +1067,8 @@ get_next_cb (Request *parent)
*/
if ( (req->flags != NM_SECRET_AGENT_GET_SECRETS_FLAG_NONE)
&& (req->existing_secrets || has_system_secrets (req->connection))) {
- nm_log_dbg (LOGD_AGENTS, "(%p/%s/%s) request has system secrets; checking agent %s for MODIFY",
- req, parent->detail, req->setting_name, agent_dbus_owner);
+ _LOGD (NULL, "("LOG_REQ2_FMT") request has system secrets; checking agent %s for MODIFY",
+ LOG_REQ2_ARG (req), agent_dbus_owner);
req->chain = nm_auth_chain_new_subject (nm_secret_agent_get_subject (parent->current),
NULL,
@@ -1033,8 +1090,8 @@ get_next_cb (Request *parent)
nm_auth_chain_add_call (req->chain, perm, TRUE);
} else {
- nm_log_dbg (LOGD_AGENTS, "(%p/%s/%s) requesting user-owned secrets from agent %s",
- req, parent->detail, req->setting_name, agent_dbus_owner);
+ _LOGD (NULL, "("LOG_REQ2_FMT") requesting user-owned secrets from agent %s",
+ LOG_REQ2_ARG (req), agent_dbus_owner);
get_agent_request_secrets (req, FALSE);
}
@@ -1043,10 +1100,13 @@ get_next_cb (Request *parent)
static gboolean
get_start (gpointer user_data)
{
+ NMAgentManager *self;
Request *parent = user_data;
ConnectionRequest *req = user_data;
GVariant *setting_secrets = NULL;
+ self = parent->self;
+
parent->idle_id = 0;
/* Check if there are any existing secrets */
@@ -1073,14 +1133,14 @@ get_start (gpointer user_data)
/* Do we have everything we need? */
if ( (req->flags & NM_SECRET_AGENT_GET_SECRETS_FLAG_ONLY_SYSTEM)
|| ((nm_connection_need_secrets (tmp, NULL) == NULL) && (new_secrets == FALSE))) {
- nm_log_dbg (LOGD_AGENTS, "(%p/%s/%s) system settings secrets sufficient",
- req, parent->detail, req->setting_name);
+ _LOGD (NULL, "("LOG_REQ2_FMT") system settings secrets sufficient",
+ LOG_REQ2_ARG (req));
/* Got everything, we're done */
req_complete_success (parent, req->existing_secrets, NULL, NULL);
} else {
- nm_log_dbg (LOGD_AGENTS, "(%p/%s/%s) system settings secrets insufficient, asking agents",
- req, parent->detail, req->setting_name);
+ _LOGD (NULL, "("LOG_REQ2_FMT") system settings secrets insufficient, asking agents",
+ LOG_REQ2_ARG (req));
/* We don't, so ask some agents for additional secrets */
if ( req->flags & NM_SECRET_AGENT_GET_SECRETS_FLAG_NO_ERRORS
@@ -1179,7 +1239,8 @@ nm_agent_manager_get_secrets (NMAgentManager *self,
* both returning NULL if they didn't hash anything.
*/
- req = connection_request_new_get (connection,
+ req = connection_request_new_get (self,
+ connection,
subject,
existing_secrets,
setting_name,
@@ -1224,36 +1285,35 @@ save_done_cb (NMSecretAgent *agent,
GError *error,
gpointer user_data)
{
- Request *parent = user_data;
+ NMAgentManager *self;
ConnectionRequest *req = user_data;
+ Request *parent = (Request *) req;
const char *agent_dbus_owner;
g_return_if_fail (call_id == parent->current_call_id);
g_return_if_fail (agent == parent->current);
+ self = parent->self;
+
parent->current_call_id = NULL;
if (error) {
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
- nm_log_dbg (LOGD_AGENTS, "(%s) save secrets request cancelled: %p/%s",
- nm_secret_agent_get_description (agent),
- req, parent->detail);
+ _LOGD (agent, "save secrets request cancelled: "LOG_REQ_FMT,
+ LOG_REQ_ARG (parent));
return;
}
- nm_log_dbg (LOGD_AGENTS, "(%s) agent failed save secrets request %p/%s: %s",
- nm_secret_agent_get_description (agent),
- req, parent->detail,
- error->message);
+ _LOGD (agent, "agent failed save secrets request "LOG_REQ_FMT": %s",
+ LOG_REQ_ARG (parent), error->message);
/* Try the next agent */
request_next_agent (parent);
maybe_remove_agent_on_error (agent, error);
return;
}
- nm_log_dbg (LOGD_AGENTS, "(%s) agent saved secrets for request %p/%s",
- nm_secret_agent_get_description (agent),
- req, parent->detail);
+ _LOGD (agent, "agent saved secrets for request "LOG_REQ_FMT,
+ LOG_REQ_ARG (parent));
agent_dbus_owner = nm_secret_agent_get_dbus_owner (agent);
req_complete_success (parent, NULL, NULL, agent_dbus_owner);
@@ -1303,7 +1363,8 @@ nm_agent_manager_save_secrets (NMAgentManager *self,
nm_connection_get_path (connection),
nm_connection_get_id (connection));
- req = connection_request_new_other (connection,
+ req = connection_request_new_other (self,
+ connection,
subject,
"saving",
save_complete_cb,
@@ -1327,26 +1388,28 @@ delete_done_cb (NMSecretAgent *agent,
GError *error,
gpointer user_data)
{
+ NMAgentManager *self;
Request *req = user_data;
g_return_if_fail (call_id == req->current_call_id);
g_return_if_fail (agent == req->current);
+ self = req->self;
+
req->current_call_id = NULL;
if (error) {
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
- nm_log_dbg (LOGD_AGENTS, "(%s) delete secrets request cancelled: %p/%s",
- nm_secret_agent_get_description (agent), req, req->detail);
+ _LOGD (agent, "delete secrets request cancelled: "LOG_REQ_FMT,
+ LOG_REQ_ARG (req));
return;
}
- nm_log_dbg (LOGD_AGENTS, "(%s) agent failed delete secrets request %p/%s: %s",
- nm_secret_agent_get_description (agent), req, req->detail,
- error->message);
+ _LOGD (agent, "agent failed delete secrets request "LOG_REQ_FMT": %s",
+ LOG_REQ_ARG (req), error->message);
} else {
- nm_log_dbg (LOGD_AGENTS, "(%s) agent deleted secrets for request %p/%s",
- nm_secret_agent_get_description (agent), req, req->detail);
+ _LOGD (agent, "agent deleted secrets for request "LOG_REQ_FMT,
+ LOG_REQ_ARG (req));
}
/* Tell the next agent to delete secrets */
@@ -1400,7 +1463,8 @@ nm_agent_manager_delete_secrets (NMAgentManager *self,
nm_connection_get_id (connection));
subject = nm_auth_subject_new_internal ();
- req = connection_request_new_other (connection,
+ req = connection_request_new_other (self,
+ connection,
subject,
"deleting",
delete_complete_cb,
@@ -1478,12 +1542,10 @@ agent_permissions_changed_done (NMAuthChain *chain,
agent = nm_auth_chain_get_data (chain, "agent");
g_assert (agent);
- if (error) {
- nm_log_dbg (LOGD_AGENTS, "(%s) failed to request updated agent permissions",
- nm_secret_agent_get_description (agent));
- } else {
- nm_log_dbg (LOGD_AGENTS, "(%s) updated agent permissions",
- nm_secret_agent_get_description (agent));
+ if (error)
+ _LOGD (agent, "failed to request updated agent permissions");
+ else {
+ _LOGD (agent, "updated agent permissions");
if (nm_auth_chain_get_result (chain, NM_AUTH_PERMISSION_WIFI_SHARE_PROTECTED) == NM_AUTH_CALL_RESULT_YES)
share_protected = TRUE;