def verify(self, hashes): hashcalc = Hash(self.filename) # TODO support more hash algorithms and calculate all hashes with the # same filedesriptor. Currently the file is opened several times # hashcalc.set_hashes(['hasha', 'hashb']) # calc_hash_dict = hashcalc.calculate_hashes() for (type, value) in hashes.items(): if type == 'md5': calc_value = hashcalc.md5() elif type == 'sha1': calc_value = hashcalc.sha1() else: DownloaderError("Hash type '%s' for '%s' is not supported" % (type, this.filename)) if calc_value != value: # TODO calc all hashes and raise error afterwards raise DownloaderHashError(self.filename, value, calc_value, type) else: self.log.debug("%s hash '%s' is valid for '%s'" % (type, value, self.filename))
def create(self, stdout=False): if not os.path.isdir(self.dir): os.makedirs(self.dir) self.tmp_dir = mkdtemp(prefix="tmp-rules-", dir=self.dir) self.log.debug("Created temporary directory '%s'" % self.tmp_dir) downloader = UrlDownloader(None, self.url) source = downloader.copy(self.tmp_dir) hashcalc = Hash(source) md5 = hashcalc.md5() self.log.debug("md5 hash is '%s'" % md5) sha1 = hashcalc.sha1() self.log.debug("sha1 hash is '%s'" % sha1) filename = os.path.basename(source) if not "-" in filename and (not self.name or not self.version): self.clean() raise RulesCreateError("Could not detect name and "\ "version from file '%s'" % filename) if "-" in filename: suffixes = [".tar.gz", ".tar.bz2", ".tgz", "tbz2", ".zip"] for suffix in suffixes: if filename.endswith(suffix): index = filename.rfind(suffix) filename = filename[:index] split = filename.rsplit("-", 1) detected_name = split[0] name = detected_name.lower() version = split[1] detected_version = version else: name = self.name version = self.version detected_name = self.name detected_version = self.version if not self.template: extract_file(source, self.tmp_dir) template = None for detector in detectors: if detector.detect(name, self.tmp_dir): template = detector.get_template() name = detector.get_name() break if not template: self.log.info("Could not detected template for '%s'. " "Using default." % name) template = Template("default.template") else: template = Template(self.templatename + ".template") self.log.debug("Detected rules name is '%s'" % detected_name) self.log.debug("Detected rules version is '%s'" % detected_version) self.log.info("Rules name is '%s'" % name) self.log.info("Rules version is '%s'" % version) vars = dict() vars["name"] = name vars["version"] = version vars["md5"] = md5 vars["sha1"] = sha1 vars["url"] = self.url vars["rootdir"] = self.dir vars["rules"] = self.rules_dir vars["rulesname"] = name.replace("-","").capitalize() vars["detectedname"] = detected_name vars["detectedversion"] = detected_version # self.name and self.version may contain templates if self.name: name = self.name % vars if self.version: version = self.version % vars if stdout: print template.replace(vars) else: new_rules_dir = os.path.join(real_path(self.rules_dir[0]), name) if not os.path.exists(new_rules_dir): os.makedirs(new_rules_dir) try: rulesfile = os.path.join(new_rules_dir, "rules.py") f = open(rulesfile, "w") self.log.info("Creating new rules file '%s'" % rulesfile) f.write(template.replace(vars)) finally: f.close() self.clean()