from owrx.controllers.admin import AuthorizationMixin from owrx.controllers.template import WebpageController from owrx.breadcrumb import Breadcrumb, BreadcrumbItem, BreadcrumbMixin from owrx.client import ClientRegistry import json import re import logging logger = logging.getLogger(__name__) class ClientController(AuthorizationMixin, WebpageController): def indexAction(self): self.serve_template("clients.html", **self.template_variables()) def template_variables(self): variables = super().template_variables() variables["clients"] = self.renderClients() return variables @staticmethod def renderClients(): return """ {clients}
IP Address Chat Name SDR Profile Local Time Actions
ban for
""".format( clients="".join(ClientController.renderClient(c) for c in ClientRegistry.getSharedInstance().listAll()) ) @staticmethod def renderClient(c): return "{0}{1}{2}{3} {4}{5}".format( ClientController.renderIp(c["ip"]), c["name"] if "name" in c else "", "banned" if c["ban"] else c["sdr"] + " " + c["band"] if "sdr" in c else "n/a", "until" if c["ban"] else "since", c["ts"].strftime('%H:%M:%S'), ClientController.renderButtons(c) ) @staticmethod def renderIp(ip): ip = re.sub("^::ffff:", "", ip) return """ {1} """.format(ip, ip) @staticmethod def renderButtons(c): action = "unban" if c["ban"] else "ban" return """ """.format(action, c["ip"], action) def ban(self): try: data = json.loads(self.get_body().decode("utf-8")) mins = int(data["mins"]) if "mins" in data else 0 if "ip" in data and mins > 0: logger.info("Banning {0} for {1} minutes".format(data["ip"], mins)) ClientRegistry.getSharedInstance().banIp(data["ip"], mins) self.send_response("{}", content_type="application/json", code=200) except Exception as e: logger.debug("ban(): " + str(e)) self.send_response("{}", content_type="application/json", code=400) def unban(self): try: data = json.loads(self.get_body().decode("utf-8")) if "ip" in data: logger.info("Unbanning {0}".format(data["ip"])) ClientRegistry.getSharedInstance().unbanIp(data["ip"]) self.send_response("{}", content_type="application/json", code=200) except Exception as e: logger.debug("unban(): " + str(e)) self.send_response("{}", content_type="application/json", code=400) def broadcast(self): try: data = json.loads(self.get_body().decode("utf-8")) text = data["text"].strip() if "text" in data else "" if len(text) > 0: logger.info("Broadcasting '{0}' to all clients".format(text)) ClientRegistry.getSharedInstance().broadcastAdminMessage(text) self.send_response("{}", content_type="application/json", code=200) except Exception as e: logger.debug("broadcast(): " + str(e)) self.send_response("{}", content_type="application/json", code=400)