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