From bd98dd1da0fb1fed0066bb9477c78a2569bd547b Mon Sep 17 00:00:00 2001 From: "Jose M. Guisado" Date: Tue, 4 May 2021 15:42:44 +0000 Subject: #995 Add link speed in probe responses Separates probe method into separate ogclient modes (virtual, vdi) so future supported OS can easily have a tailored probe responses. Link speed is retrieved using a minimal ethtool command sent using fcntl module from python. --- src/live/ogOperations.py | 29 +++++++++++++++++++++++++++++ src/ogRest.py | 14 +++++++++----- src/virtual/ogOperations.py | 3 +++ 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/live/ogOperations.py b/src/live/ogOperations.py index 6904164..7f5e2e4 100644 --- a/src/live/ogOperations.py +++ b/src/live/ogOperations.py @@ -9,7 +9,9 @@ import os import json import subprocess +import fcntl, socket, array, struct from src.ogClient import ogClient +from src.ogRest import ThreadState OG_SHELL = '/bin/bash' @@ -276,3 +278,30 @@ class OgLiveOperations: self._restartBrowser(self._url) return self.parseGetConf(output.decode('utf-8')) + + def probe(self, ogRest): + def ethtool(interface): + try: + ETHTOOL_GSET = 0x00000001 + SIOCETHTOOL = 0x8946 + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sockfd = sock.fileno() + ecmd = array.array( + "B", struct.pack("I39s", ETHTOOL_GSET, b"\x00" * 39) + ) + interface = interface.encode("utf-8") + ifreq = struct.pack("16sP", interface, ecmd.buffer_info()[0]) + fcntl.ioctl(sockfd, SIOCETHTOOL, ifreq) + res = ecmd.tobytes() + speed = struct.unpack("12xH29x", res)[0] + except IOError: + speed = 0 + finally: + sock.close() + return speed + + interface = os.environ['DEVICE'] + speed = ethtool(interface) + + return {'status': 'OPG' if ogRest.state != ThreadState.BUSY else 'BSY', + 'speed': speed} diff --git a/src/ogRest.py b/src/ogRest.py index bd9b65c..32519fc 100644 --- a/src/ogRest.py +++ b/src/ogRest.py @@ -373,16 +373,20 @@ class ogRest(): threading.Thread(target=ogThread.poweroff, args=(self,)).start() def process_probe(self, client): + try: + status = self.operations.probe(self) + except: + response = restResponse(ogResponses.INTERNAL_ERR) + client.send(response.get()) + return + json_body = jsonBody() + for k, v in status.items(): + json_body.add_element(k, v) if self.state != ThreadState.BUSY: - if self.mode == 'live': - json_body.add_element('status', 'OPG') - elif self.mode == 'virtual': - json_body.add_element('status', 'VDI') response = restResponse(ogResponses.OK, json_body) else: - json_body.add_element('status', 'BSY') response = restResponse(ogResponses.IN_PROGRESS, json_body) client.send(response.get()) diff --git a/src/virtual/ogOperations.py b/src/virtual/ogOperations.py index 60370cb..94f3e1b 100644 --- a/src/virtual/ogOperations.py +++ b/src/virtual/ogOperations.py @@ -600,3 +600,6 @@ class OgVirtualOperations: for k, v in device_names.items(): f.write(f'{k}={v}\n') f.truncate() + + def probe(self, ogRest): + return {'status': 'VDI' if ogRest.state != ThreadState.BUSY else 'BSY'} -- cgit v1.2.3-18-g5258