return 0;
}
+static int
+remoteRelaySecretEventValueChanged(virConnectPtr conn,
+ virSecretPtr secret,
+ void *opaque)
+{
+ daemonClientEventCallbackPtr callback = opaque;
+ remote_secret_event_value_changed_msg data;
+
+ if (callback->callbackID < 0 ||
+ !remoteRelaySecretEventCheckACL(callback->client, conn, secret))
+ return -1;
+
+ VIR_DEBUG("Relaying node secret value changed callback %d",
+ callback->callbackID);
+
+ /* build return data */
+ memset(&data, 0, sizeof(data));
+ make_nonnull_secret(&data.secret, secret);
+ data.callbackID = callback->callbackID;
+
+ remoteDispatchObjectEventSend(callback->client, remoteProgram,
+ REMOTE_PROC_SECRET_EVENT_VALUE_CHANGED,
+ (xdrproc_t)xdr_remote_secret_event_value_changed_msg,
+ &data);
+
+ return 0;
+}
+
static virConnectSecretEventGenericCallback secretEventCallbacks[] = {
VIR_SECRET_EVENT_CALLBACK(remoteRelaySecretEventLifecycle),
+ VIR_SECRET_EVENT_CALLBACK(remoteRelaySecretEventValueChanged),
};
verify(ARRAY_CARDINALITY(secretEventCallbacks) == VIR_SECRET_EVENT_ID_LAST);
}
+static int
+mySecretEventValueChanged(virConnectPtr conn ATTRIBUTE_UNUSED,
+ virSecretPtr secret,
+ void *opaque ATTRIBUTE_UNUSED)
+{
+ char uuid[VIR_UUID_STRING_BUFLEN];
+ virSecretGetUUIDString(secret, uuid);
+ printf("%s EVENT: Secret %s\n", __func__, uuid);
+ return 0;
+}
+
+
static void
eventTypedParamsPrint(virTypedParameterPtr params,
int nparams)
struct secretEventData secretEvents[] = {
SECRET_EVENT(VIR_SECRET_EVENT_ID_LIFECYCLE, mySecretEventCallback),
+ SECRET_EVENT(VIR_SECRET_EVENT_ID_VALUE_CHANGED, mySecretEventValueChanged),
};
/* make sure that the events are kept in sync */
*/
typedef enum {
VIR_SECRET_EVENT_ID_LIFECYCLE = 0, /* virConnectSecretEventLifecycleCallback */
+ VIR_SECRET_EVENT_ID_VALUE_CHANGED = 1, /* virConnectSecretEventGenericCallback */
# ifdef VIR_ENUM_SENTINELS
VIR_SECRET_EVENT_ID_LAST
typedef struct _virSecretEventLifecycle virSecretEventLifecycle;
typedef virSecretEventLifecycle *virSecretEventLifecyclePtr;
+struct _virSecretEventValueChanged {
+ virSecretEvent parent;
+ bool dummy;
+};
+typedef struct _virSecretEventValueChanged virSecretEventValueChanged;
+typedef virSecretEventValueChanged *virSecretEventValueChangedPtr;
+
static virClassPtr virSecretEventClass;
static virClassPtr virSecretEventLifecycleClass;
+static virClassPtr virSecretEventValueChangedClass;
static void virSecretEventDispose(void *obj);
static void virSecretEventLifecycleDispose(void *obj);
+static void virSecretEventValueChangedDispose(void *obj);
static int
virSecretEventsOnceInit(void)
sizeof(virSecretEventLifecycle),
virSecretEventLifecycleDispose)))
return -1;
+ if (!(virSecretEventValueChangedClass =
+ virClassNew(virSecretEventClass,
+ "virSecretEventValueChanged",
+ sizeof(virSecretEventValueChanged),
+ virSecretEventValueChangedDispose)))
+ return -1;
return 0;
}
}
+static void
+virSecretEventValueChangedDispose(void *obj)
+{
+ virSecretEventValueChangedPtr event = obj;
+ VIR_DEBUG("obj=%p", event);
+}
+
+
static void
virSecretEventDispatchDefaultFunc(virConnectPtr conn,
virObjectEventPtr event,
goto cleanup;
}
+ case VIR_SECRET_EVENT_ID_VALUE_CHANGED:
+ {
+ ((virConnectSecretEventGenericCallback)cb)(conn, secret,
+ cbopaque);
+ goto cleanup;
+ }
+
case VIR_SECRET_EVENT_ID_LAST:
break;
}
return (virObjectEventPtr)event;
}
+
+
+/**
+ * virSecretEventValueChangedNew:
+ * @uuid: UUID of the secret object the event describes
+ *
+ * Create a new secret lifecycle event.
+ */
+virObjectEventPtr
+virSecretEventValueChangedNew(const unsigned char *uuid,
+ int usage_type,
+ const char *usage_id)
+{
+ virSecretEventValueChangedPtr event;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+
+ if (virSecretEventsInitialize() < 0)
+ return NULL;
+
+ virUUIDFormat(uuid, uuidstr);
+ VIR_DEBUG("Event %s %d %s", uuidstr, usage_type, usage_id);
+ if (!(event = virObjectEventNew(virSecretEventValueChangedClass,
+ virSecretEventDispatchDefaultFunc,
+ VIR_SECRET_EVENT_ID_VALUE_CHANGED,
+ usage_type, usage_id, uuid, uuidstr)))
+ return NULL;
+
+ return (virObjectEventPtr)event;
+}
const char *usage_id,
int type,
int detail);
+virObjectEventPtr
+virSecretEventValueChangedNew(const unsigned char *uuid,
+ int usage_type,
+ const char *usage_id);
#endif
# conf/secret_event.h
virSecretEventLifecycleNew;
virSecretEventStateRegisterID;
+virSecretEventValueChangedNew;
# conf/snapshot_conf.h
virNetClientPtr client ATTRIBUTE_UNUSED,
void *evdata, void *opaque);
+static void
+remoteSecretBuildEventValueChanged(virNetClientProgramPtr prog ATTRIBUTE_UNUSED,
+ virNetClientPtr client ATTRIBUTE_UNUSED,
+ void *evdata, void *opaque);
+
static void
remoteConnectNotifyEventConnectionClosed(virNetClientProgramPtr prog ATTRIBUTE_UNUSED,
virNetClientPtr client ATTRIBUTE_UNUSED,
remoteSecretBuildEventLifecycle,
sizeof(remote_secret_event_lifecycle_msg),
(xdrproc_t)xdr_remote_secret_event_lifecycle_msg },
+ { REMOTE_PROC_SECRET_EVENT_VALUE_CHANGED,
+ remoteSecretBuildEventValueChanged,
+ sizeof(remote_secret_event_value_changed_msg),
+ (xdrproc_t)xdr_remote_secret_event_value_changed_msg },
};
static void
remoteEventQueue(priv, event, msg->callbackID);
}
+static void
+remoteSecretBuildEventValueChanged(virNetClientProgramPtr prog ATTRIBUTE_UNUSED,
+ virNetClientPtr client ATTRIBUTE_UNUSED,
+ void *evdata, void *opaque)
+{
+ virConnectPtr conn = opaque;
+ struct private_data *priv = conn->privateData;
+ remote_secret_event_value_changed_msg *msg = evdata;
+ virSecretPtr secret;
+ virObjectEventPtr event = NULL;
+
+ secret = get_nonnull_secret(conn, msg->secret);
+ if (!secret)
+ return;
+
+ event = virSecretEventValueChangedNew(secret->uuid, secret->usageType, secret->usageID);
+ virObjectUnref(secret);
+
+ remoteEventQueue(priv, event, msg->callbackID);
+}
+
static void
remoteDomainBuildQemuMonitorEvent(virNetClientProgramPtr prog ATTRIBUTE_UNUSED,
virNetClientPtr client ATTRIBUTE_UNUSED,
int detail;
};
+struct remote_secret_event_value_changed_msg {
+ int callbackID;
+ remote_nonnull_secret secret;
+};
+
/*----- Protocol. -----*/
/* Define the program number, protocol version and procedure numbers here. */
* @generate: both
* @acl: none
*/
- REMOTE_PROC_SECRET_EVENT_LIFECYCLE = 382
+ REMOTE_PROC_SECRET_EVENT_LIFECYCLE = 382,
+
+ /**
+ * @generate: both
+ * @acl: none
+ */
+ REMOTE_PROC_SECRET_EVENT_VALUE_CHANGED = 383
};
int ret = -1;
virSecretObjPtr secret;
virSecretDefPtr def;
+ virObjectEventPtr event = NULL;
virCheckFlags(0, -1);
if (virSecretObjSetValue(secret, value, value_size) < 0)
goto cleanup;
+ event = virSecretEventValueChangedNew(def->uuid,
+ def->usage_type,
+ def->usage_id);
ret = 0;
cleanup:
virSecretObjEndAPI(&secret);
+ if (event)
+ virObjectEventStateQueue(driver->secretEventState, event);
return ret;
}
vshEventDone(data->ctl);
}
+static void
+vshEventGenericPrint(virConnectPtr conn ATTRIBUTE_UNUSED,
+ virSecretPtr secret,
+ void *opaque)
+{
+ virshSecretEventData *data = opaque;
+ char uuid[VIR_UUID_STRING_BUFLEN];
+
+ if (!data->loop && data->count)
+ return;
+
+ virSecretGetUUIDString(secret, uuid);
+
+ if (data->timestamp) {
+ char timestamp[VIR_TIME_STRING_BUFLEN];
+
+ if (virTimeStringNowRaw(timestamp) < 0)
+ timestamp[0] = '\0';
+
+ vshPrint(data->ctl, _("%s: event '%s' for secret %s\n"),
+ timestamp,
+ data->cb->name,
+ uuid);
+ } else {
+ vshPrint(data->ctl, _("event '%s' for secret %s\n"),
+ data->cb->name,
+ uuid);
+ }
+
+ data->count++;
+ if (!data->loop)
+ vshEventDone(data->ctl);
+}
+
static vshEventCallback vshEventCallbacks[] = {
{ "lifecycle",
VIR_SECRET_EVENT_CALLBACK(vshEventLifecyclePrint), },
+ { "value-changed", vshEventGenericPrint, },
};
static const vshCmdInfo info_secret_event[] = {