parent
f41fea959b
commit
42a2e51301
1 changed files with 79 additions and 0 deletions
@ -0,0 +1,79 @@ |
|||||||
|
import sys |
||||||
|
from argparse import ArgumentParser |
||||||
|
from os import stat, mkdir |
||||||
|
from os.path import isfile, expanduser, isdir |
||||||
|
from re import compile, match as rmatch, VERBOSE |
||||||
|
from colorama import Fore, init |
||||||
|
from requests import get as r_get |
||||||
|
|
||||||
|
|
||||||
|
def download_oui_defs(fpath: str, force_dl=False) -> bool: |
||||||
|
# file exists and is not older than 1 week |
||||||
|
if (isfile(fpath) and stat(fpath).st_mtime > 604800) and not force_dl: |
||||||
|
print(f"{Fore.CYAN}Definitions exist and file is less than one week old, omitting download") |
||||||
|
return True |
||||||
|
else: |
||||||
|
if force_dl: |
||||||
|
print(f"{Fore.LIGHTRED_EX}Download forced, please wait...") |
||||||
|
else: |
||||||
|
print(f"{Fore.CYAN}Definitions not found or too old, downloading file, please wait...") |
||||||
|
r = r_get("http://standards-oui.ieee.org/oui.txt") |
||||||
|
if r.status_code == 200: |
||||||
|
with open(fpath, "wb") as fp: |
||||||
|
fp.write(r.content) |
||||||
|
return True |
||||||
|
else: |
||||||
|
print(f"{Fore.RED}Couldn't download oui definitions! HTTP status was {r.status_code}") |
||||||
|
return False |
||||||
|
|
||||||
|
|
||||||
|
def lookup(fpath: str, mac: str) -> bool: |
||||||
|
vendor = mac[0:8].upper().replace(":", "-") |
||||||
|
pattern = compile(r"""^[0-9A-F]{2} # match first octett at start of string |
||||||
|
[-] # match literal - |
||||||
|
[0-9A-F]{2} # match second otctett |
||||||
|
[-] # match literal - |
||||||
|
[0-9A-F]{2} # match third octett |
||||||
|
.*$ # match until end of string""", flags=VERBOSE) |
||||||
|
|
||||||
|
with open(fpath, "rb") as fp_read: |
||||||
|
for line in fp_read: |
||||||
|
match = rmatch(pattern, line.decode('utf8')) |
||||||
|
if match: |
||||||
|
entry = match.group() |
||||||
|
entry = entry.split("\t") |
||||||
|
oui = entry[0].split()[0] |
||||||
|
name = entry[-1] |
||||||
|
if vendor == oui: |
||||||
|
print(f"{Fore.GREEN}{mac} belongs to {name}") |
||||||
|
return True |
||||||
|
print(f"{Fore.RED}Couldn't find oui {vendor}") |
||||||
|
return False |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
init(autoreset=True) |
||||||
|
|
||||||
|
parser = ArgumentParser(description="oui.py: MAC vendor lookup") |
||||||
|
parser.add_argument("mac", help="The MAC address to process") |
||||||
|
parser.add_argument("--force", action="store_true", help="Force download of definitions file") |
||||||
|
parser.add_argument("--file", help="Override where file is stored and/or use this definition file") |
||||||
|
args = parser.parse_args() |
||||||
|
|
||||||
|
if args.file: |
||||||
|
f_path = args.file |
||||||
|
else: |
||||||
|
if not isdir(expanduser("~/.oui")): |
||||||
|
mkdir(expanduser("~/.oui")) |
||||||
|
f_path = expanduser("~/.oui/oui.txt") |
||||||
|
|
||||||
|
if not download_oui_defs(f_path, args.force): |
||||||
|
sys.exit(1) |
||||||
|
|
||||||
|
if not lookup(f_path, args.mac): |
||||||
|
sys.exit(1) |
||||||
|
|
||||||
|
sys.exit(0) |
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in new issue