[libvirt] [PATCHv3 4/4] net-dhcp-leases: Add virsh support

Eric Blake eblake at redhat.com
Mon Sep 16 19:28:31 UTC 2013


On 09/15/2013 11:49 PM, Nehal J Wani wrote:
> Use virNetworkGetDHCPLeases and virNetworkGetDHCPLeasesForMAC in virsh.
> 
> The new feature supports the follwing methods:
> 
> 1. Retrieve leases info for a given virtual network
> 
> 2. Retrieve leases info for given network interface
> 

> +
> +static bool
> +cmdNetworkDHCPLeases(vshControl *ctl, const vshCmd *cmd)
> +{
> +    const char *name = NULL;
> +    const char *mac = NULL;
> +    virNetworkDHCPLeasesPtr *leases = NULL;
> +    int nleases = 0;
> +    bool ret = false;
> +    size_t i;
> +    unsigned int flags = 0;
> +    virNetworkPtr network = NULL;
> +
> +    if (vshCommandOptString(cmd, "mac", &mac) < 0)
> +        return false;
> +
> +    if (!(network = vshCommandOptNetworkBy(ctl, cmd, &name,
> +                                           VSH_BYNAME | VSH_BYUUID)))
> +        return false;

Just use vshCommandOptNetwork (no need to use the filtering of NetworkBy).

> +
> +    nleases = mac ? virNetworkGetDHCPLeasesForMAC(network, mac, &leases, flags)
> +        : virNetworkGetDHCPLeases(network, &leases, flags);
> +
> +    if (nleases < 0) {
> +        vshError(ctl, _("Failed to get leases info for %s"), name);
> +        goto cleanup;
> +    }
> +
> +    vshPrintExtra(ctl, " %-20s %-20s %-10s %-20s %-12s %s\n%s%s\n",
> +                  _("Expiry Time"), _("MAC address"), _("Protocol"),
> +                  _("IP address"), _("Hostname"), _("ClientId"),
> +                  "------------------------------------------------",
> +                  "------------------------------------------------");
> +
> +    for (i = 0; i < nleases; i++) {

Should you qsort() the list before printing it, to ensure that identical
MAC lines are grouped even if the driver didn't hand them back in any
particular order?

> +        const char *type = NULL;
> +        virNetworkDHCPLeasesPtr lease = leases[i];
> +        time_t expirytime_tmp = lease->expirytime;
> +        struct tm ts;
> +        char expirytime[32];
> +        ts = *localtime_r(&expirytime_tmp, &ts);
> +        strftime(expirytime, sizeof(expirytime), "%d-%m-%Y %H:%M:%S", &ts);

Please use ISO %Y-%m-%d, as it is sortable, and also has the benefit of
being unambiguous in both US and UK.

> +
> +        switch (lease->type) {
> +        case VIR_IP_ADDR_TYPE_IPV4:
> +            type = "ipv4";
> +            break;
> +        case VIR_IP_ADDR_TYPE_IPV6:
> +            type = "ipv6";
> +            break;
> +        }
> +
> +        vshPrintExtra(ctl, " %-20s %-20s %-10s %s/%-5d %-12s %s\n",
> +                      expirytime, lease->mac, type, lease->ipaddr,

If a third lease->type is introduced in a future libvirtd, then you risk
passing NULL to printf(%s).  Please use NULLSTR(type), so that you don't
crash on non-glibc systems.

> +                      lease->prefix, lease->hostname, lease->clientid);

Do we guarantee that ALL string fields of lease are populated with
non-NULL strings (even if the empty string), no matter what?  Or should
we revisit the docs in 1/4, and the RPC implementation of 2/4, to allow
for NULL strings for fields that aren't available?

> +    }
> +
> +    ret = true;
> +
> +cleanup:
> +    if (leases) {
> +        for (i = 0; i < nleases; i++)
> +            virNetworkDHCPLeaseFree(leases[i]);
> +    }
> +    VIR_FREE(leases);
> +    virNetworkFree(network);
> +    return ret;
> +}
>  
>  const vshCmdDef networkCmds[] = {
>      {.name = "net-autostart",
> @@ -1209,5 +1303,11 @@ const vshCmdDef networkCmds[] = {
>       .info = info_network_uuid,
>       .flags = 0
>      },
> +    {.name = "net-dhcp-leases",
> +     .handler = cmdNetworkDHCPLeases,
> +     .opts = opts_network_dhcp_leases,
> +     .info = info_network_dhcp_leases,
> +     .flags = 0

Not your fault, but we should be using trailing commas when doing C99
struct initialization.

> +    },
>      {.name = NULL}
>  };
> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index 0ae5178..b87f646 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> @@ -2325,6 +2325,12 @@ If I<--current> is specified, affect the current network state.
>  Both I<--live> and I<--config> flags may be given, but I<--current> is
>  exclusive. Not specifying any flag is the same as specifying I<--current>.
>  
> +=item B<net-dhcp-leases> I<network> I<mac>

List it as '[I<mac>]', to make it obvious the mac address is optional.

> +
> +Get a list of dhcp leases for all network interfaces connected to the given
> +virtual I<network> or limited output just for one interface if I<mac> is
> +specified.
> +
>  =back
>  
>  =head1 INTERFACE COMMANDS
> 

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 621 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20130916/991b1895/attachment-0001.sig>


More information about the libvir-list mailing list