From 3a3b6425561bcb7cee3f3440ffe2061f3b275ea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ram=C3=B3n=20M=2E=20G=C3=B3mez?= Date: Thu, 30 Apr 2020 11:07:04 +0200 Subject: [PATCH] #975: REST route `GET /status` with `detail=true` shows detailed status Note: `GET /status?detail=true` requires the authentication token. --- .../modules/server/OpenGnSys/__init__.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/opengnsys/modules/server/OpenGnSys/__init__.py b/src/opengnsys/modules/server/OpenGnSys/__init__.py index d2bdc0d..4a17ead 100644 --- a/src/opengnsys/modules/server/OpenGnSys/__init__.py +++ b/src/opengnsys/modules/server/OpenGnSys/__init__.py @@ -53,8 +53,11 @@ def check_secret(fnc): def wrapper(*args, **kwargs): try: this, path, get_params, post_params, server = args # @UnusedVariable - if this.random == server.headers['Authorization']: - fnc(*args, **kwargs) + # Accept "status" operation with no arguments or any function with Authorization header + if fnc.__name__ == 'process_status' and not get_params: + return fnc(*args, **kwargs) + elif this.random == server.headers['Authorization']: + return fnc(*args, **kwargs) else: raise Exception('Unauthorized operation') except Exception as e: @@ -207,19 +210,25 @@ class OpenGnSysWorker(ServerWorker): raise Exception('Message processor for "{}" not found'.format(path[0])) return operation(path[1:], get_params, post_params) + @check_secret def process_status(self, path, get_params, post_params, server): """ Returns client status (OS type or execution status) and login status :param path: - :param get_params: + :param get_params: optional parameter "detail" to show extended status :param post_params: :param server: - :return: JSON object {"status": "status_code", "loggedin": boolean} + :return: JSON object {"status": "status_code", "loggedin": boolean, ...} """ st = {'linux': 'LNX', 'macos': 'OSX', 'windows': 'WIN'} try: - res['status'] = st[operations.os_type.lower()] + # Standard status res = {'status': st[operations.os_type.lower()], 'loggedin': len(self.user) > 0} + # Detailed status + if get_params.get('detail', 'false') == 'true': + res.update({'agent_version': VERSION, 'os_version': operations.os_version, 'sys_load': os.getloadavg()}) + if res['loggedin']: + res.update({'sessions': len(self.user), 'current_user': self.user[-1]}) except KeyError: # Unknown operating system res = {'status': 'UNK'}