server.py 1.4 KB

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