|
@@ -3,6 +3,7 @@ from __future__ import print_function
|
|
|
import willie
|
|
|
|
|
|
import datetime
|
|
|
+import difflib
|
|
|
from email.utils import mktime_tz
|
|
|
import git
|
|
|
import netaddr
|
|
@@ -146,6 +147,7 @@ def ffpb_findnode(bot, name):
|
|
|
return None
|
|
|
|
|
|
name = str(name).strip()
|
|
|
+ names = {}
|
|
|
|
|
|
alfred_data = bot.memory['alfred_data'] if 'alfred_data' in bot.memory else None
|
|
|
|
|
@@ -166,14 +168,23 @@ def ffpb_findnode(bot, name):
|
|
|
if "mesh_interfaces" in node["network"]:
|
|
|
for mim in node["network"]["mesh_interfaces"]:
|
|
|
if mim.lower() == mac:
|
|
|
- return node
|
|
|
+ return node
|
|
|
+
|
|
|
+ return {
|
|
|
+ 'hostname': '?-' + mac.replace(':','').lower(),
|
|
|
+ 'network': { 'addresses': [ mac2ipv6(mac, 'fdca:ffee:ff12:132:') ], 'mac': mac, },
|
|
|
+ 'hardware': { 'model': 'derived-from-mac' },
|
|
|
+ }
|
|
|
|
|
|
# look through the ALFRED peers
|
|
|
- possible_matches = []
|
|
|
for nodeid in alfred_data:
|
|
|
node = alfred_data[nodeid]
|
|
|
- if "hostname" in node and node["hostname"].lower() == name.lower():
|
|
|
- return node
|
|
|
+ if 'hostname' in node:
|
|
|
+ h = node['hostname']
|
|
|
+ if h.lower() == name.lower():
|
|
|
+ return node
|
|
|
+ else:
|
|
|
+ names[h] = nodeid
|
|
|
|
|
|
# still not found -> try peers_repo
|
|
|
if not peers_repo is None:
|
|
@@ -195,7 +206,19 @@ def ffpb_findnode(bot, name):
|
|
|
peerfile.close()
|
|
|
|
|
|
if not (peer_mac is None):
|
|
|
- return { "hostname": peer_name, "network": { "addresses": [ mac2ipv6(peer_mac, "fdca:ffee:ff12:132:") ], "mac": peer_mac } }
|
|
|
+ return {
|
|
|
+ 'hostname': peer_name,
|
|
|
+ 'network': { 'addresses': [ mac2ipv6(peer_mac, 'fdca:ffee:ff12:132:') ], 'mac': peer_mac },
|
|
|
+ 'hardware': { 'model': 'derived-from-vpnkeys' },
|
|
|
+ }
|
|
|
+
|
|
|
+ # do a similar name lookup in the ALFRED data
|
|
|
+ if not alfred_data is None:
|
|
|
+ possibilities = difflib.get_close_matches(name, [ x for x in names ], cutoff=0.8)
|
|
|
+ print('findnode: Fuzzy matching \'{0}\' got {1} entries: {2}'.format(name, len(possibilities), ', '.join(possibilities)))
|
|
|
+ if len(possibilities) == 1:
|
|
|
+ # if we got exactly one candidate that might be it
|
|
|
+ return alfred_data[names[possibilities[0]]]
|
|
|
|
|
|
return None
|
|
|
|