[proxy] Added proxy.Config struct for initialization
This commit is contained in:
1 parent
c31358259f
commit
c0cf9e509c
2 files changed
+70
-80
No files matched your search
+20
-30
@@ -10,33 +10,30 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
version = "(unreleased version)"
|
||||
defaultTarget = "unix:///var/run/docker.sock"
|
||||
defaultListen = ":12375"
|
||||
version = "(unreleased version)"
|
||||
defaultDockerAddr = "unix:///var/run/docker.sock"
|
||||
defaultListenAddr = ":12375"
|
||||
)
|
||||
|
||||
func main() {
|
||||
var (
|
||||
debug bool
|
||||
justVersion bool
|
||||
listen string
|
||||
target string
|
||||
tlsConfig proxy.TLSConfig
|
||||
withDNS bool
|
||||
withIPAM bool
|
||||
c proxy.Config
|
||||
)
|
||||
|
||||
c.Version = version
|
||||
getopt.BoolVarLong(&debug, "debug", 'd', "log debugging information")
|
||||
getopt.BoolVarLong(&justVersion, "version", 0, "print version and exit")
|
||||
getopt.StringVar(&listen, 'L', fmt.Sprintf("address on which to listen (default %s)", defaultListen))
|
||||
getopt.StringVar(&target, 'H', fmt.Sprintf("docker daemon URL to proxy (default %s)", defaultTarget))
|
||||
getopt.StringVarLong(&tlsConfig.CACert, "tlscacert", 0, "Trust certs signed only by this CA")
|
||||
getopt.StringVarLong(&tlsConfig.Cert, "tlscert", 0, "Path to TLS certificate file")
|
||||
getopt.BoolVarLong(&tlsConfig.Enabled, "tls", 0, "Use TLS; implied by --tlsverify")
|
||||
getopt.StringVarLong(&tlsConfig.Key, "tlskey", 0, "Path to TLS key file")
|
||||
getopt.BoolVarLong(&tlsConfig.Verify, "tlsverify", 0, "Use TLS and verify the remote")
|
||||
getopt.BoolVarLong(&withDNS, "with-dns", 'w', "instruct created containers to use weaveDNS as their nameserver")
|
||||
getopt.BoolVarLong(&withIPAM, "with-ipam", 'i', "automatically allocate addresses for containers without a WEAVE_CIDR")
|
||||
getopt.StringVar(&c.ListenAddr, 'L', fmt.Sprintf("address on which to listen (default %s)", defaultListenAddr))
|
||||
getopt.StringVar(&c.DockerAddr, 'H', fmt.Sprintf("docker daemon URL to proxy (default %s)", defaultDockerAddr))
|
||||
getopt.StringVarLong(&c.TLSConfig.CACert, "tlscacert", 0, "Trust certs signed only by this CA")
|
||||
getopt.StringVarLong(&c.TLSConfig.Cert, "tlscert", 0, "Path to TLS certificate file")
|
||||
getopt.BoolVarLong(&c.TLSConfig.Enabled, "tls", 0, "Use TLS; implied by --tlsverify")
|
||||
getopt.StringVarLong(&c.TLSConfig.Key, "tlskey", 0, "Path to TLS key file")
|
||||
getopt.BoolVarLong(&c.TLSConfig.Verify, "tlsverify", 0, "Use TLS and verify the remote")
|
||||
getopt.BoolVarLong(&c.WithDNS, "with-dns", 'w', "instruct created containers to use weaveDNS as their nameserver")
|
||||
getopt.BoolVarLong(&c.WithIPAM, "with-ipam", 'i', "automatically allocate addresses for containers without a WEAVE_CIDR")
|
||||
getopt.Parse()
|
||||
|
||||
if justVersion {
|
||||
@@ -48,27 +45,20 @@ func main() {
|
||||
InitDefaultLogging(true)
|
||||
}
|
||||
|
||||
if target == "" {
|
||||
target = defaultTarget
|
||||
if c.DockerAddr == "" {
|
||||
c.DockerAddr = defaultDockerAddr
|
||||
}
|
||||
|
||||
if listen == "" {
|
||||
listen = defaultListen
|
||||
if c.ListenAddr == "" {
|
||||
c.ListenAddr = defaultListenAddr
|
||||
}
|
||||
|
||||
p, err := proxy.NewProxy(
|
||||
version,
|
||||
target,
|
||||
listen,
|
||||
withDNS,
|
||||
withIPAM,
|
||||
&tlsConfig,
|
||||
)
|
||||
p, err := proxy.NewProxy(c)
|
||||
if err != nil {
|
||||
Error.Fatalf("Could not start proxy: %s", err)
|
||||
}
|
||||
|
||||
if err := p.ListenAndServe(); err != nil {
|
||||
Error.Fatalf("Could not listen on %s: %s", listen, err)
|
||||
Error.Fatalf("Could not listen on %s: %s", p.ListenAddr, err)
|
||||
}
|
||||
}
|
||||
+50
-50
@@ -27,36 +27,24 @@ var (
|
||||
)
|
||||
|
||||
type Proxy struct {
|
||||
Dial func() (net.Conn, error)
|
||||
version string
|
||||
Config
|
||||
|
||||
dial func() (net.Conn, error)
|
||||
client *docker.Client
|
||||
dockerAddr string
|
||||
dockerBridgeIP string
|
||||
listenAddr string
|
||||
tlsConfig *TLSConfig
|
||||
withDNS bool
|
||||
withIPAM bool
|
||||
}
|
||||
|
||||
func NewProxy(version, dockerAddr, listenAddr string, withDNS, withIPAM bool, tlsConfig *TLSConfig) (*Proxy, error) {
|
||||
u, err := url.Parse(dockerAddr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
type Config struct {
|
||||
DockerAddr string
|
||||
ListenAddr string
|
||||
TLSConfig TLSConfig
|
||||
Version string
|
||||
WithDNS bool
|
||||
WithIPAM bool
|
||||
}
|
||||
|
||||
var dockerBridgeIP []byte
|
||||
if withDNS {
|
||||
dockerBridgeIP, err = callWeave("docker-bridge-ip")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if err := tlsConfig.loadCerts(); err != nil {
|
||||
Error.Fatalf("Could not configure tls for proxy: %s", err)
|
||||
}
|
||||
|
||||
client, err := docker.NewClient(dockerAddr)
|
||||
func NewProxy(c Config) (*Proxy, error) {
|
||||
u, err := url.Parse(c.DockerAddr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -69,19 +57,31 @@ func NewProxy(version, dockerAddr, listenAddr string, withDNS, withIPAM bool, tl
|
||||
targetAddr = u.Path
|
||||
}
|
||||
|
||||
return &Proxy{
|
||||
Dial: func() (net.Conn, error) {
|
||||
p := &Proxy{
|
||||
Config: c,
|
||||
dial: func() (net.Conn, error) {
|
||||
return net.Dial(u.Scheme, targetAddr)
|
||||
},
|
||||
version: version,
|
||||
client: client,
|
||||
dockerAddr: dockerAddr,
|
||||
listenAddr: listenAddr,
|
||||
dockerBridgeIP: string(dockerBridgeIP),
|
||||
tlsConfig: tlsConfig,
|
||||
withDNS: withDNS,
|
||||
withIPAM: withIPAM,
|
||||
}, nil
|
||||
}
|
||||
|
||||
if p.WithDNS {
|
||||
dockerBridgeIP, err := callWeave("docker-bridge-ip")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
p.dockerBridgeIP = string(dockerBridgeIP)
|
||||
}
|
||||
|
||||
if err := p.TLSConfig.loadCerts(); err != nil {
|
||||
Error.Fatalf("Could not configure tls for proxy: %s", err)
|
||||
}
|
||||
|
||||
p.client, err = docker.NewClient(p.DockerAddr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return p, nil
|
||||
}
|
||||
|
||||
func (proxy *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
@@ -89,13 +89,13 @@ func (proxy *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
path := r.URL.Path
|
||||
switch {
|
||||
case containerCreateRegexp.MatchString(path):
|
||||
proxy.serveWithInterceptor(&createContainerInterceptor{proxy.client, proxy.withDNS, proxy.dockerBridgeIP, proxy.withIPAM}, w, r)
|
||||
proxy.serveWithInterceptor(&createContainerInterceptor{proxy.client, proxy.WithDNS, proxy.dockerBridgeIP, proxy.WithIPAM}, w, r)
|
||||
case containerStartRegexp.MatchString(path):
|
||||
proxy.serveWithInterceptor(&startContainerInterceptor{proxy.client, proxy.withDNS, proxy.withIPAM}, w, r)
|
||||
proxy.serveWithInterceptor(&startContainerInterceptor{proxy.client, proxy.WithDNS, proxy.WithIPAM}, w, r)
|
||||
case execCreateRegexp.MatchString(path):
|
||||
proxy.serveWithInterceptor(&createExecInterceptor{proxy.client, proxy.withIPAM}, w, r)
|
||||
proxy.serveWithInterceptor(&createExecInterceptor{proxy.client, proxy.WithIPAM}, w, r)
|
||||
case strings.HasPrefix(path, "/status"):
|
||||
fmt.Fprintln(w, "weave proxy", proxy.version)
|
||||
fmt.Fprintln(w, "weave proxy", proxy.Version)
|
||||
fmt.Fprintln(w, proxy.Status())
|
||||
default:
|
||||
proxy.serveWithInterceptor(&nullInterceptor{}, w, r)
|
||||
@@ -103,20 +103,20 @@ func (proxy *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
func (proxy *Proxy) serveWithInterceptor(i interceptor, w http.ResponseWriter, r *http.Request) {
|
||||
newClient(proxy.Dial, i).ServeHTTP(w, r)
|
||||
newClient(proxy.dial, i).ServeHTTP(w, r)
|
||||
}
|
||||
|
||||
// Return status string
|
||||
func (proxy *Proxy) Status() string {
|
||||
var buf bytes.Buffer
|
||||
fmt.Fprintln(&buf, "Listen address is", proxy.listenAddr)
|
||||
fmt.Fprintln(&buf, "Docker address is", proxy.dockerAddr)
|
||||
if proxy.withDNS {
|
||||
fmt.Fprintln(&buf, "Listen address is", proxy.ListenAddr)
|
||||
fmt.Fprintln(&buf, "Docker address is", proxy.DockerAddr)
|
||||
if proxy.WithDNS {
|
||||
fmt.Fprintln(&buf, "DNS on")
|
||||
} else {
|
||||
fmt.Fprintln(&buf, "DNS off")
|
||||
}
|
||||
if proxy.withIPAM {
|
||||
if proxy.WithIPAM {
|
||||
fmt.Fprintln(&buf, "IPAM on")
|
||||
} else {
|
||||
fmt.Fprintln(&buf, "IPAM off")
|
||||
@@ -125,18 +125,18 @@ func (proxy *Proxy) Status() string {
|
||||
}
|
||||
|
||||
func (proxy *Proxy) ListenAndServe() error {
|
||||
listener, err := net.Listen("tcp", proxy.listenAddr)
|
||||
listener, err := net.Listen("tcp", proxy.ListenAddr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if proxy.tlsConfig.enabled() {
|
||||
listener = tls.NewListener(listener, proxy.tlsConfig.Config)
|
||||
if proxy.TLSConfig.enabled() {
|
||||
listener = tls.NewListener(listener, proxy.TLSConfig.Config)
|
||||
Info.Println("TLS Enabled")
|
||||
}
|
||||
|
||||
Info.Printf("Listening on %s", proxy.listenAddr)
|
||||
Info.Printf("Proxying %s", proxy.dockerAddr)
|
||||
Info.Printf("Listening on %s", proxy.ListenAddr)
|
||||
Info.Printf("Proxying %s", proxy.DockerAddr)
|
||||
|
||||
return (&http.Server{Handler: proxy}).Serve(listener)
|
||||
}
|
||||
Reference in new issue
Block a user