---
 tools/virsh-domain.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 102 insertions(+)

diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index f3da1d5..c72b078 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -8491,6 +8491,107 @@ cleanup:
     return ret;
 }
 
+static const vshCmdInfo info_domifaddrs[] = {
+    {"help", N_("Dump domain's IP addresses and other interfaces info")},
+    {"desc", N_("Dump domain's IP addresses and other interfaces info")},
+    {NULL, NULL}
+};
+
+static const vshCmdOptDef opts_domifaddrs[] = {
+    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")},
+    {"interface", VSH_OT_STRING, 0, N_("Limit selection just to one 
interface")},
+    {"method", VSH_OT_STRING, 0, N_("Use one method: default, agent, 
nwfilter")},
+    {NULL, 0, 0, NULL}
+};
+
+static bool
+cmdDomIfAddrs(vshControl *ctl, const vshCmd *cmd)
+{
+    virDomainPtr dom = NULL;
+    bool ret = false;
+    unsigned int flags = 0;
+    const char *device = NULL;
+    const char *methodStr = NULL;
+    int method = VIR_DOMAIN_INTERFACE_ADDRS_DEFAULT;
+    virDomainInterfacePtr ifaces = NULL;
+    int i, j, ifacesCount = 0;
+
+    if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
+        goto cleanup;
+
+    if (vshCommandOptString(cmd, "interface", &device) < 0) {
+        vshError(ctl, _("Unable to parse interface parameter"));
+        goto cleanup;
+    }
+
+    if (vshCommandOptString(cmd, "method", &methodStr) < 0) {
+        vshError(ctl, _("Unable to parse method parameter"));
+        goto cleanup;
+    }
+
+    if (STREQ_NULLABLE(methodStr, "default"))
+        method = VIR_DOMAIN_INTERFACE_ADDRS_DEFAULT;
+    else if (STREQ_NULLABLE(methodStr, "agent"))
+        method = VIR_DOMAIN_INTERFACE_ADDRS_GUEST_AGENT;
+    else if (STREQ_NULLABLE(methodStr, "nwfilter"))
+        method = VIR_DOMAIN_INTERFACE_ADDRS_NWFILTER;
+    else if (methodStr) {
+        vshError(ctl, _("Unknown method: %s"), methodStr);
+        goto cleanup;
+    }
+
+    ifacesCount = virDomainInterfacesAddresses(dom, &ifaces, method, flags);
+    if (ifacesCount < 0)
+        goto cleanup;
+
+    vshPrintExtra(ctl, " %-10s %-17s    %s\n%s\n",
+                  _("Name"), _("HW address"), _("IP address"),
+                  "---------------------------------------------------");
+    for (i = 0; i < ifacesCount; i++) {
+        virDomainInterfacePtr iface = &(ifaces[i]);
+        virBuffer buf = VIR_BUFFER_INITIALIZER;
+        const char *hwaddr = "";
+        const char *ipAddrStr = NULL;
+
+        if (device && STRNEQ(device, iface->name))
+            continue;
+
+        if (iface->hwaddr)
+            hwaddr = iface->hwaddr;
+
+        for (j = 0; j < iface->ip_addrs_count; j++) {
+            const char *type = "";
+            if (iface->ip_addrs[j].type == VIR_IP_ADDR_TYPE_IPV4)
+                type = "inet ";
+            else if (iface->ip_addrs[j].type == VIR_IP_ADDR_TYPE_IPV6)
+                type = "inet6 ";
+            if (j)
+                virBufferAddChar(&buf, ' ');
+            virBufferAsprintf(&buf, "%s%s/%d",
+                              type,
+                              iface->ip_addrs[j].addr,
+                              iface->ip_addrs[j].prefix);
+        }
+
+        ipAddrStr = virBufferContentAndReset(&buf);
+
+        if (!ipAddrStr)
+            ipAddrStr = "";
+
+        vshPrintExtra(ctl, " %-10s %-17s    %s\n",
+                      iface->name, hwaddr, ipAddrStr);
+
+        VIR_FREE(ipAddrStr);
+    }
+
+    ret = true;
+cleanup:
+    virDomainInterfaceFree(ifaces, ifacesCount);
+    if (dom)
+        virDomainFree(dom);
+    return ret;
+}
+
 const vshCmdDef domManagementCmds[] = {
     {"attach-device", cmdAttachDevice, opts_attach_device,
      info_attach_device, 0},
@@ -8527,6 +8628,7 @@ const vshCmdDef domManagementCmds[] = {
     {"domhostname", cmdDomHostname, opts_domhostname, info_domhostname, 0},
     {"domid", cmdDomid, opts_domid, info_domid, 0},
     {"domif-setlink", cmdDomIfSetLink, opts_domif_setlink, info_domif_setlink, 
0},
+    {"domifaddrs", cmdDomIfAddrs, opts_domifaddrs, info_domifaddrs, 0},
     {"domiftune", cmdDomIftune, opts_domiftune, info_domiftune, 0},
     {"domjobabort", cmdDomjobabort, opts_domjobabort, info_domjobabort, 0},
     {"domjobinfo", cmdDomjobinfo, opts_domjobinfo, info_domjobinfo, 0},
-- 
1.8.0.2

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to