server.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #!/usr/bin/env python
  2. import errno
  3. import json
  4. import os
  5. from os import path
  6. import traceback
  7. import warnings
  8. warnings.filterwarnings('ignore', 'libevent')
  9. import gevent.pywsgi
  10. import fileio
  11. import reloader
  12. DATA_DIR = path.expanduser('~/sysvitals_data')
  13. handlers = None
  14. def main():
  15. global handlers
  16. handlers = {
  17. 'data': get_data,
  18. 'datum': post_datum,
  19. }
  20. server = gevent.pywsgi.WSGIServer(('0.0.0.0', 8892), application)
  21. reloader.init(server)
  22. server.serve_forever()
  23. def application(environ, start_response):
  24. try:
  25. split = environ['PATH_INFO'][1:].split('/')
  26. if split[0] == 'v1':
  27. handler = handlers.get(split[2])
  28. if handler:
  29. body = handler(split, environ)
  30. start_response('200 OK', [('Content-type', 'text/plain')])
  31. return [body]
  32. else:
  33. print 'no handler for', split
  34. else:
  35. print 'split was', split
  36. except:
  37. traceback.print_exc()
  38. start_response('500 Internal Server Error', [('Content-type', 'text/plain')])
  39. return ['ruh roh']
  40. def get_data(split, environ):
  41. group = int(split[1])
  42. client_id = int(split[3])
  43. data_path = path.join(DATA_DIR, str(group), str(client_id))
  44. with open(data_path, 'r') as f:
  45. stats = fileio.read_stats(f)
  46. return json.dumps(stats)
  47. def post_datum(split, environ):
  48. group = int(split[1])
  49. body = json.load(environ['wsgi.input'])
  50. client_id = body['client_id']
  51. group_dir = path.join(DATA_DIR, str(group))
  52. try:
  53. os.makedirs(group_dir)
  54. except OSError as e:
  55. if e.errno != errno.EEXIST:
  56. raise
  57. with open(path.join(group_dir, str(client_id)), 'w') as f:
  58. fileio.write_datum(f, body)
  59. return '{"status": "ok"}'
  60. main()