Example #1
0
 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))
Example #2
0
    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()