mirror of https://git.48k.eu/ogclient
#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
parent
6ddc1da7ca
commit
2465ef25b7
|
@ -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))
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue