Exemplo n.º 1
0
def verify_backup(rootdir, mdata, num_threads=None):
    # Results
    changed = []
    missing = []
    unexpected = []
    scan_errors = []

    # First, we get all the relevant paths
    scan_result = scan_backup(rootdir)
    scan_errors = scan_result.errors
    unexpected = scan_result.ignored

    # Build a dictionary with all original metdata
    original_metadata = {}
    for p in itertools.chain(mdata.files, mdata.symlinks, mdata.directories):
        original_metadata[p.name] = p

    # Build a dictionary with all current metadata
    digest_map = hashdeep.compute_digests(rootdir, scan_result.files,
                                          num_threads)
    uid_map = utils.get_uid_name_map()
    gid_map = utils.get_gid_name_map()
    current_metadata = {}
    for f in scan_result.files:
        current_metadata[f] = metadata.get_file_metadata(rootdir, f, digest_map,
                                                         uid_map, gid_map)
    for s in scan_result.symlinks:
        current_metadata[s] = metadata.get_symlink_metadata(rootdir, s, uid_map,
                                                            gid_map)
    for d in scan_result.directories:
        current_metadata[d] = metadata.get_directory_metadata(rootdir, d,
                                                              uid_map, gid_map)

    # Find missing and unexpected files
    all_current_paths = set(scan_result.files + scan_result.symlinks
                                              + scan_result.directories)
    all_original_paths = set(original_metadata.keys())

    missing = sorted(list(all_original_paths - all_current_paths))
    unexpected.extend(list(all_current_paths - all_original_paths))
    unexpected.sort()

    # Find changed files
    for p in all_current_paths.intersection(all_original_paths):
        if not lenient_match(current_metadata[p], original_metadata[p]):
            changed.append(p)

    # Return the final result
    return VerificationResult(changed, missing, unexpected, scan_errors)
Exemplo n.º 2
0
#!/usr/bin/env python

import hashdeep
import metadata
import os.path
import pattern
import sys

if __name__ == "__main__":
    if len(sys.argv) != 4:
        print "usage: %s rootdir patterns_file metadata_file" % sys.argv[0]
        sys.exit(1)

    rootdir = os.path.normpath(sys.argv[1])

    patterns_file = open(sys.argv[2])
    patterns = pattern.parse_pattern_file(patterns_file)
    pathlist = pattern.assemble_paths(rootdir, patterns)

    digests = hashdeep.compute_digests(rootdir, pathlist.filenames)
    backup_metadata = metadata.get_backup_metadata(rootdir=rootdir,
                                                   files=pathlist.filenames,
                                                   symlinks=pathlist.symlinks,
                                                   directories=pathlist.directories,
                                                   digest_map=digests)

    with open(sys.argv[3], "w") as metadata_file:
        metadata.write_backup_metadata(metadata_file, backup_metadata)