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 @@
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"