cli.go 3.19 KB
Newer Older
1 2 3 4 5
// This file contains CLI and env TLS configurations that can be used by clients or servers
package tls

import (
	"errors"
6 7
	"fmt"
	"strings"
8

9
	"github.com/urfave/cli/v2"
10 11 12 13 14 15 16 17 18 19

	opservice "github.com/ethereum-optimism/optimism/op-service"
)

const (
	TLSCaCertFlagName = "tls.ca"
	TLSCertFlagName   = "tls.cert"
	TLSKeyFlagName    = "tls.key"
)

20 21
// CLIFlags returns flags with env var envPrefix
// This should be used for server TLS configs, or when client and server tls configs are the same
22
func CLIFlags(envPrefix string) []cli.Flag {
23 24 25
	return CLIFlagsWithFlagPrefix(envPrefix, "")
}

26 27 28 29 30 31
var (
	defaultTLSCaCert = "tls/ca.crt"
	defaultTLSCert   = "tls/tls.crt"
	defaultTLSKey    = "tls/tls.key"
)

32 33 34 35 36 37
// CLIFlagsWithFlagPrefix returns flags with env var and cli flag prefixes
// Should be used for client TLS configs when different from server on the same process
func CLIFlagsWithFlagPrefix(envPrefix string, flagPrefix string) []cli.Flag {
	prefixFunc := func(flagName string) string {
		return strings.Trim(fmt.Sprintf("%s.%s", flagPrefix, flagName), ".")
	}
38
	prefixEnvVars := func(name string) []string {
39
		return opservice.PrefixEnvVar(envPrefix, name)
40
	}
41
	return []cli.Flag{
42 43 44
		&cli.StringFlag{
			Name:    prefixFunc(TLSCaCertFlagName),
			Usage:   "tls ca cert path",
45
			Value:   defaultTLSCaCert,
46
			EnvVars: prefixEnvVars("TLS_CA"),
47
		},
48 49 50
		&cli.StringFlag{
			Name:    prefixFunc(TLSCertFlagName),
			Usage:   "tls cert path",
51
			Value:   defaultTLSCert,
52
			EnvVars: prefixEnvVars("TLS_CERT"),
53
		},
54 55 56
		&cli.StringFlag{
			Name:    prefixFunc(TLSKeyFlagName),
			Usage:   "tls key",
57
			Value:   defaultTLSKey,
58
			EnvVars: prefixEnvVars("TLS_KEY"),
59 60 61 62 63 64 65 66
		},
	}
}

type CLIConfig struct {
	TLSCaCert string
	TLSCert   string
	TLSKey    string
67
	Enabled   bool
68 69
}

70 71 72 73 74
func NewCLIConfig() CLIConfig {
	return CLIConfig{
		TLSCaCert: defaultTLSCaCert,
		TLSCert:   defaultTLSCert,
		TLSKey:    defaultTLSKey,
75
		Enabled:   false,
76 77 78
	}
}

79 80 81 82 83 84 85 86 87
func (c CLIConfig) Check() error {
	if c.TLSEnabled() && (c.TLSCaCert == "" || c.TLSCert == "" || c.TLSKey == "") {
		return errors.New("all tls flags must be set if at least one is set")
	}

	return nil
}

func (c CLIConfig) TLSEnabled() bool {
88
	return c.Enabled
89 90
}

91 92
// ReadCLIConfig reads tls cli configs
// This should be used for server TLS configs, or when client and server tls configs are the same
93 94
func ReadCLIConfig(ctx *cli.Context) CLIConfig {
	return CLIConfig{
95 96 97
		TLSCaCert: ctx.String(TLSCaCertFlagName),
		TLSCert:   ctx.String(TLSCertFlagName),
		TLSKey:    ctx.String(TLSKeyFlagName),
98
		Enabled:   ctx.IsSet(TLSCaCertFlagName) || ctx.IsSet(TLSCertFlagName) || ctx.IsSet(TLSKeyFlagName),
99 100
	}
}
101 102 103 104 105 106 107 108

// ReadCLIConfigWithPrefix reads tls cli configs with flag prefix
// Should be used for client TLS configs when different from server on the same process
func ReadCLIConfigWithPrefix(ctx *cli.Context, flagPrefix string) CLIConfig {
	prefixFunc := func(flagName string) string {
		return strings.Trim(fmt.Sprintf("%s.%s", flagPrefix, flagName), ".")
	}
	return CLIConfig{
109 110 111
		TLSCaCert: ctx.String(prefixFunc(TLSCaCertFlagName)),
		TLSCert:   ctx.String(prefixFunc(TLSCertFlagName)),
		TLSKey:    ctx.String(prefixFunc(TLSKeyFlagName)),
112
		Enabled:   ctx.IsSet(TLSCaCertFlagName) || ctx.IsSet(TLSCertFlagName) || ctx.IsSet(TLSKeyFlagName),
113 114
	}
}