...
1 package main
2
3 import (
4 "fmt"
5 "log"
6 "os"
7
8 docopt "github.com/flynn/go-docopt"
9 tuf "github.com/theupdateframework/go-tuf/client"
10 tuf_leveldbstore "github.com/theupdateframework/go-tuf/client/leveldbstore"
11 )
12
13 func main() {
14 log.SetFlags(0)
15
16 usage := `usage: tuf-client [-h|--help] <command> [<args>...]
17
18 Options:
19 -h, --help
20
21 Commands:
22 help Show usage for a specific command
23 init Initialize with root keys
24 list List available target files
25 get Get a target file
26
27 See "tuf-client help <command>" for more information on a specific command.
28 `
29
30 args, _ := docopt.Parse(usage, nil, true, "", true)
31 cmd := args.String["<command>"]
32 cmdArgs := args.All["<args>"].([]string)
33
34 if cmd == "help" {
35 if len(cmdArgs) == 0 {
36 fmt.Fprint(os.Stdout, usage)
37 return
38 } else {
39 cmd = cmdArgs[0]
40 cmdArgs = []string{"--help"}
41 }
42 }
43
44 if err := runCommand(cmd, cmdArgs); err != nil {
45 log.Fatalln("ERROR:", err)
46 }
47 }
48
49 type cmdFunc func(*docopt.Args, *tuf.Client) error
50
51 type command struct {
52 usage string
53 f cmdFunc
54 }
55
56 var commands = make(map[string]*command)
57
58 func register(name string, f cmdFunc, usage string) {
59 commands[name] = &command{usage: usage, f: f}
60 }
61
62 func runCommand(name string, args []string) error {
63 argv := make([]string, 1, 1+len(args))
64 argv[0] = name
65 argv = append(argv, args...)
66
67 cmd, ok := commands[name]
68 if !ok {
69 return fmt.Errorf("%s is not a tuf-client command. See 'tuf-client help'", name)
70 }
71
72 parsedArgs, err := docopt.Parse(cmd.usage, argv, true, "", true)
73 if err != nil {
74 return err
75 }
76
77 client, err := tufClient(parsedArgs)
78 if err != nil {
79 return err
80 }
81 return cmd.f(parsedArgs, client)
82 }
83
84 func tufClient(args *docopt.Args) (*tuf.Client, error) {
85 store, ok := args.String["--store"]
86 if !ok {
87 store = args.String["-s"]
88 }
89 local, err := tuf_leveldbstore.FileLocalStore(store)
90 if err != nil {
91 return nil, err
92 }
93 remote, err := tuf.HTTPRemoteStore(args.String["<url>"], nil, nil)
94 if err != nil {
95 return nil, err
96 }
97 return tuf.NewClient(local, remote), nil
98 }
99
View as plain text