<div dir="ltr"><br><br><br>On Sat, Aug 24, 2013 at 6:46 AM, Doug Goldstein <<a href="mailto:cardoe@gentoo.org">cardoe@gentoo.org</a>> wrote:<br>><br>> On Fri, Aug 23, 2013 at 10:45 AM, Nehal J Wani <<a href="mailto:nehaljw.kkd1@gmail.com">nehaljw.kkd1@gmail.com</a>> wrote:<br>
>><br>>><br>>><br>>><br>>> On Fri, Aug 23, 2013 at 8:16 PM, Doug Goldstein <<a href="mailto:cardoe@gentoo.org">cardoe@gentoo.org</a>> wrote:<br>>> ><br>>> > On Thu, Aug 22, 2013 at 5:18 PM, nehaljwani <<a href="mailto:nehaljw.kkd1@gmail.com">nehaljw.kkd1@gmail.com</a>> wrote:<br>
>> >><br>>> >> Use virDomainInterfacesAddresses in virsh<br>>> >><br>>> >> tools/virsh-domain-monitor.c<br>>> >> * Introduce new command : domifaddr<br>>> >><br>
>> >> virsh # domifaddr f18<br>>> >> Name MAC address IP address<br>>> >> ---------------------------------------------------<br>>> >> lo 00:00:00:00:00:00 <a href="http://127.0.0.1/8">127.0.0.1/8</a> ::1/128<br>
>> >> eth0 52:54:00:89:ad:35 <a href="http://192.168.102.142/24">192.168.102.142/24</a> fe80::5054:ff:fe89:ad35/64<br>>> >> eth1 52:54:00:d3:39:ee <a href="http://192.168.103.183/24">192.168.103.183/24</a> fe80::5054:ff:fed3:39ee/64<br>
>> >> eth2 52:54:00:fe:4c:4f <a href="http://192.168.101.197/24">192.168.101.197/24</a> fe80::5054:ff:fefe:4c4f/64<br>>> >> eth3 52:54:00:89:4e:97 <a href="http://192.168.101.130/24">192.168.101.130/24</a> fe80::5054:ff:fe89:4e97/64<br>
>> >><br>>> ><br>>> > 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?<br>>> > <br>>> >><br>
>> >> tools/virsh.pod<br>>> >> * Document new command<br>>> >><br>>> >> ---<br>>> >> tools/virsh-domain-monitor.c | 99 ++++++++++++++++++++++++++++++++++++++++++++<br>
>> >> tools/virsh.pod | 10 +++++<br>>> >> 2 files changed, 109 insertions(+)<br>>> >><br>>> >> diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c<br>
>> >> index b29b82a..91efa71 100644<br>>> >> --- a/tools/virsh-domain-monitor.c<br>>> >> +++ b/tools/virsh-domain-monitor.c<br>>> >> @@ -1871,6 +1871,99 @@ cleanup:<br>>> >> }<br>
>> >> #undef FILTER<br>>> >><br>>> >> +/* "domifaddr" command<br>>> >> + */<br>>> >> +static const vshCmdInfo info_domifaddr[] = {<br>>> >> + {"help", N_("Get network interfaces' addresses for a running domain")},<br>
>> >> + {"desc", N_("Get network interfaces' addresses for a running domain")},<br>>> >> + {NULL, NULL}<br>>> >> +};<br>>> >> +<br>>> >> +static const vshCmdOptDef opts_domifaddr[] = {<br>
>> >> + {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")},<br>>> >> + {"interface", VSH_OT_DATA, VSH_OFLAG_NONE, N_("network interface name")},<br>
>> >> + {NULL, 0, 0, NULL}<br>>> >> +};<br>>> >> +<br>>> >> +static bool<br>>> >> +cmdDomIfAddr(vshControl *ctl, const vshCmd *cmd)<br>>> >> +{<br>
>> >> + virDomainPtr dom = NULL;<br>>> >> + const char *interface = NULL;<br>>> >> + virDomainInterfacePtr *ifaces = NULL;<br>>> >> + size_t i, j;<br>>> >> + int ifaces_count = 0;<br>
>> >> + unsigned int flags = 0;<br>>> >> + bool ret = false;<br>>> >> +<br>>> >> + if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))<br>>> >> + return false;<br>
>> >> +<br>>> >> + if (vshCommandOptString(cmd, "interface", &interface) < 0) {<br>>> >> + goto cleanup;<br>>> >> + }<br>>> >> +<br>
>> >> + if ((ifaces_count = virDomainInterfacesAddresses(dom, &ifaces, flags)) < 0) {<br>>> >> + vshError(ctl, _("Failed to query for interfaces addresses"));<br>>> >> + goto cleanup;<br>
>> >> + }<br>>> >> +<br>>> >> + vshPrintExtra(ctl, " %-10s %-17s %s\n%s\n",<br>>> >> + _("Name"), _("MAC address"), _("IP address"),<br>
>> >> + "---------------------------------------------------");<br>>> >> +<br>>> >> + for (i = 0; i < ifaces_count; i++) {<br>>> >> + virDomainInterfacePtr iface = ifaces[i];<br>
>> >> + virBuffer buf = VIR_BUFFER_INITIALIZER;<br>>> >> + const char *hwaddr = "";<br>>> >> + const char *ip_addr_str = NULL;<br>>> >> +<br>>> >> + if (interface && STRNEQ(interface, iface->name)) {<br>
>> >> + virBufferFreeAndReset(&buf);<br>>> >> + continue;<br>>> >> + }<br>>> >> +<br>>> >> + if (iface->hwaddr)<br>>> >> + hwaddr = iface->hwaddr;<br>
>> >> +<br>>> >> + for (j = 0; j < iface->naddrs; j++) {<br>>> >> + if (j)<br>>> >> + virBufferAddChar(&buf, ' ');<br>>> >> + virBufferAsprintf(&buf, "%s/%d",<br>
>> >> + iface->addrs[j].addr,<br>>> >> + iface->addrs[j].prefix);<br>>> >> + }<br>>> >> +<br>>> >> + if (virBufferError(&buf)) {<br>
>> >> + virBufferFreeAndReset(&buf);<br>>> >> + virReportOOMError();<br>>> >> + return ret;<br>>> >> + }<br>>> >> +<br>
>> >> + ip_addr_str = virBufferContentAndReset(&buf);<br>>> >> +<br>>> >> + if (!ip_addr_str)<br>>> >> + ip_addr_str = "";<br>>> >> +<br>
>> >> + vshPrintExtra(ctl, " %-10s %-17s %s\n",<br>>> >> + iface->name, hwaddr, ip_addr_str);<br>>> >> +<br>>> >> + virBufferFreeAndReset(&buf);<br>
>> >> + }<br>>> >> +<br>>> >> + ret = true;<br>>> >> +<br>>> >> +cleanup:<br>>> >> + for (i = 0; i < ifaces_count; i++) {<br>>> >> + if (ifaces[i])<br>
>> >> + virDomainInterfaceFree(ifaces[i]);<br>>> >> + }<br>>> >> + VIR_FREE(ifaces);<br>>> >> +<br>>> >> + virDomainFree(dom);<br>>> >> + return ret;<br>
>> >> +}<br>>> >> +<br>>> >> const vshCmdDef domMonitoringCmds[] = {<br>>> >> {.name = "domblkerror",<br>>> >> .handler = cmdDomBlkError,<br>
>> >> @@ -1944,5 +2037,11 @@ const vshCmdDef domMonitoringCmds[] = {<br>>> >> .info = info_list,<br>>> >> .flags = 0<br>>> >> },<br>>> >> + {.name = "domifaddr",<br>
>> >> + .handler = cmdDomIfAddr,<br>>> >> + .opts = opts_domifaddr,<br>>> >> + .info = info_domifaddr,<br>>> >> + .flags = 0<br>>> >> + },<br>
>> >> {.name = NULL}<br>>> >> };<br>>> >> diff --git a/tools/virsh.pod b/tools/virsh.pod<br>>> >> index 0ae5178..008ffea 100644<br>>> >> --- a/tools/virsh.pod<br>
>> >> +++ b/tools/virsh.pod<br>>> >> @@ -636,6 +636,16 @@ B<Explanation of fields> (fields appear in the following order):<br>>> >> flush_total_times - total time flush operations took (ns)<br>
>> >> <-- other fields provided by hypervisor --><br>>> >><br>>> >> +<br>>> >> +=item B<domifaddr> I<domain> [I<interface>]<br>>> >> +<br>
>> >> +Get a list of interfaces of a running domain along with their IP and MAC<br>>> >> +addresses, or limited output just for one interface if I<interface> is<br>>> >> +specified. Note, that I<interface> can be driver dependent, it can be<br>
>> >> +the name within guest OS or the name you would see in domain XML.<br>>> >> +Moreover, the whole command may require a guest agent to be configured<br>>> >> +for the queried domain under some drivers, notably qemu.<br>
>> >> +<br>>> >> =item B<domifstat> I<domain> I<interface-device><br>>> >><br>>> >> Get network interface stats for a running domain.<br>>> >> --<br>
>> >> 1.7.11.7<br>>> >><br>>> >> --<br>>> >> libvir-list mailing list<br>>> >> <a href="mailto:libvir-list@redhat.com">libvir-list@redhat.com</a><br>>> >> <a href="https://www.redhat.com/mailman/listinfo/libvir-list">https://www.redhat.com/mailman/listinfo/libvir-list</a><br>
>> ><br>>> ><br>>> ><br>>> ><br>>> > --<br>>> > Doug Goldstein<br>>><br>>><br>>> The leases method will be applied to this API when virNetworkGetDHCPLeases() API is accepted, which is the next step after this. <br>
>> Refer: <a href="http://www.redhat.com/archives/libvir-list/2013-July/msg01603.html">http://www.redhat.com/archives/libvir-list/2013-July/msg01603.html</a> and its followups.<br>>><br>>> The output from the virNetworkGetDHCPLeases will be something of this kind:<br>
>><br>>> virsh # net-dhcp-leases default<br>>><br>>> Virtual Network Expiry Time MAC address IP address Hostname ClientId<br>>> ----------------------------------------------------------------------------------------------------<br>
>> default 16-08-2013 03:53:11 52:54:00:89:4e:97 192.168.101.130 f18 *<br>>> default 16-08-2013 03:45:20 52:54:00:fe:4c:4f 192.168.101.197 * *<br>>><br>
>><br>><br>> My question was how does virDomainInterfacesAddresses() and virsh domifaddr handle aliased IP addresses where the same interface and same MAC address have multiple IP addresses.<br>><div><br></div>
<div>Oh. I misread your question. In the case of aliases, it will be shown like this (one alias per line):</div><div><br></div><div><div>virsh # domifaddr f18</div><div> Name MAC address IPv4 address IPv6 address</div>
<div>---------------------------------------------------</div><div> lo 00:00:00:00:00:00 <a href="http://127.0.0.1/8">127.0.0.1/8</a> ::1/128</div><div> eth0 52:54:00:89:4e:97 <a href="http://192.168.101.130/24">192.168.101.130/24</a> fe80::5054:ff:fe89:4e97/64</div>
<div><div> eth0:2 52:54:00:89:4e:97 <a href="http://192.168.101.132/24">192.168.101.132/24</a></div><div> eth0:1 52:54:00:89:4e:97 <a href="http://192.168.101.133/24">192.168.101.133/24</a></div></div><div> eth1 52:54:00:89:ad:35 <a href="http://192.168.102.142/24">192.168.102.142/24</a> fe80::5054:ff:fe89:ad35/64</div>
<div><div> eth1:2 52:54:00:89:ad:35 <a href="http://192.168.102.143/24">192.168.102.143/24</a></div><div> eth2:0 52:54:00:d3:39:ee <a href="http://192.168.103.184/24">192.168.103.184/24</a></div></div><div> eth2 52:54:00:d3:39:ee <a href="http://192.168.103.183/24">192.168.103.183/24</a> fe80::5054:ff:fed3:39ee/64</div>
<div> eth2:1 52:54:00:d3:39:ee <a href="http://192.168.103.185/24">192.168.103.185/24</a><br></div><div> eth3 52:54:00:fe:4c:4f <a href="http://192.168.101.197/24">192.168.101.197/24</a> fe80::5054:ff:fefe:4c4f/64</div>
<div> eth3:1 52:54:00:fe:4c:4f <a href="http://192.168.101.198/24">192.168.101.198/24</a><br></div><div><br></div></div><div><br></div><div><br>><br>> --<br>> Doug Goldstein<br><br><br><br><br>--<br>Nehal J Wani<br>
UG3, BTech CS+MS(CL)<br>IIIT-Hyderabad<br><a href="http://commandlinewani.blogspot.com">http://commandlinewani.blogspot.com</a></div></div>