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