def GetDHCPRequests(self, data): if len(data) == 8: if Refactor.check_is_mac(data[4]): if data[4] not in self.APclients.keys(): self.APclients[data[4]] = { 'IP': data[2], 'device': data[5], 'in_tables': False, } self.StatusDHCPRequests(data[4]) elif len(data) == 9: if Refactor.check_is_mac(data[5]): if data[5] not in self.APclients.keys(): self.APclients[data[5]] = { 'IP': data[2], 'device': data[6], 'in_tables': False, } self.StatusDHCPRequests(data[5]) elif len(data) == 7: if Refactor.check_is_mac(data[4]): if data[4] not in self.APclients.keys(): leases = IscDhcpLeases('Settings/dhcp/dhcpd.leases') hostname = None try: for item in leases.get(): if item.ethernet == data[4]: hostname = item.hostname if hostname == None: item = leases.get_current() hostname = item[data[4]] except: hostname = 'unknown' if hostname == None: hostname = 'unknown' self.APclients[data[4]] = { 'IP': data[2], 'device': hostname, 'in_tables': False, } self.StatusDHCPRequests(data[4]) self.APclients[data[4]] = { 'IP': data[2], 'device': hostname, 'in_tables': False, } Headers = [] for mac in self.APclients.keys(): if self.APclients[mac]['in_tables'] == False: self.APclients[mac]['in_tables'] = True self.THeaders['mac-address'].append(mac) self.THeaders['ip-address'].append(self.APclients[mac]['IP']) self.THeaders['device'].append(self.APclients[mac]['device']) for n, key in enumerate(self.THeaders.keys()): Headers.append(key) for m, item in enumerate(self.THeaders[key]): item = QTableWidgetItem(item) item.setTextAlignment(Qt.AlignVCenter | Qt.AlignCenter) self.TabInfoAP.setItem(m, n, item) self.TabInfoAP.setHorizontalHeaderLabels(self.THeaders.keys()) self.connectedCount.setText(str(len(self.APclients.keys())))
def dhcp_leases(): """ Shows a webpage containing DHCP leases. Uses isc_dhcp_leases package to parse text filel. """ try: leases = IscDhcpLeases(_dhcp_leases_file) dhcp = leases.get() ip = request.args.get('ip') g.ip = ip # Only return results for one IP if filtering if ip and valid_ip(ip): for lease in dhcp: if lease.ip == ip: return render_template('dhcp.html', dhcp=[lease]) # No matching leases return render_template('dhcp.html') return render_template('dhcp.html', dhcp=dhcp) except IOError as e: code = e.args[0] reason = e.args[1] # Permissions issue. Cannot read DHCP if code == errno.EACCES: whoami = pwd.getpwuid(os.getuid())[0] error = "Could not read DHCP Leases file - permission denied. Add {whoami} " \ "read access: {reason} ({code}) reading {filename}".format( code=code, reason=reason, filename=_dhcp_leases_file, whoami=whoami) flash(error, 'danger') return render_template('dhcp.html') # All other errors error = "Could not read DHCP Leases file: {reason} ({code}) reading {filename}".format( code=code, reason=reason, filename=_dhcp_leases_file) flash(error, 'danger') return render_template('error.html', error=error)
def test_epoch_leases(self): leases = IscDhcpLeases("isc_dhcp_leases/test_files/epoch.leases") lease_start = [ datetime.datetime(2017, 10, 5, 15, 22, 29, tzinfo=utc), datetime.datetime(2017, 10, 10, 12, 5, 14, tzinfo=utc), ] lease_end = [ datetime.datetime(2017, 10, 16, 8, 9, 23, tzinfo=utc), None, ] result = leases.get() self.assertEqual(len(result), 1) result = leases.get(include_backups=True) self.assertEqual(len(result), 2) self.assertEqual(result[0].ip, "10.0.0.1") self.assertEqual(result[0].valid, False) self.assertEqual(result[0].active, False) self.assertEqual(result[0].binding_state, "backup") self.assertEqual(result[0].hardware, "ethernet") self.assertEqual(result[0].start, lease_start[0]) self.assertEqual(result[0].end, lease_end[0]) self.assertEqual(result[1].ip, "10.0.0.2") self.assertEqual(result[1].valid, False) self.assertEqual(result[1].active, False) self.assertEqual(result[1].binding_state, "backup") self.assertIsNone(result[1].hardware) self.assertEqual(result[1].start, lease_start[1]) self.assertEqual(result[1].end, lease_end[1])
def get_DHCP_Requests_clients(self, data): ''' filter: data info sended DHCPD request ''' self.APclients = {} if len(data) == 8: device = sub(r'[)|(]', r'', data[5]) if len(device) == 0: device = 'unknown' if Refactor.check_is_mac(data[4]): if data[4] not in self.HomeDisplay.APclients.keys(): self.APclients[data[4]] = { 'IP': data[2], 'device': device, 'MAC': data[4], 'Vendors': self.get_mac_vendor(data[4]) } self.add_DHCP_Requests_clients(data[4], self.APclients[data[4]]) elif len(data) == 9: device = sub(r'[)|(]', r'', data[6]) if len(device) == 0: device = 'unknown' if Refactor.check_is_mac(data[5]): if data[5] not in self.HomeDisplay.ClientTable.APclients.keys( ): self.APclients[data[5]] = { 'IP': data[2], 'device': device, 'MAC': data[5], 'Vendors': self.get_mac_vendor(data[5]) } self.add_DHCP_Requests_clients(data[5], self.APclients[data[5]]) elif len(data) == 7: if Refactor.check_is_mac(data[4]): if data[4] not in self.HomeDisplay.ClientTable.APclients.keys( ): leases = IscDhcpLeases(C.DHCPLEASES_PATH) hostname = None try: for item in leases.get(): if item.ethernet == data[4]: hostname = item.hostname if hostname == None: item = leases.get_current() hostname = item[data[4]] except: hostname = 'unknown' if hostname == None or len(hostname) == 0: hostname = 'unknown' self.APclients[data[4]] = { 'IP': data[2], 'device': hostname, 'MAC': data[4], 'Vendors': self.get_mac_vendor(data[4]) } self.add_DHCP_Requests_clients(data[4], self.APclients[data[4]]) if self.APclients != {}: self.add_data_into_QTableWidget(self.APclients) self.parent.connectedCount.setText( str(len(self.HomeDisplay.ClientTable.APclients.keys())))
def test_get_current(self): leases = IscDhcpLeases("isc_dhcp_leases/test_files/debian7.leases") result = leases.get_current() self.assertEqual(len(result), 0) leases = IscDhcpLeases("isc_dhcp_leases/test_files/pfsense.leases") result = leases.get_current() self.assertEqual(len(result), 2) self.assertTrue("14:da:e9:04:c8:a3" in result) self.assertTrue("64:5a:04:6a:07:a2" in result) self.assertTrue(result["14:da:e9:04:c8:a3"].valid) self.assertTrue(result["64:5a:04:6a:07:a2"].valid)
def test_get(self): leases = IscDhcpLeases("isc_dhcp_leases/test_files/debian7.leases") result = leases.get() self.assertEqual(len(result), 5) self.assertEqual(result[0].ip, "10.0.0.10") self.assertEqual(result[0].valid, False) self.assertEqual(result[0].active, False) self.assertEqual(result[0].binding_state, 'free') 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)) leases = IscDhcpLeases("isc_dhcp_leases/test_files/pfsense.leases") result = leases.get() self.assertEqual(len(result), 2) self.assertEqual(result[0].ip, "10.0.10.72") self.assertEqual(result[0].valid, True) self.assertEqual(result[0].active, True) self.assertEqual(result[0].binding_state, 'active') 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)) leases = IscDhcpLeases("isc_dhcp_leases/test_files/dhcpd6.leases") result = leases.get() self.assertEqual(len(result), 2) self.assertEqual(result[0].ip, "2001:610:600:891d::60") self.assertEqual( result[0].host_identifier, "4dv\352\000\001\000\001\035f\037\342\012\000'\000\000\000") self.assertEqual(result[0].valid, True) self.assertEqual(result[0].active, True) 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].type, Lease6.NON_TEMPORARY) self.assertEqual(result[1].ip, "2001:610:500:fff::/64") self.assertEqual( result[1].host_identifier, "4dv\352\000\001\000\001\035f\037\342\012\000'\000\000\000") self.assertEqual(result[1].valid, True) self.assertEqual(result[1].active, True) 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].type, Lease6.PREFIX_DELEGATION)
def test_gzip_handling(self): leases = IscDhcpLeases("isc_dhcp_leases/test_files/debian7.leases.gz", True) result = leases.get() self.assertEqual(len(result), 5) self.assertEqual(result[0].ip, "10.0.0.10") self.assertEqual(result[0].valid, False) self.assertEqual(result[0].active, False) self.assertEqual(result[0].binding_state, 'free') 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].sets, {'vendor-class-identifier': 'Some Vendor Identifier'})
def test_get_current_ipv6(self): with freeze_time("2015-08-18 17:0:0"): leases = IscDhcpLeases("isc_dhcp_leases/test_files/dhcpd6.leases") result = leases.get_current() self.assertEqual(len(result), 2) self.assertIn('na-3464769c000100010239661996080027000000', result) self.assertIn('pd-3464769c000100010239661996080027000000', result) for key, r in result.items(): self.assertTrue(r.valid, key) with freeze_time("2015-08-18 18:0:0"): leases = IscDhcpLeases("isc_dhcp_leases/test_files/dhcpd6.leases") result = leases.get_current() self.assertEqual(len(result), 0)
def GetDHCPRequests(self,data): if len(data) == 8: if Refactor.check_is_mac(data[4]): if data[4] not in self.APclients.keys(): self.APclients[data[4]] = {'IP': data[2], 'device': sub(r'[)|(]',r'',data[5]),'in_tables': False,} self.StatusDHCPRequests(data[4],self.APclients[data[4]]) elif len(data) == 9: if Refactor.check_is_mac(data[5]): if data[5] not in self.APclients.keys(): self.APclients[data[5]] = {'IP': data[2], 'device': sub(r'[)|(]',r'',data[6]),'in_tables': False,} self.StatusDHCPRequests(data[5],self.APclients[data[5]]) elif len(data) == 7: if Refactor.check_is_mac(data[4]): if data[4] not in self.APclients.keys(): leases = IscDhcpLeases('/var/lib/dhcp/dhcpd.leases') hostname = None try: for item in leases.get(): if item.ethernet == data[4]: hostname = item.hostname if hostname == None: item = leases.get_current() hostname = item[data[4]] except: hostname = 'unknown' if hostname == None:hostname = 'unknown' self.APclients[data[4]] = {'IP': data[2],'device': hostname, 'in_tables': False,} self.StatusDHCPRequests(data[4],self.APclients[data[4]]) Headers = [] for mac in self.APclients.keys(): if self.APclients[mac]['in_tables'] == False: self.APclients[mac]['in_tables'] = True self.THeaders['mac-address'].append(mac) self.THeaders['ip-address'].append(self.APclients[mac]['IP']) self.THeaders['device'].append(self.APclients[mac]['device']) for n, key in enumerate(self.THeaders.keys()): Headers.append(key) for m, item in enumerate(self.THeaders[key]): item = QTableWidgetItem(item) item.setTextAlignment(Qt.AlignVCenter | Qt.AlignCenter) self.TabInfoAP.setItem(m, n, item) self.TabInfoAP.setHorizontalHeaderLabels(self.THeaders.keys()) self.connectedCount.setText(str(len(self.APclients.keys())))
def detect(oldlist): """ :rtype: tuple of lists """ checkthese = [] tmplist = [] leasefile = IscDhcpLeases(leasepath) leaselist = leasefile.get() for lease in leaselist: if lease.valid: tmplist.append(lease.id) if lease.ip in oldlist: # TODO: Decide on things continue checkthese.append(lease.ip) lostlist = list(set(oldlist) - set(tmplist)) return (tmplist, checkthese, lostlist)
def GetDHCPRequests(self, data): if len(data) == 8: if Refactor.check_is_mac(data[4]): if data[4] not in self.APclients.keys(): self.APclients[data[4]] = {"IP": data[2], "device": data[5], "in_tables": False} self.StatusDHCPRequests(data[4]) elif len(data) == 9: if Refactor.check_is_mac(data[5]): if data[5] not in self.APclients.keys(): self.APclients[data[5]] = {"IP": data[2], "device": data[6], "in_tables": False} self.StatusDHCPRequests(data[5]) elif len(data) == 7: if Refactor.check_is_mac(data[4]): if data[4] not in self.APclients.keys(): leases = IscDhcpLeases("Settings/dhcp/dhcpd.leases") hostname = None try: for item in leases.get(): if item.ethernet == data[4]: hostname = item.hostname if hostname == None: item = leases.get_current() hostname = item[data[4]] except: hostname = "unknown" if hostname == None: hostname = "unknown" self.APclients[data[4]] = {"IP": data[2], "device": hostname, "in_tables": False} self.StatusDHCPRequests(data[4]) self.APclients[data[4]] = {"IP": data[2], "device": hostname, "in_tables": False} Headers = [] for mac in self.APclients.keys(): if self.APclients[mac]["in_tables"] == False: self.APclients[mac]["in_tables"] = True self.THeaders["mac-address"].append(mac) self.THeaders["ip-address"].append(self.APclients[mac]["IP"]) self.THeaders["device"].append(self.APclients[mac]["device"]) for n, key in enumerate(self.THeaders.keys()): Headers.append(key) for m, item in enumerate(self.THeaders[key]): item = QTableWidgetItem(item) item.setTextAlignment(Qt.AlignVCenter | Qt.AlignCenter) self.TabInfoAP.setItem(m, n, item) self.TabInfoAP.setHorizontalHeaderLabels(self.THeaders.keys()) self.connectedCount.setText(str(len(self.APclients.keys())))
def run_normalizer(self, timestamp): """ :return: raw_devices """ try: log_content = IscDhcpLeases(self.logfile) current_devices = log_content.get_current() if len(current_devices) > 0: for device in current_devices: yield SampleDevice(deviceIP=current_devices[device].ip, deviceTimeStamp=timestamp, deviceStatus=c.DEVICE_STATUS_INIT, deviceServicePlugin=c.SERVICEPLUGIN_DHCP) except IOError: self.logger.info('PROVLOG: Can\'t open logfile: %s ', self.logfile) sys.exit()
def test_backup_leases(self): leases = IscDhcpLeases("isc_dhcp_leases/test_files/backup.leases") result = leases.get() self.assertEqual(len(result), 1) result = leases.get(include_backups=True) self.assertEqual(len(result), 2) self.assertEqual(result[0].ip, "10.0.0.1") self.assertEqual(result[0].valid, False) self.assertEqual(result[0].active, False) self.assertEqual(result[0].binding_state, "backup") self.assertEqual(result[0].hardware, "ethernet") self.assertEqual(result[0].start, datetime(2017, 10, 5, 15, 22, 29)) self.assertEqual(result[0].end, datetime(2017, 10, 16, 8, 9, 23)) self.assertEqual(result[1].ip, "10.0.0.2") self.assertEqual(result[1].valid, False) self.assertEqual(result[1].active, False) self.assertEqual(result[1].binding_state, "backup") self.assertIsNone(result[1].hardware) self.assertEqual(result[1].start, datetime(2017, 10, 10, 12, 5, 14)) self.assertIsNone(result[1].end)
def devices_search(): # Get all DHCP leases currently given out leases = IscDhcpLeases('/var/lib/dhcp/dhcpd.leases') leases = leases.get() # No DHCP leases at all, the server is not operating if not leases: return "NODHCP" additions = 0 # For each lease, first see if it's an ESP8266 for iteration,lease in enumerate(leases): if(ESP8266_check(lease.ip)): # We have an ESP8266 mode! database_check = model.Device.query.filter_by(mac=lease.ethernet).first() if database_check is None: # We have an ESP8266 AND it's not in the database! add_device(lease.ethernet,lease.ip,"ESP8266@"+lease.ethernet) additions = additions + 1 return str(additions)
def devices_search(): # Get all DHCP leases currently given out leases = IscDhcpLeases('/var/lib/dhcp/dhcpd.leases') leases = leases.get() # No DHCP leases at all, the server is not operating if not leases: return "NODHCP" additions = 0 # For each lease, first see if it's an ESP8266 for iteration, lease in enumerate(leases): if (ESP8266_check(lease.ip)): # We have an ESP8266 mode! database_check = model.Device.query.filter_by( mac=lease.ethernet).first() if database_check is None: # We have an ESP8266 AND it's not in the database! add_device(lease.ethernet, lease.ip, "ESP8266@" + lease.ethernet) additions = additions + 1 return str(additions)
def test_get(self): leases = IscDhcpLeases("isc_dhcp_leases/test_files/debian7.leases") result = leases.get() self.assertEqual(len(result), 5) self.assertEqual(result[0].ip, "10.0.0.10") self.assertEqual(result[0].valid, False) self.assertEqual(result[0].active, False) self.assertEqual(result[0].binding_state, 'free') 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)) leases = IscDhcpLeases("isc_dhcp_leases/test_files/pfsense.leases") result = leases.get() self.assertEqual(len(result), 2) self.assertEqual(result[0].ip, "10.0.10.72") self.assertEqual(result[0].valid, True) self.assertEqual(result[0].active, True) self.assertEqual(result[0].binding_state, 'active') 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)) leases = IscDhcpLeases("isc_dhcp_leases/test_files/dhcpd6.leases") result = leases.get() self.assertEqual(len(result), 2) self.assertEqual(result[0].ip, "2001:610:600:891d::60") self.assertEqual(result[0].host_identifier, b"4dv\x9c\x00\x01\x00\x01\x029f\x19\x96\x08\x00'\x00\x00\x00") self.assertEqual(result[0].iaid, 878999196) self.assertEqual(result[0].duid, b"\x00\x01\x00\x01\x029f\x19\x96\x08\x00'\x00\x00\x00") self.assertEqual(result[0].valid, True) self.assertEqual(result[0].active, True) 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].type, Lease6.NON_TEMPORARY) self.assertEqual(result[1].ip, "2001:610:500:fff::/64") self.assertEqual(result[1].host_identifier, b"4dv\x9c\x00\x01\x00\x01\x029f\x19\x96\x08\x00'\x00\x00\x00") self.assertEqual(result[1].iaid, 878999196) self.assertEqual(result[1].duid, b"\x00\x01\x00\x01\x029f\x19\x96\x08\x00'\x00\x00\x00") self.assertEqual(result[1].valid, True) self.assertEqual(result[1].active, True) 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].type, Lease6.PREFIX_DELEGATION)
def test_get_current_ipv6(self): with freeze_time("2015-08-18 17:0:0"): leases = IscDhcpLeases("isc_dhcp_leases/test_files/dhcpd6-4.2.4.leases") result = leases.get_current() self.assertEqual(len(result), 2) self.assertIn('na-346476ea000100011d661fe20a0027000000', result) self.assertIn('pd-346476ea000100011d661fe20a0027000000', result) for key, r in result.items(): self.assertTrue(r.valid, key) with freeze_time("2015-08-18 18:0:0"): leases = IscDhcpLeases("isc_dhcp_leases/test_files/dhcpd6-4.2.4.leases") result = leases.get_current() self.assertEqual(len(result), 0)
def parse_args(): parser = argparse.ArgumentParser(description="", fromfile_prefix_chars='@') parser.add_argument('--sw-user', required=True, help="Equipements user") parser.add_argument('--sw-pass', required=True, help="Equipements pass") parser.add_argument('--workers', default=5, help="Size of ssh client pool", type=int) parser.add_argument('--ftp-server', required=True, help="FTP server to download the binary", action="append") parser.add_argument('--tftp-server', required=True, help="TFTP server to download the configuration") parser.add_argument('--leases-file', required=True, help="ISC DHCPD lease file location") parser.add_argument('--debug', help="Debug level", type=int, choices=[0, 1, 2], default=0) parser.add_argument('--http-root', required=True, help='Web server address') args = parser.parse_args() if not os.path.isfile(args.leases_file): sys.exit(1) args.leases = IscDhcpLeases(args.leases_file) levels = [logging.WARNING, logging.INFO, logging.DEBUG] logger.setLevel(levels[args.debug]) return args
# https://github.com/MartijnBraam/python-isc-dhcp-leases leasefile = "/var/lib/dhcpd/dhcpd.leases" import web from isc_dhcp_leases.iscdhcpleases import IscDhcpLeases # Lease and IscDhcpLeases # For SSL support: #from web.wsgiserver import CherryPyWSGIServer #CherryPyWSGIServer.ssl_certificate = "/path/to/ssl_certificate" #CherryPyWSGIServer.ssl_private_key = "/path/to/ssl_private_key" urls = ( '/ip_by_mac/(.*)', 'get_ip_by_mac', ) app = web.application(urls, globals()) leases = IscDhcpLeases(leasefile) cur_leases = leases.get_current() class get_ip_by_mac: def GET(self, mac): if mac not in cur_leases.keys(): return "None" this_lease = cur_leases[mac] return str(this_lease.ip) if __name__ == "__main__": app.run()
def test_get(self): leases = IscDhcpLeases("isc_dhcp_leases/test_files/debian7.leases") result = leases.get() self.assertEqual(len(result), 5) self.assertEqual(result[0].ip, "10.0.0.10") self.assertEqual(result[0].valid, False) self.assertEqual(result[0].active, False) self.assertEqual(result[0].binding_state, 'free') 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].sets, {'vendor-class-identifier': 'Some Vendor Identifier'}) leases = IscDhcpLeases("isc_dhcp_leases/test_files/pfsense.leases") result = leases.get() self.assertEqual(len(result), 2) self.assertEqual(result[0].ip, "10.0.10.72") self.assertEqual(result[0].valid, True) self.assertEqual(result[0].active, True) self.assertEqual(result[0].binding_state, 'active') 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)) leases = IscDhcpLeases("isc_dhcp_leases/test_files/dhcpd6-4.2.4.leases") result = leases.get() self.assertEqual(len(result), 2) self.assertEqual(result[0].ip, "2001:610:600:891d::60") self.assertEqual(result[0].host_identifier, b"4dv\xea\x00\x01\x00\x01\x1df\x1f\xe2\n\x00'\x00\x00\x00") self.assertEqual(result[0].iaid, 3933627444) self.assertEqual(result[0].duid, b"\x00\x01\x00\x01\x1df\x1f\xe2\n\x00'\x00\x00\x00") self.assertEqual(result[0].valid, True) self.assertEqual(result[0].active, True) 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].type, Lease6.NON_TEMPORARY) self.assertEqual(result[1].ip, "2001:610:500:fff::/64") self.assertEqual(result[1].host_identifier, b"4dv\xea\x00\x01\x00\x01\x1df\x1f\xe2\n\x00'\x00\x00\x00") self.assertEqual(result[1].iaid, 3933627444) self.assertEqual(result[1].duid, b"\x00\x01\x00\x01\x1df\x1f\xe2\n\x00'\x00\x00\x00") self.assertEqual(result[1].valid, True) self.assertEqual(result[1].active, True) 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].type, Lease6.PREFIX_DELEGATION) leases = IscDhcpLeases("isc_dhcp_leases/test_files/dhcpd6-4.3.3.leases") result = leases.get() self.assertEqual(len(result), 4) self.assertEqual(result[0].ip, "2001:10:10::106") self.assertEqual(result[0].host_identifier, b"\001\000\000\000\000\001\000\001\034\367\020\245\000'\"3+4") self.assertEqual(result[0].iaid, 1) self.assertEqual(result[0].duid, b"\x00\x01\x00\x01\x1c\xf7\x10\xa5\x00\'\"3+4") self.assertEqual(result[0].valid, True) self.assertEqual(result[0].active, True) 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].type, Lease6.NON_TEMPORARY) self.assertEqual(result[0].sets, dict(iana='2001:10:10:0:0:0:0:106', clientduid='0100011cf710a5002722332b34')) self.assertEqual(result[1].ip, "2001:10:30:ff00::/56") self.assertEqual(result[1].host_identifier, b"\x00\x00\x00\x00\x00\x01\x00\x01\x1d4L\x00\x00%\x90k\xa14") self.assertEqual(result[1].iaid, 0) self.assertEqual(result[1].duid, b"\x00\x01\x00\x01\x1d4L\x00\x00%\x90k\xa14") self.assertEqual(result[1].valid, True) self.assertEqual(result[1].active, True) self.assertEqual(result[1].binding_state, 'active') self.assertEqual(result[1].preferred_life, 540) self.assertEqual(result[1].max_life, 864) self.assertEqual(result[1].last_communication, datetime(2016, 1, 6, 14, 52, 37)) self.assertEqual(result[1].type, Lease6.PREFIX_DELEGATION) self.assertEqual(result[1].sets, dict(iapd='2001:10:30:ff00:0:0:0:0', pdsize='56', pdnet='2001:10:30:ff00:0:0:0:0/56', clientduid='0100011d344c000025906ba134')) leases = IscDhcpLeases("isc_dhcp_leases/test_files/options.leases") result = leases.get() self.assertEqual(len(result), 1) self.assertEqual(result[0].ip, "10.10.10.10") self.assertEqual(result[0].valid, False) self.assertEqual(result[0].active, True) self.assertEqual(result[0].binding_state, 'active') self.assertEqual(result[0].hardware, "ethernet") self.assertEqual(result[0].ethernet, "24:65:11:d9:a6:b3") self.assertEqual(result[0].hostname, "KRONOS") self.assertEqual(result[0].start, datetime(2016, 2, 27, 7, 11, 41)) self.assertEqual(result[0].end, datetime(2016, 2, 27, 9, 11, 41)) self.assertEqual(len(result[0].options), 4) self.assertDictEqual(result[0].options, {'agent.DOCSIS-device-class': '2', 'agent.circuit-id': '0:1:3:e9', 'agent.remote-id': 'a4:a2:4a:33:db:e5', 'agent.unknown-9': '0:0:11:8b:6:1:4:1:2:3:0'})
def test_get(self): leases = IscDhcpLeases("isc_dhcp_leases/test_files/debian7.leases") result = leases.get() self.assertEqual(len(result), 5) self.assertEqual(result[0].ip, "10.0.0.10") self.assertEqual(result[0].valid, False) self.assertEqual(result[0].active, False) self.assertEqual(result[0].binding_state, 'free') 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].sets, {'vendor-class-identifier': 'Some Vendor Identifier'}) leases = IscDhcpLeases("isc_dhcp_leases/test_files/pfsense.leases") result = leases.get() self.assertEqual(len(result), 2) self.assertEqual(result[0].ip, "10.0.10.72") self.assertEqual(result[0].valid, True) self.assertEqual(result[0].active, True) self.assertEqual(result[0].binding_state, 'active') 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)) leases = IscDhcpLeases( "isc_dhcp_leases/test_files/dhcpd6-4.2.4.leases") result = leases.get() self.assertEqual(len(result), 2) self.assertEqual(result[0].ip, "2001:610:600:891d::60") self.assertEqual( result[0].host_identifier, b"4dv\xea\x00\x01\x00\x01\x1df\x1f\xe2\n\x00'\x00\x00\x00") self.assertEqual(result[0].iaid, 3933627444) self.assertEqual(result[0].duid, b"\x00\x01\x00\x01\x1df\x1f\xe2\n\x00'\x00\x00\x00") self.assertEqual(result[0].valid, True) self.assertEqual(result[0].active, True) 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].type, Lease6.NON_TEMPORARY) self.assertEqual(result[1].ip, "2001:610:500:fff::/64") self.assertEqual( result[1].host_identifier, b"4dv\xea\x00\x01\x00\x01\x1df\x1f\xe2\n\x00'\x00\x00\x00") self.assertEqual(result[1].iaid, 3933627444) self.assertEqual(result[1].duid, b"\x00\x01\x00\x01\x1df\x1f\xe2\n\x00'\x00\x00\x00") self.assertEqual(result[1].valid, True) self.assertEqual(result[1].active, True) 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].type, Lease6.PREFIX_DELEGATION) leases = IscDhcpLeases( "isc_dhcp_leases/test_files/dhcpd6-4.3.3.leases") result = leases.get() self.assertEqual(len(result), 4) self.assertEqual(result[0].ip, "2001:10:10::106") self.assertEqual( result[0].host_identifier, b"\001\000\000\000\000\001\000\001\034\367\020\245\000'\"3+4") self.assertEqual(result[0].iaid, 1) self.assertEqual(result[0].duid, b"\x00\x01\x00\x01\x1c\xf7\x10\xa5\x00\'\"3+4") self.assertEqual(result[0].valid, True) self.assertEqual(result[0].active, True) 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].type, Lease6.NON_TEMPORARY) self.assertEqual( result[0].sets, dict(iana='2001:10:10:0:0:0:0:106', clientduid='0100011cf710a5002722332b34')) self.assertEqual(result[1].ip, "2001:10:30:ff00::/56") self.assertEqual( result[1].host_identifier, b"\x00\x00\x00\x00\x00\x01\x00\x01\x1d4L\x00\x00%\x90k\xa14") self.assertEqual(result[1].iaid, 0) self.assertEqual(result[1].duid, b"\x00\x01\x00\x01\x1d4L\x00\x00%\x90k\xa14") self.assertEqual(result[1].valid, True) self.assertEqual(result[1].active, True) self.assertEqual(result[1].binding_state, 'active') self.assertEqual(result[1].preferred_life, 540) self.assertEqual(result[1].max_life, 864) self.assertEqual(result[1].last_communication, datetime(2016, 1, 6, 14, 52, 37)) self.assertEqual(result[1].type, Lease6.PREFIX_DELEGATION) self.assertEqual( result[1].sets, dict(iapd='2001:10:30:ff00:0:0:0:0', pdsize='56', pdnet='2001:10:30:ff00:0:0:0:0/56', clientduid='0100011d344c000025906ba134')) leases = IscDhcpLeases("isc_dhcp_leases/test_files/options.leases") result = leases.get() self.assertEqual(len(result), 1) self.assertEqual(result[0].ip, "10.10.10.10") self.assertEqual(result[0].valid, False) self.assertEqual(result[0].active, True) self.assertEqual(result[0].binding_state, 'active') self.assertEqual(result[0].hardware, "ethernet") self.assertEqual(result[0].ethernet, "24:65:11:d9:a6:b3") self.assertEqual(result[0].hostname, "KRONOS") self.assertEqual(result[0].start, datetime(2016, 2, 27, 7, 11, 41)) self.assertEqual(result[0].end, datetime(2016, 2, 27, 9, 11, 41)) self.assertEqual(len(result[0].options), 4) self.assertDictEqual( result[0].options, { 'agent.DOCSIS-device-class': '2', 'agent.circuit-id': '0:1:3:e9', 'agent.remote-id': 'a4:a2:4a:33:db:e5', 'agent.unknown-9': '0:0:11:8b:6:1:4:1:2:3:0' }) leases = IscDhcpLeases("isc_dhcp_leases/test_files/static.leases") result = leases.get() self.assertEqual(len(result), 1) self.assertEqual(result[0].ip, "10.0.0.15") self.assertEqual(result[0].valid, False) self.assertEqual(result[0].active, False) self.assertEqual(result[0].binding_state, "free") self.assertEqual(result[0].hardware, "ethernet") self.assertEqual(result[0].start, datetime(2015, 9, 10, 0, 29, 0)) self.assertIsNone(result[0].end)
def test_get(self): leases = IscDhcpLeases("isc_dhcp_leases/test_files/debian7.leases") result = leases.get() self.assertEqual(len(result), 5) self.assertEqual(result[0].ip, "10.0.0.10") self.assertEqual(result[0].valid, False) self.assertEqual(result[0].active, False) self.assertEqual(result[0].binding_state, 'free') 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)) leases = IscDhcpLeases("isc_dhcp_leases/test_files/pfsense.leases") result = leases.get() self.assertEqual(len(result), 2) self.assertEqual(result[0].ip, "10.0.10.72") self.assertEqual(result[0].valid, True) self.assertEqual(result[0].active, True) self.assertEqual(result[0].binding_state, 'active') 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)) leases = IscDhcpLeases("isc_dhcp_leases/test_files/dhcpd6-4.2.4.leases") result = leases.get() self.assertEqual(len(result), 2) self.assertEqual(result[0].ip, "2001:610:600:891d::60") self.assertEqual(result[0].host_identifier, b"4dv\xea\x00\x01\x00\x01\x1df\x1f\xe2\n\x00'\x00\x00\x00") self.assertEqual(result[0].iaid, 3933627444) self.assertEqual(result[0].duid, b"\x00\x01\x00\x01\x1df\x1f\xe2\n\x00'\x00\x00\x00") self.assertEqual(result[0].valid, True) self.assertEqual(result[0].active, True) 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].type, Lease6.NON_TEMPORARY) self.assertEqual(result[1].ip, "2001:610:500:fff::/64") self.assertEqual(result[1].host_identifier, b"4dv\xea\x00\x01\x00\x01\x1df\x1f\xe2\n\x00'\x00\x00\x00") self.assertEqual(result[1].iaid, 3933627444) self.assertEqual(result[1].duid, b"\x00\x01\x00\x01\x1df\x1f\xe2\n\x00'\x00\x00\x00") self.assertEqual(result[1].valid, True) self.assertEqual(result[1].active, True) 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].type, Lease6.PREFIX_DELEGATION) leases = IscDhcpLeases("isc_dhcp_leases/test_files/dhcpd6-4.3.3.leases") result = leases.get() self.assertEqual(len(result), 4) self.assertEqual(result[0].ip, "2001:10:10::106") self.assertEqual(result[0].host_identifier, b"\001\000\000\000\000\001\000\001\034\367\020\245\000'\"3+4") self.assertEqual(result[0].iaid, 1) self.assertEqual(result[0].duid, b"\x00\x01\x00\x01\x1c\xf7\x10\xa5\x00\'\"3+4") self.assertEqual(result[0].valid, True) self.assertEqual(result[0].active, True) 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].type, Lease6.NON_TEMPORARY) self.assertEqual(result[1].ip, "2001:10:30:ff00::/56") self.assertEqual(result[1].host_identifier, b"\x00\x00\x00\x00\x00\x01\x00\x01\x1d4L\x00\x00%\x90k\xa14") self.assertEqual(result[1].iaid, 0) self.assertEqual(result[1].duid, b"\x00\x01\x00\x01\x1d4L\x00\x00%\x90k\xa14") self.assertEqual(result[1].valid, True) self.assertEqual(result[1].active, True) self.assertEqual(result[1].binding_state, 'active') self.assertEqual(result[1].preferred_life, 540) self.assertEqual(result[1].max_life, 864) self.assertEqual(result[1].last_communication, datetime(2016, 1, 6, 14, 52, 37)) self.assertEqual(result[1].type, Lease6.PREFIX_DELEGATION)
from isc_dhcp_leases.iscdhcpleases import Lease, IscDhcpLeases import socket import time leases = IscDhcpLeases('/var/lib/dhcp/dhcpd.leases') active_leases = leases.get_current() print('ffrn.' + socket.getfqdn() + '.dhcp.active_leases ' + str(len(active_leases)) + ' ' + str(int(time.time())))
def test_naive_time(self): with self.assertRaises(ValueError): IscDhcpLeases("isc_dhcp_leases/test_files/debian7.leases", now=datetime.datetime.now())