From 8e13eaa5223b04fbed6cc43d78abc0fd0a68d13d Mon Sep 17 00:00:00 2001 From: Diptanu Choudhury Date: Wed, 9 Mar 2016 23:25:31 -0800 Subject: [PATCH] Using unix domain sockets for docker syslog collector --- client/driver/docker.go | 2 +- client/driver/logging/universal_collector.go | 34 +++++++++++++++++++- command/agent/agent.go | 9 ++++-- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/client/driver/docker.go b/client/driver/docker.go index ac1c842b6275..e9defae3eb57 100644 --- a/client/driver/docker.go +++ b/client/driver/docker.go @@ -238,7 +238,7 @@ func (d *DockerDriver) createContainer(ctx *ExecContext, task *structs.Task, LogConfig: docker.LogConfig{ Type: "syslog", Config: map[string]string{ - "syslog-address": fmt.Sprintf("tcp://%v", syslogAddr), + "syslog-address": syslogAddr, }, }, } diff --git a/client/driver/logging/universal_collector.go b/client/driver/logging/universal_collector.go index 8b55b18dd036..1006968165bc 100644 --- a/client/driver/logging/universal_collector.go +++ b/client/driver/logging/universal_collector.go @@ -5,9 +5,12 @@ package logging import ( "fmt" "io" + "io/ioutil" "log" "log/syslog" "net" + "os" + "runtime" "github.com/hashicorp/nomad/client/allocdir" cstructs "github.com/hashicorp/nomad/client/driver/structs" @@ -105,7 +108,8 @@ func (s *SyslogCollector) LaunchCollector(ctx *LogCollectorContext) (*SyslogColl s.lre = lre go s.collectLogs(lre, lro) - return &SyslogCollectorState{Addr: l.Addr().String()}, nil + syslogAddr := fmt.Sprintf("%s://%s", l.Addr().Network(), l.Addr().String()) + return &SyslogCollectorState{Addr: syslogAddr}, nil } func (s *SyslogCollector) collectLogs(we io.Writer, wo io.Writer) { @@ -160,6 +164,16 @@ func (s *SyslogCollector) configureTaskDir() error { // getFreePort returns a free port ready to be listened on between upper and // lower bounds func (s *SyslogCollector) getListener(lowerBound uint, upperBound uint) (net.Listener, error) { + if runtime.GOOS == "windows" { + return s.listenerTCP(lowerBound, upperBound) + } + + return s.listenerUnix() +} + +// listenerTCP creates a TCP listener using an unused port between an upper and +// lower bound +func (s *SyslogCollector) listenerTCP(lowerBound uint, upperBound uint) (net.Listener, error) { for i := lowerBound; i <= upperBound; i++ { addr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("localhost:%v", i)) if err != nil { @@ -173,3 +187,21 @@ func (s *SyslogCollector) getListener(lowerBound uint, upperBound uint) (net.Lis } return nil, fmt.Errorf("No free port found") } + +// listenerUnix creates a Unix domain socket +func (s *SyslogCollector) listenerUnix() (net.Listener, error) { + f, err := ioutil.TempFile("", "plugin") + if err != nil { + return nil, err + } + path := f.Name() + + if err := f.Close(); err != nil { + return nil, err + } + if err := os.Remove(path); err != nil { + return nil, err + } + + return net.Listen("unix", path) +} diff --git a/command/agent/agent.go b/command/agent/agent.go index f1f9ab07df32..03e8621dd353 100644 --- a/command/agent/agent.go +++ b/command/agent/agent.go @@ -7,6 +7,7 @@ import ( "net" "os" "path/filepath" + "runtime" "sync" "time" @@ -260,9 +261,11 @@ func (a *Agent) setupClient() error { return fmt.Errorf("client setup failed: %v", err) } - // Reserve some ports for the plugins - if err := a.reservePortsForClient(conf); err != nil { - return err + // Reserve some ports for the plugins if we are on Windows + if runtime.GOOS == "windows" { + if err := a.reservePortsForClient(conf); err != nil { + return err + } } // Create the client