from owrx.controllers.admin import AuthorizationMixin
from owrx.controllers.template import WebpageController
from owrx.breadcrumb import Breadcrumb, BreadcrumbItem, BreadcrumbMixin
from owrx.service import Services
from owrx.web.receivers import Receivers
from owrx.web.repeaters import Repeaters
from owrx.web.eibi import EIBI
from datetime import datetime
import json
import time
import os
import re
import logging
logger = logging.getLogger(__name__)
class ServiceController(AuthorizationMixin, WebpageController):
timeStarted = time.time()
def indexAction(self):
self.serve_template("services.html", **self.template_variables())
def template_variables(self):
variables = super().template_variables()
variables["services"] = self.renderServices()
return variables
@staticmethod
def renderServices():
return """
| Service |
SDR Profile |
Frequency |
{services}
| {status} |
""".format(
services="".join(ServiceController.renderService(c) for c in Services.listAll()),
status=ServiceController.renderStatus()
)
# Get last started timestamp
@staticmethod
def lastStarted():
return ServiceController.timeStarted
@staticmethod
def lastBooted():
try:
with open('/proc/uptime', 'r') as f:
return time.time() - float(f.readline().split()[0])
except:
return 0
@staticmethod
def renderTime(ts):
ts = datetime.fromtimestamp(ts)
td = str(datetime.now() - ts).split(".", 1)[0]
ts = ts.astimezone().strftime("%H:%M:%S %Z, %d %b %Y")
return ts + ", " + td + " ago"
@staticmethod
def renderStatus():
result = ""
ts = ServiceController.lastBooted()
if ts > 0:
ts = ServiceController.renderTime(ts)
result += "System booted at {0}.
\n".format(ts)
ts = ServiceController.lastStarted()
if ts > 0:
ts = ServiceController.renderTime(ts)
result += "Server started at {0}.
\n".format(ts)
ts = EIBI.getSharedInstance().lastDownloaded()
if ts > 0:
ts = ServiceController.renderTime(ts)
result += "Shortwave schedule downloaded at {0}.
\n".format(ts)
else:
result += "Shortwave schedule not downloaded.
\n"
ts = Repeaters.getSharedInstance().lastDownloaded()
if ts > 0:
ts = ServiceController.renderTime(ts)
result += "Repeaters database downloaded at {0}.
\n".format(ts)
else:
result += "Repeaters database not downloaded.
\n"
ts = Receivers.getSharedInstance().lastDownloaded()
if ts > 0:
ts = ServiceController.renderTime(ts)
result += "Receivers database downloaded at {0}.
\n".format(ts)
else:
result += "Receivers database not downloaded.
\n"
return result
@staticmethod
def renderService(c):
# Choose units based on frequency
freq = c["freq"]
if freq >= 1000000000:
freq = freq / 1000000000
unit = "GHz"
elif freq >= 30000000:
freq = freq / 1000000
unit = "MHz"
elif freq >= 1000:
freq = freq / 1000
unit = "kHz"
else:
unit = "Hz"
# Removing trailing zeros, converting mode to upper case
freq = re.sub(r"\.?0+$", "", "{0}".format(freq))
# Format row
return "| {0} | {1} {2} | {3}{4} |
".format(
c["mode"].upper(), c["sdr"], c["band"], freq, unit
)