79 lines
2.1 KiB
Python
79 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
|
|
from requests import get
|
|
from os.path import isfile
|
|
from re import compile, match
|
|
|
|
|
|
class MACChecker:
|
|
def __init__(self):
|
|
self._url = "https://standards-oui.ieee.org/oui/oui.txt"
|
|
self._ouiTextFile = "oui.txt"
|
|
|
|
def updateOUIDb(self):
|
|
print("Updating the OUI database from IEEE")
|
|
report = dict()
|
|
|
|
# We download the data from IEEE
|
|
oui = get(self._url)
|
|
if oui.status_code != 200:
|
|
report['success'] = False
|
|
exit(1)
|
|
|
|
with open(self._ouiTextFile, "w") as f:
|
|
f.write(oui.text)
|
|
|
|
report['success'] = True
|
|
return report
|
|
|
|
def parseMACAddress(self, mac):
|
|
report = dict()
|
|
report['hw'] = mac
|
|
|
|
if ':' in mac:
|
|
mac = mac.replace(":", "-")
|
|
|
|
# Check if mac is valid
|
|
regex = "[a-fA-F0-9]{2}-[a-fA-F0-9]{2}-[a-fA-F0-9]{2}-[a-fA-F0-9]{2}-[a-fA-F0-9]{2}-[a-fA-F0-9]{2}"
|
|
compiled = compile(regex)
|
|
if not compiled.match(mac):
|
|
print("Not a valid MAC address")
|
|
return
|
|
|
|
# Check if the oui.txt file exist
|
|
if not isfile(self._ouiTextFile):
|
|
report['db'] = self.updateOUIDb()
|
|
entries = self._parseOUIFile()
|
|
|
|
macSplitted = mac.split("-")
|
|
oui = macSplitted[0] + macSplitted[1] + macSplitted[2]
|
|
oui = oui.upper()
|
|
report['oui'] = oui
|
|
|
|
f = self._parseOUIFile()
|
|
for entries in f.keys():
|
|
if oui == entries:
|
|
report['vendor'] = f[entries][0]
|
|
|
|
return report
|
|
|
|
def _parseOUIFile(self):
|
|
data = list()
|
|
entries = dict()
|
|
|
|
with open(self._ouiTextFile, "r") as f:
|
|
data = f.readlines()
|
|
|
|
# Remove the "header" on the file
|
|
d = data[4:]
|
|
regex = "[a-zA-Z0-9]{6}"
|
|
compiled = compile(regex)
|
|
for entry in d:
|
|
s_entry = entry.split("\t")
|
|
s = len(s_entry)
|
|
if compiled.match(s_entry[0]):
|
|
oui = s_entry[0].split(" ")
|
|
entries[oui[0]] = s_entry[s - 1: s]
|
|
|
|
return entries
|