open-vault/command/status.go

118 lines
2.8 KiB
Go
Raw Normal View History

2015-03-13 18:33:17 +00:00
package command
import (
"fmt"
"strings"
"github.com/hashicorp/vault/api"
2016-04-01 17:16:05 +00:00
"github.com/hashicorp/vault/meta"
2015-03-13 18:33:17 +00:00
)
2015-04-20 19:11:21 +00:00
// StatusCommand is a Command that outputs the status of whether
// Vault is sealed or not as well as HA information.
type StatusCommand struct {
2016-04-01 17:16:05 +00:00
meta.Meta
2015-03-13 18:33:17 +00:00
}
2015-04-20 19:11:21 +00:00
func (c *StatusCommand) Run(args []string) int {
2016-04-01 17:16:05 +00:00
flags := c.Meta.FlagSet("status", meta.FlagSetDefault)
2015-03-13 18:33:17 +00:00
flags.Usage = func() { c.Ui.Error(c.Help()) }
if err := flags.Parse(args); err != nil {
return 1
2015-03-13 18:33:17 +00:00
}
client, err := c.Client()
if err != nil {
c.Ui.Error(fmt.Sprintf(
"Error initializing client: %s", err))
return 1
2015-03-13 18:33:17 +00:00
}
2015-04-20 19:08:54 +00:00
sealStatus, err := client.Sys().SealStatus()
2015-03-13 18:33:17 +00:00
if err != nil {
c.Ui.Error(fmt.Sprintf(
"Error checking seal status: %s", err))
return 1
2015-03-13 18:33:17 +00:00
}
outStr := fmt.Sprintf(
"Sealed: %v\n"+
2015-04-21 18:11:15 +00:00
"Key Shares: %d\n"+
"Key Threshold: %d\n"+
"Unseal Progress: %d\n"+
2017-02-17 16:23:20 +00:00
"Unseal Nonce: %v\n"+
"Version: %s",
sealStatus.Sealed,
sealStatus.N,
sealStatus.T,
sealStatus.Progress,
sealStatus.Nonce,
sealStatus.Version)
if sealStatus.ClusterName != "" && sealStatus.ClusterID != "" {
outStr = fmt.Sprintf("%s\nCluster Name: %s\nCluster ID: %s", outStr, sealStatus.ClusterName, sealStatus.ClusterID)
}
c.Ui.Output(outStr)
2015-03-13 18:33:17 +00:00
// Mask the 'Vault is sealed' error, since this means HA is enabled,
// but that we cannot query for the leader since we are sealed.
2015-04-20 19:08:54 +00:00
leaderStatus, err := client.Sys().Leader()
if err != nil && strings.Contains(err.Error(), "Vault is sealed") {
leaderStatus = &api.LeaderResponse{HAEnabled: true}
err = nil
}
2015-04-20 19:08:54 +00:00
if err != nil {
c.Ui.Error(fmt.Sprintf(
"Error checking leader status: %s", err))
return 1
2015-04-20 19:08:54 +00:00
}
// Output if HA is enabled
2015-04-21 18:11:15 +00:00
c.Ui.Output("")
c.Ui.Output(fmt.Sprintf("High-Availability Enabled: %v", leaderStatus.HAEnabled))
if leaderStatus.HAEnabled {
if sealStatus.Sealed {
c.Ui.Output("\tMode: sealed")
} else {
mode := "standby"
if leaderStatus.IsSelf {
mode = "active"
}
c.Ui.Output(fmt.Sprintf("\tMode: %s", mode))
if leaderStatus.LeaderAddress == "" {
leaderStatus.LeaderAddress = "<none>"
}
if leaderStatus.LeaderClusterAddress == "" {
leaderStatus.LeaderClusterAddress = "<none>"
}
c.Ui.Output(fmt.Sprintf("\tLeader Cluster Address: %s", leaderStatus.LeaderClusterAddress))
}
}
2015-03-13 18:33:17 +00:00
2015-04-20 19:08:54 +00:00
if sealStatus.Sealed {
return 2
2015-03-13 18:33:17 +00:00
} else {
return 0
}
}
2015-04-20 19:11:21 +00:00
func (c *StatusCommand) Synopsis() string {
return "Outputs status of whether Vault is sealed and if HA mode is enabled"
2015-03-13 18:33:17 +00:00
}
2015-04-20 19:11:21 +00:00
func (c *StatusCommand) Help() string {
2015-03-13 18:33:17 +00:00
helpText := `
2015-04-20 19:11:21 +00:00
Usage: vault status [options]
2015-03-13 18:33:17 +00:00
2015-04-20 19:11:21 +00:00
Outputs the state of the Vault, sealed or unsealed and if HA is enabled.
2015-03-13 18:33:17 +00:00
This command outputs whether or not the Vault is sealed. The exit
code also reflects the seal status (0 unsealed, 2 sealed, 1 error).
2015-03-13 18:33:17 +00:00
General Options:
` + meta.GeneralOptionsUsage()
2015-03-13 18:33:17 +00:00
return strings.TrimSpace(helpText)
}