| #! /usr/bin/env python | |
| """Python utility to print MD5 checksums of argument files. | |
| """ | |
| bufsize = 8096 | |
| fnfilter = None | |
| rmode = 'rb' | |
| usage = """ | |
| usage: sum5 [-b] [-t] [-l] [-s bufsize] [file ...] | |
| -b : read files in binary mode (default) | |
| -t : read files in text mode (you almost certainly don't want this!) | |
| -l : print last pathname component only | |
| -s bufsize: read buffer size (default %d) | |
| file ... : files to sum; '-' or no files means stdin | |
| """ % bufsize | |
| import sys | |
| import os | |
| import getopt | |
| import md5 | |
| def sum(*files): | |
| sts = 0 | |
| if files and isinstance(files[-1], file): | |
| out, files = files[-1], files[:-1] | |
| else: | |
| out = sys.stdout | |
| if len(files) == 1 and not isinstance(files[0], str): | |
| files = files[0] | |
| for f in files: | |
| if isinstance(f, str): | |
| if f == '-': | |
| sts = printsumfp(sys.stdin, '<stdin>', out) or sts | |
| else: | |
| sts = printsum(f, out) or sts | |
| else: | |
| sts = sum(f, out) or sts | |
| return sts | |
| def printsum(filename, out=sys.stdout): | |
| try: | |
| fp = open(filename, rmode) | |
| except IOError, msg: | |
| sys.stderr.write('%s: Can\'t open: %s\n' % (filename, msg)) | |
| return 1 | |
| if fnfilter: | |
| filename = fnfilter(filename) | |
| sts = printsumfp(fp, filename, out) | |
| fp.close() | |
| return sts | |
| def printsumfp(fp, filename, out=sys.stdout): | |
| m = md5.new() | |
| try: | |
| while 1: | |
| data = fp.read(bufsize) | |
| if not data: | |
| break | |
| m.update(data) | |
| except IOError, msg: | |
| sys.stderr.write('%s: I/O error: %s\n' % (filename, msg)) | |
| return 1 | |
| out.write('%s %s\n' % (m.hexdigest(), filename)) | |
| return 0 | |
| def main(args = sys.argv[1:], out=sys.stdout): | |
| global fnfilter, rmode, bufsize | |
| try: | |
| opts, args = getopt.getopt(args, 'blts:') | |
| except getopt.error, msg: | |
| sys.stderr.write('%s: %s\n%s' % (sys.argv[0], msg, usage)) | |
| return 2 | |
| for o, a in opts: | |
| if o == '-l': | |
| fnfilter = os.path.basename | |
| elif o == '-b': | |
| rmode = 'rb' | |
| elif o == '-t': | |
| rmode = 'r' | |
| elif o == '-s': | |
| bufsize = int(a) | |
| if not args: | |
| args = ['-'] | |
| return sum(args, out) | |
| if __name__ == '__main__' or __name__ == sys.argv[0]: | |
| sys.exit(main(sys.argv[1:], sys.stdout)) |