]> git.rkrishnan.org Git - tahoe-lafs/zfec.git/blob - zfec/zfec/cmdline_zfec.py
docs: update docs and metadata
[tahoe-lafs/zfec.git] / zfec / zfec / cmdline_zfec.py
1 #!/usr/bin/env python
2
3 # zfec -- a fast C implementation of Reed-Solomon erasure coding with
4 # command-line, C, and Python interfaces
5
6 import sys
7
8 import argparse
9 import filefec
10
11 from zfec import __version__ as libversion
12 __version__ = libversion
13
14 DEFAULT_K=3
15 DEFAULT_M=8
16
17 def main():
18
19     if '-V' in sys.argv or '--version' in sys.argv:
20         print "zfec library version: ", libversion
21         print "zfec command-line tool version: ", __version__
22         sys.exit(0)
23
24     parser = argparse.ArgumentParser(description="Encode a file into a set of share files, a subset of which can later be used to recover the original file.")
25
26     parser.add_argument('inputfile', help='file to encode or "-" for stdin', type=argparse.FileType('rb'), metavar='INF')
27     parser.add_argument('-d', '--output-dir', help='directory in which share file names will be created (default ".")', default='.', metavar='D')
28     parser.add_argument('-p', '--prefix', help='prefix for share file names; If omitted, the name of the input file will be used.', metavar='P')
29     parser.add_argument('-s', '--suffix', help='suffix for share file names (default ".fec")', default='.fec', metavar='S')
30     parser.add_argument('-m', '--totalshares', help='the total number of share files created (default %d)' % DEFAULT_M, default=DEFAULT_M, type=int, metavar='M')
31     parser.add_argument('-k', '--requiredshares', help='the number of share files required to reconstruct (default %d)' % DEFAULT_K, default=DEFAULT_K, type=int, metavar='K')
32     parser.add_argument('-f', '--force', help='overwrite any file which already in place an output file (share file)', action='store_true')
33     parser.add_argument('-v', '--verbose', help='print out messages about progress', action='store_true')
34     parser.add_argument('-q', '--quiet', help='quiet progress indications and warnings about silly choices of K and M', action='store_true')
35     parser.add_argument('-V', '--version', help='print out version number and exit', action='store_true')
36     args = parser.parse_args()
37
38     if args.prefix is None:
39         args.prefix = args.inputfile.name
40         if args.prefix == "<stdin>":
41             args.prefix = ""
42
43     if args.verbose and args.quiet:
44         print "Please choose only one of --verbose and --quiet."
45         sys.exit(1)
46
47     if args.totalshares > 256 or args.totalshares < 1:
48         print "Invalid parameters, totalshares is required to be <= 256 and >= 1\nPlease see the accompanying documentation."
49         sys.exit(1)
50     if args.requiredshares > args.totalshares or args.requiredshares < 1:
51         print "Invalid parameters, requiredshares is required to be <= totalshares and >= 1\nPlease see the accompanying documentation."
52         sys.exit(1)
53
54     if not args.quiet:
55         if args.requiredshares == 1:
56             print "warning: silly parameters: requiredshares == 1, which means that every share will be a complete copy of the file.  You could use \"cp\" for the same effect.  But proceeding to do it anyway..."
57         if args.requiredshares == args.totalshares:
58             print "warning: silly parameters: requiredshares == totalshares, which means that all shares will be required in order to reconstruct the file.  You could use \"split\" for the same effect.  But proceeding to do it anyway..."
59
60     args.inputfile.seek(0, 2)
61     fsize = args.inputfile.tell()
62     args.inputfile.seek(0, 0)
63     return filefec.encode_to_files(args.inputfile, fsize, args.output_dir, args.prefix, args.requiredshares, args.totalshares, args.suffix, args.force, args.verbose)
64
65 # zfec -- fast forward error correction library with Python interface
66 #
67 # Copyright (C) 2007 Allmydata, Inc.
68 # Author: Zooko Wilcox-O'Hearn
69 #
70 # This file is part of zfec.
71 #
72 # See README.rst for licensing information.