github.com/criteo-forks/consul@v1.4.5-criteonogrpc/command/info/info.go (about)

     1  package info
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"sort"
     7  
     8  	"github.com/hashicorp/consul/command/flags"
     9  	"github.com/mitchellh/cli"
    10  )
    11  
    12  func New(ui cli.Ui) *cmd {
    13  	c := &cmd{UI: ui}
    14  	c.init()
    15  	return c
    16  }
    17  
    18  type cmd struct {
    19  	UI    cli.Ui
    20  	flags *flag.FlagSet
    21  	http  *flags.HTTPFlags
    22  	help  string
    23  }
    24  
    25  func (c *cmd) init() {
    26  	c.flags = flag.NewFlagSet("", flag.ContinueOnError)
    27  	c.http = &flags.HTTPFlags{}
    28  	flags.Merge(c.flags, c.http.ClientFlags())
    29  	c.help = flags.Usage(help, c.flags)
    30  }
    31  
    32  func (c *cmd) Run(args []string) int {
    33  	if err := c.flags.Parse(args); err != nil {
    34  		return 1
    35  	}
    36  
    37  	client, err := c.http.APIClient()
    38  	if err != nil {
    39  		c.UI.Error(fmt.Sprintf("Error connecting to Consul agent: %s", err))
    40  		return 1
    41  	}
    42  
    43  	self, err := client.Agent().Self()
    44  	if err != nil {
    45  		c.UI.Error(fmt.Sprintf("Error querying agent: %s", err))
    46  		return 1
    47  	}
    48  	stats, ok := self["Stats"]
    49  	if !ok {
    50  		c.UI.Error(fmt.Sprintf("Agent response did not contain 'Stats' key: %v", self))
    51  		return 1
    52  	}
    53  
    54  	// Get the keys in sorted order
    55  	keys := make([]string, 0, len(stats))
    56  	for key := range stats {
    57  		keys = append(keys, key)
    58  	}
    59  	sort.Strings(keys)
    60  
    61  	// Iterate over each top-level key
    62  	for _, key := range keys {
    63  		c.UI.Output(key + ":")
    64  
    65  		// Sort the sub-keys
    66  		subvals, ok := stats[key].(map[string]interface{})
    67  		if !ok {
    68  			c.UI.Error(fmt.Sprintf("Got invalid subkey in stats: %v", subvals))
    69  			return 1
    70  		}
    71  		subkeys := make([]string, 0, len(subvals))
    72  		for k := range subvals {
    73  			subkeys = append(subkeys, k)
    74  		}
    75  		sort.Strings(subkeys)
    76  
    77  		// Iterate over the subkeys
    78  		for _, subkey := range subkeys {
    79  			val := subvals[subkey]
    80  			c.UI.Output(fmt.Sprintf("\t%s = %s", subkey, val))
    81  		}
    82  	}
    83  	return 0
    84  }
    85  
    86  func (c *cmd) Synopsis() string {
    87  	return synopsis
    88  }
    89  
    90  func (c *cmd) Help() string {
    91  	return c.help
    92  }
    93  
    94  const synopsis = "Provides debugging information for operators."
    95  const help = `
    96  Usage: consul info [options]
    97  
    98    Provides debugging information for operators.
    99  `