Imported Upstream version 2.0.1+dfsg
[packages/binwalk.git] / src / scripts / binwalk
1 #!/usr/bin/env python
2
3 import os
4 import sys
5 from threading import Thread
6
7 # If installed to a custom prefix directory, binwalk may not be in
8 # the default module search path(s). Try to resolve the prefix module
9 # path and make it the first entry in sys.path.
10 _module_path = os.path.join(os.path.dirname(os.path.dirname(__file__)),
11                             "lib",
12                             "python%d.%d" % (sys.version_info[0], sys.version_info[1]),
13                             "site-packages")
14 if os.path.exists(_module_path) and _module_path not in sys.path:
15     sys.path = [_module_path] + sys.path
16
17 import binwalk
18 from binwalk.core.compat import user_input
19
20 def display_status(m):
21     # Display the current scan progress when the enter key is pressed.
22     while True:
23         try:
24             user_input()
25             sys.stderr.write("Progress: %.2f%% (%d / %d)\n\n" % (((float(m.status.completed) / float(m.status.total)) * 100), m.status.completed, m.status.total))
26         except KeyboardInterrupt as e:
27             raise e
28         except Exception:
29             pass
30
31 def usage(modules):
32     sys.stderr.write(modules.help())
33     sys.exit(1)
34
35 def main():
36     modules = binwalk.Modules()
37
38     # Start the display_status function as a daemon thread.
39     t = Thread(target=display_status, args=(modules,))
40     t.setDaemon(True)
41     t.start()
42
43     try:
44         if len(sys.argv) == 1:
45             usage(modules)
46         elif not modules.execute():
47             modules.execute(*sys.argv[1:], signature=True)
48     except binwalk.ModuleException as e:
49         sys.stderr.write(str(e) + '\n')
50         sys.exit(1)
51
52 if __name__ == '__main__':
53     try:
54         # Special options for profiling the code. For debug use only.
55         if '--profile' in sys.argv:
56             import cProfile
57             sys.argv.pop(sys.argv.index('--profile'))
58             cProfile.run('main()')
59         else:
60             main()
61     except IOError:
62         pass
63     except KeyboardInterrupt:
64         sys.stdout.write("\n")
65