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