Loading installsystems/database.py +0 −32 Original line number Diff line number Diff line Loading @@ -128,35 +128,3 @@ class Database(object): os.rename(newdb_path, self.path) except Exception as e: raise Exception("Removing metadata fail: %s" % e) def databalls(self, name, version): '''List data tarballs filenames''' try: self.file.seek(0) db = Tarball.open(fileobj=self.file, mode='r:gz') jdesc = json.loads(db.get_str("%s-%s.json" % (name, version))) db.close() return jdesc["data"] except Exception as e: raise Exception("List data tarballs fail: %s" % e) def find(self, name, version=None): '''Find last version of an image''' try: self.file.seek(0) tarb = Tarball.open(fileobj=self.file, mode='r:gz') candidates = [ int((os.path.splitext(tpname)[0]).rsplit("-", 1)[1]) for tpname in tarb.getnames("%s-\d+" % name) ] tarb.close() except Exception as e: raise Exception("Find in db %s fail: %s" % (self.path, e)) # no candidates => go west if len(candidates) == 0: return None # get last version if version is None: version = max(candidates) # check if version exists if int(version) not in candidates: return None return self.get(name, version) installsystems/image.py +14 −28 Original line number Diff line number Diff line Loading @@ -293,6 +293,12 @@ class PackageImage(Image): # FIXME: we should check valid information here return desc def data_path(self, name): '''Return a data filename from its internal name''' if self.md5name: return os.path.join(self.base_path, self._metadata["data"][name]["md5"]) return os.path.join(self.base_path, "%s-%s%s" % (self.id, name, self.extension_data)) @property def tarballs(self): '''List path of all related tarballs''' Loading @@ -300,15 +306,10 @@ class PackageImage(Image): name = os.path.join(self.base_path, self.md5) if self.md5name else self.path d_d[name] = {"md5": self.md5, "size": self.size} for key, value in self._metadata["data"].items(): if self.md5name: name = os.path.join(self.base_path, value["md5"]) else: name = os.path.join(self.base_path, "%s-%s%s" % (self.id, key, self.extension_data)) d_d[name] = {"md5": value["md5"], "size": value["size"]} d_d[self.data_path(key)] = {"md5": value["md5"], "size": value["size"]} return d_d def tarcheck(self, message="Check MD5"): def check(self, message="Check MD5"): '''Check md5 and size of tarballs are correct''' arrow(message, 1, self.verbose) # open /dev/null Loading Loading @@ -368,33 +369,18 @@ class PackageImage(Image): # tarball info tinfo = self._metadata["data"][dataname] # build data tar paths paths = [ os.path.join(self.base_path, tinfo["md5"]), os.path.join(self.base_path, "%s-%s%s" % (self.id, dataname, self.extension_data)) ] # try to open path fo = None for path in paths: path = self.data_path(dataname) try: fo = istools.uopen(path) break except Exception: pass # error if no file is openned if fo is None: raise Exception("Unable to open data tarball") except Exception as e: raise Exception("Unable to open data tarball %s" % path) try: # create tar object t = Tarball.open(fileobj=fo, mode="r|gz") except Exception as e: raise Exception("Invalid data tarball: %s" % e) # filter on file to extact if filelist is not None: members = [] for fi in filelist: members += t.gettarinfo(name) else: members = None members = None if filelist is None else [ t.gettarinfo(name) for name in filelist ] try: t.extractall(target, members) except Exception as e: Loading installsystems/repository.py +5 −6 Original line number Diff line number Diff line Loading @@ -83,7 +83,7 @@ class Repository(object): if istools.pathtype(self.config.path) != "file": raise NotImplementedError("Repository addition must be local") # checking data tarballs md5 before copy package.tarcheck("Check tarballs before copy") package.check("Check tarballs before copy") # adding file to repository arrow("Copying files", 1, self.verbose) for src,value in package.tarballs.items(): Loading @@ -98,7 +98,7 @@ class Repository(object): r_package = PackageImage(os.path.join(self.config.path, package.md5), md5name=True, verbose=self.verbose) # checking data tarballs md5 after copy r_package.tarcheck("Check tarballs after copy") r_package.check("Check tarballs after copy") # add description to db self.db.add(r_package) # update last file Loading Loading @@ -138,15 +138,14 @@ class Repository(object): def get(self, name, version): '''return a package from a name and version of pakage''' debug("Getting %s v%s" % (name, version)) # get file md5 from db r = self.db.ask("select md5 from image where name = ? and version = ? limit 1", (name,version)).fetchone() if r is None: raise Exception("No such image %s version %s" % name, version) return PackageImage(os.path.join(self.config.path, r[0]), md5name=True, verbose=self.verbose) path = os.path.join(self.config.path, r[0]) debug("Getting %s v%s from %s" % (name, version, path)) return PackageImage(path, md5name=True, verbose=self.verbose) def last(self, name): '''Return last version of name in repo or -1 if not found''' Loading Loading
installsystems/database.py +0 −32 Original line number Diff line number Diff line Loading @@ -128,35 +128,3 @@ class Database(object): os.rename(newdb_path, self.path) except Exception as e: raise Exception("Removing metadata fail: %s" % e) def databalls(self, name, version): '''List data tarballs filenames''' try: self.file.seek(0) db = Tarball.open(fileobj=self.file, mode='r:gz') jdesc = json.loads(db.get_str("%s-%s.json" % (name, version))) db.close() return jdesc["data"] except Exception as e: raise Exception("List data tarballs fail: %s" % e) def find(self, name, version=None): '''Find last version of an image''' try: self.file.seek(0) tarb = Tarball.open(fileobj=self.file, mode='r:gz') candidates = [ int((os.path.splitext(tpname)[0]).rsplit("-", 1)[1]) for tpname in tarb.getnames("%s-\d+" % name) ] tarb.close() except Exception as e: raise Exception("Find in db %s fail: %s" % (self.path, e)) # no candidates => go west if len(candidates) == 0: return None # get last version if version is None: version = max(candidates) # check if version exists if int(version) not in candidates: return None return self.get(name, version)
installsystems/image.py +14 −28 Original line number Diff line number Diff line Loading @@ -293,6 +293,12 @@ class PackageImage(Image): # FIXME: we should check valid information here return desc def data_path(self, name): '''Return a data filename from its internal name''' if self.md5name: return os.path.join(self.base_path, self._metadata["data"][name]["md5"]) return os.path.join(self.base_path, "%s-%s%s" % (self.id, name, self.extension_data)) @property def tarballs(self): '''List path of all related tarballs''' Loading @@ -300,15 +306,10 @@ class PackageImage(Image): name = os.path.join(self.base_path, self.md5) if self.md5name else self.path d_d[name] = {"md5": self.md5, "size": self.size} for key, value in self._metadata["data"].items(): if self.md5name: name = os.path.join(self.base_path, value["md5"]) else: name = os.path.join(self.base_path, "%s-%s%s" % (self.id, key, self.extension_data)) d_d[name] = {"md5": value["md5"], "size": value["size"]} d_d[self.data_path(key)] = {"md5": value["md5"], "size": value["size"]} return d_d def tarcheck(self, message="Check MD5"): def check(self, message="Check MD5"): '''Check md5 and size of tarballs are correct''' arrow(message, 1, self.verbose) # open /dev/null Loading Loading @@ -368,33 +369,18 @@ class PackageImage(Image): # tarball info tinfo = self._metadata["data"][dataname] # build data tar paths paths = [ os.path.join(self.base_path, tinfo["md5"]), os.path.join(self.base_path, "%s-%s%s" % (self.id, dataname, self.extension_data)) ] # try to open path fo = None for path in paths: path = self.data_path(dataname) try: fo = istools.uopen(path) break except Exception: pass # error if no file is openned if fo is None: raise Exception("Unable to open data tarball") except Exception as e: raise Exception("Unable to open data tarball %s" % path) try: # create tar object t = Tarball.open(fileobj=fo, mode="r|gz") except Exception as e: raise Exception("Invalid data tarball: %s" % e) # filter on file to extact if filelist is not None: members = [] for fi in filelist: members += t.gettarinfo(name) else: members = None members = None if filelist is None else [ t.gettarinfo(name) for name in filelist ] try: t.extractall(target, members) except Exception as e: Loading
installsystems/repository.py +5 −6 Original line number Diff line number Diff line Loading @@ -83,7 +83,7 @@ class Repository(object): if istools.pathtype(self.config.path) != "file": raise NotImplementedError("Repository addition must be local") # checking data tarballs md5 before copy package.tarcheck("Check tarballs before copy") package.check("Check tarballs before copy") # adding file to repository arrow("Copying files", 1, self.verbose) for src,value in package.tarballs.items(): Loading @@ -98,7 +98,7 @@ class Repository(object): r_package = PackageImage(os.path.join(self.config.path, package.md5), md5name=True, verbose=self.verbose) # checking data tarballs md5 after copy r_package.tarcheck("Check tarballs after copy") r_package.check("Check tarballs after copy") # add description to db self.db.add(r_package) # update last file Loading Loading @@ -138,15 +138,14 @@ class Repository(object): def get(self, name, version): '''return a package from a name and version of pakage''' debug("Getting %s v%s" % (name, version)) # get file md5 from db r = self.db.ask("select md5 from image where name = ? and version = ? limit 1", (name,version)).fetchone() if r is None: raise Exception("No such image %s version %s" % name, version) return PackageImage(os.path.join(self.config.path, r[0]), md5name=True, verbose=self.verbose) path = os.path.join(self.config.path, r[0]) debug("Getting %s v%s from %s" % (name, version, path)) return PackageImage(path, md5name=True, verbose=self.verbose) def last(self, name): '''Return last version of name in repo or -1 if not found''' Loading