#include "memory.h"
#include "util.h"
#include "stream.h"
+#include "uuid.h"
+#include "virtaudit.h"
#include "libvirt/libvirt-qemu.h"
#define VIR_FROM_THIS VIR_FROM_REMOTE
void *ret ATTRIBUTE_UNUSED)
{
virDomainPtr dom;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+ int r;
dom = get_nonnull_domain (conn, args->dom);
if (dom == NULL) {
return -1;
}
- if (virDomainCreate (dom) == -1) {
+ r = virDomainCreate(dom);
+
+ virUUIDFormat(dom->uuid, uuidstr);
+ VIR_AUDIT(VIR_AUDIT_RECORD_MACHINE_CONTROL, r != -1,
+ "op=start name=%s uuid=%s", dom->name, uuidstr);
+
+ if (r == -1) {
virDomainFree(dom);
remoteDispatchConnError(rerr, conn);
return -1;
}
+
virDomainFree(dom);
return 0;
}
remote_domain_create_with_flags_ret *ret)
{
virDomainPtr dom;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+ int r;
dom = get_nonnull_domain (conn, args->dom);
if (dom == NULL) {
return -1;
}
- if (virDomainCreateWithFlags (dom, args->flags) == -1) {
+ r = virDomainCreateWithFlags(dom, args->flags);
+
+ virUUIDFormat(dom->uuid, uuidstr);
+ VIR_AUDIT(VIR_AUDIT_RECORD_MACHINE_CONTROL, r != -1,
+ "op=%s name=%s uuid=%s",
+ (args->flags & VIR_DOMAIN_START_PAUSED) !=
+ 0 ? "start-paused" : "start", dom->name, uuidstr);
+
+ if (r == -1) {
virDomainFree(dom);
remoteDispatchConnError(rerr, conn);
return -1;
remote_domain_create_xml_ret *ret)
{
virDomainPtr dom;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
dom = virDomainCreateXML (conn, args->xml_desc, args->flags);
if (dom == NULL) {
+ VIR_AUDIT(VIR_AUDIT_RECORD_MACHINE_CONTROL, 0,
+ "op=start name=? uuid=?");
remoteDispatchConnError(rerr, conn);
return -1;
}
+ virUUIDFormat(dom->uuid, uuidstr);
+ VIR_AUDIT(VIR_AUDIT_RECORD_MACHINE_CONTROL, 1, "op=start name=%s uuid=%s",
+ dom->name, uuidstr);
+
make_nonnull_domain (&ret->dom, dom);
virDomainFree(dom);
void *ret ATTRIBUTE_UNUSED)
{
virDomainPtr dom;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+ int r;
dom = get_nonnull_domain (conn, args->dom);
if (dom == NULL) {
return -1;
}
- if (virDomainDestroy (dom) == -1) {
+ r = virDomainDestroy(dom);
+
+ virUUIDFormat(dom->uuid, uuidstr);
+ VIR_AUDIT(VIR_AUDIT_RECORD_MACHINE_CONTROL, r != -1,
+ "op=stop name=%s uuid=%s", dom->name, uuidstr);
+
+ if (r == -1) {
virDomainFree(dom);
remoteDispatchConnError(rerr, conn);
return -1;
r = virDomainMigratePrepare (conn, &cookie, &cookielen,
uri_in, uri_out,
args->flags, dname, args->resource);
+ /* This creates a VM, but we don't audit it until the migration succeeds
+ and the VM actually starts. */
if (r == -1) {
VIR_FREE(uri_out);
remoteDispatchConnError(rerr, conn);
{
int r;
virDomainPtr dom;
- char *dname;
+ char *dname, uuidstr[VIR_UUID_STRING_BUFLEN];
dom = get_nonnull_domain (conn, args->dom);
if (dom == NULL) {
args->cookie.cookie_len,
args->uri,
args->flags, dname, args->resource);
+
+ virUUIDFormat(dom->uuid, uuidstr);
+ VIR_AUDIT(VIR_AUDIT_RECORD_MACHINE_CONTROL, r != -1,
+ "op=migrate-out name=%s uuid=%s", dom->name, uuidstr);
+
virDomainFree (dom);
if (r == -1) {
remoteDispatchConnError(rerr, conn);
remote_domain_migrate_finish_ret *ret)
{
virDomainPtr ddom;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
CHECK_CONN (client);
+ /* Note that we are not able to audit "op=migrate-in" here if
+ VIR_DRV_FEATURE_MIGRATION_DIRECT is used. */
ddom = virDomainMigrateFinish (conn, args->dname,
args->cookie.cookie_val,
args->cookie.cookie_len,
args->uri,
args->flags);
if (ddom == NULL) {
+ VIR_AUDIT(VIR_AUDIT_RECORD_MACHINE_CONTROL, 0,
+ "op=migrate-in name=%s uuid=?", args->dname);
remoteDispatchConnError(rerr, conn);
return -1;
}
+ virUUIDFormat(ddom->uuid, uuidstr);
+ VIR_AUDIT(VIR_AUDIT_RECORD_MACHINE_CONTROL, 1,
+ "op=migrate-in name=%s uuid=%s", ddom->name, uuidstr);
+
make_nonnull_domain (&ret->ddom, ddom);
virDomainFree (ddom);
return 0;
uri_in, uri_out,
args->flags, dname, args->resource,
args->dom_xml);
+ /* This creates a VM, but we don't audit it until the migration succeeds
+ and the VM actually starts. */
if (r == -1) {
remoteDispatchConnError(rerr, conn);
return -1;
remote_domain_migrate_finish2_ret *ret)
{
virDomainPtr ddom;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
CHECK_CONN (client);
+ /* Note that we are not able to audit "op=migrate-in" here if
+ VIR_DRV_FEATURE_MIGRATION_DIRECT is used. */
ddom = virDomainMigrateFinish2 (conn, args->dname,
args->cookie.cookie_val,
args->cookie.cookie_len,
args->flags,
args->retcode);
if (ddom == NULL) {
+ VIR_AUDIT(VIR_AUDIT_RECORD_MACHINE_CONTROL, 0,
+ "op=migrate-in name=%s uuid=?", args->dname);
remoteDispatchConnError(rerr, conn);
return -1;
}
+ virUUIDFormat(ddom->uuid, uuidstr);
+ VIR_AUDIT(VIR_AUDIT_RECORD_MACHINE_CONTROL, 1,
+ "op=migrate-in name=%s uuid=%s", ddom->name, uuidstr);
+
make_nonnull_domain (&ret->ddom, ddom);
virDomainFree (ddom);
r = virDomainMigratePrepareTunnel(conn, stream->st,
args->flags, dname, args->resource,
args->dom_xml);
+ /* This creates a VM, but we don't audit it until the migration succeeds
+ and the VM actually starts. */
if (r == -1) {
remoteFreeClientStream(client, stream);
remoteDispatchConnError(rerr, conn);
void *ret ATTRIBUTE_UNUSED)
{
virDomainPtr dom;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+ int r;
dom = get_nonnull_domain (conn, args->dom);
if (dom == NULL) {
remote_domain_restore_args *args,
void *ret ATTRIBUTE_UNUSED)
{
+ int r;
+
+ r = virDomainRestore(conn, args->from);
+
+ /* We don't have enough information! */
+ VIR_AUDIT(VIR_AUDIT_RECORD_MACHINE_CONTROL, r != -1,
+ "op=start name=? uuid=? file=%s", args->from);
- if (virDomainRestore (conn, args->from) == -1) {
+ if (r == -1) {
remoteDispatchConnError(rerr, conn);
return -1;
}
return -1;
}
- if (virDomainResume (dom) == -1) {
+ r = virDomainResume(dom);
+
+ virUUIDFormat(dom->uuid, uuidstr);
+ VIR_AUDIT(VIR_AUDIT_RECORD_MACHINE_CONTROL, 1,
+ "op=resume name=%s uuid=%s", dom->name, uuidstr);
+
+ if (r == -1) {
virDomainFree(dom);
remoteDispatchConnError(rerr, conn);
return -1;
void *ret ATTRIBUTE_UNUSED)
{
virDomainPtr dom;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+ int r;
dom = get_nonnull_domain (conn, args->dom);
if (dom == NULL) {
return -1;
}
- if (virDomainSave (dom, args->to) == -1) {
+ r = virDomainSave(dom, args->to);
+
+ virUUIDFormat(dom->uuid, uuidstr);
+ VIR_AUDIT(VIR_AUDIT_RECORD_MACHINE_CONTROL, r != -1,
+ "op=stop name=%s uuid=%s", dom->name, uuidstr);
+
+ if (r == -1) {
virDomainFree(dom);
remoteDispatchConnError(rerr, conn);
return -1;
void *ret ATTRIBUTE_UNUSED)
{
virDomainPtr dom;
+ int r;
dom = get_nonnull_domain (conn, args->dom);
if (dom == NULL) {
return -1;
}
- if (virDomainCoreDump (dom, args->to, args->flags) == -1) {
+ r = virDomainCoreDump(dom, args->to, args->flags);
+
+ if ((args->flags & VIR_DUMP_CRASH) != 0) {
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+
+ virUUIDFormat(dom->uuid, uuidstr);
+ VIR_AUDIT(VIR_AUDIT_RECORD_MACHINE_CONTROL, r != -1,
+ "op=stop name=%s uuid=%s", dom->name, uuidstr);
+ }
+
+ if (r == -1) {
virDomainFree(dom);
remoteDispatchConnError(rerr, conn);
return -1;
void *ret ATTRIBUTE_UNUSED)
{
virDomainPtr dom;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+ int r;
dom = get_nonnull_domain (conn, args->dom);
if (dom == NULL) {
return -1;
}
- if (virDomainSuspend (dom) == -1) {
+ r = virDomainSuspend(dom);
+
+ virUUIDFormat(dom->uuid, uuidstr);
+ VIR_AUDIT(VIR_AUDIT_RECORD_MACHINE_CONTROL, 1,
+ "op=suspend name=%s uuid=%s", dom->name, uuidstr);
+
+ if (r == -1) {
virDomainFree(dom);
remoteDispatchConnError(rerr, conn);
return -1;
void *ret ATTRIBUTE_UNUSED)
{
virDomainPtr dom;
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+ int r;
dom = get_nonnull_domain (conn, args->dom);
if (dom == NULL) {
return -1;
}
- if (virDomainManagedSave (dom, args->flags) == -1) {
+ r = virDomainManagedSave(dom, args->flags);
+
+ virUUIDFormat(dom->uuid, uuidstr);
+ VIR_AUDIT(VIR_AUDIT_RECORD_MACHINE_CONTROL, r != -1,
+ "op=stop name=%s uuid=%s", dom->name, uuidstr);
+
+ if (r == -1) {
virDomainFree(dom);
remoteDispatchConnError(rerr, conn);
return -1;