support/package-builder/GenerateOSSFiles.py
accc8120
 #!/usr/bin/env python3
 
 import os
 import json
 import sys
 import traceback
 from Logger import Logger
 from argparse import ArgumentParser
 from constants import constants
 from CommandUtils import CommandUtils
 from SpecData import SPECS
 
 
 
 def main():
     usage = "Usage: %prog [options] <package name>"
     parser = ArgumentParser(usage)
     parser.add_argument("-s", "--spec-path", dest="specPath", default="../../SPECS")
     parser.add_argument("-l", "--log-path", dest="logPath", default="../../stage/LOGS")
     parser.add_argument("-a", "--source-rpm-path", dest="sourceRpmPath", default="../../stage/SRPMS")
     parser.add_argument("-j", "--output-dir", dest="outputDirPath", default="../../stage/")
     parser.add_argument("-c", "--pullsources-config", dest="pullsourcesConfig", default="pullsources.conf")
     parser.add_argument("-f", "--pkg-blacklist-file", dest="pkgBlacklistFile", default=None)
     parser.add_argument("-p", "--generate-pkg-list", dest="generatePkgList", default=False, action="store_true")
     parser.add_argument("-y", "--generate-yaml-files", dest="generateYamlFiles", default=False, action="store_true")
 
     options = parser.parse_args()
     errorFlag = False
     cmdUtils = CommandUtils()
 
     try:
         if not os.path.isdir(options.logPath):
             cmdUtils.runCommandInShell("mkdir -p " + options.logPath)
         logger = Logger.getLogger(options.logPath + "/generateYamlFiles")
 
         if options.generateYamlFiles:
             if (options.pkgBlacklistFile is not None and
                     options.pkgBlacklistFile != "" and
                     not os.path.isfile(options.pkgBlacklistFile)):
                 logger.error("Given package blacklist file is not valid:" + options.pkgBlacklistFile)
                 errorFlag = True
 
         if not os.path.isdir(options.specPath):
             logger.error("Given Specs Path is not a directory:" + options.specPath)
             errorFlag = True
 
         if not os.path.isdir(options.sourceRpmPath):
             logger.error("Given SRPM Path is not a directory:" + options.sourceRpmPath)
             errorFlag = True
 
         if options.generateYamlFiles and not os.path.isfile(options.pullsourcesConfig):
             logger.error("Given Source config file is not a valid file:" + options.pullsourcesConfig)
             errorFlag = True
 
         if errorFlag:
             logger.error("Found some errors. Please fix input options and re-run it.")
             sys.exit(1)
 
         if options.generateYamlFiles:
             if not os.path.isdir(options.outputDirPath):
                 cmdUtils.runCommandInShell("mkdir -p "+options.outputDirPath)
 
         constants.setSpecPath(options.specPath)
         constants.setSourceRpmPath(options.sourceRpmPath)
         constants.setLogPath(options.logPath)
         constants.setPullSourcesConfig(options.pullsourcesConfig)
         constants.initialize()
 
         # parse SPECS folder
         SPECS()
 
         if options.generatePkgList:
             buildPackagesList(options.outputDirPath + "/packages_list.csv")
         elif options.generateYamlFiles:
             blackListPkgs = readBlackListPackages(options.pkgBlacklistFile)
             buildSourcesList(options.outputDirPath, blackListPkgs, logger)
             buildSRPMList(options.sourceRpmPath, options.outputDirPath, blackListPkgs, logger)
 
     except Exception as e:
         print("Caught Exception: "+str(e))
         traceback.print_exc()
         sys.exit(1)
 
     sys.exit(0)
 
 
 def buildPackagesList(csvFilename):
     csvFile = open(csvFilename, "w")
     csvFile.write("Package,Version,License,URL,Sources,Patches\n")
     listPackages = SPECS.getData().getListPackages()
     listPackages.sort()
     for package in listPackages:
         name = package
         version = SPECS.getData().getVersion(package)
         license = SPECS.getData().getLicense(package)
         listPatches = SPECS.getData().getPatches(package)
         url = SPECS.getData().getURL(package)
         listSourceNames = SPECS.getData().getSources(package)
         sources = ""
         patches = ""
         if listPatches is not None:
             patches = " ".join(listPatches)
         if listSourceNames is not None:
             sources = " ".join(listSourceNames)
         csvFile.write(name + "," + version + "," + license + "," + url + "," + sources + "," + patches + "\n")
     csvFile.close()
 
 
 def readBlackListPackages(pkgBlackListFile):
     blackListPkgs = []
     if pkgBlackListFile is not None and pkgBlackListFile != "":
         with open(pkgBlackListFile) as jsonFile:
             config = json.load(jsonFile)
             if 'packages' in config:
                 blackListPkgs = config['packages']
     return blackListPkgs
 
 
 def buildSourcesList(yamlDir, blackListPkgs, logger, singleFile=True):
     cmdUtils = CommandUtils()
     yamlSourceDir = os.path.join(yamlDir, "yaml_sources")
     if not os.path.isdir(yamlSourceDir):
         cmdUtils.runCommandInShell("mkdir -p " + yamlSourceDir)
     if singleFile:
         yamlFile = open(yamlSourceDir + "/sources_list.yaml", "w")
     listPackages = SPECS.getData().getListPackages()
     listPackages.sort()
     import PullSources
     for package in listPackages:
         if package in blackListPkgs:
             continue
         ossname = package
         ossversion = SPECS.getData().getVersion(package)
         modified = False
         listPatches = SPECS.getData().getPatches(package)
         if listPatches is not None and len(listPatches) > 0:
             modified = True
         url = SPECS.getData().getSourceURL(package)
         if url is None:
             url = SPECS.getData().getURL(package)
 
         sourceName = None
         listSourceNames = SPECS.getData().getSources(package)
         if len(listSourceNames) > 0:
             sourceName = listSourceNames[0]
             sha1 = SPECS.getData().getSHA1(package, sourceName)
             if sha1 is not None:
                 PullSources.get(sourceName, sha1, yamlSourceDir,
                                 constants.pullsourcesConfig, logger)
 
         if not singleFile:
             yamlFile = open(yamlSourceDir + "/" + ossname + "-" + ossversion + ".yaml", "w")
         yamlFile.write("vmwsource:" + ossname + ":" + ossversion + ":\n")
         yamlFile.write("  repository: VMWsource\n")
         yamlFile.write("  name: '" + ossname + "'\n")
         yamlFile.write("  version: '" + ossversion + "'\n")
         yamlFile.write("  url: " + str(url) + "\n")
         yamlFile.write("  license: UNKNOWN\n")
         if sourceName is not None:
             yamlFile.write("  vmwsource-distribution: " + str(sourceName) + "\n")
         if modified:
             yamlFile.write("  modified: true\n")
         yamlFile.write("\n")
         if not singleFile:
             yamlFile.close()
 
     if singleFile:
         yamlFile.close()
     logger.info("Generated source yaml files for all packages")
 
 
 def buildSRPMList(srpmPath, yamlDir, blackListPkgs, logger, singleFile=True):
     cmdUtils = CommandUtils()
     yamlSrpmDir = os.path.join(yamlDir, "yaml_srpms")
     if not os.path.isdir(yamlSrpmDir):
         cmdUtils.runCommandInShell("mkdir -p " + yamlSrpmDir)
     if singleFile:
         yamlFile = open(yamlSrpmDir + "/srpm_list.yaml", "w")
     listPackages = SPECS.getData().getListPackages()
     listPackages.sort()
     for package in listPackages:
         if package in blackListPkgs:
             continue
         ossname = package
         ossversion = SPECS.getData().getVersion(package)
         ossrelease = SPECS.getData().getRelease(package)
 
         listFoundSRPMFiles = cmdUtils.findFile(ossname + "-" + ossversion + "-" + ossrelease + ".src.rpm",
                                                srpmPath)
         srpmName = None
         if len(listFoundSRPMFiles) == 1:
             srpmFullPath = listFoundSRPMFiles[0]
             srpmName = os.path.basename(srpmFullPath)
             cpcmd = "cp " + srpmFullPath + " " + yamlSrpmDir + "/"
             returnVal = cmdUtils.runCommandInShell(cpcmd)
             if not returnVal:
                 logger.error("Copy SRPM File is failed for package:" + ossname)
         else:
             logger.error("SRPM file is not found:" + ossname)
 
         if not singleFile:
             yamlFile = open(yamlSrpmDir + "/" + ossname + "-" + ossversion + "-" + ossrelease + ".yaml", "w")
 
         yamlFile.write("baseos:" + ossname + ":" + ossversion + "-" + ossrelease + ":\n")
         yamlFile.write("  repository: BaseOS\n")
         yamlFile.write("  name: '" + ossname + "'\n")
         yamlFile.write("  version: '" + ossversion + "-" + ossrelease + "'\n")
         yamlFile.write("  baseos-style: rpm\n")
         yamlFile.write("  baseos-source: '" + str(srpmName) + "'\n")
         yamlFile.write("  baseos-osname: 'photon'\n")
         yamlFile.write("\n")
         if not singleFile:
             yamlFile.close()
 
     if singleFile:
         yamlFile.close()
     logger.info("Generated SRPM yaml files for all packages")
 
 
 if __name__ == "__main__":
     main()