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 struct
  7. import gevent.pywsgi
  8. DATA_DIR = path.expanduser('~/sysvitals_data')
  9. def application(environ, start_response):
  10. split = environ['PATH_INFO'][1:].split('/')
  11. if split[0] == 'v1':
  12. handler = handlers.get(split[2])
  13. if handler:
  14. start_response('200 OK', [('Content-type', 'text/plain')])
  15. return [handler(split, environ)]
  16. else:
  17. print 'no handler for', split
  18. else:
  19. print 'split was', split
  20. formats = {
  21. 'cpu': 'f',
  22. 'mem': 'l',
  23. 'net': 'l',
  24. 'disk': 'l',
  25. }
  26. def datum(split, environ):
  27. group = int(split[1])
  28. body = json.load(environ['wsgi.input'])
  29. client_id = body['client_id']
  30. group_dir = path.join(DATA_DIR, str(group))
  31. try:
  32. os.makedirs(group_dir)
  33. except OSError as e:
  34. if e.errno != errno.EEXIST:
  35. raise
  36. with open(path.join(group_dir, str(client_id)), 'w') as f:
  37. for stat_group, stats in body.items():
  38. if stat_group == 'client_id':
  39. continue
  40. format_code = formats[stat_group]
  41. for stat, data in stats.items():
  42. key = '%s.%s' % (stat_group, stat)
  43. write_stat(f, key.encode('utf-8'), format_code, data)
  44. return '{"status": "ok"}'
  45. def write_stat(f, key, format_code, data):
  46. fmt = '%dp 1440%s' % (len(key) + 1, format_code)
  47. array = [0] * 1440
  48. array[0] = data
  49. f.write(struct.pack(fmt, key, *array))
  50. handlers = {
  51. 'datum': datum,
  52. }
  53. server = gevent.pywsgi.WSGIServer(('0.0.0.0', 8892), application)
  54. server.serve_forever()