From 110d3bf66f04ef944adc81df2d9c9b35968c5e0d Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Thu, 16 Aug 2018 20:19:47 +0200 Subject: [PATCH 01/17] prepare after release changes --- CHANGELOG.md | 14 ++++++++++---- includes/globalVars.py | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9475dcb..95e857f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,16 @@ # Changelog -### __[v2.3.1]__ - Unreleased +### __[v2.#]__ - Unreleased +##### Added +##### Changed +##### Deprecated +##### Removed +##### Fixed +##### Security + + +### __[v2.4]__ - 17.08.2018 ##### Added - Config Eintrag um Port für MySQL Plugin festzulegen [#345](https://github.com/Schrolli91/BOSWatch/pull/345) - FMS und ZVEI Support für Pushover Plugin [#352](https://github.com/Schrolli91/BOSWatch/pull/352) @@ -10,12 +19,9 @@ - multicastAlarm Plugin - RICs die von multicastAlarm genutzt werden, müssen nicht mehr in der config bei allow_ric bzw. filter_range_start/filter_range_end berücksichtigt werden. [#357](https://github.com/Schrolli91/BOSWatch/pull/357) - FFAgent Plugin - Debug Logging für die alarmHeaders eingebaut zwecks Troubleshooting [#354](https://github.com/Schrolli91/BOSWatch/pull/354) - multicastAlarm Plugin - Buffer nach jedem Alarm löschen - erlaubt in kombination mit "doubleFilter_check_msg" die Verwendung in Netzen, die zwischen multicastAlarm RICs auch normale Alarme senden. #370(https://github.com/Schrolli91/BOSWatch/pull/370) -##### Deprecated -##### Removed ##### Fixed - Fehler beim Auslesen der netIdent_RIC im MySQL Plugin [#347](https://github.com/Schrolli91/BOSWatch/pull/347) - FFAgent Plugin - Typo bei alarmHeaders für Live Betrieb gefixt [#354](https://github.com/Schrolli91/BOSWatch/pull/354) -##### Security ### __[v2.3]__ - 22.12.2017 diff --git a/includes/globalVars.py b/includes/globalVars.py index b14594d8..921975f5 100644 --- a/includes/globalVars.py +++ b/includes/globalVars.py @@ -9,7 +9,7 @@ """ # version info -versionNr = "2.5" +versionNr = "2.4" branch = "dev" buildDate = "unreleased" From 04ef809e51ef771f3c225eb1cd71398e0b5447f4 Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Thu, 16 Aug 2018 20:39:37 +0200 Subject: [PATCH 02/17] fix changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95e857f2..82f64fd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,7 @@ ##### Changed - multicastAlarm Plugin - RICs die von multicastAlarm genutzt werden, müssen nicht mehr in der config bei allow_ric bzw. filter_range_start/filter_range_end berücksichtigt werden. [#357](https://github.com/Schrolli91/BOSWatch/pull/357) - FFAgent Plugin - Debug Logging für die alarmHeaders eingebaut zwecks Troubleshooting [#354](https://github.com/Schrolli91/BOSWatch/pull/354) -- multicastAlarm Plugin - Buffer nach jedem Alarm löschen - erlaubt in kombination mit "doubleFilter_check_msg" die Verwendung in Netzen, die zwischen multicastAlarm RICs auch normale Alarme senden. #370(https://github.com/Schrolli91/BOSWatch/pull/370) +- multicastAlarm Plugin - Buffer nach jedem Alarm löschen - erlaubt in kombination mit "doubleFilter_check_msg" die Verwendung in Netzen, die zwischen multicastAlarm RICs auch normale Alarme senden. [#370](https://github.com/Schrolli91/BOSWatch/pull/370) ##### Fixed - Fehler beim Auslesen der netIdent_RIC im MySQL Plugin [#347](https://github.com/Schrolli91/BOSWatch/pull/347) - FFAgent Plugin - Typo bei alarmHeaders für Live Betrieb gefixt [#354](https://github.com/Schrolli91/BOSWatch/pull/354) From bf31a04e074f5b02ec4e56fe245c3a263fc2de12 Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Wed, 5 Sep 2018 07:18:06 +0200 Subject: [PATCH 03/17] remove NMA --- boswatch.py | 23 -- config/config.template.ini | 34 --- includes/NMAHandler.py | 73 ----- includes/pynma/README.md | 137 ---------- includes/pynma/__init__.py | 3 - includes/pynma/pynma.py | 153 ----------- plugins/notifyMyAndroid/notifyMyAndroid.py | 301 --------------------- 7 files changed, 724 deletions(-) delete mode 100644 includes/NMAHandler.py delete mode 100644 includes/pynma/README.md delete mode 100644 includes/pynma/__init__.py delete mode 100644 includes/pynma/pynma.py delete mode 100644 plugins/notifyMyAndroid/notifyMyAndroid.py diff --git a/boswatch.py b/boswatch.py index 2ad194d0..8d316b63 100755 --- a/boswatch.py +++ b/boswatch.py @@ -249,29 +249,6 @@ logging.debug("cannot set loglevel of fileHandler", exc_info=True) - # - # Add NMA logging handler - # - try: - if configHandler.checkConfig("NMAHandler"): - # is NMAHandler enabled? - if globalVars.config.getboolean("NMAHandler", "enableHandler") == True: - # we only could do something, if an APIKey is given: - if len(globalVars.config.get("NMAHandler","APIKey")) > 0: - logging.debug("add NMA logging handler") - from includes import NMAHandler - if globalVars.config.get("NMAHandler","appName") == "": - nmaHandler = NMAHandler.NMAHandler(globalVars.config.get("NMAHandler","APIKey")) - else: - nmaHandler = NMAHandler.NMAHandler(globalVars.config.get("NMAHandler","APIKey"), globalVars.config.get("NMAHandler","appName")) - nmaHandler.setLevel(globalVars.config.getint("NMAHandler","loglevel")) - myLogger.addHandler(nmaHandler) - except: - # It's an error, but we could work without that stuff... - logging.error("cannot add NMA logging handler") - logging.debug("cannot add NMA logging handler", exc_info=True) - - # initialization was fine, continue with main program... # diff --git a/config/config.template.ini b/config/config.template.ini index 11a6caf3..dd999a57 100644 --- a/config/config.template.ini +++ b/config/config.template.ini @@ -64,22 +64,6 @@ doubleFilter_check_msg = 0 writeMultimonRaw = 0 -[NMAHandler] -# you can use a logging handler for sending logging records to NotifyMyAndroid -# enableHandler (0|1) will enable the NMA handler -enableHandler = 0 - -# loglevel for NMAHandler (see BOSWatch loglevel description) -loglevel = 50 - -# logging record will send to APIKey -APIKey = - -# you can change the name of the application (default: BOSWatch) -# (f.e. if you use more than one instance of BOSWatch) -appName = BOSWatch - - [FMS] # look-up-table for adding a description # using description (0 - off | 1 - on) @@ -177,7 +161,6 @@ eMail = 0 BosMon = 0 firEmergency = 0 jsonSocket = 0 -notifyMyAndroid = 0 SMS = 0 Sms77 = 0 FFAgent = 0 @@ -287,23 +270,6 @@ server = 192.168.0.1 port = 8888 -[notifyMyAndroid] -# APIKey given from notifyMyAndroid -APIKey = - -# Priority goes from -2 (lowest) to 2 (highest). The default priority is 0 (normal) -priority = 0 - -# You can change the name of the application (default: BOSWatch) -# (f.e. if you use more than one instance of BOSWatch) -appName = BOSWatch - -# instead of a given APIKey/priority you could import them by a csv-file (0|1) -# APIKey and priority above will be ignored, if you use a csv -# configuration loaded from csv/nma.csv -usecsv = 0 - - [SMS] # be aware that you need 'gammu' installed and running # at least you need an UMTS-stick which is supported by 'gammu' diff --git a/includes/NMAHandler.py b/includes/NMAHandler.py deleted file mode 100644 index 990e6f99..00000000 --- a/includes/NMAHandler.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/python -# -*- coding: UTF-8 -*- - -""" -Logging Handler for NotifyMyAndroid - -@author: Jens Herrmann -""" - -import logging -from includes.pynma import pynma - -class NMAHandler(logging.Handler): # Inherit from logging.Handler - """ - Handler instances dispatch logging events to NotifyMyAndroid. - """ - - def __init__(self, APIKey, application="BOSWatch", event="Logging-Handler"): - """ - Initializes the handler with NMA-specific parameters. - - @param APIKey: might be a string containing 1 key or an array of keys - @param application: application name [256] - @param event: event name [1000] - """ - # run the regular Handler __init__ - logging.Handler.__init__(self) - # Our custom argument - self.APIKey = APIKey - self.application = application - self.event = event - self.nma = pynma.PyNMA(self.APIKey) - - - def emit(self, record): - """ - Send logging record via NMA - """ - # record.message is the log message - message = record.message - - # if exist, add details as NMA event: - # record.module is the module- or filename - if (len(record.module) > 0): - event = "Module: " + record.module - # record.functionName is the name of the function - # will be "" if the message is not in a function - if len(record.funcName) > 0: - if not record.funcName == "": - event += " - " + record.funcName + "()" - else: - # we have to set an event-text, use self.event now - event = self.event - - # record.levelno is the log level - # loglevel: 10 = debug => priority: -2 - # loglevel: 20 = info => priority: -1 - # loglevel: 30 = warning => priority: 0 - # loglevel: 40 = error => priority: 1 - # loglevel: 50 = critical => priority: 2 - if record.levelno >= 50: - priority = 2 - elif record.levelno >= 40: - priority = 1 - elif record.levelno >= 30: - priority = 0 - elif record.levelno >= 20: - priority = -1 - else: - priority = -2 - - # pynma.push(self, application="", event="", description="", url="", contenttype=None, priority=0, batch_mode=False, html=False) - self.nma.push(application=self.application, event=event, description=message, priority=priority) diff --git a/includes/pynma/README.md b/includes/pynma/README.md deleted file mode 100644 index e72ff1ec..00000000 --- a/includes/pynma/README.md +++ /dev/null @@ -1,137 +0,0 @@ -Pynma -====== - -Pynma is a simple python module for the [NotifyMyAndroid][nma] [API][NMA API]. - -[nma]: http://nma.usk.bz/ -[NMA API]: http://nma.usk.bz/api.php - -Credits to: Damien Degois (github.com/babs) -Refactoring: Adriano Maia (adriano@usk.bz) - -[NotifyMyAndroid][nma] ---------------- -NotifyMyAndroid is a Prowl-like application for the Android. Notifications can be sent from your application Android device using push. NMA has an extensive API, which allows your scripts to integrate beautifully. (source: http://nma.usk.bz/) - -### How it works: -First, import the module: - - import pynma - -#### Keys management - -Create a PyNMA simple instance: - - p = pynma.PyNMA( "apikey(s)", "developerkey") - -A developerkey is optional. If you'd like to add just one API key, set it as string, if you want more, just provide a list of API key strings. - - p = pynma.PyNMA(['apikey1','apikey2']) # multiple API keys - p = pynma.PyNMA("apikey1","providerkey") # 1 API key with a providerkey - -For more flexible usage, you can add and remove keys: - - p.addkey("apikey1") - p.addkey(["apikey2","apikey3"]) - -Or set or change the providerkey - - p.developerkey("developerkey") - -#### Notification or Push or Add - - p.push(application, event, description, (opt) url, (opt) priority, (opt) batch mode) - -##### Application - -Application is your message generating application name (limited to 256) - -ex: my music player - -##### Event - -Event is the event name (limited to 1000) - -ex: switched to next track - -##### Description - -The description is the payload of your message (limited to 10000 (10k)) -ex: - - Playing next song, Blah Blah Blah - Artist: blah blah - Album: blah blah - Track: 18/24 - -##### Url - -The URL which should be attached to the notification. -This will trigger a redirect when on the user's device launched, and is viewable in the notification list. - -##### Priority - -Priority goes from -2 (lowest) to 2 (highest). the default priority is 0 (normal) - -##### Batch mode - -Batch mode is a boolean value to set if you'd like to push the same message to multiple API keys 5 by 5 (as the actual verion of prowl API allows you). This can reduce the number of call you make to the API which are limited. - -#### Return - -The push method returns a dict containing different values depending of the success of you call: - -##### The call succeed - -you'll have in the dict those keys: - - type: success - code: the HTTP like code (200 if success) - remaining: the number of API call you can to until the reset - resetdate: number of remaining minutes till the hourly reset of your API call limit - -##### The call failed - -For wathever reason, you call failed, the dict key "message" will contains the erro message returned by Prowl API. You'll find those keys: - - code: 400, 401, 402 or 500 (depends of the error kind) - message: API error message - -For the code description, please refer to [NMA API documentation][NMA API] for more informations - -##### The python module encountered an unhandled problem (mostly during parsing) - -The return keys will be: - - code: 600 - type: pynmaerror - message: the exception message - -Thanks ------- - -* **Cev** for URL integration and some fixes in docstring -* **ChaoticXSinZ** for UTF-8 integration and other typos - -License (MIT) -------------- - - Copyright (c) 2010-2011, Damien Degois. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. diff --git a/includes/pynma/__init__.py b/includes/pynma/__init__.py deleted file mode 100644 index 5df62d56..00000000 --- a/includes/pynma/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/python - -from .pynma import PyNMA diff --git a/includes/pynma/pynma.py b/includes/pynma/pynma.py deleted file mode 100644 index 5649f054..00000000 --- a/includes/pynma/pynma.py +++ /dev/null @@ -1,153 +0,0 @@ -#!/usr/bin/python - -from xml.dom.minidom import parseString - -try: - from http.client import HTTPSConnection -except ImportError: - from httplib import HTTPSConnection - -try: - from urllib.parse import urlencode -except ImportError: - from urllib import urlencode - -__version__ = "1.0" - -API_SERVER = 'www.notifymyandroid.com' -ADD_PATH = '/publicapi/notify' - -USER_AGENT="PyNMA/v%s"%__version__ - -def uniq_preserve(seq): # Dave Kirby - # Order preserving - seen = set() - return [x for x in seq if x not in seen and not seen.add(x)] - -def uniq(seq): - # Not order preserving - return list({}.fromkeys(seq).keys()) - -class PyNMA(object): - """PyNMA(apikey=[], developerkey=None) -takes 2 optional arguments: - - (opt) apykey: might me a string containing 1 key or an array of keys - - (opt) developerkey: where you can store your developer key -""" - - def __init__(self, apikey=[], developerkey=None): - self._developerkey = None - self.developerkey(developerkey) - if apikey: - if isinstance(apikey, str): - apikey = [apikey] - self._apikey = uniq(apikey) - - def addkey(self, key): - "Add a key (register ?)" - if isinstance(key, str): - if not key in self._apikey: - self._apikey.append(key) - elif isinstance(key, list): - for k in key: - if not k in self._apikey: - self._apikey.append(k) - - def delkey(self, key): - "Removes a key (unregister ?)" - if isinstance(key, str): - if key in self._apikey: - self._apikey.remove(key) - elif isinstance(key, list): - for k in key: - if key in self._apikey: - self._apikey.remove(k) - - def developerkey(self, developerkey): - "Sets the developer key (and check it has the good length)" - if isinstance(developerkey, str) and len(developerkey) == 48: - self._developerkey = developerkey - - def pushWithAPIKey(self, apikey=[], application="", event="", description="", url="", contenttype=None, priority=0, batch_mode=False, html=False): - """Special Funktion""" - if apikey: - if isinstance(apikey, str): - apikey = [apikey] - self._apikey = uniq(apikey) - return self.push(application, event, description, url, contenttype, priority, batch_mode, html) - - def push(self, application="", event="", description="", url="", contenttype=None, priority=0, batch_mode=False, html=False): - """Pushes a message on the registered API keys. -takes 5 arguments: - - (req) application: application name [256] - - (req) event: event name [1000] - - (req) description: description [10000] - - (opt) url: url [512] - - (opt) contenttype: Content Type (act: None (plain text) or text/html) - - (opt) priority: from -2 (lowest) to 2 (highest) (def:0) - - (opt) batch_mode: push to all keys at once (def:False) - - (opt) html: shortcut for contenttype=text/html -Warning: using batch_mode will return error only if all API keys are bad - cf: http://nma.usk.bz/api.php -""" - datas = { - 'application': application[:256].encode('utf8'), - 'event': event[:1024].encode('utf8'), - 'description': description[:10000].encode('utf8'), - 'priority': priority - } - - if url: - datas['url'] = url[:512] - - if contenttype == "text/html" or html == True: # Currently only accepted content type - datas['content-type'] = "text/html" - - if self._developerkey: - datas['developerkey'] = self._developerkey - - results = {} - - if not batch_mode: - for key in self._apikey: - datas['apikey'] = key - res = self.callapi('POST', ADD_PATH, datas) - results[key] = res - else: - datas['apikey'] = ",".join(self._apikey) - res = self.callapi('POST', ADD_PATH, datas) - results[datas['apikey']] = res - return results - - def callapi(self, method, path, args): - headers = { 'User-Agent': USER_AGENT } - if method == "POST": - headers['Content-type'] = "application/x-www-form-urlencoded" - http_handler = HTTPSConnection(API_SERVER) - http_handler.request(method, path, urlencode(args), headers) - resp = http_handler.getresponse() - - try: - res = self._parse_reponse(resp.read()) - except Exception as e: - res = {'type': "pynmaerror", - 'code': 600, - 'message': str(e) - } - - return res - - def _parse_reponse(self, response): - root = parseString(response).firstChild - for elem in root.childNodes: - if elem.nodeType == elem.TEXT_NODE: continue - if elem.tagName == 'success': - res = dict(list(elem.attributes.items())) - res['message'] = "" - res['type'] = elem.tagName - return res - if elem.tagName == 'error': - res = dict(list(elem.attributes.items())) - res['message'] = elem.firstChild.nodeValue - res['type'] = elem.tagName - return res diff --git a/plugins/notifyMyAndroid/notifyMyAndroid.py b/plugins/notifyMyAndroid/notifyMyAndroid.py deleted file mode 100644 index a8ab1276..00000000 --- a/plugins/notifyMyAndroid/notifyMyAndroid.py +++ /dev/null @@ -1,301 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -""" -notifyMyAndroid-Plugin to dispatch FMS-, ZVEI- and POCSAG-messages via UDP/TCP - -@author: Jens Herrmann - -@requires: notifyMyAndroid-Configuration has to be set in the config.ini -""" - -import logging # Global logger -import csv # for loading the APIKeys - - -from includes import globalVars # Global variables - -from includes.helper import configHandler -from includes.helper import timeHandler -from includes.helper import stringConverter -from includes.pynma import pynma - - -# local variables -application = "BOSWatch" -APIKey = None -remainingMsgs = None -usecsv = False -# data structures: xAPIKeyList[id][i] = (APIKey, priority, eventPrefix) -fmsAPIKeyList = {} -zveiAPIKeyList = {} -pocAPIKeyList = {} - - -def checkResponse(response, APIKey): - """ - Helper function to check the response of NMA - - @type response: dict - @param response: Response of the pyNMA.push() method - @type data: string / array - @param data: a string containing 1 key or an array of keys - - @return: nothing - """ - # local variables - global remainingMsgs - try: - # - # check HTTP-Response - # - if str(response[APIKey]['code']) == "200": #Check HTTP Response an print a Log or Error - logging.debug("NMA response: %s" , str(response[APIKey]['code'])) - remainingMsgs = response[APIKey]['remaining'] - if int(remainingMsgs) == 0: - logging.error("NMA remaining msgs: %s" , str(remainingMsgs)) - if int(response[APIKey]['remaining']) < 20: - logging.warning("NMA remaining msgs: %s" , str(remainingMsgs)) - else: - logging.debug("NMA remaining msgs: %s" , str(remainingMsgs)) - else: - logging.warning("NMA response: %s - %s" , str(response[APIKey]['code']), str(response[APIKey]['message'])) - except: - logging.error("cannot read pynma response") - logging.debug("cannot read pynma response", exc_info=True) - return - - -## -# -# onLoad (init) function of plugin -# will be called one time by the pluginLoader on start -# -def onLoad(): - """ - While loading the plugins by pluginLoader.loadPlugins() - this onLoad() routine is called one time for initialize the plugin - - @requires: nothing - - @return: nothing - """ - # local variables - global application - global APIKey - global usecsv - - # load config: - configHandler.checkConfig("notifyMyAndroid") - application = stringConverter.convertToUnicode(globalVars.config.get("notifyMyAndroid","appName")) - usecsv = globalVars.config.getboolean("notifyMyAndroid","usecsv") - - # if no csv should use, we take the APIKey directly - if usecsv == False: - APIKey = globalVars.config.get("notifyMyAndroid","APIKey") - else: - # import the csv-file - try: - logging.debug("-- loading nma.csv") - with open(globalVars.script_path+'/csv/nma.csv') as csvfile: - # DictReader expected structure described in first line of csv-file - reader = csv.DictReader(csvfile) - for row in reader: - logging.debug(row) - # only import rows with an supported types - supportedTypes = ["FMS", "ZVEI", "POC"] - if row['typ'] in supportedTypes: - try: - if "FMS" in row['typ']: - # if len for id in mainList raise an KeyErrorException, we have to init it... - try: - if len(fmsAPIKeyList[row['id']]) > 0: - pass - except KeyError: - fmsAPIKeyList[row['id']] = [] - # data structure: fmsAPIKeyList[fms][i] = (APIKey, priority) - fmsAPIKeyList[row['id']].append((row['APIKey'], row['priority'], row['eventPrefix'])) - - elif "ZVEI" in row['typ']: - # if len for id in mainList raise an KeyErrorException, we have to init it... - try: - if len(zveiAPIKeyList[row['id']]) > 0: - pass - except KeyError: - zveiAPIKeyList[row['id']] = [] - # data structure: zveiAPIKeyList[zvei][i] = (APIKey, priority) - zveiAPIKeyList[row['id']].append((row['APIKey'], row['priority'], row['eventPrefix'])) - - elif "POC" in row['typ']: - # if len for id in mainList raise an KeyErrorException, we have to init it... - try: - if len(pocAPIKeyList[row['id']]) > 0: - pass - except KeyError: - pocAPIKeyList[row['id']] = [] - # data structure: zveiAPIKeyList[ric][i] = (APIKey, priority) - pocAPIKeyList[row['id']].append((row['APIKey'], row['priority'], row['eventPrefix'])) - - except: - # skip entry in case of an exception - logging.debug("error in shifting...", exc_info=True) - # if row['typ'] in supportedTypes - # for row in reader: - logging.debug("-- loading csv finished") - except: - logging.error("loading csvList for nma failed") - logging.debug("loading csvList for nma failed", exc_info=True) - raise - # and if usecsv == True - return - - -## -# -# Main function of jsonSocket-plugin -# will be called by the alarmHandler -# -def run(typ,freq,data): - """ - This function is the implementation of the notifyMyAndroid-Plugin. - - The configuration is set in the config.ini. - - @type typ: string (FMS|ZVEI|POC) - @param typ: Typ of the dataset for sending via UDP/TCP - @type data: map of data (structure see readme.md in plugin folder) - @param data: Contains the parameter for dispatch to UDP. - @type freq: string - @keyword freq: frequency of the SDR Stick - - @requires: notifyMyAndroid-Configuration has to be set in the config.ini - - @return: nothing - """ - # local variables - - try: - try: - # - # initialize to pyNMA - # - nma = pynma.PyNMA() - except: - logging.error("cannot initialize pyNMA") - logging.debug("cannot initialize pyNMA", exc_info=True) - # Without class, plugin couldn't work - return - - else: - # toDo is equals for all types, so only check if typ is supported - supportedTypes = ["FMS", "ZVEI", "POC"] - if typ in supportedTypes: - logging.debug("Start %s to NMA", typ) - try: - # build event and msg - # pyNMA expect strings are not in UTF-8 - event = stringConverter.convertToUnicode(data['description']) - msg = timeHandler.getDateTime(data['timestamp']) - if ("POC" in typ) and (len(data['msg']) > 0): - msg += "\n" + data['msg'] - msg = stringConverter.convertToUnicode(msg) - - # if not using csv-import, all is simple... - if usecsv == False: - response = nma.pushWithAPIKey(APIKey, application, event, msg, priority=globalVars.config.getint("notifyMyAndroid","priority")) - checkResponse(response, APIKey) - else: - if "FMS" in typ: - # lets look for fms in fmsAPIKeyList - xID = data['fms'] - try: - # data structure: fmsAPIKeyList[xID][i] = (xAPIKey, xPriority, xEventPrefix) - for i in range(len(fmsAPIKeyList[xID])): - xEvent = event - (xAPIKey, xPriority, xEventPrefix) = fmsAPIKeyList[xID][i] - if len(xEventPrefix) > 0: - xEvent = xEventPrefix + ": " + xEvent - response = nma.pushWithAPIKey(xAPIKey, application, xEvent, msg, priority=xPriority) - checkResponse(response, xAPIKey) - except KeyError: - # nothing found - pass - - elif "ZVEI" in typ: - # lets look for zvei in zveiAPIKeyList - xID = data['zvei'] - try: - # data structure: zveiAPIKeyList[xID][i] = (xAPIKey, xPriority, xEventPrefix) - for i in range(len(zveiAPIKeyList[xID])): - xEvent = event - (xAPIKey, xPriority, xEventPrefix) = zveiAPIKeyList[xID][i] - if len(xEventPrefix) > 0: - xEvent = xEventPrefix + ": " + xEvent - response = nma.pushWithAPIKey(xAPIKey, application, xEvent, msg, priority=xPriority) - checkResponse(response, xAPIKey) - except KeyError: - # nothing found - pass - - elif "POC" in typ: - xID = "" - # 1. lets look for ric+functionChar in pocAPIKeyList - try: - xID = data['ric'] + data['functionChar'] - # data structure: pocAPIKeyList[xID][i] = (xAPIKey, xPriority, xEventPrefix) - for i in range(len(pocAPIKeyList[xID])): - xEvent = event - (xAPIKey, xPriority, xEventPrefix) = pocAPIKeyList[xID][i] - if len(xEventPrefix) > 0: - xEvent = xEventPrefix + ": " + xEvent - response = nma.pushWithAPIKey(xAPIKey, application, xEvent, msg, priority=xPriority) - checkResponse(response, xAPIKey) - except KeyError: - # nothing found - pass - # 2. lets look for ric* in pocAPIKeyList - try: - xID = data['ric'] + "*" - # data structure: pocAPIKeyList[xID][i] = (xAPIKey, xPriority, xEventPrefix) - for i in range(len(pocAPIKeyList[xID])): - xEvent = event - (xAPIKey, xPriority, xEventPrefix) = pocAPIKeyList[xID][i] - if len(xEventPrefix) > 0: - xEvent = xEventPrefix + ": " + xEvent - response = nma.pushWithAPIKey(xAPIKey, application, xEvent, msg, priority=xPriority) - checkResponse(response, xAPIKey) - except KeyError: - # nothing found - pass - # 3. lets look for ric prefixes in pocAPIKeyList - for prefixLength in reversed(range(6)): - ricPrefix = data['ric'][:prefixLength] - #fill the ric with stars - ricPrefix = ricPrefix.ljust(8,'*') - try: - xID = ricPrefix - # data structure: pocAPIKeyList[xID][i] = (xAPIKey, xPriority, xEventPrefix) - for i in range(len(pocAPIKeyList[xID])): - xEvent = event - (xAPIKey, xPriority, xEventPrefix) = pocAPIKeyList[xID][i] - if len(xEventPrefix) > 0: - xEvent = xEventPrefix + ": " + xEvent - response = nma.pushWithAPIKey(xAPIKey, application, xEvent, msg, priority=xPriority) - checkResponse(response, xAPIKey) - except KeyError: - # nothing found - pass - - # end if "POC" in typ - # end if usecsv == True - except: - logging.error("%s to NMA failed", typ) - logging.debug("%s to NMA failed", typ, exc_info=True) - return - else: - logging.warning("Invalid Typ: %s", typ) - - except: - # something very mysterious - logging.error("unknown error") - logging.debug("unknown error", exc_info=True) From af9e01398ce26c899b1bcd24af043f80db15cc7b Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Wed, 5 Sep 2018 07:21:50 +0200 Subject: [PATCH 04/17] edit changelog --- .idea/BOSWatch.iml | 12 + .idea/inspectionProfiles/Project_Default.xml | 29 ++ .idea/misc.xml | 4 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + .idea/workspace.xml | 357 +++++++++++++++++++ CHANGELOG.md | 1 + 7 files changed, 417 insertions(+) create mode 100644 .idea/BOSWatch.iml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml diff --git a/.idea/BOSWatch.iml b/.idea/BOSWatch.iml new file mode 100644 index 00000000..e98082ab --- /dev/null +++ b/.idea/BOSWatch.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..7feb4b22 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,29 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..65531ca9 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..34a1ace3 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..94a25f7f --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 00000000..4591a05f --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,357 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nam + nma + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - 1515995451240 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 4f8c15d7d0716e3335e0bee35d71c8e8e85c355e Mon Sep 17 00:00:00 2001 From: Florian Date: Sat, 13 Oct 2018 23:10:31 +0200 Subject: [PATCH 07/17] Update Pushover.py Changing priority depending on ZVEI / RIC --- plugins/Pushover/Pushover.py | 45 ++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/plugins/Pushover/Pushover.py b/plugins/Pushover/Pushover.py index d220de6e..69bfa134 100644 --- a/plugins/Pushover/Pushover.py +++ b/plugins/Pushover/Pushover.py @@ -75,9 +75,20 @@ def run(typ, freq, data): # # building message for ZVEI # + if globalVars.config.get("Pushover", "zvei_sep_prio") == '1': + if data["zvei"] in globalVars.config.get("Pushover", "zvei_prio2"): + priority = '2' + elif data["zvei"] in globalVars.config.get("Pushover","zvei_prio1"): + priority = '1' + elif data["zvei"] in globalVars.config.get("Pushover","zvei_prio0"): + priority = '0' + else: + priority = '-1' + else: + priority = globalVars.config.get("Pushover","zvei_std_prio") + message = globalVars.config.get("Pushover", "zvei_message") title = globalVars.config.get("Pushover", "zvei_title") - priority = globalVars.config.get("Pushover", "zvei_prio") logging.debug("Sending message: %s", message) elif typ == "POC": @@ -86,17 +97,27 @@ def run(typ, freq, data): # Pushover-Request # logging.debug("send Pushover for %s", typ) - - if data["function"] == '1': - priority = globalVars.config.get("Pushover", "SubA") - elif data["function"] == '2': - priority = globalVars.config.get("Pushover", "SubB") - elif data["function"] == '3': - priority = globalVars.config.get("Pushover", "SubC") - elif data["function"] == '4': - priority = globalVars.config.get("Pushover", "SubD") - else: - priority = 0 + if globalVars.config.get("Pushover", "poc_spec_ric") == '0': + if data["function"] == '1': + priority = globalVars.config.get("Pushover", "SubA") + elif data["function"] == '2': + priority = globalVars.config.get("Pushover", "SubB") + elif data["function"] == '3': + priority = globalVars.config.get("Pushover", "SubC") + elif data["function"] == '4': + priority = globalVars.config.get("Pushover", "SubD") + else: + priority = 0 + else: + if data["ric"] in globalVars.config.get("Pushover", "poc_prio2"): + priority = 2 + elif data["ric"] in globalVars.config.get("Pushover","poc_prio1"): + priority = 1 + elif data["ric"] in globalVars.config.get("Pushover","poc_prio0"): + priority = 0 + else: + priority = -1 + message = globalVars.config.get("Pushover", "poc_message") title = globalVars.config.get("Pushover", "poc_title") From 2761ace2b0d032ce41ae18be8340f310e830e384 Mon Sep 17 00:00:00 2001 From: Florian Date: Sat, 13 Oct 2018 23:16:01 +0200 Subject: [PATCH 08/17] Update config.template.ini Adding config-parts for new functions --- config/config.template.ini | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/config/config.template.ini b/config/config.template.ini index dd999a57..bda5904c 100644 --- a/config/config.template.ini +++ b/config/config.template.ini @@ -349,11 +349,30 @@ SubA = 1 SubB = 1 SubC = 2 SubD = -2 + +# ...or define the priority depending on the RIC +# 1. switch it on +poc_spec_ric = 0 + +# 2. fill the following lists, seperator is , +poc_prio2 = +poc_prio1 = +poc_prio0 = + poc_title = Alarm: %RIC%%LPAR%%FUNCCHAR%%RPAR% poc_message = %DATE% %TIME% - %DESCR%: %MSG% # Section for ZVEI -zvei_prio = 1 +# default prio for all ZVEI - except you specify it different +zvei_std_prio = 1 + +# [1 - on, 0 - off] - by switching on you can list certain ZVEI depending on their priority +zvei_sep_prio = 0 + +# use the following lists, separator is , +zvei_prio2 = +zvei_prio1 = +zvei_prio0 = zvei_title = Alarm: %ZVEI% zvei_message = %DATE% %TIME%: %ZVEI% From a4b19b66b99eb42b6bc8ccdf6984dff39341c0f9 Mon Sep 17 00:00:00 2001 From: Florian Date: Sat, 13 Oct 2018 23:18:09 +0200 Subject: [PATCH 09/17] fixing line indentations --- plugins/Pushover/Pushover.py | 38 ++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/plugins/Pushover/Pushover.py b/plugins/Pushover/Pushover.py index 69bfa134..8209db3a 100644 --- a/plugins/Pushover/Pushover.py +++ b/plugins/Pushover/Pushover.py @@ -98,25 +98,25 @@ def run(typ, freq, data): # logging.debug("send Pushover for %s", typ) if globalVars.config.get("Pushover", "poc_spec_ric") == '0': - if data["function"] == '1': - priority = globalVars.config.get("Pushover", "SubA") - elif data["function"] == '2': - priority = globalVars.config.get("Pushover", "SubB") - elif data["function"] == '3': - priority = globalVars.config.get("Pushover", "SubC") - elif data["function"] == '4': - priority = globalVars.config.get("Pushover", "SubD") - else: - priority = 0 - else: - if data["ric"] in globalVars.config.get("Pushover", "poc_prio2"): - priority = 2 - elif data["ric"] in globalVars.config.get("Pushover","poc_prio1"): - priority = 1 - elif data["ric"] in globalVars.config.get("Pushover","poc_prio0"): - priority = 0 - else: - priority = -1 + if data["function"] == '1': + priority = globalVars.config.get("Pushover", "SubA") + elif data["function"] == '2': + priority = globalVars.config.get("Pushover", "SubB") + elif data["function"] == '3': + priority = globalVars.config.get("Pushover", "SubC") + elif data["function"] == '4': + priority = globalVars.config.get("Pushover", "SubD") + else: + priority = 0 + else: + if data["ric"] in globalVars.config.get("Pushover", "poc_prio2"): + priority = 2 + elif data["ric"] in globalVars.config.get("Pushover","poc_prio1"): + priority = 1 + elif data["ric"] in globalVars.config.get("Pushover","poc_prio0"): + priority = 0 + else: + priority = -1 message = globalVars.config.get("Pushover", "poc_message") title = globalVars.config.get("Pushover", "poc_title") From c00146ccd0a55c5f6fabcc459b6a7f803eff0a2e Mon Sep 17 00:00:00 2001 From: Florian Date: Sun, 14 Oct 2018 12:26:35 +0200 Subject: [PATCH 10/17] Update Pushover.py fixing line-indentations - 2nd trial --- plugins/Pushover/Pushover.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/plugins/Pushover/Pushover.py b/plugins/Pushover/Pushover.py index 8209db3a..9a0b4883 100644 --- a/plugins/Pushover/Pushover.py +++ b/plugins/Pushover/Pushover.py @@ -76,16 +76,16 @@ def run(typ, freq, data): # building message for ZVEI # if globalVars.config.get("Pushover", "zvei_sep_prio") == '1': - if data["zvei"] in globalVars.config.get("Pushover", "zvei_prio2"): - priority = '2' - elif data["zvei"] in globalVars.config.get("Pushover","zvei_prio1"): - priority = '1' - elif data["zvei"] in globalVars.config.get("Pushover","zvei_prio0"): - priority = '0' - else: - priority = '-1' - else: - priority = globalVars.config.get("Pushover","zvei_std_prio") + if data["zvei"] in globalVars.config.get("Pushover", "zvei_prio2"): + priority = '2' + elif data["zvei"] in globalVars.config.get("Pushover","zvei_prio1"): + priority = '1' + elif data["zvei"] in globalVars.config.get("Pushover","zvei_prio0"): + priority = '0' + else: + priority = '-1' + else: + priority = globalVars.config.get("Pushover","zvei_std_prio") message = globalVars.config.get("Pushover", "zvei_message") title = globalVars.config.get("Pushover", "zvei_title") From c26deb995efbccd3b4e6f570d2cbccc51a84229e Mon Sep 17 00:00:00 2001 From: Florian Date: Mon, 15 Oct 2018 20:53:16 +0200 Subject: [PATCH 11/17] Update CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 62f03681..f21ddcb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,9 @@ ##### Fixed ##### Security +### __[v2.5]__ - 15.10.2018 +##### Added +- Pushover-Plugin: Priorität für einzelne RIC und ZVEI in config einstellbar [#378](https://github.com/Schrolli91/BOSWatch/pull/378) ### __[v2.4]__ - 17.08.2018 ##### Added From a333b22a062c57fcfd18bf7c0aaaf4dfa82914a4 Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Tue, 16 Oct 2018 05:58:56 +0200 Subject: [PATCH 12/17] changelog angepasst MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Änderung in den "unreleased" Abschnitt verschoben --- CHANGELOG.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f21ddcb0..0e81d704 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### __[v2.#]__ - Unreleased ##### Added +- Pushover-Plugin: Priorität für einzelne RIC und ZVEI in config einstellbar [#378](https://github.com/Schrolli91/BOSWatch/pull/378) ##### Changed ##### Deprecated ##### Removed @@ -10,9 +11,6 @@ ##### Fixed ##### Security -### __[v2.5]__ - 15.10.2018 -##### Added -- Pushover-Plugin: Priorität für einzelne RIC und ZVEI in config einstellbar [#378](https://github.com/Schrolli91/BOSWatch/pull/378) ### __[v2.4]__ - 17.08.2018 ##### Added From 9ad1ed74ef2d8c7ba48fdb920d751a818085b3f0 Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Tue, 16 Oct 2018 10:03:04 +0200 Subject: [PATCH 13/17] Update Pushover.py remove trailing whitespaces [Codacy] --- plugins/Pushover/Pushover.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Pushover/Pushover.py b/plugins/Pushover/Pushover.py index 9a0b4883..051445d9 100644 --- a/plugins/Pushover/Pushover.py +++ b/plugins/Pushover/Pushover.py @@ -86,7 +86,7 @@ def run(typ, freq, data): priority = '-1' else: priority = globalVars.config.get("Pushover","zvei_std_prio") - + message = globalVars.config.get("Pushover", "zvei_message") title = globalVars.config.get("Pushover", "zvei_title") logging.debug("Sending message: %s", message) From de7947bec72037b99c9e7ada4f930e0d13f323fe Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Thu, 18 Oct 2018 10:13:04 +0200 Subject: [PATCH 14/17] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index c9b570b9..19a918df 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +### Fast support on https://bwcc.boswatch.de (Mattermost-Server) +#### Forum: https://boswatch.de + ### Arbeiten an BOSWatch 3 gestartet #### Work on BOSWatch 3 has started ## see: https://boswatch.de/index.php?thread/29-boswatch-3/ From 203bbedaa9343e77e09e47fcba20fd586a4705f4 Mon Sep 17 00:00:00 2001 From: PeterLaemmle Date: Fri, 19 Oct 2018 17:45:03 +0200 Subject: [PATCH 15/17] Update Telegram.py - Remove redundant concatenation - Ensure German descriptions in maps --- plugins/Telegram/Telegram.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/Telegram/Telegram.py b/plugins/Telegram/Telegram.py index dc4cc6e2..451fe548 100644 --- a/plugins/Telegram/Telegram.py +++ b/plugins/Telegram/Telegram.py @@ -100,9 +100,9 @@ def run(typ,freq,data): address = "+".join(data["msg"].split(')')[0].split('/',1)[1].replace('(',' ').split()) logging.debug("Retrieve maps from Google") - url = "+".join(["http://maps.googleapis.com/maps/api/staticmap?markers=", address, "&size=480x640&maptype=roadmap&zoom=16&key=", GoogleAPIKey]) + url = "".join(["http://maps.googleapis.com/maps/api/staticmap?markers=", address, "&size=480x640&maptype=roadmap&zoom=16&language=de&key=", GoogleAPIKey]) urllib.urlretrieve(url, "overview_map.png") - url = "+".join(["http://maps.googleapis.com/maps/api/staticmap?markers=", address, "&size=240x320&scale=2&maptype=hybrid&zoom=17&key=", GoogleAPIKey]) + url = "".join(["http://maps.googleapis.com/maps/api/staticmap?markers=", address, "&size=240x320&scale=2&maptype=hybrid&zoom=17&language=de&key=", GoogleAPIKey]) urllib.urlretrieve(url, "detail_map.png") # Send message and map with Telegram From 5e978fbb2aaa4d1cf261d785c68612572af4de32 Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Tue, 23 Oct 2018 07:47:18 +0200 Subject: [PATCH 16/17] edit changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e81d704..e063972f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ##### Added - Pushover-Plugin: Priorität für einzelne RIC und ZVEI in config einstellbar [#378](https://github.com/Schrolli91/BOSWatch/pull/378) ##### Changed +- Kleinere Anpassungen im Telegram Plugin (Karten-Generierung) [#380](https://github.com/Schrolli91/BOSWatch/pull/380) ##### Deprecated ##### Removed - Notify-my-Andoird Plugin und Logging-Handler wegen Einstellung des Service entfernt [#374](https://github.com/Schrolli91/BOSWatch/pull/374) From 740f10dfae1448fdd5d554700935c6012d071a34 Mon Sep 17 00:00:00 2001 From: Bastian Schroll Date: Tue, 23 Oct 2018 07:59:39 +0200 Subject: [PATCH 17/17] prepare for new version --- CHANGELOG.md | 14 ++++++++++---- includes/globalVars.py | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e063972f..e1532d3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,18 +1,24 @@ # Changelog -### __[v2.#]__ - Unreleased +### __[v#.#]__ - date ##### Added -- Pushover-Plugin: Priorität für einzelne RIC und ZVEI in config einstellbar [#378](https://github.com/Schrolli91/BOSWatch/pull/378) ##### Changed -- Kleinere Anpassungen im Telegram Plugin (Karten-Generierung) [#380](https://github.com/Schrolli91/BOSWatch/pull/380) ##### Deprecated ##### Removed -- Notify-my-Andoird Plugin und Logging-Handler wegen Einstellung des Service entfernt [#374](https://github.com/Schrolli91/BOSWatch/pull/374) ##### Fixed ##### Security +### __[v2.4.1]__ - 23.20.2018 +##### Added +- Pushover-Plugin: Priorität für einzelne RIC und ZVEI in config einstellbar [#378](https://github.com/Schrolli91/BOSWatch/pull/378) +##### Changed +- Kleinere Anpassungen im Telegram Plugin (Karten-Generierung) [#380](https://github.com/Schrolli91/BOSWatch/pull/380) +##### Removed +- Notify-my-Andoird Plugin und Logging-Handler wegen Einstellung des Service entfernt [#374](https://github.com/Schrolli91/BOSWatch/pull/374) + + ### __[v2.4]__ - 17.08.2018 ##### Added - Config Eintrag um Port für MySQL Plugin festzulegen [#345](https://github.com/Schrolli91/BOSWatch/pull/345) diff --git a/includes/globalVars.py b/includes/globalVars.py index 921975f5..04468083 100644 --- a/includes/globalVars.py +++ b/includes/globalVars.py @@ -9,7 +9,7 @@ """ # version info -versionNr = "2.4" +versionNr = "2.4.1" branch = "dev" buildDate = "unreleased"