---
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