diff options
author | Daniil Baturin <daniil@baturin.org> | 2018-09-04 19:47:43 +0200 |
---|---|---|
committer | Daniil Baturin <daniil@baturin.org> | 2018-09-04 19:47:43 +0200 |
commit | 2053539a7d532941e2cdbcc37fff26a1b9c95447 (patch) | |
tree | 68338ff3b367708da1feafab6db011047b63b4f0 /src/op_mode/show_dhcp.py | |
parent | 93f6b6a3b23f4169a4af4a23eb795d041be84e42 (diff) | |
download | vyos-1x-2053539a7d532941e2cdbcc37fff26a1b9c95447.tar.gz vyos-1x-2053539a7d532941e2cdbcc37fff26a1b9c95447.zip |
T823: extend the new DHCP op mode.
Diffstat (limited to 'src/op_mode/show_dhcp.py')
-rwxr-xr-x | src/op_mode/show_dhcp.py | 58 |
1 files changed, 57 insertions, 1 deletions
diff --git a/src/op_mode/show_dhcp.py b/src/op_mode/show_dhcp.py index 2084a9509..e76fc3a14 100755 --- a/src/op_mode/show_dhcp.py +++ b/src/op_mode/show_dhcp.py @@ -15,7 +15,9 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # +import json import argparse +import ipaddress import tabulate @@ -76,6 +78,24 @@ def show_leases(leases): print(output) +def get_pool_size(config, pool): + size = 0 + subnets = config.list_effective_nodes("service dhcp-server shared-network-name {0} subnet".format(pool)) + for s in subnets: + ranges = config.list_effective_nodes("service dhcp-server shared-network-name {0} subnet {1} range".format(pool, s)) + for r in ranges: + start = config.return_effective_value("service dhcp-server shared-network-name {0} subnet {1} range {2} start".format(pool, s, r)) + stop = config.return_effective_value("service dhcp-server shared-network-name {0} subnet {1} range {2} stop".format(pool, s, r)) + + size += int(ipaddress.IPv4Address(stop)) - int(ipaddress.IPv4Address(start)) + + return size + +def show_pool_stats(stats): + headers = ["Pool", "Size", "Leases", "Available", "Usage"] + output = tabulate.tabulate(stats, headers) + + print(output) if __name__ == '__main__': parser = argparse.ArgumentParser() @@ -86,6 +106,7 @@ if __name__ == '__main__': parser.add_argument("-e", "--expired", action="store_true", help="Show expired leases") parser.add_argument("-p", "--pool", type=str, action="store", help="Show lease for specific pool") + parser.add_argument("-j", "--json", action="store_true", default=False, help="Product JSON output") args = parser.parse_args() @@ -101,4 +122,39 @@ if __name__ == '__main__': else: leases = get_leases(lease_file, state='active') - show_leases(leases) + if args.json: + print(json.dumps(leases, indent=4)) + else: + show_leases(leases) + elif args.statistics: + config = vyos.config.Config() + + pools = [] + + # Get relevant pools + if args.pool: + pools = [args.pool] + else: + pools = config.list_effective_nodes("service dhcp-server shared-network-name") + + # Get pool usage stats + stats = [] + for p in pools: + size = get_pool_size(config, p) + leases = len(get_leases(lease_file, state='active', pool=args.pool)) + use_percentage = round(leases / size) * 100 + if args.json: + pool_stats = {"pool": p, "size": size, "leases": leases, + "available": (size - leases), "percentage": use_percentage} + else: + # For tabulate + pool_stats = [p, size, leases, size - leases, "{0}%".format(use_percentage)] + stats.append(pool_stats) + + # Print stats + if args.json: + print(json.dumps(stats, indent=4)) + else: + show_pool_stats(stats) + else: + print("Use either --leases or --statistics option") |