|
@@ -35,9 +35,13 @@ class BatcaveHttpRequestHandler(BaseHTTPRequestHandler):
|
|
|
self.respond_list(query)
|
|
|
return
|
|
|
|
|
|
- m = re.match(r'node/([a-f0-9]{12})\.json$', path)
|
|
|
+ m = re.match(r'node/([a-f0-9]{12})(?P<cmd>\.json|/[a-zA-Z0-9_\-]+)$', path)
|
|
|
if m != None:
|
|
|
- self.respond_node(m.group(1))
|
|
|
+ cmd = m.group('cmd')
|
|
|
+ if cmd == '.json':
|
|
|
+ self.respond_node(m.group(1))
|
|
|
+ else:
|
|
|
+ self.respond_nodedetail(m.group(1), cmd[1:])
|
|
|
return
|
|
|
|
|
|
self.send_error(404, 'The URL \'{0}\' was not found here.'.format(path))
|
|
@@ -132,6 +136,25 @@ class BatcaveHttpRequestHandler(BaseHTTPRequestHandler):
|
|
|
self.end_headers()
|
|
|
self.wfile.write(json.dumps(storage.data[nodeid]))
|
|
|
|
|
|
+ def respond_nodedetail(self, nodeid, field):
|
|
|
+ storage = self.server.storage
|
|
|
+
|
|
|
+ if not nodeid in storage.data:
|
|
|
+ self.send_error(404, 'No node with id \'' + nodeid + '\' present.')
|
|
|
+ return
|
|
|
+
|
|
|
+ if not field in storage.data[nodeid]:
|
|
|
+ self.send_error(404, 'The node \'' + nodeid + '\' does not have a field named \'' + str(field) + '\'.')
|
|
|
+ return
|
|
|
+
|
|
|
+ value = storage.data[nodeid][field]
|
|
|
+
|
|
|
+ self.send_response(200)
|
|
|
+ self.send_header('Content-Type', 'text/plain' if isinstance(value, basestring) else 'text/json')
|
|
|
+ self.send_nocache_headers()
|
|
|
+ self.end_headers()
|
|
|
+ self.wfile.write(value if isinstance(value, basestring) else json.dumps(value))
|
|
|
+
|
|
|
class ApiServer(ThreadingMixIn, HTTPServer):
|
|
|
def __init__(self, endpoint, storage):
|
|
|
HTTPServer.__init__(self, endpoint, BatcaveHttpRequestHandler)
|