Commit 3f009e7647f335dfafa1ed1da6c7a9ec6e09ee7b

Authored by Christian Herdtweck
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:
... ...