checkMetadata.py
174 lines
| 5.7 KiB
| text/x-python
|
PythonLexer
r0 | #!PYTHONEXE | |||
"""checkMetadata.py is a script run by the central Madrigal admin to ensure source control and distribution | ||||
metadata files siteTab.txt, instTab.txt, and instType.txt are in sync. | ||||
$Id: checkMetadata.py 7225 2020-09-11 12:47:04Z brideout $ | ||||
""" | ||||
import sys | ||||
import os | ||||
import time | ||||
import traceback | ||||
import distutils.version | ||||
# catch any exception, and write an appropriate message admin | ||||
try: | ||||
# check if pythonlibpath env variable exists | ||||
# written 'PYTHON' + 'LIBPATH' to stop automatic replacement during setup | ||||
temp = os.environ.get('PYTHON' + 'LIBPATH') | ||||
if temp != None: | ||||
sys.path.append(temp) | ||||
# append path madroot/lib (needed only if python not installed by setup) | ||||
sys.path.append('MADROOT/lib/python') | ||||
# prepare to handle MadrigalError | ||||
from madrigal.admin import * | ||||
except ImportError: | ||||
# Fatal error - madpy library not found | ||||
print("Unable to import the madrigal python library - please alert the sys admin!") | ||||
sys.exit(0) | ||||
# try to run script, and report all errors to Madrigal sys admin | ||||
try: | ||||
import madrigal.metadata | ||||
import madrigal.openmadrigal | ||||
# messStr is emailed to madrigal admin if not empty | ||||
messStr = '' | ||||
# create MadrigalDB obj | ||||
madDBObj = madrigal.metadata.MadrigalDB() | ||||
# if madroot not set, set it now | ||||
if os.environ.get('MAD' + 'ROOT') == None: | ||||
os.environ['MAD' + 'ROOT'] = madDBObj.getMadroot() | ||||
# create MadrigalSite object | ||||
madSite = madrigal.metadata.MadrigalSite(madDBObj) | ||||
# create OpenMadrigal object | ||||
openMad = madrigal.openmadrigal.OpenMadrigal(madDBObj) | ||||
siteList = madSite.getSiteList() | ||||
# first examine file siteTab.txt | ||||
cvsSiteFile = openMad.getLatestCvsVersion('madroot/metadata/siteTab.txt') | ||||
if cvsSiteFile == None: | ||||
messStr += 'problem with cvs and siteTab.txt\n<br>\n' | ||||
cvsSiteFile = '' | ||||
cvsSiteFile3 = openMad.getLatestCvsVersion('madroot/metadata3/siteTab.txt') | ||||
if cvsSiteFile3 == None: | ||||
messStr += 'problem with cvs and mad3 siteTab.txt\n<br>\n' | ||||
cvsSiteFile3 = '' | ||||
# diff against every version from siteList | ||||
for site in siteList: | ||||
version = madSite.getSiteVersion(site[0]) | ||||
if distutils.version.LooseVersion(version) >= distutils.version.LooseVersion('3.0'): | ||||
thisVersion = 3 | ||||
else: | ||||
thisVersion = 2 | ||||
siteFile = openMad.getSiteMetadata(site[0]) | ||||
if siteFile == None: | ||||
messStr += 'File siteTab.txt not retrieved from site ' + site[1] + '\n<br>\n' | ||||
else: | ||||
if thisVersion == 2: | ||||
if siteFile.strip() != cvsSiteFile.strip(): | ||||
messStr += 'File siteTab.txt differs from source control at site ' + site[1] + '\n<br>\n' | ||||
else: | ||||
if siteFile.strip() != cvsSiteFile3.strip(): | ||||
messStr += 'File mad3 siteTab.txt differs from source control at site ' + site[1] + '\n<br>\n' | ||||
# next examine file instTab.txt | ||||
cvsTypeFile = openMad.getLatestCvsVersion('madroot/metadata/instTab.txt') | ||||
if cvsTypeFile == None: | ||||
messStr += 'problem with cvs and instTab.txt\n<br>\n' | ||||
# diff against every version from siteList | ||||
for site in siteList: | ||||
typeFile = openMad.getInstMetadata(site[0]) | ||||
if typeFile == None: | ||||
messStr += 'File instTab.txt not retrieved from site ' + site[1] + '\n<br>\n' | ||||
else: | ||||
if typeFile.strip() != cvsTypeFile.strip(): | ||||
messStr += 'File instTab.txt differs from source control at site ' + site[1] + '\n<br>\n' | ||||
# next examine file instTypeTab.txt | ||||
cvsTypeFile = openMad.getLatestCvsVersion('madroot/metadata/instType.txt') | ||||
if cvsTypeFile == None: | ||||
messStr += 'problem with cvs and instType.txt\n<br>\n' | ||||
# diff against every version from siteList | ||||
for site in siteList: | ||||
typeFile = openMad.getInstTypeMetadata(site[0]) | ||||
if typeFile == None: | ||||
messStr += 'File instType.txt not retrieved from site ' + site[1] + '\n<br>\n' | ||||
else: | ||||
if typeFile.strip() != cvsTypeFile.strip(): | ||||
messStr += 'File instType.txt differs from source control at site ' + site[1] + '\n<br>\n' | ||||
# if messStr not empty, send message to admin | ||||
if len(messStr) > 0: | ||||
# create MadrigalNotify object | ||||
notifyObj = MadrigalNotify(madDBObj) | ||||
notifyObj.sendAlert(messStr, 'Problem detected by checkMetadata') | ||||
except MadrigalError as e: | ||||
# handle a MadrigalError | ||||
errStr = '<h1> Error occurred in checkMetadata.py</h1>' | ||||
errStr = errStr + e.getExceptionHtml() | ||||
err = traceback.format_exception(sys.exc_info()[0], | ||||
sys.exc_info()[1], | ||||
sys.exc_info()[2]) | ||||
for errItem in err: | ||||
errStr = errStr + '<br>\n' + str(errItem) | ||||
errStr = errStr + '\nError occurred at ' + str(time.asctime(time.localtime())) + '<br>\n' | ||||
admin = MadrigalNotify() | ||||
admin.sendAlert('<html>\n' + errStr + '</html>', | ||||
'Error running checkMetadata.py' ) | ||||
except: | ||||
# handle a normal error | ||||
# if a normal SystemExit, simply terminate | ||||
if str(sys.exc_info()[0]).find('exceptions.SystemExit') != -1: | ||||
sys.exit(0) | ||||
errStr = '<h1> Error occurred in running checkMetadata.py.</h1>' | ||||
err = traceback.format_exception(sys.exc_info()[0], | ||||
sys.exc_info()[1], | ||||
sys.exc_info()[2]) | ||||
for errItem in err: | ||||
errStr = errStr + '<br>\n' + str(errItem) | ||||
errStr = errStr + '\nError occurred at ' + str(time.asctime(time.localtime())) + '<br>\n' | ||||
admin = MadrigalNotify() | ||||
admin.sendAlert('<html>\n' + errStr + '</html>', | ||||
'Error running checkMetadata.py') | ||||
# end script | ||||