Source code for glideinwms.lib.glideinWMSVersion
#!/usr/bin/env python3
# SPDX-FileCopyrightText: 2009 Fermi Research Alliance, LLC
# SPDX-License-Identifier: Apache-2.0
"""Execute a ls command on a condor job working directory
Usage:
glideinWMSVersion.py <Path to glideinWMS distribution> [<Checksum file>]
"""
import os
import sys
# pylint: disable=E0611
# (hashlib methods are called dynamically)
from hashlib import md5
# pylint: enable=E0611
[docs]
class GlideinWMSDistro:
class __impl:
"""Implementation of the singleton interface"""
def __init__(self, chksumFile="checksum"):
self.versionIdentifier = "GLIDEINWMS_VERSION"
rpm_workdir = ""
if chksumFile.endswith(".factory"):
rpm_workdir = "/var/lib/gwms-factory/work-dir/"
elif chksumFile.endswith(".frontend"):
rpm_workdir = "/var/lib/gwms-frontend/vofrontend/"
else:
rpm_workdir = "UNKNOWN"
self.distroChksumFile = os.path.join(rpm_workdir, chksumFile)
try:
self.createVersionString()
except Exception:
self._version = "glideinWMS UNKNOWN"
def createVersionString(self):
ver = "UNKNOWN"
patch = ""
modifiedFiles = []
# Load the distro file hastable
distroFileHash = {}
with open(self.distroChksumFile) as distroChksumFd:
for line in distroChksumFd.readlines():
if not line.strip().startswith("#"):
file = os.path.normpath(((line.split(" "))[1]).strip())
hash = ((line.split(" "))[0]).strip()
distroFileHash[file] = hash
else:
idx = line.find(self.versionIdentifier)
if (idx >= 0) and (ver == "UNKNOWN"):
v = (line[idx + len(self.versionIdentifier) :]).strip()
if v != "":
ver = v
if ver != "UNKNOWN":
# Read the dir contents of distro and compute the md5sum
for file in list(distroFileHash.keys()):
fd = None
try:
# In the RPM, all files are in site-packages
rpm_dir = os.path.dirname(os.path.dirname(sys.modules[__name__].__file__))
fd = open(os.path.join(rpm_dir, os.path.dirname(file), os.path.basename(file)))
chksum = md5(fd.read()).hexdigest()
if chksum != distroFileHash[file]:
modifiedFiles.append(file)
patch = "PATCHED"
except Exception: # ignore missing files
pass
if fd:
fd.close()
# if len(modifiedFiles) > 0:
# print "Modified files: %s" % " ".join(modifiedFiles)
self._version = f"glideinWMS {ver} {patch}"
def version(self):
return self._version
# storage for the instance reference
__instance = None
def __init__(self, chksumFile="checksum"):
if GlideinWMSDistro.__instance is None:
GlideinWMSDistro.__instance = GlideinWMSDistro.__impl(chksumFile=chksumFile)
self.__dict__["_GlideinWMSDistro__instance"] = GlideinWMSDistro.__instance
def __getattr__(self, attr):
"""Delegate access to implementation"""
return getattr(self.__instance, attr)
def __setattr__(self, attr, value):
"""Delegate access to implementation"""
return setattr(self.__instance, attr, value)
[docs]
def version(chksumFile=None):
return GlideinWMSDistro(chksumFile=chksumFile).version()
# version
[docs]
def usage():
print("Usage: glideinWMSVersion.py <Path to glideinWMS distribution> [<Checksum file>]")
##############################################################################
# MAIN
##############################################################################
if __name__ == "__main__":
if len(sys.argv) == 1:
print("%s " % (GlideinWMSDistro().version()))
elif len(sys.argv) == 2:
print("%s " % (GlideinWMSDistro(chksumFile=sys.argv[1]).version()))
else:
usage()
sys.exit(1)