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

Osier Yang jyang at redhat.com
Fri Sep 13 10:10:14 UTC 2013


On 13/09/13 05:53, 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
>
> tools/virsh-domain-monitor.c
>     * Introduce new command : net-dhcp-leases
>       Example Usage: net-dhcp-leases <network> [mac]
>
>       virsh # net-dhcp-leases default
>
>       Expiry Time          MAC address          Protocol   IP address           Hostname     ClientId
>       ------------------------------------------------------------------------------------------------
>       13-09-2013 03:45:31  52:54:00:20:70:3d    ipv4       192.168.105.240/24    f18          *
>       13-09-2013 03:32:31  52:54:00:b1:70:19    ipv4       192.168.105.201/24    LDAP         *
>
> tools/virsh.pod
>     * Document new command
>
> ---
>   tools/virsh-network.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++
>   tools/virsh.pod       |   6 +++
>   2 files changed, 107 insertions(+)
>
> diff --git a/tools/virsh-network.c b/tools/virsh-network.c
> index 8ddd5ca..571bf2e 100644
> --- a/tools/virsh-network.c
> +++ b/tools/virsh-network.c
> @@ -1129,6 +1129,101 @@ cmdNetworkEdit(vshControl *ctl, const vshCmd *cmd)
>   
>       return ret;
>   }
> +/*
> + * "net-dhcp-leases" command
> + */
> +static const vshCmdInfo info_network_dhcp_leases[] = {
> +    {.name = "help",
> +     .data = N_("Print lease info for a given network")
> +    },
> +    {.name = "desc",
> +     .data = N_("Print lease info for a given network")
> +    },
> +    {.name = NULL}
> +};
> +
> +static const vshCmdOptDef opts_network_dhcp_leases[] = {
> +    {.name = "network",
> +     .type = VSH_OT_DATA,
> +     .flags = VSH_OFLAG_REQ,
> +     .help = N_("network name or uuid")
> +    },
> +    {.name = "mac",
> +     .type = VSH_OT_DATA,
> +     .flags = VSH_OFLAG_NONE,
> +     .help = N_("MAC address")
> +    },
> +    {.name = NULL}
> +};
> +
> +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)
> +        goto cleanup;

If you "return false;" here

> +
> +    if (!(network = vshCommandOptNetworkBy(ctl, cmd, &name,
> +                                           VSH_BYNAME | VSH_BYUUID)))
> +        goto cleanup;

and here. Then you can call virNetworkFree directly at "cleanup" label,
without the checking.

> +
> +    nleases = mac ? virNetworkGetDHCPLeasesForMAC(network, mac, &leases, flags)
> +        :virNetworkGetDHCPLeases(network, &leases, flags);

: virNetoworkGetDHCPLeases(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++) {
> +        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);
> +
> +        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,
> +                      lease->prefix, lease->hostname, lease->clientid);
> +    }
> +
> +    ret = true;
> +
> +cleanup:
> +    if (leases) {
> +        for (i = 0; i < nleases; i++)
> +            virNetworkDHCPLeaseFree(leases[i]);
> +    }
> +    VIR_FREE(leases);
> +    if (network)
> +        virNetworkFree(network);
> +    return ret;
> +}
>   
>   const vshCmdDef networkCmds[] = {
>       {.name = "net-autostart",
> @@ -1209,5 +1304,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
> +    },
>       {.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>
> +
> +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




More information about the libvir-list mailing list