From e4d94fbda5724c71f938660325b98326f0bc7bf6 Mon Sep 17 00:00:00 2001 From: Andrew <mcdeweykp@gmail.com> Date: Thu, 26 Aug 2021 21:06:22 -0400 Subject: [PATCH] Adds status page at /status --- app/classes/web/status_handler.py | 47 ++++++++++++ app/classes/web/tornado.py | 2 + app/frontend/static/assets/css/crafty.css | 5 ++ .../static/assets/images/logo_long.png | Bin 0 -> 31856 bytes app/frontend/templates/blank_base.html | 3 +- app/frontend/templates/public/status.html | 68 ++++++++++++++++++ 6 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 app/classes/web/status_handler.py create mode 100644 app/frontend/static/assets/images/logo_long.png create mode 100644 app/frontend/templates/public/status.html diff --git a/app/classes/web/status_handler.py b/app/classes/web/status_handler.py new file mode 100644 index 00000000..93e54bad --- /dev/null +++ b/app/classes/web/status_handler.py @@ -0,0 +1,47 @@ +from re import template +import sys +import json +import logging +import tornado.web +import tornado.escape +import requests + +from app.classes.shared.helpers import helper +from app.classes.web.base_handler import BaseHandler +from app.classes.shared.console import console +from app.classes.shared.models import Users, fn, db_helper + +logger = logging.getLogger(__name__) + +try: + import bleach + +except ModuleNotFoundError as e: + logger.critical("Import Error: Unable to load {} module".format(e.name), exc_info=True) + console.critical("Import Error: Unable to load {} module".format(e.name)) + sys.exit(1) + + +class StatusHandler(BaseHandler): + def get(self): + page_data = {} + page_data['servers'] = db_helper.get_all_servers_stats() + + template = 'public/status.html' + + self.render( + template, + data=page_data, + translate=self.translator.translate, + ) + def post(self): + page_data = {} + page_data['servers'] = db_helper.get_all_servers_stats() + + template = 'public/status.html' + + self.render( + template, + data=page_data, + translate=self.translator.translate, + ) \ No newline at end of file diff --git a/app/classes/web/tornado.py b/app/classes/web/tornado.py index a82f619f..aeed856f 100644 --- a/app/classes/web/tornado.py +++ b/app/classes/web/tornado.py @@ -29,6 +29,7 @@ try: from app.classes.shared.translation import translation from app.classes.web.upload_handler import UploadHandler from app.classes.web.http_handler import HTTPHandler, HTTPHandlerPage + from app.classes.web.status_handler import StatusHandler except ModuleNotFoundError as e: logger.critical("Import Error: Unable to load {} module".format(e, e.name)) @@ -132,6 +133,7 @@ class Webserver: (r'/api/stats/node', NodeStats, handler_args), (r'/ws', SocketHandler, handler_args), (r'/upload', UploadHandler), + (r'/status', StatusHandler, handler_args) ] app = tornado.web.Application( diff --git a/app/frontend/static/assets/css/crafty.css b/app/frontend/static/assets/css/crafty.css index 892bd52f..c39b2c2a 100644 --- a/app/frontend/static/assets/css/crafty.css +++ b/app/frontend/static/assets/css/crafty.css @@ -80,3 +80,8 @@ body { background-color: var(--dark) !important; /* Firefox */ } .actions_serverlist > a > i { cursor: pointer; } +.corner { + position: absolute; + margin-top: 0; + margin-left: 0; +} \ No newline at end of file diff --git a/app/frontend/static/assets/images/logo_long.png b/app/frontend/static/assets/images/logo_long.png new file mode 100644 index 0000000000000000000000000000000000000000..8ebca3a5b51beed0fc643bc94b9cfbb1333de029 GIT binary patch literal 31856 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 Kbd{uW@c#nnijuwn literal 0 HcmV?d00001 diff --git a/app/frontend/templates/blank_base.html b/app/frontend/templates/blank_base.html index ace4b7dd..cc5bba76 100644 --- a/app/frontend/templates/blank_base.html +++ b/app/frontend/templates/blank_base.html @@ -11,6 +11,7 @@ <link rel="stylesheet" href="/static/assets/vendors/ti-icons/css/themify-icons.css"> <link rel="stylesheet" href="/static/assets/vendors/typicons/typicons.css"> <link rel="stylesheet" href="/static/assets/vendors/css/vendor.bundle.base.css"> + <link rel="stylesheet" href="/static/assest/vendors/css/crafty.css" <!-- endinject --> <!-- Plugin css for this page --> <!-- End Plugin css for this page --> @@ -24,7 +25,7 @@ <div class="container-fluid page-body-wrapper full-page-wrapper"> <div class="content-wrapper d-flex align-items-center auth auth-bg-1 theme-one"> <div class="row w-100"> - <div class="col-lg-4 mx-auto"> + <div class="mx-auto"> {% block content %} {% end %} diff --git a/app/frontend/templates/public/status.html b/app/frontend/templates/public/status.html new file mode 100644 index 00000000..6d9d02cc --- /dev/null +++ b/app/frontend/templates/public/status.html @@ -0,0 +1,68 @@ +{% extends ../blank_base.html %} + +{% block meta %} + <meta http-equiv="refresh" content="30"> +{% end %} + +{% block title %}Crafty Controller - {{ translate('dashboard', 'dashboard') }}{% end %} + +{% block content %} +<div class="content-wrapper col-md login-modal" style="background-color: #222437;"> +<img src="/static/assets/images/logo_long.png" style='width: 25%; margin-left: 38%;'></img> + + +<div class="table-responsive"> + <table class="table table-hover"> + <thead> + <tr class="rounded"> + <th>{{ translate('dashboard', 'server') }}</th> + <th>{{ translate('dashboard', 'players') }}</th> + <th>{{ translate('dashboard', 'status') }}</th> + </tr> + </thead> + <tbody> + {% for server in data['servers'] %} + <tr> + <td> + <i class="fas fa-server"></i> + {{ server['server_data']['server_name'] }} + </td> + <td> + {% if server['stats']['int_ping_results'] %} + {{ server['stats']['online'] }} / {{ server['stats']['max'] }} {{ translate('dashboard', 'max') }}<br /> + + {% if server['stats']['desc'] != 'False' %} + {{ server['stats']['desc'] }} <br /> + {% end %} + + {% if server['stats']['version'] != 'False' %} + {{ server['stats']['version'] }} + {% end %} + {% end %} + + </td> + <td> + {% if server['stats']['running'] %} + <i class="fas fa-thumbs-up"></i> <span class="text-success">{{ translate('dashboard', 'online') }}</span> + {% else %} + <i class="fas fa-thumbs-down"></i> <span class="text-danger">{{ translate('dashboard', 'offline') }}</span> + {% end %} + </td> + </tr> + {% end %} + + </tbody> + </table> + + + +</div> +<!-- content-wrapper ends --> + + + +{% end %} + +{% block js %} + +{% end %} \ No newline at end of file