github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/command/tls_ca_info.go (about)

     1  package command
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"strings"
     7  
     8  	"github.com/hashicorp/nomad/helper/tlsutil"
     9  	"github.com/posener/complete"
    10  	"github.com/ryanuber/columnize"
    11  )
    12  
    13  type TLSCAInfoCommand struct {
    14  	Meta
    15  }
    16  
    17  func (c *TLSCAInfoCommand) Help() string {
    18  	helpText := `
    19  Usage: nomad tls ca info <CA file>
    20  
    21    Show information about a certificate authority.
    22  `
    23  	return strings.TrimSpace(helpText)
    24  }
    25  
    26  func (c *TLSCAInfoCommand) AutocompleteFlags() complete.Flags {
    27  	return mergeAutocompleteFlags(c.Meta.AutocompleteFlags(FlagSetClient),
    28  		complete.Flags{})
    29  }
    30  
    31  func (c *TLSCAInfoCommand) AutocompleteArgs() complete.Predictor {
    32  	return complete.PredictOr(
    33  		complete.PredictFiles("*.pem"),
    34  	)
    35  }
    36  
    37  func (c *TLSCAInfoCommand) Synopsis() string {
    38  	return "Show certificate authority information"
    39  }
    40  
    41  func (c *TLSCAInfoCommand) Name() string { return "tls cert info" }
    42  
    43  func (c *TLSCAInfoCommand) Run(args []string) int {
    44  
    45  	flags := c.Meta.FlagSet(c.Name(), FlagSetClient)
    46  	flags.Usage = func() { c.Ui.Output(c.Help()) }
    47  	if err := flags.Parse(args); err != nil {
    48  		return 1
    49  	}
    50  
    51  	// Check that we got no arguments
    52  	args = flags.Args()
    53  	if l := len(args); l < 0 || l > 1 {
    54  		c.Ui.Error("This command takes up to one argument")
    55  		c.Ui.Error(commandErrorText(c))
    56  		return 1
    57  	}
    58  	var certFile []byte
    59  	var err error
    60  	var file string
    61  	if len(args) == 0 {
    62  		c.Ui.Error(fmt.Sprintf("Error reading CA file: %v", err))
    63  		return 1
    64  	}
    65  	if len(args) == 1 {
    66  		file = args[0]
    67  		certFile, err = os.ReadFile(file)
    68  		if err != nil {
    69  			c.Ui.Error(fmt.Sprintf("Error reading CA file: %v", err))
    70  			return 1
    71  		}
    72  	}
    73  
    74  	certInfo, err := tlsutil.ParseCert(string(certFile))
    75  	if err != nil {
    76  		c.Ui.Error(err.Error())
    77  		return 1
    78  	}
    79  	// Format the certificate info
    80  	basic := []string{
    81  		fmt.Sprintf("Serial Number|%s", certInfo.SerialNumber),
    82  		fmt.Sprintf("Issuer CN|%s", certInfo.Issuer.CommonName),
    83  		fmt.Sprintf("Common Name|%s", certInfo.Subject),
    84  		fmt.Sprintf("Expiry Date|%s", certInfo.NotAfter),
    85  		fmt.Sprintf("Permitted DNS Domains|%s", certInfo.PermittedDNSDomains),
    86  	}
    87  
    88  	// Print out the information
    89  	c.Ui.Output(columnize.SimpleFormat(basic))
    90  	return 0
    91  }