summaryrefslogtreecommitdiffstats
path: root/src/ogRest.py
blob: f470f0b719485afeb4d1bc06eb675d16f1b36e32 (plain)
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
import threading
import platform
import time
from enum import Enum
import json
import queue

if platform.system() == 'Linux':
	from src.linux import ogOperations

class ogThread():
	# Executing cmd thread
	def execcmd(msgqueue, cmd):
		msgqueue.put(ogOperations.execCMD(cmd))

	# Powering off thread
	def pwoff():
		time.sleep(2)
		ogOperations.poweroff()

	# Rebooting thread
	def rebt():
		ogOperations.reboot()

class ogResponses(Enum):
	BAD_REQUEST=0
	IN_PROGRESS=1
	OK=2

class ogRest():
	def __init__(self):
		self.msgqueue = queue.Queue(1000)

	def buildJsonResponse(self, idstr, content):
		data = { idstr :content }
		return json.dumps(data)

	def getResponse(self, response, idstr=None, content=None):
		msg = ''
		if response == ogResponses.BAD_REQUEST:
			msg = 'HTTP/1.0 400 Bad request'
		elif response == ogResponses.IN_PROGRESS:
			msg = 'HTTP/1.0 202 Accepted'
		elif response == ogResponses.OK:
			msg = 'HTTP/1.0 200 OK'
		else:
			return msg

		if not content == None:
			jsonmsg = self.buildJsonResponse(idstr, content)
			msg = msg + '\nContent-Type:application/json'
			msg = msg + '\nContent-Length:' + str(len(jsonmsg))
			msg = msg + '\n' + jsonmsg

		msg = msg + '\r\n\r\n'
		return msg

	def processOperation(self, op, URI, cmd, client):
		if ("GET" in op):
			if ("probe" in URI):
				self.process_probe(client)
			elif ("shell/output" in URI):
				self.process_shellout(client)
			else:
				client.send(self.getResponse(ogResponses.BAD_REQUEST))
		elif ("POST" in op):
			if ("poweroff" in URI):
				self.process_poweroff(client)
			elif ("reboot" in URI):
				self.process_reboot(client)
			elif ("shell/run" in URI):
				self.process_shellrun(client, cmd)
			else:
				client.send(self.getResponse(ogResponses.BAD_REQUEST))
		else:
			client.send(self.getResponse(ogResponses.BAD_REQUEST))

		return 0

	def process_reboot(self, client):
		client.send(self.getResponse(ogResponses.IN_PROGRESS))
		client.disconnect()
		threading.Thread(target=ogThread.rebt).start()

	def process_poweroff(self, client):
		client.send(self.getResponse(ogResponses.IN_PROGRESS))
		client.disconnect()
		threading.Thread(target=ogThread.pwoff).start()

	def process_probe(self, client):
		client.send(self.getResponse(ogResponses.OK))

	def process_shellrun(self, client, cmd):
		if cmd == None:
			client.send(self.getResponse(ogResponses.BAD_REQUEST))
			return

		threading.Thread(target=ogThread.execcmd, args=(self.msgqueue, cmd,)).start()
		client.send(self.getResponse(ogResponses.IN_PROGRESS))

	def process_shellout(self, client):
		if self.msgqueue.empty():
			client.send(self.getResponse(ogResponses.IN_PROGRESS, 'out', ''))
		else:
			out = self.msgqueue.get()
			client.send(self.getResponse(ogResponses.IN_PROGRESS, 'out', out))