Example #1
0
    def schema(self):
        # Setup logging
        log.setLevel(self.settings.verbosity)

        # Display configuration
        log.debug("%s" % self.settings)

        # Setup database
        log.debug("* setup database's...")
        db = HashDatabase2(self.settings.database)
        if not db.open():
            return

        yield "-- [Tables]"
        yield "-- " + ", ".join(
            row["name"]
            for row in db.connection.execute(
                "SELECT name,sql FROM sqlite_master WHERE (type='table') AND (substr(name,1,7) <> 'sqlite_') ORDER BY name"
            )
        )
        for row in db.connection.execute(
            "SELECT name,sql FROM sqlite_master WHERE (type='table') AND (substr(name,1,7) <> 'sqlite_') ORDER BY name"
        ):
            yield row["sql"]
        yield "-- [Databases]"
        for row in db.connection.execute("PRAGMA database_list"):
            yield "-- %s: %s" % (row[1], row[2])
Example #2
0
    def hash(self, targets=None):
        # Setup logging
        log.setLevel(self.settings.verbosity)

        # Display configuration
        log.debug("%s" % self.settings)

        # Setup database
        log.debug("* setup database's...")
        db = HashDatabase2(self.settings.database)
        db.extend_locals(self.settings.databases_locals)
        if not db.open():
            return

        # Setup the walker
        log.debug("* setup walker...")
        walker = Walker()
        walker.walk_depth = self.settings.walk_depth
        walker.extend_targets(targets or self.settings.hash_targets)
        walker.extend_skip_fstypes(self.settings.skip_fstypes)
        walker.extend_skip_paths(self.settings.skip_paths)
        walker.extend_skip_names(self.settings.skip_names)
        walker.extend_skip_dirnames(self.settings.skip_dirnames)
        walker.extend_skip_filenames(self.settings.skip_filenames)
        walker.skip_mounts = self.settings.skip_mounts
        walker.skip_binds = self.settings.skip_binds
        walker.skip_symlinks = self.settings.skip_symlinks

        log.debug("* walk...")

        try:
            start_time = time.time()
            start_changes = db.connection.total_changes
            for target in walker.walk():
                target_hash = db.path_hash(target.true, target.stat)
                if target_hash == None:
                    target_hash = build_hash(target)
                    if target_hash != None:
                        db.path_setstat(target.true, target.stat, target_hash)
                if target_hash != None:
                    yield (target, target_hash, db)

                # Only commit every so often since we are limited by disk speed
                now = time.time()
                if ((now - start_time) >= THRESHHOLD_TIMEDELTA) or (
                    (db.connection.total_changes - start_changes) > THRESHHOLD_CHANGEDELTA
                ):
                    log.debug("* committing changes...")
                    db.connection.commit()
                start_time = time.time()
                start_changes = db.connection.total_changes
        finally:
            log.debug("* committing changes...")
            db.connection.commit()
Example #3
0
    def view(self):
        # Setup logging
        log.setLevel(self.setting_verbosity)

        # Display configuration
        display_settings(self.settings, log.debug)

        # Setup database
        log.debug("* setup database's...")
        db = HashDatabase(self.setting_database)
        db.add_combines(self.setting_combine)
        if not db.open():
            return

        # Read mounts (for truepath)
        mounts = MountEntries()

        # Build a query string, filtering on targets
        targets = [mounts.truepath(t) for t in self.setting_targets]
        qfilters = []
        qargmap = {}
        if ("/" not in targets) and ("\\" not in targets) and ("//" not in targets) and ("\\\\" not in targets):
            for i, target in enumerate(targets):
                target = mounts.truepath(target)
                qfilters.append(
                    r"""(path = :%(name)s) OR (substr(path, 1, :%(name)s_len + 1) = :%(name)s || '/')"""
                    % {"name": "t%02d" % i}
                )
                qargmap.update({"t%02d" % i: target, "t%02d_len" % i: len(target)})
        qfilter = (r"""WHERE """ + r""" OR """.join(qfilters)) if len(qfilters) != 0 else r""""""
        qorder = (
            r"""
            ORDER BY
                path,
                mark DESC
        """
            if self.setting_walk_depth
            else r"""
            ORDER BY
                count_components(path),
                path,
                mark DESC
        """
        )

        query = (
            r"""
            SELECT
                *
            FROM
                combinedtab
        """
            + qfilter
            + qorder
        )

        # yield all results as a HashRowData blob (don't expose the underlying row)
        for row in db.connection.execute(query, qargmap):
            yield (
                HashRowData(path=row["path"], hash=row["hash"], mark=row["mark"], time=row["time"], size=row["size"]),
                db,
            )