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

vpn: resolve IPs to their netblock

Helge Jung пре 9 година
родитељ
комит
0bbf527288
1 измењених фајлова са 37 додато и 1 уклоњено
  1. 37 1
      ffstatus/server.py

+ 37 - 1
ffstatus/server.py

@@ -24,6 +24,25 @@ class BatcaveHttpRequestHandler(BaseHTTPRequestHandler):
 		self.logger = logging.getLogger('API')
 		BaseHTTPRequestHandler.__init__(self, request, client_address, server)
 
+		# check all entries for a proper 'remote' entry
+		vpn = self.server.storage.data[self.DATAKEY_VPN]
+		for key in vpn:
+			if not isinstance(vpn[key], dict):
+				continue
+			for mode in vpn[key]:
+				if not isinstance(vpn[key][mode], dict):
+					continue
+				for gw in vpn[key][mode]:
+					if not isinstance(vpn[key][mode][gw], dict):
+						continue
+					item = vpn[key][mode][gw]
+					if 'remote' in item and not 'remote_raw' in item:
+						item['remote_raw'] = item['remote']
+						resolved = ffstatus.resolve_ipblock(item['remote'])
+						if not resolved is None:
+							self.logger.info('Startup: resolved VPN entry \'{0}\' to net \'{1}\'.'.format(item['remote'], resolved['name']))
+							item['remote'] = resolved
+
 	def parse_url_pathquery(self):
 		"""Extracts the query parameters from the request path."""
 		url = re.match(r'^/(?P<path>.*?)(\?(?P<query>.+))?$', self.path.strip())
@@ -360,8 +379,23 @@ class BatcaveHttpRequestHandler(BaseHTTPRequestHandler):
 		if not key in storage.data[self.DATAKEY_VPN]: storage.data[self.DATAKEY_VPN][key] = { 'active': {}, 'last': {} }
 		item = storage.data[self.DATAKEY_VPN][key]
 
+		# resolve remote addr to its netblock
+		remote_raw = remote
+		remote_resolved = None
+		if not remote is None:
+			remote_resolved = ffstatus.resolve_ipblock(remote)
+			if not remote_resolved is None:
+				self.logger.debug('Resolved IP \'{0}\' to block \'{1}\'.'.format(remote, remote_resolved['name']))
+				remote = remote_resolved
+
 		if action == 'establish':
-			item['active'][gw] = { 'establish': time.time(), 'peer': peername, 'remote': remote }
+			item['active'][gw] = {
+				'establish': time.time(),
+				'peer': peername,
+				'remote': remote,
+				'remote_raw': remote_raw,
+			}
+
 		elif action == 'disestablish':
 			active = {}
 			if gw in item['active']:
@@ -422,6 +456,8 @@ class BatcaveHttpRequestHandler(BaseHTTPRequestHandler):
 						ip = ''
 						if t in item and gw in item[t]:
 							ip = item[t][gw]['remote'] if 'remote' in item[t][gw] else ''
+							if isinstance(ip, dict):
+								ip = ip['name']
 						self.wfile.write('<td title="' + ip + '">' + ('&check;' if len(ip) > 0 else '&times;') + '</td>')
 
 				self.wfile.write('</tr>\n')