<div dir="ltr"><br><br><br>On Fri, Aug 23, 2013 at 8:16 PM, Doug Goldstein <<a href="mailto:cardoe@gentoo.org" target="_blank">cardoe@gentoo.org</a>> wrote:<br>><br>> On Thu, Aug 22, 2013 at 5:18 PM, nehaljwani <<a href="mailto:nehaljw.kkd1@gmail.com" target="_blank">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" target="_blank">127.0.0.1/8</a> ::1/128<br>>>    eth0       52:54:00:89:ad:35    <a href="http://192.168.102.142/24" target="_blank">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" target="_blank">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" target="_blank">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" target="_blank">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" target="_blank">libvir-list@redhat.com</a><br>>> <a href="https://www.redhat.com/mailman/listinfo/libvir-list" target="_blank">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. <div>Refer: <a href="http://www.redhat.com/archives/libvir-list/2013-July/msg01603.html" target="_blank">http://www.redhat.com/archives/libvir-list/2013-July/msg01603.html</a> and its followups.</div>
<div><br></div><div>The output from the virNetworkGetDHCPLeases will be something of this kind:</div><div><br></div><div><span style="font-family:arial,sans-serif;font-size:13px">     virsh # net-dhcp-leases default</span><br style="font-family:arial,sans-serif;font-size:13px">
<br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">     Virtual Network   Expiry Time          MAC address          IP address        Hostname     ClientId</span><br style="font-family:arial,sans-serif;font-size:13px">
<span style="font-family:arial,sans-serif;font-size:13px">     ------------------------------</span><span style="font-family:arial,sans-serif;font-size:13px">------------------------------</span><span style="font-family:arial,sans-serif;font-size:13px">------------------------------</span><span style="font-family:arial,sans-serif;font-size:13px">----------</span><br style="font-family:arial,sans-serif;font-size:13px">
<span style="font-family:arial,sans-serif;font-size:13px">     default           16-08-2013 03:53:11  52:54:00:89:4e:97    192.168.101.130   f18          *</span><br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">     default           16-08-2013 03:45:20  52:54:00:fe:4c:4f    192.168.101.197   *            *</span><br style="font-family:arial,sans-serif;font-size:13px">

<div>
<br></div><div><br>--<br>Nehal J Wani<br>UG3, BTech CS+MS(CL)<br>IIIT-Hyderabad<br><a href="http://commandlinewani.blogspot.com" target="_blank">http://commandlinewani.blogspot.com</a></div></div></div>