mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
e428c824c3
Allows storing key under any directory. In the case where the "/etc/docker" directory is not preserved, this file can be specified to a location where it will be preserved to ensure the ID does not change across restarts. Note this key is currently only used today to generate the ID used in Docker info and for manifest schema v1 pushes. The key signature and finger on these manifests are not checked or used any longer for security, deprecated by notary. Removes old key migration from a pre-release of Docker which put the key under the home directory and was used to preserve ID used for swarm v1 after the file moved. closes #32135 Signed-off-by: Derek McGowan <derek@mcgstyle.net>
117 lines
3.8 KiB
Go
117 lines
3.8 KiB
Go
package flags
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
"github.com/docker/docker/cli"
|
|
"github.com/docker/docker/opts"
|
|
"github.com/docker/go-connections/tlsconfig"
|
|
"github.com/spf13/pflag"
|
|
)
|
|
|
|
const (
|
|
// DefaultCaFile is the default filename for the CA pem file
|
|
DefaultCaFile = "ca.pem"
|
|
// DefaultKeyFile is the default filename for the key pem file
|
|
DefaultKeyFile = "key.pem"
|
|
// DefaultCertFile is the default filename for the cert pem file
|
|
DefaultCertFile = "cert.pem"
|
|
// FlagTLSVerify is the flag name for the TLS verification option
|
|
FlagTLSVerify = "tlsverify"
|
|
)
|
|
|
|
var (
|
|
dockerCertPath = os.Getenv("DOCKER_CERT_PATH")
|
|
dockerTLSVerify = os.Getenv("DOCKER_TLS_VERIFY") != ""
|
|
)
|
|
|
|
// CommonOptions are options common to both the client and the daemon.
|
|
type CommonOptions struct {
|
|
Debug bool
|
|
Hosts []string
|
|
LogLevel string
|
|
TLS bool
|
|
TLSVerify bool
|
|
TLSOptions *tlsconfig.Options
|
|
}
|
|
|
|
// NewCommonOptions returns a new CommonOptions
|
|
func NewCommonOptions() *CommonOptions {
|
|
return &CommonOptions{}
|
|
}
|
|
|
|
// InstallFlags adds flags for the common options on the FlagSet
|
|
func (commonOpts *CommonOptions) InstallFlags(flags *pflag.FlagSet) {
|
|
if dockerCertPath == "" {
|
|
dockerCertPath = cli.ConfigurationDir()
|
|
}
|
|
|
|
flags.BoolVarP(&commonOpts.Debug, "debug", "D", false, "Enable debug mode")
|
|
flags.StringVarP(&commonOpts.LogLevel, "log-level", "l", "info", `Set the logging level ("debug"|"info"|"warn"|"error"|"fatal")`)
|
|
flags.BoolVar(&commonOpts.TLS, "tls", false, "Use TLS; implied by --tlsverify")
|
|
flags.BoolVar(&commonOpts.TLSVerify, FlagTLSVerify, dockerTLSVerify, "Use TLS and verify the remote")
|
|
|
|
// TODO use flag flags.String("identity"}, "i", "", "Path to libtrust key file")
|
|
|
|
commonOpts.TLSOptions = &tlsconfig.Options{
|
|
CAFile: filepath.Join(dockerCertPath, DefaultCaFile),
|
|
CertFile: filepath.Join(dockerCertPath, DefaultCertFile),
|
|
KeyFile: filepath.Join(dockerCertPath, DefaultKeyFile),
|
|
}
|
|
tlsOptions := commonOpts.TLSOptions
|
|
flags.Var(opts.NewQuotedString(&tlsOptions.CAFile), "tlscacert", "Trust certs signed only by this CA")
|
|
flags.Var(opts.NewQuotedString(&tlsOptions.CertFile), "tlscert", "Path to TLS certificate file")
|
|
flags.Var(opts.NewQuotedString(&tlsOptions.KeyFile), "tlskey", "Path to TLS key file")
|
|
|
|
hostOpt := opts.NewNamedListOptsRef("hosts", &commonOpts.Hosts, opts.ValidateHost)
|
|
flags.VarP(hostOpt, "host", "H", "Daemon socket(s) to connect to")
|
|
}
|
|
|
|
// SetDefaultOptions sets default values for options after flag parsing is
|
|
// complete
|
|
func (commonOpts *CommonOptions) SetDefaultOptions(flags *pflag.FlagSet) {
|
|
// Regardless of whether the user sets it to true or false, if they
|
|
// specify --tlsverify at all then we need to turn on TLS
|
|
// TLSVerify can be true even if not set due to DOCKER_TLS_VERIFY env var, so we need
|
|
// to check that here as well
|
|
if flags.Changed(FlagTLSVerify) || commonOpts.TLSVerify {
|
|
commonOpts.TLS = true
|
|
}
|
|
|
|
if !commonOpts.TLS {
|
|
commonOpts.TLSOptions = nil
|
|
} else {
|
|
tlsOptions := commonOpts.TLSOptions
|
|
tlsOptions.InsecureSkipVerify = !commonOpts.TLSVerify
|
|
|
|
// Reset CertFile and KeyFile to empty string if the user did not specify
|
|
// the respective flags and the respective default files were not found.
|
|
if !flags.Changed("tlscert") {
|
|
if _, err := os.Stat(tlsOptions.CertFile); os.IsNotExist(err) {
|
|
tlsOptions.CertFile = ""
|
|
}
|
|
}
|
|
if !flags.Changed("tlskey") {
|
|
if _, err := os.Stat(tlsOptions.KeyFile); os.IsNotExist(err) {
|
|
tlsOptions.KeyFile = ""
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// SetLogLevel sets the logrus logging level
|
|
func SetLogLevel(logLevel string) {
|
|
if logLevel != "" {
|
|
lvl, err := logrus.ParseLevel(logLevel)
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "Unable to parse logging level: %s\n", logLevel)
|
|
os.Exit(1)
|
|
}
|
|
logrus.SetLevel(lvl)
|
|
} else {
|
|
logrus.SetLevel(logrus.InfoLevel)
|
|
}
|
|
}
|