Skip to content

Commit c0eb0c0

Browse files
committed
fix: start timeout
1 parent 6e9d2d6 commit c0eb0c0

File tree

6 files changed

+70
-15
lines changed

6 files changed

+70
-15
lines changed

cmd/frpp/shared/cmd.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func BuildCommand(fs embed.FS) *cobra.Command {
4141
logger.UpdateLoggerOpt(
4242
cfg.Logger.FRPLoggerLevel,
4343
cfg.Logger.DefaultLoggerLevel,
44+
cfg.IsDebug,
4445
)
4546

4647
return NewRootCmd(
@@ -152,6 +153,7 @@ func NewMasterCmd(cfg conf.Config, fs embed.FS) *cobra.Command {
152153
warnDepParam(cmd)
153154

154155
opts := []fx.Option{
156+
fx.StartTimeout(defs.AppStartTimeout),
155157
commonMod,
156158
masterMod,
157159
serverMod,
@@ -198,6 +200,7 @@ func NewClientCmd(cfg conf.Config) *cobra.Command {
198200
warnDepParam(cmd)
199201

200202
opts := []fx.Option{
203+
fx.StartTimeout(defs.AppStartTimeout),
201204
clientMod,
202205
commonMod,
203206
fx.Supply(
@@ -243,6 +246,7 @@ func NewServerCmd(cfg conf.Config) *cobra.Command {
243246
warnDepParam(cmd)
244247

245248
opts := []fx.Option{
249+
fx.StartTimeout(defs.AppStartTimeout),
246250
serverMod,
247251
commonMod,
248252
fx.Supply(

defs/const.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ const (
7171
PullConfigDuration = 30 * time.Second
7272
PushProxyInfoDuration = 30 * time.Second
7373
PullClientWorkersDuration = 30 * time.Second
74+
AppStartTimeout = 5 * time.Minute
7475
)
7576

7677
const (

services/clientrpc/rpc_service.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package clientrpc
22

33
import (
4+
"context"
5+
46
"github.com/VaalaCat/frp-panel/pb"
57
"github.com/VaalaCat/frp-panel/services/app"
8+
"github.com/VaalaCat/frp-panel/utils/logger"
69
)
710

811
type ClientRPCHandler interface {
@@ -42,6 +45,12 @@ func NewClientRPCHandler(
4245
}
4346

4447
func (s *clientRPCHandler) Run() {
48+
defer func() {
49+
if err := recover(); err != nil {
50+
logger.Logger(context.Background()).Fatalf("client rpc handler panic: %v", err)
51+
}
52+
}()
53+
4554
startClientRpcHandler(s.appInstance, s.rpcClient, s.done, s.clientID, s.clientSecret, s.event, s.handerFunc)
4655
}
4756

services/rpc/master.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/VaalaCat/frp-panel/defs"
1212
"github.com/VaalaCat/frp-panel/pb"
1313
"github.com/VaalaCat/frp-panel/services/app"
14+
"github.com/VaalaCat/frp-panel/utils"
1415
"github.com/VaalaCat/frp-panel/utils/logger"
1516
"github.com/VaalaCat/frp-panel/utils/wsgrpc"
1617
"github.com/imroc/req/v3"
@@ -34,6 +35,7 @@ func (m *masterClient) Call() pb.MasterClient {
3435
}
3536

3637
func NewMasterCli(appInstance app.Application) *masterClient {
38+
logger.Logger(context.Background()).Debugf("creating new master client")
3739
return &masterClient{
3840
inited: false,
3941
appInstance: appInstance,
@@ -60,16 +62,23 @@ func newMasterCli(appInstance app.Application) pb.MasterClient {
6062

6163
wsURL := fmt.Sprintf("%s://%s/wsgrpc", connInfo.Scheme, connInfo.Host)
6264
header := http.Header{}
63-
wsDialer := wsgrpc.WebsocketDialer(wsURL, header, appInstance.GetConfig().Client.TLSInsecureSkipVerify)
65+
wsDialer := wsgrpc.WebsocketDialer(wsURL,
66+
header,
67+
appInstance.GetConfig().Client.TLSInsecureSkipVerify,
68+
logger.Logger(ctx),
69+
)
6470
opt = append(opt, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithContextDialer(wsDialer))
6571
}
6672

73+
logger.Logger(ctx).Debugf("creating new grpc client to [%s]", utils.MarshalForJson(connInfo))
6774
conn, err := grpc.NewClient(connInfo.Host, opt...)
6875

6976
if err != nil {
7077
logger.Logger(ctx).Fatalf("did not connect: %v", err)
7178
}
7279

80+
logger.Logger(ctx).Debugf("grpc client created")
81+
7382
return pb.NewMasterClient(conn)
7483
}
7584

utils/logger/init.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,25 @@ func InitLogger() {
3434
logrus.SetFormatter(NewCustomFormatter(false, true))
3535
}
3636

37-
func UpdateLoggerOpt(frpLogLevel string, logrusLevel string) {
37+
func UpdateLoggerOpt(frpLogLevel string, logrusLevel string, isDebug bool) {
3838
ctx := context.Background()
3939

4040
frpLogLevel = strings.ToLower(frpLogLevel)
4141
logrusLevel = strings.ToLower(logrusLevel)
4242

4343
if frpLogLevel == "" {
44-
frpLogLevel = "info"
44+
if isDebug {
45+
frpLogLevel = "trace"
46+
} else {
47+
frpLogLevel = "info"
48+
}
4549
}
4650
if logrusLevel == "" {
47-
logrusLevel = "info"
51+
if isDebug {
52+
logrusLevel = "trace"
53+
} else {
54+
logrusLevel = "info"
55+
}
4856
}
4957

5058
frpLv, err := log.ParseLevel(frpLogLevel)

utils/wsgrpc/wsgrpc.go

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"bytes"
55
"context"
66
"crypto/tls"
7+
"errors"
78
"fmt"
89
"net"
910
"net/http"
@@ -14,6 +15,10 @@ import (
1415
"github.com/gorilla/websocket"
1516
)
1617

18+
var (
19+
WSGrpcError = errors.New("wsgrpc error")
20+
)
21+
1722
// ---------------------------------------
1823
// 通用 websocketConn 实现 net.Conn 接口
1924
// ---------------------------------------
@@ -35,16 +40,20 @@ func (c *websocketConn) Read(p []byte) (int, error) {
3540
if c.readBuffer.Len() == 0 {
3641
messageType, data, err := c.ws.ReadMessage()
3742
if err != nil {
38-
return 0, err
43+
return 0, errors.Join(err, errors.New("wsgrpc read message error"), WSGrpcError)
3944
}
4045
// 只接受二进制数据
4146
if messageType != websocket.BinaryMessage {
42-
return 0, fmt.Errorf("unexpected message type: %d", messageType)
47+
return 0, errors.Join(fmt.Errorf("unexpected message type: %d", messageType), WSGrpcError)
4348
}
4449
c.readBuffer.Write(data)
4550
}
4651

47-
return c.readBuffer.Read(p)
52+
if n, err := c.readBuffer.Read(p); err != nil {
53+
return n, errors.Join(err, WSGrpcError)
54+
} else {
55+
return n, nil
56+
}
4857
}
4958

5059
// Write 将数据作为单条二进制消息发送
@@ -54,14 +63,18 @@ func (c *websocketConn) Write(p []byte) (int, error) {
5463

5564
err := c.ws.WriteMessage(websocket.BinaryMessage, p)
5665
if err != nil {
57-
return 0, err
66+
return 0, errors.Join(err, errors.New("wsgrpc write message error"), WSGrpcError)
5867
}
5968
return len(p), nil
6069
}
6170

6271
// Close 关闭 websocket 连接
6372
func (c *websocketConn) Close() error {
64-
return c.ws.Close()
73+
err := c.ws.Close()
74+
if err != nil {
75+
return errors.Join(err, errors.New("wsgrpc close error"), WSGrpcError)
76+
}
77+
return nil
6578
}
6679

6780
// LocalAddr 返回本地地址,通过 websocket 底层连接获取
@@ -83,9 +96,12 @@ func (c *websocketConn) RemoteAddr() net.Addr {
8396
// SetDeadline 同时设置读写超时
8497
func (c *websocketConn) SetDeadline(t time.Time) error {
8598
if err := c.ws.SetReadDeadline(t); err != nil {
86-
return err
99+
return errors.Join(err, errors.New("wsgrpc set read deadline error"), WSGrpcError)
87100
}
88-
return c.ws.SetWriteDeadline(t)
101+
if err := c.ws.SetWriteDeadline(t); err != nil {
102+
return errors.Join(err, errors.New("wsgrpc set write deadline error"), WSGrpcError)
103+
}
104+
return nil
89105
}
90106

91107
// SetReadDeadline 设置读超时
@@ -101,18 +117,26 @@ func (c *websocketConn) SetWriteDeadline(t time.Time) error {
101117
// ---------------------------------------
102118
// 客户端 WebSocket Dialer
103119
// ---------------------------------------
120+
type LogInterface interface {
121+
Infof(format string, args ...interface{})
122+
Errorf(format string, args ...interface{})
123+
Tracef(format string, args ...interface{})
124+
}
104125

105126
// WebsocketDialer 返回一个可以用于 grpc.WithContextDialer 的拨号函数;该函数通过 websocket 建立连接。
106127
// 参数 url 表示 websocket 服务器地址;header 可用于传递额外的 header 参数。
107-
func WebsocketDialer(url string, header http.Header, insecure bool) func(ctx context.Context, addr string) (net.Conn, error) {
128+
func WebsocketDialer(url string, header http.Header, insecure bool, log LogInterface) func(ctx context.Context, addr string) (net.Conn, error) {
108129
return func(ctx context.Context, addr string) (net.Conn, error) {
109130
dialer := websocket.Dialer{
110131
TLSClientConfig: &tls.Config{InsecureSkipVerify: insecure},
111132
}
133+
log.Tracef("dialing websocket server [%s]", url)
112134
ws, _, err := dialer.DialContext(ctx, url, header)
113135
if err != nil {
114-
return nil, err
136+
log.Errorf("wsgrpc dialer error: %v", err)
137+
return nil, errors.Join(err, errors.New("wsgrpc dialer error"), WSGrpcError)
115138
}
139+
log.Tracef("websocket connection connect done")
116140
return &websocketConn{ws: ws}, nil
117141
}
118142
}
@@ -160,11 +184,11 @@ func (l *WSListener) Accept() (net.Conn, error) {
160184
select {
161185
case conn, ok := <-l.connCh:
162186
if !ok {
163-
return nil, fmt.Errorf("listener closed")
187+
return nil, errors.Join(fmt.Errorf("listener closed"), WSGrpcError)
164188
}
165189
return conn, nil
166190
case <-l.done:
167-
return nil, fmt.Errorf("listener closed")
191+
return nil, errors.Join(fmt.Errorf("listener closed"), WSGrpcError)
168192
}
169193
}
170194

0 commit comments

Comments
 (0)