-
Notifications
You must be signed in to change notification settings - Fork 19
Expand file tree
/
Copy pathHttpServer.py
More file actions
113 lines (103 loc) · 4.25 KB
/
HttpServer.py
File metadata and controls
113 lines (103 loc) · 4.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from SocketServer import ThreadingMixIn
import threading
import json
from datetime import datetime
import time
import subprocess
import sys
# Look up the full hostname using gethostbuaddr() is too slow.
import BaseHTTPServer
def not_insance_address_string(self):
host, port = self.client_address[:2]
# Just only return host.
return '%s (no getfqdn)' % host
BaseHTTPServer.BaseHTTPRequestHandler.address_string = not_insance_address_string
class Handler(BaseHTTPRequestHandler):
content = {}
intvl = 10
pollsters = ['pollster.cpu.CPUUsagePollster','pollster.mem.MemInfoPollster','pollster.load.LoadStatPollster','pollster.disk.DiskUsagePollster','pollster.net.NetStatPollster']
poll_path = '/usr/local/procagent'
# timestamp of get from host
ts_get = ''
def do_GET(self):
if self.path == '/getdata':
self.send_response(200)
self.send_header("Content-type", "text/json")
Handler.ts_get = time.asctime(time.localtime())
t_content = datetime.strptime(Handler.content['timestamp'], "%a %b %d %H:%M:%S %Y")
t_last_get = datetime.strptime(Handler.ts_get, "%a %b %d %H:%M:%S %Y")
if (t_last_get - t_content).seconds < 60:
Handler.content['status'] = 'NORMAL'
else:
Handler.content['status'] = 'POLLING_TIMEOUT'
Handler.content['data'] = {}
pingPopen = subprocess.Popen(args='python %s/PollManager.py restart' % (Handler.poll_path), shell=True)
obj_str = json.dumps(Handler.content)
self.send_header("Content-Length", str(len(obj_str)))
self.end_headers()
self.wfile.write(obj_str.encode())
self.wfile.write('\n')
elif self.path == '/getintvl':
self.send_response(200)
self.end_headers()
self.wfile.write(Handler.intvl)
self.wfile.write('\n')
elif self.path == '/getpollsters':
self.send_response(200)
self.send_header("Content-type", "text/json")
poll_str = json.dumps(Handler.pollsters)
self.send_header("Content-Length", str(len(poll_str)))
self.end_headers()
self.wfile.write(poll_str.encode())
self.wfile.write('\n')
elif self.path == '/rstsvr':
pingPopen = subprocess.Popen(args='python %s/PollManager.py restart' % (Handler.poll_path), shell=True)
self.send_response(200)
self.end_headers()
self.wfile.write('Restart server ok!')
self.wfile.write('\n')
else:
self.send_response(404)
self.end_headers()
def do_POST(self):
if self.path == '/setdata':
length = self.headers['content-length']
data = self.rfile.read(int(length))
Handler.content = eval(data.decode())
self.send_response(200)
self.end_headers()
self.wfile.write(str(Handler.content))
self.wfile.write('\n')
elif self.path == '/setintvl':
length = self.headers['content-length']
data = self.rfile.read(int(length))
Handler.intvl = eval(data.decode())
self.send_response(200)
self.end_headers()
self.wfile.write(str(Handler.intvl))
self.wfile.write('\n')
elif self.path == '/setpollsters':
length = self.headers['content-length']
data = self.rfile.read(int(length))
Handler.pollsters = eval(data.decode())
self.send_response(200)
self.end_headers()
self.wfile.write(str(Handler.pollsters))
self.wfile.write('\n')
else:
self.send_response(404)
self.end_headers()
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
"""Handle requests in a separate thread."""
if __name__ == '__main__':
server = None
try:
server = ThreadedHTTPServer(('0.0.0.0', 8655), Handler)
if sys.argv[1]:
Handler.poll_path = sys.argv[1]
print 'Starting server, use <Ctrl-C> to stop'
server.serve_forever()
except:
if server:
server.socket.close()