pkgsrc-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[pkgsrc/trunk]: pkgsrc/textproc/py-isc_dhcp_leases py-isc_dhcp_leases: improv...



details:   https://anonhg.NetBSD.org/pkgsrc/rev/c65ee6f33f70
branches:  trunk
changeset: 458081:c65ee6f33f70
user:      gutteridge <gutteridge%pkgsrc.org@localhost>
date:      Thu Sep 09 00:21:13 2021 +0000

description:
py-isc_dhcp_leases: improve historical lease analysis support

Add two PRs that have been merged in the upstream project. (It simply
hasn't had a release cut since 2018.)

diffstat:

 textproc/py-isc_dhcp_leases/Makefile                                               |    3 +-
 textproc/py-isc_dhcp_leases/distinfo                                               |    6 +-
 textproc/py-isc_dhcp_leases/patches/patch-isc__dhcp__leases_iscdhcpleases.py       |  168 ++++++
 textproc/py-isc_dhcp_leases/patches/patch-isc__dhcp__leases_test__iscDhcpLeases.py |  245 ++++++++++
 textproc/py-isc_dhcp_leases/patches/patch-isc__dhcp__leases_test__lease.py         |   86 +++
 textproc/py-isc_dhcp_leases/patches/patch-isc__dhcp__leases_test__lease6.py        |   95 +++
 6 files changed, 601 insertions(+), 2 deletions(-)

diffs (truncated from 638 to 300 lines):

diff -r 33a1351862dd -r c65ee6f33f70 textproc/py-isc_dhcp_leases/Makefile
--- a/textproc/py-isc_dhcp_leases/Makefile      Wed Sep 08 23:48:18 2021 +0000
+++ b/textproc/py-isc_dhcp_leases/Makefile      Thu Sep 09 00:21:13 2021 +0000
@@ -1,7 +1,8 @@
-# $NetBSD: Makefile,v 1.1 2019/01/06 01:48:50 gutteridge Exp $
+# $NetBSD: Makefile,v 1.2 2021/09/09 00:21:13 gutteridge Exp $
 
 DISTNAME=      isc_dhcp_leases-0.9.1
 PKGNAME=       ${PYPKGPREFIX}-${DISTNAME}
+PKGREVISION=   1
 CATEGORIES=    textproc python
 MASTER_SITES=  ${MASTER_SITE_PYPI:=i/isc_dhcp_leases/}
 
diff -r 33a1351862dd -r c65ee6f33f70 textproc/py-isc_dhcp_leases/distinfo
--- a/textproc/py-isc_dhcp_leases/distinfo      Wed Sep 08 23:48:18 2021 +0000
+++ b/textproc/py-isc_dhcp_leases/distinfo      Thu Sep 09 00:21:13 2021 +0000
@@ -1,6 +1,10 @@
-$NetBSD: distinfo,v 1.1 2019/01/06 01:48:50 gutteridge Exp $
+$NetBSD: distinfo,v 1.2 2021/09/09 00:21:13 gutteridge Exp $
 
 SHA1 (isc_dhcp_leases-0.9.1.tar.gz) = ade9f209438045c1cb01b6b3e21587511a914309
 RMD160 (isc_dhcp_leases-0.9.1.tar.gz) = e2db1a5675ecba7ba7178e3ae5508a3d40bf11ad
 SHA512 (isc_dhcp_leases-0.9.1.tar.gz) = 271b449ae9c90e399596dea986042dd85eac3634005ad602dadcf0489b4213ee3e6845d9ddf69373ce1577da907a74f4d2568394e9dae0dad60ff24c4e9be6f3
 Size (isc_dhcp_leases-0.9.1.tar.gz) = 6798 bytes
+SHA1 (patch-isc__dhcp__leases_iscdhcpleases.py) = 5dc3366313d9c25b9bdeaf00da3fb8027a37e702
+SHA1 (patch-isc__dhcp__leases_test__iscDhcpLeases.py) = 94b5ad3b8efd5f07fe49d721b180aab913ca7b47
+SHA1 (patch-isc__dhcp__leases_test__lease.py) = 86518d345541a81dbb0c5053dce0df94b2b32699
+SHA1 (patch-isc__dhcp__leases_test__lease6.py) = c795d104480a155f7b9812d3d1b3979868350514
diff -r 33a1351862dd -r c65ee6f33f70 textproc/py-isc_dhcp_leases/patches/patch-isc__dhcp__leases_iscdhcpleases.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/textproc/py-isc_dhcp_leases/patches/patch-isc__dhcp__leases_iscdhcpleases.py      Thu Sep 09 00:21:13 2021 +0000
@@ -0,0 +1,168 @@
+$NetBSD: patch-isc__dhcp__leases_iscdhcpleases.py,v 1.1 2021/09/09 00:21:13 gutteridge Exp $
+
+Support reference datetime for examining historical dhcpd.leases
+https://github.com/MartijnBraam/python-isc-dhcp-leases/pull/32
+https://github.com/MartijnBraam/python-isc-dhcp-leases/pull/33
+
+--- isc_dhcp_leases/iscdhcpleases.py.orig      2018-04-13 13:10:47.000000000 +0000
++++ isc_dhcp_leases/iscdhcpleases.py
+@@ -8,6 +8,31 @@ import gzip
+ from six import iteritems
+ 
+ 
++try:
++    utc = datetime.timezone.utc
++except:
++    # Support Python 2.7
++    class UTC(datetime.tzinfo):
++        def fromutc(self, dt):
++            return dt
++
++        def utcffset(self, dt):
++            return datetime.timedelta(0)
++
++        def dst(self, dt):
++            return None
++
++        def tzname(self, dt):
++            return 'UTC'
++
++
++    utc = UTC()
++
++
++def check_datetime(dt):
++    if not (dt is None or (isinstance(dt, datetime.datetime) and dt.tzinfo)):
++        raise ValueError('None or offset-aware datetime required')
++
+ def parse_time(s):
+     """
+     Like datetime.datetime.strptime(s, "%w %Y/%m/%d %H:%M:%S") but 5x faster.
+@@ -23,7 +48,7 @@ def parse_time(s):
+         hour, minute, sec = time_part.split(':')
+         result = datetime.datetime(*map(int, (year, mon, day, hour, minute, sec)))
+ 
+-    return result
++    return result.replace(tzinfo=utc)
+ 
+ 
+ def _extract_prop_option(line):
+@@ -108,9 +133,12 @@ class IscDhcpLeases(object):
+         r"ia-(?P<type>ta|na|pd) \"(?P<id>[^\"\\]*(?:\\.[^\"\\]*)*)\" {(?P<config>[\s\S]+?)\n}")
+     regex_iaaddr = re.compile(r"ia(addr|prefix) (?P<ip>[0-9a-f:]+(/[0-9]+)?) {(?P<config>[\s\S]+?)\n\s+}")
+ 
+-    def __init__(self, filename, gzip=False):
++    def __init__(self, filename, gzip=False, now=None):
++        check_datetime(now)
++
+         self.filename = filename
+         self.gzip = gzip
++        self.now = now
+ 
+     def get(self, include_backups=False):
+         """
+@@ -129,7 +157,7 @@ class IscDhcpLeases(object):
+                 if 'hardware' not in properties and not include_backups:
+                     # E.g. rows like {'binding': 'state abandoned', ...}
+                     continue
+-                lease = Lease(block['ip'], properties=properties, options=options, sets=sets)
++                lease = Lease(block['ip'], properties=properties, options=options, sets=sets, now=self.now)
+                 leases.append(lease)
+ 
+             for match in self.regex_leaseblock6.finditer(lease_data):
+@@ -145,7 +173,7 @@ class IscDhcpLeases(object):
+                     properties, options, sets = _extract_properties(block['config'])
+ 
+                     lease = Lease6(block['ip'], properties, last_client_communication, host_identifier, block_type,
+-                                   options=options, sets=sets)
++                                   options=options, sets=sets, now=self.now)
+                     leases.append(lease)
+ 
+         return leases
+@@ -177,7 +205,9 @@ class BaseLease(object):
+         sets        Dict of key-value set statement values from this lease
+     """
+ 
+-    def __init__(self, ip, properties, options=None, sets=None):
++    def __init__(self, ip, properties, options=None, sets=None, now=None):
++        check_datetime(now)
++
+         if options is None:
+             options = {}
+ 
+@@ -189,6 +219,7 @@ class BaseLease(object):
+         self.options = options
+         self.sets = sets
+         _, self.binding_state = properties['binding'].split(' ', 1)
++        self._now = now
+ 
+     @property
+     def active(self):
+@@ -198,6 +229,15 @@ class BaseLease(object):
+         """
+         return self.binding_state == 'active'
+ 
++    @property
++    def now(self):
++        """
++        :return: datetime: real current time, unless a historical time is set
++        """
++        if self._now:
++            return self._now
++        else:
++            return datetime.datetime.utcnow().replace(tzinfo=utc)
+ 
+ class Lease(BaseLease):
+     """
+@@ -214,8 +254,8 @@ class Lease(BaseLease):
+         data            Dict of all the info in the dhcpd.leases file for this lease
+     """
+ 
+-    def __init__(self, ip, properties, options=None, sets=None):
+-        super(Lease, self).__init__(ip, properties=properties, options=options, sets=sets)
++    def __init__(self, ip, properties, **kwargs):
++        super(Lease, self).__init__(ip, properties=properties, **kwargs)
+         if 'starts' in properties:
+             self.start = parse_time(properties['starts'])
+         else:
+@@ -242,14 +282,14 @@ class Lease(BaseLease):
+         """
+         if self.end is None:
+             if self.start is not None:
+-                return self.start <= datetime.datetime.utcnow()
++                return self.start <= self.now
+             else:
+                 return True
+         else:
+             if self.start is not None:
+-                return self.start <= datetime.datetime.utcnow() <= self.end
++                return self.start <= self.now <= self.end
+             else:
+-                return datetime.datetime.utcnow() <= self.end
++                return self.now <= self.end
+ 
+     def __repr__(self):
+         return "<Lease {} for {} ({})>".format(self.ip, self.ethernet, self.hostname)
+@@ -278,11 +318,8 @@ class Lease6(BaseLease):
+ 
+     (TEMPORARY, NON_TEMPORARY, PREFIX_DELEGATION) = ('ta', 'na', 'pd')
+ 
+-    def __init__(self, ip, properties, cltt, host_identifier, address_type, options=None, sets=None):
+-        options = options or {}
+-        sets = sets or {}
+-
+-        super(Lease6, self).__init__(ip, properties=properties, options=options, sets=sets)
++    def __init__(self, ip, properties, cltt, host_identifier, address_type, **kwargs):
++        super(Lease6, self).__init__(ip, properties=properties, **kwargs)
+ 
+         self.type = address_type
+         self.last_communication = cltt
+@@ -315,7 +352,7 @@ class Lease6(BaseLease):
+         if self.end is None:
+             return True
+         else:
+-            return datetime.datetime.utcnow() <= self.end
++            return self.now <= self.end
+ 
+     def __repr__(self):
+         return "<Lease6 {}>".format(self.ip)
diff -r 33a1351862dd -r c65ee6f33f70 textproc/py-isc_dhcp_leases/patches/patch-isc__dhcp__leases_test__iscDhcpLeases.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/textproc/py-isc_dhcp_leases/patches/patch-isc__dhcp__leases_test__iscDhcpLeases.py        Thu Sep 09 00:21:13 2021 +0000
@@ -0,0 +1,245 @@
+$NetBSD: patch-isc__dhcp__leases_test__iscDhcpLeases.py,v 1.1 2021/09/09 00:21:13 gutteridge Exp $
+
+Support reference datetime for examining historical dhcpd.leases
+https://github.com/MartijnBraam/python-isc-dhcp-leases/pull/32
+https://github.com/MartijnBraam/python-isc-dhcp-leases/pull/33
+
+--- isc_dhcp_leases/test_iscDhcpLeases.py.orig 2018-04-13 13:10:47.000000000 +0000
++++ isc_dhcp_leases/test_iscDhcpLeases.py
+@@ -1,15 +1,16 @@
++import datetime
+ from unittest import TestCase
+-from isc_dhcp_leases.iscdhcpleases import IscDhcpLeases, Lease, Lease6
++from isc_dhcp_leases.iscdhcpleases import IscDhcpLeases, Lease, Lease6, utc
+ from freezegun import freeze_time
+-from datetime import datetime
+ 
+ __author__ = 'Martijn Braam <martijn%brixit.nl@localhost>'
+ 
+ 
+ class TestIscDhcpLeases(TestCase):
+-    @freeze_time("2015-07-6 8:15:0")
+-    def test_get(self):
+-        leases = IscDhcpLeases("isc_dhcp_leases/test_files/debian7.leases")
++    def _test_get(self, now=None):
++        leases = IscDhcpLeases("isc_dhcp_leases/test_files/debian7.leases", now=now)
++        lease_start = datetime.datetime(2013, 12, 10, 12, 57, 4, tzinfo=utc)
++        lease_end = lease_start + datetime.timedelta(minutes=10)
+         result = leases.get()
+         self.assertEqual(len(result), 5)
+         self.assertEqual(result[0].ip, "10.0.0.10")
+@@ -19,11 +20,13 @@ class TestIscDhcpLeases(TestCase):
+         self.assertEqual(result[0].hardware, "ethernet")
+         self.assertEqual(result[0].ethernet, "60:a4:4c:b5:6a:dd")
+         self.assertEqual(result[0].hostname, "")
+-        self.assertEqual(result[0].start, datetime(2013, 12, 10, 12, 57, 4))
+-        self.assertEqual(result[0].end, datetime(2013, 12, 10, 13, 7, 4))
++        self.assertEqual(result[0].start, lease_start)
++        self.assertEqual(result[0].end, lease_end)
+         self.assertEqual(result[0].sets, {'vendor-class-identifier': 'Some Vendor Identifier'})
+ 
+-        leases = IscDhcpLeases("isc_dhcp_leases/test_files/pfsense.leases")
++        leases = IscDhcpLeases("isc_dhcp_leases/test_files/pfsense.leases", now=now)
++        lease_start = datetime.datetime(2015, 7, 6, 7, 50, 42, tzinfo=utc)
++        lease_end = lease_start + datetime.timedelta(minutes=30)
+         result = leases.get()
+         self.assertEqual(len(result), 2)
+         self.assertEqual(result[0].ip, "10.0.10.72")
+@@ -33,10 +36,10 @@ class TestIscDhcpLeases(TestCase):
+         self.assertEqual(result[0].hardware, "ethernet")
+         self.assertEqual(result[0].ethernet, "64:5a:04:6a:07:a2")
+         self.assertEqual(result[0].hostname, "Satellite-C700")
+-        self.assertEqual(result[0].start, datetime(2015, 7, 6, 7, 50, 42))
+-        self.assertEqual(result[0].end, datetime(2015, 7, 6, 8, 20, 42))
++        self.assertEqual(result[0].start, lease_start)
++        self.assertEqual(result[0].end, lease_end)
+ 
+-        leases = IscDhcpLeases("isc_dhcp_leases/test_files/dhcpd6-4.2.4.leases")
++        leases = IscDhcpLeases("isc_dhcp_leases/test_files/dhcpd6-4.2.4.leases", now=now)
+         result = leases.get()
+         self.assertEqual(len(result), 2)
+         self.assertEqual(result[0].ip, "2001:610:600:891d::60")
+@@ -48,7 +51,9 @@ class TestIscDhcpLeases(TestCase):
+         self.assertEqual(result[0].binding_state, 'active')
+         self.assertEqual(result[0].preferred_life, 375)
+         self.assertEqual(result[0].max_life, 600)
+-        self.assertEqual(result[0].last_communication, datetime(2015, 8, 18, 16, 55, 37))
++        self.assertEqual(
++            result[0].last_communication,
++            datetime.datetime(2015, 8, 18, 16, 55, 37, tzinfo=utc))
+         self.assertEqual(result[0].type, Lease6.NON_TEMPORARY)
+ 
+         self.assertEqual(result[1].ip, "2001:610:500:fff::/64")
+@@ -60,10 +65,12 @@ class TestIscDhcpLeases(TestCase):
+         self.assertEqual(result[1].binding_state, 'active')
+         self.assertEqual(result[1].preferred_life, 175)
+         self.assertEqual(result[1].max_life, 200)
+-        self.assertEqual(result[1].last_communication, datetime(2015, 8, 18, 16, 55, 40))
++        self.assertEqual(
++            result[1].last_communication,
++            datetime.datetime(2015, 8, 18, 16, 55, 40, tzinfo=utc))
+         self.assertEqual(result[1].type, Lease6.PREFIX_DELEGATION)
+ 
+-        leases = IscDhcpLeases("isc_dhcp_leases/test_files/dhcpd6-4.3.3.leases")
++        leases = IscDhcpLeases("isc_dhcp_leases/test_files/dhcpd6-4.3.3.leases", now=now)
+         result = leases.get()
+         self.assertEqual(len(result), 4)
+         self.assertEqual(result[0].ip, "2001:10:10::106")
+@@ -75,7 +82,9 @@ class TestIscDhcpLeases(TestCase):
+         self.assertEqual(result[0].binding_state, 'active')
+         self.assertEqual(result[0].preferred_life, 540)
+         self.assertEqual(result[0].max_life, 864)
+-        self.assertEqual(result[0].last_communication, datetime(2016, 1, 6, 14, 50, 34))
++        self.assertEqual(
++            result[0].last_communication,
++            datetime.datetime(2016, 1, 6, 14, 50, 34, tzinfo=utc))
+         self.assertEqual(result[0].type, Lease6.NON_TEMPORARY)



Home | Main Index | Thread Index | Old Index