cmd/connect-test: add connect-test tool
This tool attempts to make TCP+TLS+DRPC and QUIC+DRPC connections to a specified IP:port. If successful with either, it shows the node ID of the opposite end of the connection. This should be useful for SNOs who want to check that their packet forwarding is working or that their node is listening for both connection types. Change-Id: I935dff037dd7f1106941a35567f6445230259d1a
This commit is contained in:
parent
a0c5da6643
commit
dcb73e46ca
85
cmd/connect-test/connecttest.go
Normal file
85
cmd/connect-test/connecttest.go
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
// Copyright (C) 2021 Storj, Inc.
|
||||||
|
// See LICENSE for copying information.
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"crypto/tls"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"golang.org/x/sync/errgroup"
|
||||||
|
|
||||||
|
"storj.io/common/identity"
|
||||||
|
"storj.io/common/peertls/tlsopts"
|
||||||
|
"storj.io/common/rpc"
|
||||||
|
"storj.io/common/storj"
|
||||||
|
"storj.io/storj/pkg/quic"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
destAddr := os.Args[1]
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
ident, err := identity.NewFullIdentity(ctx, identity.NewCAOptions{
|
||||||
|
Difficulty: 0,
|
||||||
|
Concurrency: 1,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("could not generate an identity: %v", err)
|
||||||
|
}
|
||||||
|
tlsOptions, err := tlsopts.NewOptions(ident, tlsopts.Config{}, nil)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("could not get tls options: %v", err)
|
||||||
|
}
|
||||||
|
unverifiedClientConfig := tlsOptions.UnverifiedClientTLSConfig()
|
||||||
|
|
||||||
|
var (
|
||||||
|
group errgroup.Group
|
||||||
|
quicNodeID storj.NodeID
|
||||||
|
quicErr error
|
||||||
|
tcpNodeID storj.NodeID
|
||||||
|
tcpErr error
|
||||||
|
)
|
||||||
|
group.Go(func() error {
|
||||||
|
quicNodeID, quicErr = tryConnect(ctx, unverifiedClientConfig, quic.NewDefaultConnector(nil), destAddr)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
group.Go(func() error {
|
||||||
|
tcpNodeID, tcpErr = tryConnect(ctx, unverifiedClientConfig, rpc.NewDefaultTCPConnector(nil), destAddr)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
err = group.Wait()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("failed to perform checks: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if quicErr != nil {
|
||||||
|
fmt.Printf("QUIC\tfail\t%v\n", quicErr)
|
||||||
|
} else {
|
||||||
|
fmt.Printf("QUIC\tsuccess\t%s\n", quicNodeID.String())
|
||||||
|
}
|
||||||
|
if tcpErr != nil {
|
||||||
|
fmt.Printf("TCP\tfail\t%v\n", tcpErr)
|
||||||
|
} else {
|
||||||
|
fmt.Printf("TCP\tsuccess\t%s\n", tcpNodeID.String())
|
||||||
|
}
|
||||||
|
if quicErr == nil && tcpErr == nil && quicNodeID.Compare(tcpNodeID) != 0 {
|
||||||
|
fmt.Printf("(warning: node IDs do not match)\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func tryConnect(ctx context.Context, tlsConfig *tls.Config, dialer rpc.Connector, destAddr string) (storj.NodeID, error) {
|
||||||
|
conn, err := dialer.DialContext(ctx, tlsConfig, destAddr)
|
||||||
|
if err != nil {
|
||||||
|
return storj.NodeID{}, err
|
||||||
|
}
|
||||||
|
defer func() { _ = conn.Close() }()
|
||||||
|
nodeID, err := identity.PeerIdentityFromChain(conn.ConnectionState().PeerCertificates)
|
||||||
|
if err != nil {
|
||||||
|
return storj.NodeID{}, fmt.Errorf("could not get node ID from peer certificates: %v", err)
|
||||||
|
}
|
||||||
|
return nodeID.ID, nil
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user