diff --git a/prog/weaveproxy/main.go b/prog/weaveproxy/main.go index eaa669b8..6b86128f 100644 --- a/prog/weaveproxy/main.go +++ b/prog/weaveproxy/main.go @@ -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) } } diff --git a/proxy/proxy.go b/proxy/proxy.go index 42c4be69..f48f8305 100644 --- a/proxy/proxy.go +++ b/proxy/proxy.go @@ -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) }