@@ -2,31 +2,64 @@ package main
2
2
3
3
import (
4
4
"encoding/json"
5
- "flag"
6
5
"fmt"
6
+ "io"
7
7
"os"
8
8
9
+ cli "github.com/jawher/mow.cli"
9
10
"www.velocidex.com/golang/binparsergen"
10
- prefetch "www.velocidex.com/golang/go-prefetch"
11
+ "www.velocidex.com/golang/go-prefetch"
11
12
)
12
13
13
14
func main () {
14
- flag .Parse ()
15
+ // create an app
16
+ app := cli .App ("prefetch" , "parse pf files" )
15
17
16
- args := flag .Args ()
17
- if len (args ) == 0 {
18
- flag .Usage ()
19
- os .Exit (1 )
20
- }
18
+ // Specify the action to execute when the app is invoked correctly
19
+ app .Command ("parse" , "Parse pf files" , func (cmd * cli.Cmd ) {
20
+ file := cmd .StringsArg ("PF_FILE" , nil , "Prefix .pf files" )
21
+ cmd .Spec = "PF_FILE..."
21
22
22
- for _ , arg := range args {
23
- fd , err := os .Open (arg )
24
- binparsergen .FatalIfError (err , fmt .Sprintf ("Open file: %v" , err ))
23
+ cmd .Action = func () {
24
+ for _ , arg := range * file {
25
+ fd , err := os .Open (arg )
26
+ binparsergen .FatalIfError (err , fmt .Sprintf ("Open file: %v" , err ))
25
27
26
- prefetch_obj , err := prefetch .LoadPrefetch (fd )
27
- binparsergen .FatalIfError (err , fmt .Sprintf ("Parsing Error: %v" , err ))
28
+ prefetch_obj , err := prefetch .LoadPrefetch (fd )
29
+ binparsergen .FatalIfError (err , fmt .Sprintf ("Parsing Error: %v" , err ))
28
30
29
- serialized_content , _ := json .MarshalIndent (prefetch_obj , " " , " " )
30
- fmt .Println (string (serialized_content ))
31
- }
31
+ serialized_content , _ := json .MarshalIndent (prefetch_obj , " " , " " )
32
+ fmt .Println (string (serialized_content ))
33
+ }
34
+ }
35
+ })
36
+
37
+ app .Command ("extract" , "Export a compressed pf file" , func (cmd * cli.Cmd ) {
38
+ file := cmd .StringArg ("PF_FILE" , "" , "Prefix .pf files" )
39
+
40
+ cmd .Action = func () {
41
+ profile := prefetch .NewPrefetchProfile ()
42
+ reader , err := os .Open (* file )
43
+ binparsergen .FatalIfError (err , fmt .Sprintf ("OpenFile: %v" , err ))
44
+
45
+ header := profile .MAMHeader (reader , 0 )
46
+ if header .Signature () == "MAM\x04 " {
47
+ // Need to decompress it in memory.
48
+ data := make ([]byte , header .UncompressedSize ())
49
+ n , err := reader .ReadAt (data , int64 (header .Size ()))
50
+ if err != io .EOF {
51
+ binparsergen .FatalIfError (err , fmt .Sprintf ("Open file: %v" , err ))
52
+ }
53
+
54
+ decompressed , err := prefetch .LZXpressHuffmanDecompress (
55
+ data [:n ], int (header .UncompressedSize ()))
56
+ binparsergen .FatalIfError (err , fmt .Sprintf ("Open file: %v" , err ))
57
+
58
+ os .Stdout .Write (decompressed )
59
+ }
60
+ }
61
+ })
62
+
63
+ // Invoke the app passing in os.Args
64
+ app .Run (os .Args )
32
65
}
0 commit comments