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)
#!/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)