Преглед изворни кода

Merge master branch

Conflicts:
	modules/ffpb.py
Helge Jung пре 9 година
родитељ
комит
e02692b9ca
1 измењених фајлова са 28 додато и 5 уклоњено
  1. 28 5
      modules/ffpb.py

+ 28 - 5
modules/ffpb.py

@@ -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