github.com/dcarley/cf-cli@v6.24.1-0.20170220111324-4225ff346898+incompatible/cf/commands/ssh_code.go (about)

     1  package commands
     2  
     3  import (
     4  	"errors"
     5  
     6  	"code.cloudfoundry.org/cli/cf/flags"
     7  	. "code.cloudfoundry.org/cli/cf/i18n"
     8  
     9  	"code.cloudfoundry.org/cli/cf/api/authentication"
    10  	"code.cloudfoundry.org/cli/cf/commandregistry"
    11  	"code.cloudfoundry.org/cli/cf/configuration/coreconfig"
    12  	"code.cloudfoundry.org/cli/cf/requirements"
    13  	"code.cloudfoundry.org/cli/cf/terminal"
    14  )
    15  
    16  //go:generate counterfeiter . SSHCodeGetter
    17  
    18  type SSHCodeGetter interface {
    19  	commandregistry.Command
    20  	Get() (string, error)
    21  }
    22  
    23  type OneTimeSSHCode struct {
    24  	ui           terminal.UI
    25  	config       coreconfig.ReadWriter
    26  	authRepo     authentication.Repository
    27  	endpointRepo coreconfig.EndpointRepository
    28  }
    29  
    30  func init() {
    31  	commandregistry.Register(&OneTimeSSHCode{})
    32  }
    33  
    34  func (cmd *OneTimeSSHCode) MetaData() commandregistry.CommandMetadata {
    35  	return commandregistry.CommandMetadata{
    36  		Name:        "ssh-code",
    37  		Description: T("Get a one time password for ssh clients"),
    38  		Usage: []string{
    39  			T("CF_NAME ssh-code"),
    40  		},
    41  	}
    42  }
    43  
    44  func (cmd *OneTimeSSHCode) Requirements(requirementsFactory requirements.Factory, fc flags.FlagContext) ([]requirements.Requirement, error) {
    45  	usageReq := requirements.NewUsageRequirement(commandregistry.CLICommandUsagePresenter(cmd),
    46  		T("No argument required"),
    47  		func() bool {
    48  			return len(fc.Args()) != 0
    49  		},
    50  	)
    51  
    52  	reqs := []requirements.Requirement{
    53  		usageReq,
    54  		requirementsFactory.NewAPIEndpointRequirement(),
    55  	}
    56  
    57  	return reqs, nil
    58  }
    59  
    60  func (cmd *OneTimeSSHCode) SetDependency(deps commandregistry.Dependency, _ bool) commandregistry.Command {
    61  	cmd.ui = deps.UI
    62  	cmd.config = deps.Config
    63  	cmd.authRepo = deps.RepoLocator.GetAuthenticationRepository()
    64  	cmd.endpointRepo = deps.RepoLocator.GetEndpointRepository()
    65  
    66  	return cmd
    67  }
    68  
    69  func (cmd *OneTimeSSHCode) Execute(c flags.FlagContext) error {
    70  	code, err := cmd.Get()
    71  	if err != nil {
    72  		return err
    73  	}
    74  
    75  	cmd.ui.Say(code)
    76  	return nil
    77  }
    78  
    79  func (cmd *OneTimeSSHCode) Get() (string, error) {
    80  	refresher := coreconfig.APIConfigRefresher{
    81  		Endpoint:     cmd.config.APIEndpoint(),
    82  		EndpointRepo: cmd.endpointRepo,
    83  		Config:       cmd.config,
    84  	}
    85  
    86  	_, err := refresher.Refresh()
    87  	if err != nil {
    88  		return "", errors.New("Error refreshing config: " + err.Error())
    89  	}
    90  
    91  	token, err := cmd.authRepo.RefreshAuthToken()
    92  	if err != nil {
    93  		return "", errors.New(T("Error refreshing oauth token: ") + err.Error())
    94  	}
    95  
    96  	sshCode, err := cmd.authRepo.Authorize(token)
    97  	if err != nil {
    98  		return "", errors.New(T("Error getting SSH code: ") + err.Error())
    99  	}
   100  
   101  	return sshCode, nil
   102  }