Commit 66a9fd77b6d1c8e8799d6fc6dbf2d744d937bf08

Authored by decalage2
1 parent c16ca78e

olemeta: added optparse and xglob to process multiple files and zips (issue #141)

oletools/olemeta.py
... ... @@ -48,19 +48,20 @@ http://www.decalage.info/python/oletools
48 48 # 2016-10-25 PL: - fixed print for Python 3
49 49 # 2016-10-28 PL: - removed the UTF8 codec for console display
50 50 # 2017-04-26 v0.51 PL: - fixed absolute imports (issue #141)
  51 +# 2017-05-04 PL: - added optparse and xglob (issue #141)
51 52  
52   -__version__ = '0.51'
  53 +__version__ = '0.51dev7'
53 54  
54 55 #------------------------------------------------------------------------------
55 56 # TODO:
56   -# + optparse
57 57 # + nicer output: table with fixed columns, datetime, etc
58 58 # + CSV output
59 59 # + option to only show available properties (by default)
  60 +# + display codepage names
60 61  
61 62 #=== IMPORTS =================================================================
62 63  
63   -import sys, os, codecs
  64 +import sys, os, optparse
64 65  
65 66 # IMPORTANT: it should be possible to run oletools directly as scripts
66 67 # in any directory without installing them with pip or setup.py.
... ... @@ -75,17 +76,13 @@ if not _parent_dir in sys.path:
75 76 sys.path.insert(0, _parent_dir)
76 77  
77 78 from oletools.thirdparty import olefile
  79 +from oletools.thirdparty import xglob
78 80 from oletools.thirdparty.tablestream import tablestream
79 81  
80 82  
81 83 #=== MAIN =================================================================
82 84  
83   -def main():
84   - try:
85   - ole = olefile.OleFileIO(sys.argv[1])
86   - except IndexError:
87   - sys.exit(__doc__)
88   -
  85 +def process_ole(ole):
89 86 # parse and display metadata:
90 87 meta = ole.get_metadata()
91 88  
... ... @@ -128,7 +125,53 @@ def main():
128 125 t.write_row([prop, value], colors=[None, 'yellow'])
129 126 t.close()
130 127  
131   - ole.close()
  128 +
  129 +# === MAIN ===================================================================
  130 +
  131 +def main():
  132 + # print banner with version
  133 + print('olemeta %s - http://decalage.info/python/oletools' % __version__)
  134 + print ('THIS IS WORK IN PROGRESS - Check updates regularly!')
  135 + print ('Please report any issue at https://github.com/decalage2/oletools/issues')
  136 +
  137 + usage = 'usage: olemeta [options] <filename> [filename2 ...]'
  138 + parser = optparse.OptionParser(usage=usage)
  139 + parser.add_option("-r", action="store_true", dest="recursive",
  140 + help='find files recursively in subdirectories.')
  141 + parser.add_option("-z", "--zip", dest='zip_password', type='str', default=None,
  142 + help='if the file is a zip archive, open all files from it, using the provided password (requires Python 2.6+)')
  143 + parser.add_option("-f", "--zipfname", dest='zip_fname', type='str', default='*',
  144 + help='if the file is a zip archive, file(s) to be opened within the zip. Wildcards * and ? are supported. (default:*)')
  145 +
  146 + # TODO: add logfile option
  147 + # parser.add_option('-l', '--loglevel', dest="loglevel", action="store", default=DEFAULT_LOG_LEVEL,
  148 + # help="logging level debug/info/warning/error/critical (default=%default)")
  149 +
  150 + (options, args) = parser.parse_args()
  151 +
  152 + # Print help if no arguments are passed
  153 + if len(args) == 0:
  154 + print(__doc__)
  155 + parser.print_help()
  156 + sys.exit()
  157 +
  158 + for container, filename, data in xglob.iter_files(args, recursive=options.recursive,
  159 + zip_password=options.zip_password, zip_fname=options.zip_fname):
  160 + # TODO: handle xglob errors
  161 + # ignore directory names stored in zip files:
  162 + if container and filename.endswith('/'):
  163 + continue
  164 + full_name = '%s in %s' % (filename, container) if container else filename
  165 + print("=" * 79)
  166 + print('FILE: %s\n' % full_name)
  167 + if data is not None:
  168 + # data extracted from zip file
  169 + ole = olefile.OleFileIO(data)
  170 + else:
  171 + # normal filename
  172 + ole = olefile.OleFileIO(filename)
  173 + process_ole(ole)
  174 + ole.close()
132 175  
133 176 if __name__ == '__main__':
134 177 main()
... ...
oletools/oletimes.py
... ... @@ -49,7 +49,7 @@ http://www.decalage.info/python/oletools
49 49 # 2016-07-20 v0.50 SL: - added Python 3 support
50 50 # 2016-09-05 PL: - added main entry point for setup.py
51 51 # 2017-05-03 v0.51 PL: - fixed absolute imports (issue #141)
52   -# 2017-05-04 PL: - added optparse and xglob
  52 +# 2017-05-04 PL: - added optparse and xglob (issue #141)
53 53  
54 54 __version__ = '0.51dev7'
55 55  
... ... @@ -112,7 +112,6 @@ def main():
112 112 print('oletimes %s - http://decalage.info/python/oletools' % __version__)
113 113 print ('THIS IS WORK IN PROGRESS - Check updates regularly!')
114 114 print ('Please report any issue at https://github.com/decalage2/oletools/issues')
115   - print ('')
116 115  
117 116 usage = 'usage: oletimes [options] <filename> [filename2 ...]'
118 117 parser = optparse.OptionParser(usage=usage)
... ...