...

Source file src/github.com/theupdateframework/go-tuf/cmd/tuf-client/main.go

Documentation: github.com/theupdateframework/go-tuf/cmd/tuf-client

     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 { // `tuf-client help`
    36  			fmt.Fprint(os.Stdout, usage)
    37  			return
    38  		} else { // `tuf-client help <command>`
    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