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)

This commit is contained in:
guillaume.tardif 2020-05-16 16:39:08 +02:00 committed by Guillaume Tardif
parent 23d2eacf84
commit ecfffc6feb
6 changed files with 55 additions and 5 deletions

View File

@ -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()

2
go.mod
View File

@ -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

View File

@ -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)
}

16
server/socket_unix.go Normal file
View File

@ -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://"))
}

22
server/socket_windows.go Normal file
View File

@ -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,
})
}

View File

@ -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"
}