On Thu, Aug 22, 2013 at 5:18 PM, nehaljwani <nehaljw.k...@gmail.com> wrote:
> Use virDomainInterfacesAddresses in virsh > > tools/virsh-domain-monitor.c > * Introduce new command : domifaddr > > virsh # domifaddr f18 > Name MAC address IP address > --------------------------------------------------- > lo 00:00:00:00:00:00 127.0.0.1/8 ::1/128 > eth0 52:54:00:89:ad:35 > 192.168.102.142/24fe80::5054:ff:fe89:ad35/64 > eth1 52:54:00:d3:39:ee > 192.168.103.183/24fe80::5054:ff:fed3:39ee/64 > eth2 52:54:00:fe:4c:4f > 192.168.101.197/24fe80::5054:ff:fefe:4c4f/64 > eth3 52:54:00:89:4e:97 > 192.168.101.130/24fe80::5054:ff:fe89:4e97/64 > > Not a review, but a question. How does this work with IP aliases? Will it show all the aliases 1 per line or just show the primary address? > tools/virsh.pod > * Document new command > > --- > tools/virsh-domain-monitor.c | 99 > ++++++++++++++++++++++++++++++++++++++++++++ > tools/virsh.pod | 10 +++++ > 2 files changed, 109 insertions(+) > > diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c > index b29b82a..91efa71 100644 > --- a/tools/virsh-domain-monitor.c > +++ b/tools/virsh-domain-monitor.c > @@ -1871,6 +1871,99 @@ cleanup: > } > #undef FILTER > > +/* "domifaddr" command > + */ > +static const vshCmdInfo info_domifaddr[] = { > + {"help", N_("Get network interfaces' addresses for a running > domain")}, > + {"desc", N_("Get network interfaces' addresses for a running > domain")}, > + {NULL, NULL} > +}; > + > +static const vshCmdOptDef opts_domifaddr[] = { > + {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")}, > + {"interface", VSH_OT_DATA, VSH_OFLAG_NONE, N_("network interface > name")}, > + {NULL, 0, 0, NULL} > +}; > + > +static bool > +cmdDomIfAddr(vshControl *ctl, const vshCmd *cmd) > +{ > + virDomainPtr dom = NULL; > + const char *interface = NULL; > + virDomainInterfacePtr *ifaces = NULL; > + size_t i, j; > + int ifaces_count = 0; > + unsigned int flags = 0; > + bool ret = false; > + > + if (!(dom = vshCommandOptDomain(ctl, cmd, NULL))) > + return false; > + > + if (vshCommandOptString(cmd, "interface", &interface) < 0) { > + goto cleanup; > + } > + > + if ((ifaces_count = virDomainInterfacesAddresses(dom, &ifaces, > flags)) < 0) { > + vshError(ctl, _("Failed to query for interfaces addresses")); > + goto cleanup; > + } > + > + vshPrintExtra(ctl, " %-10s %-17s %s\n%s\n", > + _("Name"), _("MAC address"), _("IP address"), > + "---------------------------------------------------"); > + > + for (i = 0; i < ifaces_count; i++) { > + virDomainInterfacePtr iface = ifaces[i]; > + virBuffer buf = VIR_BUFFER_INITIALIZER; > + const char *hwaddr = ""; > + const char *ip_addr_str = NULL; > + > + if (interface && STRNEQ(interface, iface->name)) { > + virBufferFreeAndReset(&buf); > + continue; > + } > + > + if (iface->hwaddr) > + hwaddr = iface->hwaddr; > + > + for (j = 0; j < iface->naddrs; j++) { > + if (j) > + virBufferAddChar(&buf, ' '); > + virBufferAsprintf(&buf, "%s/%d", > + iface->addrs[j].addr, > + iface->addrs[j].prefix); > + } > + > + if (virBufferError(&buf)) { > + virBufferFreeAndReset(&buf); > + virReportOOMError(); > + return ret; > + } > + > + ip_addr_str = virBufferContentAndReset(&buf); > + > + if (!ip_addr_str) > + ip_addr_str = ""; > + > + vshPrintExtra(ctl, " %-10s %-17s %s\n", > + iface->name, hwaddr, ip_addr_str); > + > + virBufferFreeAndReset(&buf); > + } > + > + ret = true; > + > +cleanup: > + for (i = 0; i < ifaces_count; i++) { > + if (ifaces[i]) > + virDomainInterfaceFree(ifaces[i]); > + } > + VIR_FREE(ifaces); > + > + virDomainFree(dom); > + return ret; > +} > + > const vshCmdDef domMonitoringCmds[] = { > {.name = "domblkerror", > .handler = cmdDomBlkError, > @@ -1944,5 +2037,11 @@ const vshCmdDef domMonitoringCmds[] = { > .info = info_list, > .flags = 0 > }, > + {.name = "domifaddr", > + .handler = cmdDomIfAddr, > + .opts = opts_domifaddr, > + .info = info_domifaddr, > + .flags = 0 > + }, > {.name = NULL} > }; > diff --git a/tools/virsh.pod b/tools/virsh.pod > index 0ae5178..008ffea 100644 > --- a/tools/virsh.pod > +++ b/tools/virsh.pod > @@ -636,6 +636,16 @@ B<Explanation of fields> (fields appear in the > following order): > flush_total_times - total time flush operations took (ns) > <-- other fields provided by hypervisor --> > > + > +=item B<domifaddr> I<domain> [I<interface>] > + > +Get a list of interfaces of a running domain along with their IP and MAC > +addresses, or limited output just for one interface if I<interface> is > +specified. Note, that I<interface> can be driver dependent, it can be > +the name within guest OS or the name you would see in domain XML. > +Moreover, the whole command may require a guest agent to be configured > +for the queried domain under some drivers, notably qemu. > + > =item B<domifstat> I<domain> I<interface-device> > > Get network interface stats for a running domain. > -- > 1.7.11.7 > > -- > libvir-list mailing list > libvir-list@redhat.com > https://www.redhat.com/mailman/listinfo/libvir-list > -- Doug Goldstein
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list