Skip to content

Commit

Permalink
Merge pull request #34 from exitshell/task-17
Browse files Browse the repository at this point in the history
Task-17: Funnel errors to cobra commands
  • Loading branch information
TunedMystic committed Oct 7, 2017
2 parents 2bfa471 + 72818b4 commit 2c832be
Show file tree
Hide file tree
Showing 9 changed files with 85 additions and 42 deletions.
12 changes: 10 additions & 2 deletions cmd/args.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cmd

import (
"fmt"
"log"

"github.com/exitshell/konnect/engine"
Expand All @@ -14,14 +15,21 @@ var ArgsCmd = &cobra.Command{
Long: "Print the SSH command for a host",
Run: func(cmd *cobra.Command, args []string) {
// Resolve filename from flags.
filename := resolveFilename(cmd)
filename, err := resolveFilename(cmd)
handleErr(err)

// Check that only one host was specified.
if len(args) != 1 {
log.Fatal("Please specify one host")
}

// Init engine.
konnect, err := engine.Init(filename)
handleErr(err)

// Print Host SSH command.
engine.Init(filename).Args(args[0])
hostArgs, err := konnect.Args(args[0])
handleErr(err)
fmt.Println(hostArgs)
},
}
18 changes: 12 additions & 6 deletions cmd/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,15 @@ func init() {
func InteractivePrompt(cmd *cobra.Command) {
fmt.Println("Starting interactive prompt...")
// Resolve filename from flags.
filename := resolveFilename(cmd)
filename, err := resolveFilename(cmd)
handleErr(err)

// Init Konnect engine and get host names.
engine := engine.Init(filename)
hosts := engine.GetHosts()
// Init engine.
konnect, err := engine.Init(filename)
handleErr(err)

// Get host names.
hosts := konnect.GetHosts()

// Create survey.
prompt := []*survey.Question{
Expand All @@ -81,12 +85,14 @@ func InteractivePrompt(cmd *cobra.Command) {
}{}

// Show prompt.
if err := survey.Ask(prompt, &answer); err != nil {
if err = survey.Ask(prompt, &answer); err != nil {
log.Fatal("No host was selected")
}

// Connect to host.
engine.Connect(answer.Hostname)
if err := konnect.Connect(answer.Hostname); err != nil {
log.Fatal(err)
}
}

// AddCommands - Connects subcommands to the RootCmd.
Expand Down
11 changes: 9 additions & 2 deletions cmd/connect.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,21 @@ var ConnectCmd = &cobra.Command{
Long: "Connect to a host",
Run: func(cmd *cobra.Command, args []string) {
// Resolve filename from flags.
filename := resolveFilename(cmd)
filename, err := resolveFilename(cmd)
handleErr(err)

// Check that only one host was specified.
if len(args) != 1 {
log.Fatal("Please specify one host")
}

// Init engine.
konnect, err := engine.Init(filename)
handleErr(err)

// Connect to host.
engine.Init(filename).Connect(args[0])
if err := konnect.Connect(args[0]); err != nil {
log.Fatal(err)
}
},
}
6 changes: 4 additions & 2 deletions cmd/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ var InitCmd = &cobra.Command{
log.Fatal("Too many args. Please specify a directory")
}

// If specified, then use the given directory.
// If a diectory is specified, then use the given directory.
if len(args) == 1 {
dir = args[0]
}
Expand All @@ -42,6 +42,8 @@ var InitCmd = &cobra.Command{
log.Fatalf("File %v already exists.\n", filename)
}

makeDefaultConfig(filename)
if err := makeDefaultConfig(filename); err != nil {
log.Fatal(err)
}
},
}
12 changes: 9 additions & 3 deletions cmd/list.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cmd

import (
"fmt"
"log"

"github.com/exitshell/konnect/engine"
Expand All @@ -9,19 +10,24 @@ import (

// ListCmd - List all hosts from config file.
var ListCmd = &cobra.Command{
Use: "ls",
Use: "list",
Short: "List all hosts",
Long: "List all hosts",
Run: func(cmd *cobra.Command, args []string) {
// Resolve filename from flags.
filename := resolveFilename(cmd)
filename, err := resolveFilename(cmd)
handleErr(err)

// Check that only one host was specified.
if len(args) != 0 {
log.Fatal("The list subcommand does not take any arguments")
}

// Init engine.
konnect, err := engine.Init(filename)
handleErr(err)

// List all hosts.
engine.Init(filename).List()
fmt.Print(konnect.List())
},
}
11 changes: 8 additions & 3 deletions cmd/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,12 @@ var StatusCmd = &cobra.Command{
Long: "Check the status of one or more hosts",
Run: func(cmd *cobra.Command, args []string) {
// Resolve filename from flags.
filename := resolveFilename(cmd)
filename, err := resolveFilename(cmd)
handleErr(err)

// Init engine.
konnect := engine.Init(filename)
konnect, err := engine.Init(filename)
handleErr(err)

hosts := args

Expand All @@ -43,7 +46,9 @@ var StatusCmd = &cobra.Command{
hosts = removeDuplicates(hosts)

// Validate hosts.
konnect.CheckHosts(hosts)
if err := konnect.CheckHosts(hosts); err != nil {
log.Fatal(err)
}

// Check status of the resolved hosts.
fmt.Printf("Testing connections for %v\n\n", strings.Join(hosts, ", "))
Expand Down
22 changes: 16 additions & 6 deletions cmd/utils_.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,14 @@ import (
"github.com/spf13/cobra"
)

// handleErr is a function that logs Fatal
// if the given error `err` is populated.
func handleErr(err error) {
if err != nil {
log.Fatal(err)
}
}

func getDefaultConfig() string {
return "./konnect.yml"
}
Expand All @@ -36,7 +44,7 @@ func removeDuplicates(elements []string) []string {
// Resolve the config filename from cmd flags.
// Fallback to default filename.
// Validate that the file exists.
func resolveFilename(cmd *cobra.Command) string {
func resolveFilename(cmd *cobra.Command) (string, error) {
// Get config filename from flags.
filename, _ := cmd.Flags().GetString("filename")
wasProvided := true
Expand All @@ -59,13 +67,13 @@ func resolveFilename(cmd *cobra.Command) string {
// Could not find the config file that the user specified.
err = fmt.Errorf("Config %v does not exist", filename)
}
log.Fatal(err)
return "", err
}

return filename
return filename, nil
}

func makeDefaultConfig(filename string) {
func makeDefaultConfig(filename string) error {
// Make default proxylist and konnect engine.
proxyList := map[string]*proxy.SSHProxy{
"app": &proxy.SSHProxy{
Expand All @@ -87,7 +95,7 @@ func makeDefaultConfig(filename string) {
// Marshal konnect struct to a byte slice.
byteSlice, err := yaml.Marshal(konnect)
if err != nil {
log.Fatal(err)
return err
}

// Make config header.
Expand All @@ -104,10 +112,12 @@ func makeDefaultConfig(filename string) {

// Write byte slice to file.
if err = ioutil.WriteFile(filename, data, 0644); err != nil {
log.Fatal(err)
return err
}

fmt.Println("Created configuration file at:")
c := color.New(color.FgCyan, color.Bold)
c.Printf("%v\n", filename)

return nil
}
29 changes: 14 additions & 15 deletions engine/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,55 +2,54 @@ package engine

import (
"fmt"
"log"
"path/filepath"
"strings"
)

// Init - Create a new Konnect object.
func Init(filename string) *Konnect {
func Init(filename string) (*Konnect, error) {
filename, err := filepath.Abs(filename)
if err != nil {
log.Fatal(err)
return nil, err
}

konnect := New()
if err = konnect.LoadFromFile(filename); err != nil {
log.Fatal(err)
return nil, err
}

return konnect
return konnect, nil
}

// List - Show info for all SSHProxy objects.
func (k *Konnect) List() {
func (k *Konnect) List() string {
result := ""
hosts := k.GetHosts()
for _, host := range hosts {
fmt.Println(k.Hosts[host].Info())
result += fmt.Sprintln(k.Hosts[host].Info())
}
return result
}

// Args - Print SSH Args for a given host.
func (k *Konnect) Args(host string) {
func (k *Konnect) Args(host string) (string, error) {
proxy, err := k.Get(host)
if err != nil {
log.Fatal(err)
return "", err
}

argsStr := strings.Join(proxy.Args(), " ")
fmt.Println(argsStr)
return argsStr, err
}

// Connect to host.
func (k *Konnect) Connect(host string) {
func (k *Konnect) Connect(host string) error {
proxy, err := k.Get(host)
if err != nil {
log.Fatal(err)
return err
}

if err = proxy.Connect(); err != nil {
log.Fatal(err)
}
return proxy.Connect()
}

// Status - Check the status of one or more hosts.
Expand Down
6 changes: 3 additions & 3 deletions engine/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"errors"
"fmt"
"io/ioutil"
"log"
"sort"

yaml "gopkg.in/yaml.v2"
Expand Down Expand Up @@ -41,14 +40,15 @@ func (k *Konnect) GetHosts() []string {
}

// CheckHosts - Ensure that the given host names exist.
func (k *Konnect) CheckHosts(hosts []string) {
func (k *Konnect) CheckHosts(hosts []string) error {
// If a given host does not exist
// in Konnect.Hosts, then throw an error.
for _, host := range hosts {
if _, ok := k.Hosts[host]; ok != true {
log.Fatalf("Undefined host %v", host)
return fmt.Errorf("Undefined host %v", host)
}
}
return nil
}

// LoadFromFile - Load and validate SSHProxy objects from a yaml config file.
Expand Down

0 comments on commit 2c832be

Please sign in to comment.