[mqtt] Implements mqtt publish tooling
This commit is contained in:
		
							
								
								
									
										0
									
								
								vendor/github.com/docker/go-connections/sockets/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								vendor/github.com/docker/go-connections/sockets/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
									
										81
									
								
								vendor/github.com/docker/go-connections/sockets/inmem_socket.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								vendor/github.com/docker/go-connections/sockets/inmem_socket.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,81 @@
 | 
			
		||||
package sockets
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"net"
 | 
			
		||||
	"sync"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var errClosed = errors.New("use of closed network connection")
 | 
			
		||||
 | 
			
		||||
// InmemSocket implements net.Listener using in-memory only connections.
 | 
			
		||||
type InmemSocket struct {
 | 
			
		||||
	chConn  chan net.Conn
 | 
			
		||||
	chClose chan struct{}
 | 
			
		||||
	addr    string
 | 
			
		||||
	mu      sync.Mutex
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// dummyAddr is used to satisfy net.Addr for the in-mem socket
 | 
			
		||||
// it is just stored as a string and returns the string for all calls
 | 
			
		||||
type dummyAddr string
 | 
			
		||||
 | 
			
		||||
// NewInmemSocket creates an in-memory only net.Listener
 | 
			
		||||
// The addr argument can be any string, but is used to satisfy the `Addr()` part
 | 
			
		||||
// of the net.Listener interface
 | 
			
		||||
func NewInmemSocket(addr string, bufSize int) *InmemSocket {
 | 
			
		||||
	return &InmemSocket{
 | 
			
		||||
		chConn:  make(chan net.Conn, bufSize),
 | 
			
		||||
		chClose: make(chan struct{}),
 | 
			
		||||
		addr:    addr,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Addr returns the socket's addr string to satisfy net.Listener
 | 
			
		||||
func (s *InmemSocket) Addr() net.Addr {
 | 
			
		||||
	return dummyAddr(s.addr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Accept implements the Accept method in the Listener interface; it waits for the next call and returns a generic Conn.
 | 
			
		||||
func (s *InmemSocket) Accept() (net.Conn, error) {
 | 
			
		||||
	select {
 | 
			
		||||
	case conn := <-s.chConn:
 | 
			
		||||
		return conn, nil
 | 
			
		||||
	case <-s.chClose:
 | 
			
		||||
		return nil, errClosed
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Close closes the listener. It will be unavailable for use once closed.
 | 
			
		||||
func (s *InmemSocket) Close() error {
 | 
			
		||||
	s.mu.Lock()
 | 
			
		||||
	defer s.mu.Unlock()
 | 
			
		||||
	select {
 | 
			
		||||
	case <-s.chClose:
 | 
			
		||||
	default:
 | 
			
		||||
		close(s.chClose)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Dial is used to establish a connection with the in-mem server
 | 
			
		||||
func (s *InmemSocket) Dial(network, addr string) (net.Conn, error) {
 | 
			
		||||
	srvConn, clientConn := net.Pipe()
 | 
			
		||||
	select {
 | 
			
		||||
	case s.chConn <- srvConn:
 | 
			
		||||
	case <-s.chClose:
 | 
			
		||||
		return nil, errClosed
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return clientConn, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Network returns the addr string, satisfies net.Addr
 | 
			
		||||
func (a dummyAddr) Network() string {
 | 
			
		||||
	return string(a)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// String returns the string form
 | 
			
		||||
func (a dummyAddr) String() string {
 | 
			
		||||
	return string(a)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										51
									
								
								vendor/github.com/docker/go-connections/sockets/proxy.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								vendor/github.com/docker/go-connections/sockets/proxy.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
package sockets
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net"
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/net/proxy"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// GetProxyEnv allows access to the uppercase and the lowercase forms of
 | 
			
		||||
// proxy-related variables.  See the Go specification for details on these
 | 
			
		||||
// variables. https://golang.org/pkg/net/http/
 | 
			
		||||
func GetProxyEnv(key string) string {
 | 
			
		||||
	proxyValue := os.Getenv(strings.ToUpper(key))
 | 
			
		||||
	if proxyValue == "" {
 | 
			
		||||
		return os.Getenv(strings.ToLower(key))
 | 
			
		||||
	}
 | 
			
		||||
	return proxyValue
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DialerFromEnvironment takes in a "direct" *net.Dialer and returns a
 | 
			
		||||
// proxy.Dialer which will route the connections through the proxy using the
 | 
			
		||||
// given dialer.
 | 
			
		||||
func DialerFromEnvironment(direct *net.Dialer) (proxy.Dialer, error) {
 | 
			
		||||
	allProxy := GetProxyEnv("all_proxy")
 | 
			
		||||
	if len(allProxy) == 0 {
 | 
			
		||||
		return direct, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	proxyURL, err := url.Parse(allProxy)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return direct, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	proxyFromURL, err := proxy.FromURL(proxyURL, direct)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return direct, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	noProxy := GetProxyEnv("no_proxy")
 | 
			
		||||
	if len(noProxy) == 0 {
 | 
			
		||||
		return proxyFromURL, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	perHost := proxy.NewPerHost(proxyFromURL, direct)
 | 
			
		||||
	perHost.AddFromString(noProxy)
 | 
			
		||||
 | 
			
		||||
	return perHost, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										38
									
								
								vendor/github.com/docker/go-connections/sockets/sockets.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								vendor/github.com/docker/go-connections/sockets/sockets.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
// Package sockets provides helper functions to create and configure Unix or TCP sockets.
 | 
			
		||||
package sockets
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"net"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Why 32? See https://github.com/docker/docker/pull/8035.
 | 
			
		||||
const defaultTimeout = 32 * time.Second
 | 
			
		||||
 | 
			
		||||
// ErrProtocolNotAvailable is returned when a given transport protocol is not provided by the operating system.
 | 
			
		||||
var ErrProtocolNotAvailable = errors.New("protocol not available")
 | 
			
		||||
 | 
			
		||||
// ConfigureTransport configures the specified Transport according to the
 | 
			
		||||
// specified proto and addr.
 | 
			
		||||
// If the proto is unix (using a unix socket to communicate) or npipe the
 | 
			
		||||
// compression is disabled.
 | 
			
		||||
func ConfigureTransport(tr *http.Transport, proto, addr string) error {
 | 
			
		||||
	switch proto {
 | 
			
		||||
	case "unix":
 | 
			
		||||
		return configureUnixTransport(tr, proto, addr)
 | 
			
		||||
	case "npipe":
 | 
			
		||||
		return configureNpipeTransport(tr, proto, addr)
 | 
			
		||||
	default:
 | 
			
		||||
		tr.Proxy = http.ProxyFromEnvironment
 | 
			
		||||
		dialer, err := DialerFromEnvironment(&net.Dialer{
 | 
			
		||||
			Timeout: defaultTimeout,
 | 
			
		||||
		})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		tr.Dial = dialer.Dial
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										35
									
								
								vendor/github.com/docker/go-connections/sockets/sockets_unix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								vendor/github.com/docker/go-connections/sockets/sockets_unix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,35 @@
 | 
			
		||||
// +build !windows
 | 
			
		||||
 | 
			
		||||
package sockets
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const maxUnixSocketPathSize = len(syscall.RawSockaddrUnix{}.Path)
 | 
			
		||||
 | 
			
		||||
func configureUnixTransport(tr *http.Transport, proto, addr string) error {
 | 
			
		||||
	if len(addr) > maxUnixSocketPathSize {
 | 
			
		||||
		return fmt.Errorf("Unix socket path %q is too long", addr)
 | 
			
		||||
	}
 | 
			
		||||
	// No need for compression in local communications.
 | 
			
		||||
	tr.DisableCompression = true
 | 
			
		||||
	tr.Dial = func(_, _ string) (net.Conn, error) {
 | 
			
		||||
		return net.DialTimeout(proto, addr, defaultTimeout)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func configureNpipeTransport(tr *http.Transport, proto, addr string) error {
 | 
			
		||||
	return ErrProtocolNotAvailable
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DialPipe connects to a Windows named pipe.
 | 
			
		||||
// This is not supported on other OSes.
 | 
			
		||||
func DialPipe(_ string, _ time.Duration) (net.Conn, error) {
 | 
			
		||||
	return nil, syscall.EAFNOSUPPORT
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										27
									
								
								vendor/github.com/docker/go-connections/sockets/sockets_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/docker/go-connections/sockets/sockets_windows.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
package sockets
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/Microsoft/go-winio"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func configureUnixTransport(tr *http.Transport, proto, addr string) error {
 | 
			
		||||
	return ErrProtocolNotAvailable
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func configureNpipeTransport(tr *http.Transport, proto, addr string) error {
 | 
			
		||||
	// No need for compression in local communications.
 | 
			
		||||
	tr.DisableCompression = true
 | 
			
		||||
	tr.Dial = func(_, _ string) (net.Conn, error) {
 | 
			
		||||
		return DialPipe(addr, defaultTimeout)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DialPipe connects to a Windows named pipe.
 | 
			
		||||
func DialPipe(addr string, timeout time.Duration) (net.Conn, error) {
 | 
			
		||||
	return winio.DialPipe(addr, &timeout)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								vendor/github.com/docker/go-connections/sockets/tcp_socket.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/docker/go-connections/sockets/tcp_socket.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
// Package sockets provides helper functions to create and configure Unix or TCP sockets.
 | 
			
		||||
package sockets
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto/tls"
 | 
			
		||||
	"net"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NewTCPSocket creates a TCP socket listener with the specified address and
 | 
			
		||||
// the specified tls configuration. If TLSConfig is set, will encapsulate the
 | 
			
		||||
// TCP listener inside a TLS one.
 | 
			
		||||
func NewTCPSocket(addr string, tlsConfig *tls.Config) (net.Listener, error) {
 | 
			
		||||
	l, err := net.Listen("tcp", addr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if tlsConfig != nil {
 | 
			
		||||
		tlsConfig.NextProtos = []string{"http/1.1"}
 | 
			
		||||
		l = tls.NewListener(l, tlsConfig)
 | 
			
		||||
	}
 | 
			
		||||
	return l, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										32
									
								
								vendor/github.com/docker/go-connections/sockets/unix_socket.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								vendor/github.com/docker/go-connections/sockets/unix_socket.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
// +build !windows
 | 
			
		||||
 | 
			
		||||
package sockets
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"net"
 | 
			
		||||
	"os"
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NewUnixSocket creates a unix socket with the specified path and group.
 | 
			
		||||
func NewUnixSocket(path string, gid int) (net.Listener, error) {
 | 
			
		||||
	if err := syscall.Unlink(path); err != nil && !os.IsNotExist(err) {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	mask := syscall.Umask(0777)
 | 
			
		||||
	defer syscall.Umask(mask)
 | 
			
		||||
 | 
			
		||||
	l, err := net.Listen("unix", path)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if err := os.Chown(path, 0, gid); err != nil {
 | 
			
		||||
		l.Close()
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if err := os.Chmod(path, 0660); err != nil {
 | 
			
		||||
		l.Close()
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return l, nil
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user