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