Source code for spike.util.hashcheck

#!/usr/bin/env python 
# encoding: utf-8

'''
Program for controlling if files are not deteriorated during transmission.
Usage : write in command line "python hashcheck.py directory-pathname"
Lionel Chiron, 11 oct 2012
copyright NMRTEC S.A.S.
'''

from __future__ import print_function

import hashlib
import fnmatch
import os,sys
import json
import unittest

[docs]def md5sum(filename): ''' from filename make a hash name. able to hash big files ''' md5 = hashlib.md5() chunksize = 128*md5.block_size with open(filename,'rb') as f: for chunk in iter(lambda: f.read(chunksize), b''): md5.update(chunk) return md5.hexdigest()
[docs]def hashdir(rootpath, pattern = '*' ): ''' from directory rootpath make a dictionary whose entries are the hash numbers associated to address of the files ''' dicf = {} for root, dirs, files in os.walk(rootpath): for filename in fnmatch.filter(files, pattern): key = os.path.join(root, filename) hashnb = md5sum(key) dicf[hashnb] = key return dicf
[docs]def hash_make_or_control(rootpath = ".", verbose = False): ''' Makes the file hashfile in the directory hash if it doesn't exists. If the hash directory exists, check if files are ok or not. ''' if rootpath is None: rootpath = sys.argv[1] # taking the argument from the command line. dirhash = os.path.join(rootpath,'hash') if not os.path.exists(dirhash ): # hash directory created os.makedirs(dirhash ) hashres = hashdir(rootpath) f = open(os.path.join(dirhash,'hashfile'),'wb') json.dump(hashres,f) f.close() print("%s created"%os.path.join(dirhash,'hashfile')) else : # compare to hashed files allok = True addhash = os.path.join(dirhash,'hashfile') hash1 = json.load(open(addhash,'rb')) # hash2 = hashdir(rootpath) for key in hash1 : if key in hash2 : if verbose: print("ok for %s : %s"%(hash2[key], key)) else : print("error in %s : %s"%(hash1[key], key)) allok = False if allok: print("hashcheck : Ok, directory not corrupted or modified.") else: print("This directory has been corrupted or modified")
[docs]class Test_hashcheck(unittest.TestCase):
[docs] def test_hash(self): from ..Tests import directory hash_make_or_control(rootpath = directory() )
if __name__ == '__main__': hash_make_or_control() ### Test ####