1
1
#!/usr/bin/env python3
2
2
3
3
import argparse
4
+ import sys
5
+ import json
4
6
5
- from polydet import magic , scan , rules
7
+ from polydet import magic , scan , rules , PolyglotLevel
6
8
7
9
8
- def display_results (results : [(str , {})], indent = False ):
9
- for result in results .items ():
10
- if indent :
11
- print ('\t ' , end = '' )
12
- print ('%s: %s' % (result [0 ], result [1 ]))
10
+ class PolyglotLevelEncoder (json .JSONEncoder ):
11
+ def default (self , o ):
12
+ if isinstance (o , PolyglotLevel ):
13
+ return {
14
+ 'isValid' : o .is_valid ,
15
+ 'suspiciousChunks' : o .suspicious_chunks ,
16
+ 'embedded' : sorted (o .embedded )
17
+ }
18
+
19
+ return super ().default (o )
20
+
21
+
22
+ def display_results (results : {str : {str : PolyglotLevel }}, fp ):
23
+ json .dump (results , fp , cls = PolyglotLevelEncoder )
13
24
14
25
15
26
def create_arg_parser ():
@@ -22,6 +33,7 @@ def create_arg_parser():
22
33
arg_parser .add_argument ('-r' , '--rules' , dest = 'rules' , type = str , help = 'File to load and store rules to speed up the process.' )
23
34
arg_parser .add_argument ('-c' , '--recompile' , dest = 'recompile' , action = 'store_true' , help = 'Re-compile rules. '
24
35
'Require --rules' )
36
+ arg_parser .add_argument ('-o' , '--output' , default = '-' , help = 'Output file' )
25
37
return arg_parser
26
38
27
39
@@ -39,12 +51,15 @@ def main():
39
51
else :
40
52
rules .load_or_compile (args .rules )
41
53
42
- if len (args .files ) == 1 :
43
- display_results (scan (args .files [0 ], use_magic = args .magic ))
54
+ results = dict ()
55
+ for filename in args .files :
56
+ results [filename ] = scan (filename , use_magic = args .magic )
57
+
58
+ if args .output != '-' :
59
+ with open (args .output ) as output :
60
+ display_results (results , output )
44
61
else :
45
- for filename in args .files :
46
- print ('%s:' % filename )
47
- display_results (scan (filename , use_magic = args .magic ), indent = True )
62
+ display_results (results , sys .stdout )
48
63
49
64
50
65
if __name__ == '__main__' :
0 commit comments