/usr/share/doc/python-pyparsing-doc/examples/dhcpd_leases_parser.py is in python-pyparsing-doc 2.2.0+dfsg1-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | #
# dhcpd_leases_parser.py
#
# Copyright 2008, Paul McGuire
#
# Sample parser to parse a dhcpd.leases file to extract leases
# and lease attributes
#
# format ref: http://www.linuxmanpages.com/man5/dhcpd.leases.5.php
#
sample = r"""\
# All times in this file are in UTC (GMT), not your local timezone. This is
# not a bug, so please don't ask about it. There is no portable way to
# store leases in the local timezone, so please don't request this as a
# feature. If this is inconvenient or confusing to you, we sincerely
# apologize. Seriously, though - don't ask.
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-V3.0.4
lease 192.168.0.250 {
starts 3 2008/01/23 17:16:41;
ends 6 2008/02/02 17:16:41;
tstp 6 2008/02/02 17:16:41;
binding state free;
hardware ethernet 00:17:f2:9b:d8:19;
uid "\001\000\027\362\233\330\031";
}
lease 192.168.0.198 {
starts 1 2008/02/04 13:46:55;
ends never;
tstp 1 2008/02/04 17:04:14;
binding state free;
hardware ethernet 00:13:72:d3:3b:98;
uid "\001\000\023r\323;\230";
}
lease 192.168.0.239 {
starts 3 2008/02/06 12:12:03;
ends 4 2008/02/07 12:12:03;
tstp 4 2008/02/07 12:12:03;
binding state free;
hardware ethernet 00:1d:09:65:93:26;
}
"""
from pyparsing import *
import datetime,time
LBRACE,RBRACE,SEMI,QUOTE = map(Suppress,'{};"')
ipAddress = Combine(Word(nums) + ('.' + Word(nums))*3)
hexint = Word(hexnums,exact=2)
macAddress = Combine(hexint + (':'+hexint)*5)
hdwType = Word(alphanums)
yyyymmdd = Combine((Word(nums,exact=4)|Word(nums,exact=2))+
('/'+Word(nums,exact=2))*2)
hhmmss = Combine(Word(nums,exact=2)+(':'+Word(nums,exact=2))*2)
dateRef = oneOf(list("0123456"))("weekday") + yyyymmdd("date") + \
hhmmss("time")
def utcToLocalTime(tokens):
utctime = datetime.datetime.strptime("%(date)s %(time)s" % tokens,
"%Y/%m/%d %H:%M:%S")
localtime = utctime-datetime.timedelta(0,time.timezone,0)
tokens["utcdate"],tokens["utctime"] = tokens["date"],tokens["time"]
tokens["localdate"],tokens["localtime"] = str(localtime).split()
del tokens["date"]
del tokens["time"]
dateRef.setParseAction(utcToLocalTime)
startsStmt = "starts" + dateRef + SEMI
endsStmt = "ends" + (dateRef | "never") + SEMI
tstpStmt = "tstp" + dateRef + SEMI
tsfpStmt = "tsfp" + dateRef + SEMI
hdwStmt = "hardware" + hdwType("type") + macAddress("mac") + SEMI
uidStmt = "uid" + QuotedString('"')("uid") + SEMI
bindingStmt = "binding" + Word(alphanums) + Word(alphanums) + SEMI
leaseStatement = startsStmt | endsStmt | tstpStmt | tsfpStmt | hdwStmt | \
uidStmt | bindingStmt
leaseDef = "lease" + ipAddress("ipaddress") + LBRACE + \
Dict(ZeroOrMore(Group(leaseStatement))) + RBRACE
for lease in leaseDef.searchString(sample):
print(lease.dump())
print(lease.ipaddress,'->',lease.hardware.mac)
print()
|