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