It includes:
- merge package-builder's and SpecDeps's spec parser to avoid code
duplication
- spec parser: support for Requires(post|pre|postun|preun)
- spec parser: support for conditional requires, such as
"Requires: (aaa <= 3.1 or bbb) ccc (ddd or fff > 4.5.6)"
- add "file to owner package" mapping. "/sbin/useradd -> shadow" to
install proper build requires
- create SPECS singleton to store parsed spec data
- use constants.py only to store constants
Change-Id: I9fbb9ccdb9fdfef932d4097983e02eb41bb73987
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/3819
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Vinay Kulkarni <kulkarniv@vmware.com>
Reviewed-by: Xiaolin Li <xiaolinl@vmware.com>
| 1 | 1 |
deleted file mode 100644 |
| ... | ... |
@@ -1,14 +0,0 @@ |
| 1 |
-import commands |
|
| 2 |
- |
|
| 3 |
-class RepoQueryDependency(object): |
|
| 4 |
- def __init__(self, repoFile): |
|
| 5 |
- self.repo_file = repoFile |
|
| 6 |
- def getRequiresList(self,pkg): |
|
| 7 |
- cmd = "repoquery -c "+self.repo_file+" -R -q "+pkg+" | xargs repoquery -c "+self.repo_file+" --whatprovides -q | sed 's/-[0-9]/ /g' | cut -f 1 -d ' ' | sort | uniq " |
|
| 8 |
- status,output = commands.getstatusoutput(cmd) |
|
| 9 |
- if status == 0: |
|
| 10 |
- outList = output.split('\n')
|
|
| 11 |
- if "" in outList: outList.remove("")
|
|
| 12 |
- if "Options:" in outList: outList.remove("Options:")
|
|
| 13 |
- if "Usage:" in outList: outList.remove("Usage:")
|
|
| 14 |
- return outList |
| 15 | 1 |
deleted file mode 100644 |
| ... | ... |
@@ -1,280 +0,0 @@ |
| 1 |
-from SpecUtils import Specutils |
|
| 2 |
-from StringUtils import StringUtils |
|
| 3 |
-import operator |
|
| 4 |
-import os |
|
| 5 |
-import collections |
|
| 6 |
-import Queue |
|
| 7 |
-import json |
|
| 8 |
- |
|
| 9 |
-class SerializableSpecObject(object): |
|
| 10 |
- def __init__(self): |
|
| 11 |
- self.listPackages=[] |
|
| 12 |
- self.name="" |
|
| 13 |
- self.version="" |
|
| 14 |
- self.release="" |
|
| 15 |
- self.buildRequirePackages=[] |
|
| 16 |
- self.installRequiresAllPackages=[] |
|
| 17 |
- self.installRequiresPackages={}
|
|
| 18 |
- self.specFile="" |
|
| 19 |
- self.listSources=[] |
|
| 20 |
- self.listPatches=[] |
|
| 21 |
- self.securityHardening="" |
|
| 22 |
- |
|
| 23 |
-class SerializedSpecObjects(object): |
|
| 24 |
- |
|
| 25 |
- def __init__(self, inputDataDir, stageDir): |
|
| 26 |
- self.mapSerializableSpecObjects={}
|
|
| 27 |
- self.mapPackageToSpec={}
|
|
| 28 |
- self.jsonFilesOutPath = stageDir + "/common/data/" |
|
| 29 |
- self.inputDataDir = inputDataDir |
|
| 30 |
- |
|
| 31 |
- def findTotalRequires(self, allDeps, depQue, parent, displayOption): |
|
| 32 |
- while not depQue.empty(): |
|
| 33 |
- specPkg = depQue.get() |
|
| 34 |
- specName = self.getSpecName(specPkg) |
|
| 35 |
- if specName is None: |
|
| 36 |
- print specPkg + " is missing" |
|
| 37 |
- specObj = self.mapSerializableSpecObjects[specName] |
|
| 38 |
- for depPkg in specObj.installRequiresPackages[specPkg]: |
|
| 39 |
- if True == allDeps.has_key(depPkg): |
|
| 40 |
- if(allDeps[depPkg] < allDeps[specPkg] + 1): |
|
| 41 |
- allDeps[depPkg] = allDeps[specPkg] + 1 |
|
| 42 |
- parent[depPkg] = specPkg |
|
| 43 |
- self.updateLevels(allDeps, depPkg, parent, allDeps[depPkg]) |
|
| 44 |
- else: |
|
| 45 |
- allDeps[depPkg] = allDeps[specPkg] + 1 |
|
| 46 |
- parent[depPkg] = specPkg |
|
| 47 |
- depQue.put(depPkg) |
|
| 48 |
- |
|
| 49 |
- def findTotalWhoNeedsToBuild(self, depQue, whoBuildDeps, whoBuildDepSet, displayOption): |
|
| 50 |
- while not depQue.empty(): |
|
| 51 |
- specPkg = depQue.get() |
|
| 52 |
- specName = self.getSpecName(specPkg) |
|
| 53 |
- spec=Specutils(self.getSpecFile(specPkg)) |
|
| 54 |
- RPMName=spec.getRPMName(specPkg) |
|
| 55 |
- debuginfoRPMName=spec.getDebuginfoRPMName(specPkg) |
|
| 56 |
- whoBuildDepSet.add(RPMName) |
|
| 57 |
- whoBuildDepSet.add(debuginfoRPMName) |
|
| 58 |
- if specName is None: |
|
| 59 |
- print specPkg + " is missing" |
|
| 60 |
- if not whoBuildDeps.has_key(specPkg): |
|
| 61 |
- continue |
|
| 62 |
- for depPkg in whoBuildDeps[specPkg]: |
|
| 63 |
- depQue.put(depPkg) |
|
| 64 |
- |
|
| 65 |
- def printTree(self, allDeps, children, curParent , depth): |
|
| 66 |
- if (children.has_key(curParent)): |
|
| 67 |
- for child in children[curParent]: |
|
| 68 |
- print "\t" * depth, child |
|
| 69 |
- self.printTree(allDeps, children, child, depth+1) |
|
| 70 |
- |
|
| 71 |
- def get_all_package_names(self, jsonFilePath): |
|
| 72 |
- base_path = os.path.dirname(jsonFilePath) |
|
| 73 |
- jsonData = open(jsonFilePath) |
|
| 74 |
- option_list_json = json.load(jsonData) |
|
| 75 |
- jsonData.close() |
|
| 76 |
- packages = option_list_json["packages"] |
|
| 77 |
- return packages |
|
| 78 |
- |
|
| 79 |
- def updateLevels(self, allDeps, inPkg, parent, level): |
|
| 80 |
- specName = self.getSpecName(inPkg) |
|
| 81 |
- specObj = self.mapSerializableSpecObjects[specName] |
|
| 82 |
- for depPkg in specObj.installRequiresPackages[inPkg]: |
|
| 83 |
- if (allDeps.has_key(depPkg) and allDeps[depPkg] < level + 1): |
|
| 84 |
- allDeps[depPkg] = level + 1 |
|
| 85 |
- parent[depPkg] = inPkg |
|
| 86 |
- self.updateLevels(allDeps, depPkg, parent, allDeps[depPkg]) |
|
| 87 |
- |
|
| 88 |
- def readSpecsAndConvertToSerializableObjects(self, specFilesPath, inputType, inputValue, displayOption): |
|
| 89 |
- children = {}
|
|
| 90 |
- listSpecFiles=[] |
|
| 91 |
- whoNeedsList=[] |
|
| 92 |
- whoBuildDepSet= set() |
|
| 93 |
- independentRPMS=[] # list of all RPMS not built from photon and that must be blindly copied. |
|
| 94 |
- whoBuildDeps = {}
|
|
| 95 |
- allDeps={}
|
|
| 96 |
- parent={}
|
|
| 97 |
- depQue = Queue.Queue() |
|
| 98 |
- packageFound = False |
|
| 99 |
- self.getListSpecFiles(listSpecFiles,specFilesPath) |
|
| 100 |
- for specFile in listSpecFiles: |
|
| 101 |
- spec=Specutils(specFile) |
|
| 102 |
- specName=spec.getBasePackageName() |
|
| 103 |
- specObj=SerializableSpecObject() |
|
| 104 |
- specObj.name=specName |
|
| 105 |
- specObj.buildRequirePackages=spec.getBuildRequiresAllPackages() |
|
| 106 |
- specObj.installRequiresAllPackages=spec.getRequiresAllPackages() |
|
| 107 |
- specObj.listPackages=spec.getPackageNames() |
|
| 108 |
- specObj.specFile=specFile |
|
| 109 |
- specObj.version=spec.getVersion() |
|
| 110 |
- specObj.release=spec.getRelease() |
|
| 111 |
- specObj.listSources=spec.getSourceNames() |
|
| 112 |
- specObj.listPatches=spec.getPatchNames() |
|
| 113 |
- specObj.securityHardening=spec.getSecurityHardeningOption() |
|
| 114 |
- for specPkg in specObj.listPackages: |
|
| 115 |
- specObj.installRequiresPackages[specPkg]=spec.getRequires(specPkg) |
|
| 116 |
- if (inputType == "pkg" and inputValue == specPkg): # all the first level dependencies to a dictionary and queue |
|
| 117 |
- packageFound = True |
|
| 118 |
- for depPkg in specObj.installRequiresPackages[specPkg]: |
|
| 119 |
- if False == allDeps.has_key(depPkg): |
|
| 120 |
- allDeps[depPkg] = 0 |
|
| 121 |
- parent[depPkg] = "" |
|
| 122 |
- depQue.put(depPkg) |
|
| 123 |
- elif (inputType == "who-needs" and (inputValue in specObj.installRequiresPackages[specPkg])): |
|
| 124 |
- whoNeedsList.append(specPkg) |
|
| 125 |
- elif (inputType == "who-needs-build"): |
|
| 126 |
- for bdrq in specObj.buildRequirePackages: |
|
| 127 |
- if (whoBuildDeps.has_key(bdrq)): |
|
| 128 |
- whoBuildDeps[bdrq].add(specPkg) |
|
| 129 |
- else: |
|
| 130 |
- whoBuildDeps[bdrq] = set() |
|
| 131 |
- whoBuildDeps[bdrq].add(specPkg) |
|
| 132 |
- if(inputValue == specPkg): |
|
| 133 |
- packageFound = True |
|
| 134 |
- for depPkg in specObj.listPackages: |
|
| 135 |
- depQue.put(depPkg) |
|
| 136 |
- |
|
| 137 |
- self.mapPackageToSpec[specPkg]=specName |
|
| 138 |
- self.mapSerializableSpecObjects[specName]=specObj |
|
| 139 |
- |
|
| 140 |
- # Generate dependencies for individual packages |
|
| 141 |
- if (inputType == "pkg"): |
|
| 142 |
- if (packageFound == True): |
|
| 143 |
- self.findTotalRequires(allDeps, depQue, parent, displayOption) |
|
| 144 |
- else: |
|
| 145 |
- print "No spec file builds a package named",inputValue |
|
| 146 |
- return |
|
| 147 |
- |
|
| 148 |
- # Generate dependencies for all packages in the given JSON input file |
|
| 149 |
- elif (inputType == "json"): |
|
| 150 |
- filePath = self.inputDataDir +"/"+ inputValue |
|
| 151 |
- data = self.get_all_package_names(filePath) |
|
| 152 |
- for pkg in data: |
|
| 153 |
- if False == allDeps.has_key(pkg): |
|
| 154 |
- spName = self.getSpecName(pkg) |
|
| 155 |
- if(spName != None): |
|
| 156 |
- allDeps[pkg] = 0 |
|
| 157 |
- parent[pkg] = "" |
|
| 158 |
- depQue.put(pkg) |
|
| 159 |
- self.findTotalRequires(allDeps, depQue, parent, displayOption) |
|
| 160 |
- else: |
|
| 161 |
- independentRPMS.append(pkg); |
|
| 162 |
- |
|
| 163 |
- #Generating the list of packages that requires the given input package at install time |
|
| 164 |
- elif (inputType == "who-needs"): |
|
| 165 |
- print whoNeedsList |
|
| 166 |
- return |
|
| 167 |
- |
|
| 168 |
- #Generating the list of packages that the modified package will affect at build time |
|
| 169 |
- elif (inputType == "who-needs-build"): |
|
| 170 |
- if (packageFound == True): |
|
| 171 |
- self.findTotalWhoNeedsToBuild(depQue, whoBuildDeps, whoBuildDepSet, displayOption) |
|
| 172 |
- print whoBuildDepSet |
|
| 173 |
- else: |
|
| 174 |
- print "No spec file builds a package named", inputValue |
|
| 175 |
- return |
|
| 176 |
- |
|
| 177 |
- # construct the sorted list of all packages (sorted by dependency) |
|
| 178 |
- sortedList = [] |
|
| 179 |
- for elem in sorted(allDeps.items(), key=operator.itemgetter(1), reverse=True): |
|
| 180 |
- sortedList.append(elem[0]) |
|
| 181 |
- sortedList.extend(independentRPMS) |
|
| 182 |
- |
|
| 183 |
- # construct all children nodes |
|
| 184 |
- if (displayOption == "tree"): |
|
| 185 |
- for k, v in parent.iteritems(): |
|
| 186 |
- children.setdefault(v, []).append(k) |
|
| 187 |
- if(inputType == "json"): |
|
| 188 |
- print "Dependency Mappings for", inputValue, ":", "\n----------------------------------------------------",children |
|
| 189 |
- print "----------------------------------------------------" |
|
| 190 |
- if (children.has_key("")):
|
|
| 191 |
- for child in children[""]: |
|
| 192 |
- print child |
|
| 193 |
- self.printTree(allDeps, children, child, 1) |
|
| 194 |
- for pkg in independentRPMS: |
|
| 195 |
- print pkg |
|
| 196 |
- print "******************",len(sortedList), "packages in total ******************" |
|
| 197 |
- else: |
|
| 198 |
- if (inputType == "pkg" and len(children) > 0): |
|
| 199 |
- print "cyclic dependency detected, mappings: \n",children |
|
| 200 |
- |
|
| 201 |
- # To display a flat list of all packages |
|
| 202 |
- elif(displayOption == "list"): |
|
| 203 |
- print sortedList |
|
| 204 |
- |
|
| 205 |
- # To generate a new JSON file based on given input json file |
|
| 206 |
- elif(displayOption == "json" and inputType == "json"): |
|
| 207 |
- d = {}
|
|
| 208 |
- d['packages'] = sortedList |
|
| 209 |
- outFilePath = self.jsonFilesOutPath + inputValue |
|
| 210 |
- with open(outFilePath, 'wb') as outfile: |
|
| 211 |
- json.dump(d, outfile) |
|
| 212 |
- return sortedList |
|
| 213 |
- |
|
| 214 |
- def getListSpecFiles(self,listSpecFiles,path): |
|
| 215 |
- for dirEntry in os.listdir(path): |
|
| 216 |
- dirEntryPath = os.path.join(path, dirEntry) |
|
| 217 |
- if os.path.isfile(dirEntryPath) and dirEntryPath.endswith(".spec"):
|
|
| 218 |
- listSpecFiles.append(dirEntryPath) |
|
| 219 |
- elif os.path.isdir(dirEntryPath): |
|
| 220 |
- self.getListSpecFiles(listSpecFiles,dirEntryPath) |
|
| 221 |
- |
|
| 222 |
- def getBuildRequiresForPackage(self, package): |
|
| 223 |
- specName=self.getSpecName(package) |
|
| 224 |
- return self.mapSerializableSpecObjects[specName].buildRequirePackages |
|
| 225 |
- |
|
| 226 |
- def getRequiresForPackage(self, package): |
|
| 227 |
- specName=self.getSpecName(package) |
|
| 228 |
- if self.mapSerializableSpecObjects[specName].installRequiresPackages.has_key(package): |
|
| 229 |
- return self.mapSerializableSpecObjects[specName].installRequiresPackages[package] |
|
| 230 |
- return None |
|
| 231 |
- |
|
| 232 |
- def getRelease(self, package): |
|
| 233 |
- specName=self.getSpecName(package) |
|
| 234 |
- return self.mapSerializableSpecObjects[specName].release |
|
| 235 |
- |
|
| 236 |
- def getVersion(self, package): |
|
| 237 |
- specName=self.getSpecName(package) |
|
| 238 |
- return self.mapSerializableSpecObjects[specName].version |
|
| 239 |
- |
|
| 240 |
- def getSpecFile(self, package): |
|
| 241 |
- specName=self.getSpecName(package) |
|
| 242 |
- return self.mapSerializableSpecObjects[specName].specFile |
|
| 243 |
- |
|
| 244 |
- def getPatches(self, package): |
|
| 245 |
- specName=self.getSpecName(package) |
|
| 246 |
- return self.mapSerializableSpecObjects[specName].listPatches |
|
| 247 |
- |
|
| 248 |
- def getSources(self, package): |
|
| 249 |
- specName=self.getSpecName(package) |
|
| 250 |
- return self.mapSerializableSpecObjects[specName].listSources |
|
| 251 |
- |
|
| 252 |
- def getPackages(self, package): |
|
| 253 |
- specName=self.getSpecName(package) |
|
| 254 |
- return self.mapSerializableSpecObjects[specName].listPackages |
|
| 255 |
- |
|
| 256 |
- def getSpecName(self,package): |
|
| 257 |
- if self.mapPackageToSpec.has_key(package): |
|
| 258 |
- specName=self.mapPackageToSpec[package] |
|
| 259 |
- if self.mapSerializableSpecObjects.has_key(specName): |
|
| 260 |
- return specName |
|
| 261 |
- else: |
|
| 262 |
- print "SpecDeps: Could not able to find " + package + " package from specs" |
|
| 263 |
- raise Exception("Invalid package:" + package)
|
|
| 264 |
- else: |
|
| 265 |
- return None |
|
| 266 |
- |
|
| 267 |
- def isRPMPackage(self,package): |
|
| 268 |
- if self.mapPackageToSpec.has_key(package): |
|
| 269 |
- specName=self.mapPackageToSpec[package] |
|
| 270 |
- if self.mapSerializableSpecObjects.has_key(specName): |
|
| 271 |
- return True |
|
| 272 |
- return False |
|
| 273 |
- |
|
| 274 |
- def getSecurityHardeningOption(self, package): |
|
| 275 |
- specName=self.getSpecName(package) |
|
| 276 |
- return self.mapSerializableSpecObjects[specName].securityHardening |
|
| 277 |
- |
|
| 278 |
- def getSpecDetails(self, name): |
|
| 279 |
- print self.mapSerializableSpecObjects[name].installRequiresAllPackages |
|
| 280 |
- |
| 281 | 1 |
deleted file mode 100755 |
| ... | ... |
@@ -1,57 +0,0 @@ |
| 1 |
-#! /usr/bin/python2 |
|
| 2 |
-# |
|
| 3 |
-# Copyright (C) 2015 vmware inc. |
|
| 4 |
-# |
|
| 5 |
-# Author: Harish Udaiya Kumar <hudaiyakumar@vmware.com> |
|
| 6 |
-from SpecUtils import Specutils |
|
| 7 |
-from SpecData import SerializableSpecObject |
|
| 8 |
-from SpecData import SerializedSpecObjects |
|
| 9 |
-import sys |
|
| 10 |
-import os |
|
| 11 |
-from optparse import OptionParser |
|
| 12 |
-from jsonwrapper import JsonWrapper |
|
| 13 |
- |
|
| 14 |
-DEFAULT_INPUT_TYPE = "pkg" |
|
| 15 |
-DEFAULT_DISPLAY_OPTION = "tree" |
|
| 16 |
-SPEC_FILE_DIR = "../../SPECS" |
|
| 17 |
-LOG_FILE_DIR = "../../stage/LOGS" |
|
| 18 |
- |
|
| 19 |
- |
|
| 20 |
-def main(): |
|
| 21 |
- usage = os.path.basename(__file__) + "--input-type=[json/pkg/who-needs/who-needs-build] --pkg=[pkg_name] --file=<JSON_FILE_NAME> --disp=[tree/list/json]" |
|
| 22 |
- parser = OptionParser(usage) |
|
| 23 |
- parser.add_option("-i", "--input-type", dest="input_type", default=DEFAULT_INPUT_TYPE)
|
|
| 24 |
- parser.add_option("-p", "--pkg", dest="pkg")
|
|
| 25 |
- parser.add_option("-f", "--file", dest="json_file", default="packages_minimal.json")
|
|
| 26 |
- parser.add_option("-d", "--disp", dest="display_option", default=DEFAULT_DISPLAY_OPTION)
|
|
| 27 |
- parser.add_option("-s", "--spec-dir", dest="spec_dir", default=SPEC_FILE_DIR)
|
|
| 28 |
- parser.add_option("-t", "--stage-dir", dest="stage_dir", default="../../stage")
|
|
| 29 |
- parser.add_option("-a", "--input-data-dir", dest="input_data_dir", default="../../common/data/")
|
|
| 30 |
- (options, args) = parser.parse_args() |
|
| 31 |
- |
|
| 32 |
- if(False == options.input_data_dir.endswith('/')):
|
|
| 33 |
- options.input_data_dir += '/' |
|
| 34 |
- |
|
| 35 |
- specDeps = SerializedSpecObjects(options.input_data_dir, options.stage_dir) |
|
| 36 |
- displayOption = options.display_option |
|
| 37 |
- abs_path = os.path.abspath(__file__) |
|
| 38 |
- dir_name = os.path.dirname(abs_path) |
|
| 39 |
- os.chdir(dir_name) |
|
| 40 |
- |
|
| 41 |
- # To display/print package dependencies on console |
|
| 42 |
- if(options.input_type == "pkg" or options.input_type == "who-needs" or options.input_type == "who-needs-build"): |
|
| 43 |
- targetName = options.pkg |
|
| 44 |
- specDeps.readSpecsAndConvertToSerializableObjects(options.spec_dir, options.input_type, targetName, displayOption) |
|
| 45 |
- elif(options.input_type == "json"):# Generate the expanded package dependencies json file based on package_list_file |
|
| 46 |
- json_wrapper_option_list = JsonWrapper(options.json_file) |
|
| 47 |
- option_list_json = json_wrapper_option_list.read() |
|
| 48 |
- options_sorted = option_list_json.items() |
|
| 49 |
- for install_option in options_sorted: |
|
| 50 |
- if displayOption == "tree" and install_option[1]["title"] == "ISO Packages": |
|
| 51 |
- continue |
|
| 52 |
- specDeps.readSpecsAndConvertToSerializableObjects(options.spec_dir, options.input_type, install_option[1]["file"], displayOption) |
|
| 53 |
- |
|
| 54 |
- sys.exit(0) |
|
| 55 |
- |
|
| 56 |
-if __name__=="__main__": |
|
| 57 |
- main() |
| 58 | 1 |
deleted file mode 100644 |
| ... | ... |
@@ -1,322 +0,0 @@ |
| 1 |
-import re |
|
| 2 |
-from StringUtils import StringUtils |
|
| 3 |
-from SpecStructures import * |
|
| 4 |
- |
|
| 5 |
-class SpecParser(object): |
|
| 6 |
- def __init__(self): |
|
| 7 |
- self.cleanMacro=rpmMacro().setName("clean")
|
|
| 8 |
- self.prepMacro=rpmMacro().setName("prep")
|
|
| 9 |
- self.buildMacro=rpmMacro().setName("build")
|
|
| 10 |
- self.installMacro=rpmMacro().setName("install")
|
|
| 11 |
- self.changelogMacro=rpmMacro().setName("changelog")
|
|
| 12 |
- self.checkMacro=rpmMacro().setName("check")
|
|
| 13 |
- self.packages={}
|
|
| 14 |
- self.specAdditionalContent="" |
|
| 15 |
- self.globalSecurityHardening="" |
|
| 16 |
- |
|
| 17 |
- |
|
| 18 |
- def readPkgNameFromPackageMacro(self,data,basePkgName=None): |
|
| 19 |
- data=" ".join(data.split()) |
|
| 20 |
- pkgHeaderName=data.split(" ")
|
|
| 21 |
- lenpkgHeaderName = len(pkgHeaderName) |
|
| 22 |
- |
|
| 23 |
- if (lenpkgHeaderName >= 3 and pkgHeaderName[1] != "-n"): |
|
| 24 |
- lenpkgHeaderName = 1 |
|
| 25 |
- if (lenpkgHeaderName == 2 or lenpkgHeaderName == 1 ) and basePkgName is None : |
|
| 26 |
- print "Invalid basePkgName" |
|
| 27 |
- return False,None |
|
| 28 |
- if lenpkgHeaderName == 3 : |
|
| 29 |
- return True,pkgHeaderName[2] |
|
| 30 |
- if lenpkgHeaderName == 2 : |
|
| 31 |
- return True,basePkgName + "-"+pkgHeaderName[1] |
|
| 32 |
- if lenpkgHeaderName == 1: |
|
| 33 |
- return True, basePkgName |
|
| 34 |
- |
|
| 35 |
- def parseSpecFile(self,specfile): |
|
| 36 |
- self.createDefaultPackage() |
|
| 37 |
- currentPkg="default" |
|
| 38 |
- specFile = open(specfile) |
|
| 39 |
- lines = specFile.readlines() |
|
| 40 |
- totalLines=len(lines) |
|
| 41 |
- i=0 |
|
| 42 |
- while i < totalLines: |
|
| 43 |
- line = lines[i].strip() |
|
| 44 |
- if self.isSpecMacro(line): |
|
| 45 |
- macro,i=self.readMacroFromFile(i, lines) |
|
| 46 |
- self.updateMacro(macro) |
|
| 47 |
- elif self.isPackageMacro(line): |
|
| 48 |
- defaultpkg = self.packages.get('default')
|
|
| 49 |
- returnVal,packageName=self.readPkgNameFromPackageMacro(line, defaultpkg.name) |
|
| 50 |
- packageName=defaultpkg.decodeContents(packageName) |
|
| 51 |
- if not returnVal: |
|
| 52 |
- return False |
|
| 53 |
- if re.search('^'+'%package',line) :
|
|
| 54 |
- pkg = Package(defaultpkg) |
|
| 55 |
- pkg.name=packageName |
|
| 56 |
- currentPkg=packageName |
|
| 57 |
- self.packages[pkg.name]=pkg |
|
| 58 |
- else: |
|
| 59 |
- if defaultpkg.name == packageName : |
|
| 60 |
- packageName = 'default' |
|
| 61 |
- if not self.packages.has_key(packageName): |
|
| 62 |
- return False |
|
| 63 |
- macro,i=self.readMacroFromFile(i, lines) |
|
| 64 |
- self.packages[packageName].updatePackageMacro(macro) |
|
| 65 |
- elif self.isPackageHeaders(line): |
|
| 66 |
- self.readPackageHeaders(line, self.packages[currentPkg]) |
|
| 67 |
- elif self.isGlobalSecurityHardening(line): |
|
| 68 |
- self.readSecurityHardening(line) |
|
| 69 |
- else: |
|
| 70 |
- self.specAdditionalContent+=line+"\n" |
|
| 71 |
- i=i+1 |
|
| 72 |
- specFile.close() |
|
| 73 |
- |
|
| 74 |
- def createDefaultPackage(self): |
|
| 75 |
- pkg = Package() |
|
| 76 |
- self.packages["default"]=pkg |
|
| 77 |
- |
|
| 78 |
- def readMacroFromFile(self,currentPos,lines): |
|
| 79 |
- macro = rpmMacro() |
|
| 80 |
- line = lines[currentPos] |
|
| 81 |
- macro.position = currentPos |
|
| 82 |
- macro.endposition=currentPos |
|
| 83 |
- endPos=len(lines) |
|
| 84 |
- line = " ".join(line.split()) |
|
| 85 |
- flagindex = line.find(" ")
|
|
| 86 |
- if flagindex != -1: |
|
| 87 |
- macro.macroFlag=line[flagindex+1:] |
|
| 88 |
- macro.macroName=line[:flagindex] |
|
| 89 |
- else: |
|
| 90 |
- macro.macroName=line |
|
| 91 |
- |
|
| 92 |
- if currentPos+1 < len(lines) and self.isMacro(lines[currentPos+1]): |
|
| 93 |
- return macro,currentPos |
|
| 94 |
- |
|
| 95 |
- for j in range(currentPos+1,endPos): |
|
| 96 |
- content = lines[j] |
|
| 97 |
- if j+1 < endPos and self.isMacro(lines[j+1]): |
|
| 98 |
- return macro,j |
|
| 99 |
- macro.content += content +'\n' |
|
| 100 |
- macro.endposition=j |
|
| 101 |
- return macro,endPos |
|
| 102 |
- |
|
| 103 |
- |
|
| 104 |
- def updateMacro(self,macro): |
|
| 105 |
- if macro.macroName == "%clean": |
|
| 106 |
- self.cleanMacro=macro |
|
| 107 |
- return True |
|
| 108 |
- if macro.macroName == "%prep": |
|
| 109 |
- self.prepMacro=macro |
|
| 110 |
- return True |
|
| 111 |
- if macro.macroName == "%build": |
|
| 112 |
- self.buildMacro=macro |
|
| 113 |
- return True |
|
| 114 |
- if macro.macroName == "%install": |
|
| 115 |
- self.installMacro=macro |
|
| 116 |
- return True |
|
| 117 |
- if macro.macroName == "%changelog": |
|
| 118 |
- self.changelogMacro=macro |
|
| 119 |
- return True |
|
| 120 |
- if macro.macroName == "%check": |
|
| 121 |
- self.checkMacro=macro |
|
| 122 |
- return True |
|
| 123 |
- return False |
|
| 124 |
- |
|
| 125 |
- def isMacro(self,line): |
|
| 126 |
- return self.isPackageMacro(line) or self.isSpecMacro(line) |
|
| 127 |
- |
|
| 128 |
- def isSpecMacro(self,line): |
|
| 129 |
- if re.search('^'+'%clean',line) :
|
|
| 130 |
- return True |
|
| 131 |
- elif re.search('^'+'%prep',line) :
|
|
| 132 |
- return True |
|
| 133 |
- elif re.search('^'+'%build',line) :
|
|
| 134 |
- return True |
|
| 135 |
- elif re.search('^'+'%install',line) :
|
|
| 136 |
- return True |
|
| 137 |
- elif re.search('^'+'%changelog',line) :
|
|
| 138 |
- return True |
|
| 139 |
- elif re.search('^'+'%check',line) :
|
|
| 140 |
- return True |
|
| 141 |
- return False |
|
| 142 |
- |
|
| 143 |
- def isPackageMacro(self,line): |
|
| 144 |
- line=line.strip() |
|
| 145 |
-# What is the point of this function? |
|
| 146 |
-# Why does it track post/postun sections? |
|
| 147 |
-# if re.search('^'+'%post',line) :
|
|
| 148 |
-# return True |
|
| 149 |
-# elif re.search('^'+'%postun',line) :
|
|
| 150 |
-# return True |
|
| 151 |
- if re.search('^'+'%files',line) :
|
|
| 152 |
- return True |
|
| 153 |
- elif re.search('^'+'%description',line) :
|
|
| 154 |
- return True |
|
| 155 |
- elif re.search('^'+'%package',line) :
|
|
| 156 |
- return True |
|
| 157 |
- return False |
|
| 158 |
- |
|
| 159 |
- def isPackageHeaders(self,line): |
|
| 160 |
- if re.search('^'+'summary:',line,flags=re.IGNORECASE) :
|
|
| 161 |
- return True |
|
| 162 |
- elif re.search('^'+'name:',line,flags=re.IGNORECASE) :
|
|
| 163 |
- return True |
|
| 164 |
- elif re.search('^'+'group:',line,flags=re.IGNORECASE) :
|
|
| 165 |
- return True |
|
| 166 |
- elif re.search('^'+'license:',line,flags=re.IGNORECASE) :
|
|
| 167 |
- return True |
|
| 168 |
- elif re.search('^'+'version:',line,flags=re.IGNORECASE) :
|
|
| 169 |
- return True |
|
| 170 |
- elif re.search('^'+'release:',line,flags=re.IGNORECASE) :
|
|
| 171 |
- return True |
|
| 172 |
- elif re.search('^'+'distribution:',line,flags=re.IGNORECASE) :
|
|
| 173 |
- return True |
|
| 174 |
- elif re.search('^'+'requires:',line,flags=re.IGNORECASE) :
|
|
| 175 |
- return True |
|
| 176 |
- elif re.search('^'+'provides:',line,flags=re.IGNORECASE) :
|
|
| 177 |
- return True |
|
| 178 |
- elif re.search('^'+'obsoletes:',line,flags=re.IGNORECASE) :
|
|
| 179 |
- return True |
|
| 180 |
- elif re.search('^'+'conflicts:',line,flags=re.IGNORECASE) :
|
|
| 181 |
- return True |
|
| 182 |
- elif re.search('^'+'url:',line,flags=re.IGNORECASE) :
|
|
| 183 |
- return True |
|
| 184 |
- elif re.search('^'+'source[0-9]*:',line,flags=re.IGNORECASE) :
|
|
| 185 |
- return True |
|
| 186 |
- elif re.search('^'+'patch[0-9]*:',line,flags=re.IGNORECASE) :
|
|
| 187 |
- return True |
|
| 188 |
- elif re.search('^'+'buildrequires:',line,flags=re.IGNORECASE) :
|
|
| 189 |
- return True |
|
| 190 |
- elif re.search('^'+'buildprovides:',line,flags=re.IGNORECASE) :
|
|
| 191 |
- return True |
|
| 192 |
- elif re.search('^'+'buildarch:',line,flags=re.IGNORECASE) :
|
|
| 193 |
- return True |
|
| 194 |
- return False |
|
| 195 |
- |
|
| 196 |
- def isGlobalSecurityHardening(self,line): |
|
| 197 |
- if re.search('^%global *security_hardening',line,flags=re.IGNORECASE) :
|
|
| 198 |
- return True |
|
| 199 |
- return False |
|
| 200 |
- |
|
| 201 |
- def readHeader(self,line): |
|
| 202 |
- headerSplitIndex=line.find(":")
|
|
| 203 |
- if(headerSplitIndex+1 == len(line) ): |
|
| 204 |
- print line |
|
| 205 |
- print "Error:Invalid header" |
|
| 206 |
- return False, None,None |
|
| 207 |
- headerName=line[0:headerSplitIndex].lower() |
|
| 208 |
- headerContent=line[headerSplitIndex+1:].strip() |
|
| 209 |
- return True,headerName,headerContent |
|
| 210 |
- |
|
| 211 |
- |
|
| 212 |
- def readDependentPackageData(self,line): |
|
| 213 |
- strUtils = StringUtils() |
|
| 214 |
- listPackages=line.split(",")
|
|
| 215 |
- listdependentpkgs=[] |
|
| 216 |
- for line in listPackages: |
|
| 217 |
- line=strUtils.getStringInBrackets(line) |
|
| 218 |
- listContents=line.split() |
|
| 219 |
- totalContents = len(listContents) |
|
| 220 |
- i=0 |
|
| 221 |
- while i < totalContents: |
|
| 222 |
- dpkg = dependentPackageData() |
|
| 223 |
- compare=None |
|
| 224 |
- if listContents[i].startswith("/"):
|
|
| 225 |
- i=i+1 |
|
| 226 |
- continue |
|
| 227 |
- if i+2 < len(listContents): |
|
| 228 |
- if listContents[i+1] == ">=": |
|
| 229 |
- compare="gte" |
|
| 230 |
- elif listContents[i+1] == "<=": |
|
| 231 |
- compare="lte" |
|
| 232 |
- elif listContents[i+1] == "==": |
|
| 233 |
- compare="eq" |
|
| 234 |
- elif listContents[i+1] == "<": |
|
| 235 |
- compare="lt" |
|
| 236 |
- elif listContents[i+1] == ">": |
|
| 237 |
- compare="gt" |
|
| 238 |
- elif listContents[i+1] == "=": |
|
| 239 |
- compare="eq" |
|
| 240 |
- |
|
| 241 |
- if compare is not None: |
|
| 242 |
- dpkg.package=listContents[i] |
|
| 243 |
- dpkg.compare=compare |
|
| 244 |
- dpkg.version=listContents[i+2] |
|
| 245 |
- i=i+3 |
|
| 246 |
- else: |
|
| 247 |
- dpkg.package=listContents[i] |
|
| 248 |
- i=i+1 |
|
| 249 |
- listdependentpkgs.append(dpkg) |
|
| 250 |
- return listdependentpkgs |
|
| 251 |
- |
|
| 252 |
- def readPackageHeaders(self,line,pkg): |
|
| 253 |
- returnVal,headerName,headerContent=self.readHeader(line) |
|
| 254 |
- if not returnVal: |
|
| 255 |
- return False |
|
| 256 |
- |
|
| 257 |
- headerContent=pkg.decodeContents(headerContent) |
|
| 258 |
- if headerName == 'summary': |
|
| 259 |
- pkg.summary=headerContent |
|
| 260 |
- return True |
|
| 261 |
- if headerName == 'name': |
|
| 262 |
- pkg.name=headerContent |
|
| 263 |
- return True |
|
| 264 |
- if headerName == 'group': |
|
| 265 |
- pkg.group=headerContent |
|
| 266 |
- return True |
|
| 267 |
- if headerName == 'license': |
|
| 268 |
- pkg.license=headerContent |
|
| 269 |
- return True |
|
| 270 |
- if headerName == 'version': |
|
| 271 |
- pkg.version=headerContent |
|
| 272 |
- return True |
|
| 273 |
- if headerName == 'buildarch': |
|
| 274 |
- pkg.buildarch=headerContent |
|
| 275 |
- return True |
|
| 276 |
- if headerName == 'release': |
|
| 277 |
- pkg.release=headerContent |
|
| 278 |
- return True |
|
| 279 |
- if headerName == 'distribution': |
|
| 280 |
- pkg.distribution=headerContent |
|
| 281 |
- return True |
|
| 282 |
- if headerName == 'url': |
|
| 283 |
- pkg.URL=headerContent |
|
| 284 |
- return True |
|
| 285 |
- if headerName.find('source') != -1:
|
|
| 286 |
- pkg.sources.append(headerContent) |
|
| 287 |
- return True |
|
| 288 |
- if headerName.find('patch') != -1:
|
|
| 289 |
- pkg.patches.append(headerContent) |
|
| 290 |
- return True |
|
| 291 |
- if headerName == 'requires' or headerName == 'provides' or headerName == 'obsoletes' or headerName == 'conflicts' or headerName == 'buildrequires' or headerName == 'buildprovides': |
|
| 292 |
- dpkg=self.readDependentPackageData(headerContent) |
|
| 293 |
- if dpkg is None: |
|
| 294 |
- return False |
|
| 295 |
- if headerName == 'requires': |
|
| 296 |
- pkg.requires.extend(dpkg) |
|
| 297 |
- if headerName == 'provides': |
|
| 298 |
- pkg.provides.extend(dpkg) |
|
| 299 |
- if headerName == 'obsoletes': |
|
| 300 |
- pkg.obsoletes.extend(dpkg) |
|
| 301 |
- if headerName == 'conflicts': |
|
| 302 |
- pkg.conflicts.extend(dpkg) |
|
| 303 |
- if headerName == 'buildrequires': |
|
| 304 |
- pkg.buildrequires.extend(dpkg) |
|
| 305 |
- if headerName == 'buildprovides': |
|
| 306 |
- pkg.buildprovides.extend(dpkg) |
|
| 307 |
- |
|
| 308 |
- return True |
|
| 309 |
- return False |
|
| 310 |
- |
|
| 311 |
- def readSecurityHardening(self,line): |
|
| 312 |
- data = line.lower().strip(); |
|
| 313 |
- words=data.split(" ")
|
|
| 314 |
- nrWords = len(words) |
|
| 315 |
- if (nrWords != 3): |
|
| 316 |
- print "Error: Unable to parse line: "+line |
|
| 317 |
- return False |
|
| 318 |
- if (words[2] != "none" and words[2] != "nonow") : |
|
| 319 |
- print "Error: Invalid security_hardening value: " + words[2] |
|
| 320 |
- return False |
|
| 321 |
- self.globalSecurityHardening = words[2] |
|
| 322 |
- return True; |
| 323 | 1 |
deleted file mode 100644 |
| ... | ... |
@@ -1,105 +0,0 @@ |
| 1 |
-class rpmMacro(object): |
|
| 2 |
- |
|
| 3 |
- def __init__(self): |
|
| 4 |
- self.macroName="" |
|
| 5 |
- self.macroFlag="" |
|
| 6 |
- self.content="" |
|
| 7 |
- self.position=-1 |
|
| 8 |
- self.endposition=-1 |
|
| 9 |
- |
|
| 10 |
- def setName(self,name): |
|
| 11 |
- self.macroName=name |
|
| 12 |
- |
|
| 13 |
- def displayMacro(self): |
|
| 14 |
- print "Macro:\n", self.macroName, " ",self.macroFlag," ",self.position," ",self.endposition |
|
| 15 |
- print self.content |
|
| 16 |
- |
|
| 17 |
-class dependentPackageData(object): |
|
| 18 |
- |
|
| 19 |
- def __init__(self): |
|
| 20 |
- self.package="" |
|
| 21 |
- self.version="" |
|
| 22 |
- self.compare="" |
|
| 23 |
- |
|
| 24 |
-class Package(object): |
|
| 25 |
- def __init__(self, basePkg=None): |
|
| 26 |
- self.summary="" |
|
| 27 |
- self.name="" |
|
| 28 |
- self.group="" |
|
| 29 |
- self.license="" |
|
| 30 |
- self.version="" |
|
| 31 |
- self.release="" |
|
| 32 |
- self.buildarch="x86_64" |
|
| 33 |
- self.distribution="" |
|
| 34 |
- self.basePkgName="" |
|
| 35 |
- |
|
| 36 |
- self.sources=[] |
|
| 37 |
- self.patches=[] |
|
| 38 |
- self.buildrequires=[] |
|
| 39 |
- self.buildprovides=[] |
|
| 40 |
- |
|
| 41 |
- |
|
| 42 |
- self.requires=[] |
|
| 43 |
- self.provides=[] |
|
| 44 |
- self.obsoletes=[] |
|
| 45 |
- self.conflicts=[] |
|
| 46 |
- |
|
| 47 |
- self.descriptionMacro= None |
|
| 48 |
- self.postMacro=None |
|
| 49 |
- self.postunMacro=None |
|
| 50 |
- self.filesMacro=None |
|
| 51 |
- self.packageMacro=None |
|
| 52 |
- |
|
| 53 |
- if basePkg is not None: |
|
| 54 |
- self.basePkgName=basePkg.name |
|
| 55 |
- self.group=basePkg.group |
|
| 56 |
- self.license=basePkg.license |
|
| 57 |
- self.version=basePkg.version |
|
| 58 |
- self.buildarch=basePkg.buildarch |
|
| 59 |
- self.release=basePkg.release |
|
| 60 |
- self.distribution=basePkg.distribution |
|
| 61 |
- |
|
| 62 |
- def decodeContents(self,content): |
|
| 63 |
- if content.find("%{name}") != -1:
|
|
| 64 |
- if self.basePkgName == "": |
|
| 65 |
- content = content.replace('%{name}',self.name)
|
|
| 66 |
- else: |
|
| 67 |
- content = content.replace('%{name}',self.basePkgName)
|
|
| 68 |
- |
|
| 69 |
- if content.find("%{release}") != -1:
|
|
| 70 |
- content = content.replace('%{release}',self.release)
|
|
| 71 |
- |
|
| 72 |
- if content.find("%{version}") != -1:
|
|
| 73 |
- content = content.replace('%{version}',self.version)
|
|
| 74 |
- |
|
| 75 |
- if content.find("%{?dist}") != -1:
|
|
| 76 |
- content = content.replace('%{?dist}',self.distribution)
|
|
| 77 |
- |
|
| 78 |
- if content.find("%{dist}") != -1:
|
|
| 79 |
- content = content.replace('%{dist}',self.distribution)
|
|
| 80 |
- |
|
| 81 |
- # TODO: A temporary hack here. The reason is this macro |
|
| 82 |
- # can't be subsitute properly. |
|
| 83 |
- # At this file level, we won't be able to obtain any other |
|
| 84 |
- # packages' information. This macro requires the information |
|
| 85 |
- # of package linux. Besides, there is a huge diversion |
|
| 86 |
- # between package-builder and SpecDeps. |
|
| 87 |
- if content.find("%{?kernelsubrelease}") != -1:
|
|
| 88 |
- content = content.replace('%{?kernelsubrelease}',"")
|
|
| 89 |
- |
|
| 90 |
- return content |
|
| 91 |
- |
|
| 92 |
- def updatePackageMacro(self,macro): |
|
| 93 |
- if macro.macroName == "%post": |
|
| 94 |
- self.postMacro=macro |
|
| 95 |
- return True |
|
| 96 |
- if macro.macroName == "%postun": |
|
| 97 |
- self.postunMacro=macro |
|
| 98 |
- return True |
|
| 99 |
- if macro.macroName == "%files": |
|
| 100 |
- self.filesMacro=macro |
|
| 101 |
- return True |
|
| 102 |
- if macro.macroName == "%description": |
|
| 103 |
- self.descriptionMacro = macro |
|
| 104 |
- return True |
|
| 105 |
- return False |
| 106 | 1 |
deleted file mode 100644 |
| ... | ... |
@@ -1,243 +0,0 @@ |
| 1 |
-from SpecParser import SpecParser |
|
| 2 |
-from StringUtils import StringUtils |
|
| 3 |
-import os |
|
| 4 |
- |
|
| 5 |
-class Specutils(object): |
|
| 6 |
- |
|
| 7 |
- def __init__(self,specfile): |
|
| 8 |
- self.specfile="" |
|
| 9 |
- self.spec = SpecParser() |
|
| 10 |
- if self.isSpecFile(specfile): |
|
| 11 |
- self.specfile=specfile |
|
| 12 |
- self.spec.parseSpecFile(self.specfile) |
|
| 13 |
- |
|
| 14 |
- def isSpecFile(self,specfile): |
|
| 15 |
- if os.path.isfile(specfile) and specfile[-5:] == ".spec": |
|
| 16 |
- return True |
|
| 17 |
- return False |
|
| 18 |
- |
|
| 19 |
- def getSourceNames(self): |
|
| 20 |
- sourceNames=[] |
|
| 21 |
- strUtils = StringUtils() |
|
| 22 |
- pkg = self.spec.packages.get('default')
|
|
| 23 |
- if pkg is None: |
|
| 24 |
- return None |
|
| 25 |
- for source in pkg.sources: |
|
| 26 |
- sourceName=strUtils.getFileNameFromURL(source) |
|
| 27 |
- sourceNames.append(sourceName) |
|
| 28 |
- return sourceNames |
|
| 29 |
- |
|
| 30 |
- def getSourceURLs(self): |
|
| 31 |
- sourceNames=[] |
|
| 32 |
- strUtils = StringUtils() |
|
| 33 |
- pkg = self.spec.packages.get('default')
|
|
| 34 |
- if pkg is None: |
|
| 35 |
- return None |
|
| 36 |
- for source in pkg.sources: |
|
| 37 |
- sourceNames.append(source) |
|
| 38 |
- return sourceNames |
|
| 39 |
- |
|
| 40 |
- def getPatchNames(self): |
|
| 41 |
- patchNames=[] |
|
| 42 |
- strUtils = StringUtils() |
|
| 43 |
- pkg = self.spec.packages.get('default')
|
|
| 44 |
- if pkg is None: |
|
| 45 |
- return None |
|
| 46 |
- for patch in pkg.patches: |
|
| 47 |
- patchName=strUtils.getFileNameFromURL(patch) |
|
| 48 |
- patchNames.append(patchName) |
|
| 49 |
- return patchNames |
|
| 50 |
- |
|
| 51 |
- def getPackageNames(self): |
|
| 52 |
- packageNames=[] |
|
| 53 |
- for key in self.spec.packages.keys(): |
|
| 54 |
- pkg = self.spec.packages.get(key) |
|
| 55 |
- packageNames.append(pkg.name) |
|
| 56 |
- return packageNames |
|
| 57 |
- |
|
| 58 |
- def getRPMNames(self): |
|
| 59 |
- rpmNames=[] |
|
| 60 |
- for key in self.spec.packages.keys(): |
|
| 61 |
- pkg = self.spec.packages.get(key) |
|
| 62 |
- rpmName=pkg.name+"-"+pkg.version+"-"+pkg.release |
|
| 63 |
- rpmNames.append(rpmName) |
|
| 64 |
- return rpmNames |
|
| 65 |
- |
|
| 66 |
- def getRPMName(self, pkgName): |
|
| 67 |
- rpmName=None |
|
| 68 |
- for key in self.spec.packages.keys(): |
|
| 69 |
- pkg = self.spec.packages.get(key) |
|
| 70 |
- if pkg.name == pkgName: |
|
| 71 |
- rpmName=pkg.name+"-"+pkg.version+"-"+pkg.release |
|
| 72 |
- break |
|
| 73 |
- return rpmName |
|
| 74 |
- |
|
| 75 |
- def getDebuginfoRPMName(self, pkgName): |
|
| 76 |
- rpmName=None |
|
| 77 |
- for key in self.spec.packages.keys(): |
|
| 78 |
- pkg = self.spec.packages.get(key) |
|
| 79 |
- if pkg.name == pkgName: |
|
| 80 |
- if pkg.basePkgName: |
|
| 81 |
- rpmName=pkg.basePkgName+"-debuginfo-"+pkg.version+"-"+pkg.release |
|
| 82 |
- break |
|
| 83 |
- else: |
|
| 84 |
- rpmName=pkg.name+"-debuginfo-"+pkg.version+"-"+pkg.release |
|
| 85 |
- break |
|
| 86 |
- return rpmName |
|
| 87 |
- |
|
| 88 |
- def getRPMVersion(self, pkgName): |
|
| 89 |
- version=None |
|
| 90 |
- for key in self.spec.packages.keys(): |
|
| 91 |
- pkg = self.spec.packages.get(key) |
|
| 92 |
- if pkg.name == pkgName: |
|
| 93 |
- version=pkg.version |
|
| 94 |
- break |
|
| 95 |
- return version |
|
| 96 |
- |
|
| 97 |
- def getRPMRelease(self, pkgName): |
|
| 98 |
- release=None |
|
| 99 |
- for key in self.spec.packages.keys(): |
|
| 100 |
- pkg = self.spec.packages.get(key) |
|
| 101 |
- if pkg.name == pkgName: |
|
| 102 |
- release=pkg.release |
|
| 103 |
- break |
|
| 104 |
- return release |
|
| 105 |
- |
|
| 106 |
- def getLicense(self, pkgName): |
|
| 107 |
- licenseInfo=None |
|
| 108 |
- for key in self.spec.packages.keys(): |
|
| 109 |
- pkg = self.spec.packages.get(key) |
|
| 110 |
- if pkg.name == pkgName: |
|
| 111 |
- licenseInfo=pkg.license |
|
| 112 |
- break |
|
| 113 |
- return licenseInfo |
|
| 114 |
- |
|
| 115 |
- def getURL(self, pkgName): |
|
| 116 |
- url=None |
|
| 117 |
- for key in self.spec.packages.keys(): |
|
| 118 |
- pkg = self.spec.packages.get(key) |
|
| 119 |
- if pkg.name == pkgName: |
|
| 120 |
- url=pkg.URL |
|
| 121 |
- break |
|
| 122 |
- return url |
|
| 123 |
- |
|
| 124 |
- def getBuildArch(self, pkgName): |
|
| 125 |
- buildArch="x86_64" |
|
| 126 |
- for key in self.spec.packages.keys(): |
|
| 127 |
- pkg = self.spec.packages.get(key) |
|
| 128 |
- if pkg.name == pkgName: |
|
| 129 |
- buildArch=pkg.buildarch |
|
| 130 |
- break |
|
| 131 |
- return buildArch |
|
| 132 |
- |
|
| 133 |
- def getRequiresAllPackages(self): |
|
| 134 |
- depedentPackages=[] |
|
| 135 |
- for key in self.spec.packages.keys(): |
|
| 136 |
- pkg = self.spec.packages.get(key) |
|
| 137 |
- for dpkg in pkg.requires: |
|
| 138 |
- depedentPackages.append(dpkg.package) |
|
| 139 |
- depedentPackages=list(set(depedentPackages)) |
|
| 140 |
- packageNames=self.getPackageNames() |
|
| 141 |
- for pkgName in packageNames: |
|
| 142 |
- if pkgName in depedentPackages: |
|
| 143 |
- depedentPackages.remove(pkgName) |
|
| 144 |
- return depedentPackages |
|
| 145 |
- |
|
| 146 |
- def getRequiresAllPackagesForGiven(self, pkgName): |
|
| 147 |
- dependentPackages=[] |
|
| 148 |
- for key in self.spec.packages.keys(): |
|
| 149 |
- pkg = self.spec.packages.get(key) |
|
| 150 |
- if pkg.name == pkgName: |
|
| 151 |
- for dpkg in pkg.requires: |
|
| 152 |
- dependentPackages.append(dpkg.package) |
|
| 153 |
- #if (pkgName == "mono-extras"): |
|
| 154 |
- # print "4given packages:", self.spec.packages |
|
| 155 |
- # print "4given dep packages: ", dependentPackages |
|
| 156 |
- return dependentPackages |
|
| 157 |
- |
|
| 158 |
- def getBuildRequiresAllPackages(self): |
|
| 159 |
- depedentPackages=[] |
|
| 160 |
- for key in self.spec.packages.keys(): |
|
| 161 |
- pkg = self.spec.packages.get(key) |
|
| 162 |
- #if(pkg.name == "mono"): |
|
| 163 |
- #print "build dendent packages len 4 mono-devel:", len(pkg.buildrequires) |
|
| 164 |
- for dpkg in pkg.buildrequires: |
|
| 165 |
- depedentPackages.append(dpkg.package) |
|
| 166 |
- depedentPackages=list(set(depedentPackages)) |
|
| 167 |
- packageNames=self.getPackageNames() |
|
| 168 |
- for pkgName in packageNames: |
|
| 169 |
- if pkgName in depedentPackages: |
|
| 170 |
- depedentPackages.remove(pkgName) |
|
| 171 |
- return depedentPackages |
|
| 172 |
- |
|
| 173 |
- |
|
| 174 |
- def getRequires(self,pkgName): |
|
| 175 |
- dependentPackages=[] |
|
| 176 |
- #if( pkgName == "mono-devel"): |
|
| 177 |
- #print "packages:", self.spec.packages |
|
| 178 |
- for key in self.spec.packages.keys(): |
|
| 179 |
- pkg = self.spec.packages.get(key) |
|
| 180 |
- if pkg.name == pkgName: |
|
| 181 |
- #if( pkgName == "mono-devel"): |
|
| 182 |
- #print "dendent packages len 4 mono-devel:", len(pkg.requires), pkg.requires[0].package |
|
| 183 |
- for dpkg in pkg.requires: |
|
| 184 |
- dependentPackages.append(dpkg.package) |
|
| 185 |
- return dependentPackages |
|
| 186 |
- |
|
| 187 |
- def getBuildRequires(self,pkgName): |
|
| 188 |
- dependentPackages=[] |
|
| 189 |
- for key in self.spec.packages.keys(): |
|
| 190 |
- pkg = self.spec.packages.get(key) |
|
| 191 |
- if pkg.name == pkgName: |
|
| 192 |
- #if( pkgName == "mono-devel"): |
|
| 193 |
- #print "build dendent packages len 4 mono-devel:", len(pkg.buildrequires), pkg.buildrequires[0].package |
|
| 194 |
- for dpkg in pkg.buildrequires: |
|
| 195 |
- dependentPackages.append(dpkg.package) |
|
| 196 |
- return dependentPackages |
|
| 197 |
- |
|
| 198 |
- def getProvides(self,packageName): |
|
| 199 |
- depedentPackages=[] |
|
| 200 |
- defaultPkgName=self.spec.packages['default'].name |
|
| 201 |
- pkg = None |
|
| 202 |
- if self.spec.packages.has_key(packageName): |
|
| 203 |
- pkg = self.spec.packages.get(packageName) |
|
| 204 |
- if defaultPkgName == packageName: |
|
| 205 |
- pkg=self.spec.packages['default'] |
|
| 206 |
- if pkg is not None: |
|
| 207 |
- for dpkg in pkg.provides: |
|
| 208 |
- depedentPackages.append(dpkg.package) |
|
| 209 |
- else: |
|
| 210 |
- print "package not found" |
|
| 211 |
- return depedentPackages |
|
| 212 |
- |
|
| 213 |
- def getVersion(self): |
|
| 214 |
- pkg = self.spec.packages.get('default')
|
|
| 215 |
- return pkg.version |
|
| 216 |
- |
|
| 217 |
- def getRelease(self): |
|
| 218 |
- pkg = self.spec.packages.get('default')
|
|
| 219 |
- return pkg.release |
|
| 220 |
- |
|
| 221 |
- def getBasePackageName(self): |
|
| 222 |
- pkg = self.spec.packages.get('default')
|
|
| 223 |
- return pkg.name |
|
| 224 |
- |
|
| 225 |
- def getSecurityHardeningOption(self): |
|
| 226 |
- return self.spec.globalSecurityHardening |
|
| 227 |
- |
|
| 228 |
-def main(): |
|
| 229 |
- spec = Specutils("/workspace1/myrepos/photon/SPECS/docker/docker.spec")
|
|
| 230 |
- print "packages",spec.getPackageNames() |
|
| 231 |
- print "packages",spec.getRPMNames() |
|
| 232 |
- print "sources",spec.getSourceNames() |
|
| 233 |
- print "patches",spec.getPatchNames() |
|
| 234 |
- print "requires",spec.getRequires('libltdl-devel')
|
|
| 235 |
- print "requires",spec.getRequires('libtool')
|
|
| 236 |
- |
|
| 237 |
- print "provides",spec.getProvides('libtool')
|
|
| 238 |
- print "all-requires",spec.getRequiresAllPackages() |
|
| 239 |
- print "all-build-requires",spec.getBuildRequiresAllPackages() |
|
| 240 |
- |
|
| 241 |
-if __name__ == '__main__': |
|
| 242 |
- main() |
|
| 243 |
- |
| 244 | 1 |
deleted file mode 100755 |
| ... | ... |
@@ -1,74 +0,0 @@ |
| 1 |
-#!/usr/bin/python2 |
|
| 2 |
-# |
|
| 3 |
-#Copyright (C) 2015 vmware inc. |
|
| 4 |
-# |
|
| 5 |
-#Author: Harish Udaiya Kumar <hudaiyakumar@vmware.com> |
|
| 6 |
-from SpecUtils import Specutils |
|
| 7 |
-from SpecData import SerializableSpecObject |
|
| 8 |
-from SpecData import SerializedSpecObjects |
|
| 9 |
-from RepoDeps import RepoQueryDependency |
|
| 10 |
-import sys |
|
| 11 |
-import os |
|
| 12 |
-from optparse import OptionParser |
|
| 13 |
-from jsonwrapper import JsonWrapper |
|
| 14 |
- |
|
| 15 |
-DEFAULT_INPUT_TYPE = "json" |
|
| 16 |
-DEFAULT_DISPLAY_OPTION = "tree" |
|
| 17 |
-SPEC_FILE_DIR = "../../SPECS" |
|
| 18 |
-INPUT_DATA_DIR = "../../common/data" |
|
| 19 |
- |
|
| 20 |
-def reportMissing(pkg,specDepList, repoDepList, excludeList): |
|
| 21 |
- missingList = []; |
|
| 22 |
- if None != repoDepList: |
|
| 23 |
- for repoItem in repoDepList: |
|
| 24 |
- if repoItem not in excludeList and (None == specDepList or repoItem not in specDepList): |
|
| 25 |
- missingList.append(repoItem) |
|
| 26 |
- if missingList: |
|
| 27 |
- if len(pkg) <= 7: |
|
| 28 |
- print pkg, "missing\t\t->", missingList |
|
| 29 |
- else: |
|
| 30 |
- print pkg, "missing\t->", missingList |
|
| 31 |
- |
|
| 32 |
-def main(): |
|
| 33 |
- usage = os.path.basename(__file__) + "--input-type=[json/pkg] --pkg=[pkg_name] --file=<JSON_FILE_NAME> --repo-file=<photon>.repo" |
|
| 34 |
- parser = OptionParser(usage) |
|
| 35 |
- parser.add_option("-i", "--input-type", dest="input_type", default=DEFAULT_INPUT_TYPE)
|
|
| 36 |
- parser.add_option("-p", "--pkg", dest="pkg")
|
|
| 37 |
- parser.add_option("-f", "--file", dest="json_file", default="packages_full.json")
|
|
| 38 |
- parser.add_option("-s", "--spec-dir", dest="spec_dir", default=SPEC_FILE_DIR)
|
|
| 39 |
- parser.add_option("-a", "--input-data-dir", dest="input_data_dir", default=INPUT_DATA_DIR)
|
|
| 40 |
- parser.add_option("-r", "--repo-file", dest = "repo_file", default="")
|
|
| 41 |
- excludeList = ["bash","glibc","libgcc","pkg-config","filesystem"] |
|
| 42 |
- (options, args) = parser.parse_args() |
|
| 43 |
- |
|
| 44 |
- if(options.repo_file == ""): |
|
| 45 |
- print "Error! repo file not provided" |
|
| 46 |
- print usage |
|
| 47 |
- return |
|
| 48 |
- |
|
| 49 |
- if(False == options.input_data_dir.endswith('/')):
|
|
| 50 |
- options.input_data_dir += '/' |
|
| 51 |
- |
|
| 52 |
- specDeps = SerializedSpecObjects(options.input_data_dir, "") |
|
| 53 |
- repoDeps = RepoQueryDependency(options.repo_file) |
|
| 54 |
- displayOption = None |
|
| 55 |
- abs_path = os.path.abspath(__file__) |
|
| 56 |
- dir_name = os.path.dirname(abs_path) |
|
| 57 |
- os.chdir(dir_name) |
|
| 58 |
- |
|
| 59 |
- if(options.input_type == "pkg"): |
|
| 60 |
- targetName = options.pkg |
|
| 61 |
- specDepList = specDeps.readSpecsAndConvertToSerializableObjects(options.spec_dir, options.input_type, targetName, displayOption) |
|
| 62 |
- repoDepList = repoDeps.getRequiresList(targetName) |
|
| 63 |
- reportMissing(targetName,specDepList,repoDepList,excludeList) |
|
| 64 |
- elif(options.input_type == "json"): |
|
| 65 |
- filePath = options.input_data_dir + options.json_file |
|
| 66 |
- data = specDeps.get_all_package_names(filePath) |
|
| 67 |
- for pkg in data: |
|
| 68 |
- specDepList = specDeps.readSpecsAndConvertToSerializableObjects(options.spec_dir, "pkg" , pkg, displayOption) |
|
| 69 |
- repoDepList = repoDeps.getRequiresList(pkg) |
|
| 70 |
- reportMissing(pkg,specDepList,repoDepList,excludeList) |
|
| 71 |
- sys.exit(0) |
|
| 72 |
- |
|
| 73 |
-if __name__=="__main__": |
|
| 74 |
- main() |
| 75 | 1 |
deleted file mode 100644 |
| ... | ... |
@@ -1,21 +0,0 @@ |
| 1 |
-import re |
|
| 2 |
- |
|
| 3 |
-class StringUtils(object): |
|
| 4 |
- |
|
| 5 |
- def getStringInBrackets(self, inputstring): |
|
| 6 |
- inputstring=inputstring.strip() |
|
| 7 |
- m = re.search(r"^\(([A-Za-z0-9_.-]+)\)", inputstring) |
|
| 8 |
- if m is None: |
|
| 9 |
- return inputstring |
|
| 10 |
- return m.group(1) |
|
| 11 |
- |
|
| 12 |
- def getFileNameFromURL(self,inputstring): |
|
| 13 |
- index=inputstring.rfind("/")
|
|
| 14 |
- return inputstring[index+1:] |
|
| 15 |
- |
|
| 16 |
- def getSpecNameFromPackageName(self, pkgName): |
|
| 17 |
- id = pkgName.rfind("-")
|
|
| 18 |
- if (id != -1): |
|
| 19 |
- return pkgName[0:id]; |
|
| 20 |
- else: |
|
| 21 |
- return pkgName; |
| 22 | 1 |
deleted file mode 100644 |
| ... | ... |
@@ -1,25 +0,0 @@ |
| 1 |
-#!/usr/bin/python2 |
|
| 2 |
-# |
|
| 3 |
-# Copyright (C) 2015 vmware inc. |
|
| 4 |
-# |
|
| 5 |
-# Author: Sharath George <sharathg@vmware.com> |
|
| 6 |
- |
|
| 7 |
- |
|
| 8 |
-import json |
|
| 9 |
-import collections |
|
| 10 |
- |
|
| 11 |
-class JsonWrapper(object): |
|
| 12 |
- |
|
| 13 |
- def __init__(self, filename): |
|
| 14 |
- self.filename = filename |
|
| 15 |
- |
|
| 16 |
- def read(self): |
|
| 17 |
- json_data = open(self.filename) |
|
| 18 |
- self.data = json.load(json_data, object_pairs_hook=collections.OrderedDict) |
|
| 19 |
- json_data.close() |
|
| 20 |
- return self.data |
|
| 21 |
- |
|
| 22 |
- def write(self, data): |
|
| 23 |
- self.data = data |
|
| 24 |
- outfile = open(self.filename, 'wb') |
|
| 25 |
- json.dump(data, outfile) |
| ... | ... |
@@ -38,7 +38,7 @@ PHOTON_CLOUD_IMAGE_BUILDER_DIR=$(SRCROOT)/support/cloud-image-builder |
| 38 | 38 |
|
| 39 | 39 |
PHOTON_INSTALLER_DIR=$(SRCROOT)/installer |
| 40 | 40 |
PHOTON_INSTALLER=$(PHOTON_INSTALLER_DIR)/photonInstaller.py |
| 41 |
-PHOTON_SPECDEPS_DIR=$(SRCROOT)/support/SpecDeps |
|
| 41 |
+PHOTON_SPECDEPS_DIR=$(SRCROOT)/support/package-builder |
|
| 42 | 42 |
PHOTON_SPECDEPS=$(PHOTON_SPECDEPS_DIR)/SpecDeps.py |
| 43 | 43 |
PHOTON_PACKAGE_BUILDER=$(PHOTON_PKG_BUILDER_DIR)/builder.py |
| 44 | 44 |
ifdef PHOTON_PULLSOURCES_CONFIG |
| ... | ... |
@@ -7,6 +7,7 @@ import sys |
| 7 | 7 |
from constants import constants |
| 8 | 8 |
import shutil |
| 9 | 9 |
import docker |
| 10 |
+from SpecData import SPECS |
|
| 10 | 11 |
|
| 11 | 12 |
class BuildContainer(object): |
| 12 | 13 |
|
| ... | ... |
@@ -105,8 +106,8 @@ class BuildContainer(object): |
| 105 | 105 |
outputMap[threadName] = False |
| 106 | 106 |
|
| 107 | 107 |
def checkIfPackageIsAlreadyBuilt(self, package): |
| 108 |
- basePkg = constants.specData.getSpecName(package) |
|
| 109 |
- listRPMPackages = constants.specData.getRPMPackages(basePkg) |
|
| 108 |
+ basePkg = SPECS.getData().getSpecName(package) |
|
| 109 |
+ listRPMPackages = SPECS.getData().getRPMPackages(basePkg) |
|
| 110 | 110 |
packageIsAlreadyBuilt = True |
| 111 | 111 |
pkgUtils = PackageUtils(self.logName,self.logPath) |
| 112 | 112 |
for pkg in listRPMPackages: |
| ... | ... |
@@ -193,15 +194,15 @@ class BuildContainer(object): |
| 193 | 193 |
containerID.remove(force=True) |
| 194 | 194 |
|
| 195 | 195 |
def findRunTimeRequiredRPMPackages(self, rpmPackage): |
| 196 |
- listRequiredPackages = constants.specData.getRequiresForPackage(rpmPackage) |
|
| 196 |
+ listRequiredPackages = SPECS.getData().getRequiresForPackage(rpmPackage) |
|
| 197 | 197 |
return listRequiredPackages |
| 198 | 198 |
|
| 199 | 199 |
def findBuildTimeRequiredPackages(self, package): |
| 200 |
- listRequiredPackages = constants.specData.getBuildRequiresForPackage(package) |
|
| 200 |
+ listRequiredPackages = SPECS.getData().getBuildRequiresForPackage(package) |
|
| 201 | 201 |
return listRequiredPackages |
| 202 | 202 |
|
| 203 | 203 |
def findBuildTimeCheckRequiredPackages(self,package): |
| 204 |
- listRequiredPackages=constants.specData.getCheckBuildRequiresForPackage(package) |
|
| 204 |
+ listRequiredPackages=SPECS.getData().getCheckBuildRequiresForPackage(package) |
|
| 205 | 205 |
return listRequiredPackages |
| 206 | 206 |
|
| 207 | 207 |
def installPackage(self, pkgUtils, package, containerID, destLogPath, listInstalledPackages, listInstalledRPMs): |
| ... | ... |
@@ -2,6 +2,7 @@ from Logger import Logger |
| 2 | 2 |
from constants import constants |
| 3 | 3 |
from sets import Set |
| 4 | 4 |
import copy |
| 5 |
+from SpecData import SPECS |
|
| 5 | 6 |
|
| 6 | 7 |
|
| 7 | 8 |
|
| ... | ... |
@@ -46,7 +47,7 @@ class PackageBuildDataGenerator(object): |
| 46 | 46 |
sortListForPkg=[] |
| 47 | 47 |
|
| 48 | 48 |
for p in runTimeDepPkgList: |
| 49 |
- basePkg=constants.specData.getSpecName(p) |
|
| 49 |
+ basePkg=SPECS.getData().getSpecName(p) |
|
| 50 | 50 |
for bPkg in self.__sortedBuildDependencyGraph[basePkg]: |
| 51 | 51 |
if bPkg not in sortListForPkg: |
| 52 | 52 |
sortListForPkg.append(bPkg) |
| ... | ... |
@@ -121,7 +122,7 @@ class PackageBuildDataGenerator(object): |
| 121 | 121 |
self.__sortedPackageList=sortedList |
| 122 | 122 |
|
| 123 | 123 |
def __constructBuildAndRunTimeDependencyGraph(self,package): |
| 124 |
- basePackage=constants.specData.getSpecName(package) |
|
| 124 |
+ basePackage=SPECS.getData().getSpecName(package) |
|
| 125 | 125 |
|
| 126 | 126 |
addBuildTimeGraph=True |
| 127 | 127 |
addRunTimeGraph=True |
| ... | ... |
@@ -132,19 +133,19 @@ class PackageBuildDataGenerator(object): |
| 132 | 132 |
|
| 133 | 133 |
nextPackagesToConstructGraph=[] |
| 134 | 134 |
if addBuildTimeGraph: |
| 135 |
- listDependentRpmPackages=constants.specData.getBuildRequiresForPackage(basePackage) |
|
| 135 |
+ listDependentRpmPackages=SPECS.getData().getBuildRequiresForPackage(basePackage) |
|
| 136 | 136 |
listDependentPackages=[] |
| 137 | 137 |
for rpmPkg in listDependentRpmPackages: |
| 138 |
- basePkg=constants.specData.getSpecName(rpmPkg) |
|
| 138 |
+ basePkg=SPECS.getData().getSpecName(rpmPkg) |
|
| 139 | 139 |
if basePkg not in listDependentPackages: |
| 140 | 140 |
listDependentPackages.append(basePkg) |
| 141 | 141 |
self.__buildDependencyGraph[basePackage]=listDependentPackages |
| 142 | 142 |
nextPackagesToConstructGraph.extend(listDependentPackages) |
| 143 | 143 |
|
| 144 | 144 |
if addRunTimeGraph: |
| 145 |
- listRpmPackages=constants.specData.getPackages(basePackage) |
|
| 145 |
+ listRpmPackages=SPECS.getData().getPackages(basePackage) |
|
| 146 | 146 |
for rpmPkg in listRpmPackages: |
| 147 |
- listDependentRpmPackages=constants.specData.getRequiresAllForPackage(rpmPkg) |
|
| 147 |
+ listDependentRpmPackages=SPECS.getData().getRequiresAllForPackage(rpmPkg) |
|
| 148 | 148 |
self.__runTimeDependencyGraph[rpmPkg]=listDependentRpmPackages[:] |
| 149 | 149 |
nextPackagesToConstructGraph.extend(listDependentRpmPackages) |
| 150 | 150 |
|
| ... | ... |
@@ -284,4 +285,4 @@ class PackageBuildDataGenerator(object): |
| 284 | 284 |
|
| 285 | 285 |
|
| 286 | 286 |
|
| 287 |
- |
|
| 288 | 287 |
\ No newline at end of file |
| 288 |
+ |
| ... | ... |
@@ -6,6 +6,7 @@ from CommandUtils import CommandUtils |
| 6 | 6 |
import os.path |
| 7 | 7 |
from constants import constants |
| 8 | 8 |
import shutil |
| 9 |
+from SpecData import SPECS |
|
| 9 | 10 |
|
| 10 | 11 |
class PackageBuilder(object): |
| 11 | 12 |
|
| ... | ... |
@@ -72,8 +73,8 @@ class PackageBuilder(object): |
| 72 | 72 |
outputMap[threadName]=False |
| 73 | 73 |
|
| 74 | 74 |
def checkIfPackageIsAlreadyBuilt(self, package): |
| 75 |
- basePkg=constants.specData.getSpecName(package) |
|
| 76 |
- listRPMPackages=constants.specData.getRPMPackages(basePkg) |
|
| 75 |
+ basePkg=SPECS.getData().getSpecName(package) |
|
| 76 |
+ listRPMPackages=SPECS.getData().getRPMPackages(basePkg) |
|
| 77 | 77 |
packageIsAlreadyBuilt=True |
| 78 | 78 |
pkgUtils = PackageUtils(self.logName,self.logPath) |
| 79 | 79 |
for pkg in listRPMPackages: |
| ... | ... |
@@ -136,15 +137,15 @@ class PackageBuilder(object): |
| 136 | 136 |
|
| 137 | 137 |
|
| 138 | 138 |
def findRunTimeRequiredRPMPackages(self,rpmPackage): |
| 139 |
- listRequiredPackages=constants.specData.getRequiresForPackage(rpmPackage) |
|
| 139 |
+ listRequiredPackages=SPECS.getData().getRequiresForPackage(rpmPackage) |
|
| 140 | 140 |
return listRequiredPackages |
| 141 | 141 |
|
| 142 | 142 |
def findBuildTimeRequiredPackages(self,package): |
| 143 |
- listRequiredPackages=constants.specData.getBuildRequiresForPackage(package) |
|
| 143 |
+ listRequiredPackages=SPECS.getData().getBuildRequiresForPackage(package) |
|
| 144 | 144 |
return listRequiredPackages |
| 145 | 145 |
|
| 146 | 146 |
def findBuildTimeCheckRequiredPackages(self,package): |
| 147 |
- listRequiredPackages=constants.specData.getCheckBuildRequiresForPackage(package) |
|
| 147 |
+ listRequiredPackages=SPECS.getData().getCheckBuildRequiresForPackage(package) |
|
| 148 | 148 |
return listRequiredPackages |
| 149 | 149 |
|
| 150 | 150 |
def installPackage(self,pkgUtils,package,chrootID,destLogPath,listInstalledPackages): |
| ... | ... |
@@ -4,6 +4,7 @@ from constants import constants |
| 4 | 4 |
import os.path |
| 5 | 5 |
from CommandUtils import CommandUtils |
| 6 | 6 |
from PackageUtils import PackageUtils |
| 7 |
+from SpecData import SPECS |
|
| 7 | 8 |
|
| 8 | 9 |
class PackageInfo(object): |
| 9 | 10 |
|
| ... | ... |
@@ -18,14 +19,14 @@ class PackageInfo(object): |
| 18 | 18 |
self.pkgList = {}
|
| 19 | 19 |
|
| 20 | 20 |
def loadPackagesData(self): |
| 21 |
- listPackages = constants.specData.getListPackages() |
|
| 21 |
+ listPackages = SPECS.getData().getListPackages() |
|
| 22 | 22 |
listPackages.sort() |
| 23 | 23 |
listRPMFiles = [] |
| 24 | 24 |
cmdUtils = CommandUtils() |
| 25 | 25 |
for package in listPackages: |
| 26 |
- release = constants.specData.getRelease(package) |
|
| 27 |
- version = constants.specData.getVersion(package) |
|
| 28 |
- listRPMPackages = constants.specData.getRPMPackages(package) |
|
| 26 |
+ release = SPECS.getData().getRelease(package) |
|
| 27 |
+ version = SPECS.getData().getVersion(package) |
|
| 28 |
+ listRPMPackages = SPECS.getData().getRPMPackages(package) |
|
| 29 | 29 |
srpmFileName = package+"-"+version+"-"+release+".src.rpm" |
| 30 | 30 |
srpmFiles = cmdUtils.findFile(srpmFileName, constants.sourceRpmPath) |
| 31 | 31 |
srpmFile = None |
| ... | ... |
@@ -10,6 +10,7 @@ from PackageUtils import PackageUtils |
| 10 | 10 |
from ToolChainUtils import ToolChainUtils |
| 11 | 11 |
from Scheduler import Scheduler |
| 12 | 12 |
from ThreadPool import ThreadPool |
| 13 |
+from SpecData import SPECS |
|
| 13 | 14 |
|
| 14 | 15 |
class PackageManager(object): |
| 15 | 16 |
|
| ... | ... |
@@ -63,17 +64,17 @@ class PackageManager(object): |
| 63 | 63 |
pkgUtils = PackageUtils(self.logName,self.logPath) |
| 64 | 64 |
for rpmfile in listRPMFiles: |
| 65 | 65 |
package,version,release = pkgUtils.findPackageInfoFromRPMFile(rpmfile) |
| 66 |
- if constants.specData.isRPMPackage(package): |
|
| 67 |
- specVersion=constants.specData.getVersion(package) |
|
| 68 |
- specRelease=constants.specData.getRelease(package) |
|
| 66 |
+ if SPECS.getData().isRPMPackage(package): |
|
| 67 |
+ specVersion=SPECS.getData().getVersion(package) |
|
| 68 |
+ specRelease=SPECS.getData().getRelease(package) |
|
| 69 | 69 |
if version == specVersion and release == specRelease: |
| 70 | 70 |
listFoundRPMPackages.append(package) |
| 71 | 71 |
#Mark package available only if all sub packages are available |
| 72 | 72 |
for package in listFoundRPMPackages: |
| 73 |
- basePkg = constants.specData.getSpecName(package) |
|
| 73 |
+ basePkg = SPECS.getData().getSpecName(package) |
|
| 74 | 74 |
if basePkg in listAvailablePackages: |
| 75 | 75 |
continue; |
| 76 |
- listRPMPackages = constants.specData.getRPMPackages(basePkg) |
|
| 76 |
+ listRPMPackages = SPECS.getData().getRPMPackages(basePkg) |
|
| 77 | 77 |
packageIsAlreadyBuilt = True |
| 78 | 78 |
for rpmpkg in listRPMPackages: |
| 79 | 79 |
if rpmpkg not in listFoundRPMPackages: |
| ... | ... |
@@ -102,7 +103,7 @@ class PackageManager(object): |
| 102 | 102 |
updateBuiltRPMSList = True |
| 103 | 103 |
listOfPackagesAlreadyBuilt = self.listOfPackagesAlreadyBuilt[:] |
| 104 | 104 |
for pkg in listOfPackagesAlreadyBuilt: |
| 105 |
- listDependentRpmPackages = constants.specData.getRequiresAllForPackage(pkg) |
|
| 105 |
+ listDependentRpmPackages = SPECS.getData().getRequiresAllForPackage(pkg) |
|
| 106 | 106 |
needToRebuild = False |
| 107 | 107 |
for dependentPkg in listDependentRpmPackages: |
| 108 | 108 |
if dependentPkg not in self.listOfPackagesAlreadyBuilt: |
| ... | ... |
@@ -8,6 +8,7 @@ from time import sleep |
| 8 | 8 |
import PullSources |
| 9 | 9 |
import json |
| 10 | 10 |
import collections |
| 11 |
+from SpecData import SPECS |
|
| 11 | 12 |
|
| 12 | 13 |
class PackageUtils(object): |
| 13 | 14 |
|
| ... | ... |
@@ -110,7 +111,7 @@ class PackageUtils(object): |
| 110 | 110 |
def verifyShaAndGetSourcePath(self, source, package): |
| 111 | 111 |
cmdUtils = CommandUtils() |
| 112 | 112 |
# Fetch/verify sources if sha1 not None. |
| 113 |
- sha1 = constants.specData.getSHA1(package, source) |
|
| 113 |
+ sha1 = SPECS.getData().getSHA1(package, source) |
|
| 114 | 114 |
if sha1 is not None: |
| 115 | 115 |
PullSources.get(source, sha1, constants.sourcePath, constants.pullsourcesConfig, self.logger) |
| 116 | 116 |
|
| ... | ... |
@@ -171,10 +172,10 @@ class PackageUtils(object): |
| 171 | 171 |
def buildRPMSForGivenPackage(self,package,chrootID,listBuildOptionPackages,pkgBuildOptionFile,destLogPath=None): |
| 172 | 172 |
self.logger.info("Building rpm's for package:"+package)
|
| 173 | 173 |
|
| 174 |
- listSourcesFiles = constants.specData.getSources(package) |
|
| 175 |
- listPatchFiles = constants.specData.getPatches(package) |
|
| 176 |
- specFile = constants.specData.getSpecFile(package) |
|
| 177 |
- specName = constants.specData.getSpecName(package) + ".spec" |
|
| 174 |
+ listSourcesFiles = SPECS.getData().getSources(package) |
|
| 175 |
+ listPatchFiles = SPECS.getData().getPatches(package) |
|
| 176 |
+ specFile = SPECS.getData().getSpecFile(package) |
|
| 177 |
+ specName = SPECS.getData().getSpecName(package) + ".spec" |
|
| 178 | 178 |
|
| 179 | 179 |
chrootSourcePath=chrootID+constants.topDirPath+"/SOURCES/" |
| 180 | 180 |
chrootSpecPath=constants.topDirPath+"/SPECS/" |
| ... | ... |
@@ -193,7 +194,7 @@ class PackageUtils(object): |
| 193 | 193 |
self.copyAdditionalBuildFiles(listAdditionalFiles,chrootID) |
| 194 | 194 |
|
| 195 | 195 |
#Adding rpm macros |
| 196 |
- listRPMMacros = constants.specData.getRPMMacros() |
|
| 196 |
+ listRPMMacros = SPECS.getData().getRPMMacros() |
|
| 197 | 197 |
for macroName in listRPMMacros.keys(): |
| 198 | 198 |
macros.append(macroName+" "+listRPMMacros[macroName]) |
| 199 | 199 |
|
| ... | ... |
@@ -207,7 +208,7 @@ class PackageUtils(object): |
| 207 | 207 |
raise e |
| 208 | 208 |
finally: |
| 209 | 209 |
if destLogPath is not None: |
| 210 |
- if constants.rpmCheck and package in constants.testForceRPMS and constants.specData.isCheckAvailable(package): |
|
| 210 |
+ if constants.rpmCheck and package in constants.testForceRPMS and SPECS.getData().isCheckAvailable(package): |
|
| 211 | 211 |
cmd="sed -i '/^Executing(%check):/,/^Processing files:/{//!b};d' "+ chrootLogsFilePath
|
| 212 | 212 |
logFile = destLogPath+"/adjustTestFile.log" |
| 213 | 213 |
returnVal = CommandUtils().runCommandInShell(cmd, logFile) |
| ... | ... |
@@ -230,7 +231,7 @@ class PackageUtils(object): |
| 230 | 230 |
|
| 231 | 231 |
if constants.rpmCheck and package in constants.testForceRPMS: |
| 232 | 232 |
self.logger.info("#"*(68+2*len(package)))
|
| 233 |
- if not constants.specData.isCheckAvailable(package): |
|
| 233 |
+ if not SPECS.getData().isCheckAvailable(package): |
|
| 234 | 234 |
self.logger.info("####### "+package+" MakeCheck is not available. Skipping MakeCheck TEST for "+package+ " #######")
|
| 235 | 235 |
rpmBuildcmd=self.rpmbuildBinary+" --clean" |
| 236 | 236 |
else: |
| ... | ... |
@@ -249,7 +250,7 @@ class PackageUtils(object): |
| 249 | 249 |
self.logger.info(rpmBuildcmd) |
| 250 | 250 |
returnVal = cmdUtils.runCommandInShell(rpmBuildcmd, logFile, chrootCmd) |
| 251 | 251 |
if constants.rpmCheck and package in constants.testForceRPMS: |
| 252 |
- if not constants.specData.isCheckAvailable(package): |
|
| 252 |
+ if not SPECS.getData().isCheckAvailable(package): |
|
| 253 | 253 |
constants.testLogger.info(package+" : N/A") |
| 254 | 254 |
elif returnVal: |
| 255 | 255 |
constants.testLogger.info(package+" : PASS") |
| ... | ... |
@@ -282,8 +283,8 @@ class PackageUtils(object): |
| 282 | 282 |
|
| 283 | 283 |
def findRPMFileForGivenPackage(self,package): |
| 284 | 284 |
cmdUtils = CommandUtils() |
| 285 |
- version = constants.specData.getVersion(package) |
|
| 286 |
- release = constants.specData.getRelease(package) |
|
| 285 |
+ version = SPECS.getData().getVersion(package) |
|
| 286 |
+ release = SPECS.getData().getRelease(package) |
|
| 287 | 287 |
listFoundRPMFiles = sum([cmdUtils.findFile(package+"-"+version+"-"+release+".x86_64.rpm",constants.rpmPath), |
| 288 | 288 |
cmdUtils.findFile(package+"-"+version+"-"+release+".noarch.rpm",constants.rpmPath)], []) |
| 289 | 289 |
if constants.inputRPMSPath is not None: |
| ... | ... |
@@ -337,7 +338,7 @@ class PackageUtils(object): |
| 337 | 337 |
return result |
| 338 | 338 |
|
| 339 | 339 |
def adjustGCCSpecs(self, package, chrootID, logPath): |
| 340 |
- opt = " " + constants.specData.getSecurityHardeningOption(package) |
|
| 340 |
+ opt = " " + SPECS.getData().getSecurityHardeningOption(package) |
|
| 341 | 341 |
cmdUtils=CommandUtils() |
| 342 | 342 |
cpcmd="cp "+ self.adjustGCCSpecScript+" "+chrootID+"/tmp/"+self.adjustGCCSpecScript |
| 343 | 343 |
cmd = "/tmp/"+self.adjustGCCSpecScript+opt |
| ... | ... |
@@ -492,7 +493,7 @@ class PackageUtils(object): |
| 492 | 492 |
return result |
| 493 | 493 |
|
| 494 | 494 |
def adjustGCCSpecsInContainer(self, package, containerID, logPath): |
| 495 |
- opt = " " + constants.specData.getSecurityHardeningOption(package) |
|
| 495 |
+ opt = " " + SPECS.getData().getSecurityHardeningOption(package) |
|
| 496 | 496 |
adjustCmd = "/" + self.adjustGCCSpecScript + opt |
| 497 | 497 |
adjustCmd = "/bin/bash -l -c '" + adjustCmd + "'" |
| 498 | 498 |
logFile = logPath + "/adjustGCCSpecScript.log" |
| ... | ... |
@@ -515,10 +516,10 @@ class PackageUtils(object): |
| 515 | 515 |
pkgBuildOptionFile, destLogPath=None): |
| 516 | 516 |
self.logger.info("Building rpm's for package " + package + " in container " + containerID.short_id)
|
| 517 | 517 |
|
| 518 |
- listSourcesFiles = constants.specData.getSources(package) |
|
| 519 |
- listPatchFiles = constants.specData.getPatches(package) |
|
| 520 |
- specFile = constants.specData.getSpecFile(package) |
|
| 521 |
- specName = constants.specData.getSpecName(package) + ".spec" |
|
| 518 |
+ listSourcesFiles = SPECS.getData().getSources(package) |
|
| 519 |
+ listPatchFiles = SPECS.getData().getPatches(package) |
|
| 520 |
+ specFile = SPECS.getData().getSpecFile(package) |
|
| 521 |
+ specName = SPECS.getData().getSpecName(package) + ".spec" |
|
| 522 | 522 |
sourcePath = constants.topDirPath + "/SOURCES/" |
| 523 | 523 |
specPath = constants.topDirPath + "/SPECS/" |
| 524 | 524 |
rpmLogFile = constants.topDirPath + "/LOGS/" + package + ".log" |
| ... | ... |
@@ -545,7 +546,7 @@ class PackageUtils(object): |
| 545 | 545 |
self.copyAdditionalBuildFilesToContainer(listAdditionalFiles, containerID) |
| 546 | 546 |
|
| 547 | 547 |
# Add rpm macros |
| 548 |
- listRPMMacros = constants.specData.getRPMMacros() |
|
| 548 |
+ listRPMMacros = SPECS.getData().getRPMMacros() |
|
| 549 | 549 |
for macroName in listRPMMacros.keys(): |
| 550 | 550 |
macros.append(macroName + " " + listRPMMacros[macroName]) |
| 551 | 551 |
|
| ... | ... |
@@ -567,7 +568,7 @@ class PackageUtils(object): |
| 567 | 567 |
finally: |
| 568 | 568 |
if destLogPath is not None: |
| 569 | 569 |
rpmLog = destLogPath + "/" + package + ".log" |
| 570 |
- if constants.rpmCheck and package in constants.testForceRPMS and constants.specData.isCheckAvailable(package): |
|
| 570 |
+ if constants.rpmCheck and package in constants.testForceRPMS and SPECS.getData().isCheckAvailable(package): |
|
| 571 | 571 |
cmd="sed -i '/^Executing(%check):/,/^Processing files:/{//!b};d' "+ rpmLog
|
| 572 | 572 |
logFile = destLogPath+"/adjustTestFile.log" |
| 573 | 573 |
returnVal = CommandUtils().runCommandInShell(cmd, logFile) |
| ... | ... |
@@ -600,7 +601,7 @@ class PackageUtils(object): |
| 600 | 600 |
|
| 601 | 601 |
if constants.rpmCheck and package in constants.testForceRPMS: |
| 602 | 602 |
self.logger.info("#"*(68+2*len(package)))
|
| 603 |
- if not constants.specData.isCheckAvailable(package): |
|
| 603 |
+ if not SPECS.getData().isCheckAvailable(package): |
|
| 604 | 604 |
self.logger.info("####### "+package+" MakeCheck is not available. Skipping MakeCheck TEST for "+package+ " #######")
|
| 605 | 605 |
rpmBuildCmd=self.rpmbuildBinary+" --clean" |
| 606 | 606 |
else: |
| ... | ... |
@@ -628,7 +629,7 @@ class PackageUtils(object): |
| 628 | 628 |
raise Exception("RPM Build failed")
|
| 629 | 629 |
|
| 630 | 630 |
if constants.rpmCheck and package in constants.testForceRPMS: |
| 631 |
- if not constants.specData.isCheckAvailable(package): |
|
| 631 |
+ if not SPECS.getData().isCheckAvailable(package): |
|
| 632 | 632 |
constants.testLogger.info(package+" : N/A") |
| 633 | 633 |
elif returnVal: |
| 634 | 634 |
constants.testLogger.info(package+" : PASS") |
| 635 | 635 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,14 @@ |
| 0 |
+import commands |
|
| 1 |
+ |
|
| 2 |
+class RepoQueryDependency(object): |
|
| 3 |
+ def __init__(self, repoFile): |
|
| 4 |
+ self.repo_file = repoFile |
|
| 5 |
+ def getRequiresList(self,pkg): |
|
| 6 |
+ cmd = "repoquery -c "+self.repo_file+" -R -q "+pkg+" | xargs repoquery -c "+self.repo_file+" --whatprovides -q | sed 's/-[0-9]/ /g' | cut -f 1 -d ' ' | sort | uniq " |
|
| 7 |
+ status,output = commands.getstatusoutput(cmd) |
|
| 8 |
+ if status == 0: |
|
| 9 |
+ outList = output.split('\n')
|
|
| 10 |
+ if "" in outList: outList.remove("")
|
|
| 11 |
+ if "Options:" in outList: outList.remove("Options:")
|
|
| 12 |
+ if "Usage:" in outList: outList.remove("Usage:")
|
|
| 13 |
+ return outList |
| ... | ... |
@@ -4,6 +4,7 @@ from constants import constants |
| 4 | 4 |
from Logger import Logger |
| 5 | 5 |
import threading |
| 6 | 6 |
from Queue import PriorityQueue |
| 7 |
+from SpecData import SPECS |
|
| 7 | 8 |
|
| 8 | 9 |
class Scheduler(object): |
| 9 | 10 |
|
| ... | ... |
@@ -34,12 +35,12 @@ class Scheduler(object): |
| 34 | 34 |
@staticmethod |
| 35 | 35 |
def getBuildRequiredPackages(package): |
| 36 | 36 |
listRequiredRPMPackages = [] |
| 37 |
- listRequiredRPMPackages.extend(constants.specData.getBuildRequiresForPackage(package)) |
|
| 37 |
+ listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPackage(package)) |
|
| 38 | 38 |
|
| 39 | 39 |
listRequiredPackages = [] |
| 40 | 40 |
|
| 41 | 41 |
for pkg in listRequiredRPMPackages: |
| 42 |
- basePkg = constants.specData.getSpecName(pkg) |
|
| 42 |
+ basePkg = SPECS.getData().getSpecName(pkg) |
|
| 43 | 43 |
if basePkg not in listRequiredPackages: |
| 44 | 44 |
listRequiredPackages.append(basePkg) |
| 45 | 45 |
|
| ... | ... |
@@ -148,13 +149,13 @@ class Scheduler(object): |
| 148 | 148 |
@staticmethod |
| 149 | 149 |
def getRequiredPackages(package): |
| 150 | 150 |
listRequiredRPMPackages=[] |
| 151 |
- listRequiredRPMPackages.extend(constants.specData.getBuildRequiresForPackage(package)) |
|
| 152 |
- listRequiredRPMPackages.extend(constants.specData.getRequiresAllForPackage(package)) |
|
| 151 |
+ listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPackage(package)) |
|
| 152 |
+ listRequiredRPMPackages.extend(SPECS.getData().getRequiresAllForPackage(package)) |
|
| 153 | 153 |
|
| 154 | 154 |
listRequiredPackages=[] |
| 155 | 155 |
|
| 156 | 156 |
for pkg in listRequiredRPMPackages: |
| 157 |
- basePkg=constants.specData.getSpecName(pkg) |
|
| 157 |
+ basePkg=SPECS.getData().getSpecName(pkg) |
|
| 158 | 158 |
if basePkg not in listRequiredPackages: |
| 159 | 159 |
listRequiredPackages.append(basePkg) |
| 160 | 160 |
|
| ... | ... |
@@ -2,6 +2,10 @@ from SpecUtils import Specutils |
| 2 | 2 |
import os |
| 3 | 3 |
from Logger import Logger |
| 4 | 4 |
from distutils.version import StrictVersion |
| 5 |
+import Queue |
|
| 6 |
+import json |
|
| 7 |
+import operator |
|
| 8 |
+from constants import constants |
|
| 5 | 9 |
|
| 6 | 10 |
class SerializableSpecObject(object): |
| 7 | 11 |
def __init__(self): |
| ... | ... |
@@ -266,3 +270,322 @@ class SerializableSpecObjectsUtils(object): |
| 266 | 266 |
self.logger.info("security_hardening: " + specObj.securityHardening)
|
| 267 | 267 |
self.logger.info("------------------------------------------------")
|
| 268 | 268 |
|
| 269 |
+class SPECS(object): |
|
| 270 |
+ __instance = None |
|
| 271 |
+ specData = None |
|
| 272 |
+ |
|
| 273 |
+ @staticmethod |
|
| 274 |
+ def getData(): |
|
| 275 |
+ """ Static access method. """ |
|
| 276 |
+ if SPECS.__instance == None: |
|
| 277 |
+ SPECS() |
|
| 278 |
+ return SPECS.__instance.specData |
|
| 279 |
+ |
|
| 280 |
+ def __init__(self): |
|
| 281 |
+ """ Virtually private constructor. """ |
|
| 282 |
+ if SPECS.__instance != None: |
|
| 283 |
+ raise Exception("This class is a singleton!")
|
|
| 284 |
+ else: |
|
| 285 |
+ SPECS.__instance = self |
|
| 286 |
+ self.initialize() |
|
| 287 |
+ |
|
| 288 |
+ def initialize(self): |
|
| 289 |
+ self.specData = SerializableSpecObjectsUtils(constants.logPath) |
|
| 290 |
+ self.specData.readSpecsAndConvertToSerializableObjects(constants.specPath) |
|
| 291 |
+ |
|
| 292 |
+ #adding distribution rpm macro |
|
| 293 |
+ self.specData.addMacro("dist",constants.dist)
|
|
| 294 |
+ |
|
| 295 |
+ #adding buildnumber rpm macro |
|
| 296 |
+ self.specData.addMacro("photon_build_number",constants.buildNumber)
|
|
| 297 |
+ |
|
| 298 |
+ #adding releasenumber rpm macro |
|
| 299 |
+ self.specData.addMacro("photon_release_version",constants.releaseVersion)
|
|
| 300 |
+ |
|
| 301 |
+ #adding kernelversion rpm macro |
|
| 302 |
+ kernelversion = self.specData.getVersion("linux")
|
|
| 303 |
+ self.specData.addMacro("KERNEL_VERSION",kernelversion)
|
|
| 304 |
+ |
|
| 305 |
+ #adding openjre8 version rpm macro |
|
| 306 |
+ java8version = self.specData.getVersion("openjre8")
|
|
| 307 |
+ self.specData.addMacro("JAVA8_VERSION",java8version)
|
|
| 308 |
+ |
|
| 309 |
+ #adding kernelrelease rpm macro |
|
| 310 |
+ kernelrelease = self.specData.getRelease("linux")
|
|
| 311 |
+ self.specData.addMacro("KERNEL_RELEASE",kernelrelease)
|
|
| 312 |
+ |
|
| 313 |
+ #adding kernelsubrelease rpm macro |
|
| 314 |
+ a,b,c = kernelversion.split(".")
|
|
| 315 |
+ kernelsubrelease = '%02d%02d%03d%03d' % (int(a),int(b),int(c),int(kernelrelease.replace(constants.dist,""))) |
|
| 316 |
+ if kernelsubrelease: |
|
| 317 |
+ kernelsubrelease = "."+kernelsubrelease |
|
| 318 |
+ self.specData.addMacro("kernelsubrelease",kernelsubrelease)
|
|
| 319 |
+ |
|
| 320 |
+ #adding check rpm macro |
|
| 321 |
+ if constants.rpmCheck: |
|
| 322 |
+ self.specData.addMacro("with_check","1")
|
|
| 323 |
+ else: |
|
| 324 |
+ self.specData.addMacro("with_check","0")
|
|
| 325 |
+ |
|
| 326 |
+ |
|
| 327 |
+ |
|
| 328 |
+# Little bit of duplication |
|
| 329 |
+# Used by SpecVerify and SpecDeps only |
|
| 330 |
+class SerializedSpecObjects(object): |
|
| 331 |
+ |
|
| 332 |
+ def __init__(self, inputDataDir, stageDir): |
|
| 333 |
+ self.mapSerializableSpecObjects={}
|
|
| 334 |
+ self.mapPackageToSpec={}
|
|
| 335 |
+ self.jsonFilesOutPath = stageDir + "/common/data/" |
|
| 336 |
+ self.inputDataDir = inputDataDir |
|
| 337 |
+ |
|
| 338 |
+ def findTotalRequires(self, allDeps, depQue, parent, displayOption): |
|
| 339 |
+ while not depQue.empty(): |
|
| 340 |
+ specPkg = depQue.get() |
|
| 341 |
+ specName = self.getSpecName(specPkg) |
|
| 342 |
+ if specName is None: |
|
| 343 |
+ print specPkg + " is missing" |
|
| 344 |
+ specObj = self.mapSerializableSpecObjects[specName] |
|
| 345 |
+ for depPkg in specObj.installRequiresPackages[specPkg]: |
|
| 346 |
+ if True == allDeps.has_key(depPkg): |
|
| 347 |
+ if(allDeps[depPkg] < allDeps[specPkg] + 1): |
|
| 348 |
+ allDeps[depPkg] = allDeps[specPkg] + 1 |
|
| 349 |
+ parent[depPkg] = specPkg |
|
| 350 |
+ self.updateLevels(allDeps, depPkg, parent, allDeps[depPkg]) |
|
| 351 |
+ else: |
|
| 352 |
+ allDeps[depPkg] = allDeps[specPkg] + 1 |
|
| 353 |
+ parent[depPkg] = specPkg |
|
| 354 |
+ depQue.put(depPkg) |
|
| 355 |
+ |
|
| 356 |
+ def findTotalWhoNeedsToBuild(self, depQue, whoBuildDeps, whoBuildDepSet, displayOption): |
|
| 357 |
+ while not depQue.empty(): |
|
| 358 |
+ specPkg = depQue.get() |
|
| 359 |
+ specName = self.getSpecName(specPkg) |
|
| 360 |
+ spec=Specutils(self.getSpecFile(specPkg)) |
|
| 361 |
+ RPMName=spec.getRPMName(specPkg) |
|
| 362 |
+ debuginfoRPMName=spec.getDebuginfoRPMName(specPkg) |
|
| 363 |
+ whoBuildDepSet.add(RPMName) |
|
| 364 |
+ whoBuildDepSet.add(debuginfoRPMName) |
|
| 365 |
+ if specName is None: |
|
| 366 |
+ print specPkg + " is missing" |
|
| 367 |
+ if not whoBuildDeps.has_key(specPkg): |
|
| 368 |
+ continue |
|
| 369 |
+ for depPkg in whoBuildDeps[specPkg]: |
|
| 370 |
+ depQue.put(depPkg) |
|
| 371 |
+ |
|
| 372 |
+ def printTree(self, allDeps, children, curParent , depth): |
|
| 373 |
+ if (children.has_key(curParent)): |
|
| 374 |
+ for child in children[curParent]: |
|
| 375 |
+ print "\t" * depth, child |
|
| 376 |
+ self.printTree(allDeps, children, child, depth+1) |
|
| 377 |
+ |
|
| 378 |
+ def get_all_package_names(self, jsonFilePath): |
|
| 379 |
+ base_path = os.path.dirname(jsonFilePath) |
|
| 380 |
+ jsonData = open(jsonFilePath) |
|
| 381 |
+ option_list_json = json.load(jsonData) |
|
| 382 |
+ jsonData.close() |
|
| 383 |
+ packages = option_list_json["packages"] |
|
| 384 |
+ return packages |
|
| 385 |
+ |
|
| 386 |
+ def updateLevels(self, allDeps, inPkg, parent, level): |
|
| 387 |
+ specName = self.getSpecName(inPkg) |
|
| 388 |
+ specObj = self.mapSerializableSpecObjects[specName] |
|
| 389 |
+ for depPkg in specObj.installRequiresPackages[inPkg]: |
|
| 390 |
+ if (allDeps.has_key(depPkg) and allDeps[depPkg] < level + 1): |
|
| 391 |
+ allDeps[depPkg] = level + 1 |
|
| 392 |
+ parent[depPkg] = inPkg |
|
| 393 |
+ self.updateLevels(allDeps, depPkg, parent, allDeps[depPkg]) |
|
| 394 |
+ |
|
| 395 |
+ def readSpecsAndConvertToSerializableObjects(self, specFilesPath, inputType, inputValue, displayOption): |
|
| 396 |
+ children = {}
|
|
| 397 |
+ listSpecFiles=[] |
|
| 398 |
+ whoNeedsList=[] |
|
| 399 |
+ whoBuildDepSet= set() |
|
| 400 |
+ independentRPMS=[] # list of all RPMS not built from photon and that must be blindly copied. |
|
| 401 |
+ whoBuildDeps = {}
|
|
| 402 |
+ allDeps={}
|
|
| 403 |
+ parent={}
|
|
| 404 |
+ depQue = Queue.Queue() |
|
| 405 |
+ packageFound = False |
|
| 406 |
+ self.getListSpecFiles(listSpecFiles,specFilesPath) |
|
| 407 |
+ for specFile in listSpecFiles: |
|
| 408 |
+ spec=Specutils(specFile) |
|
| 409 |
+ specName=spec.getBasePackageName() |
|
| 410 |
+ specObj=SerializableSpecObject() |
|
| 411 |
+ specObj.name=specName |
|
| 412 |
+ specObj.buildRequirePackages=spec.getBuildRequiresAllPackages() |
|
| 413 |
+ specObj.installRequiresAllPackages=spec.getRequiresAllPackages() |
|
| 414 |
+ specObj.listPackages=spec.getPackageNames() |
|
| 415 |
+ specObj.specFile=specFile |
|
| 416 |
+ specObj.version=spec.getVersion() |
|
| 417 |
+ specObj.release=spec.getRelease() |
|
| 418 |
+ specObj.listSources=spec.getSourceNames() |
|
| 419 |
+ specObj.listPatches=spec.getPatchNames() |
|
| 420 |
+ specObj.securityHardening=spec.getSecurityHardeningOption() |
|
| 421 |
+ for specPkg in specObj.listPackages: |
|
| 422 |
+ specObj.installRequiresPackages[specPkg]=spec.getRequires(specPkg) |
|
| 423 |
+ if (inputType == "pkg" and inputValue == specPkg): # all the first level dependencies to a dictionary and queue |
|
| 424 |
+ packageFound = True |
|
| 425 |
+ for depPkg in specObj.installRequiresPackages[specPkg]: |
|
| 426 |
+ if False == allDeps.has_key(depPkg): |
|
| 427 |
+ allDeps[depPkg] = 0 |
|
| 428 |
+ parent[depPkg] = "" |
|
| 429 |
+ depQue.put(depPkg) |
|
| 430 |
+ elif (inputType == "who-needs" and (inputValue in specObj.installRequiresPackages[specPkg])): |
|
| 431 |
+ whoNeedsList.append(specPkg) |
|
| 432 |
+ elif (inputType == "who-needs-build"): |
|
| 433 |
+ for bdrq in specObj.buildRequirePackages: |
|
| 434 |
+ if (whoBuildDeps.has_key(bdrq)): |
|
| 435 |
+ whoBuildDeps[bdrq].add(specPkg) |
|
| 436 |
+ else: |
|
| 437 |
+ whoBuildDeps[bdrq] = set() |
|
| 438 |
+ whoBuildDeps[bdrq].add(specPkg) |
|
| 439 |
+ if(inputValue == specPkg): |
|
| 440 |
+ packageFound = True |
|
| 441 |
+ for depPkg in specObj.listPackages: |
|
| 442 |
+ depQue.put(depPkg) |
|
| 443 |
+ |
|
| 444 |
+ self.mapPackageToSpec[specPkg]=specName |
|
| 445 |
+ self.mapSerializableSpecObjects[specName]=specObj |
|
| 446 |
+ |
|
| 447 |
+ # Generate dependencies for individual packages |
|
| 448 |
+ if (inputType == "pkg"): |
|
| 449 |
+ if (packageFound == True): |
|
| 450 |
+ self.findTotalRequires(allDeps, depQue, parent, displayOption) |
|
| 451 |
+ else: |
|
| 452 |
+ print "No spec file builds a package named",inputValue |
|
| 453 |
+ return |
|
| 454 |
+ |
|
| 455 |
+ # Generate dependencies for all packages in the given JSON input file |
|
| 456 |
+ elif (inputType == "json"): |
|
| 457 |
+ filePath = self.inputDataDir +"/"+ inputValue |
|
| 458 |
+ data = self.get_all_package_names(filePath) |
|
| 459 |
+ for pkg in data: |
|
| 460 |
+ if False == allDeps.has_key(pkg): |
|
| 461 |
+ spName = self.getSpecName(pkg) |
|
| 462 |
+ if(spName != None): |
|
| 463 |
+ allDeps[pkg] = 0 |
|
| 464 |
+ parent[pkg] = "" |
|
| 465 |
+ depQue.put(pkg) |
|
| 466 |
+ self.findTotalRequires(allDeps, depQue, parent, displayOption) |
|
| 467 |
+ else: |
|
| 468 |
+ independentRPMS.append(pkg); |
|
| 469 |
+ |
|
| 470 |
+ #Generating the list of packages that requires the given input package at install time |
|
| 471 |
+ elif (inputType == "who-needs"): |
|
| 472 |
+ print whoNeedsList |
|
| 473 |
+ return |
|
| 474 |
+ |
|
| 475 |
+ #Generating the list of packages that the modified package will affect at build time |
|
| 476 |
+ elif (inputType == "who-needs-build"): |
|
| 477 |
+ if (packageFound == True): |
|
| 478 |
+ self.findTotalWhoNeedsToBuild(depQue, whoBuildDeps, whoBuildDepSet, displayOption) |
|
| 479 |
+ print whoBuildDepSet |
|
| 480 |
+ else: |
|
| 481 |
+ print "No spec file builds a package named", inputValue |
|
| 482 |
+ return |
|
| 483 |
+ |
|
| 484 |
+ # construct the sorted list of all packages (sorted by dependency) |
|
| 485 |
+ sortedList = [] |
|
| 486 |
+ for elem in sorted(allDeps.items(), key=operator.itemgetter(1), reverse=True): |
|
| 487 |
+ sortedList.append(elem[0]) |
|
| 488 |
+ sortedList.extend(independentRPMS) |
|
| 489 |
+ |
|
| 490 |
+ # construct all children nodes |
|
| 491 |
+ if (displayOption == "tree"): |
|
| 492 |
+ for k, v in parent.iteritems(): |
|
| 493 |
+ children.setdefault(v, []).append(k) |
|
| 494 |
+ if(inputType == "json"): |
|
| 495 |
+ print "Dependency Mappings for", inputValue, ":", "\n----------------------------------------------------",children |
|
| 496 |
+ print "----------------------------------------------------" |
|
| 497 |
+ if (children.has_key("")):
|
|
| 498 |
+ for child in children[""]: |
|
| 499 |
+ print child |
|
| 500 |
+ self.printTree(allDeps, children, child, 1) |
|
| 501 |
+ for pkg in independentRPMS: |
|
| 502 |
+ print pkg |
|
| 503 |
+ print "******************",len(sortedList), "packages in total ******************" |
|
| 504 |
+ else: |
|
| 505 |
+ if (inputType == "pkg" and len(children) > 0): |
|
| 506 |
+ print "cyclic dependency detected, mappings: \n",children |
|
| 507 |
+ |
|
| 508 |
+ # To display a flat list of all packages |
|
| 509 |
+ elif(displayOption == "list"): |
|
| 510 |
+ print sortedList |
|
| 511 |
+ |
|
| 512 |
+ # To generate a new JSON file based on given input json file |
|
| 513 |
+ elif(displayOption == "json" and inputType == "json"): |
|
| 514 |
+ d = {}
|
|
| 515 |
+ d['packages'] = sortedList |
|
| 516 |
+ outFilePath = self.jsonFilesOutPath + inputValue |
|
| 517 |
+ with open(outFilePath, 'wb') as outfile: |
|
| 518 |
+ json.dump(d, outfile) |
|
| 519 |
+ return sortedList |
|
| 520 |
+ |
|
| 521 |
+ def getListSpecFiles(self,listSpecFiles,path): |
|
| 522 |
+ for dirEntry in os.listdir(path): |
|
| 523 |
+ dirEntryPath = os.path.join(path, dirEntry) |
|
| 524 |
+ if os.path.isfile(dirEntryPath) and dirEntryPath.endswith(".spec"):
|
|
| 525 |
+ listSpecFiles.append(dirEntryPath) |
|
| 526 |
+ elif os.path.isdir(dirEntryPath): |
|
| 527 |
+ self.getListSpecFiles(listSpecFiles,dirEntryPath) |
|
| 528 |
+ |
|
| 529 |
+ def getBuildRequiresForPackage(self, package): |
|
| 530 |
+ specName=self.getSpecName(package) |
|
| 531 |
+ return self.mapSerializableSpecObjects[specName].buildRequirePackages |
|
| 532 |
+ |
|
| 533 |
+ def getRequiresForPackage(self, package): |
|
| 534 |
+ specName=self.getSpecName(package) |
|
| 535 |
+ if self.mapSerializableSpecObjects[specName].installRequiresPackages.has_key(package): |
|
| 536 |
+ return self.mapSerializableSpecObjects[specName].installRequiresPackages[package] |
|
| 537 |
+ return None |
|
| 538 |
+ |
|
| 539 |
+ def getRelease(self, package): |
|
| 540 |
+ specName=self.getSpecName(package) |
|
| 541 |
+ return self.mapSerializableSpecObjects[specName].release |
|
| 542 |
+ |
|
| 543 |
+ def getVersion(self, package): |
|
| 544 |
+ specName=self.getSpecName(package) |
|
| 545 |
+ return self.mapSerializableSpecObjects[specName].version |
|
| 546 |
+ |
|
| 547 |
+ def getSpecFile(self, package): |
|
| 548 |
+ specName=self.getSpecName(package) |
|
| 549 |
+ return self.mapSerializableSpecObjects[specName].specFile |
|
| 550 |
+ |
|
| 551 |
+ def getPatches(self, package): |
|
| 552 |
+ specName=self.getSpecName(package) |
|
| 553 |
+ return self.mapSerializableSpecObjects[specName].listPatches |
|
| 554 |
+ |
|
| 555 |
+ def getSources(self, package): |
|
| 556 |
+ specName=self.getSpecName(package) |
|
| 557 |
+ return self.mapSerializableSpecObjects[specName].listSources |
|
| 558 |
+ |
|
| 559 |
+ def getPackages(self, package): |
|
| 560 |
+ specName=self.getSpecName(package) |
|
| 561 |
+ return self.mapSerializableSpecObjects[specName].listPackages |
|
| 562 |
+ |
|
| 563 |
+ def getSpecName(self,package): |
|
| 564 |
+ if self.mapPackageToSpec.has_key(package): |
|
| 565 |
+ specName=self.mapPackageToSpec[package] |
|
| 566 |
+ if self.mapSerializableSpecObjects.has_key(specName): |
|
| 567 |
+ return specName |
|
| 568 |
+ else: |
|
| 569 |
+ print "SpecDeps: Could not able to find " + package + " package from specs" |
|
| 570 |
+ raise Exception("Invalid package:" + package)
|
|
| 571 |
+ else: |
|
| 572 |
+ return None |
|
| 573 |
+ |
|
| 574 |
+ def isRPMPackage(self,package): |
|
| 575 |
+ if self.mapPackageToSpec.has_key(package): |
|
| 576 |
+ specName=self.mapPackageToSpec[package] |
|
| 577 |
+ if self.mapSerializableSpecObjects.has_key(specName): |
|
| 578 |
+ return True |
|
| 579 |
+ return False |
|
| 580 |
+ |
|
| 581 |
+ def getSecurityHardeningOption(self, package): |
|
| 582 |
+ specName=self.getSpecName(package) |
|
| 583 |
+ return self.mapSerializableSpecObjects[specName].securityHardening |
|
| 584 |
+ |
|
| 585 |
+ def getSpecDetails(self, name): |
|
| 586 |
+ print self.mapSerializableSpecObjects[name].installRequiresAllPackages |
|
| 587 |
+ |
| 269 | 588 |
new file mode 100755 |
| ... | ... |
@@ -0,0 +1,57 @@ |
| 0 |
+#! /usr/bin/python2 |
|
| 1 |
+# |
|
| 2 |
+# Copyright (C) 2015 vmware inc. |
|
| 3 |
+# |
|
| 4 |
+# Author: Harish Udaiya Kumar <hudaiyakumar@vmware.com> |
|
| 5 |
+from SpecUtils import Specutils |
|
| 6 |
+from SpecData import SerializableSpecObject |
|
| 7 |
+from SpecData import SerializedSpecObjects |
|
| 8 |
+import sys |
|
| 9 |
+import os |
|
| 10 |
+from optparse import OptionParser |
|
| 11 |
+from jsonwrapper import JsonWrapper |
|
| 12 |
+ |
|
| 13 |
+DEFAULT_INPUT_TYPE = "pkg" |
|
| 14 |
+DEFAULT_DISPLAY_OPTION = "tree" |
|
| 15 |
+SPEC_FILE_DIR = "../../SPECS" |
|
| 16 |
+LOG_FILE_DIR = "../../stage/LOGS" |
|
| 17 |
+ |
|
| 18 |
+ |
|
| 19 |
+def main(): |
|
| 20 |
+ usage = os.path.basename(__file__) + "--input-type=[json/pkg/who-needs/who-needs-build] --pkg=[pkg_name] --file=<JSON_FILE_NAME> --disp=[tree/list/json]" |
|
| 21 |
+ parser = OptionParser(usage) |
|
| 22 |
+ parser.add_option("-i", "--input-type", dest="input_type", default=DEFAULT_INPUT_TYPE)
|
|
| 23 |
+ parser.add_option("-p", "--pkg", dest="pkg")
|
|
| 24 |
+ parser.add_option("-f", "--file", dest="json_file", default="packages_minimal.json")
|
|
| 25 |
+ parser.add_option("-d", "--disp", dest="display_option", default=DEFAULT_DISPLAY_OPTION)
|
|
| 26 |
+ parser.add_option("-s", "--spec-dir", dest="spec_dir", default=SPEC_FILE_DIR)
|
|
| 27 |
+ parser.add_option("-t", "--stage-dir", dest="stage_dir", default="../../stage")
|
|
| 28 |
+ parser.add_option("-a", "--input-data-dir", dest="input_data_dir", default="../../common/data/")
|
|
| 29 |
+ (options, args) = parser.parse_args() |
|
| 30 |
+ |
|
| 31 |
+ if(False == options.input_data_dir.endswith('/')):
|
|
| 32 |
+ options.input_data_dir += '/' |
|
| 33 |
+ |
|
| 34 |
+ specDeps = SerializedSpecObjects(options.input_data_dir, options.stage_dir) |
|
| 35 |
+ displayOption = options.display_option |
|
| 36 |
+ abs_path = os.path.abspath(__file__) |
|
| 37 |
+ dir_name = os.path.dirname(abs_path) |
|
| 38 |
+ os.chdir(dir_name) |
|
| 39 |
+ |
|
| 40 |
+ # To display/print package dependencies on console |
|
| 41 |
+ if(options.input_type == "pkg" or options.input_type == "who-needs" or options.input_type == "who-needs-build"): |
|
| 42 |
+ targetName = options.pkg |
|
| 43 |
+ specDeps.readSpecsAndConvertToSerializableObjects(options.spec_dir, options.input_type, targetName, displayOption) |
|
| 44 |
+ elif(options.input_type == "json"):# Generate the expanded package dependencies json file based on package_list_file |
|
| 45 |
+ json_wrapper_option_list = JsonWrapper(options.json_file) |
|
| 46 |
+ option_list_json = json_wrapper_option_list.read() |
|
| 47 |
+ options_sorted = option_list_json.items() |
|
| 48 |
+ for install_option in options_sorted: |
|
| 49 |
+ if displayOption == "tree" and install_option[1]["title"] == "ISO Packages": |
|
| 50 |
+ continue |
|
| 51 |
+ specDeps.readSpecsAndConvertToSerializableObjects(options.spec_dir, options.input_type, install_option[1]["file"], displayOption) |
|
| 52 |
+ |
|
| 53 |
+ sys.exit(0) |
|
| 54 |
+ |
|
| 55 |
+if __name__=="__main__": |
|
| 56 |
+ main() |
| ... | ... |
@@ -1,6 +1,7 @@ |
| 1 | 1 |
import re |
| 2 | 2 |
from StringUtils import StringUtils |
| 3 | 3 |
from SpecStructures import * |
| 4 |
+from constants import constants |
|
| 4 | 5 |
|
| 5 | 6 |
class SpecParser(object): |
| 6 | 7 |
def __init__(self): |
| ... | ... |
@@ -185,6 +186,8 @@ class SpecParser(object): |
| 185 | 185 |
return True |
| 186 | 186 |
elif re.search('^'+'requires:',line,flags=re.IGNORECASE) :
|
| 187 | 187 |
return True |
| 188 |
+ elif re.search('^'+'requires\((pre|post|preun|postun)\):',line,flags=re.IGNORECASE) :
|
|
| 189 |
+ return True |
|
| 188 | 190 |
elif re.search('^'+'provides:',line,flags=re.IGNORECASE) :
|
| 189 | 191 |
return True |
| 190 | 192 |
elif re.search('^'+'obsoletes:',line,flags=re.IGNORECASE) :
|
| ... | ... |
@@ -245,16 +248,21 @@ class SpecParser(object): |
| 245 | 245 |
listPackages=line.split(",")
|
| 246 | 246 |
listdependentpkgs=[] |
| 247 | 247 |
for line in listPackages: |
| 248 |
- line=strUtils.getStringInBrackets(line) |
|
| 248 |
+ line=strUtils.getStringInConditionalBrackets(line) |
|
| 249 | 249 |
listContents=line.split() |
| 250 | 250 |
totalContents = len(listContents) |
| 251 | 251 |
i=0 |
| 252 | 252 |
while i < totalContents: |
| 253 | 253 |
dpkg = dependentPackageData() |
| 254 | 254 |
compare=None |
| 255 |
+ packageName=listContents[i] |
|
| 255 | 256 |
if listContents[i].startswith("/"):
|
| 257 |
+ provider=constants.providedBy.get(listContents[i], None) |
|
| 256 | 258 |
i=i+1 |
| 257 |
- continue |
|
| 259 |
+ if provider is not None: |
|
| 260 |
+ packageName=provider |
|
| 261 |
+ else: |
|
| 262 |
+ continue |
|
| 258 | 263 |
if i+2 < len(listContents): |
| 259 | 264 |
if listContents[i+1] == ">=": |
| 260 | 265 |
compare="gte" |
| ... | ... |
@@ -270,12 +278,12 @@ class SpecParser(object): |
| 270 | 270 |
compare="eq" |
| 271 | 271 |
|
| 272 | 272 |
if compare is not None: |
| 273 |
- dpkg.package=listContents[i] |
|
| 273 |
+ dpkg.package=packageName |
|
| 274 | 274 |
dpkg.compare=compare |
| 275 | 275 |
dpkg.version=listContents[i+2] |
| 276 | 276 |
i=i+3 |
| 277 | 277 |
else: |
| 278 |
- dpkg.package=listContents[i] |
|
| 278 |
+ dpkg.package=packageName |
|
| 279 | 279 |
i=i+1 |
| 280 | 280 |
listdependentpkgs.append(dpkg) |
| 281 | 281 |
return listdependentpkgs |
| ... | ... |
@@ -319,11 +327,11 @@ class SpecParser(object): |
| 319 | 319 |
if headerName.find('patch') != -1:
|
| 320 | 320 |
pkg.patches.append(headerContent) |
| 321 | 321 |
return True |
| 322 |
- if headerName == 'requires' or headerName == 'provides' or headerName == 'obsoletes' or headerName == 'conflicts' or headerName == 'buildrequires' or headerName == 'buildprovides': |
|
| 322 |
+ if headerName.startswith('requires') or headerName == 'provides' or headerName == 'obsoletes' or headerName == 'conflicts' or headerName == 'buildrequires' or headerName == 'buildprovides':
|
|
| 323 | 323 |
dpkg=self.readDependentPackageData(headerContent) |
| 324 | 324 |
if dpkg is None: |
| 325 | 325 |
return False |
| 326 |
- if headerName == 'requires': |
|
| 326 |
+ if headerName.startswith('requires'):
|
|
| 327 | 327 |
pkg.requires.extend(dpkg) |
| 328 | 328 |
if headerName == 'provides': |
| 329 | 329 |
pkg.provides.extend(dpkg) |
| 330 | 330 |
new file mode 100755 |
| ... | ... |
@@ -0,0 +1,73 @@ |
| 0 |
+#!/usr/bin/python2 |
|
| 1 |
+# |
|
| 2 |
+#Copyright (C) 2015 vmware inc. |
|
| 3 |
+# |
|
| 4 |
+#Author: Harish Udaiya Kumar <hudaiyakumar@vmware.com> |
|
| 5 |
+from SpecUtils import Specutils |
|
| 6 |
+from SpecData import SerializableSpecObject |
|
| 7 |
+from SpecData import SerializedSpecObjects |
|
| 8 |
+from RepoDeps import RepoQueryDependency |
|
| 9 |
+import sys |
|
| 10 |
+import os |
|
| 11 |
+from optparse import OptionParser |
|
| 12 |
+ |
|
| 13 |
+DEFAULT_INPUT_TYPE = "json" |
|
| 14 |
+DEFAULT_DISPLAY_OPTION = "tree" |
|
| 15 |
+SPEC_FILE_DIR = "../../SPECS" |
|
| 16 |
+INPUT_DATA_DIR = "../../common/data" |
|
| 17 |
+ |
|
| 18 |
+def reportMissing(pkg,specDepList, repoDepList, excludeList): |
|
| 19 |
+ missingList = []; |
|
| 20 |
+ if None != repoDepList: |
|
| 21 |
+ for repoItem in repoDepList: |
|
| 22 |
+ if repoItem not in excludeList and (None == specDepList or repoItem not in specDepList): |
|
| 23 |
+ missingList.append(repoItem) |
|
| 24 |
+ if missingList: |
|
| 25 |
+ if len(pkg) <= 7: |
|
| 26 |
+ print pkg, "missing\t\t->", missingList |
|
| 27 |
+ else: |
|
| 28 |
+ print pkg, "missing\t->", missingList |
|
| 29 |
+ |
|
| 30 |
+def main(): |
|
| 31 |
+ usage = os.path.basename(__file__) + "--input-type=[json/pkg] --pkg=[pkg_name] --file=<JSON_FILE_NAME> --repo-file=<photon>.repo" |
|
| 32 |
+ parser = OptionParser(usage) |
|
| 33 |
+ parser.add_option("-i", "--input-type", dest="input_type", default=DEFAULT_INPUT_TYPE)
|
|
| 34 |
+ parser.add_option("-p", "--pkg", dest="pkg")
|
|
| 35 |
+ parser.add_option("-f", "--file", dest="json_file", default="packages_full.json")
|
|
| 36 |
+ parser.add_option("-s", "--spec-dir", dest="spec_dir", default=SPEC_FILE_DIR)
|
|
| 37 |
+ parser.add_option("-a", "--input-data-dir", dest="input_data_dir", default=INPUT_DATA_DIR)
|
|
| 38 |
+ parser.add_option("-r", "--repo-file", dest = "repo_file", default="")
|
|
| 39 |
+ excludeList = ["bash","glibc","libgcc","pkg-config","filesystem"] |
|
| 40 |
+ (options, args) = parser.parse_args() |
|
| 41 |
+ |
|
| 42 |
+ if(options.repo_file == ""): |
|
| 43 |
+ print "Error! repo file not provided" |
|
| 44 |
+ print usage |
|
| 45 |
+ return |
|
| 46 |
+ |
|
| 47 |
+ if(False == options.input_data_dir.endswith('/')):
|
|
| 48 |
+ options.input_data_dir += '/' |
|
| 49 |
+ |
|
| 50 |
+ specDeps = SerializedSpecObjects(options.input_data_dir, "") |
|
| 51 |
+ repoDeps = RepoQueryDependency(options.repo_file) |
|
| 52 |
+ displayOption = None |
|
| 53 |
+ abs_path = os.path.abspath(__file__) |
|
| 54 |
+ dir_name = os.path.dirname(abs_path) |
|
| 55 |
+ os.chdir(dir_name) |
|
| 56 |
+ |
|
| 57 |
+ if(options.input_type == "pkg"): |
|
| 58 |
+ targetName = options.pkg |
|
| 59 |
+ specDepList = specDeps.readSpecsAndConvertToSerializableObjects(options.spec_dir, options.input_type, targetName, displayOption) |
|
| 60 |
+ repoDepList = repoDeps.getRequiresList(targetName) |
|
| 61 |
+ reportMissing(targetName,specDepList,repoDepList,excludeList) |
|
| 62 |
+ elif(options.input_type == "json"): |
|
| 63 |
+ filePath = options.input_data_dir + options.json_file |
|
| 64 |
+ data = specDeps.get_all_package_names(filePath) |
|
| 65 |
+ for pkg in data: |
|
| 66 |
+ specDepList = specDeps.readSpecsAndConvertToSerializableObjects(options.spec_dir, "pkg" , pkg, displayOption) |
|
| 67 |
+ repoDepList = repoDeps.getRequiresList(pkg) |
|
| 68 |
+ reportMissing(pkg,specDepList,repoDepList,excludeList) |
|
| 69 |
+ sys.exit(0) |
|
| 70 |
+ |
|
| 71 |
+if __name__=="__main__": |
|
| 72 |
+ main() |
| ... | ... |
@@ -2,12 +2,17 @@ import re |
| 2 | 2 |
|
| 3 | 3 |
class StringUtils(object): |
| 4 | 4 |
|
| 5 |
- def getStringInBrackets(self, inputstring): |
|
| 5 |
+ # Opens conditional brackets from |
|
| 6 |
+ # (aaa <= 3.1 or bbb) ccc (ddd or fff > 4.5.6) |
|
| 7 |
+ # into |
|
| 8 |
+ # aaa <= 3.1 ccc ddd |
|
| 9 |
+ def getStringInConditionalBrackets(self,inputstring): |
|
| 6 | 10 |
inputstring=inputstring.strip() |
| 7 |
- m = re.search(r"^\(([A-Za-z0-9_.-]+)\)", inputstring) |
|
| 8 |
- if m is None: |
|
| 9 |
- return inputstring |
|
| 10 |
- return m.group(1) |
|
| 11 |
+ items = re.findall(r"([(][A-Za-z0-9 _\.\-<>=]+[)])", inputstring) |
|
| 12 |
+ for m in items: |
|
| 13 |
+ out = m[m.find("(")+1 : m.find(" or ")].strip()
|
|
| 14 |
+ inputstring = inputstring.replace(m, out); |
|
| 15 |
+ return inputstring |
|
| 11 | 16 |
|
| 12 | 17 |
def getFileNameFromURL(self,inputstring): |
| 13 | 18 |
index=inputstring.rfind("/")
|
| ... | ... |
@@ -8,6 +8,7 @@ from constants import constants |
| 8 | 8 |
from PackageManager import PackageManager |
| 9 | 9 |
import json |
| 10 | 10 |
import sys |
| 11 |
+from SpecData import SPECS |
|
| 11 | 12 |
from SpecUtils import Specutils |
| 12 | 13 |
from StringUtils import StringUtils |
| 13 | 14 |
import collections |
| ... | ... |
@@ -135,6 +136,8 @@ def main(): |
| 135 | 135 |
|
| 136 | 136 |
try: |
| 137 | 137 |
constants.initialize(options) |
| 138 |
+ # parse SPECS folder |
|
| 139 |
+ SPECS(); |
|
| 138 | 140 |
if package == "packages_list": |
| 139 | 141 |
buildPackagesList(options.buildRootPath+"/../packages_list.csv") |
| 140 | 142 |
elif options.generatePkgYamlFiles: |
| ... | ... |
@@ -162,15 +165,15 @@ def main(): |
| 162 | 162 |
def buildPackagesList(csvFilename): |
| 163 | 163 |
csvFile = open(csvFilename, "w") |
| 164 | 164 |
csvFile.write("Package,Version,License,URL,Sources,Patches\n")
|
| 165 |
- listPackages = constants.specData.getListPackages() |
|
| 165 |
+ listPackages = SPECS.getData().getListPackages() |
|
| 166 | 166 |
listPackages.sort() |
| 167 | 167 |
for package in listPackages: |
| 168 | 168 |
name = package |
| 169 |
- version = constants.specData.getVersion(package) |
|
| 170 |
- license = constants.specData.getLicense(package) |
|
| 171 |
- listPatches = constants.specData.getPatches(package) |
|
| 172 |
- url = constants.specData.getURL(package) |
|
| 173 |
- listSourceNames = constants.specData.getSources(package) |
|
| 169 |
+ version = SPECS.getData().getVersion(package) |
|
| 170 |
+ license = SPECS.getData().getLicense(package) |
|
| 171 |
+ listPatches = SPECS.getData().getPatches(package) |
|
| 172 |
+ url = SPECS.getData().getURL(package) |
|
| 173 |
+ listSourceNames = SPECS.getData().getSources(package) |
|
| 174 | 174 |
sources = "" |
| 175 | 175 |
patches = "" |
| 176 | 176 |
if listPatches is not None: |
| ... | ... |
@@ -196,27 +199,27 @@ def buildSourcesList(yamlDir, blackListPkgs, logger, singleFile=True): |
| 196 | 196 |
cmdUtils.runCommandInShell("mkdir -p "+yamlSourceDir)
|
| 197 | 197 |
if singleFile: |
| 198 | 198 |
yamlFile = open(yamlSourceDir+"/sources_list.yaml", "w") |
| 199 |
- listPackages = constants.specData.getListPackages() |
|
| 199 |
+ listPackages = SPECS.getData().getListPackages() |
|
| 200 | 200 |
listPackages.sort() |
| 201 | 201 |
import PullSources |
| 202 | 202 |
for package in listPackages: |
| 203 | 203 |
if package in blackListPkgs: |
| 204 | 204 |
continue |
| 205 | 205 |
ossname = package |
| 206 |
- ossversion = constants.specData.getVersion(package) |
|
| 206 |
+ ossversion = SPECS.getData().getVersion(package) |
|
| 207 | 207 |
modified = False |
| 208 |
- listPatches = constants.specData.getPatches(package) |
|
| 208 |
+ listPatches = SPECS.getData().getPatches(package) |
|
| 209 | 209 |
if listPatches is not None and len(listPatches) > 0 : |
| 210 | 210 |
modified = True |
| 211 |
- url = constants.specData.getSourceURL(package) |
|
| 211 |
+ url = SPECS.getData().getSourceURL(package) |
|
| 212 | 212 |
if url is None: |
| 213 |
- url = constants.specData.getURL(package) |
|
| 213 |
+ url = SPECS.getData().getURL(package) |
|
| 214 | 214 |
|
| 215 | 215 |
sourceName = None |
| 216 |
- listSourceNames = constants.specData.getSources(package) |
|
| 216 |
+ listSourceNames = SPECS.getData().getSources(package) |
|
| 217 | 217 |
if len(listSourceNames) >0: |
| 218 | 218 |
sourceName=listSourceNames[0] |
| 219 |
- sha1 = constants.specData.getSHA1(package, sourceName) |
|
| 219 |
+ sha1 = SPECS.getData().getSHA1(package, sourceName) |
|
| 220 | 220 |
if sha1 is not None: |
| 221 | 221 |
PullSources.get(sourceName, sha1, yamlSourceDir, constants.pullsourcesConfig, logger) |
| 222 | 222 |
|
| ... | ... |
@@ -247,14 +250,14 @@ def buildSRPMList(srpmPath, yamlDir, blackListPkgs, logger, singleFile=True): |
| 247 | 247 |
cmdUtils.runCommandInShell("mkdir -p "+yamlSrpmDir)
|
| 248 | 248 |
if singleFile: |
| 249 | 249 |
yamlFile = open(yamlSrpmDir+"/srpm_list.yaml", "w") |
| 250 |
- listPackages = constants.specData.getListPackages() |
|
| 250 |
+ listPackages = SPECS.getData().getListPackages() |
|
| 251 | 251 |
listPackages.sort() |
| 252 | 252 |
for package in listPackages: |
| 253 | 253 |
if package in blackListPkgs: |
| 254 | 254 |
continue |
| 255 | 255 |
ossname = package |
| 256 |
- ossversion = constants.specData.getVersion(package) |
|
| 257 |
- ossrelease = constants.specData.getRelease(package) |
|
| 256 |
+ ossversion = SPECS.getData().getVersion(package) |
|
| 257 |
+ ossrelease = SPECS.getData().getRelease(package) |
|
| 258 | 258 |
|
| 259 | 259 |
listFoundSRPMFiles = cmdUtils.findFile(ossname+"-"+ossversion+"-"+ossrelease+".src.rpm",srpmPath) |
| 260 | 260 |
srpmName = None |
| ... | ... |
@@ -295,7 +298,7 @@ def buildAPackage(package, listBuildOptionPackages, pkgBuildOptionFile, buildThr |
| 295 | 295 |
pkgManager.buildPackages(listPackages, listBuildOptionPackages, pkgBuildOptionFile, buildThreads, pkgBuildType) |
| 296 | 296 |
|
| 297 | 297 |
def buildPackagesForAllSpecs(listBuildOptionPackages, pkgBuildOptionFile, logger, buildThreads, pkgInfoJsonFile, pkgBuildType): |
| 298 |
- listPackages = constants.specData.getListPackages() |
|
| 298 |
+ listPackages = SPECS.getData().getListPackages() |
|
| 299 | 299 |
|
| 300 | 300 |
logger.info("List of packages to build:")
|
| 301 | 301 |
logger.info(listPackages) |
| ... | ... |
@@ -1,4 +1,3 @@ |
| 1 |
-from SpecData import SerializableSpecObjectsUtils |
|
| 2 | 1 |
from Logger import Logger |
| 3 | 2 |
|
| 4 | 3 |
class constants(object): |
| ... | ... |
@@ -10,7 +9,6 @@ class constants(object): |
| 10 | 10 |
buildNumber="0000000" |
| 11 | 11 |
releaseVersion="NNNnNNN" |
| 12 | 12 |
topDirPath="" |
| 13 |
- specData=None |
|
| 14 | 13 |
buildRootPath="/mnt" |
| 15 | 14 |
prevPublishRPMRepo="" |
| 16 | 15 |
prevPublishXRPMRepo="" |
| ... | ... |
@@ -335,6 +333,15 @@ class constants(object): |
| 335 | 335 |
"gdb", |
| 336 | 336 |
"glibc" ] |
| 337 | 337 |
|
| 338 |
+ # .spec file might contain lines such as |
|
| 339 |
+ # Requires(post):/sbin/useradd |
|
| 340 |
+ # Build system should interpret it as |
|
| 341 |
+ # Requires: shadow |
|
| 342 |
+ providedBy={
|
|
| 343 |
+ "/sbin/useradd":"shadow", |
|
| 344 |
+ "/sbin/groupadd":"shadow" |
|
| 345 |
+ } |
|
| 346 |
+ |
|
| 338 | 347 |
@staticmethod |
| 339 | 348 |
def initialize(options): |
| 340 | 349 |
constants.dist = options.dist |
| ... | ... |
@@ -349,8 +356,6 @@ class constants(object): |
| 349 | 349 |
constants.prevPublishRPMRepo = options.publishRPMSPath |
| 350 | 350 |
constants.prevPublishXRPMRepo = options.publishXRPMSPath |
| 351 | 351 |
constants.buildRootPath=options.buildRootPath |
| 352 |
- constants.specData = SerializableSpecObjectsUtils(constants.logPath) |
|
| 353 |
- constants.specData.readSpecsAndConvertToSerializableObjects(constants.specPath) |
|
| 354 | 352 |
constants.pullsourcesConfig = options.pullsourcesConfig |
| 355 | 353 |
constants.inputRPMSPath=options.inputRPMSPath |
| 356 | 354 |
constants.testForceRPMS=[] |
| ... | ... |
@@ -361,44 +366,4 @@ class constants(object): |
| 361 | 361 |
constants.tmpDirPath = "/dev/shm" |
| 362 | 362 |
if constants.rpmCheck: |
| 363 | 363 |
constants.testLogger=Logger.getLogger("MakeCheckTest",constants.logPath)
|
| 364 |
- constants.updateRPMMacros() |
|
| 365 |
- |
|
| 366 |
- @staticmethod |
|
| 367 |
- def updateRPMMacros(): |
|
| 368 |
- #adding distribution rpm macro |
|
| 369 |
- constants.specData.addMacro("dist",constants.dist)
|
|
| 370 |
- |
|
| 371 |
- #adding buildnumber rpm macro |
|
| 372 |
- constants.specData.addMacro("photon_build_number",constants.buildNumber)
|
|
| 373 |
- |
|
| 374 |
- #adding releasenumber rpm macro |
|
| 375 |
- constants.specData.addMacro("photon_release_version",constants.releaseVersion)
|
|
| 376 |
- |
|
| 377 |
- #adding kernelversion rpm macro |
|
| 378 |
- kernelversion = constants.specData.getVersion("linux")
|
|
| 379 |
- constants.specData.addMacro("KERNEL_VERSION",kernelversion)
|
|
| 380 | 364 |
|
| 381 |
- #adding openjre8 version rpm macro |
|
| 382 |
- java8version = constants.specData.getVersion("openjre8")
|
|
| 383 |
- constants.specData.addMacro("JAVA8_VERSION",java8version)
|
|
| 384 |
- |
|
| 385 |
- #adding kernelrelease rpm macro |
|
| 386 |
- kernelrelease = constants.specData.getRelease("linux")
|
|
| 387 |
- constants.specData.addMacro("KERNEL_RELEASE",kernelrelease)
|
|
| 388 |
- |
|
| 389 |
- #adding kernelsubrelease rpm macro |
|
| 390 |
- a,b,c = kernelversion.split(".")
|
|
| 391 |
- kernelsubrelease = '%02d%02d%03d%03d' % (int(a),int(b),int(c),int(kernelrelease.replace(constants.dist,""))) |
|
| 392 |
- if kernelsubrelease: |
|
| 393 |
- kernelsubrelease = "."+kernelsubrelease |
|
| 394 |
- constants.specData.addMacro("kernelsubrelease",kernelsubrelease)
|
|
| 395 |
- |
|
| 396 |
- #adding check rpm macro |
|
| 397 |
- if constants.rpmCheck: |
|
| 398 |
- constants.specData.addMacro("with_check","1")
|
|
| 399 |
- else: |
|
| 400 |
- constants.specData.addMacro("with_check","0")
|
|
| 401 |
- |
|
| 402 |
- @staticmethod |
|
| 403 |
- def setTestForceRPMS(listsPackages): |
|
| 404 |
- constants.testForceRPMS=listsPackages |
| 405 | 365 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,25 @@ |
| 0 |
+#!/usr/bin/python2 |
|
| 1 |
+# |
|
| 2 |
+# Copyright (C) 2015 vmware inc. |
|
| 3 |
+# |
|
| 4 |
+# Author: Sharath George <sharathg@vmware.com> |
|
| 5 |
+ |
|
| 6 |
+ |
|
| 7 |
+import json |
|
| 8 |
+import collections |
|
| 9 |
+ |
|
| 10 |
+class JsonWrapper(object): |
|
| 11 |
+ |
|
| 12 |
+ def __init__(self, filename): |
|
| 13 |
+ self.filename = filename |
|
| 14 |
+ |
|
| 15 |
+ def read(self): |
|
| 16 |
+ json_data = open(self.filename) |
|
| 17 |
+ self.data = json.load(json_data, object_pairs_hook=collections.OrderedDict) |
|
| 18 |
+ json_data.close() |
|
| 19 |
+ return self.data |
|
| 20 |
+ |
|
| 21 |
+ def write(self, data): |
|
| 22 |
+ self.data = data |
|
| 23 |
+ outfile = open(self.filename, 'wb') |
|
| 24 |
+ json.dump(data, outfile) |