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 """
IP Address
Chat Name
SDR Profile
Local Time
Actions
{clients}
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)