Source code for amazon_dash.discovery
import click
from amazon_dash.scan import scan_devices
AMAZON_DEVICES = [
'F0:D2:F1',
'88:71:E5',
'FC:A1:83',
'F0:27:2D',
'74:C2:46',
'68:37:E9',
'78:E1:03',
'38:F7:3D',
'50:DC:E7',
'A0:02:DC',
'0C:47:C9',
'74:75:48',
'AC:63:BE',
'FC:A6:67',
'18:74:2E',
'00:FC:8B',
'FC:65:DE',
'6C:56:97',
'44:65:0D',
'50:F5:DA',
'68:54:FD',
'40:B4:CD',
'00:71:47',
'4C:EF:C0',
'84:D6:D0',
'34:D2:70',
'B4:7C:9C',
'F0:81:73',
]
"""Amazon Dash Mac Devices. Source: https://standards.ieee.org/develop/regauth/oui/oui.csv
Snippet for Re-generate this list:
>>> import csv
>>> print('\n'.join([':'.join([row[1][i:i+2] for i in range(0, len(row[1]), 2)])
for row in csv.reader(open('oui.csv')) if row[2] == 'Amazon Technologies Inc.']))
"""
BANNED_DEVICES = ['00:00:00:00:00:00']
"""These mac addresses will not be considered valid results on discovery.
"""
HELP = """\
The discovery command lists the devices that are connected in your network. \
Each device will only be listed once. After executing this command wait approximately \
10 seconds before pressing the Amazon Dash button. After pressing the button, the Mac \
address of the button will immediately appear on the screen. Remember the address to be \
able to create the configuration file.\
"""
mac_id_list = []
"""Mac addresses already known. Mac addresses only appear once.
"""
[docs]def pkt_text(pkt):
"""Return source mac address for this Scapy Packet
:param scapy.packet.Packet pkt: Scapy Packet
:return: Mac address. Include (Amazon Device) for these devices
:rtype: str
"""
if pkt.src.upper() in BANNED_DEVICES:
body = ''
elif pkt.src.upper()[:8] in AMAZON_DEVICES:
body = '{} (Amazon Device)'.format(pkt.src)
else:
body = pkt.src
return body
[docs]def discovery_print(pkt):
"""Scandevice callback. Register src mac to avoid src repetition.
Print device on screen.
:param scapy.packet.Packet pkt: Scapy Packet
:return: None
"""
if pkt.src in mac_id_list:
return
mac_id_list.append(pkt.src)
text = pkt_text(pkt)
click.secho(text, fg='magenta') if 'Amazon' in text else click.echo(text)
[docs]def discover(interface=None):
"""Print help and scan devices on screen.
:return: None
"""
click.secho(HELP, fg='yellow')
scan_devices(discovery_print, lfilter=lambda d: d.src not in mac_id_list, iface=interface)