Commit 3f009e7647f335dfafa1ed1da6c7a9ec6e09ee7b
1 parent
471b141f
oleobj: upgrade from optparse to argparse
Showing
1 changed file
with
43 additions
and
38 deletions
oletools/oleobj.py
| ... | ... | @@ -46,7 +46,7 @@ from __future__ import print_function |
| 46 | 46 | |
| 47 | 47 | import logging |
| 48 | 48 | import struct |
| 49 | -import optparse | |
| 49 | +import argparse | |
| 50 | 50 | import os |
| 51 | 51 | import re |
| 52 | 52 | import sys |
| ... | ... | @@ -660,6 +660,13 @@ def process_file(filename, data, output_dir=None): |
| 660 | 660 | # === MAIN ==================================================================== |
| 661 | 661 | |
| 662 | 662 | |
| 663 | +def existing_file(filename): | |
| 664 | + """ called by argument parser to see whether given file exists """ | |
| 665 | + if not os.path.isfile(filename): | |
| 666 | + raise argparse.ArgumentTypeError('{0} is not a file.'.format(filename)) | |
| 667 | + return filename | |
| 668 | + | |
| 669 | + | |
| 663 | 670 | def main(): |
| 664 | 671 | """ main function, called when running this as script """ |
| 665 | 672 | # print banner with version |
| ... | ... | @@ -669,53 +676,51 @@ def main(): |
| 669 | 676 | 'https://github.com/decalage2/oletools/issues') |
| 670 | 677 | print('') |
| 671 | 678 | |
| 672 | - usage = 'usage: %prog [options] <filename> [filename2 ...]' | |
| 673 | - parser = optparse.OptionParser(usage=usage) | |
| 674 | - # parser.add_option('-o', '--outfile', dest='outfile', | |
| 679 | + usage = 'usage: %(prog)s [options] <filename> [filename2 ...]' | |
| 680 | + parser = argparse.ArgumentParser(usage=usage) | |
| 681 | + # parser.add_argument('-o', '--outfile', dest='outfile', | |
| 675 | 682 | # help='output file') |
| 676 | - # parser.add_option('-c', '--csv', dest='csv', | |
| 683 | + # parser.add_argument('-c', '--csv', dest='csv', | |
| 677 | 684 | # help='export results to a CSV file') |
| 678 | - parser.add_option("-r", action="store_true", dest="recursive", | |
| 679 | - help='find files recursively in subdirectories.') | |
| 680 | - parser.add_option("-d", type="str", dest="output_dir", default=None, | |
| 681 | - help='use specified directory to output files.') | |
| 682 | - parser.add_option("-z", "--zip", dest='zip_password', type='str', | |
| 683 | - default=None, | |
| 684 | - help='if the file is a zip archive, open first file from' | |
| 685 | - 'it, using the provided password (requires Python ' | |
| 686 | - '2.6+)') | |
| 687 | - parser.add_option("-f", "--zipfname", dest='zip_fname', type='str', | |
| 688 | - default='*', | |
| 689 | - help='if the file is a zip archive, file(s) to be opened' | |
| 690 | - 'within the zip. Wildcards * and ? are supported. ' | |
| 691 | - '(default:*)') | |
| 692 | - parser.add_option('-l', '--loglevel', dest="loglevel", action="store", | |
| 693 | - default=DEFAULT_LOG_LEVEL, | |
| 694 | - help='logging level debug/info/warning/error/critical ' | |
| 695 | - '(default=%default)') | |
| 685 | + parser.add_argument("-r", action="store_true", dest="recursive", | |
| 686 | + help='find files recursively in subdirectories.') | |
| 687 | + parser.add_argument("-d", type=str, dest="output_dir", default=None, | |
| 688 | + help='use specified directory to output files.') | |
| 689 | + parser.add_argument("-z", "--zip", dest='zip_password', type=str, | |
| 690 | + default=None, | |
| 691 | + help='if the file is a zip archive, open first file ' | |
| 692 | + 'from it, using the provided password (requires ' | |
| 693 | + 'Python 2.6+)') | |
| 694 | + parser.add_argument("-f", "--zipfname", dest='zip_fname', type=str, | |
| 695 | + default='*', | |
| 696 | + help='if the file is a zip archive, file(s) to be ' | |
| 697 | + 'opened within the zip. Wildcards * and ? are ' | |
| 698 | + 'supported. (default:*)') | |
| 699 | + parser.add_argument('-l', '--loglevel', dest="loglevel", action="store", | |
| 700 | + default=DEFAULT_LOG_LEVEL, | |
| 701 | + help='logging level debug/info/warning/error/critical ' | |
| 702 | + '(default=%(default)s)') | |
| 703 | + parser.add_argument('input', nargs='*', type=existing_file, metavar='FILE', | |
| 704 | + help='Office files to parse (same as -i)') | |
| 696 | 705 | |
| 697 | 706 | # options for compatibility with ripOLE |
| 698 | - parser.add_option('-i', '--more-input', type='str', default=None, | |
| 699 | - help='Additional file to parse (same as positional ' | |
| 700 | - 'arguments)') | |
| 701 | - parser.add_option('-v', '--verbose', action='store_true', | |
| 702 | - help='verbose mode, set logging to DEBUG ' | |
| 703 | - '(overwrites -l)') | |
| 704 | - | |
| 705 | - (options, args) = parser.parse_args() | |
| 707 | + parser.add_argument('-i', '--more-input', type=str, metavar='FILE', | |
| 708 | + help='Additional file to parse (same as positional ' | |
| 709 | + 'arguments)') | |
| 710 | + parser.add_argument('-v', '--verbose', action='store_true', | |
| 711 | + help='verbose mode, set logging to DEBUG ' | |
| 712 | + '(overwrites -l)') | |
| 713 | + | |
| 714 | + options = parser.parse_args() | |
| 706 | 715 | if options.more_input: |
| 707 | - args += [options.more_input, ] | |
| 716 | + options.input += [options.more_input, ] | |
| 708 | 717 | if options.verbose: |
| 709 | 718 | options.loglevel = 'debug' |
| 710 | 719 | |
| 711 | 720 | # Print help if no arguments are passed |
| 712 | - if not args: | |
| 721 | + if not options.input: | |
| 713 | 722 | parser.print_help() |
| 714 | 723 | return RETURN_ERR_ARGS |
| 715 | - for filename in args: | |
| 716 | - if not os.path.isfile(filename): | |
| 717 | - print('File does not exist: ' + filename) | |
| 718 | - return RETURN_ERR_ARGS | |
| 719 | 724 | |
| 720 | 725 | # Setup logging to the console: |
| 721 | 726 | # here we use stdout instead of stderr by default, so that the output |
| ... | ... | @@ -731,7 +736,7 @@ def main(): |
| 731 | 736 | any_did_dump = False |
| 732 | 737 | |
| 733 | 738 | for container, filename, data in \ |
| 734 | - xglob.iter_files(args, recursive=options.recursive, | |
| 739 | + xglob.iter_files(options.input, recursive=options.recursive, | |
| 735 | 740 | zip_password=options.zip_password, |
| 736 | 741 | zip_fname=options.zip_fname): |
| 737 | 742 | # ignore directory names stored in zip files: | ... | ... |