mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-23 21:15:20 +00:00
Secret manipulation remote client
* src/remote_internal.c: Implement client binding for new secrets APIs * src/datatypes.h: Add 'void *secretPrivateData' to virConnectPtr struct
This commit is contained in:
parent
0de63c6745
commit
f68c91faa6
@ -140,6 +140,7 @@ struct _virConnect {
|
|||||||
void * interfacePrivateData;
|
void * interfacePrivateData;
|
||||||
void * storagePrivateData;
|
void * storagePrivateData;
|
||||||
void * devMonPrivateData;
|
void * devMonPrivateData;
|
||||||
|
void * secretPrivateData;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The lock mutex must be acquired before accessing/changing
|
* The lock mutex must be acquired before accessing/changing
|
||||||
|
@ -221,11 +221,13 @@ static virInterfacePtr get_nonnull_interface (virConnectPtr conn, remote_nonnull
|
|||||||
static virStoragePoolPtr get_nonnull_storage_pool (virConnectPtr conn, remote_nonnull_storage_pool pool);
|
static virStoragePoolPtr get_nonnull_storage_pool (virConnectPtr conn, remote_nonnull_storage_pool pool);
|
||||||
static virStorageVolPtr get_nonnull_storage_vol (virConnectPtr conn, remote_nonnull_storage_vol vol);
|
static virStorageVolPtr get_nonnull_storage_vol (virConnectPtr conn, remote_nonnull_storage_vol vol);
|
||||||
static virNodeDevicePtr get_nonnull_node_device (virConnectPtr conn, remote_nonnull_node_device dev);
|
static virNodeDevicePtr get_nonnull_node_device (virConnectPtr conn, remote_nonnull_node_device dev);
|
||||||
|
static virSecretPtr get_nonnull_secret (virConnectPtr conn, remote_nonnull_secret secret);
|
||||||
static void make_nonnull_domain (remote_nonnull_domain *dom_dst, virDomainPtr dom_src);
|
static void make_nonnull_domain (remote_nonnull_domain *dom_dst, virDomainPtr dom_src);
|
||||||
static void make_nonnull_network (remote_nonnull_network *net_dst, virNetworkPtr net_src);
|
static void make_nonnull_network (remote_nonnull_network *net_dst, virNetworkPtr net_src);
|
||||||
static void make_nonnull_interface (remote_nonnull_interface *interface_dst, virInterfacePtr interface_src);
|
static void make_nonnull_interface (remote_nonnull_interface *interface_dst, virInterfacePtr interface_src);
|
||||||
static void make_nonnull_storage_pool (remote_nonnull_storage_pool *pool_dst, virStoragePoolPtr vol_src);
|
static void make_nonnull_storage_pool (remote_nonnull_storage_pool *pool_dst, virStoragePoolPtr vol_src);
|
||||||
static void make_nonnull_storage_vol (remote_nonnull_storage_vol *vol_dst, virStorageVolPtr vol_src);
|
static void make_nonnull_storage_vol (remote_nonnull_storage_vol *vol_dst, virStorageVolPtr vol_src);
|
||||||
|
static void make_nonnull_secret (remote_nonnull_secret *secret_dst, virSecretPtr secret_src);
|
||||||
void remoteDomainEventFired(int watch, int fd, int event, void *data);
|
void remoteDomainEventFired(int watch, int fd, int event, void *data);
|
||||||
static void remoteDomainQueueEvent(virConnectPtr conn, XDR *xdr);
|
static void remoteDomainQueueEvent(virConnectPtr conn, XDR *xdr);
|
||||||
void remoteDomainEventQueueFlush(int timer, void *opaque);
|
void remoteDomainEventQueueFlush(int timer, void *opaque);
|
||||||
@ -6340,6 +6342,303 @@ done:
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static virDrvOpenStatus
|
||||||
|
remoteSecretOpen (virConnectPtr conn,
|
||||||
|
virConnectAuthPtr auth,
|
||||||
|
int flags)
|
||||||
|
{
|
||||||
|
if (inside_daemon)
|
||||||
|
return VIR_DRV_OPEN_DECLINED;
|
||||||
|
|
||||||
|
if (conn &&
|
||||||
|
conn->driver &&
|
||||||
|
STREQ (conn->driver->name, "remote")) {
|
||||||
|
struct private_data *priv;
|
||||||
|
|
||||||
|
/* If we're here, the remote driver is already
|
||||||
|
* in use due to a) a QEMU uri, or b) a remote
|
||||||
|
* URI. So we can re-use existing connection
|
||||||
|
*/
|
||||||
|
priv = conn->privateData;
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
priv->localUses++;
|
||||||
|
conn->secretPrivateData = priv;
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
return VIR_DRV_OPEN_SUCCESS;
|
||||||
|
} else if (conn->networkDriver &&
|
||||||
|
STREQ (conn->networkDriver->name, "remote")) {
|
||||||
|
struct private_data *priv = conn->networkPrivateData;
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
conn->secretPrivateData = priv;
|
||||||
|
priv->localUses++;
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
return VIR_DRV_OPEN_SUCCESS;
|
||||||
|
} else {
|
||||||
|
/* Using a non-remote driver, so we need to open a
|
||||||
|
* new connection for secret APIs, forcing it to
|
||||||
|
* use the UNIX transport.
|
||||||
|
*/
|
||||||
|
struct private_data *priv;
|
||||||
|
int ret;
|
||||||
|
ret = remoteOpenSecondaryDriver(conn,
|
||||||
|
auth,
|
||||||
|
flags,
|
||||||
|
&priv);
|
||||||
|
if (ret == VIR_DRV_OPEN_SUCCESS)
|
||||||
|
conn->secretPrivateData = priv;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteSecretClose (virConnectPtr conn)
|
||||||
|
{
|
||||||
|
int rv = 0;
|
||||||
|
struct private_data *priv = conn->secretPrivateData;
|
||||||
|
|
||||||
|
conn->secretPrivateData = NULL;
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
priv->localUses--;
|
||||||
|
if (!priv->localUses) {
|
||||||
|
rv = doRemoteClose(conn, priv);
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
virMutexDestroy(&priv->lock);
|
||||||
|
VIR_FREE(priv);
|
||||||
|
}
|
||||||
|
if (priv)
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteSecretNumOfSecrets (virConnectPtr conn)
|
||||||
|
{
|
||||||
|
int rv = -1;
|
||||||
|
remote_num_of_secrets_ret ret;
|
||||||
|
struct private_data *priv = conn->secretPrivateData;
|
||||||
|
|
||||||
|
remoteDriverLock (priv);
|
||||||
|
|
||||||
|
memset (&ret, 0, sizeof (ret));
|
||||||
|
if (call (conn, priv, 0, REMOTE_PROC_NUM_OF_SECRETS,
|
||||||
|
(xdrproc_t) xdr_void, (char *) NULL,
|
||||||
|
(xdrproc_t) xdr_remote_num_of_secrets_ret, (char *) &ret) == -1)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
rv = ret.num;
|
||||||
|
|
||||||
|
done:
|
||||||
|
remoteDriverUnlock (priv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteSecretListSecrets (virConnectPtr conn, char **uuids, int maxuuids)
|
||||||
|
{
|
||||||
|
int rv = -1;
|
||||||
|
int i;
|
||||||
|
remote_list_secrets_args args;
|
||||||
|
remote_list_secrets_ret ret;
|
||||||
|
struct private_data *priv = conn->secretPrivateData;
|
||||||
|
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
|
if (maxuuids > REMOTE_SECRET_UUID_LIST_MAX) {
|
||||||
|
errorf (conn, VIR_ERR_RPC, _("too many remote secret UUIDs: %d > %d"),
|
||||||
|
maxuuids, REMOTE_SECRET_UUID_LIST_MAX);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
args.maxuuids = maxuuids;
|
||||||
|
|
||||||
|
memset (&ret, 0, sizeof ret);
|
||||||
|
if (call (conn, priv, 0, REMOTE_PROC_LIST_SECRETS,
|
||||||
|
(xdrproc_t) xdr_remote_list_secrets_args, (char *) &args,
|
||||||
|
(xdrproc_t) xdr_remote_list_secrets_ret, (char *) &ret) == -1)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
if (ret.uuids.uuids_len > maxuuids) {
|
||||||
|
errorf (conn, VIR_ERR_RPC, _("too many remote secret UUIDs: %d > %d"),
|
||||||
|
ret.uuids.uuids_len, maxuuids);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This call is caller-frees. However xdr_free will free up both the
|
||||||
|
* names and the list of pointers, so we have to strdup the
|
||||||
|
* names here.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < ret.uuids.uuids_len; ++i)
|
||||||
|
uuids[i] = strdup (ret.uuids.uuids_val[i]);
|
||||||
|
|
||||||
|
rv = ret.uuids.uuids_len;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
xdr_free ((xdrproc_t) xdr_remote_list_secrets_ret, (char *) &ret);
|
||||||
|
|
||||||
|
done:
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static virSecretPtr
|
||||||
|
remoteSecretLookupByUUIDString (virConnectPtr conn, const char *uuid)
|
||||||
|
{
|
||||||
|
virSecretPtr rv = NULL;
|
||||||
|
remote_secret_lookup_by_uuid_string_args args;
|
||||||
|
remote_secret_lookup_by_uuid_string_ret ret;
|
||||||
|
struct private_data *priv = conn->secretPrivateData;
|
||||||
|
|
||||||
|
remoteDriverLock (priv);
|
||||||
|
|
||||||
|
args.uuid = (char *) uuid;
|
||||||
|
|
||||||
|
memset (&ret, 0, sizeof (ret));
|
||||||
|
if (call (conn, priv, 0, REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING,
|
||||||
|
(xdrproc_t) xdr_remote_secret_lookup_by_uuid_string_args, (char *) &args,
|
||||||
|
(xdrproc_t) xdr_remote_secret_lookup_by_uuid_string_ret, (char *) &ret) == -1)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
rv = get_nonnull_secret (conn, ret.secret);
|
||||||
|
xdr_free ((xdrproc_t) xdr_remote_secret_lookup_by_uuid_string_ret,
|
||||||
|
(char *) &ret);
|
||||||
|
|
||||||
|
done:
|
||||||
|
remoteDriverUnlock (priv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static virSecretPtr
|
||||||
|
remoteSecretDefineXML (virConnectPtr conn, const char *xml, unsigned int flags)
|
||||||
|
{
|
||||||
|
virSecretPtr rv = NULL;
|
||||||
|
remote_secret_define_xml_args args;
|
||||||
|
remote_secret_lookup_by_uuid_string_ret ret;
|
||||||
|
struct private_data *priv = conn->secretPrivateData;
|
||||||
|
|
||||||
|
remoteDriverLock (priv);
|
||||||
|
|
||||||
|
args.xml = (char *) xml;
|
||||||
|
args.flags = flags;
|
||||||
|
|
||||||
|
memset (&ret, 0, sizeof (ret));
|
||||||
|
if (call (conn, priv, 0, REMOTE_PROC_SECRET_DEFINE_XML,
|
||||||
|
(xdrproc_t) xdr_remote_secret_define_xml_args, (char *) &args,
|
||||||
|
(xdrproc_t) xdr_remote_secret_define_xml_ret, (char *) &ret) == -1)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
rv = get_nonnull_secret (conn, ret.secret);
|
||||||
|
xdr_free ((xdrproc_t) xdr_remote_secret_lookup_by_uuid_string_ret,
|
||||||
|
(char *) &ret);
|
||||||
|
|
||||||
|
done:
|
||||||
|
remoteDriverUnlock (priv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
remoteSecretGetXMLDesc (virSecretPtr secret, unsigned int flags)
|
||||||
|
{
|
||||||
|
char *rv = NULL;
|
||||||
|
remote_secret_get_xml_desc_args args;
|
||||||
|
remote_secret_get_xml_desc_ret ret;
|
||||||
|
struct private_data *priv = secret->conn->secretPrivateData;
|
||||||
|
|
||||||
|
remoteDriverLock (priv);
|
||||||
|
|
||||||
|
make_nonnull_secret (&args.secret, secret);
|
||||||
|
args.flags = flags;
|
||||||
|
|
||||||
|
memset (&ret, 0, sizeof (ret));
|
||||||
|
if (call (secret->conn, priv, 0, REMOTE_PROC_SECRET_GET_XML_DESC,
|
||||||
|
(xdrproc_t) xdr_remote_secret_get_xml_desc_args, (char *) &args,
|
||||||
|
(xdrproc_t) xdr_remote_secret_get_xml_desc_ret, (char *) &ret) == -1)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
/* Caller frees. */
|
||||||
|
rv = ret.xml;
|
||||||
|
|
||||||
|
done:
|
||||||
|
remoteDriverUnlock (priv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteSecretSetValue (virSecretPtr secret, const unsigned char *value,
|
||||||
|
size_t value_size, unsigned int flags)
|
||||||
|
{
|
||||||
|
int rv = -1;
|
||||||
|
remote_secret_set_value_args args;
|
||||||
|
struct private_data *priv = secret->conn->secretPrivateData;
|
||||||
|
|
||||||
|
remoteDriverLock (priv);
|
||||||
|
|
||||||
|
make_nonnull_secret (&args.secret, secret);
|
||||||
|
args.value.value_len = value_size;
|
||||||
|
args.value.value_val = (char *) value;
|
||||||
|
args.flags = flags;
|
||||||
|
|
||||||
|
if (call (secret->conn, priv, 0, REMOTE_PROC_SECRET_SET_VALUE,
|
||||||
|
(xdrproc_t) xdr_remote_secret_set_value_args, (char *) &args,
|
||||||
|
(xdrproc_t) xdr_void, (char *) NULL) == -1)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
done:
|
||||||
|
remoteDriverUnlock (priv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned char *
|
||||||
|
remoteSecretGetValue (virSecretPtr secret, size_t *value_size,
|
||||||
|
unsigned int flags)
|
||||||
|
{
|
||||||
|
unsigned char *rv = NULL;
|
||||||
|
remote_secret_get_value_args args;
|
||||||
|
remote_secret_get_value_ret ret;
|
||||||
|
struct private_data *priv = secret->conn->secretPrivateData;
|
||||||
|
|
||||||
|
remoteDriverLock (priv);
|
||||||
|
|
||||||
|
make_nonnull_secret (&args.secret, secret);
|
||||||
|
args.flags = flags;
|
||||||
|
|
||||||
|
memset (&ret, 0, sizeof (ret));
|
||||||
|
if (call (secret->conn, priv, 0, REMOTE_PROC_SECRET_GET_VALUE,
|
||||||
|
(xdrproc_t) xdr_remote_secret_get_value_args, (char *) &args,
|
||||||
|
(xdrproc_t) xdr_remote_secret_get_value_ret, (char *) &ret) == -1)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
*value_size = ret.value.value_len;
|
||||||
|
rv = (unsigned char *) ret.value.value_val; /* Caller frees. */
|
||||||
|
|
||||||
|
done:
|
||||||
|
remoteDriverUnlock (priv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteSecretUndefine (virSecretPtr secret)
|
||||||
|
{
|
||||||
|
int rv = -1;
|
||||||
|
remote_secret_undefine_args args;
|
||||||
|
struct private_data *priv = secret->conn->secretPrivateData;
|
||||||
|
|
||||||
|
remoteDriverLock (priv);
|
||||||
|
|
||||||
|
make_nonnull_secret (&args.secret, secret);
|
||||||
|
|
||||||
|
if (call (secret->conn, priv, 0, REMOTE_PROC_SECRET_UNDEFINE,
|
||||||
|
(xdrproc_t) xdr_remote_secret_undefine_args, (char *) &args,
|
||||||
|
(xdrproc_t) xdr_void, (char *) NULL) == -1)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
done:
|
||||||
|
remoteDriverUnlock (priv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
@ -7436,6 +7735,12 @@ get_nonnull_node_device (virConnectPtr conn, remote_nonnull_node_device dev)
|
|||||||
return virGetNodeDevice(conn, dev.name);
|
return virGetNodeDevice(conn, dev.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static virSecretPtr
|
||||||
|
get_nonnull_secret (virConnectPtr conn, remote_nonnull_secret secret)
|
||||||
|
{
|
||||||
|
return virGetSecret(conn, secret.uuid);
|
||||||
|
}
|
||||||
|
|
||||||
/* Make remote_nonnull_domain and remote_nonnull_network. */
|
/* Make remote_nonnull_domain and remote_nonnull_network. */
|
||||||
static void
|
static void
|
||||||
make_nonnull_domain (remote_nonnull_domain *dom_dst, virDomainPtr dom_src)
|
make_nonnull_domain (remote_nonnull_domain *dom_dst, virDomainPtr dom_src)
|
||||||
@ -7475,6 +7780,12 @@ make_nonnull_storage_vol (remote_nonnull_storage_vol *vol_dst, virStorageVolPtr
|
|||||||
vol_dst->key = vol_src->key;
|
vol_dst->key = vol_src->key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
make_nonnull_secret (remote_nonnull_secret *secret_dst, virSecretPtr secret_src)
|
||||||
|
{
|
||||||
|
secret_dst->uuid = secret_src->uuid;
|
||||||
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
unsigned long remoteVersion(void)
|
unsigned long remoteVersion(void)
|
||||||
@ -7628,6 +7939,20 @@ static virStorageDriver storage_driver = {
|
|||||||
.volGetPath = remoteStorageVolGetPath,
|
.volGetPath = remoteStorageVolGetPath,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static virSecretDriver secret_driver = {
|
||||||
|
.name = "remote",
|
||||||
|
.open = remoteSecretOpen,
|
||||||
|
.close = remoteSecretClose,
|
||||||
|
.numOfSecrets = remoteSecretNumOfSecrets,
|
||||||
|
.listSecrets = remoteSecretListSecrets,
|
||||||
|
.lookupByUUIDString = remoteSecretLookupByUUIDString,
|
||||||
|
.defineXML = remoteSecretDefineXML,
|
||||||
|
.getXMLDesc = remoteSecretGetXMLDesc,
|
||||||
|
.setValue = remoteSecretSetValue,
|
||||||
|
.getValue = remoteSecretGetValue,
|
||||||
|
.undefine = remoteSecretUndefine
|
||||||
|
};
|
||||||
|
|
||||||
static virDeviceMonitor dev_monitor = {
|
static virDeviceMonitor dev_monitor = {
|
||||||
.name = "remote",
|
.name = "remote",
|
||||||
.open = remoteDevMonOpen,
|
.open = remoteDevMonOpen,
|
||||||
@ -7665,6 +7990,7 @@ remoteRegister (void)
|
|||||||
if (virRegisterInterfaceDriver (&interface_driver) == -1) return -1;
|
if (virRegisterInterfaceDriver (&interface_driver) == -1) return -1;
|
||||||
if (virRegisterStorageDriver (&storage_driver) == -1) return -1;
|
if (virRegisterStorageDriver (&storage_driver) == -1) return -1;
|
||||||
if (virRegisterDeviceMonitor (&dev_monitor) == -1) return -1;
|
if (virRegisterDeviceMonitor (&dev_monitor) == -1) return -1;
|
||||||
|
if (virRegisterSecretDriver (&secret_driver) == -1) return -1;
|
||||||
#ifdef WITH_LIBVIRTD
|
#ifdef WITH_LIBVIRTD
|
||||||
if (virRegisterStateDriver (&state_driver) == -1) return -1;
|
if (virRegisterStateDriver (&state_driver) == -1) return -1;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user