Change-Id: If95cb839ad81ca2a842ff7f6926847ac3928d8f2 Former-commit-id: 77e1a4d8f5237e5fae930c1e00589c752f8b3738
311 lines
11 KiB
Python
311 lines
11 KiB
Python
##
|
|
# This software was developed and / or modified by Raytheon Company,
|
|
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
|
|
#
|
|
# U.S. EXPORT CONTROLLED TECHNICAL DATA
|
|
# This software product contains export-restricted data whose
|
|
# export/transfer/disclosure is restricted by U.S. law. Dissemination
|
|
# to non-U.S. persons whether in the United States or abroad requires
|
|
# an export license or other authorization.
|
|
#
|
|
# Contractor Name: Raytheon Company
|
|
# Contractor Address: 6825 Pine Street, Suite 340
|
|
# Mail Stop B8
|
|
# Omaha, NE 68106
|
|
# 402.291.0100
|
|
#
|
|
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
|
|
# further licensing information.
|
|
##
|
|
#
|
|
# Name:
|
|
# TriggerEditor.py
|
|
# GFS1-NHD:A8059.0000-SCRIPT;16
|
|
#
|
|
# Status:
|
|
# DELIVERED
|
|
#
|
|
# History:
|
|
# Revision 16 (DELIVERED)
|
|
# Created: 09-JUL-2007 14:42:40 OBERFIEL
|
|
# Removed reference to TWEBs in Items and NNN variables
|
|
#
|
|
# Revision 15 (DELIVERED)
|
|
# Created: 03-MAY-2007 09:42:52 OBERFIEL
|
|
# Removed references to XTF product, INFORMIX (sniffle) and
|
|
# update the Help dialog content to be
|
|
# grammatically correct and accurate.
|
|
#
|
|
# Revision 14 (DELIVERED)
|
|
# Created: 05-JUN-2006 09:02:37 OBERFIEL
|
|
# Removed references to path with version number in it
|
|
#
|
|
# Revision 13 (DELIVERED)
|
|
# Created: 29-MAR-2006 11:11:52 OBERFIEL
|
|
# Updates and minor fixes needed since deployment to ATAN
|
|
# sites
|
|
#
|
|
# Revision 12 (DELIVERED)
|
|
# Created: 23-FEB-2006 08:24:45 TROJAN
|
|
# moved paths to text database commands to avnenv.sh
|
|
#
|
|
# Revision 11 (DELIVERED)
|
|
# Created: 19-SEP-2005 15:13:07 TROJAN
|
|
# spr 7011
|
|
#
|
|
# Revision 10 (APPROVED)
|
|
# Created: 07-SEP-2005 12:57:39 TROJAN
|
|
# spr 7010
|
|
#
|
|
# Revision 9 (DELIVERED)
|
|
# Created: 07-JUL-2005 13:05:01 TROJAN
|
|
# spr 6905
|
|
#
|
|
# Revision 8 (DELIVERED)
|
|
# Created: 01-JUN-2005 17:41:28 OBERFIEL
|
|
# Bug fixes since RHE3 initial snapshot
|
|
#
|
|
# Revision 7 (DELIVERED)
|
|
# Created: 07-MAY-2005 11:39:40 OBERFIEL
|
|
# Added Item Header Block
|
|
#
|
|
# Revision 6 (DELIVERED)
|
|
# Created: 18-APR-2005 17:32:30 OBERFIEL
|
|
# Changes to support gamin
|
|
#
|
|
# Revision 5 (DELIVERED)
|
|
# Created: 15-MAR-2005 18:39:31 OBERFIEL
|
|
# Fixed spelling errors
|
|
#
|
|
# Revision 4 (DELIVERED)
|
|
# Created: 28-FEB-2005 19:37:20 TROJAN
|
|
# spr 6685
|
|
#
|
|
# Revision 3 (APPROVED)
|
|
# Created: 28-FEB-2005 19:04:55 TROJAN
|
|
# spr 6685
|
|
#
|
|
# Revision 2 (BUILD_RELEASE)
|
|
# Created: 07-DEC-2004 18:58:59 TROJAN
|
|
# spr 6452
|
|
#
|
|
# Revision 1 (APPROVED)
|
|
# Created: 30-SEP-2004 18:20:40 TROJAN
|
|
# rewrite of avnsetup
|
|
#
|
|
# Change Document History:
|
|
# 1:
|
|
# Change Document: GFS1-NHD_SPR_7318
|
|
# Action Date: 20-JUL-2007 10:05:35
|
|
# Relationship Type: In Response to
|
|
# Status: CLOSED
|
|
# Title: AvnFPS: Remove references to TWEB in configuration GUI
|
|
#
|
|
#
|
|
import logging, os
|
|
from Tkinter import *
|
|
import Pmw
|
|
from Balloon import Balloon
|
|
import Avn, AvnDialog, AvnParser, Busy
|
|
|
|
_Help = {
|
|
'title': 'Trigger Editor Help',
|
|
'content': """
|
|
This dialog is used to create a trigger file to get various text
|
|
products from the FXA text decoder that are important to the proper
|
|
functioning of AvnFPS monitoring capabilities.
|
|
|
|
The contents of latest trigger file is loaded when this dialog is
|
|
displayed. Use the"Update" button to update any missing entries from
|
|
AWIPS's afos2awips text file.
|
|
|
|
You can modify or add missing PILs in any of the text fields as needed.
|
|
Pressing the"Make" button will write the triggers to disk and update
|
|
the watchwarn table in the fxatext database.
|
|
|
|
The "Close" button quits this application.
|
|
|
|
The "Help" button displays this help dialog.
|
|
"""
|
|
}
|
|
|
|
_Logger = logging.getLogger(__name__)
|
|
|
|
RootDir = os.environ['ROOT_DIR']
|
|
TopDir = os.environ['TOP_DIR']
|
|
A2AFile = os.path.join(os.environ['FXA_HOME'], 'data', 'afos2awips.txt')
|
|
TriggerFile = os.path.join(RootDir, 'etc', 'triggerTemplate')
|
|
TriggerScript = os.path.join(RootDir, 'bin', 'avntrigger.sh')
|
|
SQLFile = os.path.join(TopDir, 'tmp', 'sqlcommand')
|
|
Database = 'fxatext'
|
|
Table = 'watchwarn'
|
|
|
|
SQL = os.path.join(os.environ['PSQL'], 'bin', 'psql')
|
|
SQLCommands = """DELETE FROM %s WHERE script LIKE '%%bin/avntrigger.sh%%';
|
|
\copy %s FROM '%s' USING DELIMITERS '|'
|
|
\q
|
|
""" % (Table, Table, TriggerFile)
|
|
|
|
##############################################################################
|
|
class Editor(AvnDialog.Dialog):
|
|
Items = ['taf', 'metar', 'ccfp']
|
|
NNN = {'metar': 'MTR', 'taf': 'TAF', 'ccfp': 'CFP'}
|
|
def __init__(self, parent, **kw):
|
|
AvnDialog.Dialog.__init__(self, parent, **kw)
|
|
|
|
self.title('Trigger Editor')
|
|
self.wm_iconname(newName='TEditor')
|
|
|
|
# from AvnDialog
|
|
self.createMessageBar(self.interior(), True)
|
|
|
|
self.__getAfosIds()
|
|
self.__getTriggerFile()
|
|
self.ids = AvnParser.getAllSiteIds()
|
|
# add CCFP entries
|
|
self.ids.update({'ccfp': ['01', '02', '03']})
|
|
numrows = max([len(self.ids.get(tag, [])) for tag in self.Items]) + 10
|
|
|
|
interior = self.interior()
|
|
frame = Frame(interior, relief='ridge', bd=2)
|
|
bbox = Pmw.ButtonBox(frame)
|
|
btn = bbox.add('Update', command=self.__update)
|
|
Balloon().bind(btn, 'Updates missing values using the afos2awips file')
|
|
btn = bbox.add('Make', command=self.__make)
|
|
Balloon().bind(btn,
|
|
'Creates trigger file and updates watchwarn table')
|
|
btn = bbox.add('Close', command=self.close)
|
|
Balloon().bind(btn, 'Closes this dialog')
|
|
btn = bbox.add('Help', command=Avn.curry(self.showHelp, _Help))
|
|
Balloon().bind(btn, 'Shows help')
|
|
bbox.alignbuttons()
|
|
bbox.grid(row=0, column=0, columnspan=len(self.Items), sticky='news')
|
|
self.item = dict.fromkeys(self.Items)
|
|
validator = {'validator': 'alphanumeric', 'min': 8, 'max': 9, \
|
|
'minstrict': 0}
|
|
for n, tag in enumerate(self.Items):
|
|
sf = Pmw.ScrolledFrame(frame,
|
|
labelpos='n',
|
|
label_text=tag.upper(),
|
|
horizflex='elastic',
|
|
)
|
|
self.item[tag] = []
|
|
|
|
for k in range(numrows):
|
|
entry = Pmw.EntryField(sf.interior(),
|
|
labelpos='w',
|
|
label_text='',
|
|
label_anchor='e',
|
|
label_width=6,
|
|
entry_width=9,
|
|
validate=validator,
|
|
)
|
|
entry.grid(row=k, column=0, sticky='news')
|
|
self.item[tag].append(entry)
|
|
w = entry.component('entry').winfo_reqwidth() + \
|
|
entry.component('label').winfo_reqwidth() + \
|
|
sf.component('vertscrollbar').winfo_reqwidth()
|
|
sf.configure(clipper_width=w)
|
|
sf.grid(row=1, column=n, sticky='news')
|
|
frame.pack(side='top', expand='yes', fill='x')
|
|
|
|
self.initialiseoptions(Editor)
|
|
self.setGeometry()
|
|
|
|
def __getAfosIds(self):
|
|
self.pils = {}
|
|
try:
|
|
for line in file(A2AFile):
|
|
try:
|
|
afos = line.split()[0]
|
|
except:
|
|
continue # blank line
|
|
nnn = afos[3:6]
|
|
if nnn not in ['TAF', 'TWB']:
|
|
# don't bother with METARs, will use TAFs CCC and XXX
|
|
continue
|
|
if afos[3:] == 'TWBSYN':
|
|
self.pils[afos[:6]] = afos
|
|
else:
|
|
self.pils[afos[3:]] = afos
|
|
if nnn == 'TAF':
|
|
# make MTR entry
|
|
tmp = afos[:3] + 'MTR' + afos[6:]
|
|
self.pils[tmp[3:]] = tmp
|
|
# add ccfp entries
|
|
for n in range(1,4):
|
|
self.pils['CFP%02d'%n] = 'MKCCFP%02d'%n
|
|
except:
|
|
msg = 'Cannot access %s file' % A2AFile
|
|
_Logger.exception(msg)
|
|
|
|
def __getTriggerFile(self):
|
|
self.triggers = []
|
|
try:
|
|
self.triggers = [line.split(None, 1)[0] \
|
|
for line in file(TriggerFile)]
|
|
except Exception:
|
|
msg = 'Cannot read %s' % TriggerFile
|
|
_Logger.exception(msg)
|
|
self.messagebar().message('systemerror', msg)
|
|
|
|
def __update(self):
|
|
for tag in self.Items:
|
|
for n, ident in enumerate(self.ids[tag]):
|
|
# only update empty fields
|
|
if self.item[tag][n].getvalue():
|
|
continue
|
|
key = self.NNN[tag] + ident[-3:]
|
|
t = self.pils.get(key, '')
|
|
self.item[tag][n].setvalue(t)
|
|
|
|
def __make(self):
|
|
try:
|
|
fh = file(TriggerFile, 'w')
|
|
except Exception:
|
|
msg = 'Cannot open %s for writing' % TriggerFile
|
|
_Logger.exception(msg)
|
|
self.messagebar().message('systemerror', msg)
|
|
return
|
|
for tag in self.Items:
|
|
for n, ident in enumerate(self.ids[tag]):
|
|
entry = self.item[tag][n]
|
|
if not entry.getvalue().strip():
|
|
continue
|
|
elif not entry.valid():
|
|
msg = 'Invalid %s entry for %s' % (tag.upper(), ident)
|
|
self.messagebar().message('usererror', msg)
|
|
break
|
|
pil = entry.getvalue().upper().strip()
|
|
print >> fh, pil, '|', TriggerScript
|
|
fh.close()
|
|
try:
|
|
self.__updateTable()
|
|
msg = 'Trigger file created successfully'
|
|
_Logger.info(msg)
|
|
self.messagebar().message('systemevent', msg)
|
|
except Exception, e:
|
|
msg = 'Failed to make triggers: %s' % e
|
|
self.messagebar().message('systemerror', msg)
|
|
_Logger.exception(msg)
|
|
|
|
def __updateTable(self):
|
|
file(SQLFile, 'w').write(SQLCommands)
|
|
cmd = '%s %s -f "%s"' % (SQL, Database, SQLFile)
|
|
if os.system(cmd):
|
|
raise Avn.AvnError('os.system() failed on %s' % cmd)
|
|
|
|
def listTriggers(self):
|
|
for tag in self.Items:
|
|
for n, ident in enumerate(self.ids.get(tag, [])):
|
|
try:
|
|
self.item[tag][n].configure(label_text=ident)
|
|
key = self.NNN[tag] + ident[-3:]
|
|
for t in self.triggers:
|
|
if t[3:] == key:
|
|
self.item[tag][n].setvalue(t)
|
|
break
|
|
except IndexError:
|
|
msg = 'Too many new triggers\n.Restart avnsetup'
|
|
Busy.showerror(msg, self.interior())
|
|
break
|