From ecfffc6feb5ac4aaa53486f12957f02168ff8ec5 Mon Sep 17 00:00:00 2001 From: "guillaume.tardif" Date: Sat, 16 May 2020 16:39:08 +0200 Subject: [PATCH] Allow server to start on tcp port or if windows, named pipe rather than unix socket. could not yet make it work on named pipe from js client (connects but error) --- cli/cmd/serve.go | 7 ++++--- go.mod | 2 +- server/server.go | 11 +++++++++++ server/socket_unix.go | 16 ++++++++++++++++ server/socket_windows.go | 22 ++++++++++++++++++++++ tests/framework/exec.go | 2 +- 6 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 server/socket_unix.go create mode 100644 server/socket_windows.go diff --git a/cli/cmd/serve.go b/cli/cmd/serve.go index 59fc8441..6ea6c079 100644 --- a/cli/cmd/serve.go +++ b/cli/cmd/serve.go @@ -2,7 +2,6 @@ package cmd import ( "context" - "net" "github.com/pkg/errors" "github.com/sirupsen/logrus" @@ -39,10 +38,12 @@ func ServeCommand() *cobra.Command { func runServe(ctx context.Context, opts serveOpts) error { s := server.New() - listener, err := net.Listen("unix", opts.address) + listener, err := server.CreateListener(opts.address) + if err != nil { - return errors.Wrap(err, "listen unix socket") + return errors.Wrap(err, "listen address "+opts.address) } + // nolint errcheck defer listener.Close() diff --git a/go.mod b/go.mod index dc141cb3..3dc29467 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/Azure/go-autorest/autorest/date v0.2.0 github.com/Azure/go-autorest/autorest/to v0.3.0 github.com/Azure/go-autorest/autorest/validation v0.2.0 // indirect - github.com/Microsoft/go-winio v0.4.14 // indirect + github.com/Microsoft/go-winio v0.4.14 github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129 github.com/compose-spec/compose-go v0.0.0-20200423124427-63dcf8c22cae github.com/containerd/console v1.0.0 diff --git a/server/server.go b/server/server.go index c24bfc87..b24e2c20 100644 --- a/server/server.go +++ b/server/server.go @@ -30,6 +30,8 @@ package server import ( "context" "errors" + "net" + "strings" grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" "google.golang.org/grpc" @@ -57,6 +59,15 @@ func New() *grpc.Server { return s } + +//CreateListener creates a listener either on tcp://, or local listener, supporting unix:// for unix socket or npipe:// for named pipes on windows +func CreateListener(address string) (net.Listener, error) { + if strings.HasPrefix(address, "tcp://") { + return net.Listen("tcp", strings.TrimPrefix(address, "tcp://")) + } + return createLocalListener(address) +} + func unary(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { return grpc_prometheus.UnaryServerInterceptor(ctx, req, info, handler) } diff --git a/server/socket_unix.go b/server/socket_unix.go new file mode 100644 index 00000000..49b095c5 --- /dev/null +++ b/server/socket_unix.go @@ -0,0 +1,16 @@ +// +build !windows + +package server + +import ( + "errors" + "net" + "strings" +) + +func createLocalListener(address string) (net.Listener, error) { + if !strings.HasPrefix(address, "unix://") { + return nil, errors.New("Cannot parse address, must start with unix:// or tcp:// : " + address) + } + return net.Listen("unix", strings.TrimPrefix(address, "unix://")) +} diff --git a/server/socket_windows.go b/server/socket_windows.go new file mode 100644 index 00000000..fbcba0d1 --- /dev/null +++ b/server/socket_windows.go @@ -0,0 +1,22 @@ +// +build windows + +package server + +import ( + "errors" + "net" + "strings" + + "github.com/Microsoft/go-winio" +) + +func createLocalListener(address string) (net.Listener, error) { + if !strings.HasPrefix(address, "npipe://") { + return nil, errors.New("Cannot parse address, must start with npipe:// or tcp:// : " + address) + } + return winio.ListenPipe(strings.TrimPrefix(address, "npipe://"), &winio.PipeConfig{ + MessageMode: true, // Use message mode so that CloseWrite() is supported + InputBufferSize: 65536, // Use 64KB buffers to improve performance + OutputBufferSize: 65536, + }) +} diff --git a/tests/framework/exec.go b/tests/framework/exec.go index 36866e44..d84a8312 100644 --- a/tests/framework/exec.go +++ b/tests/framework/exec.go @@ -46,7 +46,7 @@ func NewCommand(command string, args ...string) *CmdContext { func dockerExecutable() string { if runtime.GOOS == "windows" { - return "./bin/windows/docker.exe" + return "./bin/docker.exe" } return "./bin/docker" }