#1065 Add event datagram socket

ogClient can receive events via a datagram socket opened at 55885.
This socket is only opened when in windows or linux mode, for
event reporting from within the system.

Events reported this way are sent back to ogServer via a 103 Early
Hints HTTP message. Information regarding the event is sent in the
response's payload.
more_events
Jose M. Guisado 2021-11-25 15:27:44 +01:00
parent 6ddc1da7ca
commit 2465ef25b7
2 changed files with 32 additions and 1 deletions

View File

@ -35,6 +35,10 @@ class ogClient:
self.mode = self.CONFIG['opengnsys']['mode'] self.mode = self.CONFIG['opengnsys']['mode']
if self.mode not in {'virtual', 'live', 'linux', 'windows'}: if self.mode not in {'virtual', 'live', 'linux', 'windows'}:
raise ValueError('Mode not supported.') raise ValueError('Mode not supported.')
if self.mode in {'linux', 'windows'}:
self.event_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.event_sock.setblocking(0)
self.event_sock.bind(('127.0.0.1', 55885))
if self.CONFIG['samba']['activate']: if self.CONFIG['samba']['activate']:
assert('user' in self.CONFIG['samba']) assert('user' in self.CONFIG['samba'])
@ -47,9 +51,29 @@ class ogClient:
def get_socket(self): def get_socket(self):
return self.sock return self.sock
def get_event_socket(self):
return self.event_sock
def get_state(self): def get_state(self):
return self.state return self.state
def send_event_hint(self, message):
try:
event, action, user = message.split(" ")
logging.warning("%s, %s, %s", event, action, user)
except:
logging.warning("Error parsing session datagram")
return
if (event != "session" or
action not in ['start', 'stop'] or
not user):
logging.warning("Invalid value in session datagram: %s", message)
payload = jsonBody({'event': event, 'action': action, 'user': user})
response = restResponse(ogResponses.EARLY_HINTS, payload)
self.send(response.get())
def cleanup(self): def cleanup(self):
self.data = "" self.data = ""
self.content_len = 0 self.content_len = 0
@ -138,6 +162,7 @@ class ogClient:
def run(self): def run(self):
while 1: while 1:
sock = self.get_socket() sock = self.get_socket()
event_sock = self.get_event_socket()
state = self.get_state() state = self.get_state()
if state == State.CONNECTING: if state == State.CONNECTING:
@ -147,7 +172,7 @@ class ogClient:
elif state == State.FORCE_DISCONNECTED: elif state == State.FORCE_DISCONNECTED:
return 0 return 0
else: else:
readset = [ sock ] readset = [ sock, event_sock ] if event_sock else [ sock ]
writeset = [ ] writeset = [ ]
exceptset = [ ] exceptset = [ ]
@ -158,5 +183,8 @@ class ogClient:
self.receive() self.receive()
elif state == State.CONNECTING and sock in exception: elif state == State.CONNECTING and sock in exception:
self.connect2() self.connect2()
elif state == State.RECEIVING and event_sock in readable:
message = event_sock.recv(4096).decode('utf-8').rstrip()
self.send_event_hint(message)
else: else:
print('wrong state, not ever happen!' + str(state)) print('wrong state, not ever happen!' + str(state))

View File

@ -54,6 +54,8 @@ class restResponse():
self.msg = 'HTTP/1.0 401 Unauthorized' self.msg = 'HTTP/1.0 401 Unauthorized'
elif response == ogResponses.SERVICE_UNAVAILABLE: elif response == ogResponses.SERVICE_UNAVAILABLE:
self.msg = 'HTTP/1.0 503 Service Unavailable' self.msg = 'HTTP/1.0 503 Service Unavailable'
elif response == ogResponses.EARLY_HINTS:
self.msg = 'HTTP/1.0 103 Early Hints'
else: else:
return self.msg return self.msg
@ -244,6 +246,7 @@ class ogResponses(Enum):
INTERNAL_ERR=3 INTERNAL_ERR=3
UNAUTHORIZED=4 UNAUTHORIZED=4
SERVICE_UNAVAILABLE=5 SERVICE_UNAVAILABLE=5
EARLY_HINTS=6
class ogRest(): class ogRest():
LOG_LENGTH = 32 LOG_LENGTH = 32