github.com/lazyledger/lazyledger-core@v0.35.0-dev.0.20210613111200-4c651f053571/privval/utils.go (about) 1 package privval 2 3 import ( 4 "errors" 5 "fmt" 6 "net" 7 8 "github.com/lazyledger/lazyledger-core/crypto/ed25519" 9 "github.com/lazyledger/lazyledger-core/libs/log" 10 tmnet "github.com/lazyledger/lazyledger-core/libs/net" 11 ) 12 13 // IsConnTimeout returns a boolean indicating whether the error is known to 14 // report that a connection timeout occurred. This detects both fundamental 15 // network timeouts, as well as ErrConnTimeout errors. 16 func IsConnTimeout(err error) bool { 17 _, ok := errors.Unwrap(err).(timeoutError) 18 switch { 19 case errors.As(err, &EndpointTimeoutError{}): 20 return true 21 case ok: 22 return true 23 default: 24 return false 25 } 26 } 27 28 // NewSignerListener creates a new SignerListenerEndpoint using the corresponding listen address 29 func NewSignerListener(listenAddr string, logger log.Logger) (*SignerListenerEndpoint, error) { 30 var listener net.Listener 31 32 protocol, address := tmnet.ProtocolAndAddress(listenAddr) 33 ln, err := net.Listen(protocol, address) 34 if err != nil { 35 return nil, err 36 } 37 switch protocol { 38 case "unix": 39 listener = NewUnixListener(ln) 40 case "tcp": 41 // TODO: persist this key so external signer can actually authenticate us 42 listener = NewTCPListener(ln, ed25519.GenPrivKey()) 43 default: 44 return nil, fmt.Errorf( 45 "wrong listen address: expected either 'tcp' or 'unix' protocols, got %s", 46 protocol, 47 ) 48 } 49 50 pve := NewSignerListenerEndpoint(logger.With("module", "privval"), listener) 51 52 return pve, nil 53 } 54 55 // GetFreeLocalhostAddrPort returns a free localhost:port address 56 func GetFreeLocalhostAddrPort() string { 57 port, err := tmnet.GetFreePort() 58 if err != nil { 59 panic(err) 60 } 61 return fmt.Sprintf("127.0.0.1:%d", port) 62 }