Browse Source

server: add /status/<nodeid>

Returns one of the strings 'unknown', 'active', 'stale' or 'offline'
depending on the last batadv update.
Helge Jung 9 years ago
parent
commit
9bf329ac97
1 changed files with 34 additions and 1 deletions
  1. 34 1
      ffstatus/server.py

+ 34 - 1
ffstatus/server.py

@@ -16,6 +16,7 @@ import time
 
 class BatcaveHttpRequestHandler(BaseHTTPRequestHandler):
 	DATAKEY_VPN = '__VPN__'
+	FIELDKEY_UPDATED = '__UPDATED__'
 
 	def __init__(self, request, client_address, server):
 		self.logger = logging.getLogger('API')
@@ -74,6 +75,12 @@ class BatcaveHttpRequestHandler(BaseHTTPRequestHandler):
 				self.respond_nodedetail(m.group(1), cmd[1:])
 			return
 
+		# /status/<id> - node's status
+		m = re.match(r'status/([a-f0-9]{12})$', path)
+		if m != None:
+			self.respond_nodestatus(m.group(1))
+			return
+
 		# no match -> 404
 		self.send_error(404, 'The URL \'{0}\' was not found here.'.format(path))
 
@@ -246,9 +253,35 @@ class BatcaveHttpRequestHandler(BaseHTTPRequestHandler):
 		self.send_headers('text/json')
 		self.wfile.write(json.dumps(node))
 
+	def respond_nodestatus(self, rawid):
+		"""Display node status."""
+
+		# search node by the given id
+		node = self.find_node(rawid)
+
+		# handle unknown nodes
+		if node is None:
+			self.send_error(404, 'No node with id \'' + rawid + '\' present.')
+			return
+
+		self.send_headers('text/plain')
+
+		updated = node[self.FIELDKEY_UPDATED] if self.FIELDKEY_UPDATED in node else None
+		if updated is None or not 'batadv' in updated:
+			self.wfile.write('unknown')
+			return
+
+		diff = time.time() - updated['batadv']
+		if diff < 150:
+			self.wfile.write('active')
+		elif diff < 300:
+			self.wfile.write('stale')
+		else:
+			self.wfile.write('offline')
+
 	def respond_nodeidmac2name(self, ids):
 		storage = self.server.storage
-		
+
 		self.send_headers('text/plain')
 		for nodeid in ids:
 			node = self.find_node(nodeid) if not ':' in nodeid else self.find_node_by_mac(nodeid)