/usr/share/gocode/src/github.com/hashicorp/serf/command/info.go is in golang-github-hashicorp-serf-dev 0.7.0~ds1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | package command
import (
"bytes"
"flag"
"fmt"
"github.com/mitchellh/cli"
"sort"
"strings"
)
// InfoCommand is a Command implementation that queries a running
// Serf agent for various debugging statistics for operators
type InfoCommand struct {
Ui cli.Ui
}
func (i *InfoCommand) Help() string {
helpText := `
Usage: serf info [options]
Provides debugging information for operators
Options:
-format If provided, output is returned in the specified
format. Valid formats are 'json', and 'text' (default)
-rpc-addr=127.0.0.1:7373 RPC address of the Serf agent.
-rpc-auth="" RPC auth token of the Serf agent.
`
return strings.TrimSpace(helpText)
}
func (i *InfoCommand) Run(args []string) int {
var format string
cmdFlags := flag.NewFlagSet("info", flag.ContinueOnError)
cmdFlags.Usage = func() { i.Ui.Output(i.Help()) }
cmdFlags.StringVar(&format, "format", "text", "output format")
rpcAddr := RPCAddrFlag(cmdFlags)
rpcAuth := RPCAuthFlag(cmdFlags)
if err := cmdFlags.Parse(args); err != nil {
return 1
}
client, err := RPCClient(*rpcAddr, *rpcAuth)
if err != nil {
i.Ui.Error(fmt.Sprintf("Error connecting to Serf agent: %s", err))
return 1
}
defer client.Close()
stats, err := client.Stats()
if err != nil {
i.Ui.Error(fmt.Sprintf("Error querying agent: %s", err))
return 1
}
output, err := formatOutput(StatsContainer(stats), format)
if err != nil {
i.Ui.Error(fmt.Sprintf("Encoding error: %s", err))
return 1
}
i.Ui.Output(string(output))
return 0
}
func (i *InfoCommand) Synopsis() string {
return "Provides debugging information for operators"
}
type StatsContainer map[string]map[string]string
func (s StatsContainer) String() string {
var buf bytes.Buffer
// Get the keys in sorted order
keys := make([]string, 0, len(s))
for key := range s {
keys = append(keys, key)
}
sort.Strings(keys)
// Iterate over each top-level key
for _, key := range keys {
buf.WriteString(fmt.Sprintf(key + ":\n"))
// Sort the sub-keys
subvals := s[key]
subkeys := make([]string, 0, len(subvals))
for k := range subvals {
subkeys = append(subkeys, k)
}
sort.Strings(subkeys)
// Iterate over the subkeys
for _, subkey := range subkeys {
val := subvals[subkey]
buf.WriteString(fmt.Sprintf("\t%s = %s\n", subkey, val))
}
}
return buf.String()
}
|