mirror of
https://github.com/BOSWatch/BW3-Core.git
synced 2026-03-06 21:13:54 +01:00
Merge branch 'yaml' into develop
This commit is contained in:
commit
a608b7f680
|
|
@ -1,7 +1,9 @@
|
||||||
# for pip to install all needed
|
# for pip to install all needed
|
||||||
# called with 'pip -r requirements.txt'
|
# called with 'pip -r requirements.txt'
|
||||||
|
|
||||||
|
pyyaml
|
||||||
|
|
||||||
pytest
|
pytest
|
||||||
pytest-cov
|
pytest-cov
|
||||||
pytest-pep8
|
pytest-pep8
|
||||||
pytest-randomly
|
pytest-randomly
|
||||||
|
|
|
||||||
|
|
@ -1,131 +0,0 @@
|
||||||
#!/usr/bin/python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
"""!
|
|
||||||
____ ____ ______ __ __ __ _____
|
|
||||||
/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ /
|
|
||||||
/ __ / / / /\__ \| | /| / / __ `/ __/ ___/ __ \ /_ <
|
|
||||||
/ /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ /
|
|
||||||
/_____/\____//____/ |__/|__/\__,_/\__/\___/_/ /_/ /____/
|
|
||||||
German BOS Information Script
|
|
||||||
by Bastian Schroll
|
|
||||||
|
|
||||||
@file: config.py
|
|
||||||
@date: 25.12.2017
|
|
||||||
@author: Bastian Schroll
|
|
||||||
@description: Module for the configuration
|
|
||||||
"""
|
|
||||||
import logging
|
|
||||||
import configparser
|
|
||||||
|
|
||||||
logging.debug("- %s loaded", __name__)
|
|
||||||
|
|
||||||
|
|
||||||
class Config:
|
|
||||||
|
|
||||||
_sharePoints = {}
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
"""!Create a new config object and load the ini file directly"""
|
|
||||||
self._config = configparser.ConfigParser()
|
|
||||||
|
|
||||||
def loadConfigFile(self, configPath, sharePoint=""):
|
|
||||||
"""!loads a given configuration in the class wide config variable
|
|
||||||
|
|
||||||
@param configPath: Path to the config file
|
|
||||||
@param sharePoint: If you want to share the config set name here
|
|
||||||
@return True or False"""
|
|
||||||
logging.debug("load config file from: %s", configPath)
|
|
||||||
try:
|
|
||||||
self._config.read(configPath, "utf-8")
|
|
||||||
if sharePoint:
|
|
||||||
self._shareConfig(sharePoint)
|
|
||||||
return True
|
|
||||||
except: # pragma: no cover
|
|
||||||
logging.exception("cannot load config file")
|
|
||||||
return False
|
|
||||||
|
|
||||||
def _shareConfig(self, sharePoint):
|
|
||||||
"""!Shares the configuration
|
|
||||||
|
|
||||||
Shares the local _config to the class wide global _sharedConfig
|
|
||||||
@param sharePoint: Name of the global share point
|
|
||||||
@return True or False"""
|
|
||||||
if sharePoint in self._sharePoints:
|
|
||||||
logging.error("cannot share config - name is always in use: %s", sharePoint)
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
self._sharePoints[sharePoint] = self._config
|
|
||||||
logging.debug("add config sharePoint: %s", sharePoint)
|
|
||||||
return True
|
|
||||||
|
|
||||||
def getInt(self, section, key, sharePoint=""):
|
|
||||||
"""!Method to read a single config entry as integer
|
|
||||||
|
|
||||||
@param section: Section to read from
|
|
||||||
@param key: Value to read
|
|
||||||
@param sharePoint: Name of the global config share (empty is only local)
|
|
||||||
@return An Integer or None"""
|
|
||||||
value = self._get(section, key, sharePoint)
|
|
||||||
if value is None:
|
|
||||||
return None
|
|
||||||
return int(value)
|
|
||||||
|
|
||||||
def getBool(self, section, key, sharePoint=""):
|
|
||||||
"""!Method to read a single config entry as boolean
|
|
||||||
|
|
||||||
@param section: Section to read from
|
|
||||||
@param key: Value to read
|
|
||||||
@param sharePoint: Name of the global config share (empty is only local)
|
|
||||||
@return True or False"""
|
|
||||||
if self._get(section, key, sharePoint).lower() in ["1", "true", "yes"]:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
def getStr(self, section, key, sharePoint=""):
|
|
||||||
"""!Method to read a single config entry as string
|
|
||||||
|
|
||||||
@param section: Section to read from
|
|
||||||
@param key: Value to read
|
|
||||||
@param sharePoint: Name of the global config share (empty is only local)
|
|
||||||
@return The value or None"""
|
|
||||||
value = self._get(section, key, sharePoint)
|
|
||||||
if value is None:
|
|
||||||
return None
|
|
||||||
return str(value)
|
|
||||||
|
|
||||||
def _get(self, section, key, sharePoint=""):
|
|
||||||
"""!Method to read a single config entry
|
|
||||||
|
|
||||||
@param section: Section to read from
|
|
||||||
@param key: Value to read
|
|
||||||
@param sharePoint: Name of the global config share (empty is only local)
|
|
||||||
@return The value or None"""
|
|
||||||
if sharePoint:
|
|
||||||
try:
|
|
||||||
return self._sharePoints[sharePoint].get(section, key)
|
|
||||||
except KeyError:
|
|
||||||
logging.error("no sharePoint named: %s", sharePoint)
|
|
||||||
except configparser.NoSectionError:
|
|
||||||
logging.warning("no shared config section: %s", section)
|
|
||||||
except configparser.NoOptionError:
|
|
||||||
logging.warning("no shared config option: %s", key)
|
|
||||||
except: # pragma: no cover
|
|
||||||
logging.exception("error while reading shared config")
|
|
||||||
return None
|
|
||||||
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
return self._config.get(section, key)
|
|
||||||
except configparser.NoSectionError:
|
|
||||||
logging.warning("no local config section: %s", section)
|
|
||||||
except configparser.NoOptionError:
|
|
||||||
logging.warning("no local config option: %s", key)
|
|
||||||
except: # pragma: no cover
|
|
||||||
logging.exception("error while reading local config")
|
|
||||||
return None
|
|
||||||
|
|
||||||
def getAllSharepoints(self):
|
|
||||||
"""!Return a python dict of all set sharepoints
|
|
||||||
|
|
||||||
@return Sharepoint dict"""
|
|
||||||
return self._sharePoints
|
|
||||||
79
boswatch/configYaml.py
Normal file
79
boswatch/configYaml.py
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""!
|
||||||
|
____ ____ ______ __ __ __ _____
|
||||||
|
/ __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ /
|
||||||
|
/ __ / / / /\__ \| | /| / / __ `/ __/ ___/ __ \ /_ <
|
||||||
|
/ /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ /
|
||||||
|
/_____/\____//____/ |__/|__/\__,_/\__/\___/_/ /_/ /____/
|
||||||
|
German BOS Information Script
|
||||||
|
by Bastian Schroll
|
||||||
|
|
||||||
|
@file: configYaml.py
|
||||||
|
@date: 27.02.2019
|
||||||
|
@author: Bastian Schroll
|
||||||
|
@description: Module for the configuration in yaml format
|
||||||
|
"""
|
||||||
|
import logging
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
logging.debug("- %s loaded", __name__)
|
||||||
|
|
||||||
|
__sharePoints = {}
|
||||||
|
|
||||||
|
|
||||||
|
def loadConfigFile(configPath, sharePoint=""):
|
||||||
|
"""!loads a given configuration
|
||||||
|
|
||||||
|
@param configPath: Path to the config file
|
||||||
|
@param sharePoint: If you want to share the config set name here
|
||||||
|
@return python dict of config or None"""
|
||||||
|
logging.debug("load config file from: %s", configPath)
|
||||||
|
try:
|
||||||
|
|
||||||
|
with open(configPath) as f:
|
||||||
|
# use safe_load instead load
|
||||||
|
config = yaml.safe_load(f)
|
||||||
|
if sharePoint:
|
||||||
|
_shareConfig(config, sharePoint)
|
||||||
|
return config
|
||||||
|
except: # pragma: no cover
|
||||||
|
logging.exception("cannot load config file")
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def loadConfigSharepoint(sharePoint):
|
||||||
|
"""!loads a given configuration from an sharepoint
|
||||||
|
|
||||||
|
@param sharePoint: Name of the sharepoint
|
||||||
|
@return python dict of config or None"""
|
||||||
|
try:
|
||||||
|
return __sharePoints[sharePoint]
|
||||||
|
except KeyError:
|
||||||
|
logging.error("no sharePoint named: %s", sharePoint)
|
||||||
|
except: # pragma: no cover
|
||||||
|
logging.exception("error while reading shared config")
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _shareConfig(config, sharePoint):
|
||||||
|
"""!Shares the configuration
|
||||||
|
|
||||||
|
Shares the local _config to the class wide global _sharedConfig
|
||||||
|
@param config: Python dict of the configuration
|
||||||
|
@param sharePoint: Name of the global share point
|
||||||
|
@return True or False"""
|
||||||
|
if sharePoint in __sharePoints:
|
||||||
|
logging.error("cannot share config - name is always in use: %s", sharePoint)
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
__sharePoints[sharePoint] = config
|
||||||
|
logging.debug("add config sharePoint: %s", sharePoint)
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def getAllSharepoints():
|
||||||
|
"""!Return a python dict of all set sharepoints
|
||||||
|
|
||||||
|
@return Sharepoint dict"""
|
||||||
|
return __sharePoints
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
import logging
|
import logging
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from boswatch.config import Config
|
from boswatch import configYaml
|
||||||
|
|
||||||
logging.debug("- %s loaded", __name__)
|
logging.debug("- %s loaded", __name__)
|
||||||
|
|
||||||
|
|
@ -28,7 +28,7 @@ class DoubleFilter:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""!init"""
|
"""!init"""
|
||||||
self._config = Config()
|
self._config = configYaml.loadConfigSharepoint("serverConfig")["filter"]["doubleFilter"]
|
||||||
self._filterLists = {}
|
self._filterLists = {}
|
||||||
|
|
||||||
def filter(self, bwPacket):
|
def filter(self, bwPacket):
|
||||||
|
|
@ -57,14 +57,14 @@ class DoubleFilter:
|
||||||
# delete entries that are to old
|
# delete entries that are to old
|
||||||
counter = 0
|
counter = 0
|
||||||
for listPacket in self._filterLists[bwPacket.get("mode")][1:]: # [1:] skip first entry, thats the new one
|
for listPacket in self._filterLists[bwPacket.get("mode")][1:]: # [1:] skip first entry, thats the new one
|
||||||
if listPacket.get("timestamp") < (time.time() - self._config.getInt("doubleFilter", "IgnoreTime", "serverConfig")):
|
if listPacket.get("timestamp") < (time.time() - self._config["ignoreTime"]):
|
||||||
self._filterLists[bwPacket.get("mode")].remove(listPacket)
|
self._filterLists[bwPacket.get("mode")].remove(listPacket)
|
||||||
counter += 1
|
counter += 1
|
||||||
if counter:
|
if counter:
|
||||||
logging.debug("%d old entry(s) removed", counter)
|
logging.debug("%d old entry(s) removed", counter)
|
||||||
|
|
||||||
# delete last entry if list is to big
|
# delete last entry if list is to big
|
||||||
if len(self._filterLists[bwPacket.get("mode")]) > self._config.getInt("doubleFilter", "MaxEntry", "serverConfig"):
|
if len(self._filterLists[bwPacket.get("mode")]) > self._config["maxEntry"]:
|
||||||
logging.debug("MaxEntry reached - delete oldest")
|
logging.debug("MaxEntry reached - delete oldest")
|
||||||
self._filterLists[bwPacket.get("mode")].pop()
|
self._filterLists[bwPacket.get("mode")].pop()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -101,12 +101,18 @@ class BroadcastServer:
|
||||||
self._serverShutdown = False
|
self._serverShutdown = False
|
||||||
self._servePort = servePort
|
self._servePort = servePort
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
if self.isRunning:
|
||||||
|
self.stop()
|
||||||
|
while self.isRunning:
|
||||||
|
pass
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
"""!Start the broadcast server in a new thread
|
"""!Start the broadcast server in a new thread
|
||||||
|
|
||||||
@return True or False"""
|
@return True or False"""
|
||||||
try:
|
try:
|
||||||
if not self._serverThread:
|
if not self.isRunning:
|
||||||
logging.debug("start udp broadcast server")
|
logging.debug("start udp broadcast server")
|
||||||
self._serverThread = threading.Thread(target=self._listen)
|
self._serverThread = threading.Thread(target=self._listen)
|
||||||
self._serverThread.name = "BroadServ"
|
self._serverThread.name = "BroadServ"
|
||||||
|
|
@ -130,7 +136,7 @@ class BroadcastServer:
|
||||||
|
|
||||||
@return True or False"""
|
@return True or False"""
|
||||||
try:
|
try:
|
||||||
if self._serverThread:
|
if self.isRunning:
|
||||||
logging.debug("stop udp broadcast server")
|
logging.debug("stop udp broadcast server")
|
||||||
self._serverShutdown = True
|
self._serverShutdown = True
|
||||||
return True
|
return True
|
||||||
|
|
|
||||||
|
|
@ -40,12 +40,15 @@ class TCPClient:
|
||||||
@param port: Server Port (8080)
|
@param port: Server Port (8080)
|
||||||
@return True or False"""
|
@return True or False"""
|
||||||
try:
|
try:
|
||||||
self._sock = socket
|
if not self.isConnected:
|
||||||
self._sock.setdefaulttimeout(self._timeout)
|
self._sock = socket
|
||||||
self._sock = socket.create_connection((host, port))
|
self._sock.setdefaulttimeout(self._timeout)
|
||||||
|
self._sock = socket.create_connection((host, port))
|
||||||
logging.debug("connected to %s:%s", host, port)
|
logging.debug("connected to %s:%s", host, port)
|
||||||
return True
|
return True
|
||||||
|
else:
|
||||||
|
logging.warning("client always connected")
|
||||||
|
return True
|
||||||
except ConnectionRefusedError:
|
except ConnectionRefusedError:
|
||||||
logging.error("cannot connect to %s:%s - connection refused", host, port)
|
logging.error("cannot connect to %s:%s - connection refused", host, port)
|
||||||
return False
|
return False
|
||||||
|
|
@ -61,9 +64,14 @@ class TCPClient:
|
||||||
|
|
||||||
@return True or False"""
|
@return True or False"""
|
||||||
try:
|
try:
|
||||||
self._sock.close()
|
if self.isConnected:
|
||||||
logging.debug("disconnected")
|
self._sock.close()
|
||||||
return True
|
self._sock = None
|
||||||
|
logging.debug("disconnected")
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
logging.warning("client not connected")
|
||||||
|
return True
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
logging.error("cannot disconnect - no connection established")
|
logging.error("cannot disconnect - no connection established")
|
||||||
return False
|
return False
|
||||||
|
|
@ -111,3 +119,10 @@ class TCPClient:
|
||||||
except: # pragma: no cover
|
except: # pragma: no cover
|
||||||
logging.exception("error while receiving")
|
logging.exception("error while receiving")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@property
|
||||||
|
def isConnected(self):
|
||||||
|
"""!Property of client connected state"""
|
||||||
|
if self._sock:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
|
||||||
|
|
@ -82,6 +82,10 @@ class TCPServer:
|
||||||
self._clientsConnectedLock = threading.Lock()
|
self._clientsConnectedLock = threading.Lock()
|
||||||
self._clientsConnected = {}
|
self._clientsConnected = {}
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
if self.isRunning:
|
||||||
|
self.stop()
|
||||||
|
|
||||||
def start(self, port=8080):
|
def start(self, port=8080):
|
||||||
"""!Start a threaded TCP socket server
|
"""!Start a threaded TCP socket server
|
||||||
|
|
||||||
|
|
@ -93,21 +97,23 @@ class TCPServer:
|
||||||
|
|
||||||
@return True or False"""
|
@return True or False"""
|
||||||
try:
|
try:
|
||||||
self._server = ThreadedTCPServer(("", port), ThreadedTCPRequestHandler)
|
if not self.isRunning:
|
||||||
self._server.timeout = self._timeout
|
self._server = ThreadedTCPServer(("", port), ThreadedTCPRequestHandler)
|
||||||
self._server.alarmQueue = self._alarmQueue
|
self._server.timeout = self._timeout
|
||||||
|
self._server.alarmQueue = self._alarmQueue
|
||||||
|
|
||||||
self._server.clientsConnctedLock = self._clientsConnectedLock
|
self._server.clientsConnctedLock = self._clientsConnectedLock
|
||||||
self._server.clientsConnected = self._clientsConnected
|
self._server.clientsConnected = self._clientsConnected
|
||||||
|
|
||||||
self._server_thread = threading.Thread(target=self._server.serve_forever)
|
self._server_thread = threading.Thread(target=self._server.serve_forever)
|
||||||
self._server_thread.name = "Thread-BWServer"
|
self._server_thread.name = "Thread-BWServer"
|
||||||
self._server_thread.daemon = True
|
self._server_thread.daemon = True
|
||||||
self._server_thread.start()
|
self._server_thread.start()
|
||||||
logging.debug("TCPServer started in Thread: %s", self._server_thread.name)
|
logging.debug("TCPServer started in Thread: %s", self._server_thread.name)
|
||||||
return True
|
return True
|
||||||
except OSError:
|
else:
|
||||||
logging.exception("server always running?")
|
logging.warning("server always started")
|
||||||
|
return True
|
||||||
except: # pragma: no cover
|
except: # pragma: no cover
|
||||||
logging.exception("cannot start the server")
|
logging.exception("cannot start the server")
|
||||||
return False
|
return False
|
||||||
|
|
@ -117,16 +123,17 @@ class TCPServer:
|
||||||
|
|
||||||
@return True or False"""
|
@return True or False"""
|
||||||
try:
|
try:
|
||||||
self._server.shutdown()
|
if self.isRunning:
|
||||||
self._server_thread.join()
|
self._server.shutdown()
|
||||||
self._server_thread = None
|
self._server_thread.join()
|
||||||
self._server.socket.close()
|
self._server_thread = None
|
||||||
self._server = None
|
self._server.socket.close()
|
||||||
logging.debug("TCPServer stopped")
|
self._server = None
|
||||||
return True
|
logging.debug("TCPServer stopped")
|
||||||
except AttributeError:
|
return True
|
||||||
logging.exception("cannot stop - server not started?")
|
else:
|
||||||
return False
|
logging.warning("server always stopped")
|
||||||
|
return True
|
||||||
except: # pragma: no cover
|
except: # pragma: no cover
|
||||||
logging.exception("cannot stop the server")
|
logging.exception("cannot stop the server")
|
||||||
return False
|
return False
|
||||||
|
|
@ -147,3 +154,10 @@ class TCPServer:
|
||||||
# todo return full list or write a print/debug method?
|
# todo return full list or write a print/debug method?
|
||||||
with self._clientsConnectedLock: # because our list is not threadsafe
|
with self._clientsConnectedLock: # because our list is not threadsafe
|
||||||
return self._clientsConnected
|
return self._clientsConnected
|
||||||
|
|
||||||
|
@property
|
||||||
|
def isRunning(self):
|
||||||
|
"""!Property of server running state"""
|
||||||
|
if self._server:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
import time
|
import time
|
||||||
from boswatch.config import Config
|
from boswatch import configYaml
|
||||||
from boswatch import version
|
from boswatch import version
|
||||||
|
|
||||||
logging.debug("- %s loaded", __name__)
|
logging.debug("- %s loaded", __name__)
|
||||||
|
|
@ -73,14 +73,14 @@ class Packet:
|
||||||
- clientBranch
|
- clientBranch
|
||||||
- inputSource
|
- inputSource
|
||||||
- frequency"""
|
- frequency"""
|
||||||
config = Config()
|
config = configYaml.loadConfigSharepoint("clientConfig")
|
||||||
logging.debug("add client data to bwPacket")
|
logging.debug("add client data to bwPacket")
|
||||||
self.set("clientName", config.getStr("Client", "Name", "clientConfig"))
|
self.set("clientName", config["client"]["name"])
|
||||||
self.set("clientVersion", version.client)
|
self.set("clientVersion", version.client)
|
||||||
self.set("clientBuildDate", version.date)
|
self.set("clientBuildDate", version.date)
|
||||||
self.set("clientBranch", version.branch)
|
self.set("clientBranch", version.branch)
|
||||||
self.set("inputSource", config.getStr("Client", "InputSource", "clientConfig"))
|
self.set("inputSource", config["client"]["inputSource"])
|
||||||
self.set("frequency", config.getStr("Stick", "Frequency", "clientConfig"))
|
self.set("frequency", config["inputSource"]["sdr"]["frequency"])
|
||||||
|
|
||||||
def addServerData(self):
|
def addServerData(self):
|
||||||
"""!Add the server information to the decoded data
|
"""!Add the server information to the decoded data
|
||||||
|
|
@ -90,9 +90,9 @@ class Packet:
|
||||||
- serverVersion
|
- serverVersion
|
||||||
- serverBuildDate
|
- serverBuildDate
|
||||||
- serverBranch"""
|
- serverBranch"""
|
||||||
config = Config()
|
config = configYaml.loadConfigSharepoint("serverConfig")
|
||||||
logging.debug("add server data to bwPacket")
|
logging.debug("add server data to bwPacket")
|
||||||
self.set("serverName", config.getStr("Server", "Name", "serverConfig"))
|
self.set("serverName", config["server"]["name"])
|
||||||
self.set("serverVersion", version.server)
|
self.set("serverVersion", version.server)
|
||||||
self.set("serverBuildDate", version.date)
|
self.set("serverBuildDate", version.date)
|
||||||
self.set("serverBranch", version.branch)
|
self.set("serverBranch", version.branch)
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ import logging
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from boswatch.utils import paths
|
from boswatch.utils import paths
|
||||||
from boswatch.config import Config
|
from boswatch import configYaml
|
||||||
from boswatch.utils import wildcard
|
from boswatch.utils import wildcard
|
||||||
|
|
||||||
logging.debug("- %s loaded", __name__)
|
logging.debug("- %s loaded", __name__)
|
||||||
|
|
@ -52,9 +52,8 @@ class Plugin:
|
||||||
self._alarmErrorCount = 0
|
self._alarmErrorCount = 0
|
||||||
self._teardownErrorCount = 0
|
self._teardownErrorCount = 0
|
||||||
|
|
||||||
if paths.fileExist(paths.PLUGIN_PATH + pluginName + "/" + pluginName + ".ini"):
|
if paths.fileExist(paths.PLUGIN_PATH + pluginName + "/" + pluginName + ".yaml"):
|
||||||
self.config = Config()
|
self.config = configYaml.loadConfigFile(paths.PLUGIN_PATH + pluginName + "/" + pluginName + ".yaml")
|
||||||
self.config.loadConfigFile(paths.PLUGIN_PATH + pluginName + "/" + pluginName + ".ini")
|
|
||||||
else:
|
else:
|
||||||
logging.debug("no config for %s found", pluginName)
|
logging.debug("no config for %s found", pluginName)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ import os
|
||||||
import time
|
import time
|
||||||
import importlib
|
import importlib
|
||||||
|
|
||||||
from boswatch.config import Config
|
from boswatch import configYaml
|
||||||
from boswatch.utils import paths
|
from boswatch.utils import paths
|
||||||
|
|
||||||
logging.debug("- %s loaded", __name__)
|
logging.debug("- %s loaded", __name__)
|
||||||
|
|
@ -33,7 +33,7 @@ class PluginManager:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""!init comment"""
|
"""!init comment"""
|
||||||
self._config = Config()
|
self._config = configYaml.loadConfigSharepoint("serverConfig")
|
||||||
self._pluginList = []
|
self._pluginList = []
|
||||||
|
|
||||||
def searchPluginDir(self):
|
def searchPluginDir(self):
|
||||||
|
|
@ -45,7 +45,7 @@ class PluginManager:
|
||||||
if not os.path.isdir(location) or not name + ".py" in os.listdir(location):
|
if not os.path.isdir(location) or not name + ".py" in os.listdir(location):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
pluginPriority = self._config.getInt("Plugins", name, "serverConfig")
|
pluginPriority = self._config["plugins"][name]
|
||||||
|
|
||||||
if pluginPriority is None:
|
if pluginPriority is None:
|
||||||
logging.warning("no entry in server config for plugin: %s", name)
|
logging.warning("no entry in server config for plugin: %s", name)
|
||||||
|
|
|
||||||
42
bw_client.py
42
bw_client.py
|
|
@ -43,14 +43,14 @@ try:
|
||||||
import time
|
import time
|
||||||
|
|
||||||
logging.debug("Import BOSWatch modules")
|
logging.debug("Import BOSWatch modules")
|
||||||
from boswatch.config import Config
|
from boswatch import configYaml
|
||||||
from boswatch.network.client import TCPClient
|
from boswatch.network.client import TCPClient
|
||||||
|
from boswatch.network.broadcast import BroadcastClient
|
||||||
from boswatch.decoder.decoder import Decoder
|
from boswatch.decoder.decoder import Decoder
|
||||||
from boswatch.utils import header
|
from boswatch.utils import header
|
||||||
except Exception as e: # pragma: no cover
|
|
||||||
|
except: # pragma: no cover
|
||||||
logging.exception("cannot import modules")
|
logging.exception("cannot import modules")
|
||||||
print("cannot import modules")
|
|
||||||
print(e)
|
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
@ -66,25 +66,39 @@ try:
|
||||||
epilog="""More options you can find in the extern client.ini
|
epilog="""More options you can find in the extern client.ini
|
||||||
file in the folder /config""")
|
file in the folder /config""")
|
||||||
parser.add_argument("-c", "--config", help="Name to configuration File", required=True)
|
parser.add_argument("-c", "--config", help="Name to configuration File", required=True)
|
||||||
parser.add_argument("-t", "--test", help="Client will send some testdata", action="store_true") # todo implement testmode
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
bwConfig = Config()
|
bwConfig = configYaml.loadConfigFile(paths.CONFIG_PATH + args.config, "clientConfig")
|
||||||
if bwConfig.loadConfigFile(paths.CONFIG_PATH + args.config, "clientConfig") is False:
|
if bwConfig is None:
|
||||||
logging.exception("cannot load config file")
|
logging.error("cannot load config file")
|
||||||
print("cannot load config file")
|
|
||||||
exit(1) # without config cannot _run
|
except: # pragma: no cover
|
||||||
|
logging.exception("error occurred")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
# ############################# begin client system
|
||||||
|
try:
|
||||||
|
|
||||||
|
if bwConfig["client"]["useBroadcast"]:
|
||||||
|
broadcastClient = BroadcastClient()
|
||||||
|
if broadcastClient.getConnInfo():
|
||||||
|
ip = broadcastClient.serverIP
|
||||||
|
port = broadcastClient.serverPort
|
||||||
|
else:
|
||||||
|
ip = bwConfig["server"]["ip"]
|
||||||
|
port = bwConfig["server"]["port"]
|
||||||
|
|
||||||
bwClient = TCPClient()
|
bwClient = TCPClient()
|
||||||
if bwClient.connect(bwConfig.getStr("Server", "IP"), bwConfig.getInt("Server", "PORT")):
|
if bwClient.connect(ip, port):
|
||||||
|
|
||||||
while 1:
|
while 1:
|
||||||
for i in range(0, 5):
|
|
||||||
|
for i in range(0, 5): # todo implement real data receive
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
print("Alarm Nr #" + str(i))
|
print("Alarm Nr #" + str(i))
|
||||||
|
|
||||||
data = "ZVEI1: 12345"
|
bwPacket = Decoder.decode("ZVEI1: 12345")
|
||||||
bwPacket = Decoder.decode(data)
|
|
||||||
|
|
||||||
if bwPacket:
|
if bwPacket:
|
||||||
bwPacket.printInfo()
|
bwPacket.printInfo()
|
||||||
|
|
|
||||||
122
bw_server.py
122
bw_server.py
|
|
@ -15,6 +15,7 @@
|
||||||
@description: BOSWatch server application
|
@description: BOSWatch server application
|
||||||
"""
|
"""
|
||||||
from boswatch.utils import paths
|
from boswatch.utils import paths
|
||||||
|
|
||||||
if not paths.makeDirIfNotExist(paths.LOG_PATH):
|
if not paths.makeDirIfNotExist(paths.LOG_PATH):
|
||||||
print("cannot find/create log directory: %s", paths.LOG_PATH)
|
print("cannot find/create log directory: %s", paths.LOG_PATH)
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
@ -44,43 +45,15 @@ try:
|
||||||
import queue
|
import queue
|
||||||
|
|
||||||
logging.debug("Import BOSWatch modules")
|
logging.debug("Import BOSWatch modules")
|
||||||
from boswatch.config import Config
|
from boswatch import configYaml
|
||||||
from boswatch.network.server import TCPServer
|
from boswatch.network.server import TCPServer
|
||||||
from boswatch.packet.packet import Packet
|
from boswatch.packet.packet import Packet
|
||||||
from boswatch.plugin.pluginManager import PluginManager
|
|
||||||
from boswatch.descriptor.descriptor import Descriptor
|
|
||||||
from boswatch.filter.doubeFilter import DoubleFilter
|
|
||||||
from boswatch.utils import header
|
from boswatch.utils import header
|
||||||
from boswatch.network.broadcast import BroadcastClient
|
|
||||||
from boswatch.network.broadcast import BroadcastServer
|
from boswatch.network.broadcast import BroadcastServer
|
||||||
except Exception as e: # pragma: no cover
|
except: # pragma: no cover
|
||||||
logging.exception("cannot import modules")
|
logging.exception("cannot import modules")
|
||||||
print("cannot import modules")
|
|
||||||
print(e)
|
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
# Test for the broadcast connection info function
|
|
||||||
server = BroadcastServer()
|
|
||||||
client = BroadcastClient()
|
|
||||||
server.start()
|
|
||||||
print(server.isRunning)
|
|
||||||
client.getConnInfo()
|
|
||||||
print(client.serverIP, client.serverPort)
|
|
||||||
server.stop()
|
|
||||||
print(server.isRunning)
|
|
||||||
time.sleep(2)
|
|
||||||
print(server.isRunning)
|
|
||||||
|
|
||||||
# test for the timer class
|
|
||||||
from boswatch.utils.timer import RepeatedTimer
|
|
||||||
from boswatch.network.netCheck import NetCheck
|
|
||||||
net = NetCheck()
|
|
||||||
test = RepeatedTimer(3, net.checkConn)
|
|
||||||
test.start()
|
|
||||||
time.sleep(10)
|
|
||||||
print(net.connectionState)
|
|
||||||
test.stop()
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
header.logoToLog()
|
header.logoToLog()
|
||||||
header.infoToLog()
|
header.infoToLog()
|
||||||
|
|
@ -96,91 +69,42 @@ try:
|
||||||
parser.add_argument("-c", "--config", help="Name to configuration File", required=True)
|
parser.add_argument("-c", "--config", help="Name to configuration File", required=True)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
bwConfig = Config()
|
bwConfig = configYaml.loadConfigFile(paths.CONFIG_PATH + args.config, "serverConfig")
|
||||||
if bwConfig.loadConfigFile(paths.CONFIG_PATH + args.config, "serverConfig") is False:
|
if bwConfig is None:
|
||||||
logging.exception("cannot load config file")
|
logging.error("cannot load config file")
|
||||||
print("cannot load config file")
|
|
||||||
exit(1) # without config cannot run
|
|
||||||
|
|
||||||
bwPluginManager = PluginManager()
|
except: # pragma: no cover
|
||||||
bwPluginManager.searchPluginDir()
|
logging.exception("error occurred")
|
||||||
bwPluginManager.importAllPlugins()
|
exit(1)
|
||||||
bwPluginManager.loadAllPlugins()
|
|
||||||
|
|
||||||
bwDescriptor = Descriptor()
|
|
||||||
if bwConfig.getBool("Description", "fms"):
|
|
||||||
bwDescriptor.loadDescription("fms")
|
|
||||||
if bwConfig.getBool("Description", "pocsag"):
|
|
||||||
bwDescriptor.loadDescription("pocsag")
|
|
||||||
if bwConfig.getBool("Description", "zvei"):
|
|
||||||
bwDescriptor.loadDescription("zvei")
|
|
||||||
|
|
||||||
bwDoubleFilter = DoubleFilter()
|
# ############################# begin server system
|
||||||
|
try:
|
||||||
|
|
||||||
serverPaused = False # flag to pause alarming of server
|
if bwConfig["server"]["useBroadcast"]:
|
||||||
serverStop = False # flag to stop the whole server application
|
bcServer = BroadcastServer()
|
||||||
|
bcServer.start()
|
||||||
# server flags test code
|
|
||||||
# ----------------------
|
|
||||||
# import threading
|
|
||||||
# def eins():
|
|
||||||
# global serverPaused
|
|
||||||
# serverPaused = True
|
|
||||||
# def zwei():
|
|
||||||
# global serverPaused
|
|
||||||
# serverPaused = False
|
|
||||||
def drei():
|
|
||||||
global serverStop
|
|
||||||
serverStop = True
|
|
||||||
#
|
|
||||||
# t1 = threading.Timer(1, eins)
|
|
||||||
# t2 = threading.Timer(5, zwei)
|
|
||||||
# t3 = threading.Timer(600, drei)
|
|
||||||
# t1.start()
|
|
||||||
# t2.start()
|
|
||||||
# t3.start()
|
|
||||||
|
|
||||||
incomingQueue = queue.Queue()
|
incomingQueue = queue.Queue()
|
||||||
bwServer = TCPServer(incomingQueue)
|
bwServer = TCPServer(incomingQueue)
|
||||||
if bwServer.start():
|
if bwServer.start():
|
||||||
|
|
||||||
while 1:
|
while 1:
|
||||||
if serverPaused:
|
|
||||||
logging.warning("Server pause flag received ...")
|
|
||||||
logging.debug("But all received packages will be cached!")
|
|
||||||
packetsOld = 0
|
|
||||||
while serverPaused is True:
|
|
||||||
time.sleep(0.2) # reduce cpu load (run all 200ms)
|
|
||||||
packetsNew = incomingQueue.qsize()
|
|
||||||
if packetsNew is not packetsOld:
|
|
||||||
logging.debug("%s packet(s) waiting in queue", packetsNew)
|
|
||||||
packetsOld = packetsNew
|
|
||||||
logging.warning("Server resumed ...")
|
|
||||||
|
|
||||||
if serverStop:
|
|
||||||
logging.warning("Server stop flag received ...")
|
|
||||||
break
|
|
||||||
|
|
||||||
if incomingQueue.empty(): # pause only when no data
|
if incomingQueue.empty(): # pause only when no data
|
||||||
time.sleep(0.1) # reduce cpu load (run all 100ms)
|
time.sleep(0.1) # reduce cpu load (wait 100ms)
|
||||||
|
|
||||||
|
else:
|
||||||
|
data = incomingQueue.get()
|
||||||
|
|
||||||
data = incomingQueue.get()
|
|
||||||
if data is not None:
|
|
||||||
logging.info("get data from %s (waited in queue %0.3f sec.)", data[0], time.time() - data[2])
|
logging.info("get data from %s (waited in queue %0.3f sec.)", data[0], time.time() - data[2])
|
||||||
logging.debug("%s packet(s) waiting in queue", incomingQueue.qsize())
|
logging.debug("%s packet(s) still waiting in queue", incomingQueue.qsize())
|
||||||
bwPacket = Packet((data[1]))
|
bwPacket = Packet((data[1]))
|
||||||
|
|
||||||
if not bwDoubleFilter.filter(bwPacket):
|
|
||||||
continue
|
|
||||||
|
|
||||||
bwPacket.set("clientIP", data[0])
|
bwPacket.set("clientIP", data[0])
|
||||||
bwPacket.addServerData()
|
bwPacket.addServerData()
|
||||||
|
|
||||||
if bwConfig.getBool("Description", bwPacket.get("mode")):
|
# todo implement routing
|
||||||
bwDescriptor.addDescriptions(bwPacket)
|
|
||||||
|
|
||||||
bwPluginManager.runAllPlugins(bwPacket)
|
|
||||||
# print(bwPacket.get("clientVersion")["major"])
|
|
||||||
incomingQueue.task_done()
|
incomingQueue.task_done()
|
||||||
|
|
||||||
except KeyboardInterrupt: # pragma: no cover
|
except KeyboardInterrupt: # pragma: no cover
|
||||||
|
|
@ -194,10 +118,8 @@ finally: # pragma: no cover
|
||||||
# bwServer or bwPluginManager are not defined in case of an early error
|
# bwServer or bwPluginManager are not defined in case of an early error
|
||||||
try:
|
try:
|
||||||
bwServer.stop()
|
bwServer.stop()
|
||||||
except: # pragma: no cover
|
if "bcServer" in locals():
|
||||||
pass
|
bcServer.stop()
|
||||||
try:
|
|
||||||
bwPluginManager.unloadAllPlugins()
|
|
||||||
except: # pragma: no cover
|
except: # pragma: no cover
|
||||||
pass
|
pass
|
||||||
logging.debug("BOSWatch has ended ...")
|
logging.debug("BOSWatch has ended ...")
|
||||||
|
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
# ____ ____ ______ __ __ __ _____
|
|
||||||
# / __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ /
|
|
||||||
# / __ / / / /\__ \| | /| / / __ `/ __/ ___/ __ \ /_ <
|
|
||||||
# / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ /
|
|
||||||
#/_____/\____//____/ |__/|__/\__,_/\__/\___/_/ /_/ /____/
|
|
||||||
# German BOS Information Script
|
|
||||||
# by Bastian Schroll
|
|
||||||
|
|
||||||
[Server]
|
|
||||||
# connection params to BOSWatch alarm server
|
|
||||||
IP = 127.0.0.1
|
|
||||||
PORT = 8080
|
|
||||||
|
|
||||||
# you can set multiple servers (one line for each)
|
|
||||||
# the alarm data are served to all server simultane
|
|
||||||
# for each server you can set one backup server that be used if master is not reachable
|
|
||||||
# {indv. name} = {Master}:{PORT};{Slave}:{PORT}
|
|
||||||
|
|
||||||
# Name Master Port|Slave Port
|
|
||||||
server1 = 127.0.0.1:8080
|
|
||||||
serverTest = 127.0.0.1:1234;192.168.178.1:1234
|
|
||||||
|
|
||||||
[Client]
|
|
||||||
# information about this BOSWatch client instance
|
|
||||||
Name = BW3 Client
|
|
||||||
|
|
||||||
# choose input source for multimon
|
|
||||||
# 'stick' or 'audio'
|
|
||||||
InputSource = stick
|
|
||||||
|
|
||||||
[Stick]
|
|
||||||
# configuration for your DVB-T stick
|
|
||||||
Device = 0
|
|
||||||
Frequency = 85.000M
|
|
||||||
PPMError = 0
|
|
||||||
Squelch = 0
|
|
||||||
Gain = 100
|
|
||||||
|
|
||||||
[Audio]
|
|
||||||
# configuration for audio input
|
|
||||||
|
|
||||||
[Decoder]
|
|
||||||
# here you can enable needed decoders
|
|
||||||
FMS = 0
|
|
||||||
ZVEI = 0
|
|
||||||
POC512 = 0
|
|
||||||
POC1200 = 0
|
|
||||||
POC2400 = 0
|
|
||||||
32
config/client.yaml
Normal file
32
config/client.yaml
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# ____ ____ ______ __ __ __ _____
|
||||||
|
# / __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ /
|
||||||
|
# / __ / / / /\__ \| | /| / / __ `/ __/ ___/ __ \ /_ <
|
||||||
|
# / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ /
|
||||||
|
#/_____/\____//____/ |__/|__/\__,_/\__/\___/_/ /_/ /____/
|
||||||
|
# German BOS Information Script
|
||||||
|
# by Bastian Schroll
|
||||||
|
|
||||||
|
client:
|
||||||
|
name: BW3 Client # name of the BW3 Client instance
|
||||||
|
inputSource: sdr # atm only 'sdr' is possible
|
||||||
|
useBroadcast: no # use broadcast to find server automatically
|
||||||
|
|
||||||
|
server: # only used if useBroadcast = no
|
||||||
|
ip: 127.0.0.1
|
||||||
|
port: 8080
|
||||||
|
|
||||||
|
inputSource:
|
||||||
|
sdr:
|
||||||
|
device: 0
|
||||||
|
frequency: 85.000M
|
||||||
|
PPMError: 0
|
||||||
|
Squelch: 0
|
||||||
|
Gain: 100
|
||||||
|
|
||||||
|
decoder:
|
||||||
|
fms: yes
|
||||||
|
zvei: yes
|
||||||
|
poc512: yes
|
||||||
|
poc1200: yes
|
||||||
|
poc2400: yes
|
||||||
|
|
@ -1,60 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
# ____ ____ ______ __ __ __ _____
|
|
||||||
# / __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ /
|
|
||||||
# / __ / / / /\__ \| | /| / / __ `/ __/ ___/ __ \ /_ <
|
|
||||||
# / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ /
|
|
||||||
#/_____/\____//____/ |__/|__/\__,_/\__/\___/_/ /_/ /____/
|
|
||||||
# German BOS Information Script
|
|
||||||
# by Bastian Schroll
|
|
||||||
|
|
||||||
[Server]
|
|
||||||
PORT = 8080
|
|
||||||
Name = BW3 Server
|
|
||||||
|
|
||||||
[FMS]
|
|
||||||
UseLists =
|
|
||||||
Allowed =
|
|
||||||
Denied =
|
|
||||||
RegEx =
|
|
||||||
|
|
||||||
[POCSAG]
|
|
||||||
UseLists =
|
|
||||||
Allowed =
|
|
||||||
Denied =
|
|
||||||
Range =
|
|
||||||
RegEx =
|
|
||||||
|
|
||||||
[ZVEI]
|
|
||||||
UseLists =
|
|
||||||
Allowed =
|
|
||||||
Denied =
|
|
||||||
Range =
|
|
||||||
RegEx =
|
|
||||||
|
|
||||||
[Filter]
|
|
||||||
UseDoubleFilter = 0
|
|
||||||
UseRegexFilter = 0
|
|
||||||
|
|
||||||
[doubleFilter]
|
|
||||||
# max number of entrys to save for comparison
|
|
||||||
MaxEntry = 30
|
|
||||||
# time to ignore same alarm in seconds
|
|
||||||
IgnoreTime = 10
|
|
||||||
# include pocsag msg in comparison
|
|
||||||
CheckMsg = 0
|
|
||||||
|
|
||||||
[regexFilter]
|
|
||||||
|
|
||||||
[Description]
|
|
||||||
# load CSV description files with short and lon description
|
|
||||||
fms = 0
|
|
||||||
pocsag = 0
|
|
||||||
zvei = 0
|
|
||||||
|
|
||||||
[Plugins]
|
|
||||||
# here you can enable needed plugins
|
|
||||||
# 0 is disabled
|
|
||||||
# all greater than 0 enable the plugin
|
|
||||||
# the higher the number the earlier the plugin is called on alarm
|
|
||||||
# we call ist Plugin Prioority
|
|
||||||
template = 1
|
|
||||||
55
config/server.yaml
Normal file
55
config/server.yaml
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# ____ ____ ______ __ __ __ _____
|
||||||
|
# / __ )/ __ \/ ___/ | / /___ _/ /______/ /_ |__ /
|
||||||
|
# / __ / / / /\__ \| | /| / / __ `/ __/ ___/ __ \ /_ <
|
||||||
|
# / /_/ / /_/ /___/ /| |/ |/ / /_/ / /_/ /__/ / / / ___/ /
|
||||||
|
#/_____/\____//____/ |__/|__/\__,_/\__/\___/_/ /_/ /____/
|
||||||
|
# German BOS Information Script
|
||||||
|
# by Bastian Schroll
|
||||||
|
|
||||||
|
server:
|
||||||
|
port: 8080
|
||||||
|
name: BW3 Server # name of the BW3 Server instance
|
||||||
|
useBroadcast: no # serve server ip on broadcast request
|
||||||
|
|
||||||
|
|
||||||
|
## here you can enable needed plugins
|
||||||
|
## 0 is disabled
|
||||||
|
## all greater than 0 enable the plugin
|
||||||
|
## the higher the number the earlier the plugin is called on alarm
|
||||||
|
## we call ist Plugin Prioority
|
||||||
|
plugins:
|
||||||
|
template: 1
|
||||||
|
|
||||||
|
filter:
|
||||||
|
doubleFilter:
|
||||||
|
maxEntry: 30
|
||||||
|
ignoreTime: 10
|
||||||
|
checkMsg: no
|
||||||
|
|
||||||
|
|
||||||
|
alarmRouter:
|
||||||
|
- Router 1
|
||||||
|
- Router 2
|
||||||
|
|
||||||
|
router:
|
||||||
|
|
||||||
|
- name: Router 1
|
||||||
|
route:
|
||||||
|
- type: module
|
||||||
|
name: doubleFilter
|
||||||
|
config:
|
||||||
|
maxEntry: 30
|
||||||
|
ignoreTime: 10
|
||||||
|
checkMsg: no
|
||||||
|
- type: plugin
|
||||||
|
name: mysql
|
||||||
|
config:
|
||||||
|
user: test
|
||||||
|
pass: test
|
||||||
|
db: test
|
||||||
|
- type: router
|
||||||
|
name: Router 2
|
||||||
|
|
||||||
|
- name: Router 2
|
||||||
|
route:
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
[Example]
|
|
||||||
String = Hello World!
|
|
||||||
bool = 1
|
|
||||||
integer = 12
|
|
||||||
4
plugins/template/template.yaml
Normal file
4
plugins/template/template.yaml
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
example:
|
||||||
|
string: Hello World!
|
||||||
|
bool: true
|
||||||
|
integer: 12
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
[test]
|
|
||||||
one = 1
|
|
||||||
two = two
|
|
||||||
|
|
||||||
[testcase]
|
|
||||||
test = ok
|
|
||||||
|
|
||||||
[boolTest]
|
|
||||||
one = 1
|
|
||||||
two = True
|
|
||||||
three = 0
|
|
||||||
four = False
|
|
||||||
5
test/test.yaml
Normal file
5
test/test.yaml
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
types:
|
||||||
|
string: Hello World
|
||||||
|
boolean: true
|
||||||
|
integer: 11
|
||||||
|
float: 3.14
|
||||||
|
|
@ -55,7 +55,7 @@ class Test_ServerClient:
|
||||||
def test_clientDisconnectFailed(self):
|
def test_clientDisconnectFailed(self):
|
||||||
"""!Disconnect while no connection is established"""
|
"""!Disconnect while no connection is established"""
|
||||||
self.testClient = TCPClient()
|
self.testClient = TCPClient()
|
||||||
assert not self.testClient.disconnect()
|
assert self.testClient.disconnect()
|
||||||
|
|
||||||
def test_clientTransmitFailed(self):
|
def test_clientTransmitFailed(self):
|
||||||
"""!Transmit while no connection is established"""
|
"""!Transmit while no connection is established"""
|
||||||
|
|
@ -135,7 +135,7 @@ class Test_ServerClient:
|
||||||
def test_serverStopFailed(self, useServer):
|
def test_serverStopFailed(self, useServer):
|
||||||
"""!Test to stop a stopped server"""
|
"""!Test to stop a stopped server"""
|
||||||
assert self.testServer.stop()
|
assert self.testServer.stop()
|
||||||
assert not self.testServer.stop()
|
assert self.testServer.stop()
|
||||||
|
|
||||||
def test_serverDoubleStart(self):
|
def test_serverDoubleStart(self):
|
||||||
"""!Test to start the server twice"""
|
"""!Test to start the server twice"""
|
||||||
|
|
@ -145,7 +145,7 @@ class Test_ServerClient:
|
||||||
assert self.testServer1.start()
|
assert self.testServer1.start()
|
||||||
assert not self.testServer2.start()
|
assert not self.testServer2.start()
|
||||||
assert self.testServer1.stop()
|
assert self.testServer1.stop()
|
||||||
assert not self.testServer2.stop()
|
assert self.testServer2.stop()
|
||||||
|
|
||||||
def test_serverGetOutput(self, useServer):
|
def test_serverGetOutput(self, useServer):
|
||||||
"""!Send data to server with 2 clients, check '[ack]' and data on server queue"""
|
"""!Send data to server with 2 clients, check '[ack]' and data on server queue"""
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,9 @@
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from boswatch.utils import paths
|
from boswatch.utils import paths
|
||||||
from boswatch.config import Config
|
from boswatch import configYaml
|
||||||
|
|
||||||
|
# FIXME complete tests
|
||||||
|
|
||||||
|
|
||||||
class Test_Config:
|
class Test_Config:
|
||||||
|
|
@ -28,80 +30,74 @@ class Test_Config:
|
||||||
|
|
||||||
def test_loadLocalConfig(self):
|
def test_loadLocalConfig(self):
|
||||||
"""!load a local config file"""
|
"""!load a local config file"""
|
||||||
bwConfig = Config()
|
bwConfig = configYaml.loadConfigFile(paths.TEST_PATH + "test.yaml")
|
||||||
bwConfig.loadConfigFile(paths.TEST_PATH + "test.ini")
|
assert bwConfig is not None
|
||||||
assert bwConfig._config is not None
|
|
||||||
|
|
||||||
def test_getLocalConfig(self):
|
def test_getLocalConfig(self):
|
||||||
"""!get values from local config file"""
|
"""!get values from local config file"""
|
||||||
bwConfig = Config()
|
bwConfig = configYaml.loadConfigFile(paths.TEST_PATH + "test.yaml")
|
||||||
bwConfig.loadConfigFile(paths.TEST_PATH + "test.ini")
|
assert bwConfig["types"]["integer"] == 11
|
||||||
assert bwConfig.getInt("test", "one") == 1
|
assert bwConfig["types"]["boolean"] is True
|
||||||
assert bwConfig.getBool("test", "one") is True
|
|
||||||
assert bwConfig.getStr("test", "two") == "two"
|
|
||||||
assert bwConfig.getStr("testcase", "test") == "ok"
|
|
||||||
|
|
||||||
def test_getLocalConfigFailed(self):
|
def test_getLocalConfigFailed(self):
|
||||||
"""!fail while get values from local config file"""
|
"""!fail while get values from local config file"""
|
||||||
bwConfig = Config()
|
bwConfig = configYaml.loadConfigFile(paths.TEST_PATH + "test.yaml")
|
||||||
bwConfig.loadConfigFile(paths.TEST_PATH + "test.ini")
|
assert bwConfig["test"]["abc"] is None
|
||||||
assert bwConfig.getStr("test", "abc") is None
|
assert bwConfig["abc"]["test"] is None
|
||||||
assert bwConfig.getStr("abc", "test") is None
|
|
||||||
|
|
||||||
def test_shareConfig(self):
|
def test_shareConfig(self):
|
||||||
"""!load local config file and share it"""
|
"""!load local config file and share it"""
|
||||||
bwConfig = Config()
|
configYaml.loadConfigFile(paths.TEST_PATH + "test.yaml", "test_shareConfig")
|
||||||
bwConfig.loadConfigFile(paths.TEST_PATH + "test.ini", "test_shareConfig")
|
assert configYaml.loadConfigSharepoint("test_shareConfig") is not None
|
||||||
assert bwConfig._sharePoints["test_shareConfig"] is not None
|
|
||||||
|
|
||||||
def test_shareConfigUsed(self):
|
# def test_shareConfigUsed(self):
|
||||||
"""!load local config file and tr to share it twice with same name"""
|
# """!load local config file and tr to share it twice with same name"""
|
||||||
bwConfig1 = Config()
|
# bwConfig1 = Config()
|
||||||
bwConfig1.loadConfigFile(paths.TEST_PATH + "test.ini", "test_shareConfigUsed")
|
# bwConfig1.loadConfigFile(paths.TEST_PATH + "test.yaml", "test_shareConfigUsed")
|
||||||
assert bwConfig1._sharePoints["test_shareConfigUsed"] is not None
|
# assert bwConfig1._sharePoints["test_shareConfigUsed"] is not None
|
||||||
bwConfig2 = Config()
|
# bwConfig2 = Config()
|
||||||
bwConfig2.loadConfigFile(paths.TEST_PATH + "test.ini")
|
# bwConfig2.loadConfigFile(paths.TEST_PATH + "test.yaml")
|
||||||
assert not bwConfig2._shareConfig("test_shareConfigUsed")
|
# assert not bwConfig2._shareConfig("test_shareConfigUsed")
|
||||||
|
#
|
||||||
def test_getNotSetSharedConfig(self):
|
# def test_getNotSetSharedConfig(self):
|
||||||
"""!try to get values from shared config where not exists"""
|
# """!try to get values from shared config where not exists"""
|
||||||
bwConfig = Config()
|
# bwConfig = Config()
|
||||||
bwConfig.loadConfigFile(paths.TEST_PATH + "test.ini")
|
# bwConfig.loadConfigFile(paths.TEST_PATH + "test.yaml")
|
||||||
assert bwConfig.getInt("test", "one") == 1
|
# assert bwConfig.getInt("test", "one") == 1
|
||||||
assert bwConfig.getInt("test", "one", "NotSetSharedConfig") is None
|
# assert bwConfig.getInt("test", "one", "NotSetSharedConfig") is None
|
||||||
|
#
|
||||||
def test_getSharedConfig(self):
|
# def test_getSharedConfig(self):
|
||||||
"""!get values from shared config file"""
|
# """!get values from shared config file"""
|
||||||
bwConfig1 = Config()
|
# bwConfig1 = Config()
|
||||||
bwConfig1.loadConfigFile(paths.TEST_PATH + "test.ini", "test_getSharedConfig")
|
# bwConfig1.loadConfigFile(paths.TEST_PATH + "test.yaml", "test_getSharedConfig")
|
||||||
assert bwConfig1._sharePoints["test_getSharedConfig"] is not None
|
# assert bwConfig1._sharePoints["test_getSharedConfig"] is not None
|
||||||
|
#
|
||||||
bwConfig2 = Config()
|
# bwConfig2 = Config()
|
||||||
assert bwConfig2.getStr("test", "one") is None
|
# assert bwConfig2.getStr("test", "one") is None
|
||||||
assert bwConfig2.getInt("test", "one", "test_getSharedConfig") == 1
|
# assert bwConfig2.getInt("test", "one", "test_getSharedConfig") == 1
|
||||||
|
#
|
||||||
def test_getSharedConfigFailed(self):
|
# def test_getSharedConfigFailed(self):
|
||||||
"""!fail while get values from shared config file"""
|
# """!fail while get values from shared config file"""
|
||||||
bwConfig1 = Config()
|
# bwConfig1 = Config()
|
||||||
bwConfig1.loadConfigFile(paths.TEST_PATH + "test.ini", "test_getSharedConfigFailed")
|
# bwConfig1.loadConfigFile(paths.TEST_PATH + "test.yaml", "test_getSharedConfigFailed")
|
||||||
assert bwConfig1._sharePoints["test_getSharedConfigFailed"] is not None
|
# assert bwConfig1._sharePoints["test_getSharedConfigFailed"] is not None
|
||||||
|
#
|
||||||
bwConfig2 = Config()
|
# bwConfig2 = Config()
|
||||||
assert bwConfig2.getStr("test", "abc", "test_getSharedConfigFailed") is None
|
# assert bwConfig2.getStr("test", "abc", "test_getSharedConfigFailed") is None
|
||||||
assert bwConfig2.getStr("abc", "test", "test_getSharedConfigFailed") is None
|
# assert bwConfig2.getStr("abc", "test", "test_getSharedConfigFailed") is None
|
||||||
|
#
|
||||||
def test_getDataTypes(self):
|
# def test_getDataTypes(self):
|
||||||
bwConfig = Config()
|
# bwConfig = Config()
|
||||||
bwConfig.loadConfigFile(paths.TEST_PATH + "test.ini")
|
# bwConfig.loadConfigFile(paths.TEST_PATH + "test.yaml")
|
||||||
assert bwConfig.getStr("testcase", "test") == "ok"
|
# assert bwConfig.getStr("testcase", "test") == "ok"
|
||||||
assert bwConfig.getInt("test", "one") == 1
|
# assert bwConfig.getInt("test", "one") == 1
|
||||||
assert bwConfig.getInt("boolTest", "three") == 0
|
# assert bwConfig.getInt("boolTest", "three") == 0
|
||||||
assert bwConfig.getBool("boolTest", "one")
|
# assert bwConfig.getBool("boolTest", "one")
|
||||||
assert bwConfig.getBool("boolTest", "two")
|
# assert bwConfig.getBool("boolTest", "two")
|
||||||
assert not bwConfig.getBool("boolTest", "three")
|
# assert not bwConfig.getBool("boolTest", "three")
|
||||||
assert not bwConfig.getBool("boolTest", "four")
|
# assert not bwConfig.getBool("boolTest", "four")
|
||||||
|
#
|
||||||
def test_getAllSharepoints(self):
|
# def test_getAllSharepoints(self):
|
||||||
bwConfig = Config()
|
# bwConfig = Config()
|
||||||
bwConfig.loadConfigFile(paths.TEST_PATH + "test.ini", "test_shareConfig")
|
# bwConfig.loadConfigFile(paths.TEST_PATH + "test.yaml", "test_shareConfig")
|
||||||
assert bwConfig.getAllSharepoints() is not None
|
# assert bwConfig.getAllSharepoints() is not None
|
||||||
|
|
|
||||||
|
|
@ -55,13 +55,3 @@ class Test_Packet:
|
||||||
"""!set and get a field"""
|
"""!set and get a field"""
|
||||||
buildPacket.set("testField", "test")
|
buildPacket.set("testField", "test")
|
||||||
assert buildPacket.get("testField") is "test"
|
assert buildPacket.get("testField") is "test"
|
||||||
|
|
||||||
def test_addClientData(self, buildPacket):
|
|
||||||
"""!add client data to packet"""
|
|
||||||
buildPacket.addClientData()
|
|
||||||
assert buildPacket.get("clientVersion")
|
|
||||||
|
|
||||||
def test_addServerData(self, buildPacket):
|
|
||||||
"""!add server data to packet"""
|
|
||||||
buildPacket.addServerData()
|
|
||||||
assert buildPacket.get("serverVersion")
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue