Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 83e8bd8b8f | |||
| fc9c9b184e | |||
| 6f11e92801 |
@@ -7,6 +7,7 @@ package transportmux
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"os"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
@@ -15,6 +16,7 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/kr/pretty"
|
||||||
"github.com/zrepl/zrepl/daemon/logging"
|
"github.com/zrepl/zrepl/daemon/logging"
|
||||||
"github.com/zrepl/zrepl/logger"
|
"github.com/zrepl/zrepl/logger"
|
||||||
"github.com/zrepl/zrepl/transport"
|
"github.com/zrepl/zrepl/transport"
|
||||||
@@ -151,6 +153,7 @@ func Demux(ctx context.Context, rawListener transport.AuthenticatedListener, lab
|
|||||||
|
|
||||||
rawConn, err := rawListener.Accept(ctx)
|
rawConn, err := rawListener.Accept(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "transportmux.Demux: rawListener.Accept() returned error: %T %s\n%s\n", err, err, pretty.Sprint(err))
|
||||||
if ctx.Err() != nil {
|
if ctx.Err() != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,9 +10,12 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
|
||||||
|
"github.com/kr/pretty"
|
||||||
)
|
)
|
||||||
|
|
||||||
type HandshakeMessage struct {
|
type HandshakeMessage struct {
|
||||||
@@ -93,6 +96,7 @@ func (m *HandshakeMessage) Encode() ([]byte, error) {
|
|||||||
func (m *HandshakeMessage) DecodeReader(r io.Reader, maxLen int) error {
|
func (m *HandshakeMessage) DecodeReader(r io.Reader, maxLen int) error {
|
||||||
var lenAndSpace [11]byte
|
var lenAndSpace [11]byte
|
||||||
if _, err := io.ReadFull(r, lenAndSpace[:]); err != nil {
|
if _, err := io.ReadFull(r, lenAndSpace[:]); err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "HandshakeMessage.DecodeReader error: %T\n%s", err, pretty.Sprint(err))
|
||||||
return hsIOErr(err, "error reading protocol banner length: %s", err)
|
return hsIOErr(err, "error reading protocol banner length: %s", err)
|
||||||
}
|
}
|
||||||
if !utf8.Valid(lenAndSpace[:]) {
|
if !utf8.Valid(lenAndSpace[:]) {
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ package versionhandshake
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/zrepl/zrepl/transport"
|
"github.com/zrepl/zrepl/transport"
|
||||||
@@ -23,6 +25,7 @@ func (c HandshakeConnecter) Connect(ctx context.Context) (transport.Wire, error)
|
|||||||
dl = time.Now().Add(c.timeout)
|
dl = time.Now().Add(c.timeout)
|
||||||
}
|
}
|
||||||
if err := DoHandshakeCurrentVersion(conn, dl); err != nil {
|
if err := DoHandshakeCurrentVersion(conn, dl); err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "HandshakeConnecter error: %T\n\t%s\n\t%v\n\t%#v\n\n", err, err, err, err)
|
||||||
conn.Close()
|
conn.Close()
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ package tls
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
@@ -48,6 +50,7 @@ func TLSConnecterFromConfig(in *config.TLSConnect) (*TLSConnecter, error) {
|
|||||||
func (c *TLSConnecter) Connect(dialCtx context.Context) (transport.Wire, error) {
|
func (c *TLSConnecter) Connect(dialCtx context.Context) (transport.Wire, error) {
|
||||||
conn, err := c.dialer.DialContext(dialCtx, "tcp", c.Address)
|
conn, err := c.dialer.DialContext(dialCtx, "tcp", c.Address)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "tls connecter error %T\n\t%s\n\t%v\n\t%#v\n\n", err, err, err, err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
tcpConn := conn.(*net.TCPConn)
|
tcpConn := conn.(*net.TCPConn)
|
||||||
|
|||||||
@@ -0,0 +1,140 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"flag"
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/zrepl/zrepl/config"
|
||||||
|
"github.com/zrepl/zrepl/transport/tls"
|
||||||
|
)
|
||||||
|
|
||||||
|
var servConf = config.TLSServe{
|
||||||
|
ServeCommon: config.ServeCommon{
|
||||||
|
Type: "tls",
|
||||||
|
},
|
||||||
|
HandshakeTimeout: 10 * time.Second,
|
||||||
|
}
|
||||||
|
|
||||||
|
var clientConf = config.TLSConnect{
|
||||||
|
ConnectCommon: config.ConnectCommon{
|
||||||
|
Type: "",
|
||||||
|
},
|
||||||
|
Address: "",
|
||||||
|
Ca: "",
|
||||||
|
Cert: "",
|
||||||
|
Key: "",
|
||||||
|
ServerCN: "",
|
||||||
|
DialTimeout: 10 * time.Second,
|
||||||
|
}
|
||||||
|
|
||||||
|
var ca string
|
||||||
|
var mode string
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
flag.StringVar(&mode, "mode", "", "server|client")
|
||||||
|
|
||||||
|
flag.StringVar(&ca, "ca", "", "path")
|
||||||
|
|
||||||
|
flag.StringVar(&servConf.Listen, "serve.listen", "", "")
|
||||||
|
flag.StringVar(&servConf.Cert, "serve.cert", "", "path")
|
||||||
|
flag.StringVar(&servConf.Key, "serve.key", "", "path")
|
||||||
|
var clientCN string
|
||||||
|
flag.StringVar(&clientCN, "serve.client_cn", "", "")
|
||||||
|
|
||||||
|
flag.StringVar(&clientConf.Address, "client.address", "", "")
|
||||||
|
flag.StringVar(&clientConf.Cert, "client.cert", "", "path")
|
||||||
|
flag.StringVar(&clientConf.Key, "client.key", "", "path")
|
||||||
|
flag.StringVar(&clientConf.ServerCN, "client.server_cn", "", "")
|
||||||
|
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
servConf.ClientCNs = append(servConf.ClientCNs, clientCN)
|
||||||
|
|
||||||
|
servConf.Ca = ca
|
||||||
|
clientConf.Ca = ca
|
||||||
|
|
||||||
|
switch mode {
|
||||||
|
case "server":
|
||||||
|
server()
|
||||||
|
case "client":
|
||||||
|
client()
|
||||||
|
default:
|
||||||
|
panic(mode)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func server() {
|
||||||
|
|
||||||
|
servFactory, err := tls.TLSListenerFactoryFromConfig(nil, &servConf)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
listener, err := servFactory()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
for {
|
||||||
|
conn, err := listener.Accept(ctx)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("accept error: %s", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
go func() {
|
||||||
|
defer conn.Close()
|
||||||
|
|
||||||
|
log.Printf("handling connection %s", conn.RemoteAddr())
|
||||||
|
_, err = io.Copy(conn, strings.NewReader("here is the server\n"))
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("%s: respond to client error: %s", conn.RemoteAddr(), err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = conn.CloseWrite()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("%s: failed to close write connection: err", conn.RemoteAddr(), err)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("%s: waiting for client to close connection", conn.RemoteAddr())
|
||||||
|
|
||||||
|
_, err = io.Copy(io.Discard, conn)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("%s: error draining client connection: %s", conn.RemoteAddr(), err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("%s: done", conn.RemoteAddr())
|
||||||
|
return
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func client() {
|
||||||
|
connecter, err := tls.TLSConnecterFromConfig(&clientConf)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
conn, err := connecter.Connect(ctx)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer conn.Close()
|
||||||
|
|
||||||
|
_, err = io.Copy(os.Stdout, conn)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,8 +4,10 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/kr/pretty"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/zrepl/zrepl/config"
|
"github.com/zrepl/zrepl/config"
|
||||||
@@ -68,6 +70,7 @@ type tlsAuthListener struct {
|
|||||||
func (l tlsAuthListener) Accept(ctx context.Context) (*transport.AuthConn, error) {
|
func (l tlsAuthListener) Accept(ctx context.Context) (*transport.AuthConn, error) {
|
||||||
tcpConn, tlsConn, cn, err := l.ClientAuthListener.Accept()
|
tcpConn, tlsConn, cn, err := l.ClientAuthListener.Accept()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "tlsAuthListener.Accept: l.ClientAuthListener.Accept returned error %T %s\n%s\n", err, err, pretty.Sprint(err))
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if _, ok := l.clientCNs[cn]; !ok {
|
if _, ok := l.clientCNs[cn]; !ok {
|
||||||
|
|||||||
Reference in New Issue
Block a user