// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

/*
The gomote command is a client for the Go builder infrastructure.
It's a remote control for remote Go builder machines.

See https://golang.org/wiki/Gomote

Usage:

  gomote [global-flags] cmd [cmd-flags]

  For example,
  $ gomote create openbsd-amd64-60
  user-username-openbsd-amd64-60-0
  $ gomote push user-username-openbsd-amd64-60-0
  $ gomote run user-username-openbsd-amd64-60-0 go/src/make.bash
  $ gomote run user-username-openbsd-amd64-60-0 go/bin/go test -v -short os

To list the subcommands, run "gomote" without arguments:

  Commands:

    create     create a buildlet
    destroy    destroy a buildlet
    gettar     extract a tar.gz from a buildlet
    list       list buildlets
    ls         list the contents of a directory on a buildlet
    ping       test whether a buildlet is alive and reachable
    push       sync the repo of your pwd to the buildlet
    put        put files on a buildlet
    put14      put Go 1.4 in place
    puttar     extract a tar.gz to a buildlet
    rm         delete files or directories
    run        run a command on a buildlet

To list all the builder types available, run "create" with no arguments:

  $ gomote create
  (tons of builder types)

The "gomote run" command has many of its own flags:

  $ gomote run -h
  create usage: gomote run [run-opts] <instance> <cmd> [args...]
    -builderenv string
          Optional alternate builder to act like. Must share the same
          underlying buildlet host type, or it's an error. For
          instance, linux-amd64-race or linux-386-387 are compatible
          with linux-amd64, but openbsd-amd64 and openbsd-386 are
          different hosts.
    -debug
          write debug info about the command's execution before it begins
    -dir string
          Directory to run from. Defaults to the directory of the
          command, or the work directory if -system is true.
    -e value
          Environment variable KEY=value. The -e flag may be repeated
          multiple times to add multiple things to the environment.
    -path string
          Comma-separated list of ExecOpts.Path elements. The special
          string 'EMPTY' means to run without any $PATH. The empty
          string (default) does not modify the $PATH. Otherwise, the
          following expansions apply: the string '$PATH' expands to
          the current PATH element(s), the substring '$WORKDIR'
          expands to the buildlet's temp workdir.
    -system
          run inside the system, and not inside the workdir; this is implicit if cmd starts with '/'

Debugging buildlets directly

Using "gomote create" contacts the build coordinator
(farmer.golang.org) and requests that it create the buildlet on your
behalf. All subsequent commands (such as "gomote run" or "gomote ls")
then proxy your request via the coordinator.  To access a buildlet
directly (for example, when working on the buildlet code), you can
skip the "gomote create" step and use the special builder name
"<build-config-name>@ip[:port>", such as "windows-amd64-gce@10.1.5.3".

*/
package main

import (
	"flag"
	"fmt"
	"os"
	"sort"

	"golang.org/x/build/buildenv"
	"golang.org/x/build/buildlet"
)

var (
	buildEnv *buildenv.Environment
)

type command struct {
	name string
	des  string
	run  func([]string) error
}

var commands = map[string]command{}

func sortedCommands() []string {
	s := make([]string, 0, len(commands))
	for name := range commands {
		s = append(s, name)
	}
	sort.Strings(s)
	return s
}

func usage() {
	fmt.Fprintf(os.Stderr, `Usage of gomote: gomote [global-flags] <cmd> [cmd-flags]

Global flags:
`)
	flag.PrintDefaults()
	fmt.Fprintf(os.Stderr, "Commands:\n\n")
	for _, name := range sortedCommands() {
		fmt.Fprintf(os.Stderr, "  %-10s %s\n", name, commands[name].des)
	}
	os.Exit(1)
}

func registerCommand(name, des string, run func([]string) error) {
	if _, dup := commands[name]; dup {
		panic("duplicate registration of " + name)
	}
	commands[name] = command{
		name: name,
		des:  des,
		run:  run,
	}
}

func registerCommands() {
	registerCommand("create", "create a buildlet", create)
	registerCommand("destroy", "destroy a buildlet", destroy)
	registerCommand("gettar", "extract a tar.gz from a buildlet", getTar)
	registerCommand("ls", "list the contents of a directory on a buildlet", ls)
	registerCommand("list", "list buildlets", list)
	registerCommand("ping", "test whether a buildlet is alive and reachable ", ping)
	registerCommand("push", "sync the repo of your pwd to the buildlet", push)
	registerCommand("put", "put files on a buildlet", put)
	registerCommand("put14", "put Go 1.4 in place", put14)
	registerCommand("puttar", "extract a tar.gz to a buildlet", putTar)
	registerCommand("rm", "delete files or directories", rm)
	registerCommand("run", "run a command on a buildlet", run)
}

func main() {
	buildlet.RegisterFlags()
	registerCommands()
	flag.Usage = usage
	flag.Parse()
	buildEnv = buildenv.FromFlags()
	args := flag.Args()
	if len(args) == 0 {
		usage()
	}
	cmdName := args[0]
	cmd, ok := commands[cmdName]
	if !ok {
		fmt.Fprintf(os.Stderr, "Unknown command %q\n", cmdName)
		usage()
	}
	err := cmd.run(args[1:])
	if err != nil {
		fmt.Fprintf(os.Stderr, "Error running %s: %v\n", cmdName, err)
		os.Exit(1)
	}
}
