From 753c6c9c75c1eeb70a034db4100d93e669203128 Mon Sep 17 00:00:00 2001 From: Laine Stump Date: Wed, 28 Oct 2009 10:40:54 +0100 Subject: [PATCH] Support reporting live interface IP/netmask This patch adds the flag VIR_INTERFACE_XML_INACTIVE to virInterfaceGetXMLDesc's flags. When it is*not* set (the default), the live interface info will be returned in the XML (in particular, the IP address(es) and netmask(s) will be retrieved by querying the interface directly, rather than reporting what's in the config file). The backend of this is in netcf's ncf_if_xml_state() function. * configure.in libvirt.spec.in: requires netcf >= 0.1.3 * include/libvirt/libvirt.h.in: adds flag VIR_INTERFACE_XML_INACTIVE * src/conf/interface_conf.c src/interface/netcf_driver.c src/libvirt.c: update the parsing and backend routines accordingly * tools/virsh.c: change interface edit to inactive definition and adds the inactive flag for interface dump --- configure.in | 2 +- include/libvirt/libvirt.h.in | 4 +++ libvirt.spec.in | 2 +- src/conf/interface_conf.c | 53 ++++++++++++++++-------------------- src/interface/netcf_driver.c | 8 ++++-- src/libvirt.c | 15 +++++++--- tools/virsh.c | 10 +++++-- 7 files changed, 55 insertions(+), 39 deletions(-) diff --git a/configure.in b/configure.in index 5987211b81..b7d0d7b29e 100644 --- a/configure.in +++ b/configure.in @@ -33,7 +33,7 @@ GNUTLS_REQUIRED="1.0.25" AVAHI_REQUIRED="0.6.0" POLKIT_REQUIRED="0.6" PARTED_REQUIRED="1.8.0" -NETCF_REQUIRED="0.0.1" +NETCF_REQUIRED="0.1.3" dnl Checks for C compiler. AC_PROG_CC diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 6186d4e02f..7e75bee3f3 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -930,6 +930,10 @@ virInterfacePtr virInterfaceLookupByMACString (virConnectPtr conn, const char* virInterfaceGetName (virInterfacePtr iface); const char* virInterfaceGetMACString (virInterfacePtr iface); +typedef enum { + VIR_INTERFACE_XML_INACTIVE = 1 /* dump inactive interface information */ +} virInterfaceXMLFlags; + char * virInterfaceGetXMLDesc (virInterfacePtr iface, unsigned int flags); virInterfacePtr virInterfaceDefineXML (virConnectPtr conn, diff --git a/libvirt.spec.in b/libvirt.spec.in index 7e1550e75e..9238bdd7e8 100644 --- a/libvirt.spec.in +++ b/libvirt.spec.in @@ -308,7 +308,7 @@ BuildRequires: libcap-ng-devel >= 0.5.0 BuildRequires: libssh2-devel %endif %if %{with_netcf} -BuildRequires: netcf-devel +BuildRequires: netcf-devel >= 0.1.3 %endif # Fedora build root suckage diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c index 540c9319f8..d46f7ac28a 100644 --- a/src/conf/interface_conf.c +++ b/src/conf/interface_conf.c @@ -279,22 +279,19 @@ virInterfaceDefParseIp(virConnectPtr conn, virInterfaceDefPtr def, static int virInterfaceDefParseProtoIPv4(virConnectPtr conn, virInterfaceDefPtr def, xmlXPathContextPtr ctxt) { - xmlNodePtr cur; - int ret; + xmlNodePtr dhcp, ip; + int ret = 0; - cur = virXPathNode(conn, "./dhcp", ctxt); - if (cur != NULL) - ret = virInterfaceDefParseDhcp(conn, def, cur, ctxt); - else { - cur = virXPathNode(conn, "./ip", ctxt); - if (cur != NULL) - ret = virInterfaceDefParseIp(conn, def, cur, ctxt); - else { - virInterfaceReportError(conn, VIR_ERR_XML_ERROR, - "%s", _("interface miss dhcp or ip adressing")); - ret = -1; - } - } + dhcp = virXPathNode(conn, "./dhcp", ctxt); + if (dhcp != NULL) + ret = virInterfaceDefParseDhcp(conn, def, dhcp, ctxt); + + if (ret != 0) + return(ret); + + ip = virXPathNode(conn, "./ip", ctxt); + if (ip != NULL) + ret = virInterfaceDefParseIp(conn, def, ip, ctxt); return(ret); } @@ -1012,20 +1009,18 @@ virInterfaceProtocolDefFormat(virConnectPtr conn ATTRIBUTE_UNUSED, virBufferAddLit(buf, " \n"); else virBufferAddLit(buf, " \n"); - } else { - /* theorically if we don't have dhcp we should have an address */ - if (def->proto.address != NULL) { - if (def->proto.prefix != 0) - virBufferVSprintf(buf, " \n", - def->proto.address, def->proto.prefix); - else - virBufferVSprintf(buf, " \n", - def->proto.address); - } - if (def->proto.gateway != NULL) { - virBufferVSprintf(buf, " \n", - def->proto.gateway); - } + } + if (def->proto.address != NULL) { + if (def->proto.prefix != 0) + virBufferVSprintf(buf, " \n", + def->proto.address, def->proto.prefix); + else + virBufferVSprintf(buf, " \n", + def->proto.address); + } + if (def->proto.gateway != NULL) { + virBufferVSprintf(buf, " \n", + def->proto.gateway); } virBufferAddLit(buf, " \n"); return(0); diff --git a/src/interface/netcf_driver.c b/src/interface/netcf_driver.c index ca14fb06ef..b5c3664c91 100644 --- a/src/interface/netcf_driver.c +++ b/src/interface/netcf_driver.c @@ -326,7 +326,7 @@ cleanup: } static char *interfaceGetXMLDesc(virInterfacePtr ifinfo, - unsigned int flags ATTRIBUTE_UNUSED) + unsigned int flags) { struct interface_driver *driver = ifinfo->conn->interfacePrivateData; struct netcf_if *iface = NULL; @@ -342,7 +342,11 @@ static char *interfaceGetXMLDesc(virInterfacePtr ifinfo, goto cleanup; } - xmlstr = ncf_if_xml_desc(iface); + if ((flags & VIR_INTERFACE_XML_INACTIVE)) { + xmlstr = ncf_if_xml_desc(iface); + } else { + xmlstr = ncf_if_xml_state(iface); + } if (!xmlstr) { const char *errmsg, *details; int errcode = ncf_error(driver->netcf, &errmsg, &details); diff --git a/src/libvirt.c b/src/libvirt.c index b0b67c2409..2c5079088c 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -6201,10 +6201,17 @@ virInterfaceGetMACString(virInterfacePtr iface) /** * virInterfaceGetXMLDesc: * @iface: an interface object - * @flags: an OR'ed set of extraction flags, not used yet + * @flags: an OR'ed set of extraction flags. Current valid bits: + * + * VIR_INTERFACE_XML_INACTIVE - return the static configuration, + * suitable for use redefining the + * interface via virInterfaceDefineXML() * - * Provide an XML description of the interface. The description may be reused - * later to redefine the interface with virInterfaceDefineXML(). + * Provide an XML description of the interface. If + * VIR_INTERFACE_XML_INACTIVE is set, the description may be reused + * later to redefine the interface with virInterfaceDefineXML(). If it + * is not set, the ip address and netmask will be the current live + * setting of the interface, not the settings from the config files. * * Returns a 0 terminated UTF-8 encoded XML instance, or NULL in case of error. * the caller must free() the returned value. @@ -6221,7 +6228,7 @@ virInterfaceGetXMLDesc(virInterfacePtr iface, unsigned int flags) virLibInterfaceError(NULL, VIR_ERR_INVALID_INTERFACE, __FUNCTION__); return (NULL); } - if (flags != 0) { + if ((flags & ~VIR_INTERFACE_XML_INACTIVE) != 0) { virLibInterfaceError(iface, VIR_ERR_INVALID_ARG, __FUNCTION__); goto error; } diff --git a/tools/virsh.c b/tools/virsh.c index 6b93405ef0..5ddbcb9ca2 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -2792,7 +2792,7 @@ cmdInterfaceEdit (vshControl *ctl, const vshCmd *cmd) char *doc = NULL; char *doc_edited = NULL; char *doc_reread = NULL; - int flags = 0; + int flags = VIR_INTERFACE_XML_INACTIVE; if (!vshConnectionUsability(ctl, ctl->conn, TRUE)) goto cleanup; @@ -3326,6 +3326,7 @@ static const vshCmdInfo info_interface_dumpxml[] = { static const vshCmdOptDef opts_interface_dumpxml[] = { {"interface", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("interface name or MAC address")}, + {"inactive", VSH_OT_BOOL, 0, gettext_noop("show inactive defined XML")}, {NULL, 0, 0, NULL} }; @@ -3335,6 +3336,11 @@ cmdInterfaceDumpXML(vshControl *ctl, const vshCmd *cmd) virInterfacePtr iface; int ret = TRUE; char *dump; + int flags = 0; + int inactive = vshCommandOptBool(cmd, "inactive"); + + if (inactive) + flags |= VIR_INTERFACE_XML_INACTIVE; if (!vshConnectionUsability(ctl, ctl->conn, TRUE)) return FALSE; @@ -3342,7 +3348,7 @@ cmdInterfaceDumpXML(vshControl *ctl, const vshCmd *cmd) if (!(iface = vshCommandOptInterface(ctl, cmd, NULL))) return FALSE; - dump = virInterfaceGetXMLDesc(iface, 0); + dump = virInterfaceGetXMLDesc(iface, flags); if (dump != NULL) { printf("%s", dump); free(dump); -- GitLab