server.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. from __future__ import print_function
  4. from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
  5. from storage import Storage
  6. import json
  7. import re
  8. class BatcaveHttpRequestHandler(BaseHTTPRequestHandler):
  9. storage = Storage()
  10. def do_GET(self):
  11. url = self.path
  12. if url == '/':
  13. self.respond_index()
  14. return
  15. m = re.match(r'^/node/([a-f0-9]{12})\.json$', url)
  16. if m != None:
  17. self.respond_node(m.group(1))
  18. return
  19. self.send_error(404, 'The URL \'{0}\' was not found here.'.format(url))
  20. def respond_index(self):
  21. self.send_response(200)
  22. self.send_header('Content-Type', 'text/html; charset=utf-8')
  23. self.end_headers()
  24. self.wfile.write('<!DOCTYPE html><html><head><title>BATCAVE</title></head>\n')
  25. self.wfile.write('<body>\n')
  26. self.wfile.write('<H1 title="Batman/Alfred Transmission Collection, Aggregation & Value Engine">BATCAVE</H1>\n')
  27. self.wfile.write('<p>Dies ist ein interner Hintergrund-Dienst. Er wird nur von anderen Diensten\n')
  28. self.wfile.write('angesprochen und sollte aus einer Mehrzahl von Gr&uuml;nden nicht &ouml;ffentlich\n')
  29. self.wfile.write('zug&auml;nglich sein.</p>\n')
  30. self.wfile.write('<H2>Status</H2>\n')
  31. self.wfile.write('Daten: <span id="datacount" class="value">')
  32. self.wfile.write(len(self.storage.data))
  33. self.wfile.write('</span>\n')
  34. self.wfile.write('<H2>API</H2>\n')
  35. self.wfile.write('<p>Grundsätzlich ist das Antwort-Format JSON und alle Daten sind Live-Daten (kein Cache) die ggf. etwas Bearbeitungs-Zeit erfordern.</p>')
  36. self.wfile.write('<dl>\n')
  37. self.wfile.write('<dt><a href="/nodes.json">nodes.json</a></dt><dd>zur Verwendung mit ffmap (MACs anonymisiert)</dd>\n')
  38. self.wfile.write('<dt><a href="/node/ff00ff00ff00.json">/node/&lt;id&gt;.json</a></dt><dd><u>alle</u> vorhandenen Information zu der gewünschten Node</dd>\n')
  39. self.wfile.write('</dl>\n')
  40. self.wfile.write('</body></html>')
  41. def respond_node(self, nodeid):
  42. if nodeid == 'ff00ff00ff00':
  43. self.send_response(200)
  44. self.send_header('Content-Type', 'text/json')
  45. self.end_headers()
  46. self.wfile.write(json.dumps({
  47. 'name': 'API-Example',
  48. 'nodeid': nodeid,
  49. 'META': 'Dies ist ein minimaler Beispiel-Datensatz. Herzlichen Glückwunsch, du hast das Prinzip der API kapiert.',
  50. }))
  51. return
  52. if not nodeid in self.storage.data:
  53. self.send_error(404, 'No node with id \'' + nodeid + '\' present.')
  54. return
  55. self.send_response(200)
  56. self.send_headers('Content-Type', 'text/json')
  57. self.end_headers()
  58. self.wfile.write(json.dumps(self.storage.data[nodeid]))
  59. if __name__ == '__main__':
  60. server = HTTPServer(('localhost', 8888), BatcaveHttpRequestHandler)
  61. print("Server:", str(server))
  62. server.serve_forever()