Merge pull request #403 from cocap10/migrate-to-staert
Migrate to staert
This commit is contained in:
commit
1a936b6aca
20 changed files with 541 additions and 749 deletions
48
acme/acme.go
48
acme/acme.go
|
@ -16,6 +16,7 @@ import (
|
||||||
fmtlog "log"
|
fmtlog "log"
|
||||||
"os"
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
@ -161,15 +162,50 @@ func (dc *DomainsCertificate) needRenew() bool {
|
||||||
|
|
||||||
// ACME allows to connect to lets encrypt and retrieve certs
|
// ACME allows to connect to lets encrypt and retrieve certs
|
||||||
type ACME struct {
|
type ACME struct {
|
||||||
Email string
|
Email string `description:"Email address used for registration"`
|
||||||
Domains []Domain
|
Domains []Domain `description:"SANs (alternative domains) to each main domain using format: --acme.domains='main.com,san1.com,san2.com' --acme.domains='main.net,san1.net,san2.net'"`
|
||||||
StorageFile string
|
StorageFile string `description:"File used for certificates storage."`
|
||||||
OnDemand bool
|
OnDemand bool `description:"Enable on demand certificate. This will request a certificate from Let's Encrypt during the first TLS handshake for a hostname that does not yet have a certificate."`
|
||||||
CAServer string
|
CAServer string `description:"CA server to use."`
|
||||||
EntryPoint string
|
EntryPoint string `description:"Entrypoint to proxy acme challenge to."`
|
||||||
storageLock sync.RWMutex
|
storageLock sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Domains parse []Domain
|
||||||
|
type Domains []Domain
|
||||||
|
|
||||||
|
//Set []Domain
|
||||||
|
func (ds *Domains) Set(str string) error {
|
||||||
|
fargs := func(c rune) bool {
|
||||||
|
return c == ',' || c == ';'
|
||||||
|
}
|
||||||
|
// get function
|
||||||
|
slice := strings.FieldsFunc(str, fargs)
|
||||||
|
if len(slice) < 1 {
|
||||||
|
return fmt.Errorf("Parse error ACME.Domain. Imposible to parse %s", str)
|
||||||
|
}
|
||||||
|
d := Domain{
|
||||||
|
Main: slice[0],
|
||||||
|
SANs: []string{},
|
||||||
|
}
|
||||||
|
if len(slice) > 1 {
|
||||||
|
d.SANs = slice[1:]
|
||||||
|
}
|
||||||
|
*ds = append(*ds, d)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
//Get []Domain
|
||||||
|
func (ds *Domains) Get() interface{} { return []Domain(*ds) }
|
||||||
|
|
||||||
|
//String returns []Domain in string
|
||||||
|
func (ds *Domains) String() string { return fmt.Sprintf("%+v", *ds) }
|
||||||
|
|
||||||
|
//SetValue sets []Domain into the parser
|
||||||
|
func (ds *Domains) SetValue(val interface{}) {
|
||||||
|
*ds = Domains(val.([]Domain))
|
||||||
|
}
|
||||||
|
|
||||||
// Domain holds a domain name with SANs
|
// Domain holds a domain name with SANs
|
||||||
type Domain struct {
|
type Domain struct {
|
||||||
Main string
|
Main string
|
||||||
|
|
61
acme/acme_test.go
Normal file
61
acme/acme_test.go
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
package acme
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestDomainsSet(t *testing.T) {
|
||||||
|
checkMap := map[string]Domains{
|
||||||
|
"": {},
|
||||||
|
"foo.com": {Domain{Main: "foo.com", SANs: []string{}}},
|
||||||
|
"foo.com,bar.net": {Domain{Main: "foo.com", SANs: []string{"bar.net"}}},
|
||||||
|
"foo.com,bar1.net,bar2.net,bar3.net": {Domain{Main: "foo.com", SANs: []string{"bar1.net", "bar2.net", "bar3.net"}}},
|
||||||
|
}
|
||||||
|
for in, check := range checkMap {
|
||||||
|
ds := Domains{}
|
||||||
|
ds.Set(in)
|
||||||
|
if !reflect.DeepEqual(check, ds) {
|
||||||
|
t.Errorf("Expected %+v\nGo %+v", check, ds)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDomainsSetAppend(t *testing.T) {
|
||||||
|
inSlice := []string{
|
||||||
|
"",
|
||||||
|
"foo1.com",
|
||||||
|
"foo2.com,bar.net",
|
||||||
|
"foo3.com,bar1.net,bar2.net,bar3.net",
|
||||||
|
}
|
||||||
|
checkSlice := []Domains{
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
Domain{
|
||||||
|
Main: "foo1.com",
|
||||||
|
SANs: []string{}}},
|
||||||
|
{
|
||||||
|
Domain{
|
||||||
|
Main: "foo1.com",
|
||||||
|
SANs: []string{}},
|
||||||
|
Domain{
|
||||||
|
Main: "foo2.com",
|
||||||
|
SANs: []string{"bar.net"}}},
|
||||||
|
{
|
||||||
|
Domain{
|
||||||
|
Main: "foo1.com",
|
||||||
|
SANs: []string{}},
|
||||||
|
Domain{
|
||||||
|
Main: "foo2.com",
|
||||||
|
SANs: []string{"bar.net"}},
|
||||||
|
Domain{Main: "foo3.com",
|
||||||
|
SANs: []string{"bar1.net", "bar2.net", "bar3.net"}}},
|
||||||
|
}
|
||||||
|
ds := Domains{}
|
||||||
|
for i, in := range inSlice {
|
||||||
|
ds.Set(in)
|
||||||
|
if !reflect.DeepEqual(checkSlice[i], ds) {
|
||||||
|
t.Errorf("Expected %s %+v\nGo %+v", in, checkSlice[i], ds)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
230
cmd.go
230
cmd.go
|
@ -1,230 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright
|
|
||||||
*/
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
fmtlog "log"
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
log "github.com/Sirupsen/logrus"
|
|
||||||
"github.com/containous/traefik/middlewares"
|
|
||||||
"github.com/containous/traefik/provider"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
"github.com/spf13/viper"
|
|
||||||
)
|
|
||||||
|
|
||||||
var traefikCmd = &cobra.Command{
|
|
||||||
Use: "traefik",
|
|
||||||
Short: "traefik, a modern reverse proxy",
|
|
||||||
Long: `traefik is a modern HTTP reverse proxy and load balancer made to deploy microservices with ease.
|
|
||||||
Complete documentation is available at http://traefik.io`,
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
run()
|
|
||||||
},
|
|
||||||
}
|
|
||||||
var versionCmd = &cobra.Command{
|
|
||||||
Use: "version",
|
|
||||||
Short: "Print version",
|
|
||||||
Long: `Print version`,
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
fmtlog.Println(Version + " built on the " + BuildDate)
|
|
||||||
os.Exit(0)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
var arguments = struct {
|
|
||||||
GlobalConfiguration
|
|
||||||
web bool
|
|
||||||
file bool
|
|
||||||
docker bool
|
|
||||||
dockerTLS bool
|
|
||||||
marathon bool
|
|
||||||
consul bool
|
|
||||||
consulTLS bool
|
|
||||||
consulCatalog bool
|
|
||||||
zookeeper bool
|
|
||||||
etcd bool
|
|
||||||
etcdTLS bool
|
|
||||||
boltdb bool
|
|
||||||
kubernetes bool
|
|
||||||
}{
|
|
||||||
GlobalConfiguration{
|
|
||||||
EntryPoints: make(EntryPoints),
|
|
||||||
Docker: &provider.Docker{
|
|
||||||
TLS: &provider.DockerTLS{},
|
|
||||||
},
|
|
||||||
File: &provider.File{},
|
|
||||||
Web: &WebProvider{},
|
|
||||||
Marathon: &provider.Marathon{},
|
|
||||||
Consul: &provider.Consul{
|
|
||||||
Kv: provider.Kv{
|
|
||||||
TLS: &provider.KvTLS{},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
ConsulCatalog: &provider.ConsulCatalog{},
|
|
||||||
Zookeeper: &provider.Zookepper{},
|
|
||||||
Etcd: &provider.Etcd{
|
|
||||||
Kv: provider.Kv{
|
|
||||||
TLS: &provider.KvTLS{},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Boltdb: &provider.BoltDb{},
|
|
||||||
Kubernetes: &provider.Kubernetes{},
|
|
||||||
},
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
traefikCmd.AddCommand(versionCmd)
|
|
||||||
traefikCmd.PersistentFlags().StringP("configFile", "c", "", "Configuration file to use (TOML).")
|
|
||||||
traefikCmd.PersistentFlags().BoolVarP(&arguments.Debug, "debug", "d", false, "Enable debug mode")
|
|
||||||
traefikCmd.PersistentFlags().StringP("graceTimeOut", "g", "10", "Timeout in seconds. Duration to give active requests a chance to finish during hot-reloads")
|
|
||||||
traefikCmd.PersistentFlags().String("accessLogsFile", "log/access.log", "Access logs file")
|
|
||||||
traefikCmd.PersistentFlags().String("traefikLogsFile", "log/traefik.log", "Traefik logs file")
|
|
||||||
traefikCmd.PersistentFlags().Var(&arguments.EntryPoints, "entryPoints", "Entrypoints definition using format: --entryPoints='Name:http Address::8000 Redirect.EntryPoint:https' --entryPoints='Name:https Address::4442 TLS:tests/traefik.crt,tests/traefik.key'")
|
|
||||||
traefikCmd.PersistentFlags().Var(&arguments.DefaultEntryPoints, "defaultEntryPoints", "Entrypoints to be used by frontends that do not specify any entrypoint")
|
|
||||||
traefikCmd.PersistentFlags().StringP("logLevel", "l", "ERROR", "Log level")
|
|
||||||
traefikCmd.PersistentFlags().DurationVar(&arguments.ProvidersThrottleDuration, "providersThrottleDuration", time.Duration(2*time.Second), "Backends throttle duration: minimum duration between 2 events from providers before applying a new configuration. It avoids unnecessary reloads if multiples events are sent in a short amount of time.")
|
|
||||||
traefikCmd.PersistentFlags().Int("maxIdleConnsPerHost", 0, "If non-zero, controls the maximum idle (keep-alive) to keep per-host. If zero, DefaultMaxIdleConnsPerHost is used")
|
|
||||||
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.web, "web", false, "Enable Web backend")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Web.Address, "web.address", ":8080", "Web administration port")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Web.CertFile, "web.cerFile", "", "SSL certificate")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Web.KeyFile, "web.keyFile", "", "SSL certificate")
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.Web.ReadOnly, "web.readOnly", false, "Enable read only API")
|
|
||||||
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.file, "file", false, "Enable File backend")
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.File.Watch, "file.watch", true, "Watch provider")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.File.Filename, "file.filename", "", "Override default configuration template. For advanced users :)")
|
|
||||||
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.docker, "docker", false, "Enable Docker backend")
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.Docker.Watch, "docker.watch", true, "Watch provider")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Docker.Filename, "docker.filename", "", "Override default configuration template. For advanced users :)")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Docker.Endpoint, "docker.endpoint", "unix:///var/run/docker.sock", "Docker server endpoint. Can be a tcp or a unix socket endpoint")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Docker.Domain, "docker.domain", "", "Default domain used")
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.dockerTLS, "docker.tls", false, "Enable Docker TLS support")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Docker.TLS.CA, "docker.tls.ca", "", "TLS CA")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Docker.TLS.Cert, "docker.tls.cert", "", "TLS cert")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Docker.TLS.Key, "docker.tls.key", "", "TLS key")
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.Docker.TLS.InsecureSkipVerify, "docker.tls.insecureSkipVerify", false, "TLS insecure skip verify")
|
|
||||||
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.marathon, "marathon", false, "Enable Marathon backend")
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.Marathon.Watch, "marathon.watch", true, "Watch provider")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Marathon.Filename, "marathon.filename", "", "Override default configuration template. For advanced users :)")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Marathon.Endpoint, "marathon.endpoint", "http://127.0.0.1:8080", "Marathon server endpoint. You can also specify multiple endpoint for Marathon")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Marathon.Domain, "marathon.domain", "", "Default domain used")
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.Marathon.ExposedByDefault, "marathon.exposedByDefault", true, "Expose Marathon apps by default")
|
|
||||||
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.consul, "consul", false, "Enable Consul backend")
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.Consul.Watch, "consul.watch", true, "Watch provider")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Consul.Filename, "consul.filename", "", "Override default configuration template. For advanced users :)")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Consul.Endpoint, "consul.endpoint", "127.0.0.1:8500", "Comma sepparated Consul server endpoints")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Consul.Prefix, "consul.prefix", "/traefik", "Prefix used for KV store")
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.consulTLS, "consul.tls", false, "Enable Consul TLS support")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Consul.TLS.CA, "consul.tls.ca", "", "TLS CA")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Consul.TLS.Cert, "consul.tls.cert", "", "TLS cert")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Consul.TLS.Key, "consul.tls.key", "", "TLS key")
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.Consul.TLS.InsecureSkipVerify, "consul.tls.insecureSkipVerify", false, "TLS insecure skip verify")
|
|
||||||
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.consulCatalog, "consulCatalog", false, "Enable Consul catalog backend")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.ConsulCatalog.Domain, "consulCatalog.domain", "", "Default domain used")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.ConsulCatalog.Endpoint, "consulCatalog.endpoint", "127.0.0.1:8500", "Consul server endpoint")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.ConsulCatalog.Prefix, "consulCatalog.prefix", "traefik", "Consul catalog tag prefix")
|
|
||||||
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.zookeeper, "zookeeper", false, "Enable Zookeeper backend")
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.Zookeeper.Watch, "zookeeper.watch", true, "Watch provider")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Zookeeper.Filename, "zookeeper.filename", "", "Override default configuration template. For advanced users :)")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Zookeeper.Endpoint, "zookeeper.endpoint", "127.0.0.1:2181", "Comma sepparated Zookeeper server endpoints")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Zookeeper.Prefix, "zookeeper.prefix", "/traefik", "Prefix used for KV store")
|
|
||||||
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.etcd, "etcd", false, "Enable Etcd backend")
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.Etcd.Watch, "etcd.watch", true, "Watch provider")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Etcd.Filename, "etcd.filename", "", "Override default configuration template. For advanced users :)")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Etcd.Endpoint, "etcd.endpoint", "127.0.0.1:4001", "Comma sepparated Etcd server endpoints")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Etcd.Prefix, "etcd.prefix", "/traefik", "Prefix used for KV store")
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.etcdTLS, "etcd.tls", false, "Enable Etcd TLS support")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Etcd.TLS.CA, "etcd.tls.ca", "", "TLS CA")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Etcd.TLS.Cert, "etcd.tls.cert", "", "TLS cert")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Etcd.TLS.Key, "etcd.tls.key", "", "TLS key")
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.Etcd.TLS.InsecureSkipVerify, "etcd.tls.insecureSkipVerify", false, "TLS insecure skip verify")
|
|
||||||
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.boltdb, "boltdb", false, "Enable Boltdb backend")
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.Boltdb.Watch, "boltdb.watch", true, "Watch provider")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Boltdb.Filename, "boltdb.filename", "", "Override default configuration template. For advanced users :)")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Boltdb.Endpoint, "boltdb.endpoint", "127.0.0.1:4001", "Boltdb server endpoint")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Boltdb.Prefix, "boltdb.prefix", "/traefik", "Prefix used for KV store")
|
|
||||||
|
|
||||||
traefikCmd.PersistentFlags().BoolVar(&arguments.kubernetes, "kubernetes", false, "Enable Kubernetes backend")
|
|
||||||
traefikCmd.PersistentFlags().StringVar(&arguments.Kubernetes.Endpoint, "kubernetes.endpoint", "http://127.0.0.1:8080", "Kubernetes server endpoint")
|
|
||||||
traefikCmd.PersistentFlags().StringSliceVar(&arguments.Kubernetes.Namespaces, "kubernetes.namespaces", []string{}, "Kubernetes namespaces")
|
|
||||||
|
|
||||||
_ = viper.BindPFlag("configFile", traefikCmd.PersistentFlags().Lookup("configFile"))
|
|
||||||
_ = viper.BindPFlag("graceTimeOut", traefikCmd.PersistentFlags().Lookup("graceTimeOut"))
|
|
||||||
_ = viper.BindPFlag("logLevel", traefikCmd.PersistentFlags().Lookup("logLevel"))
|
|
||||||
_ = viper.BindPFlag("debug", traefikCmd.PersistentFlags().Lookup("debug"))
|
|
||||||
// TODO: wait for this issue to be corrected: https://github.com/spf13/viper/issues/105
|
|
||||||
_ = viper.BindPFlag("providersThrottleDuration", traefikCmd.PersistentFlags().Lookup("providersThrottleDuration"))
|
|
||||||
_ = viper.BindPFlag("maxIdleConnsPerHost", traefikCmd.PersistentFlags().Lookup("maxIdleConnsPerHost"))
|
|
||||||
viper.SetDefault("providersThrottleDuration", time.Duration(2*time.Second))
|
|
||||||
viper.SetDefault("logLevel", "ERROR")
|
|
||||||
viper.SetDefault("MaxIdleConnsPerHost", 200)
|
|
||||||
}
|
|
||||||
|
|
||||||
func run() {
|
|
||||||
fmtlog.SetFlags(fmtlog.Lshortfile | fmtlog.LstdFlags)
|
|
||||||
|
|
||||||
// load global configuration
|
|
||||||
globalConfiguration := LoadConfiguration()
|
|
||||||
|
|
||||||
http.DefaultTransport.(*http.Transport).MaxIdleConnsPerHost = globalConfiguration.MaxIdleConnsPerHost
|
|
||||||
loggerMiddleware := middlewares.NewLogger(globalConfiguration.AccessLogsFile)
|
|
||||||
defer loggerMiddleware.Close()
|
|
||||||
|
|
||||||
// logging
|
|
||||||
level, err := log.ParseLevel(strings.ToLower(globalConfiguration.LogLevel))
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("Error getting level", err)
|
|
||||||
}
|
|
||||||
log.SetLevel(level)
|
|
||||||
|
|
||||||
if len(globalConfiguration.TraefikLogsFile) > 0 {
|
|
||||||
fi, err := os.OpenFile(globalConfiguration.TraefikLogsFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
|
||||||
defer func() {
|
|
||||||
if err := fi.Close(); err != nil {
|
|
||||||
log.Error("Error closinf file", err)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("Error opening file", err)
|
|
||||||
} else {
|
|
||||||
log.SetOutput(fi)
|
|
||||||
log.SetFormatter(&log.TextFormatter{DisableColors: true, FullTimestamp: true, DisableSorting: true})
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
log.SetFormatter(&log.TextFormatter{FullTimestamp: true, DisableSorting: true})
|
|
||||||
}
|
|
||||||
jsonConf, _ := json.Marshal(globalConfiguration)
|
|
||||||
log.Debugf("Global configuration loaded %s", string(jsonConf))
|
|
||||||
server := NewServer(*globalConfiguration)
|
|
||||||
server.Start()
|
|
||||||
defer server.Close()
|
|
||||||
log.Info("Shutting down")
|
|
||||||
}
|
|
280
configuration.go
280
configuration.go
|
@ -3,42 +3,44 @@ package main
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
fmtlog "log"
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/containous/traefik/acme"
|
"github.com/containous/traefik/acme"
|
||||||
"github.com/containous/traefik/provider"
|
"github.com/containous/traefik/provider"
|
||||||
"github.com/containous/traefik/types"
|
"github.com/containous/traefik/types"
|
||||||
"github.com/mitchellh/mapstructure"
|
"regexp"
|
||||||
"github.com/spf13/viper"
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// TraefikConfiguration holds GlobalConfiguration and other stuff
|
||||||
|
type TraefikConfiguration struct {
|
||||||
|
GlobalConfiguration
|
||||||
|
ConfigFile string `short:"c" description:"Timeout in seconds. Duration to give active requests a chance to finish during hot-reloads"`
|
||||||
|
}
|
||||||
|
|
||||||
// GlobalConfiguration holds global configuration (with providers, etc.).
|
// GlobalConfiguration holds global configuration (with providers, etc.).
|
||||||
// It's populated from the traefik configuration file passed as an argument to the binary.
|
// It's populated from the traefik configuration file passed as an argument to the binary.
|
||||||
type GlobalConfiguration struct {
|
type GlobalConfiguration struct {
|
||||||
GraceTimeOut int64
|
GraceTimeOut int64 `short:"g" description:"Configuration file to use (TOML)."`
|
||||||
Debug bool
|
Debug bool `short:"d" description:"Enable debug mode"`
|
||||||
AccessLogsFile string
|
AccessLogsFile string `description:"Access logs file"`
|
||||||
TraefikLogsFile string
|
TraefikLogsFile string `description:"Traefik logs file"`
|
||||||
LogLevel string
|
LogLevel string `short:"l" description:"Log level"`
|
||||||
EntryPoints EntryPoints
|
EntryPoints EntryPoints `description:"Entrypoints definition using format: --entryPoints='Name:http Address::8000 Redirect.EntryPoint:https' --entryPoints='Name:https Address::4442 TLS:tests/traefik.crt,tests/traefik.key'"`
|
||||||
ACME *acme.ACME
|
ACME *acme.ACME `description:"Enable ACME (Let's Encrypt): automatic SSL"`
|
||||||
DefaultEntryPoints DefaultEntryPoints
|
DefaultEntryPoints DefaultEntryPoints `description:"Entrypoints to be used by frontends that do not specify any entrypoint"`
|
||||||
ProvidersThrottleDuration time.Duration
|
ProvidersThrottleDuration time.Duration `description:"Backends throttle duration: minimum duration between 2 events from providers before applying a new configuration. It avoids unnecessary reloads if multiples events are sent in a short amount of time."`
|
||||||
MaxIdleConnsPerHost int
|
MaxIdleConnsPerHost int `description:"If non-zero, controls the maximum idle (keep-alive) to keep per-host. If zero, DefaultMaxIdleConnsPerHost is used"`
|
||||||
Retry *Retry
|
Retry *Retry `description:"Enable retry sending request if network error"`
|
||||||
Docker *provider.Docker
|
Docker *provider.Docker `description:"Enable Docker backend"`
|
||||||
File *provider.File
|
File *provider.File `description:"Enable File backend"`
|
||||||
Web *WebProvider
|
Web *WebProvider `description:"Enable Web backend"`
|
||||||
Marathon *provider.Marathon
|
Marathon *provider.Marathon `description:"Enable Marathon backend"`
|
||||||
Consul *provider.Consul
|
Consul *provider.Consul `description:"Enable Consul backend"`
|
||||||
ConsulCatalog *provider.ConsulCatalog
|
ConsulCatalog *provider.ConsulCatalog `description:"Enable Consul catalog backend"`
|
||||||
Etcd *provider.Etcd
|
Etcd *provider.Etcd `description:"Enable Etcd backend"`
|
||||||
Zookeeper *provider.Zookepper
|
Zookeeper *provider.Zookepper `description:"Enable Zookeeper backend"`
|
||||||
Boltdb *provider.BoltDb
|
Boltdb *provider.BoltDb `description:"Enable Boltdb backend"`
|
||||||
Kubernetes *provider.Kubernetes
|
Kubernetes *provider.Kubernetes `description:"Enable Kubernetes backend"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// DefaultEntryPoints holds default entry points
|
// DefaultEntryPoints holds default entry points
|
||||||
|
@ -47,7 +49,7 @@ type DefaultEntryPoints []string
|
||||||
// String is the method to format the flag's value, part of the flag.Value interface.
|
// String is the method to format the flag's value, part of the flag.Value interface.
|
||||||
// The String method's output will be used in diagnostics.
|
// The String method's output will be used in diagnostics.
|
||||||
func (dep *DefaultEntryPoints) String() string {
|
func (dep *DefaultEntryPoints) String() string {
|
||||||
return fmt.Sprintf("%#v", dep)
|
return strings.Join(*dep, ",")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set is the method to set the flag value, part of the flag.Value interface.
|
// Set is the method to set the flag value, part of the flag.Value interface.
|
||||||
|
@ -64,9 +66,17 @@ func (dep *DefaultEntryPoints) Set(value string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get return the EntryPoints map
|
||||||
|
func (dep *DefaultEntryPoints) Get() interface{} { return DefaultEntryPoints(*dep) }
|
||||||
|
|
||||||
|
// SetValue sets the EntryPoints map with val
|
||||||
|
func (dep *DefaultEntryPoints) SetValue(val interface{}) {
|
||||||
|
*dep = DefaultEntryPoints(val.(DefaultEntryPoints))
|
||||||
|
}
|
||||||
|
|
||||||
// Type is type of the struct
|
// Type is type of the struct
|
||||||
func (dep *DefaultEntryPoints) Type() string {
|
func (dep *DefaultEntryPoints) Type() string {
|
||||||
return fmt.Sprint("defaultentrypoints²")
|
return fmt.Sprint("defaultentrypoints")
|
||||||
}
|
}
|
||||||
|
|
||||||
// EntryPoints holds entry points configuration of the reverse proxy (ip, port, TLS...)
|
// EntryPoints holds entry points configuration of the reverse proxy (ip, port, TLS...)
|
||||||
|
@ -75,7 +85,7 @@ type EntryPoints map[string]*EntryPoint
|
||||||
// String is the method to format the flag's value, part of the flag.Value interface.
|
// String is the method to format the flag's value, part of the flag.Value interface.
|
||||||
// The String method's output will be used in diagnostics.
|
// The String method's output will be used in diagnostics.
|
||||||
func (ep *EntryPoints) String() string {
|
func (ep *EntryPoints) String() string {
|
||||||
return ""
|
return fmt.Sprintf("%+v", *ep)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set is the method to set the flag value, part of the flag.Value interface.
|
// Set is the method to set the flag value, part of the flag.Value interface.
|
||||||
|
@ -122,6 +132,14 @@ func (ep *EntryPoints) Set(value string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get return the EntryPoints map
|
||||||
|
func (ep *EntryPoints) Get() interface{} { return EntryPoints(*ep) }
|
||||||
|
|
||||||
|
// SetValue sets the EntryPoints map with val
|
||||||
|
func (ep *EntryPoints) SetValue(val interface{}) {
|
||||||
|
*ep = EntryPoints(val.(EntryPoints))
|
||||||
|
}
|
||||||
|
|
||||||
// Type is type of the struct
|
// Type is type of the struct
|
||||||
func (ep *EntryPoints) Type() string {
|
func (ep *EntryPoints) Type() string {
|
||||||
return fmt.Sprint("entrypoints²")
|
return fmt.Sprint("entrypoints²")
|
||||||
|
@ -187,121 +205,101 @@ type Certificate struct {
|
||||||
|
|
||||||
// Retry contains request retry config
|
// Retry contains request retry config
|
||||||
type Retry struct {
|
type Retry struct {
|
||||||
Attempts int
|
Attempts int `description:"Number of attempts"`
|
||||||
MaxMem int64
|
MaxMem int64 `description:"Maximum request body to be stored in memory in Mo"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGlobalConfiguration returns a GlobalConfiguration with default values.
|
// NewTraefikDefaultPointersConfiguration creates a TraefikConfiguration with pointers default values
|
||||||
func NewGlobalConfiguration() *GlobalConfiguration {
|
func NewTraefikDefaultPointersConfiguration() *TraefikConfiguration {
|
||||||
return new(GlobalConfiguration)
|
//default Docker
|
||||||
|
var defaultDocker provider.Docker
|
||||||
|
defaultDocker.Watch = true
|
||||||
|
defaultDocker.Endpoint = "unix:///var/run/docker.sock"
|
||||||
|
defaultDocker.TLS = &provider.DockerTLS{}
|
||||||
|
|
||||||
|
// default File
|
||||||
|
var defaultFile provider.File
|
||||||
|
defaultFile.Watch = true
|
||||||
|
defaultFile.Filename = "" //needs equivalent to viper.ConfigFileUsed()
|
||||||
|
|
||||||
|
// default Web
|
||||||
|
var defaultWeb WebProvider
|
||||||
|
defaultWeb.Address = ":8080"
|
||||||
|
|
||||||
|
// default Marathon
|
||||||
|
var defaultMarathon provider.Marathon
|
||||||
|
defaultMarathon.Watch = true
|
||||||
|
defaultMarathon.Endpoint = "http://127.0.0.1:8080"
|
||||||
|
defaultMarathon.ExposedByDefault = true
|
||||||
|
|
||||||
|
// default Consul
|
||||||
|
var defaultConsul provider.Consul
|
||||||
|
defaultConsul.Watch = true
|
||||||
|
defaultConsul.Endpoint = "127.0.0.1:8500"
|
||||||
|
defaultConsul.Prefix = "/traefik"
|
||||||
|
defaultConsul.TLS = &provider.KvTLS{}
|
||||||
|
|
||||||
|
// default ConsulCatalog
|
||||||
|
var defaultConsulCatalog provider.ConsulCatalog
|
||||||
|
defaultConsulCatalog.Endpoint = "127.0.0.1:8500"
|
||||||
|
|
||||||
|
// default Etcd
|
||||||
|
var defaultEtcd provider.Etcd
|
||||||
|
defaultEtcd.Watch = true
|
||||||
|
defaultEtcd.Endpoint = "127.0.0.1:400"
|
||||||
|
defaultEtcd.Prefix = "/traefik"
|
||||||
|
defaultEtcd.TLS = &provider.KvTLS{}
|
||||||
|
|
||||||
|
//default Zookeeper
|
||||||
|
var defaultZookeeper provider.Zookepper
|
||||||
|
defaultZookeeper.Watch = true
|
||||||
|
defaultZookeeper.Endpoint = "127.0.0.1:2181"
|
||||||
|
defaultZookeeper.Prefix = "/traefik"
|
||||||
|
|
||||||
|
//default Boltdb
|
||||||
|
var defaultBoltDb provider.BoltDb
|
||||||
|
defaultBoltDb.Watch = true
|
||||||
|
defaultBoltDb.Endpoint = "127.0.0.1:4001"
|
||||||
|
defaultBoltDb.Prefix = "/traefik"
|
||||||
|
|
||||||
|
//default Kubernetes
|
||||||
|
var defaultKubernetes provider.Kubernetes
|
||||||
|
defaultKubernetes.Watch = true
|
||||||
|
defaultKubernetes.Endpoint = "127.0.0.1:8080"
|
||||||
|
|
||||||
|
defaultConfiguration := GlobalConfiguration{
|
||||||
|
Docker: &defaultDocker,
|
||||||
|
File: &defaultFile,
|
||||||
|
Web: &defaultWeb,
|
||||||
|
Marathon: &defaultMarathon,
|
||||||
|
Consul: &defaultConsul,
|
||||||
|
ConsulCatalog: &defaultConsulCatalog,
|
||||||
|
Etcd: &defaultEtcd,
|
||||||
|
Zookeeper: &defaultZookeeper,
|
||||||
|
Boltdb: &defaultBoltDb,
|
||||||
|
Kubernetes: &defaultKubernetes,
|
||||||
|
Retry: &Retry{MaxMem: 2},
|
||||||
|
}
|
||||||
|
return &TraefikConfiguration{
|
||||||
|
GlobalConfiguration: defaultConfiguration,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoadConfiguration returns a GlobalConfiguration.
|
// NewTraefikConfiguration creates a TraefikConfiguration with default values
|
||||||
func LoadConfiguration() *GlobalConfiguration {
|
func NewTraefikConfiguration() *TraefikConfiguration {
|
||||||
configuration := NewGlobalConfiguration()
|
return &TraefikConfiguration{
|
||||||
viper.SetEnvPrefix("traefik")
|
GlobalConfiguration: GlobalConfiguration{
|
||||||
viper.SetConfigType("toml")
|
GraceTimeOut: 10,
|
||||||
viper.AutomaticEnv()
|
AccessLogsFile: "",
|
||||||
if len(viper.GetString("configFile")) > 0 {
|
TraefikLogsFile: "",
|
||||||
viper.SetConfigFile(viper.GetString("configFile"))
|
LogLevel: "ERROR",
|
||||||
} else {
|
EntryPoints: map[string]*EntryPoint{},
|
||||||
viper.SetConfigName("traefik") // name of config file (without extension)
|
DefaultEntryPoints: []string{},
|
||||||
|
ProvidersThrottleDuration: time.Duration(2 * time.Second),
|
||||||
|
MaxIdleConnsPerHost: 200,
|
||||||
|
},
|
||||||
|
ConfigFile: "",
|
||||||
}
|
}
|
||||||
viper.AddConfigPath("/etc/traefik/") // path to look for the config file in
|
|
||||||
viper.AddConfigPath("$HOME/.traefik/") // call multiple times to add many search paths
|
|
||||||
viper.AddConfigPath(".") // optionally look for config in the working directory
|
|
||||||
if err := viper.ReadInConfig(); err != nil {
|
|
||||||
if len(viper.ConfigFileUsed()) > 0 {
|
|
||||||
fmtlog.Printf("Error reading configuration file: %s", err)
|
|
||||||
} else {
|
|
||||||
fmtlog.Printf("No configuration file found")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(arguments.EntryPoints) > 0 {
|
|
||||||
viper.Set("entryPoints", arguments.EntryPoints)
|
|
||||||
}
|
|
||||||
if len(arguments.DefaultEntryPoints) > 0 {
|
|
||||||
viper.Set("defaultEntryPoints", arguments.DefaultEntryPoints)
|
|
||||||
}
|
|
||||||
if arguments.web {
|
|
||||||
viper.Set("web", arguments.Web)
|
|
||||||
}
|
|
||||||
if arguments.file {
|
|
||||||
viper.Set("file", arguments.File)
|
|
||||||
}
|
|
||||||
if !arguments.dockerTLS {
|
|
||||||
arguments.Docker.TLS = nil
|
|
||||||
}
|
|
||||||
if arguments.docker {
|
|
||||||
viper.Set("docker", arguments.Docker)
|
|
||||||
}
|
|
||||||
if arguments.marathon {
|
|
||||||
viper.Set("marathon", arguments.Marathon)
|
|
||||||
}
|
|
||||||
if !arguments.consulTLS {
|
|
||||||
arguments.Consul.TLS = nil
|
|
||||||
}
|
|
||||||
if arguments.consul {
|
|
||||||
viper.Set("consul", arguments.Consul)
|
|
||||||
}
|
|
||||||
if arguments.consulCatalog {
|
|
||||||
viper.Set("consulCatalog", arguments.ConsulCatalog)
|
|
||||||
}
|
|
||||||
if arguments.zookeeper {
|
|
||||||
viper.Set("zookeeper", arguments.Zookeeper)
|
|
||||||
}
|
|
||||||
if !arguments.etcdTLS {
|
|
||||||
arguments.Etcd.TLS = nil
|
|
||||||
}
|
|
||||||
if arguments.etcd {
|
|
||||||
viper.Set("etcd", arguments.Etcd)
|
|
||||||
}
|
|
||||||
if arguments.boltdb {
|
|
||||||
viper.Set("boltdb", arguments.Boltdb)
|
|
||||||
}
|
|
||||||
if arguments.kubernetes {
|
|
||||||
viper.Set("kubernetes", arguments.Kubernetes)
|
|
||||||
}
|
|
||||||
if err := unmarshal(&configuration); err != nil {
|
|
||||||
|
|
||||||
fmtlog.Fatalf("Error reading file: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(configuration.EntryPoints) == 0 {
|
|
||||||
configuration.EntryPoints = make(map[string]*EntryPoint)
|
|
||||||
configuration.EntryPoints["http"] = &EntryPoint{
|
|
||||||
Address: ":80",
|
|
||||||
}
|
|
||||||
configuration.DefaultEntryPoints = []string{"http"}
|
|
||||||
}
|
|
||||||
|
|
||||||
if configuration.File != nil && len(configuration.File.Filename) == 0 {
|
|
||||||
// no filename, setting to global config file
|
|
||||||
configuration.File.Filename = viper.ConfigFileUsed()
|
|
||||||
}
|
|
||||||
|
|
||||||
return configuration
|
|
||||||
}
|
|
||||||
|
|
||||||
func unmarshal(rawVal interface{}) error {
|
|
||||||
config := &mapstructure.DecoderConfig{
|
|
||||||
DecodeHook: mapstructure.StringToTimeDurationHookFunc(),
|
|
||||||
Metadata: nil,
|
|
||||||
Result: rawVal,
|
|
||||||
WeaklyTypedInput: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
decoder, err := mapstructure.NewDecoder(config)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = decoder.Decode(viper.AllSettings())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type configs map[string]*types.Configuration
|
type configs map[string]*types.Configuration
|
||||||
|
|
172
glide.lock
generated
172
glide.lock
generated
|
@ -1,39 +1,40 @@
|
||||||
hash: 68bc4f87206f9a486e1455f1dfcad737369c359a803566271432fcb85de3a12c
|
hash: 660249b4d5cbcfd0cb0a2d9d39ce798ec8df7d3277c53ed4043fe2f61b29eeb9
|
||||||
updated: 2016-05-23T13:57:35.191541555+02:00
|
updated: 2016-05-27T09:59:17.855890752+02:00
|
||||||
imports:
|
imports:
|
||||||
- name: github.com/alecthomas/template
|
|
||||||
version: b867cc6ab45cece8143cfcc6fc9c77cf3f2c23c0
|
|
||||||
- name: github.com/alecthomas/units
|
|
||||||
version: 6b4e7dc5e3143b85ea77909c72caf89416fc2915
|
|
||||||
- name: github.com/boltdb/bolt
|
- name: github.com/boltdb/bolt
|
||||||
version: 51f99c862475898df9773747d3accd05a7ca33c1
|
version: dfb21201d9270c1082d5fb0f07f500311ff72f18
|
||||||
- name: github.com/BurntSushi/toml
|
- name: github.com/BurntSushi/toml
|
||||||
version: bbd5bb678321a0d6e58f1099321dfa73391c1b6f
|
version: f0aeabca5a127c4078abb8c8d64298b147264b55
|
||||||
- name: github.com/BurntSushi/ty
|
- name: github.com/BurntSushi/ty
|
||||||
version: 6add9cd6ad42d389d6ead1dde60b4ad71e46fd74
|
version: 6add9cd6ad42d389d6ead1dde60b4ad71e46fd74
|
||||||
subpackages:
|
subpackages:
|
||||||
- fun
|
- fun
|
||||||
- name: github.com/cenkalti/backoff
|
- name: github.com/cenkalti/backoff
|
||||||
version: 4dc77674aceaabba2c7e3da25d4c823edfb73f99
|
version: c29158af31815ccc31ca29c86c121bc39e00d3d8
|
||||||
- name: github.com/codahale/hdrhistogram
|
- name: github.com/codahale/hdrhistogram
|
||||||
version: 954f16e8b9ef0e5d5189456aa4c1202758e04f17
|
version: 9208b142303c12d8899bae836fd524ac9338b4fd
|
||||||
- name: github.com/codegangsta/cli
|
- name: github.com/codegangsta/cli
|
||||||
version: bf4a526f48af7badd25d2cb02d587e1b01be3b50
|
version: bf4a526f48af7badd25d2cb02d587e1b01be3b50
|
||||||
- name: github.com/codegangsta/negroni
|
- name: github.com/codegangsta/negroni
|
||||||
version: c7477ad8e330bef55bf1ebe300cf8aa67c492d1b
|
version: ffbc66b612ee3eac2eba29aedce4c3a65e4dd0a1
|
||||||
|
- name: github.com/containous/flaeg
|
||||||
|
version: c425b9d758df1864ca838dbd433f1cf8f5097d51
|
||||||
- name: github.com/containous/oxy
|
- name: github.com/containous/oxy
|
||||||
version: 183212964e13e7b8afe01a08b193d04300554a68
|
version: 183212964e13e7b8afe01a08b193d04300554a68
|
||||||
subpackages:
|
subpackages:
|
||||||
- cbreaker
|
- cbreaker
|
||||||
- forward
|
|
||||||
- memmetrics
|
|
||||||
- roundrobin
|
|
||||||
- utils
|
|
||||||
- connlimit
|
- connlimit
|
||||||
|
- forward
|
||||||
|
- roundrobin
|
||||||
- stream
|
- stream
|
||||||
|
- utils
|
||||||
|
- name: github.com/containous/staert
|
||||||
|
version: ff272631ecfc9c22490b651fea0f08d364d46518
|
||||||
- name: github.com/coreos/etcd
|
- name: github.com/coreos/etcd
|
||||||
version: 26e52d2bce9e3e11b77b68cc84bf91aebb1ef637
|
version: c400d05d0aa73e21e431c16145e558d624098018
|
||||||
subpackages:
|
subpackages:
|
||||||
|
- Godeps/_workspace/src/github.com/ugorji/go/codec
|
||||||
|
- Godeps/_workspace/src/golang.org/x/net/context
|
||||||
- client
|
- client
|
||||||
- pkg/pathutil
|
- pkg/pathutil
|
||||||
- pkg/types
|
- pkg/types
|
||||||
|
@ -42,72 +43,37 @@ imports:
|
||||||
subpackages:
|
subpackages:
|
||||||
- spew
|
- spew
|
||||||
- name: github.com/docker/distribution
|
- name: github.com/docker/distribution
|
||||||
version: 467fc068d88aa6610691b7f1a677271a3fac4aac
|
version: 5bbf65499960b184fe8e0f045397375e1a6722b8
|
||||||
subpackages:
|
subpackages:
|
||||||
- reference
|
- reference
|
||||||
- digest
|
- digest
|
||||||
- name: github.com/docker/docker
|
- name: github.com/docker/docker
|
||||||
version: 9837ec4da53f15f9120d53a6e1517491ba8b0261
|
version: 9837ec4da53f15f9120d53a6e1517491ba8b0261
|
||||||
subpackages:
|
subpackages:
|
||||||
- autogen
|
- namesgenerator
|
||||||
- api
|
|
||||||
- cliconfig
|
|
||||||
- daemon/network
|
|
||||||
- graph/tags
|
|
||||||
- image
|
|
||||||
- opts
|
|
||||||
- pkg/archive
|
|
||||||
- pkg/fileutils
|
|
||||||
- pkg/homedir
|
|
||||||
- pkg/httputils
|
|
||||||
- pkg/ioutils
|
|
||||||
- pkg/jsonmessage
|
|
||||||
- pkg/mflag
|
|
||||||
- pkg/nat
|
|
||||||
- pkg/parsers
|
|
||||||
- pkg/pools
|
|
||||||
- pkg/promise
|
|
||||||
- pkg/random
|
|
||||||
- pkg/stdcopy
|
|
||||||
- pkg/stringid
|
|
||||||
- pkg/symlink
|
|
||||||
- pkg/system
|
|
||||||
- pkg/tarsum
|
|
||||||
- pkg/term
|
|
||||||
- pkg/timeutils
|
|
||||||
- pkg/tlsconfig
|
|
||||||
- pkg/ulimit
|
|
||||||
- pkg/units
|
|
||||||
- pkg/urlutil
|
|
||||||
- pkg/useragent
|
|
||||||
- pkg/version
|
|
||||||
- registry
|
|
||||||
- runconfig
|
|
||||||
- utils
|
|
||||||
- volume
|
|
||||||
- name: github.com/docker/engine-api
|
- name: github.com/docker/engine-api
|
||||||
version: 3d3d0b6c9d2651aac27f416a6da0224c1875b3eb
|
version: 3d3d0b6c9d2651aac27f416a6da0224c1875b3eb
|
||||||
subpackages:
|
subpackages:
|
||||||
- client
|
- client
|
||||||
- types
|
- types
|
||||||
- types/container
|
|
||||||
- types/filters
|
|
||||||
- types/strslice
|
|
||||||
- types/events
|
- types/events
|
||||||
|
- types/filters
|
||||||
- client/transport
|
- client/transport
|
||||||
- client/transport/cancellable
|
- client/transport/cancellable
|
||||||
|
- types/container
|
||||||
- types/network
|
- types/network
|
||||||
- types/reference
|
- types/reference
|
||||||
- types/registry
|
- types/registry
|
||||||
- types/time
|
- types/time
|
||||||
- types/versions
|
- types/versions
|
||||||
- types/blkiodev
|
- types/blkiodev
|
||||||
|
- types/strslice
|
||||||
- name: github.com/docker/go-connections
|
- name: github.com/docker/go-connections
|
||||||
version: c7838b258fbfa3fe88eecfb2a0e08ea0dbd6a646
|
version: c7838b258fbfa3fe88eecfb2a0e08ea0dbd6a646
|
||||||
subpackages:
|
subpackages:
|
||||||
- nat
|
|
||||||
- sockets
|
- sockets
|
||||||
- tlsconfig
|
- tlsconfig
|
||||||
|
- nat
|
||||||
- name: github.com/docker/go-units
|
- name: github.com/docker/go-units
|
||||||
version: 5d2041e26a699eaca682e2ea41c8f891e1060444
|
version: 5d2041e26a699eaca682e2ea41c8f891e1060444
|
||||||
- name: github.com/docker/libcompose
|
- name: github.com/docker/libcompose
|
||||||
|
@ -120,61 +86,39 @@ imports:
|
||||||
- store/consul
|
- store/consul
|
||||||
- store/etcd
|
- store/etcd
|
||||||
- store/zookeeper
|
- store/zookeeper
|
||||||
- name: github.com/docker/libtrust
|
|
||||||
version: 9cbd2a1374f46905c68a4eb3694a130610adc62a
|
|
||||||
- name: github.com/donovanhide/eventsource
|
- name: github.com/donovanhide/eventsource
|
||||||
version: d8a3071799b98cacd30b6da92f536050ccfe6da4
|
version: c3f57f280ec708df24886d9e62f2fd178d69d8e8
|
||||||
- name: github.com/elazarl/go-bindata-assetfs
|
- name: github.com/elazarl/go-bindata-assetfs
|
||||||
version: d5cac425555ca5cf00694df246e04f05e6a55150
|
version: 57eb5e1fc594ad4b0b1dbea7b286d299e0cb43c2
|
||||||
- name: github.com/flynn/go-shlex
|
|
||||||
version: 3f9db97f856818214da2e1057f8ad84803971cff
|
|
||||||
- name: github.com/gambol99/go-marathon
|
- name: github.com/gambol99/go-marathon
|
||||||
version: ade11d1dc2884ee1f387078fc28509559b6235d1
|
version: ade11d1dc2884ee1f387078fc28509559b6235d1
|
||||||
- name: github.com/go-check/check
|
- name: github.com/go-check/check
|
||||||
version: 11d3bc7aa68e238947792f30573146a3231fc0f1
|
version: 4f90aeace3a26ad7021961c297b22c42160c7b25
|
||||||
- name: github.com/golang/glog
|
|
||||||
version: fca8c8854093a154ff1eb580aae10276ad6b1b5f
|
|
||||||
- name: github.com/google/go-querystring
|
- name: github.com/google/go-querystring
|
||||||
version: 9235644dd9e52eeae6fa48efd539fdc351a0af53
|
version: 9235644dd9e52eeae6fa48efd539fdc351a0af53
|
||||||
subpackages:
|
subpackages:
|
||||||
- query
|
- query
|
||||||
- name: github.com/gorilla/context
|
- name: github.com/gorilla/context
|
||||||
version: 215affda49addc4c8ef7e2534915df2c8c35c6cd
|
version: a8d44e7d8e4d532b6a27a02dd82abb31cc1b01bd
|
||||||
- name: github.com/gorilla/handlers
|
|
||||||
version: 40694b40f4a928c062f56849989d3e9cd0570e5f
|
|
||||||
- name: github.com/gorilla/mux
|
- name: github.com/gorilla/mux
|
||||||
version: f15e0c49460fd49eebe2bcc8486b05d1bef68d3a
|
version: 9c19ed558d5df4da88e2ade9c8940d742aef0e7e
|
||||||
- name: github.com/gorilla/websocket
|
|
||||||
version: 1f512fc3f05332ba7117626cdfb4e07474e58e60
|
|
||||||
- name: github.com/hashicorp/consul
|
- name: github.com/hashicorp/consul
|
||||||
version: de080672fee9e6104572eeea89eccdca135bb918
|
version: f6fef66e1bf17be4f3c9855fbec6de802ca6bd7d
|
||||||
subpackages:
|
subpackages:
|
||||||
- api
|
- api
|
||||||
- name: github.com/hashicorp/hcl
|
- name: github.com/hashicorp/go-cleanhttp
|
||||||
version: 9a905a34e6280ce905da1a32344b25e81011197a
|
version: 875fb671b3ddc66f8e2f0acc33829c8cb989a38d
|
||||||
|
- name: github.com/hashicorp/serf
|
||||||
|
version: e4ec8cc423bbe20d26584b96efbeb9102e16d05f
|
||||||
subpackages:
|
subpackages:
|
||||||
- hcl/ast
|
- coordinate
|
||||||
- hcl/parser
|
- serf
|
||||||
- hcl/token
|
|
||||||
- json/parser
|
|
||||||
- hcl/scanner
|
|
||||||
- hcl/strconv
|
|
||||||
- json/scanner
|
|
||||||
- json/token
|
|
||||||
- name: github.com/inconshreveable/mousetrap
|
|
||||||
version: 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75
|
|
||||||
- name: github.com/kr/pretty
|
|
||||||
version: add1dbc86daf0f983cd4a48ceb39deb95c729b67
|
|
||||||
- name: github.com/kr/text
|
|
||||||
version: 7cafcd837844e784b526369c9bce262804aebc60
|
|
||||||
- name: github.com/libkermit/docker
|
- name: github.com/libkermit/docker
|
||||||
version: 3b5eb2973efff7af33cfb65141deaf4ed25c6d02
|
version: 3b5eb2973efff7af33cfb65141deaf4ed25c6d02
|
||||||
- name: github.com/libkermit/docker-check
|
- name: github.com/libkermit/docker-check
|
||||||
version: bb75a86b169c6c5d22c0ee98278124036f272d7b
|
version: bb75a86b169c6c5d22c0ee98278124036f272d7b
|
||||||
- name: github.com/magiconair/properties
|
|
||||||
version: c265cfa48dda6474e208715ca93e987829f572f8
|
|
||||||
- name: github.com/mailgun/log
|
- name: github.com/mailgun/log
|
||||||
version: 44874009257d4d47ba9806f1b7f72a32a015e4d8
|
version: 2f35a4607f1abf71f97f77f99b0de8493ef6f4ef
|
||||||
- name: github.com/mailgun/manners
|
- name: github.com/mailgun/manners
|
||||||
version: fada45142db3f93097ca917da107aa3fad0ffcb5
|
version: fada45142db3f93097ca917da107aa3fad0ffcb5
|
||||||
- name: github.com/mailgun/multibuf
|
- name: github.com/mailgun/multibuf
|
||||||
|
@ -187,12 +131,12 @@ imports:
|
||||||
version: 4f1a71750d95a5a8a46c40a67ffbed8129c2f138
|
version: 4f1a71750d95a5a8a46c40a67ffbed8129c2f138
|
||||||
- name: github.com/miekg/dns
|
- name: github.com/miekg/dns
|
||||||
version: 48ab6605c66ac797e07f615101c3e9e10e932b66
|
version: 48ab6605c66ac797e07f615101c3e9e10e932b66
|
||||||
- name: github.com/mitchellh/mapstructure
|
|
||||||
version: d2dd0262208475919e1a362f675cfc0e7c10e905
|
|
||||||
- name: github.com/moul/http2curl
|
- name: github.com/moul/http2curl
|
||||||
version: b1479103caacaa39319f75e7f57fc545287fca0d
|
version: b1479103caacaa39319f75e7f57fc545287fca0d
|
||||||
|
- name: github.com/ogier/pflag
|
||||||
|
version: 45c278ab3607870051a2ea9040bb85fcb8557481
|
||||||
- name: github.com/opencontainers/runc
|
- name: github.com/opencontainers/runc
|
||||||
version: 2441732d6fcc0fb0a542671a4372e0c7bc99c19e
|
version: d2d09b9bcd0573c58d7cd94e57bd7555af0c2072
|
||||||
subpackages:
|
subpackages:
|
||||||
- libcontainer/user
|
- libcontainer/user
|
||||||
- name: github.com/parnurzeal/gorequest
|
- name: github.com/parnurzeal/gorequest
|
||||||
|
@ -202,25 +146,13 @@ imports:
|
||||||
subpackages:
|
subpackages:
|
||||||
- difflib
|
- difflib
|
||||||
- name: github.com/samuel/go-zookeeper
|
- name: github.com/samuel/go-zookeeper
|
||||||
version: fa6674abf3f4580b946a01bf7a1ce4ba8766205b
|
version: 6eb1b09c6ce23f305f4c81bf748b22fbc6f3f9e9
|
||||||
subpackages:
|
subpackages:
|
||||||
- zk
|
- zk
|
||||||
- name: github.com/Sirupsen/logrus
|
- name: github.com/Sirupsen/logrus
|
||||||
version: 418b41d23a1bf978c06faea5313ba194650ac088
|
version: 6d9ae300aaf85d6acd2e5424081c7fcddb21dab8
|
||||||
- name: github.com/spf13/cast
|
|
||||||
version: ee7b3e0353166ab1f3a605294ac8cd2b77953778
|
|
||||||
- name: github.com/spf13/cobra
|
|
||||||
version: f368244301305f414206f889b1735a54cfc8bde8
|
|
||||||
subpackages:
|
|
||||||
- cobra
|
|
||||||
- name: github.com/spf13/jwalterweatherman
|
|
||||||
version: 33c24e77fb80341fe7130ee7c594256ff08ccc46
|
|
||||||
- name: github.com/spf13/pflag
|
|
||||||
version: cb88ea77998c3f024757528e3305022ab50b43be
|
|
||||||
- name: github.com/spf13/viper
|
|
||||||
version: a212099cbe6fbe8d07476bfda8d2d39b6ff8f325
|
|
||||||
- name: github.com/streamrail/concurrent-map
|
- name: github.com/streamrail/concurrent-map
|
||||||
version: 1ce4642e5a162df67825d273a86b87e6cc8a076b
|
version: 65a174a3a4188c0b7099acbc6cfa0c53628d3287
|
||||||
- name: github.com/stretchr/objx
|
- name: github.com/stretchr/objx
|
||||||
version: cbeaeb16a013161a98496fad62933b1d21786672
|
version: cbeaeb16a013161a98496fad62933b1d21786672
|
||||||
- name: github.com/stretchr/testify
|
- name: github.com/stretchr/testify
|
||||||
|
@ -229,13 +161,9 @@ imports:
|
||||||
- mock
|
- mock
|
||||||
- assert
|
- assert
|
||||||
- name: github.com/thoas/stats
|
- name: github.com/thoas/stats
|
||||||
version: 54ed61c2b47e263ae2f01b86837b0c4bd1da28e8
|
version: 69e3c072eec2df2df41afe6214f62eb940e4cd80
|
||||||
- name: github.com/ugorji/go
|
|
||||||
version: ea9cd21fa0bc41ee4bdd50ac7ed8cbc7ea2ed960
|
|
||||||
subpackages:
|
|
||||||
- codec
|
|
||||||
- name: github.com/unrolled/render
|
- name: github.com/unrolled/render
|
||||||
version: 26b4e3aac686940fe29521545afad9966ddfc80c
|
version: 198ad4d8b8a4612176b804ca10555b222a086b40
|
||||||
- name: github.com/vdemeester/docker-events
|
- name: github.com/vdemeester/docker-events
|
||||||
version: b308d2e8d639d928c882913bcb4f85b3a84c7a07
|
version: b308d2e8d639d928c882913bcb4f85b3a84c7a07
|
||||||
- name: github.com/vdemeester/shakers
|
- name: github.com/vdemeester/shakers
|
||||||
|
@ -255,8 +183,6 @@ imports:
|
||||||
- plugin/rewrite
|
- plugin/rewrite
|
||||||
- plugin
|
- plugin
|
||||||
- router
|
- router
|
||||||
- name: github.com/wendal/errors
|
|
||||||
version: f66c77a7882b399795a8987ebf87ef64a427417e
|
|
||||||
- name: github.com/xenolf/lego
|
- name: github.com/xenolf/lego
|
||||||
version: b119bc45fbd1cc71348003541aac9d3a7da63654
|
version: b119bc45fbd1cc71348003541aac9d3a7da63654
|
||||||
subpackages:
|
subpackages:
|
||||||
|
@ -266,7 +192,7 @@ imports:
|
||||||
subpackages:
|
subpackages:
|
||||||
- ocsp
|
- ocsp
|
||||||
- name: golang.org/x/net
|
- name: golang.org/x/net
|
||||||
version: d9558e5c97f85372afee28cf2b6059d7d3818919
|
version: 6460565bec1e8891e29ff478184c71b9e443ac36
|
||||||
subpackages:
|
subpackages:
|
||||||
- context
|
- context
|
||||||
- publicsuffix
|
- publicsuffix
|
||||||
|
@ -276,12 +202,10 @@ imports:
|
||||||
subpackages:
|
subpackages:
|
||||||
- unix
|
- unix
|
||||||
- windows
|
- windows
|
||||||
- name: gopkg.in/alecthomas/kingpin.v2
|
|
||||||
version: 639879d6110b1b0409410c7b737ef0bb18325038
|
|
||||||
- name: gopkg.in/fsnotify.v1
|
- name: gopkg.in/fsnotify.v1
|
||||||
version: 96c060f6a6b7e0d6f75fddd10efeaca3e5d1bcb0
|
version: 30411dbcefb7a1da7e84f75530ad3abe4011b4f8
|
||||||
- name: gopkg.in/mgo.v2
|
- name: gopkg.in/mgo.v2
|
||||||
version: 22287bab4379e1fbf6002fb4eb769888f3fb224c
|
version: b6e2fa371e64216a45e61072a96d4e3859f169da
|
||||||
subpackages:
|
subpackages:
|
||||||
- bson
|
- bson
|
||||||
- name: gopkg.in/square/go-jose.v1
|
- name: gopkg.in/square/go-jose.v1
|
||||||
|
@ -289,6 +213,4 @@ imports:
|
||||||
subpackages:
|
subpackages:
|
||||||
- cipher
|
- cipher
|
||||||
- json
|
- json
|
||||||
- name: gopkg.in/yaml.v2
|
|
||||||
version: 7ad95dd0798a40da1ccdff6dff35fd177b5edf40
|
|
||||||
devImports: []
|
devImports: []
|
||||||
|
|
227
glide.yaml
227
glide.yaml
|
@ -1,189 +1,78 @@
|
||||||
package: main
|
package: github.com/containous/traefik
|
||||||
import:
|
import:
|
||||||
- package: github.com/coreos/etcd
|
- package: github.com/BurntSushi/toml
|
||||||
version: 26e52d2bce9e3e11b77b68cc84bf91aebb1ef637
|
- package: github.com/BurntSushi/ty
|
||||||
subpackages:
|
subpackages:
|
||||||
- client
|
- fun
|
||||||
- package: github.com/mailgun/log
|
- package: github.com/Sirupsen/logrus
|
||||||
version: 44874009257d4d47ba9806f1b7f72a32a015e4d8
|
- package: github.com/cenkalti/backoff
|
||||||
|
- package: github.com/codegangsta/negroni
|
||||||
|
- package: github.com/containous/flaeg
|
||||||
|
version: c425b9d758df1864ca838dbd433f1cf8f5097d51
|
||||||
- package: github.com/containous/oxy
|
- package: github.com/containous/oxy
|
||||||
version: 183212964e13e7b8afe01a08b193d04300554a68
|
|
||||||
subpackages:
|
subpackages:
|
||||||
- cbreaker
|
- cbreaker
|
||||||
|
- connlimit
|
||||||
- forward
|
- forward
|
||||||
- memmetrics
|
|
||||||
- roundrobin
|
- roundrobin
|
||||||
|
- stream
|
||||||
- utils
|
- utils
|
||||||
- package: github.com/hashicorp/consul
|
- package: github.com/containous/staert
|
||||||
version: de080672fee9e6104572eeea89eccdca135bb918
|
version: ff272631ecfc9c22490b651fea0f08d364d46518
|
||||||
subpackages:
|
|
||||||
- api
|
|
||||||
- package: github.com/samuel/go-zookeeper
|
|
||||||
version: fa6674abf3f4580b946a01bf7a1ce4ba8766205b
|
|
||||||
subpackages:
|
|
||||||
- zk
|
|
||||||
- package: github.com/docker/libtrust
|
|
||||||
version: 9cbd2a1374f46905c68a4eb3694a130610adc62a
|
|
||||||
- package: github.com/go-check/check
|
|
||||||
version: 11d3bc7aa68e238947792f30573146a3231fc0f1
|
|
||||||
- package: golang.org/x/net
|
|
||||||
version: d9558e5c97f85372afee28cf2b6059d7d3818919
|
|
||||||
subpackages:
|
|
||||||
- context
|
|
||||||
- package: github.com/gorilla/handlers
|
|
||||||
version: 40694b40f4a928c062f56849989d3e9cd0570e5f
|
|
||||||
- package: github.com/docker/libkv
|
|
||||||
version: 7283ef27ed32fe267388510a91709b307bb9942c
|
|
||||||
- package: github.com/alecthomas/template
|
|
||||||
version: b867cc6ab45cece8143cfcc6fc9c77cf3f2c23c0
|
|
||||||
- package: github.com/vdemeester/shakers
|
|
||||||
version: 24d7f1d6a71aa5d9cbe7390e4afb66b7eef9e1b3
|
|
||||||
- package: github.com/alecthomas/units
|
|
||||||
version: 6b4e7dc5e3143b85ea77909c72caf89416fc2915
|
|
||||||
- package: github.com/gambol99/go-marathon
|
|
||||||
version: ade11d1dc2884ee1f387078fc28509559b6235d1
|
|
||||||
- package: github.com/vulcand/predicate
|
|
||||||
version: cb0bff91a7ab7cf7571e661ff883fc997bc554a3
|
|
||||||
- package: github.com/thoas/stats
|
|
||||||
version: 54ed61c2b47e263ae2f01b86837b0c4bd1da28e8
|
|
||||||
- package: github.com/Sirupsen/logrus
|
|
||||||
version: 418b41d23a1bf978c06faea5313ba194650ac088
|
|
||||||
- package: github.com/unrolled/render
|
|
||||||
version: 26b4e3aac686940fe29521545afad9966ddfc80c
|
|
||||||
- package: github.com/flynn/go-shlex
|
|
||||||
version: 3f9db97f856818214da2e1057f8ad84803971cff
|
|
||||||
- package: github.com/boltdb/bolt
|
|
||||||
version: 51f99c862475898df9773747d3accd05a7ca33c1
|
|
||||||
- package: gopkg.in/mgo.v2
|
|
||||||
version: 22287bab4379e1fbf6002fb4eb769888f3fb224c
|
|
||||||
subpackages:
|
|
||||||
- bson
|
|
||||||
- package: github.com/docker/docker
|
|
||||||
version: 9837ec4da53f15f9120d53a6e1517491ba8b0261
|
|
||||||
subpackages:
|
|
||||||
- autogen
|
|
||||||
- api
|
|
||||||
- cliconfig
|
|
||||||
- daemon/network
|
|
||||||
- graph/tags
|
|
||||||
- image
|
|
||||||
- opts
|
|
||||||
- pkg/archive
|
|
||||||
- pkg/fileutils
|
|
||||||
- pkg/homedir
|
|
||||||
- pkg/httputils
|
|
||||||
- pkg/ioutils
|
|
||||||
- pkg/jsonmessage
|
|
||||||
- pkg/mflag
|
|
||||||
- pkg/nat
|
|
||||||
- pkg/parsers
|
|
||||||
- pkg/pools
|
|
||||||
- pkg/promise
|
|
||||||
- pkg/random
|
|
||||||
- pkg/stdcopy
|
|
||||||
- pkg/stringid
|
|
||||||
- pkg/symlink
|
|
||||||
- pkg/system
|
|
||||||
- pkg/tarsum
|
|
||||||
- pkg/term
|
|
||||||
- pkg/timeutils
|
|
||||||
- pkg/tlsconfig
|
|
||||||
- pkg/ulimit
|
|
||||||
- pkg/units
|
|
||||||
- pkg/urlutil
|
|
||||||
- pkg/useragent
|
|
||||||
- pkg/version
|
|
||||||
- registry
|
|
||||||
- runconfig
|
|
||||||
- utils
|
|
||||||
- volume
|
|
||||||
- package: github.com/mailgun/timetools
|
|
||||||
version: fd192d755b00c968d312d23f521eb0cdc6f66bd0
|
|
||||||
- package: github.com/codegangsta/negroni
|
|
||||||
version: c7477ad8e330bef55bf1ebe300cf8aa67c492d1b
|
|
||||||
- package: gopkg.in/yaml.v2
|
|
||||||
version: 7ad95dd0798a40da1ccdff6dff35fd177b5edf
|
|
||||||
- package: github.com/opencontainers/runc
|
|
||||||
version: 2441732d6fcc0fb0a542671a4372e0c7bc99c19e
|
|
||||||
subpackages:
|
|
||||||
- libcontainer/user
|
|
||||||
- package: github.com/gorilla/mux
|
|
||||||
version: f15e0c49460fd49eebe2bcc8486b05d1bef68d3a
|
|
||||||
- package: github.com/BurntSushi/ty
|
|
||||||
version: 6add9cd6ad42d389d6ead1dde60b4ad71e46fd74
|
|
||||||
- package: github.com/elazarl/go-bindata-assetfs
|
|
||||||
version: d5cac425555ca5cf00694df246e04f05e6a55150
|
|
||||||
- package: github.com/BurntSushi/toml
|
|
||||||
version: bbd5bb678321a0d6e58f1099321dfa73391c1b6f
|
|
||||||
- package: gopkg.in/alecthomas/kingpin.v2
|
|
||||||
version: 639879d6110b1b0409410c7b737ef0bb18325038
|
|
||||||
- package: github.com/cenkalti/backoff
|
|
||||||
version: 4dc77674aceaabba2c7e3da25d4c823edfb73f99
|
|
||||||
- package: gopkg.in/fsnotify.v1
|
|
||||||
version: 96c060f6a6b7e0d6f75fddd10efeaca3e5d1bcb0
|
|
||||||
- package: github.com/mailgun/manners
|
|
||||||
version: fada45142db3f93097ca917da107aa3fad0ffcb5
|
|
||||||
- package: github.com/gorilla/context
|
|
||||||
version: 215affda49addc4c8ef7e2534915df2c8c35c6cd
|
|
||||||
- package: github.com/codahale/hdrhistogram
|
|
||||||
version: 954f16e8b9ef0e5d5189456aa4c1202758e04f17
|
|
||||||
- package: github.com/gorilla/websocket
|
|
||||||
- package: github.com/donovanhide/eventsource
|
|
||||||
version: d8a3071799b98cacd30b6da92f536050ccfe6da4
|
|
||||||
- package: github.com/golang/glog
|
|
||||||
version: fca8c8854093a154ff1eb580aae10276ad6b1b5f
|
|
||||||
- package: github.com/spf13/cast
|
|
||||||
version: ee7b3e0353166ab1f3a605294ac8cd2b77953778
|
|
||||||
- package: github.com/mitchellh/mapstructure
|
|
||||||
- package: github.com/spf13/jwalterweatherman
|
|
||||||
- package: github.com/spf13/pflag
|
|
||||||
- package: github.com/wendal/errors
|
|
||||||
- package: github.com/hashicorp/hcl
|
|
||||||
- package: github.com/kr/pretty
|
|
||||||
- package: github.com/magiconair/properties
|
|
||||||
- package: github.com/kr/text
|
|
||||||
- package: github.com/spf13/viper
|
|
||||||
version: a212099cbe6fbe8d07476bfda8d2d39b6ff8f325
|
|
||||||
- package: github.com/spf13/cobra
|
|
||||||
subpackages:
|
|
||||||
- cobra
|
|
||||||
- package: github.com/google/go-querystring
|
|
||||||
subpackages:
|
|
||||||
- query
|
|
||||||
- package: github.com/vulcand/vulcand
|
|
||||||
subpackages:
|
|
||||||
- plugin/rewrite
|
|
||||||
- package: github.com/stretchr/testify
|
|
||||||
subpackages:
|
|
||||||
- mock
|
|
||||||
- package: github.com/xenolf/lego
|
|
||||||
- package: github.com/libkermit/docker-check
|
|
||||||
version: bb75a86b169c6c5d22c0ee98278124036f272d7b
|
|
||||||
- package: github.com/libkermit/docker
|
|
||||||
version: 3b5eb2973efff7af33cfb65141deaf4ed25c6d02
|
|
||||||
- package: github.com/docker/libcompose
|
|
||||||
version: 8ee7bcc364f7b8194581a3c6bd9fa019467c7873
|
|
||||||
- package: github.com/docker/distribution
|
|
||||||
version: 467fc068d88aa6610691b7f1a677271a3fac4aac
|
|
||||||
subpackages:
|
|
||||||
- reference
|
|
||||||
- package: github.com/docker/engine-api
|
- package: github.com/docker/engine-api
|
||||||
version: 3d3d0b6c9d2651aac27f416a6da0224c1875b3eb
|
version: 3d3d0b6c9d2651aac27f416a6da0224c1875b3eb
|
||||||
subpackages:
|
subpackages:
|
||||||
- client
|
- client
|
||||||
- types
|
- types
|
||||||
- types/container
|
- types/events
|
||||||
- types/filters
|
- types/filters
|
||||||
- types/strslice
|
|
||||||
- package: github.com/vdemeester/docker-events
|
|
||||||
- package: github.com/docker/go-connections
|
- package: github.com/docker/go-connections
|
||||||
subpackages:
|
subpackages:
|
||||||
- nat
|
|
||||||
- sockets
|
- sockets
|
||||||
- tlsconfig
|
- tlsconfig
|
||||||
- package: github.com/docker/go-units
|
- package: github.com/docker/libkv
|
||||||
- package: github.com/mailgun/multibuf
|
subpackages:
|
||||||
- package: github.com/streamrail/concurrent-map
|
- store
|
||||||
|
- store/boltdb
|
||||||
|
- store/consul
|
||||||
|
- store/etcd
|
||||||
|
- store/zookeeper
|
||||||
|
- package: github.com/elazarl/go-bindata-assetfs
|
||||||
|
- package: github.com/gambol99/go-marathon
|
||||||
|
version: ade11d1dc2884ee1f387078fc28509559b6235d1
|
||||||
|
- package: github.com/gorilla/mux
|
||||||
|
- package: github.com/hashicorp/consul
|
||||||
|
subpackages:
|
||||||
|
- api
|
||||||
|
- package: github.com/mailgun/manners
|
||||||
- package: github.com/parnurzeal/gorequest
|
- package: github.com/parnurzeal/gorequest
|
||||||
|
- package: github.com/streamrail/concurrent-map
|
||||||
|
- package: github.com/stretchr/testify
|
||||||
|
subpackages:
|
||||||
|
- mock
|
||||||
|
- package: github.com/thoas/stats
|
||||||
|
- package: github.com/unrolled/render
|
||||||
|
- package: github.com/vdemeester/docker-events
|
||||||
|
- package: github.com/vulcand/vulcand
|
||||||
|
subpackages:
|
||||||
|
- plugin/rewrite
|
||||||
|
- package: github.com/xenolf/lego
|
||||||
|
subpackages:
|
||||||
|
- acme
|
||||||
|
- package: golang.org/x/net
|
||||||
|
subpackages:
|
||||||
|
- context
|
||||||
|
- package: gopkg.in/fsnotify.v1
|
||||||
|
- package: github.com/libkermit/docker-check
|
||||||
|
version: bb75a86b169c6c5d22c0ee98278124036f272d7b
|
||||||
|
- package: github.com/libkermit/docker
|
||||||
|
version: 3b5eb2973efff7af33cfb65141deaf4ed25c6d02
|
||||||
|
- package: github.com/docker/docker
|
||||||
|
version: 9837ec4da53f15f9120d53a6e1517491ba8b0261
|
||||||
|
subpackages:
|
||||||
|
- namesgenerator
|
||||||
|
- package: github.com/go-check/check
|
||||||
|
- package: github.com/docker/libcompose
|
||||||
|
version: 8ee7bcc364f7b8194581a3c6bd9fa019467c7873
|
||||||
- package: github.com/mattn/go-shellwords
|
- package: github.com/mattn/go-shellwords
|
||||||
- package: github.com/moul/http2curl
|
- package: github.com/vdemeester/shakers
|
||||||
|
|
|
@ -5,7 +5,6 @@ import (
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"fmt"
|
|
||||||
"github.com/go-check/check"
|
"github.com/go-check/check"
|
||||||
|
|
||||||
"bytes"
|
"bytes"
|
||||||
|
@ -15,34 +14,6 @@ import (
|
||||||
// SimpleSuite
|
// SimpleSuite
|
||||||
type SimpleSuite struct{ BaseSuite }
|
type SimpleSuite struct{ BaseSuite }
|
||||||
|
|
||||||
func (s *SimpleSuite) TestNoOrInexistentConfigShouldFail(c *check.C) {
|
|
||||||
cmd := exec.Command(traefikBinary)
|
|
||||||
|
|
||||||
var b bytes.Buffer
|
|
||||||
cmd.Stdout = &b
|
|
||||||
cmd.Stderr = &b
|
|
||||||
|
|
||||||
cmd.Start()
|
|
||||||
time.Sleep(500 * time.Millisecond)
|
|
||||||
output := b.Bytes()
|
|
||||||
|
|
||||||
c.Assert(string(output), checker.Contains, "No configuration file found")
|
|
||||||
cmd.Process.Kill()
|
|
||||||
|
|
||||||
nonExistentFile := "non/existent/file.toml"
|
|
||||||
cmd = exec.Command(traefikBinary, "--configFile="+nonExistentFile)
|
|
||||||
|
|
||||||
cmd.Stdout = &b
|
|
||||||
cmd.Stderr = &b
|
|
||||||
|
|
||||||
cmd.Start()
|
|
||||||
time.Sleep(500 * time.Millisecond)
|
|
||||||
output = b.Bytes()
|
|
||||||
|
|
||||||
c.Assert(string(output), checker.Contains, fmt.Sprintf("Error reading configuration file: open %s: no such file or directory", nonExistentFile))
|
|
||||||
cmd.Process.Kill()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *SimpleSuite) TestInvalidConfigShouldFail(c *check.C) {
|
func (s *SimpleSuite) TestInvalidConfigShouldFail(c *check.C) {
|
||||||
cmd := exec.Command(traefikBinary, "--configFile=fixtures/invalid_configuration.toml")
|
cmd := exec.Command(traefikBinary, "--configFile=fixtures/invalid_configuration.toml")
|
||||||
|
|
||||||
|
@ -55,7 +26,7 @@ func (s *SimpleSuite) TestInvalidConfigShouldFail(c *check.C) {
|
||||||
defer cmd.Process.Kill()
|
defer cmd.Process.Kill()
|
||||||
output := b.Bytes()
|
output := b.Bytes()
|
||||||
|
|
||||||
c.Assert(string(output), checker.Contains, "While parsing config: Near line 0 (last key parsed ''): Bare keys cannot contain '{'")
|
c.Assert(string(output), checker.Contains, "Near line 0 (last key parsed ''): Bare keys cannot contain '{'")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SimpleSuite) TestSimpleDefaultConfig(c *check.C) {
|
func (s *SimpleSuite) TestSimpleDefaultConfig(c *check.C) {
|
||||||
|
|
|
@ -9,7 +9,7 @@ import (
|
||||||
|
|
||||||
// BoltDb holds configurations of the BoltDb provider.
|
// BoltDb holds configurations of the BoltDb provider.
|
||||||
type BoltDb struct {
|
type BoltDb struct {
|
||||||
Kv `mapstructure:",squash"`
|
Kv
|
||||||
}
|
}
|
||||||
|
|
||||||
// Provide allows the provider to provide configurations to traefik
|
// Provide allows the provider to provide configurations to traefik
|
||||||
|
|
|
@ -9,7 +9,7 @@ import (
|
||||||
|
|
||||||
// Consul holds configurations of the Consul provider.
|
// Consul holds configurations of the Consul provider.
|
||||||
type Consul struct {
|
type Consul struct {
|
||||||
Kv `mapstructure:",squash"`
|
Kv
|
||||||
}
|
}
|
||||||
|
|
||||||
// Provide allows the provider to provide configurations to traefik
|
// Provide allows the provider to provide configurations to traefik
|
||||||
|
|
|
@ -23,11 +23,11 @@ const (
|
||||||
|
|
||||||
// ConsulCatalog holds configurations of the Consul catalog provider.
|
// ConsulCatalog holds configurations of the Consul catalog provider.
|
||||||
type ConsulCatalog struct {
|
type ConsulCatalog struct {
|
||||||
BaseProvider `mapstructure:",squash"`
|
BaseProvider
|
||||||
Endpoint string
|
Endpoint string `description:"Consul server endpoint"`
|
||||||
Domain string
|
Domain string `description:"Default domain used"`
|
||||||
client *api.Client
|
client *api.Client
|
||||||
Prefix string
|
Prefix string
|
||||||
}
|
}
|
||||||
|
|
||||||
type serviceUpdate struct {
|
type serviceUpdate struct {
|
||||||
|
|
|
@ -29,18 +29,18 @@ const DockerAPIVersion string = "1.21"
|
||||||
|
|
||||||
// Docker holds configurations of the Docker provider.
|
// Docker holds configurations of the Docker provider.
|
||||||
type Docker struct {
|
type Docker struct {
|
||||||
BaseProvider `mapstructure:",squash"`
|
BaseProvider
|
||||||
Endpoint string
|
Endpoint string `description:"Docker server endpoint. Can be a tcp or a unix socket endpoint"`
|
||||||
Domain string
|
Domain string `description:"Default domain used"`
|
||||||
TLS *DockerTLS
|
TLS *DockerTLS `description:"Enable Docker TLS support"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// DockerTLS holds TLS specific configurations
|
// DockerTLS holds TLS specific configurations
|
||||||
type DockerTLS struct {
|
type DockerTLS struct {
|
||||||
CA string
|
CA string `description:"TLS CA"`
|
||||||
Cert string
|
Cert string `description:"TLS cert"`
|
||||||
Key string
|
Key string `description:"TLS key"`
|
||||||
InsecureSkipVerify bool
|
InsecureSkipVerify bool `description:"TLS insecure skip verify"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (provider *Docker) createClient() (client.APIClient, error) {
|
func (provider *Docker) createClient() (client.APIClient, error) {
|
||||||
|
|
|
@ -9,7 +9,7 @@ import (
|
||||||
|
|
||||||
// Etcd holds configurations of the Etcd provider.
|
// Etcd holds configurations of the Etcd provider.
|
||||||
type Etcd struct {
|
type Etcd struct {
|
||||||
Kv `mapstructure:",squash"`
|
Kv
|
||||||
}
|
}
|
||||||
|
|
||||||
// Provide allows the provider to provide configurations to traefik
|
// Provide allows the provider to provide configurations to traefik
|
||||||
|
|
|
@ -14,7 +14,7 @@ import (
|
||||||
|
|
||||||
// File holds configurations of the File provider.
|
// File holds configurations of the File provider.
|
||||||
type File struct {
|
type File struct {
|
||||||
BaseProvider `mapstructure:",squash"`
|
BaseProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
// Provide allows the provider to provide configurations to traefik
|
// Provide allows the provider to provide configurations to traefik
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
log "github.com/Sirupsen/logrus"
|
log "github.com/Sirupsen/logrus"
|
||||||
"github.com/cenkalti/backoff"
|
"github.com/cenkalti/backoff"
|
||||||
"github.com/containous/traefik/provider/k8s"
|
"github.com/containous/traefik/provider/k8s"
|
||||||
|
@ -20,12 +21,38 @@ const (
|
||||||
serviceAccountCACert = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
|
serviceAccountCACert = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Namespaces holds kubernetes namespaces
|
||||||
|
type Namespaces []string
|
||||||
|
|
||||||
|
//Set adds strings elem into the the parser
|
||||||
|
//it splits str on , and ;
|
||||||
|
func (ns *Namespaces) Set(str string) error {
|
||||||
|
fargs := func(c rune) bool {
|
||||||
|
return c == ',' || c == ';'
|
||||||
|
}
|
||||||
|
// get function
|
||||||
|
slice := strings.FieldsFunc(str, fargs)
|
||||||
|
*ns = append(*ns, slice...)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
//Get []string
|
||||||
|
func (ns *Namespaces) Get() interface{} { return Namespaces(*ns) }
|
||||||
|
|
||||||
|
//String return slice in a string
|
||||||
|
func (ns *Namespaces) String() string { return fmt.Sprintf("%v", *ns) }
|
||||||
|
|
||||||
|
//SetValue sets []string into the parser
|
||||||
|
func (ns *Namespaces) SetValue(val interface{}) {
|
||||||
|
*ns = Namespaces(val.(Namespaces))
|
||||||
|
}
|
||||||
|
|
||||||
// Kubernetes holds configurations of the Kubernetes provider.
|
// Kubernetes holds configurations of the Kubernetes provider.
|
||||||
type Kubernetes struct {
|
type Kubernetes struct {
|
||||||
BaseProvider `mapstructure:",squash"`
|
BaseProvider
|
||||||
Endpoint string
|
Endpoint string `description:"Kubernetes server endpoint"`
|
||||||
disablePassHostHeaders bool
|
DisablePassHostHeaders bool `description:"Kubernetes disable PassHost Headers"`
|
||||||
Namespaces []string
|
Namespaces Namespaces `description:"Kubernetes namespaces"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (provider *Kubernetes) createClient() (k8s.Client, error) {
|
func (provider *Kubernetes) createClient() (k8s.Client, error) {
|
||||||
|
@ -259,7 +286,7 @@ func equalPorts(servicePort k8s.ServicePort, ingressPort k8s.IntOrString) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (provider *Kubernetes) getPassHostHeader() bool {
|
func (provider *Kubernetes) getPassHostHeader() bool {
|
||||||
if provider.disablePassHostHeaders {
|
if provider.DisablePassHostHeaders {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -416,7 +416,7 @@ func TestRuleType(t *testing.T) {
|
||||||
services: services,
|
services: services,
|
||||||
watchChan: watchChan,
|
watchChan: watchChan,
|
||||||
}
|
}
|
||||||
provider := Kubernetes{disablePassHostHeaders: true}
|
provider := Kubernetes{DisablePassHostHeaders: true}
|
||||||
actualConfig, err := provider.loadIngresses(client)
|
actualConfig, err := provider.loadIngresses(client)
|
||||||
actual := actualConfig.Frontends
|
actual := actualConfig.Frontends
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -538,7 +538,7 @@ func TestGetPassHostHeader(t *testing.T) {
|
||||||
services: services,
|
services: services,
|
||||||
watchChan: watchChan,
|
watchChan: watchChan,
|
||||||
}
|
}
|
||||||
provider := Kubernetes{disablePassHostHeaders: true}
|
provider := Kubernetes{DisablePassHostHeaders: true}
|
||||||
actual, err := provider.loadIngresses(client)
|
actual, err := provider.loadIngresses(client)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("error %+v", err)
|
t.Fatalf("error %+v", err)
|
||||||
|
@ -1205,7 +1205,7 @@ func TestHostlessIngress(t *testing.T) {
|
||||||
services: services,
|
services: services,
|
||||||
watchChan: watchChan,
|
watchChan: watchChan,
|
||||||
}
|
}
|
||||||
provider := Kubernetes{disablePassHostHeaders: true}
|
provider := Kubernetes{DisablePassHostHeaders: true}
|
||||||
actual, err := provider.loadIngresses(client)
|
actual, err := provider.loadIngresses(client)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("error %+v", err)
|
t.Fatalf("error %+v", err)
|
||||||
|
|
|
@ -22,20 +22,20 @@ import (
|
||||||
|
|
||||||
// Kv holds common configurations of key-value providers.
|
// Kv holds common configurations of key-value providers.
|
||||||
type Kv struct {
|
type Kv struct {
|
||||||
BaseProvider `mapstructure:",squash"`
|
BaseProvider
|
||||||
Endpoint string
|
Endpoint string `description:"Comma sepparated server endpoints"`
|
||||||
Prefix string
|
Prefix string `description:"Prefix used for KV store"`
|
||||||
TLS *KvTLS
|
TLS *KvTLS `description:"Enable TLS support"`
|
||||||
storeType store.Backend
|
storeType store.Backend
|
||||||
kvclient store.Store
|
kvclient store.Store
|
||||||
}
|
}
|
||||||
|
|
||||||
// KvTLS holds TLS specific configurations
|
// KvTLS holds TLS specific configurations
|
||||||
type KvTLS struct {
|
type KvTLS struct {
|
||||||
CA string
|
CA string `description:"TLS CA"`
|
||||||
Cert string
|
Cert string `description:"TLS cert"`
|
||||||
Key string
|
Key string `description:"TLS key"`
|
||||||
InsecureSkipVerify bool
|
InsecureSkipVerify bool `description:"TLS insecure skip verify"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (provider *Kv) watchKv(configurationChan chan<- types.ConfigMessage, prefix string, stop chan bool) error {
|
func (provider *Kv) watchKv(configurationChan chan<- types.ConfigMessage, prefix string, stop chan bool) error {
|
||||||
|
|
|
@ -20,10 +20,10 @@ import (
|
||||||
|
|
||||||
// Marathon holds configuration of the Marathon provider.
|
// Marathon holds configuration of the Marathon provider.
|
||||||
type Marathon struct {
|
type Marathon struct {
|
||||||
BaseProvider `mapstructure:",squash"`
|
BaseProvider `mapstructure:",squash" description:"go through"`
|
||||||
Endpoint string
|
Endpoint string `description:"Marathon server endpoint. You can also specify multiple endpoint for Marathon"`
|
||||||
Domain string
|
Domain string `description:"Default domain used"`
|
||||||
ExposedByDefault bool
|
ExposedByDefault bool `description:"Expose Marathon apps by default"`
|
||||||
Basic *MarathonBasic
|
Basic *MarathonBasic
|
||||||
TLS *tls.Config
|
TLS *tls.Config
|
||||||
marathonClient marathon.Marathon
|
marathonClient marathon.Marathon
|
||||||
|
@ -36,8 +36,8 @@ type MarathonBasic struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type lightMarathonClient interface {
|
type lightMarathonClient interface {
|
||||||
Applications(url.Values) (*marathon.Applications, error)
|
|
||||||
AllTasks(v url.Values) (*marathon.Tasks, error)
|
AllTasks(v url.Values) (*marathon.Tasks, error)
|
||||||
|
Applications(url.Values) (*marathon.Applications, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Provide allows the provider to provide configurations to traefik
|
// Provide allows the provider to provide configurations to traefik
|
||||||
|
|
|
@ -22,8 +22,8 @@ type Provider interface {
|
||||||
|
|
||||||
// BaseProvider should be inherited by providers
|
// BaseProvider should be inherited by providers
|
||||||
type BaseProvider struct {
|
type BaseProvider struct {
|
||||||
Watch bool
|
Watch bool `description:"Watch provider"`
|
||||||
Filename string
|
Filename string `description:"Override default configuration template. For advanced users :)"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *BaseProvider) getConfiguration(defaultTemplateFile string, funcMap template.FuncMap, templateObjects interface{}) (*types.Configuration, error) {
|
func (p *BaseProvider) getConfiguration(defaultTemplateFile string, funcMap template.FuncMap, templateObjects interface{}) (*types.Configuration, error) {
|
||||||
|
|
119
traefik.go
119
traefik.go
|
@ -1,16 +1,133 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
log "github.com/Sirupsen/logrus"
|
||||||
|
"github.com/containous/flaeg"
|
||||||
|
"github.com/containous/staert"
|
||||||
|
"github.com/containous/traefik/acme"
|
||||||
|
"github.com/containous/traefik/middlewares"
|
||||||
|
"github.com/containous/traefik/provider"
|
||||||
fmtlog "log"
|
fmtlog "log"
|
||||||
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"reflect"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
runtime.GOMAXPROCS(runtime.NumCPU())
|
runtime.GOMAXPROCS(runtime.NumCPU())
|
||||||
if err := traefikCmd.Execute(); err != nil {
|
|
||||||
|
//traefik config inits
|
||||||
|
traefikConfiguration := NewTraefikConfiguration()
|
||||||
|
traefikPointersConfiguration := NewTraefikDefaultPointersConfiguration()
|
||||||
|
//traefik Command init
|
||||||
|
traefikCmd := &flaeg.Command{
|
||||||
|
Name: "traefik",
|
||||||
|
Description: `traefik is a modern HTTP reverse proxy and load balancer made to deploy microservices with ease.
|
||||||
|
Complete documentation is available at https://traefik.io`,
|
||||||
|
Config: traefikConfiguration,
|
||||||
|
DefaultPointersConfig: traefikPointersConfiguration,
|
||||||
|
Run: func() error {
|
||||||
|
run(traefikConfiguration)
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
//version Command init
|
||||||
|
versionCmd := &flaeg.Command{
|
||||||
|
Name: "version",
|
||||||
|
Description: `Print version`,
|
||||||
|
Config: struct{}{},
|
||||||
|
DefaultPointersConfig: struct{}{},
|
||||||
|
Run: func() error {
|
||||||
|
fmtlog.Println(Version + " built on the " + BuildDate)
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
//init flaeg source
|
||||||
|
f := flaeg.New(traefikCmd, os.Args[1:])
|
||||||
|
//add custom parsers
|
||||||
|
f.AddParser(reflect.TypeOf(EntryPoints{}), &EntryPoints{})
|
||||||
|
f.AddParser(reflect.TypeOf(DefaultEntryPoints{}), &DefaultEntryPoints{})
|
||||||
|
f.AddParser(reflect.TypeOf(provider.Namespaces{}), &provider.Namespaces{})
|
||||||
|
f.AddParser(reflect.TypeOf([]acme.Domain{}), &acme.Domains{})
|
||||||
|
|
||||||
|
//add version command
|
||||||
|
f.AddCommand(versionCmd)
|
||||||
|
if _, err := f.Parse(traefikCmd); err != nil {
|
||||||
fmtlog.Println(err)
|
fmtlog.Println(err)
|
||||||
os.Exit(-1)
|
os.Exit(-1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//staert init
|
||||||
|
s := staert.NewStaert(traefikCmd)
|
||||||
|
//init toml source
|
||||||
|
toml := staert.NewTomlSource("traefik", []string{traefikConfiguration.ConfigFile, "/etc/traefik/", "$HOME/.traefik/", "."})
|
||||||
|
|
||||||
|
//add sources to staert
|
||||||
|
s.AddSource(toml)
|
||||||
|
s.AddSource(f)
|
||||||
|
if _, err := s.LoadConfig(); err != nil {
|
||||||
|
fmtlog.Println(err)
|
||||||
|
}
|
||||||
|
if traefikConfiguration.File != nil && len(traefikConfiguration.File.Filename) == 0 {
|
||||||
|
// no filename, setting to global config file
|
||||||
|
log.Debugf("ConfigFileUsed %s", toml.ConfigFileUsed())
|
||||||
|
traefikConfiguration.File.Filename = toml.ConfigFileUsed()
|
||||||
|
}
|
||||||
|
if len(traefikConfiguration.EntryPoints) == 0 {
|
||||||
|
traefikConfiguration.EntryPoints = map[string]*EntryPoint{"http": {Address: ":80"}}
|
||||||
|
traefikConfiguration.DefaultEntryPoints = []string{"http"}
|
||||||
|
}
|
||||||
|
if err := s.Run(); err != nil {
|
||||||
|
fmtlog.Println(err)
|
||||||
|
os.Exit(-1)
|
||||||
|
}
|
||||||
|
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func run(traefikConfiguration *TraefikConfiguration) {
|
||||||
|
fmtlog.SetFlags(fmtlog.Lshortfile | fmtlog.LstdFlags)
|
||||||
|
|
||||||
|
// load global configuration
|
||||||
|
globalConfiguration := traefikConfiguration.GlobalConfiguration
|
||||||
|
|
||||||
|
http.DefaultTransport.(*http.Transport).MaxIdleConnsPerHost = globalConfiguration.MaxIdleConnsPerHost
|
||||||
|
loggerMiddleware := middlewares.NewLogger(globalConfiguration.AccessLogsFile)
|
||||||
|
defer loggerMiddleware.Close()
|
||||||
|
|
||||||
|
// logging
|
||||||
|
level, err := log.ParseLevel(strings.ToLower(globalConfiguration.LogLevel))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Error getting level", err)
|
||||||
|
}
|
||||||
|
log.SetLevel(level)
|
||||||
|
|
||||||
|
if len(globalConfiguration.TraefikLogsFile) > 0 {
|
||||||
|
fi, err := os.OpenFile(globalConfiguration.TraefikLogsFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
||||||
|
defer func() {
|
||||||
|
if err := fi.Close(); err != nil {
|
||||||
|
log.Error("Error closinf file", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Error opening file", err)
|
||||||
|
} else {
|
||||||
|
log.SetOutput(fi)
|
||||||
|
log.SetFormatter(&log.TextFormatter{DisableColors: true, FullTimestamp: true, DisableSorting: true})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.SetFormatter(&log.TextFormatter{FullTimestamp: true, DisableSorting: true})
|
||||||
|
}
|
||||||
|
jsonConf, _ := json.Marshal(globalConfiguration)
|
||||||
|
log.Infof("Traefik version %s built on %s", Version, BuildDate)
|
||||||
|
log.Debugf("Global configuration loaded %s", string(jsonConf))
|
||||||
|
server := NewServer(globalConfiguration)
|
||||||
|
server.Start()
|
||||||
|
defer server.Close()
|
||||||
|
log.Info("Shutting down")
|
||||||
|
}
|
||||||
|
|
11
web.go
11
web.go
|
@ -23,10 +23,11 @@ var metrics = stats.New()
|
||||||
// WebProvider is a provider.Provider implementation that provides the UI.
|
// WebProvider is a provider.Provider implementation that provides the UI.
|
||||||
// FIXME to be handled another way.
|
// FIXME to be handled another way.
|
||||||
type WebProvider struct {
|
type WebProvider struct {
|
||||||
Address string
|
Address string `description:"Web administration port"`
|
||||||
CertFile, KeyFile string
|
CertFile string `description:"SSL certificate"`
|
||||||
ReadOnly bool
|
KeyFile string `description:"SSL certificate"`
|
||||||
server *Server
|
ReadOnly bool `description:"Enable read only API"`
|
||||||
|
server *Server
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -92,7 +93,7 @@ func (provider *WebProvider) Provide(configurationChan chan<- types.ConfigMessag
|
||||||
systemRouter.Methods("GET").Path("/").HandlerFunc(func(response http.ResponseWriter, request *http.Request) {
|
systemRouter.Methods("GET").Path("/").HandlerFunc(func(response http.ResponseWriter, request *http.Request) {
|
||||||
http.Redirect(response, request, "/dashboard/", 302)
|
http.Redirect(response, request, "/dashboard/", 302)
|
||||||
})
|
})
|
||||||
systemRouter.Methods("GET").PathPrefix("/dashboard/").Handler(http.StripPrefix("/dashboard/", http.FileServer(&assetfs.AssetFS{Asset: autogen.Asset, AssetDir: autogen.AssetDir, Prefix: "static"})))
|
systemRouter.Methods("GET").PathPrefix("/dashboard/").Handler(http.StripPrefix("/dashboard/", http.FileServer(&assetfs.AssetFS{Asset: autogen.Asset, AssetInfo: autogen.AssetInfo, AssetDir: autogen.AssetDir, Prefix: "static"})))
|
||||||
|
|
||||||
// expvars
|
// expvars
|
||||||
if provider.server.globalConfiguration.Debug {
|
if provider.server.globalConfiguration.Debug {
|
||||||
|
|
Loading…
Reference in a new issue