This should be applied to libvirt-0.4.0. It is a bit old one, sorry, but
this patch is just hooking around. So I think I can merge it to latest
libvirt with a little effort.
Please note that uid is essential for access control and the uid is
available only in a local machine. For this reason, our access control
takes effect only in a local machine by virsh. This means that
remotely connecting to libvirtd is currently out of scope.
diff -r d5dbadfb6161 -r 62d2ebb8d23b configure
--- a/configure Wed Apr 02 13:13:06 2008 +0900
+++ b/configure Tue Jan 27 03:13:46 2009 +0900
@@ -35181,7 +35181,12 @@
sysconfdir='/etc'
fi
-
+# Check whether --with-rbac was given.
+if test "${with_rbac+set}" = set; then
+ withval=$with_rbac;
+else
+ with_rbac=no
+fi
# Check whether --with-xen was given.
if test "${with_xen+set}" = set; then
@@ -39753,6 +39758,9 @@
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
DEFS=-DHAVE_CONFIG_H
+if test "$with_rbac" = "yes" ; then
+ DEFS="$DEFS -DRBAC"
+fi
ac_libobjs=
ac_ltlibobjs=
@@ -41743,6 +41751,9 @@
{ echo "$as_me:$LINENO: polkit: no" >&5
echo "$as_me: polkit: no" >&6;}
fi
+{ echo "$as_me:$LINENO: RBAC: $with_rbac" >&5
+echo "$as_me: RBAC: $with_rbac" >&6;}
+
{ echo "$as_me:$LINENO: " >&5
echo "$as_me: " >&6;}
{ echo "$as_me:$LINENO: Miscellaneous" >&5
diff -r d5dbadfb6161 -r 62d2ebb8d23b include/libvirt/libvirt.h
--- a/include/libvirt/libvirt.h Wed Apr 02 13:13:06 2008 +0900
+++ b/include/libvirt/libvirt.h Tue Jan 27 03:13:46 2009 +0900
@@ -514,6 +514,11 @@
char * virDomainGetXMLDesc (virDomainPtr domain,
int flags);
+#ifdef RBAC
+char * virDomainGetXMLDesc_XRBAC (int op_id,
+ virDomainPtr domain,
+ int flags);
+#endif
int virDomainBlockStats (virDomainPtr dom,
const char *path,
virDomainBlockStatsPtr stats,
@@ -697,6 +702,11 @@
char **const names,
int maxnames);
+#ifdef RBAC
+int virConnectListNetworks_QEMUD (virConnectPtr conn,
+ char **const names,
+ int maxnames);
+#endif
/*
* List inactive networks
*/
@@ -705,6 +715,11 @@
char **const names,
int maxnames);
+#ifdef RBAC
+int virConnectListDefinedNetworks_QEMUD (virConnectPtr conn,
+ char **const names,
+ int maxnames);
+#endif
/*
* Lookup network by name or uuid
*/
@@ -721,26 +736,43 @@
virNetworkPtr virNetworkCreateXML (virConnectPtr conn,
const char *xmlDesc);
+#ifdef RBAC
+virNetworkPtr virNetworkCreateXML_QEMUD (virConnectPtr conn,
+ const char *xmlDesc);
+#endif
/*
* Define inactive persistent network
*/
virNetworkPtr virNetworkDefineXML (virConnectPtr conn,
const char *xmlDesc);
+#ifdef RBAC
+virNetworkPtr virNetworkDefineXML_QEMUD (virConnectPtr conn,
+ const char *xml);
+#endif
/*
* Delete persistent network
*/
int virNetworkUndefine (virNetworkPtr network);
+#ifdef RBAC
+int virNetworkUndefine_QEMUD (virNetworkPtr network);
+#endif
/*
* Activate persistent network
*/
int virNetworkCreate (virNetworkPtr network);
+#ifdef RBAC
+int virNetworkCreate_QEMUD (virNetworkPtr network);
+#endif
/*
* Network destroy/free
*/
int virNetworkDestroy (virNetworkPtr network);
+#ifdef RBAC
+int virNetworkDestroy_QEMUD (virNetworkPtr network);
+#endif
int virNetworkFree (virNetworkPtr network);
/*
@@ -753,12 +785,20 @@
char *buf);
char * virNetworkGetXMLDesc (virNetworkPtr network,
int flags);
+#ifdef RBAC
+char * virNetworkGetXMLDesc_QEMUD (virNetworkPtr network,
+ int flags);
+#endif
char * virNetworkGetBridgeName (virNetworkPtr network);
int virNetworkGetAutostart (virNetworkPtr network,
int *autostart);
int virNetworkSetAutostart (virNetworkPtr network,
int autostart);
+#ifdef RBAC
+int virNetworkSetAutostart_QEMUD (virNetworkPtr network,
+ int autostart);
+#endif
#ifdef __cplusplus
}
diff -r d5dbadfb6161 -r 62d2ebb8d23b include/libvirt/libvirt.h.in
--- a/include/libvirt/libvirt.h.in Wed Apr 02 13:13:06 2008 +0900
+++ b/include/libvirt/libvirt.h.in Tue Jan 27 03:13:46 2009 +0900
@@ -514,6 +514,11 @@
char * virDomainGetXMLDesc (virDomainPtr domain,
int flags);
+#ifdef RBAC
+char * virDomainGetXMLDesc_XRBAC (int op_id,
+ virDomainPtr domain,
+ int flags);
+#endif
int virDomainBlockStats (virDomainPtr dom,
const char *path,
virDomainBlockStatsPtr stats,
@@ -697,6 +702,11 @@
char **const names,
int maxnames);
+#ifdef RBAC
+int virConnectListNetworks_QEMUD (virConnectPtr conn,
+ char **const names,
+ int maxnames);
+#endif
/*
* List inactive networks
*/
@@ -705,6 +715,11 @@
char **const names,
int maxnames);
+#ifdef RBAC
+int virConnectListDefinedNetworks_QEMUD (virConnectPtr conn,
+ char **const names,
+ int maxnames);
+#endif
/*
* Lookup network by name or uuid
*/
@@ -721,26 +736,43 @@
virNetworkPtr virNetworkCreateXML (virConnectPtr conn,
const char *xmlDesc);
+#ifdef RBAC
+virNetworkPtr virNetworkCreateXML_QEMUD (virConnectPtr conn,
+ const char *xmlDesc);
+#endif
/*
* Define inactive persistent network
*/
virNetworkPtr virNetworkDefineXML (virConnectPtr conn,
const char *xmlDesc);
+#ifdef RBAC
+virNetworkPtr virNetworkDefineXML_QEMUD (virConnectPtr conn,
+ const char *xml);
+#endif
/*
* Delete persistent network
*/
int virNetworkUndefine (virNetworkPtr network);
+#ifdef RBAC
+int virNetworkUndefine_QEMUD (virNetworkPtr network);
+#endif
/*
* Activate persistent network
*/
int virNetworkCreate (virNetworkPtr network);
+#ifdef RBAC
+int virNetworkCreate_QEMUD (virNetworkPtr network);
+#endif
/*
* Network destroy/free
*/
int virNetworkDestroy (virNetworkPtr network);
+#ifdef RBAC
+int virNetworkDestroy_QEMUD (virNetworkPtr network);
+#endif
int virNetworkFree (virNetworkPtr network);
/*
@@ -753,12 +785,20 @@
char *buf);
char * virNetworkGetXMLDesc (virNetworkPtr network,
int flags);
+#ifdef RBAC
+char * virNetworkGetXMLDesc_QEMUD (virNetworkPtr network,
+ int flags);
+#endif
char * virNetworkGetBridgeName (virNetworkPtr network);
int virNetworkGetAutostart (virNetworkPtr network,
int *autostart);
int virNetworkSetAutostart (virNetworkPtr network,
int autostart);
+#ifdef RBAC
+int virNetworkSetAutostart_QEMUD (virNetworkPtr network,
+ int autostart);
+#endif
#ifdef __cplusplus
}
diff -r d5dbadfb6161 -r 62d2ebb8d23b include/libvirt/virterror.h
--- a/include/libvirt/virterror.h Wed Apr 02 13:13:06 2008 +0900
+++ b/include/libvirt/virterror.h Tue Jan 27 03:13:46 2009 +0900
@@ -54,6 +54,9 @@
VIR_FROM_OPENVZ, /* Error from OpenVZ driver */
VIR_FROM_XENXM, /* Error at Xen XM layer */
VIR_FROM_STATS_LINUX, /* Error in the Linux Stats code */
+#ifdef RBAC
+ VIR_FROM_XENRBAC, /* Error form Xen RBAC */
+#endif
} virErrorDomain;
@@ -132,6 +135,9 @@
VIR_ERR_NO_NETWORK, /* network not found */
VIR_ERR_INVALID_MAC, /* invalid MAC adress */
VIR_ERR_AUTH_FAILED, /* authentication failed */
+#ifdef RBAC
+ VIR_ERR_PERMISSION, /* operation not permitted */
+#endif
} virErrorNumber;
/**
diff -r d5dbadfb6161 -r 62d2ebb8d23b libvirt.pc
--- a/libvirt.pc Wed Apr 02 13:13:06 2008 +0900
+++ b/libvirt.pc Tue Jan 27 03:13:46 2009 +0900
@@ -1,4 +1,4 @@
-prefix=/usr
+prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
diff -r d5dbadfb6161 -r 62d2ebb8d23b libvirt.spec
--- a/libvirt.spec Wed Apr 02 13:13:06 2008 +0900
+++ b/libvirt.spec Tue Jan 27 03:13:46 2009 +0900
@@ -1,17 +1,14 @@
# -*- rpm-spec -*-
-%if "%{fedora}" >= "8"
-%define with_polkit 1
-%define with_proxy no
-%else
+# For Xen RBAC 20080910
%define with_polkit 0
%define with_proxy yes
-%endif
+%define with_rbac yes
Summary: Library providing a simple API virtualization
Name: libvirt
Version: 0.4.0
-Release: 1
+Release: 1%{?dist}
License: LGPL
Group: Development/Libraries
Source: libvirt-%{version}.tar.gz
@@ -35,6 +32,7 @@
Requires: PolicyKit >= 0.6
%endif
BuildRequires: xen-devel
+BuildRequires: libxenrbac >= 2.0.0
BuildRequires: libxml2-devel
BuildRequires: readline-devel
BuildRequires: ncurses-devel
@@ -85,7 +83,8 @@
%configure --with-init-script=redhat \
--with-qemud-pid-file=%{_localstatedir}/run/libvirt_qemud.pid \
--with-remote-file=%{_localstatedir}/run/libvirtd.pid \
- --with-xen-proxy=%{with_proxy}
+ --with-xen-proxy=%{with_proxy} \
+ --with-rbac=%{with_rbac}
make
%install
diff -r d5dbadfb6161 -r 62d2ebb8d23b libvirt.spec.in
--- a/libvirt.spec.in Wed Apr 02 13:13:06 2008 +0900
+++ b/libvirt.spec.in Tue Jan 27 03:13:46 2009 +0900
@@ -1,17 +1,14 @@
# -*- rpm-spec -*-
-%if "%{fedora}" >= "8"
-%define with_polkit 1
-%define with_proxy no
-%else
+# For Xen RBAC 20080910
%define with_polkit 0
%define with_proxy yes
-%endif
+%define with_rbac yes
Summary: Library providing a simple API virtualization
Name: libvirt
Version: @VERSION@
-Release: 1
+Release: 1%{?dist}
License: LGPL
Group: Development/Libraries
Source: libvirt-%{version}.tar.gz
@@ -35,6 +32,7 @@
Requires: PolicyKit >= 0.6
%endif
BuildRequires: xen-devel
+BuildRequires: libxenrbac >= 2.0.0
BuildRequires: libxml2-devel
BuildRequires: readline-devel
BuildRequires: ncurses-devel
@@ -85,7 +83,8 @@
%configure --with-init-script=redhat \
--with-qemud-pid-file=%{_localstatedir}/run/libvirt_qemud.pid \
--with-remote-file=%{_localstatedir}/run/libvirtd.pid \
- --with-xen-proxy=%{with_proxy}
+ --with-xen-proxy=%{with_proxy} \
+ --with-rbac=%{with_rbac}
make
%install
diff -r d5dbadfb6161 -r 62d2ebb8d23b proxy/libvirt_proxy.c
--- a/proxy/libvirt_proxy.c Wed Apr 02 13:13:06 2008 +0900
+++ b/proxy/libvirt_proxy.c Tue Jan 27 03:13:46 2009 +0900
@@ -363,6 +363,9 @@
virProxyPacketPtr req = (virProxyPacketPtr) &request;
int ret;
char *xml, *ostype;
+#ifdef RBAC
+ char *sched_type;
+#endif /* RBAC */
retry:
ret = read(pollInfos[nr].fd, req, sizeof(virProxyPacket));
@@ -662,6 +665,28 @@
free(ostype);
}
break;
+#ifdef RBAC
+ case VIR_PROXY_GET_SCHEDTYPE:
+ if (req->len != sizeof(virProxyPacket))
+ goto comm_error;
+ sched_type = xenHypervisorGetSchedType(conn, &request.extra.arg[0]);
+ if (!sched_type) {
+ req->data.arg = -1;
+ req->len = sizeof (virProxyPacket);
+ } else {
+ int type_len = strlen(sched_type);
+ if (type_len > (int) sizeof (request.extra.str)) {
+ req->data.arg = -2;
+ req->len = sizeof (virProxyPacket);
+ } else {
+ req->data.arg = 0;
+ memmove (&request.extra.str[4], sched_type, type_len);
+ req->len = sizeof (virProxyPacket) + sizeof(int) + type_len;
+ }
+ free (sched_type);
+ }
+ break;
+#endif /* RBAC */
default:
goto comm_error;
}
diff -r d5dbadfb6161 -r 62d2ebb8d23b qemud/qemud.c
--- a/qemud/qemud.c Wed Apr 02 13:13:06 2008 +0900
+++ b/qemud/qemud.c Tue Jan 27 03:13:46 2009 +0900
@@ -73,7 +73,11 @@
static char *tcp_port = (char *) LIBVIRTD_TCP_PORT;
static gid_t unix_sock_gid = 0; /* Only root by default */
+#ifdef RBAC
+static int unix_sock_rw_mask = 0777; /* Allow world */
+#else
static int unix_sock_rw_mask = 0700; /* Allow user only */
+#endif
static int unix_sock_ro_mask = 0777; /* Allow world */
#if HAVE_POLKIT
diff -r d5dbadfb6161 -r 62d2ebb8d23b qemud/remote.c
--- a/qemud/remote.c Wed Apr 02 13:13:06 2008 +0900
+++ b/qemud/remote.c Tue Jan 27 03:13:46 2009 +0900
@@ -1705,9 +1705,15 @@
/* Allocate return buffer. */
ret->names.names_val = calloc (args->maxnames, sizeof
(*(ret->names.names_val)));
+#ifdef RBAC
+ ret->names.names_len =
+ virConnectListDefinedNetworks_QEMUD (client->conn,
+ ret->names.names_val,
args->maxnames);
+#else
ret->names.names_len =
virConnectListDefinedNetworks (client->conn,
ret->names.names_val, args->maxnames);
+#endif
if (ret->names.names_len == -1) return -1;
return 0;
@@ -1756,9 +1762,15 @@
/* Allocate return buffer. */
ret->names.names_val = calloc (args->maxnames, sizeof
(*(ret->names.names_val)));
+#ifdef RBAC
+ ret->names.names_len =
+ virConnectListNetworks_QEMUD (client->conn,
+ ret->names.names_val, args->maxnames);
+#else
ret->names.names_len =
virConnectListNetworks (client->conn,
ret->names.names_val, args->maxnames);
+#endif
if (ret->names.names_len == -1) return -1;
return 0;
@@ -1780,10 +1792,17 @@
return -2;
}
+#ifdef RBAC
+ if (virNetworkCreate_QEMUD (net) == -1) {
+ virNetworkFree(net);
+ return -1;
+ }
+#else
if (virNetworkCreate (net) == -1) {
virNetworkFree(net);
return -1;
}
+#endif
virNetworkFree(net);
return 0;
}
@@ -1798,7 +1817,11 @@
virNetworkPtr net;
CHECK_CONN(client);
+#ifdef RBAC
+ net = virNetworkCreateXML_QEMUD (client->conn, args->xml);
+#else
net = virNetworkCreateXML (client->conn, args->xml);
+#endif
if (net == NULL) return -1;
make_nonnull_network (&ret->net, net);
@@ -1816,7 +1839,11 @@
virNetworkPtr net;
CHECK_CONN(client);
+#ifdef RBAC
+ net = virNetworkDefineXML_QEMUD (client->conn, args->xml);
+#else
net = virNetworkDefineXML (client->conn, args->xml);
+#endif
if (net == NULL) return -1;
make_nonnull_network (&ret->net, net);
@@ -1840,10 +1867,17 @@
return -2;
}
+#ifdef RBAC
+ if (virNetworkDestroy_QEMUD (net) == -1) {
+ virNetworkFree(net);
+ return -1;
+ }
+#else
if (virNetworkDestroy (net) == -1) {
virNetworkFree(net);
return -1;
}
+#endif
virNetworkFree(net);
return 0;
}
@@ -1865,7 +1899,11 @@
}
/* remoteDispatchClientRequest will free this. */
+#ifdef RBAC
+ ret->xml = virNetworkGetXMLDesc_QEMUD (net, args->flags);
+#else
ret->xml = virNetworkGetXMLDesc (net, args->flags);
+#endif
if (!ret->xml) {
virNetworkFree(net);
return -1;
@@ -1976,10 +2014,17 @@
return -2;
}
+#ifdef RBAC
+ if (virNetworkSetAutostart_QEMUD (net, args->autostart) == -1) {
+ virNetworkFree(net);
+ return -1;
+ }
+#else
if (virNetworkSetAutostart (net, args->autostart) == -1) {
virNetworkFree(net);
return -1;
}
+#endif
virNetworkFree(net);
return 0;
}
@@ -2000,10 +2045,17 @@
return -2;
}
+#ifdef RBAC
+ if (virNetworkUndefine_QEMUD (net) == -1) {
+ virNetworkFree(net);
+ return -1;
+ }
+#else
if (virNetworkUndefine (net) == -1) {
virNetworkFree(net);
return -1;
}
+#endif
virNetworkFree(net);
return 0;
}
diff -r d5dbadfb6161 -r 62d2ebb8d23b src/Makefile.in
--- a/src/Makefile.in Wed Apr 02 13:13:06 2008 +0900
+++ b/src/Makefile.in Tue Jan 27 03:13:46 2009 +0900
@@ -122,7 +122,8 @@
libvirt_la-iptables.lo libvirt_la-uuid.lo \
libvirt_la-qemu_driver.lo libvirt_la-qemu_conf.lo \
libvirt_la-openvz_conf.lo libvirt_la-openvz_driver.lo \
- libvirt_la-nodeinfo.lo libvirt_la-util.lo
+ libvirt_la-nodeinfo.lo libvirt_la-util.lo \
+ libvirt_la-xenrbac_libvirt.lo
am__objects_2 = libvirt_la-remote_protocol.lo
am_libvirt_la_OBJECTS = $(am__objects_1) $(am__objects_2)
libvirt_la_OBJECTS = $(am_libvirt_la_OBJECTS)
@@ -359,6 +360,7 @@
LIBVIRT_VERSION_NUMBER = @LIBVIRT_VERSION_NUMBER@
LIBXML_CFLAGS = @LIBXML_CFLAGS@
LIBXML_LIBS = @LIBXML_LIBS@
+LIBXENRBAC = -lxenrbac
LN_S = @LN_S@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
@@ -569,7 +571,8 @@
openvz_conf.c openvz_conf.h \
openvz_driver.c openvz_driver.h \
nodeinfo.h nodeinfo.c \
- util.c util.h
+ util.c util.h \
+ xenrbac_libvirt.c xenrbac_libvirt.h
SERVER_SOURCES = \
../qemud/remote_protocol.c ../qemud/remote_protocol.h
@@ -652,7 +655,7 @@
rm -f "$${dir}/so_locations"; \
done
libvirt.la: $(libvirt_la_OBJECTS) $(libvirt_la_DEPENDENCIES)
- $(libvirt_la_LINK) -rpath $(libdir) $(libvirt_la_OBJECTS) $(libvirt_la_LIBADD) $(LIBS)
+ $(libvirt_la_LINK) -rpath $(libdir) $(libvirt_la_OBJECTS) $(libvirt_la_LIBADD) $(LIBS)
$(LIBXENRBAC)
install-binPROGRAMS: $(bin_PROGRAMS)
@$(NORMAL_INSTALL)
test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
@@ -683,7 +686,7 @@
done
virsh$(EXEEXT): $(virsh_OBJECTS) $(virsh_DEPENDENCIES)
@rm -f virsh$(EXEEXT)
- $(virsh_LINK) $(virsh_OBJECTS) $(virsh_LDADD) $(LIBS)
+ $(virsh_LINK) $(virsh_OBJECTS) $(virsh_LDADD) $(LIBS) $(LIBXENRBAC)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -719,6 +722,8 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libvirt_la-xm_internal.Plo(a)am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libvirt_la-xml.Plo(a)am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libvirt_la-xs_internal.Plo(a)am__quote@
+#RBAC
+@AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/libvirt_la-xenrbac_libvirt.Plo(a)am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/virsh-console.Po(a)am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/virsh-virsh.Po(a)am__quote@
@@ -813,6 +818,13 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp)
@AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS)
--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)
$(libvirt_la_CFLAGS) $(CFLAGS) -c -o libvirt_la-xs_internal.lo `test -f
'xs_internal.c' || echo '$(srcdir)/'`xs_internal.c
+libvirt_la-xenrbac_libvirt.lo: xenrbac_libvirt.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS)
--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)
$(libvirt_la_CFLAGS) $(CFLAGS) -MT libvirt_la-xenrbac_libvirt.lo -MD -MP -MF
$(DEPDIR)/libvirt_la-xenrbac_libvirt.Tpo -c -o libvirt_la-xenrbac_libvirt.lo `test -f
'xenrbac_libvirt.c' || echo '$(srcdir)/'`xenrbac_libvirt.c
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libvirt_la-xenrbac_libvirt.Tpo
$(DEPDIR)/libvirt_la-xenrbac_libvirt.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='xenrbac_libvirt.c'
object='libvirt_la-xenrbac_libvirt.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp)
@AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS)
--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)
$(libvirt_la_CFLAGS) $(CFLAGS) -c -o libvirt_la-xenrbac_libvirt.lo `test -f
'xenrbac_libvirt.c' || echo '$(srcdir)/'`xenrbac_libvirt.c
+
libvirt_la-xend_internal.lo: xend_internal.c
@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS)
--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS)
$(libvirt_la_CFLAGS) $(CFLAGS) -MT libvirt_la-xend_internal.lo -MD -MP -MF
$(DEPDIR)/libvirt_la-xend_internal.Tpo -c -o libvirt_la-xend_internal.lo `test -f
'xend_internal.c' || echo '$(srcdir)/'`xend_internal.c
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libvirt_la-xend_internal.Tpo
$(DEPDIR)/libvirt_la-xend_internal.Plo
@@ -1181,7 +1193,7 @@
# target to ease building test programs
#
tst: tst.c
- $(CC) $(CFLAGS) $(INCLUDES) -I../include -o tst tst.c .libs/libvirt.a $(LIBXML_LIBS)
$(VIRSH_LIBS) $(GNUTLS_LIBS) $(LIBS)
+ $(CC) $(CFLAGS) $(INCLUDES) -I../include -o tst tst.c .libs/libvirt.a $(LIBXML_LIBS)
$(VIRSH_LIBS) $(GNUTLS_LIBS) $(LIBS) $(LIBXENRBAC)
cov: clean-cov $(COVERAGE_FILES)
diff -r d5dbadfb6161 -r 62d2ebb8d23b src/libvirt.c
--- a/src/libvirt.c Wed Apr 02 13:13:06 2008 +0900
+++ b/src/libvirt.c Tue Jan 27 03:13:46 2009 +0900
@@ -40,6 +40,9 @@
#ifdef WITH_OPENVZ
#include "openvz_driver.h"
#endif
+#ifdef RBAC
+#include "xenrbac_libvirt.h"
+#endif
/*
* TODO:
@@ -481,6 +484,11 @@
if (libVer == NULL)
return (-1);
+
+#ifdef RBAC
+ if(xenRBACdomain( XR_VERSION, NULL, NULL) == -1)
+ return (-1);
+#endif
*libVer = LIBVIR_VERSION_NUMBER;
if (typeVer != NULL) {
@@ -815,6 +823,10 @@
return NULL;
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_HOSTNAME, NULL, conn) == -1)
+ return NULL;
+#endif
if (conn->driver->getHostname)
return conn->driver->getHostname (conn);
@@ -849,6 +861,10 @@
return NULL;
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_HYPERVISER_URI, NULL, conn) == -1)
+ return NULL;
+#endif
/* Drivers may override getURI, but if they don't then
* we provide a default implementation.
*/
@@ -917,6 +933,10 @@
return (-1);
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_LIST_VM, NULL, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->listDomains)
return conn->driver->listDomains (conn, ids, maxids);
@@ -1006,6 +1026,10 @@
return (NULL);
}
+#ifdef RBAC
+ if(xenRBACxml(XR_CREATE_VM, xmlDesc, conn) == -1)
+ return (NULL);
+#endif
if (conn->driver->domainCreateLinux)
return conn->driver->domainCreateLinux (conn, xmlDesc, flags);
@@ -1189,6 +1213,10 @@
return (-1);
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_DESTROY_VM, domain->name, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->domainDestroy)
return conn->driver->domainDestroy (domain);
@@ -1248,6 +1276,10 @@
conn = domain->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_PAUSE_VM, domain->name, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->domainSuspend)
return conn->driver->domainSuspend (domain);
@@ -1282,6 +1314,10 @@
conn = domain->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_PAUSE_VM, domain->name, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->domainResume)
return conn->driver->domainResume (domain);
@@ -1322,6 +1358,10 @@
return (-1);
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_SAVE_VM, NULL, conn) == -1)
+ return (-1);
+#endif
/*
* We must absolutize the file path as the save is done out of process
* TODO: check for URI when libxml2 is linked in.
@@ -1377,6 +1417,10 @@
return (-1);
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_SAVE_VM, NULL, conn) == -1)
+ return (-1);
+#endif
/*
* We must absolutize the file path as the restore is done out of process
* TODO: check for URI when libxml2 is linked in.
@@ -1436,6 +1480,10 @@
return (-1);
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_DUMP_VM, domain->name, conn) == -1)
+ return (-1);
+#endif
/*
* We must absolutize the file path as the save is done out of process
* TODO: check for URI when libxml2 is linked in.
@@ -1493,6 +1541,10 @@
conn = domain->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_SHUTDOWN_VM, domain->name, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->domainShutdown)
return conn->driver->domainShutdown (domain);
@@ -1528,6 +1580,10 @@
conn = domain->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_REBOOT_VM, domain->name, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->domainReboot)
return conn->driver->domainReboot (domain, flags);
@@ -1661,6 +1717,10 @@
conn = domain->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_LIST_VM, domain->name, conn) == -1)
+ return (NULL);
+#endif
if (conn->driver->domainGetOSType)
return conn->driver->domainGetOSType (domain);
@@ -1734,6 +1794,10 @@
}
conn = domain->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_SET_MEM, domain->name, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->domainSetMaxMemory)
return conn->driver->domainSetMaxMemory (domain, memory);
@@ -1778,6 +1842,10 @@
conn = domain->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_SET_MEM, domain->name, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->domainSetMemory)
return conn->driver->domainSetMemory (domain, memory);
@@ -1926,6 +1994,11 @@
return NULL;
}
conn = domain->conn; /* Source connection. */
+
+#ifdef RBAC
+ if(xenRBACdomain( XR_MIGRATE_VM, domain->name, conn) == -1)
+ return NULL;
+#endif
if (!VIR_IS_CONNECT (dconn)) {
virLibConnError (conn, VIR_ERR_INVALID_CONN, __FUNCTION__);
return NULL;
@@ -2150,6 +2223,10 @@
return 0;
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_AVAILABLE_MEM, NULL, conn) == -1)
+ return 0;
+#endif
if (conn->driver->getFreeMemory)
return conn->driver->getFreeMemory (conn);
@@ -2179,6 +2256,10 @@
}
conn = domain->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_GET_SCHEDULER, domain->name, conn) == -1)
+ return NULL;
+#endif
if (conn->driver->domainGetSchedulerType){
schedtype = conn->driver->domainGetSchedulerType (domain, nparams);
return schedtype;
@@ -2216,6 +2297,10 @@
}
conn = domain->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_GET_SCHEDULER, domain->name, conn) == -1)
+ return -1;
+#endif
if (conn->driver->domainGetSchedulerParameters)
return conn->driver->domainGetSchedulerParameters (domain, params,
nparams);
@@ -2248,6 +2333,10 @@
}
conn = domain->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_SET_SCHEDULER, domain->name, conn) == -1)
+ return -1;
+#endif
if (conn->driver->domainSetSchedulerParameters)
return conn->driver->domainSetSchedulerParameters (domain, params,
nparams);
@@ -2297,6 +2386,10 @@
}
conn = dom->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_LOAD_VM, dom->name, conn) == -1)
+ return -1;
+#endif
if (conn->driver->domainBlockStats) {
if (conn->driver->domainBlockStats (dom, path, &stats2) == -1)
return -1;
@@ -2349,6 +2442,10 @@
}
conn = dom->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_LOAD_VM, dom->name, conn) == -1)
+ return -1;
+#endif
if (conn->driver->domainInterfaceStats) {
if (conn->driver->domainInterfaceStats (dom, path, &stats2) == -1)
return -1;
@@ -2396,6 +2493,10 @@
return (NULL);
}
+#ifdef RBAC
+ if(xenRBACxml(XR_DEFINE_VM, xml, conn) == -1)
+ return (NULL);
+#endif
if (conn->driver->domainDefineXML)
return conn->driver->domainDefineXML (conn, xml);
@@ -2426,6 +2527,10 @@
return (-1);
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_UNDEFINE_VM, domain->name, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->domainUndefine)
return conn->driver->domainUndefine (domain);
@@ -2483,6 +2588,10 @@
return (-1);
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_LIST_VM, NULL, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->listDefinedDomains)
return conn->driver->listDefinedDomains (conn, names, maxnames);
@@ -2518,6 +2627,10 @@
return (-1);
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_START_VM, domain->name, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->domainCreate)
return conn->driver->domainCreate (domain);
@@ -2585,6 +2698,10 @@
conn = domain->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_AUTOSTART_VM, domain->name, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->domainSetAutostart)
return conn->driver->domainSetAutostart (domain, autostart);
@@ -2630,6 +2747,10 @@
}
conn = domain->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_SET_VCPU, domain->name, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->domainSetVcpus)
return conn->driver->domainSetVcpus (domain, nvcpus);
@@ -2682,6 +2803,10 @@
conn = domain->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_SET_VCPU, domain->name, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->domainPinVcpu)
return conn->driver->domainPinVcpu (domain, vcpu, cpumap, maplen);
@@ -2736,6 +2861,10 @@
conn = domain->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_GET_VCPU, domain->name, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->domainGetVcpus)
return conn->driver->domainGetVcpus (domain, info, maxinfo,
cpumaps, maplen);
@@ -2802,6 +2931,10 @@
}
conn = domain->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_ATTACH_DEVICE, domain->name, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->domainAttachDevice)
return conn->driver->domainAttachDevice (domain, xml);
@@ -2834,6 +2967,10 @@
}
conn = domain->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_DETACH_DEVICE, domain->name, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->domainDetachDevice)
return conn->driver->domainDetachDevice (domain, xml);
@@ -2876,6 +3013,10 @@
return (-1);
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_AVAILABLE_MEM, NULL, conn) == -1)
+ return (-1);
+#endif
if (conn->driver->nodeGetCellsFreeMemory)
return conn->driver->nodeGetCellsFreeMemory (conn, freeMems, startCell,
maxCells);
@@ -2959,6 +3100,10 @@
return (-1);
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_LIST_VNET, NULL, conn) == -1)
+ return (-1);
+#endif
if (conn->networkDriver && conn->networkDriver->listNetworks)
return conn->networkDriver->listNetworks (conn, names, maxnames);
@@ -3017,6 +3162,10 @@
return (-1);
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_LIST_VNET, NULL, conn) == -1)
+ return (-1);
+#endif
if (conn->networkDriver &&
conn->networkDriver->listDefinedNetworks)
return conn->networkDriver->listDefinedNetworks (conn,
names, maxnames);
@@ -3166,6 +3315,10 @@
return (NULL);
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_CREATE_VNET, NULL, conn) == -1)
+ return (NULL);
+#endif
if (conn->networkDriver && conn->networkDriver->networkCreateXML)
return conn->networkDriver->networkCreateXML (conn, xmlDesc);
@@ -3200,6 +3353,10 @@
return (NULL);
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_DEFINE_VNET, NULL, conn) == -1)
+ return (NULL);
+#endif
if (conn->networkDriver && conn->networkDriver->networkDefineXML)
return conn->networkDriver->networkDefineXML (conn, xml);
@@ -3230,6 +3387,10 @@
return (-1);
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_DEFINE_VNET, NULL, conn) == -1)
+ return (-1);
+#endif
if (conn->networkDriver && conn->networkDriver->networkUndefine)
return conn->networkDriver->networkUndefine (network);
@@ -3266,6 +3427,10 @@
return (-1);
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_CREATE_VNET, NULL, conn) == -1)
+ return (-1);
+#endif
if (conn->networkDriver && conn->networkDriver->networkCreate)
return conn->networkDriver->networkCreate (network);
@@ -3302,6 +3467,10 @@
return (-1);
}
+#ifdef RBAC
+ if(xenRBACdomain( XR_DESTROY_VNET, NULL, conn) == -1)
+ return (-1);
+#endif
if (conn->networkDriver && conn->networkDriver->networkDestroy)
return conn->networkDriver->networkDestroy (network);
@@ -3441,6 +3610,10 @@
conn = network->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_DETAIL_VNET, NULL, conn) == -1)
+ return (NULL);
+#endif
if (conn->networkDriver && conn->networkDriver->networkDumpXML)
return conn->networkDriver->networkDumpXML (network, flags);
@@ -3538,6 +3711,10 @@
conn = network->conn;
+#ifdef RBAC
+ if(xenRBACdomain( XR_AUTOSTART_VNET, NULL, conn) == -1)
+ return (-1);
+#endif
if (conn->networkDriver &&
conn->networkDriver->networkSetAutostart)
return conn->networkDriver->networkSetAutostart (network, autostart);
@@ -3545,6 +3722,340 @@
return -1;
}
+#ifdef RBAC
+/**
+ * virDomainGetXMLDesc_XRBAC:
+ * @op_id: a access ID
+ * @domain: a domain object
+ * @flags: an OR'ed set of virDomainXMLFlags
+ *
+ * Returns a 0 terminated UTF-8 encoded XML instance, or NULL in case of error.
+ * the caller must free() the returned value.
+ */
+char *
+virDomainGetXMLDesc_XRBAC(int op_id, virDomainPtr domain, int flags)
+{
+ /* parameter Check */
+ if( domain == NULL ) {
+ virLibConnError( domain->conn, VIR_ERR_INTERNAL_ERROR, "domain
name");
+ return NULL;
+ }
+ if( (domain->name == NULL) || (strlen(domain->name) == 0) ){
+ virLibConnError( domain->conn, VIR_ERR_INTERNAL_ERROR, "domain
name");
+ return NULL;
+ }
+
+ if(xenRBACdomain( op_id, domain->name, domain->conn) == -1)
+ return NULL;
+
+ return virDomainGetXMLDesc(domain, flags);
+}
+
+/**
+ * virConnectListNetworks_QEMUD:
+ * @conn: pointer to the hypervisor connection
+ * @names: array to collect the list of names of active networks
+ * @maxnames: size of @names
+ *
+ * Collect the list of active networks, and store their names in @names
+ *
+ * Returns the number of networks found or -1 in case of error
+ */
+int
+virConnectListNetworks_QEMUD(virConnectPtr conn, char **const names, int maxnames)
+{
+ DEBUG("conn=%p, names=%p, maxnames=%d", conn, names, maxnames);
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ return (-1);
+ }
+
+ if ((names == NULL) || (maxnames < 0)) {
+ virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ return (-1);
+ }
+
+ if (conn->networkDriver && conn->networkDriver->listNetworks)
+ return conn->networkDriver->listNetworks (conn, names, maxnames);
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ return -1;
+}
+
+/**
+ * virConnectListDefinedNetworks_QEMUD:
+ * @conn: pointer to the hypervisor connection
+ * @names: pointer to an array to store the names
+ * @maxnames: size of the array
+ *
+ * list the inactive networks, stores the pointers to the names in @names
+ *
+ * Returns the number of names provided in the array or -1 in case of error
+ */
+int
+virConnectListDefinedNetworks_QEMUD(virConnectPtr conn, char **const names,
+ int maxnames)
+{
+ DEBUG("conn=%p, names=%p, maxnames=%d", conn, names, maxnames);
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ return (-1);
+ }
+
+ if ((names == NULL) || (maxnames < 0)) {
+ virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ return (-1);
+ }
+
+ if (conn->networkDriver &&
conn->networkDriver->listDefinedNetworks)
+ return conn->networkDriver->listDefinedNetworks (conn,
+ names, maxnames);
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ return -1;
+}
+
+/**
+ * virNetworkCreateXML_QEMUD:
+ * @conn: pointer to the hypervisor connection
+ * @xmlDesc: an XML description of the network
+ *
+ * Create and start a new virtual network, based on an XML description
+ * similar to the one returned by virNetworkGetXMLDesc()
+ *
+ * Returns a new network object or NULL in case of failure
+ */
+virNetworkPtr
+virNetworkCreateXML_QEMUD(virConnectPtr conn, const char *xmlDesc)
+{
+ DEBUG("conn=%p, xmlDesc=%s", conn, xmlDesc);
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ return (NULL);
+ }
+ if (xmlDesc == NULL) {
+ virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ return (NULL);
+ }
+ if (conn->flags & VIR_CONNECT_RO) {
+ virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ return (NULL);
+ }
+
+ if (conn->networkDriver && conn->networkDriver->networkCreateXML)
+ return conn->networkDriver->networkCreateXML (conn, xmlDesc);
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ return NULL;
+}
+
+/**
+ * virNetworkDefineXML_QEMUD:
+ * @conn: pointer to the hypervisor connection
+ * @xml: the XML description for the network, preferably in UTF-8
+ *
+ * Define a network, but does not create it
+ *
+ * Returns NULL in case of error, a pointer to the network otherwise
+ */
+virNetworkPtr
+virNetworkDefineXML_QEMUD(virConnectPtr conn, const char *xml)
+{
+ DEBUG("conn=%p, xml=%s", conn, xml);
+
+ if (!VIR_IS_CONNECT(conn)) {
+ virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
+ return (NULL);
+ }
+ if (conn->flags & VIR_CONNECT_RO) {
+ virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ return (NULL);
+ }
+ if (xml == NULL) {
+ virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ return (NULL);
+ }
+
+ if (conn->networkDriver && conn->networkDriver->networkDefineXML)
+ return conn->networkDriver->networkDefineXML (conn, xml);
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ return NULL;
+}
+
+/**
+ * virNetworkUndefine_QEMUD:
+ * @network: pointer to a defined network
+ *
+ * Undefine a network but does not stop it if it is running
+ *
+ * Returns 0 in case of success, -1 in case of error
+ */
+int
+virNetworkUndefine_QEMUD(virNetworkPtr network) {
+ virConnectPtr conn;
+ DEBUG("network=%p", network);
+
+ if (!VIR_IS_CONNECTED_NETWORK(network)) {
+ virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ return (-1);
+ }
+ conn = network->conn;
+ if (conn->flags & VIR_CONNECT_RO) {
+ virLibNetworkError(network, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ return (-1);
+ }
+
+ if (conn->networkDriver && conn->networkDriver->networkUndefine)
+ return conn->networkDriver->networkUndefine (network);
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ return -1;
+}
+
+/**
+ * virNetworkCreate_QEMUD:
+ * @network: pointer to a defined network
+ *
+ * Create and start a defined network. If the call succeed the network
+ * moves from the defined to the running networks pools.
+ *
+ * Returns 0 in case of success, -1 in case of error
+ */
+int
+virNetworkCreate_QEMUD(virNetworkPtr network)
+{
+ virConnectPtr conn;
+ DEBUG("network=%p", network);
+
+ if (network == NULL) {
+ TODO
+ return (-1);
+ }
+ if (!VIR_IS_CONNECTED_NETWORK(network)) {
+ virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ return (-1);
+ }
+ conn = network->conn;
+ if (conn->flags & VIR_CONNECT_RO) {
+ virLibNetworkError(network, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ return (-1);
+ }
+
+ if (conn->networkDriver && conn->networkDriver->networkCreate)
+ return conn->networkDriver->networkCreate (network);
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ return -1;
+}
+
+/**
+ * virNetworkDestroy_QEMUD:
+ * @network: a network object
+ *
+ * Destroy the network object. The running instance is shutdown if not down
+ * already and all resources used by it are given back to the hypervisor.
+ * The data structure is freed and should not be used thereafter if the
+ * call does not return an error.
+ * This function may requires priviledged access
+ *
+ * Returns 0 in case of success and -1 in case of failure.
+ */
+int
+virNetworkDestroy_QEMUD(virNetworkPtr network)
+{
+ virConnectPtr conn;
+ DEBUG("network=%p", network);
+
+ if (!VIR_IS_CONNECTED_NETWORK(network)) {
+ virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ return (-1);
+ }
+
+ conn = network->conn;
+ if (conn->flags & VIR_CONNECT_RO) {
+ virLibNetworkError(network, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+ return (-1);
+ }
+
+ if (conn->networkDriver && conn->networkDriver->networkDestroy)
+ return conn->networkDriver->networkDestroy (network);
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ return -1;
+}
+
+/**
+ * virNetworkGetXMLDesc_QEMUD:
+ * @network: a network object
+ * @flags: and OR'ed set of extraction flags, not used yet
+ *
+ * Provide an XML description of the network. The description may be reused
+ * later to relaunch the network with virNetworkCreateXML().
+ *
+ * Returns a 0 terminated UTF-8 encoded XML instance, or NULL in case of error.
+ * the caller must free() the returned value.
+ */
+char *
+virNetworkGetXMLDesc_QEMUD(virNetworkPtr network, int flags)
+{
+ virConnectPtr conn;
+ DEBUG("network=%p, flags=%d", network, flags);
+
+ if (!VIR_IS_NETWORK(network)) {
+ virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ return (NULL);
+ }
+ if (flags != 0) {
+ virLibNetworkError(network, VIR_ERR_INVALID_ARG, __FUNCTION__);
+ return (NULL);
+ }
+
+ conn = network->conn;
+
+ if (conn->networkDriver && conn->networkDriver->networkDumpXML)
+ return conn->networkDriver->networkDumpXML (network, flags);
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ return NULL;
+}
+
+/**
+ * virNetworkSetAutostart_QEMUD:
+ * @network: a network object
+ * @autostart: whether the network should be automatically started 0 or 1
+ *
+ * Configure the network to be automatically started
+ * when the host machine boots.
+ *
+ * Returns -1 in case of error, 0 in case of success
+ */
+int
+virNetworkSetAutostart_QEMUD(virNetworkPtr network,
+ int autostart)
+{
+ virConnectPtr conn;
+ DEBUG("network=%p, autostart=%d", network, autostart);
+
+ if (!VIR_IS_NETWORK(network)) {
+ virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
+ return (-1);
+ }
+
+ conn = network->conn;
+
+ if (conn->networkDriver &&
conn->networkDriver->networkSetAutostart)
+ return conn->networkDriver->networkSetAutostart (network, autostart);
+
+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+ return -1;
+}
+#endif
+
+
/*
* vim: set tabstop=4:
* vim: set shiftwidth=4:
diff -r d5dbadfb6161 -r 62d2ebb8d23b src/libvirt_sym.version
--- a/src/libvirt_sym.version Wed Apr 02 13:13:06 2008 +0900
+++ b/src/libvirt_sym.version Tue Jan 27 03:13:46 2009 +0900
@@ -28,6 +28,7 @@
virDomainGetName;
virDomainGetOSType;
virDomainGetXMLDesc;
+ virDomainGetXMLDesc_XRBAC;
virDomainLookupByID;
virDomainLookupByName;
virDomainLookupByUUID;
@@ -99,6 +100,15 @@
virNetworkGetBridgeName;
virNetworkGetAutostart;
virNetworkSetAutostart;
+ virConnectListNetworks_QEMUD;
+ virConnectListDefinedNetworks_QEMUD;
+ virNetworkCreateXML_QEMUD;
+ virNetworkDefineXML_QEMUD;
+ virNetworkUndefine_QEMUD;
+ virNetworkCreate_QEMUD;
+ virNetworkDestroy_QEMUD;
+ virNetworkGetXMLDesc_QEMUD;
+ virNetworkSetAutostart_QEMUD;
/* Symbols with __ are private only
for use by the libvirtd daemon.
diff -r d5dbadfb6161 -r 62d2ebb8d23b src/proxy_internal.c
--- a/src/proxy_internal.c Wed Apr 02 13:13:06 2008 +0900
+++ b/src/proxy_internal.c Tue Jan 27 03:13:46 2009 +0900
@@ -42,6 +42,9 @@
static unsigned long xenProxyDomainGetMaxMemory(virDomainPtr domain);
static int xenProxyDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info);
static char *xenProxyDomainGetOSType(virDomainPtr domain);
+#ifdef RBAC
+static char *xenProxyGetSchedulerType(virDomainPtr domain, int *nparams);
+#endif
struct xenUnifiedDriver xenProxyDriver = {
xenProxyOpen, /* open */
@@ -80,7 +83,11 @@
NULL, /* domainDetachDevice */
NULL, /* domainGetAutostart */
NULL, /* domainSetAutostart */
+#ifdef RBAC
+ xenProxyGetSchedulerType, /* domainGetInfo */
+#else
NULL, /* domainGetSchedulerType */
+#endif
NULL, /* domainGetSchedulerParameters */
NULL, /* domainSetSchedulerParameters */
};
@@ -533,9 +540,11 @@
int ret;
int fd;
xenUnifiedPrivatePtr priv;
-
+
+#ifndef RBAC
if (!(flags & VIR_CONNECT_RO))
return(-1);
+#endif
priv = (xenUnifiedPrivatePtr) conn->privateData;
priv->proxy = -1;
@@ -1113,6 +1122,54 @@
return(ostype);
}
+#ifdef RBAC
+static char *
+xenProxyGetSchedulerType(virDomainPtr domain, int *nparams)
+{
+ virProxyPacket req;
+ virProxyFullPacket ans;
+ int ret, type_len;
+ char *sched_type;
+
+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+ if (domain == NULL)
+ virProxyError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ else
+ virProxyError(domain->conn, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+ return NULL;
+ }
+ if (domain->id < 0)
+ return NULL;
+
+ memset(&req, 0, sizeof(req));
+ req.command = VIR_PROXY_GET_SCHEDTYPE;
+ req.len = sizeof(req);
+ ret = xenProxyCommand(domain->conn, &req, &ans, 0);
+ if (ret < 0) {
+ xenProxyClose(domain->conn);
+ return NULL;
+ }
+ if (ans.data.arg == -1)
+ return NULL;
+ if (ans.len <= sizeof(virProxyPacket)) {
+ virProxyError(domain->conn, VIR_ERR_OPERATION_FAILED, __FUNCTION__);
+ return NULL;
+ }
+
+ type_len = ans.len - sizeof (virProxyPacket) - sizeof(int);
+ sched_type = malloc (type_len + 1);
+ if (!sched_type) {
+ virProxyError (domain->conn, VIR_ERR_NO_MEMORY, __FUNCTION__);
+ return NULL;
+ }
+
+ *nparams = ans.extra.arg[0];
+ memmove (sched_type, &ans.extra.str[4], type_len);
+ sched_type[type_len] = '\0';
+
+ return sched_type;
+}
+#endif
#endif /* WITH_XEN */
/*
diff -r d5dbadfb6161 -r 62d2ebb8d23b src/proxy_internal.h
--- a/src/proxy_internal.h Wed Apr 02 13:13:06 2008 +0900
+++ b/src/proxy_internal.h Tue Jan 27 03:13:46 2009 +0900
@@ -37,7 +37,12 @@
VIR_PROXY_DOMAIN_INFO = 9,
VIR_PROXY_DOMAIN_XML = 10,
VIR_PROXY_DOMAIN_OSTYPE = 11,
+#ifdef RBAC
+ VIR_PROXY_GET_CAPABILITIES = 12,
+ VIR_PROXY_GET_SCHEDTYPE = 13
+#else
VIR_PROXY_GET_CAPABILITIES = 12
+#endif
} virProxyCommand;
/*
diff -r d5dbadfb6161 -r 62d2ebb8d23b src/remote_internal.c
--- a/src/remote_internal.c Wed Apr 02 13:13:06 2008 +0900
+++ b/src/remote_internal.c Tue Jan 27 03:13:46 2009 +0900
@@ -677,7 +677,7 @@
cmd_argv[j++] = strdup (sockname ? sockname : LIBVIRTD_PRIV_UNIX_SOCKET);
cmd_argv[j++] = 0;
assert (j == nr_args);
- for (j = 0; j < nr_args; j++)
+ for (j = 0; j < (nr_args-1); j++)
if (cmd_argv[j] == NULL) {
error (conn, VIR_ERR_SYSTEM_ERROR, strerror (ENOMEM));
goto failed;
diff -r d5dbadfb6161 -r 62d2ebb8d23b src/virsh.c
--- a/src/virsh.c Wed Apr 02 13:13:06 2008 +0900
+++ b/src/virsh.c Tue Jan 27 03:13:46 2009 +0900
@@ -49,6 +49,10 @@
#include "internal.h"
#include "console.h"
+#ifdef RBAC
+#include "xenrbac_libvirt.h"
+#endif
+
static char *progname;
#ifndef TRUE
@@ -1066,12 +1070,13 @@
if (!(dom = vshCommandOptDomainBy(ctl, cmd, "name", NULL, VSH_BYNAME)))
return FALSE;
+#ifndef RBAC
if (virDomainGetID(dom) != (unsigned int)-1) {
vshError(ctl, FALSE, _("Domain is already active"));
virDomainFree(dom);
return FALSE;
}
-
+#endif
if (virDomainCreate(dom) == 0) {
vshPrint(ctl, _("Domain %s started\n"),
virDomainGetName(dom));
@@ -1549,6 +1554,25 @@
if (!(dom = vshCommandOptDomain(ctl, cmd, "domain", NULL)))
return FALSE;
+#ifdef RBAC
+ if ((str = virDomainGetOSType(dom))) {
+ id = virDomainGetID(dom);
+ if (id == ((unsigned int)-1))
+ vshPrint(ctl, "%-15s %s\n", _("Id:"), "-");
+ else
+ vshPrint(ctl, "%-15s %d\n", _("Id:"), id);
+ vshPrint(ctl, "%-15s %s\n", _("Name:"),
virDomainGetName(dom));
+
+ if (virDomainGetUUIDString(dom, &uuid[0])==0)
+ vshPrint(ctl, "%-15s %s\n", _("UUID:"), uuid);
+
+ vshPrint(ctl, "%-15s %s\n", _("OS Type:"), str);
+ free(str);
+ } else {
+ virDomainFree(dom);
+ return FALSE;
+ }
+#else
id = virDomainGetID(dom);
if (id == ((unsigned int)-1))
vshPrint(ctl, "%-15s %s\n", _("Id:"), "-");
@@ -1563,6 +1587,7 @@
vshPrint(ctl, "%-15s %s\n", _("OS Type:"), str);
free(str);
}
+#endif
if (virDomainGetInfo(dom, &info) == 0) {
vshPrint(ctl, "%-15s %s\n", _("State:"),
@@ -2116,7 +2141,11 @@
if (!(dom = vshCommandOptDomain(ctl, cmd, "domain", NULL)))
return FALSE;
+#ifdef RBAC
+ dump = virDomainGetXMLDesc_XRBAC(XR_DETAIL_VM, dom, 0);
+#else
dump = virDomainGetXMLDesc(dom, 0);
+#endif
if (dump != NULL) {
printf("%s", dump);
free(dump);
@@ -2555,7 +2584,6 @@
}
if (maxactive) {
activeNames = vshMalloc(ctl, sizeof(char *) * maxactive);
-
if ((maxactive = virConnectListNetworks(ctl->conn, activeNames,
maxactive)) < 0) {
vshError(ctl, FALSE, _("Failed to list active networks"));
@@ -2576,7 +2604,6 @@
}
if (maxinactive) {
inactiveNames = vshMalloc(ctl, sizeof(char *) * maxinactive);
-
if ((maxinactive = virConnectListDefinedNetworks(ctl->conn, inactiveNames,
maxinactive)) < 0) {
vshError(ctl, FALSE, _("Failed to list inactive networks"));
if (activeNames)
@@ -2824,6 +2851,13 @@
return FALSE;
}
+#ifdef RBAC
+ ret = virGetVersion(&libVersion, hvType, &apiVersion);
+ if (ret < 0) {
+ vshError(ctl, FALSE, _("failed to get the library version"));
+ return FALSE;
+ }
+
includeVersion = LIBVIR_VERSION_NUMBER;
major = includeVersion / 1000000;
includeVersion %= 1000000;
@@ -2831,12 +2865,22 @@
rel = includeVersion % 1000;
vshPrint(ctl, _("Compiled against library: libvir %d.%d.%d\n"),
major, minor, rel);
+#else
+ includeVersion = LIBVIR_VERSION_NUMBER;
+ major = includeVersion / 1000000;
+ includeVersion %= 1000000;
+ minor = includeVersion / 1000;
+ rel = includeVersion % 1000;
+ vshPrint(ctl, _("Compiled against library: libvir %d.%d.%d\n"),
+ major, minor, rel);
ret = virGetVersion(&libVersion, hvType, &apiVersion);
if (ret < 0) {
vshError(ctl, FALSE, _("failed to get the library version"));
return FALSE;
}
+#endif
+
major = libVersion / 1000000;
libVersion %= 1000000;
minor = libVersion / 1000;
@@ -2961,7 +3005,11 @@
if (!(dom = vshCommandOptDomain(ctl, cmd, "domain", NULL)))
return FALSE;
+#ifdef RBAC
+ doc = virDomainGetXMLDesc_XRBAC(XR_DETAIL_VM, dom, 0);
+#else
doc = virDomainGetXMLDesc(dom, 0);
+#endif
if (!doc)
goto cleanup;
@@ -3038,7 +3086,11 @@
if (!(dom = vshCommandOptDomain(ctl, cmd, "domain", NULL)))
return FALSE;
+#ifdef RBAC
+ doc = virDomainGetXMLDesc_XRBAC(XR_DETAIL_VM, dom, 0);
+#else
doc = virDomainGetXMLDesc(dom, 0);
+#endif
if (!doc)
goto cleanup;
@@ -4532,12 +4584,15 @@
/* set up the library error handler */
virSetErrorFunc(NULL, virshErrorHandler);
+#ifdef RBAC
+#else
#ifndef __MINGW32__
/* Force a non-root, Xen connection to readonly */
if ((ctl->name == NULL ||
!strcasecmp(ctl->name, "xen")) && ctl->uid != 0)
ctl->readonly = 1;
#endif
+#endif /* RBAC */
ctl->conn = virConnectOpenAuth(ctl->name,
virConnectAuthPtrDefault,
diff -r d5dbadfb6161 -r 62d2ebb8d23b src/virterror.c
--- a/src/virterror.c Wed Apr 02 13:13:06 2008 +0900
+++ b/src/virterror.c Tue Jan 27 03:13:46 2009 +0900
@@ -300,6 +300,11 @@
case VIR_FROM_STATS_LINUX:
dom = "Linux Stats ";
break;
+#ifdef RBAC
+ case VIR_FROM_XENRBAC:
+ dom = "Xen RBAC ";
+ break;
+#endif
}
if ((err->dom != NULL) && (err->code != VIR_ERR_INVALID_DOMAIN)) {
@@ -679,6 +684,14 @@
else
errmsg = _("authentication failed: %s");
break;
+#ifdef RBAC
+ case VIR_ERR_PERMISSION:
+ if (info == NULL)
+ errmsg = _("operation not permitted");
+ else
+ errmsg = _("operation not permitted: %s");
+ break;
+#endif
}
return (errmsg);
}
diff -r d5dbadfb6161 -r 62d2ebb8d23b src/xen_internal.c
--- a/src/xen_internal.c Wed Apr 02 13:13:06 2008 +0900
+++ b/src/xen_internal.c Tue Jan 27 03:13:46 2009 +0900
@@ -741,7 +741,6 @@
errmsg, info, NULL, value, 0, errmsg, info, value);
}
-#ifndef PROXY
/**
* virXenErrorFunc:
@@ -779,7 +778,6 @@
}
}
-#endif /* PROXY */
/**
* virXenPerror:
@@ -1069,7 +1067,6 @@
}
-#ifndef PROXY
/**
* xenHypervisorGetSchedulerType:
* @domain: pointer to the Xen Hypervisor block
@@ -1082,19 +1079,35 @@
char *
xenHypervisorGetSchedulerType(virDomainPtr domain, int *nparams)
{
+ if ((domain == NULL) || (domain->conn == NULL)) {
+ virXenErrorFunc(NULL, VIR_ERR_INTERNAL_ERROR, __FUNCTION__,
+ "domain is NULL", 0);
+ return NULL;
+ }
+ if (domain->id < 0) {
+ virXenErrorFunc(domain->conn, VIR_ERR_INTERNAL_ERROR, __FUNCTION__,
+ "domain->id invalid", 0);
+ return NULL;
+ }
+ return(xenHypervisorGetSchedType(domain->conn, nparams));
+}
+
+char *
+xenHypervisorGetSchedType(virConnectPtr conn, int *nparams)
+{
char *schedulertype = NULL;
xenUnifiedPrivatePtr priv;
- if ((domain == NULL) || (domain->conn == NULL)) {
+ if (conn == NULL) {
virXenErrorFunc(NULL, VIR_ERR_INTERNAL_ERROR, __FUNCTION__,
- "domain or conn is NULL", 0);
+ "conn is NULL", 0);
return NULL;
}
- priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
- if (priv->handle < 0 || domain->id < 0) {
- virXenErrorFunc(domain->conn, VIR_ERR_INTERNAL_ERROR, __FUNCTION__,
- "priv->handle or domain->id invalid", 0);
+ priv = (xenUnifiedPrivatePtr) conn->privateData;
+ if (priv->handle < 0) {
+ virXenErrorFunc(conn, VIR_ERR_INTERNAL_ERROR, __FUNCTION__,
+ "priv->handle invalid", 0);
return NULL;
}
@@ -1104,8 +1117,8 @@
* TODO: check on Xen 3.0.3
*/
if (dom_interface_version < 5) {
- virXenErrorFunc(domain->conn, VIR_ERR_NO_XEN, __FUNCTION__,
- "unsupported in dom interface < 5", 0);
+ virXenErrorFunc(conn, VIR_ERR_NO_XEN, __FUNCTION__,
+ "unsupported in dom interface < 5", 0);
return NULL;
}
@@ -1138,6 +1151,7 @@
return schedulertype;
}
+#ifndef PROXY
static const char *str_weight = "weight";
static const char *str_cap = "cap";
diff -r d5dbadfb6161 -r 62d2ebb8d23b src/xen_internal.h
--- a/src/xen_internal.h Wed Apr 02 13:13:06 2008 +0900
+++ b/src/xen_internal.h Tue Jan 27 03:13:46 2009 +0900
@@ -76,8 +76,10 @@
int maplen);
int xenHypervisorGetVcpuMax (virDomainPtr domain);
-char * xenHypervisorGetSchedulerType (virDomainPtr domain,
- int *nparams);
+char * xenHypervisorGetSchedulerType (virDomainPtr domain,
+ int *nparams);
+char * xenHypervisorGetSchedType (virConnectPtr conn,
+ int *nparams);
int xenHypervisorGetSchedulerParameters (virDomainPtr domain,
virSchedParameterPtr params,
diff -r d5dbadfb6161 -r 62d2ebb8d23b src/xen_unified.c
--- a/src/xen_unified.c Wed Apr 02 13:13:06 2008 +0900
+++ b/src/xen_unified.c Tue Jan 27 03:13:46 2009 +0900
@@ -40,6 +40,9 @@
#include "xm_internal.h"
#include "xml.h"
+#ifdef RBAC
+#include <xen/xen.h>
+#endif
static int
xenUnifiedNodeGetInfo (virConnectPtr conn, virNodeInfoPtr info);
static int
@@ -266,6 +269,11 @@
priv->xendConfigVersion > 2)
continue;
+#ifdef RBAC
+ /* Ignore proxy for non-root */
+ if (i == XEN_UNIFIED_HYPERVISOR_OFFSET && getuid() != 0)
+ continue;
+#endif
/* Ignore proxy for root */
if (i == XEN_UNIFIED_PROXY_OFFSET && getuid() == 0)
continue;
@@ -282,10 +290,15 @@
#endif
}
+#ifdef RBAC
+ if (!priv->opened[i] &&
+ (!(conn->flags & VIR_CONNECT_RO) || getuid() == 0 || i ==
XEN_UNIFIED_PROXY_OFFSET)) {
+#else
/* If as root, then all drivers must succeed.
If non-root, then only proxy must succeed */
if (!priv->opened[i] &&
(getuid() == 0 || i == XEN_UNIFIED_PROXY_OFFSET)) {
+#endif
for (j = 0; j < i; ++j)
if (priv->opened[j]) drivers[j]->close (conn);
free (priv);
@@ -381,6 +394,9 @@
static int
xenUnifiedGetMaxVcpus (virConnectPtr conn, const char *type)
{
+#ifdef RBAC
+ return MAX_VIRT_CPUS;
+#else
GET_PRIVATE(conn);
if (type && STRCASENEQ (type, "Xen")) {
@@ -394,6 +410,7 @@
xenUnifiedError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
return -1;
}
+#endif
}
static int
@@ -889,6 +906,9 @@
static int
xenUnifiedDomainGetMaxVcpus (virDomainPtr dom)
{
+#ifdef RBAC
+ return MAX_VIRT_CPUS;
+#else
GET_PRIVATE(dom->conn);
int i, ret;
@@ -899,6 +919,7 @@
}
return -1;
+#endif
}
static char *
diff -r d5dbadfb6161 -r 62d2ebb8d23b src/xend_internal.c
--- a/src/xend_internal.c Wed Apr 02 13:13:06 2008 +0900
+++ b/src/xend_internal.c Tue Jan 27 03:13:46 2009 +0900
@@ -62,6 +62,12 @@
static int xenDaemonDomainCoreDump(virDomainPtr domain, const char *filename,
int flags);
#endif /* PROXY */
+#ifdef RBAC
+static int xenDaemonGetSchedulerParameters(virDomainPtr domain,
+ virSchedParameterPtr params, int *nparams);
+static int xenDaemonSetSchedulerParameters(virDomainPtr domain,
+ virSchedParameterPtr params, int nparams);
+#endif /* RBAC */
#ifndef PROXY
struct xenUnifiedDriver xenDaemonDriver = {
@@ -102,8 +108,13 @@
NULL, /* domainGetAutostart */
NULL, /* domainSetAutostart */
NULL, /* domainGetSchedulerType */
+#ifdef RBAC
+ xenDaemonGetSchedulerParameters, /* domainGetSchedulerParameters */
+ xenDaemonSetSchedulerParameters, /* domainSetSchedulerParameters */
+#else
NULL, /* domainGetSchedulerParameters */
NULL, /* domainSetSchedulerParameters */
+#endif
};
/**
@@ -235,7 +246,11 @@
* is rather normal, this should fallback to the proxy (or
* remote) mechanism.
*/
+#ifdef RBAC
+ if (getuid() == 0) {
+#else
if ((getuid() == 0) || (xend->flags & VIR_CONNECT_RO)) {
+#endif
virXendError(xend, VIR_ERR_INTERNAL_ERROR,
"failed to connect to xend");
}
@@ -3591,6 +3606,109 @@
return(ret);
}
+
+#ifdef RBAC
+static const char *str_weight = "weight";
+static const char *str_cap = "cap";
+
+static int
+xenDaemonGetSchedulerParameters(virDomainPtr domain,
+ virSchedParameterPtr params, int *nparams)
+{
+ xenUnifiedPrivatePtr priv;
+ struct sexpr *root;
+ int weight, cap;
+
+ if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
+ virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG,
+ __FUNCTION__);
+ return (-1);
+ }
+
+ priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
+ if (domain->id < 0 && priv->xendConfigVersion < 3)
+ return (-1);
+
+ root = sexpr_get(domain->conn, "/xend/domain/%d?detail=1",
domain->id);
+ if (root == NULL)
+ return (-1);
+
+ weight = sexpr_int(root, "domain/cpu_weight");
+ cap = sexpr_int(root, "domain/cpu_cap");
+
+ strncpy (params[0].field, str_weight, VIR_DOMAIN_SCHED_FIELD_LENGTH);
+ params[0].type = VIR_DOMAIN_SCHED_FIELD_INT;
+ params[0].value.i = weight;
+
+ strncpy (params[1].field, str_cap, VIR_DOMAIN_SCHED_FIELD_LENGTH);
+ params[1].type = VIR_DOMAIN_SCHED_FIELD_INT;
+ params[1].value.i = cap;
+
+ return (0);
+}
+
+static int
+xenDaemonSetSchedulerParameters(virDomainPtr domain,
+ virSchedParameterPtr params, int nparams)
+{
+ int i;
+ int weight_set = 0;
+ int cap_set = 0;
+ char buf_weight[VIR_UUID_BUFLEN];
+ char buf_cap[VIR_UUID_BUFLEN];
+ xenUnifiedPrivatePtr priv;
+ int weight, cap;
+ struct sexpr *root;
+
+ if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)
+ || (nparams == 0) || (params == NULL)) {
+ virXendError((domain ? domain->conn : NULL), VIR_ERR_INVALID_ARG,
+ __FUNCTION__);
+ return (-1);
+ }
+
+ priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
+
+ if (domain->id < 0 && priv->xendConfigVersion < 3)
+ return(-1);
+
+ /* search specified parameter */
+ memset(&buf_weight, 0, VIR_UUID_BUFLEN);
+ memset(&buf_cap, 0, VIR_UUID_BUFLEN);
+ for (i = 0; i < nparams; i++) {
+ if (STREQ (params[i].field, str_weight) &&
+ params[i].type == VIR_DOMAIN_SCHED_FIELD_UINT) {
+ snprintf(buf_weight, sizeof(buf_weight), "%d",
params[i].value.ui);
+ weight_set = 1;
+ } else if (STREQ (params[i].field, str_cap) &&
+ params[i].type == VIR_DOMAIN_SCHED_FIELD_UINT) {
+ snprintf(buf_cap, sizeof(buf_cap), "%d", params[i].value.ui);
+ cap_set = 1;
+ } else {
+ virXendError((domain ? domain->conn : NULL),
+ VIR_ERR_INVALID_ARG, __FUNCTION__);
+ return(-1);
+ }
+ }
+
+ /* get the current setting from xend */
+ root = sexpr_get(domain->conn, "/xend/domain/%d?detail=1",
domain->id);
+ weight = sexpr_int(root, "domain/cpu_weight");
+ cap = sexpr_int(root, "domain/cpu_cap");
+
+
+ /* if not specified parameter, set the current value */
+ if (weight_set != 1)
+ snprintf(buf_weight, sizeof(buf_weight), "%d", weight);
+ if (cap_set != 1)
+ snprintf(buf_cap, sizeof(buf_weight), "%d", cap);
+
+ /* xend operation */
+ return(xend_op(domain->conn, domain->name, "op",
"domain_sched_credit_set",
+ "weight", buf_weight, "cap", buf_cap, NULL));
+}
+#endif /* RBAC */
+
#endif /* ! PROXY */
#endif /* WITH_XEN */
diff -r d5dbadfb6161 -r 62d2ebb8d23b src/xenrbac.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/xenrbac.h Tue Jan 27 03:13:46 2009 +0900
@@ -0,0 +1,39 @@
+/*
+ Copyright (C) 2008 Fujitsu Limited.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ MA 02110-1301 USA.
+*/
+
+#ifndef __XENRBAC_H__
+#define __XENRBAC_H__
+
+#include <errno.h>
+
+int xr_judge(char *username, int opeid, char *domainname, int flag_all);
+
+#define XR_ANY 0
+#define XR_ALL 1
+
+#define XR_ACCEPT 0
+#define XR_DENY EPERM
+
+#endif /*__XENRBAC_H__*/
+/*
+ * Local variables:
+ * c-indent-level: 8
+ * c-basic-offset: 8
+ * End:
+ */
diff -r d5dbadfb6161 -r 62d2ebb8d23b src/xenrbac_libvirt.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/xenrbac_libvirt.c Tue Jan 27 03:13:46 2009 +0900
@@ -0,0 +1,162 @@
+/*
+ * xr_internal.c: access to Xen RBAC
+ *
+ * Copyright (C) 2008 FUJITSU Limited.
+ *
+ * See COPYING.LIB for the License of this software
+ *
+ */
+
+#include "libvirt/libvirt.h"
+#include "libvirt/virterror.h"
+#include "internal.h"
+
+#include <stdio.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <unistd.h>
+
+#include <libxml/parser.h>
+#include <libxml/xpath.h>
+#include <libxml/uri.h>
+
+#include "xenrbac_libvirt.h"
+#include "xenrbac.h"
+
+
+/**
+ * xenRBACError:
+ * @error: the error number
+ * @info: extra information string
+ *
+ * Handle an error at the connection level
+ */
+static void
+xenRBACError(virConnectPtr conn, virErrorNumber error, const char *info)
+{
+ const char *errmsg;
+
+ if (error == VIR_ERR_OK)
+ return;
+
+ errmsg = __virErrorMsg(error, info);
+ __virRaiseError(conn, NULL, NULL, VIR_FROM_XENRBAC, error, VIR_ERR_ERROR,
+ errmsg, info, NULL, 0, 0, errmsg, info);
+}
+
+int
+xenRBACdomain(int op_id, char *domname, virConnectPtr conn)
+{
+ struct passwd *pw = NULL;
+ int ret=0;
+ char msg_buff[256];
+
+ memset((char *)msg_buff, (char)NULL, 256);
+
+ /* parameter Check */
+ if( op_id <= 0 ) {
+ snprintf(msg_buff, 256, "unknown access ID ID = %d", op_id);
+ xenRBACError( conn, VIR_ERR_INTERNAL_ERROR, msg_buff);
+ return -1;
+ }
+
+ if( (domname != NULL) && (strlen(domname) == 0) ){
+ xenRBACError( conn, VIR_ERR_INTERNAL_ERROR, "domain name");
+ return -1;
+ }
+ /* Get username */
+ if( !(pw = getpwuid( getuid())) ){
+ if(errno == 0)
+ xenRBACError( conn, VIR_ERR_SYSTEM_ERROR, NULL);
+ else
+ xenRBACError( conn, VIR_ERR_SYSTEM_ERROR, strerror(errno));
+ return -1;
+ }
+
+ ret = xr_judge( pw->pw_name, op_id, domname, XR_ANY);
+ if ( ret != 0 ){
+ switch(ret) {
+ case EPERM:
+ xenRBACError( conn, VIR_ERR_PERMISSION, NULL);
+ return -1;
+
+ case EINVAL:
+ xenRBACError( conn, VIR_ERR_INTERNAL_ERROR, NULL);
+ return -1;
+
+ case ENOMEM:
+ xenRBACError( conn, VIR_ERR_NO_MEMORY, NULL);
+ return -1;
+
+ case ENOENT:
+ case EACCES:
+ xenRBACError( conn, VIR_ERR_OPEN_FAILED, NULL);
+ return -1;
+
+ default:
+ xenRBACError( conn, VIR_ERR_INTERNAL_ERROR, NULL);
+ return -1;
+
+ } //switch_end
+ }
+
+ return 0;
+}
+
+int
+xenRBACxml( int op_id, const char *xmlDesc, virConnectPtr conn)
+{
+
+ xmlDocPtr xml = NULL;
+ xmlXPathObjectPtr obj = NULL;
+ xmlXPathContextPtr ctxt = NULL;
+ int ret = 0;
+
+ /* parameter Check */
+ if( xmlDesc == NULL ){
+ xenRBACError( conn, VIR_ERR_INTERNAL_ERROR, "xmlDesc");
+ return -1;
+ }
+
+ xml = xmlReadDoc((const xmlChar *) xmlDesc, "domain.xml", NULL,
+ XML_PARSE_NOENT | XML_PARSE_NONET |
+ XML_PARSE_NOWARNING);
+ if (!xml) {
+ xenRBACError( conn, VIR_ERR_XML_ERROR, NULL);
+ ret = -1;
+ goto cleanup;
+ }
+
+ ctxt = xmlXPathNewContext(xml);
+ if (!ctxt) {
+ xenRBACError( conn, VIR_ERR_XML_ERROR, NULL);
+ ret = -1;
+ goto cleanup;
+ }
+
+ obj = xmlXPathEval(BAD_CAST "string(/domain/name)" , ctxt);
+ if (!obj) {
+ xenRBACError( conn, VIR_ERR_XML_ERROR, NULL);
+ ret = -1;
+ goto cleanup;
+ }
+ if ( (obj->type == XPATH_STRING) && (obj->stringval != NULL) &&
(obj->stringval[0] != 0) ) {
+ ret = xenRBACdomain( op_id, (char *)obj->stringval, conn);
+ } else {
+ xenRBACError( conn, VIR_ERR_XML_ERROR, NULL);
+ ret = -1;
+ goto cleanup;
+ }
+
+ cleanup:
+ if (obj)
+ xmlXPathFreeObject(obj);
+ if (ctxt)
+ xmlXPathFreeContext(ctxt);
+ if (xml)
+ xmlFreeDoc(xml);
+
+ return ret;
+}
+
diff -r d5dbadfb6161 -r 62d2ebb8d23b src/xenrbac_libvirt.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/xenrbac_libvirt.h Tue Jan 27 03:13:46 2009 +0900
@@ -0,0 +1,68 @@
+/*
+ * xenrbac_libvirt.h: internal API for access to Xen RBAC
+ *
+ * Copyright (C) 2008 FUJITSU Limited.
+ *
+ * See COPYING.LIB for the License of this software
+ *
+ */
+
+
+#ifndef __VIR_XR_JUDGE_H__
+#define __VIR_XR_JUDGE_H__
+
+int xenRBACdomain(int op_id, char *domainname, virConnectPtr conn);
+int xenRBACxml(int op_id, const char *xmlDesc, virConnectPtr conn);
+
+#ifdef RBAC
+/* ACCESS LIST */
+#define XR_CREATE_VM 1
+#define XR_START_VM 2
+#define XR_DESTROY_VM 3
+#define XR_SHUTDOWN_VM 4
+#define XR_PAUSE_VM 5
+#define XR_SUSPEND_VM 6
+#define XR_SAVE_VM 7
+#define XR_DEFINE_VM 8
+#define XR_MIGRATE_VM 9
+#define XR_REBOOT_VM 10
+#define XR_DUMP_VM 11
+#define XR_RENAME_VM 12
+#define XR_SYSREQ_VM 13
+#define XR_AUTOSTART_VM 14
+#define XR_UNDEFINE_VM 15 /* Step2 2008.8.13 */
+#define XR_LIST_VM 16
+#define XR_DETAIL_VM 17
+#define XR_LOAD_VM 18
+#define XR_UPTIME_VM 19
+#define XR_XEND_LOG 20
+#define XR_XEND_MSG 21
+#define XR_HOSTNAME 22
+#define XR_AVAILABLE_MEM 23
+
+#define XR_SET_VCPU 30
+#define XR_GET_VCPU 31
+#define XR_SET_SCHEDULER 32
+#define XR_GET_SCHEDULER 33
+#define XR_SET_MEM 34
+#define XR_ATTACH_DEVICE 35 /* Step2 2008.8.13 */
+#define XR_LIST_VBD 36
+#define XR_LIST_VNIF 37
+#define XR_LIST_VTPM 38
+#define XR_CREATE_VNET 40
+#define XR_LIST_VNET 41
+#define XR_DETAIL_VNET 42
+#define XR_AUTOSTART_VNET 43
+#define XR_DEFINE_VNET 44
+#define XR_DETACH_DEVICE 45 /* Step2 2008.8.13 */
+#define XR_CHANGE_DEVICE 46 /* Step2 2008.8.13 */
+#define XR_DESTROY_VNET 47 /* Step2 2008.8.13 */
+
+#define XR_HYPERVISER_URI 61
+#define XR_VERSION 62
+#define XR_SEND_TRIGGER 63
+#define XR_SEND_DEBUG_KEY 64
+#endif
+
+#endif /* __VIR_XR_JUDGE_H__ */
+
diff -r d5dbadfb6161 -r 62d2ebb8d23b src/xs_internal.c
--- a/src/xs_internal.c Wed Apr 02 13:13:06 2008 +0900
+++ b/src/xs_internal.c Tue Jan 27 03:13:46 2009 +0900
@@ -336,7 +336,11 @@
#ifdef PROXY
priv->xshandle = xs_daemon_open_readonly();
#else
+#ifdef RBAC
+ if ((getuid != 0) || (flags & VIR_CONNECT_RO))
+#else
if (flags & VIR_CONNECT_RO)
+#endif
priv->xshandle = xs_daemon_open_readonly();
else
priv->xshandle = xs_daemon_open();
@@ -348,7 +352,11 @@
* is rather normal, this should fallback to the proxy (or
* remote) mechanism.
*/
+#ifdef RBAC
+ if (!(flags & VIR_CONNECT_RO)) {
+#else
if (getuid() == 0) {
+#endif
virXenStoreError(NULL, VIR_ERR_NO_XEN,
_("failed to connect to Xen Store"));
}
diff -r d5dbadfb6161 -r 62d2ebb8d23b tests/Makefile.in
--- a/tests/Makefile.in Wed Apr 02 13:13:06 2008 +0900
+++ b/tests/Makefile.in Tue Jan 27 03:13:46 2009 +0900
@@ -387,6 +387,7 @@
LIBXML_CFLAGS = @LIBXML_CFLAGS@
LIBXML_LIBS = @LIBXML_LIBS@
LN_S = @LN_S@
+LIBXENRBAC = -lxenrbac
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
@@ -693,37 +694,37 @@
done
conftest$(EXEEXT): $(conftest_OBJECTS) $(conftest_DEPENDENCIES)
@rm -f conftest$(EXEEXT)
- $(LINK) $(conftest_OBJECTS) $(conftest_LDADD) $(LIBS)
+ $(LINK) $(conftest_OBJECTS) $(conftest_LDADD) $(LIBS) $(LIBXENRBAC)
nodeinfotest$(EXEEXT): $(nodeinfotest_OBJECTS) $(nodeinfotest_DEPENDENCIES)
@rm -f nodeinfotest$(EXEEXT)
- $(LINK) $(nodeinfotest_OBJECTS) $(nodeinfotest_LDADD) $(LIBS)
+ $(LINK) $(nodeinfotest_OBJECTS) $(nodeinfotest_LDADD) $(LIBS) $(LIBXENRBAC)
qemuxml2argvtest$(EXEEXT): $(qemuxml2argvtest_OBJECTS) $(qemuxml2argvtest_DEPENDENCIES)
@rm -f qemuxml2argvtest$(EXEEXT)
- $(LINK) $(qemuxml2argvtest_OBJECTS) $(qemuxml2argvtest_LDADD) $(LIBS)
+ $(LINK) $(qemuxml2argvtest_OBJECTS) $(qemuxml2argvtest_LDADD) $(LIBS) $(LIBXENRBAC)
qemuxml2xmltest$(EXEEXT): $(qemuxml2xmltest_OBJECTS) $(qemuxml2xmltest_DEPENDENCIES)
@rm -f qemuxml2xmltest$(EXEEXT)
- $(LINK) $(qemuxml2xmltest_OBJECTS) $(qemuxml2xmltest_LDADD) $(LIBS)
+ $(LINK) $(qemuxml2xmltest_OBJECTS) $(qemuxml2xmltest_LDADD) $(LIBS) $(LIBXENRBAC)
reconnect$(EXEEXT): $(reconnect_OBJECTS) $(reconnect_DEPENDENCIES)
@rm -f reconnect$(EXEEXT)
- $(LINK) $(reconnect_OBJECTS) $(reconnect_LDADD) $(LIBS)
+ $(LINK) $(reconnect_OBJECTS) $(reconnect_LDADD) $(LIBS) $(LIBXENRBAC)
sexpr2xmltest$(EXEEXT): $(sexpr2xmltest_OBJECTS) $(sexpr2xmltest_DEPENDENCIES)
@rm -f sexpr2xmltest$(EXEEXT)
- $(LINK) $(sexpr2xmltest_OBJECTS) $(sexpr2xmltest_LDADD) $(LIBS)
+ $(LINK) $(sexpr2xmltest_OBJECTS) $(sexpr2xmltest_LDADD) $(LIBS) $(LIBXENRBAC)
virshtest$(EXEEXT): $(virshtest_OBJECTS) $(virshtest_DEPENDENCIES)
@rm -f virshtest$(EXEEXT)
- $(LINK) $(virshtest_OBJECTS) $(virshtest_LDADD) $(LIBS)
+ $(LINK) $(virshtest_OBJECTS) $(virshtest_LDADD) $(LIBS) $(LIBXENRBAC)
xencapstest$(EXEEXT): $(xencapstest_OBJECTS) $(xencapstest_DEPENDENCIES)
@rm -f xencapstest$(EXEEXT)
- $(LINK) $(xencapstest_OBJECTS) $(xencapstest_LDADD) $(LIBS)
+ $(LINK) $(xencapstest_OBJECTS) $(xencapstest_LDADD) $(LIBS) $(LIBXENRBAC)
xmconfigtest$(EXEEXT): $(xmconfigtest_OBJECTS) $(xmconfigtest_DEPENDENCIES)
@rm -f xmconfigtest$(EXEEXT)
- $(LINK) $(xmconfigtest_OBJECTS) $(xmconfigtest_LDADD) $(LIBS)
+ $(LINK) $(xmconfigtest_OBJECTS) $(xmconfigtest_LDADD) $(LIBS) $(LIBXENRBAC)
xml2sexprtest$(EXEEXT): $(xml2sexprtest_OBJECTS) $(xml2sexprtest_DEPENDENCIES)
@rm -f xml2sexprtest$(EXEEXT)
- $(LINK) $(xml2sexprtest_OBJECTS) $(xml2sexprtest_LDADD) $(LIBS)
+ $(LINK) $(xml2sexprtest_OBJECTS) $(xml2sexprtest_LDADD) $(LIBS) $(LIBXENRBAC)
xmlrpctest$(EXEEXT): $(xmlrpctest_OBJECTS) $(xmlrpctest_DEPENDENCIES)
@rm -f xmlrpctest$(EXEEXT)
- $(LINK) $(xmlrpctest_OBJECTS) $(xmlrpctest_LDADD) $(LIBS)
+ $(LINK) $(xmlrpctest_OBJECTS) $(xmlrpctest_LDADD) $(LIBS) $(LIBXENRBAC)
mostlyclean-compile:
-rm -f *.$(OBJEXT)