瀏覽代碼

api server

raylu 11 年之前
父節點
當前提交
8d54f5ab5f
共有 2 個文件被更改,包括 64 次插入2 次删除
  1. 62 0
      api/server.py
  2. 2 2
      client/sysvitals_client

+ 62 - 0
api/server.py

@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+
+import errno
+import json
+import os
+from os import path
+import struct
+
+import gevent.pywsgi
+
+DATA_DIR = path.expanduser('~/sysvitals_data')
+
+def application(environ, start_response):
+	split = environ['PATH_INFO'][1:].split('/')
+	if split[0] == 'v1':
+		handler = handlers.get(split[2])
+		if handler:
+			start_response('200 OK', [('Content-type', 'text/plain')])
+			return [handler(split, environ)]
+		else:
+			print 'no handler for', split
+	else:
+		print 'split was', split
+
+formats = {
+	'cpu': 'f',
+	'mem': 'l',
+	'net': 'l',
+	'disk': 'l',
+}
+def datum(split, environ):
+	group = int(split[1])
+	body = json.load(environ['wsgi.input'])
+	client_id = body['client_id']
+	group_dir = path.join(DATA_DIR, str(group))
+	try:
+		os.makedirs(group_dir)
+	except OSError as e:
+		if e.errno != errno.EEXIST:
+			raise
+	with open(path.join(group_dir, str(client_id)), 'w') as f:
+		for stat_group, stats in body.items():
+			if stat_group == 'client_id':
+				continue
+			format_code = formats[stat_group]
+			for stat, data in stats.items():
+				key = '%s.%s' % (stat_group, stat)
+				write_stat(f, key.encode('utf-8'), format_code, data)
+	return '{"status": "ok"}'
+
+def write_stat(f, key, format_code, data):
+	fmt = '%dp 1440%s' % (len(key) + 1, format_code)
+	array = [0] * 1440
+	array[0] = data
+	f.write(struct.pack(fmt, key, *array))
+
+handlers = {
+	'datum': datum,
+}
+
+server = gevent.pywsgi.WSGIServer(('0.0.0.0', 8892), application)
+server.serve_forever()

+ 2 - 2
client/sysvitals_client

@@ -1,8 +1,8 @@
-#!/usr/bin/python3
+#!/usr/bin/python
 
 import psutil
 
-print(psutil.cpu_times_percent(interval=1))
+print(psutil.cpu_times())
 print(psutil.virtual_memory())
 print(psutil.net_io_counters())
 for partition in psutil.disk_partitions():