diff --git a/htdocs/index.html b/htdocs/index.html index 3fabf73..fefefbc 100644 --- a/htdocs/index.html +++ b/htdocs/index.html @@ -127,6 +127,7 @@
OpenWebRX client log
Author contact: Jakob Ketterl, DD5JFK
+
Support and information: Groups.io Mailinglist
diff --git a/owrx/__main__.py b/owrx/__main__.py index d452e4a..948781f 100644 --- a/owrx/__main__.py +++ b/owrx/__main__.py @@ -1,6 +1,6 @@ from http.server import HTTPServer from owrx.http import RequestHandler -from owrx.config import PropertyManager +from owrx.config import PropertyManager, Config from owrx.feature import FeatureDetector from owrx.sdr import SdrService from socketserver import ThreadingMixIn @@ -8,10 +8,12 @@ from owrx.sdrhu import SdrHuUpdater from owrx.service import Services from owrx.websocket import WebSocketConnection from owrx.pskreporter import PskReporter +from owrx.version import openwebrx_version import logging logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") +logger = logging.getLogger(__name__) class ThreadedHttpServer(ThreadingMixIn, HTTPServer): @@ -26,19 +28,32 @@ OpenWebRX - Open Source SDR Web App for Everyone! | for license see LICENSE fil _________________________________________________________________________________________________ Author contact info: Jakob Ketterl, DD5JFK +Documentation: https://github.com/jketterl/openwebrx/wiki +Support and info: https://groups.io/g/openwebrx """ ) + logger.info("OpenWebRX version {0} starting up...".format(openwebrx_version)) + pm = PropertyManager.getSharedInstance().loadConfig() + configErrors = Config.validateConfig() + if configErrors: + logger.error( + "your configuration contains errors. please address the following errors:" + ) + for e in configErrors: + logger.error(e) + return + featureDetector = FeatureDetector() if not featureDetector.is_available("core"): - print( + logger.error( "you are missing required dependencies to run openwebrx. " "please check that the following core requirements are installed:" ) - print(", ".join(featureDetector.get_requirements("core"))) + logger.error(", ".join(featureDetector.get_requirements("core"))) return # Get error messages about unknown / unavailable features as soon as possible diff --git a/owrx/config.py b/owrx/config.py index 09bbd8f..b027f48 100644 --- a/owrx/config.py +++ b/owrx/config.py @@ -1,5 +1,6 @@ import importlib.util import logging +import os logger = logging.getLogger(__name__) @@ -147,3 +148,36 @@ class PropertyManager(object): except FileNotFoundError: pass raise ConfigNotFoundException("no usable config found! please make sure you have a valid configuration file!") + + +class ConfigError(object): + def __init__(self, key, message): + self.key = key + self.message = message + + def __str__(self): + return "Configuration Error (key: {0}): {1}".format(self.key, self.message) + + +class Config: + @staticmethod + def validateConfig(): + pm = PropertyManager.getSharedInstance() + errors = [ + Config.checkTempDirectory(pm) + ] + + return [e for e in errors if e is not None] + + @staticmethod + def checkTempDirectory(pm: PropertyManager): + key = "temporary_directory" + if not key in pm or pm[key] is None: + return ConfigError(key, "temporary directory is not set") + if not os.path.exists(pm[key]): + return ConfigError(key, "temporary directory doesn't exist") + if not os.path.isdir(pm[key]): + return ConfigError(key, "temporary directory path is not a directory") + if not os.access(pm[key], os.W_OK): + return ConfigError(key, "temporary directory is not writable") + return None diff --git a/owrx/kiss.py b/owrx/kiss.py index 374cc07..e24284f 100644 --- a/owrx/kiss.py +++ b/owrx/kiss.py @@ -40,8 +40,12 @@ IGLOGIN {callsign} {password} if pm["aprs_igate_beacon"]: (lat, lon) = pm["receiver_gps"] - lat = "{0}^{1:.2f}{2}".format(int(lat), (lat - int(lat)) * 60, "N" if lat > 0 else "S") - lon = "{0}^{1:.2f}{2}".format(int(lon), (lon - int(lon)) * 60, "E" if lon > 0 else "W") + direction_ns = "N" if lat > 0 else "S" + direction_we = "E" if lon > 0 else "W" + lat = abs(lat) + lon = abs(lon) + lat = "{0:02d}^{1:05.2f}{2}".format(int(lat), (lat - int(lat)) * 60, direction_ns) + lon = "{0:03d}^{1:05.2f}{2}".format(int(lon), (lon - int(lon)) * 60, direction_we) config += """ PBEACON sendto=IG delay=0:30 every=60:00 symbol="igate" overlay=R lat={lat} long={lon} comment="OpenWebRX APRS gateway"