示例#1
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': 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())))
示例#2
0
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])
示例#4
0
 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)
示例#6
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))

        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)
示例#7
0
 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)
示例#9
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())))
示例#10
0
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)
示例#11
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": 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())))
示例#12
0
    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()
示例#13
0
 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)
示例#15
0
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)
示例#17
0
    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)
示例#18
0
    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)
示例#19
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'})
示例#22
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)
示例#23
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))

        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)
示例#24
0
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())