From b20b4e06f7f97d126e377fbc9adb3e67fd342be4 Mon Sep 17 00:00:00 2001 From: zero-88 Date: Wed, 24 Oct 2018 18:38:15 +0700 Subject: [PATCH] - Add CLI --- iptools/__init__.py | 2 ++ iptools/run.py | 49 +++++++++++++++++++++++++++++++++++++++++++++ setup.py | 5 +++++ 3 files changed, 56 insertions(+) create mode 100644 iptools/run.py diff --git a/iptools/__init__.py b/iptools/__init__.py index 8d21ce9..dfa19d2 100644 --- a/iptools/__init__.py +++ b/iptools/__init__.py @@ -128,6 +128,7 @@ class IpRange (Sequence): :param end: Ip address in dotted quad format or ``None``. :type end: str """ + def __init__(self, start, end=None): if end is None: if isinstance(start, IpRange): @@ -410,6 +411,7 @@ class IpRangeList (object): ``(start, end)`` tuples of ip addresses. :type \*args: list of str and/or tuple """ + def __init__(self, *args): self.ips = tuple(map(IpRange, args)) # end __init__ diff --git a/iptools/run.py b/iptools/run.py new file mode 100644 index 0000000..b462b6b --- /dev/null +++ b/iptools/run.py @@ -0,0 +1,49 @@ +#!/usr/bin/python + +import argparse +import logging +from iptools import IpRange, IpRangeList + + +parser = argparse.ArgumentParser() +parser.add_argument("-c", "--command", action="store", default="info", choices=["info", "in"], help="Command") +parser.add_argument("-i", "--ip", action="store", required=True, nargs='+', type=str, help="IP/CIDR address") +parser.add_argument("-v", "--verbose", action="store_true", help="Verbose log") +args = parser.parse_args() +logging.basicConfig(level=logging.DEBUG if args.verbose else logging.INFO, handlers=[logging.StreamHandler()], + format="%(asctime)s %(levelname)s %(name)s %(message)s") +logger = logging.getLogger("ip_tool") + +logger.debug("-" * 50) +logger.debug(args.command) +logger.debug(args.ip) +logger.debug("-" * 50) + + +def __convert(ips): + for ip in ips: + yield IpRange(ip) + + +def __check(source: IpRange, dest: IpRange)->bool: + logger.debug(source) + logger.debug(dest) + return dest[0] in source and dest[1] in source if len(dest) > 1 else True + + +try: + if args.command == "info": + ip_range = IpRange(args.ip[0], args.ip[1] if len(args.ip) > 1 else None) + logger.info("IP range: %s", ip_range) + logger.info("Size: %s", len(ip_range)) + else: + if len(args.ip) < 2: + raise AttributeError("At least 2 IPs") + gen = __convert(args.ip) + first_one = next(gen) + for i, n in enumerate(gen, 1): + logger.info("%s in %s: %s", args.ip[i], args.ip[0], __check(first_one, n)) + exit(0) +except Exception: + logger.error("Error when executing", exc_info=1) + exit(1) diff --git a/setup.py b/setup.py index 996ba0c..5a32389 100644 --- a/setup.py +++ b/setup.py @@ -52,6 +52,11 @@ class that can be used to include CIDR network blocks in Django's extras_require={ 'testing': tests_require, }, + entry_points={ + 'console_scripts': [ + 'iptool=iptools:run', + ], + }, ) # vim: set sw=4 ts=4 sts=4 et :