17db96d56Sopenharmony_ci#! /usr/bin/env python3 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ci"""Python utility to print MD5 checksums of argument files. 47db96d56Sopenharmony_ci""" 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_cibufsize = 8096 87db96d56Sopenharmony_cifnfilter = None 97db96d56Sopenharmony_cirmode = 'rb' 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ciusage = """ 127db96d56Sopenharmony_ciusage: md5sum.py [-b] [-t] [-l] [-s bufsize] [file ...] 137db96d56Sopenharmony_ci-b : read files in binary mode (default) 147db96d56Sopenharmony_ci-t : read files in text mode (you almost certainly don't want this!) 157db96d56Sopenharmony_ci-l : print last pathname component only 167db96d56Sopenharmony_ci-s bufsize: read buffer size (default %d) 177db96d56Sopenharmony_cifile ... : files to sum; '-' or no files means stdin 187db96d56Sopenharmony_ci""" % bufsize 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ciimport io 217db96d56Sopenharmony_ciimport sys 227db96d56Sopenharmony_ciimport os 237db96d56Sopenharmony_ciimport getopt 247db96d56Sopenharmony_cifrom hashlib import md5 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_cidef sum(*files): 277db96d56Sopenharmony_ci sts = 0 287db96d56Sopenharmony_ci if files and isinstance(files[-1], io.IOBase): 297db96d56Sopenharmony_ci out, files = files[-1], files[:-1] 307db96d56Sopenharmony_ci else: 317db96d56Sopenharmony_ci out = sys.stdout 327db96d56Sopenharmony_ci if len(files) == 1 and not isinstance(files[0], str): 337db96d56Sopenharmony_ci files = files[0] 347db96d56Sopenharmony_ci for f in files: 357db96d56Sopenharmony_ci if isinstance(f, str): 367db96d56Sopenharmony_ci if f == '-': 377db96d56Sopenharmony_ci sts = printsumfp(sys.stdin, '<stdin>', out) or sts 387db96d56Sopenharmony_ci else: 397db96d56Sopenharmony_ci sts = printsum(f, out) or sts 407db96d56Sopenharmony_ci else: 417db96d56Sopenharmony_ci sts = sum(f, out) or sts 427db96d56Sopenharmony_ci return sts 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_cidef printsum(filename, out=sys.stdout): 457db96d56Sopenharmony_ci try: 467db96d56Sopenharmony_ci fp = open(filename, rmode) 477db96d56Sopenharmony_ci except IOError as msg: 487db96d56Sopenharmony_ci sys.stderr.write('%s: Can\'t open: %s\n' % (filename, msg)) 497db96d56Sopenharmony_ci return 1 507db96d56Sopenharmony_ci with fp: 517db96d56Sopenharmony_ci if fnfilter: 527db96d56Sopenharmony_ci filename = fnfilter(filename) 537db96d56Sopenharmony_ci sts = printsumfp(fp, filename, out) 547db96d56Sopenharmony_ci return sts 557db96d56Sopenharmony_ci 567db96d56Sopenharmony_cidef printsumfp(fp, filename, out=sys.stdout): 577db96d56Sopenharmony_ci m = md5() 587db96d56Sopenharmony_ci try: 597db96d56Sopenharmony_ci while 1: 607db96d56Sopenharmony_ci data = fp.read(bufsize) 617db96d56Sopenharmony_ci if not data: 627db96d56Sopenharmony_ci break 637db96d56Sopenharmony_ci if isinstance(data, str): 647db96d56Sopenharmony_ci data = data.encode(fp.encoding) 657db96d56Sopenharmony_ci m.update(data) 667db96d56Sopenharmony_ci except IOError as msg: 677db96d56Sopenharmony_ci sys.stderr.write('%s: I/O error: %s\n' % (filename, msg)) 687db96d56Sopenharmony_ci return 1 697db96d56Sopenharmony_ci out.write('%s %s\n' % (m.hexdigest(), filename)) 707db96d56Sopenharmony_ci return 0 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_cidef main(args = sys.argv[1:], out=sys.stdout): 737db96d56Sopenharmony_ci global fnfilter, rmode, bufsize 747db96d56Sopenharmony_ci try: 757db96d56Sopenharmony_ci opts, args = getopt.getopt(args, 'blts:') 767db96d56Sopenharmony_ci except getopt.error as msg: 777db96d56Sopenharmony_ci sys.stderr.write('%s: %s\n%s' % (sys.argv[0], msg, usage)) 787db96d56Sopenharmony_ci return 2 797db96d56Sopenharmony_ci for o, a in opts: 807db96d56Sopenharmony_ci if o == '-l': 817db96d56Sopenharmony_ci fnfilter = os.path.basename 827db96d56Sopenharmony_ci elif o == '-b': 837db96d56Sopenharmony_ci rmode = 'rb' 847db96d56Sopenharmony_ci elif o == '-t': 857db96d56Sopenharmony_ci rmode = 'r' 867db96d56Sopenharmony_ci elif o == '-s': 877db96d56Sopenharmony_ci bufsize = int(a) 887db96d56Sopenharmony_ci if not args: 897db96d56Sopenharmony_ci args = ['-'] 907db96d56Sopenharmony_ci return sum(args, out) 917db96d56Sopenharmony_ci 927db96d56Sopenharmony_ciif __name__ == '__main__' or __name__ == sys.argv[0]: 937db96d56Sopenharmony_ci sys.exit(main(sys.argv[1:], sys.stdout)) 94