From 06574c575afe90315c37b5f2c11f3df966cdcd3a Mon Sep 17 00:00:00 2001 From: Dan Srebnick Date: Thu, 31 Aug 2017 10:21:47 -0400 Subject: [PATCH] 0.5 improvements --- CHANGELOG | 25 ++++++++++ noaacap-0.4.1.deb | Bin 5392 -> 0 bytes noaacap/usr/local/bin/noaacap.py | 76 ++++++++++++++++--------------- packages/noaacap-0.4.1.deb | Bin 5408 -> 5392 bytes 4 files changed, 65 insertions(+), 36 deletions(-) create mode 100644 CHANGELOG delete mode 100644 noaacap-0.4.1.deb diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..39588dc --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,25 @@ +noaacap changelog +## +Version: 0.5 +Release: TBD +Bug fix for long messages to ensure myZone is included +Improve error handling for configuration errors +Add -v command line switch to print version and copyright +## +Version: 0.4 +Release: August 24, 2017 +Switched to compressed zcs to improve capacity +Improved messsage + \n length check +## +Version: 0.3 +Release: August 22, 2017 +Changes: Implement NWS-CANCL messages, implement DB id consisting of +Office + Phenomena + Significance + ETN +## +Version: 0.2 +Release: August 19, 2017 +Changes: Make sure message does not exceed 67 chars +## +Version: 0.1 +Release: August 7, 2017 +Initial Release diff --git a/noaacap-0.4.1.deb b/noaacap-0.4.1.deb deleted file mode 100644 index 6d11e38667bfde1a8db2b8659221f3c089288461..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5392 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 diff --git a/noaacap/usr/local/bin/noaacap.py b/noaacap/usr/local/bin/noaacap.py index e3b73b2..10c9a13 100755 --- a/noaacap/usr/local/bin/noaacap.py +++ b/noaacap/usr/local/bin/noaacap.py @@ -1,29 +1,12 @@ #!/usr/bin/python ## Author: Dan Srebnick, K2DLS -## -## Version: 0.4 -## Release: August 24, 2017 -## Switched to compressed zcs to improve capacity -## Improved messsage + \n length check -## -## Version: 0.3 -## Release: August 22, 2017 -## Changes: Implement NWS-CANCL messages, implement DB id consisting of -## Office + Phenomena + Significance + ETN -## -## Version: 0.2 -## Release: August 19, 2017 -## Changes: Make sure message + \n does not exceed 67 chars -## -## Version: 0.1 -## Release: August 7, 2017 -## ## License: BSD-2-Clause (/usr/local/share/noaacap/license.txt) -## ## This program is called from aprx. ## +version = "0.5" +import sys import pytz, datetime import string import requests @@ -33,17 +16,36 @@ import os import ConfigParser import re +if len(sys.argv) == 2 and sys.argv[1] == '-v': + print "noaacap.py by K2DLS, version " + version + print + print "A weather alert beacon exec for aprx >= 2.9" + print "Licensed under the BSD 2 Clause license" + print "Copyright 2017 by Daniel L. Srebnick" + print + exit(0) + +conffile = '/etc/noaacap.conf' + +if not os.path.isfile(conffile): + exit("\nError: " + conffile + " not found\n") + config = ConfigParser.ConfigParser() try: - os.path.isfile('/etc/noaacap.conf') + config.read(conffile) except: - exit("\nError: /etc/noaacap.conf not found\n") -else: - config.read('/etc/noaacap.conf') + exit("\nError: Check " + conffile + " for proper [noaacap] section heading\n") -myTZ = config.get('noaacap', 'myTZ') -myZone = config.get('noaacap', 'myZone') +try: + myTZ = config.get('noaacap', 'myTZ') +except: + exit("\nError: Check " + conffile + " for proper myTZ value in [noaacap] section\n") + +try: + myZone = config.get('noaacap', 'myZone') +except: + exit("\nError: Check " + conffile + " for proper myZone value in [noaacap] section\n") def aprstime(timestr,TZ): local = pytz.timezone (TZ) @@ -191,20 +193,22 @@ for i in range(0, count): event = "CANCL" hit = 1 - suffix = exputc + "z," + type + "," + zcs + "{" + t + "00" + message = exputc + "z," + type + "," + zcs - # Make sure message does not exceed 67 chars (66 + newline) - # If it does, trim it. Also be certain that myZone - # is included in the trimmed zcs. - while len(suffix) > 66: - if not myZone in parsezcs(zcs): - zcs = myZone + "-" + zcs - suffix = exputc + "z," + type + "," + zcs + "{" + t + "00" + # Make sure message does not exceed 67 chars. If it + # does, trim it. Also be certain that myZone is included + # included in the trimmed zcs. + + while len(message) > 67: n = zcs.rfind('-') zcs = zcs[0:n] - suffix = exputc + "z," + type + "," + zcs + "{" + t + "00" - - print ":NWS_" + event + ":" + suffix + message = exputc + "z," + type + "," + zcs + if not myZone in parsezcs(zcs): + zcs = myZone + "-" + zcs + message = exputc + "z," + type + "," + zcs + + line = "{" + t + "00" + print ":NWS_" + event + ":" + message + line break diff --git a/packages/noaacap-0.4.1.deb b/packages/noaacap-0.4.1.deb index 3508a80446c71087c8d8a92666c487cbc892c3ff..6d11e38667bfde1a8db2b8659221f3c089288461 100644 GIT binary patch delta 4632 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 OFb#_W000000a;qQ!R>MY delta 4648 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