Selaa lähdekoodia

server: add /node/<id>/field query for individual data fields

String values are returned as text/plain, all other as text/json.
Helge Jung 9 vuotta sitten
vanhempi
commit
6f7929b251
1 muutettua tiedostoa jossa 25 lisäystä ja 2 poistoa
  1. 25 2
      ffstatus/server.py

+ 25 - 2
ffstatus/server.py

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