From f07c03ce6849a07f046377dc845c5c46fa369ff6 Mon Sep 17 00:00:00 2001 From: VaalaCat Date: Sat, 26 Apr 2025 10:52:21 +0000 Subject: [PATCH] feat: fx --- .github/workflows/latest.workflow.yml | 2 +- .github/workflows/tag.workflow.yml | 2 +- .gitignore | 1 - biz/client/get_proxy_info.go | 4 +- biz/client/pty_connect.go | 2 +- biz/client/remove_tunnel.go | 4 +- biz/client/rpc_handler.go | 4 +- biz/client/rpc_pull_config.go | 6 +- biz/client/start_client.go | 4 +- biz/client/stop_client.go | 4 +- biz/client/stream_log.go | 8 +- biz/client/update_tunnel.go | 4 +- biz/common/pty.go | 6 +- biz/common/stream_log.go | 4 +- biz/master/auth/client_cert.go | 4 +- biz/master/auth/handler.go | 8 +- biz/master/auth/init.go | 11 +- biz/master/auth/login.go | 4 +- biz/master/auth/logout.go | 2 +- biz/master/auth/register.go | 4 +- biz/master/client/create_client.go | 4 +- biz/master/client/delete_client.go | 8 +- biz/master/client/delete_tunnel.go | 8 +- biz/master/client/get_client.go | 6 +- biz/master/client/helper.go | 6 +- biz/master/client/list_client.go | 6 +- biz/master/client/rpc_pull_config.go | 6 +- biz/master/client/start_client.go | 8 +- biz/master/client/stop_client.go | 8 +- biz/master/client/sync_tunnel.go | 6 +- biz/master/client/update_tunnel.go | 8 +- biz/master/handler.go | 2 +- biz/master/platform/get_clients_status.go | 6 +- biz/master/platform/get_platform_info.go | 4 +- biz/master/proxy/create_proxy_config.go | 6 +- biz/master/proxy/delete_proxy_config.go | 6 +- biz/master/proxy/get_proxy_config.go | 8 +- biz/master/proxy/get_stats_by_cid.go | 6 +- biz/master/proxy/get_stats_by_sid.go | 6 +- biz/master/proxy/list_config.go | 6 +- biz/master/proxy/task_collect_daily_stats.go | 6 +- biz/master/proxy/update_proxy_config.go | 6 +- biz/master/server/create_server.go | 4 +- biz/master/server/delete_server.go | 4 +- biz/master/server/delete_tunnel.go | 8 +- biz/master/server/get_server.go | 4 +- biz/master/server/helper.go | 4 +- biz/master/server/list_server.go | 4 +- biz/master/server/rpc_frp_auth.go | 8 +- biz/master/server/rpc_pull_config.go | 2 +- biz/master/server/rpc_push_proxy_info.go | 4 +- biz/master/server/update_tunnel.go | 8 +- biz/master/shell/handler.go | 6 +- biz/master/shell/recv_mgr.go | 4 +- biz/master/streamlog/collect_log.go | 4 +- biz/master/streamlog/get_log.go | 6 +- biz/master/user/get_user_info.go | 2 +- biz/master/user/update_user_info.go | 6 +- biz/server/auth_handler.go | 6 +- biz/server/pty_connect.go | 2 +- biz/server/remove_tunnel.go | 4 +- biz/server/rpc_handler.go | 4 +- biz/server/rpc_pull_config.go | 6 +- biz/server/rpc_push_proxy_info.go | 6 +- biz/server/stream_log.go | 8 +- biz/server/update_tunnel.go | 4 +- cmd/frpp/client.go | 101 ++-- cmd/frpp/cmd.go | 465 ++++++++++++------- cmd/frpp/main.go | 24 +- cmd/frpp/master.go | 230 +++------ cmd/frpp/modules.go | 44 ++ cmd/frpp/providers.go | 278 +++++++++++ cmd/frpp/server.go | 118 ++--- cmd/frpp/test.go | 2 +- cmd/frppc/client.go | 20 +- cmd/frppc/cmd.go | 12 +- cmd/frppc/main.go | 7 +- conf/helper.go | 2 +- conf/settings.go | 12 +- docs/.gitignore | 1 + go.mod | 13 +- go.sum | 28 +- middleware/auth.go | 6 +- middleware/jwt.go | 4 +- models/db.go | 2 +- models/helper.go | 2 +- {app => services/app}/app_impl.go | 23 +- {app => services/app}/application.go | 9 +- {app => services/app}/helper.go | 2 +- {app => services/app}/provider.go | 7 +- {cache => services/cache}/freecache.go | 2 +- services/client/frpc_service.go | 4 +- {dao => services/dao}/cert.go | 14 +- {dao => services/dao}/client.go | 0 {dao => services/dao}/proxy.go | 2 +- {dao => services/dao}/query.go | 2 +- {dao => services/dao}/server.go | 0 {dao => services/dao}/stats.go | 0 {dao => services/dao}/user.go | 0 services/master/grpc_server.go | 17 +- services/master/grpc_service.go | 2 +- {rpc => services/rpc}/client.go | 23 +- {rpc => services/rpc}/client_manager.go | 2 +- {rpc => services/rpc}/master.go | 39 +- services/rpcclient/rpc_handler.go | 19 +- services/rpcclient/rpc_service.go | 6 +- services/server/frps_service.go | 8 +- {tunnel => services/tunnel}/client.go | 4 +- {tunnel => services/tunnel}/master.go | 0 {tunnel => services/tunnel}/server.go | 2 +- {watcher => services/watcher}/client.go | 4 +- utils/cert.go | 6 +- {logger => utils/logger}/hook.go | 0 utils/logger/init.go | 85 ++++ {logger => utils/logger}/logger.go | 0 utils/logger/trace.go | 83 ++++ utils/system_service.go | 13 +- 117 files changed, 1307 insertions(+), 784 deletions(-) create mode 100644 cmd/frpp/modules.go create mode 100644 cmd/frpp/providers.go create mode 100644 docs/.gitignore rename {app => services/app}/app_impl.go (89%) rename {app => services/app}/application.go (89%) rename {app => services/app}/helper.go (97%) rename {app => services/app}/provider.go (97%) rename {cache => services/cache}/freecache.go (90%) rename {dao => services/dao}/cert.go (89%) rename {dao => services/dao}/client.go (100%) rename {dao => services/dao}/proxy.go (99%) rename {dao => services/dao}/query.go (76%) rename {dao => services/dao}/server.go (100%) rename {dao => services/dao}/stats.go (100%) rename {dao => services/dao}/user.go (100%) rename {rpc => services/rpc}/client.go (77%) rename {rpc => services/rpc}/client_manager.go (97%) rename {rpc => services/rpc}/master.go (80%) rename {tunnel => services/tunnel}/client.go (97%) rename {tunnel => services/tunnel}/master.go (100%) rename {tunnel => services/tunnel}/server.go (96%) rename {watcher => services/watcher}/client.go (92%) rename {logger => utils/logger}/hook.go (100%) create mode 100644 utils/logger/init.go rename {logger => utils/logger}/logger.go (100%) create mode 100644 utils/logger/trace.go diff --git a/.github/workflows/latest.workflow.yml b/.github/workflows/latest.workflow.yml index df1f556..51bc4bb 100644 --- a/.github/workflows/latest.workflow.yml +++ b/.github/workflows/latest.workflow.yml @@ -20,7 +20,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v4 with: - go-version: "1.22.x" + go-version: "1.24.x" - name: npm install and build run: | cd www diff --git a/.github/workflows/tag.workflow.yml b/.github/workflows/tag.workflow.yml index 9d13e2c..daa4117 100644 --- a/.github/workflows/tag.workflow.yml +++ b/.github/workflows/tag.workflow.yml @@ -21,7 +21,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v4 with: - go-version: "1.22.x" + go-version: "1.24.x" - name: npm install and build run: | cd www diff --git a/.gitignore b/.gitignore index a5b184a..8b178a5 100644 --- a/.gitignore +++ b/.gitignore @@ -20,7 +20,6 @@ dist/ .vite_opt_cache .vscode dist -cache temp examples-temp node_modules diff --git a/biz/client/get_proxy_info.go b/biz/client/get_proxy_info.go index 9318bca..4f3b3b7 100644 --- a/biz/client/get_proxy_info.go +++ b/biz/client/get_proxy_info.go @@ -3,9 +3,9 @@ package client import ( "fmt" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/samber/lo" ) diff --git a/biz/client/pty_connect.go b/biz/client/pty_connect.go index 83a4a77..dd216e8 100644 --- a/biz/client/pty_connect.go +++ b/biz/client/pty_connect.go @@ -1,9 +1,9 @@ package client import ( - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/biz/common" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" ) func StartPTYConnect(c *app.Context, req *pb.CommonRequest) (*pb.CommonResponse, error) { diff --git a/biz/client/remove_tunnel.go b/biz/client/remove_tunnel.go index 1b3996a..c1e9e23 100644 --- a/biz/client/remove_tunnel.go +++ b/biz/client/remove_tunnel.go @@ -4,9 +4,9 @@ import ( "os" "time" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/utils/logger" ) func RemoveFrpcHandler(ctx *app.Context, req *pb.RemoveFRPCRequest) (*pb.RemoveFRPCResponse, error) { diff --git a/biz/client/rpc_handler.go b/biz/client/rpc_handler.go index 4151302..f1132ff 100644 --- a/biz/client/rpc_handler.go +++ b/biz/client/rpc_handler.go @@ -5,10 +5,10 @@ import ( "fmt" "runtime/debug" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/conf" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/utils/logger" "google.golang.org/protobuf/proto" ) diff --git a/biz/client/rpc_pull_config.go b/biz/client/rpc_pull_config.go index 747dbba..c82a115 100644 --- a/biz/client/rpc_pull_config.go +++ b/biz/client/rpc_pull_config.go @@ -4,11 +4,11 @@ import ( "context" "reflect" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" "github.com/VaalaCat/frp-panel/services/client" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/samber/lo" ) @@ -18,7 +18,7 @@ func PullConfig(appInstance app.Application, clientID, clientSecret string) erro logger.Logger(ctx).Infof("start to pull client config, clientID: [%s]", clientID) cli := appInstance.GetMasterCli() - resp, err := cli.PullClientConfig(ctx, &pb.PullClientConfigReq{ + resp, err := cli.Call().PullClientConfig(ctx, &pb.PullClientConfigReq{ Base: &pb.ClientBase{ ClientId: clientID, ClientSecret: clientSecret, diff --git a/biz/client/start_client.go b/biz/client/start_client.go index 6f7a9ae..da64bfd 100644 --- a/biz/client/start_client.go +++ b/biz/client/start_client.go @@ -1,9 +1,9 @@ package client import ( - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/utils/logger" ) func StartFRPCHandler(ctx *app.Context, req *pb.StartFRPCRequest) (*pb.StartFRPCResponse, error) { diff --git a/biz/client/stop_client.go b/biz/client/stop_client.go index 8b8da1e..04af033 100644 --- a/biz/client/stop_client.go +++ b/biz/client/stop_client.go @@ -1,9 +1,9 @@ package client import ( - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/utils/logger" ) func StopFRPCHandler(ctx *app.Context, req *pb.StopFRPCRequest) (*pb.StopFRPCResponse, error) { diff --git a/biz/client/stream_log.go b/biz/client/stream_log.go index fb71828..8e9841f 100644 --- a/biz/client/stream_log.go +++ b/biz/client/stream_log.go @@ -3,11 +3,11 @@ package client import ( "context" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/biz/common" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" "github.com/VaalaCat/frp-panel/utils" - "github.com/sirupsen/logrus" + "github.com/VaalaCat/frp-panel/utils/logger" ) func StartSteamLogHandler(ctx *app.Context, req *pb.CommonRequest) (*pb.CommonResponse, error) { @@ -22,10 +22,10 @@ func initStreamLog(ctx *app.Context, h app.StreamLogHookMgr) { clientID := ctx.GetApp().GetConfig().Client.ID clientSecret := ctx.GetApp().GetConfig().Client.Secret - handler, err := ctx.GetApp().GetClientRPCHandler().GetCli().PushClientStreamLog( + handler, err := ctx.GetApp().GetClientRPCHandler().GetCli().Call().PushClientStreamLog( context.Background()) if err != nil { - logrus.Error(err) + logger.Logger(ctx).Error(err) } h.AddStream(func(msg string) { diff --git a/biz/client/update_tunnel.go b/biz/client/update_tunnel.go index 338dea4..91e4841 100644 --- a/biz/client/update_tunnel.go +++ b/biz/client/update_tunnel.go @@ -3,11 +3,11 @@ package client import ( "reflect" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" "github.com/VaalaCat/frp-panel/services/client" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" ) func UpdateFrpcHander(ctx *app.Context, req *pb.UpdateFRPCRequest) (*pb.UpdateFRPCResponse, error) { diff --git a/biz/common/pty.go b/biz/common/pty.go index a9f7bbb..f2712cd 100644 --- a/biz/common/pty.go +++ b/biz/common/pty.go @@ -4,16 +4,16 @@ import ( "context" "fmt" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/VaalaCat/frp-panel/utils/pty" "github.com/google/uuid" "github.com/sourcegraph/conc" ) func StartPTYConnect(c *app.Context, req *pb.CommonRequest, initMsg *pb.PTYClientMessage) (*pb.CommonResponse, error) { - conn, err := c.GetApp().GetClientRPCHandler().GetCli().PTYConnect(c) + conn, err := c.GetApp().GetClientRPCHandler().GetCli().Call().PTYConnect(c) if err != nil { logger.Logger(c).WithError(err).Infof("rpc connect master error") return nil, err diff --git a/biz/common/stream_log.go b/biz/common/stream_log.go index 427cc50..baeaa19 100644 --- a/biz/common/stream_log.go +++ b/biz/common/stream_log.go @@ -3,9 +3,9 @@ package common import ( "sync" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/sirupsen/logrus" ) diff --git a/biz/master/auth/client_cert.go b/biz/master/auth/client_cert.go index 074afa0..65a0454 100644 --- a/biz/master/auth/client_cert.go +++ b/biz/master/auth/client_cert.go @@ -1,9 +1,9 @@ package auth import ( - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" ) func GetClientCert(ctx *app.Context, req *pb.GetClientCertRequest) (*pb.GetClientCertResponse, error) { diff --git a/biz/master/auth/handler.go b/biz/master/auth/handler.go index 317b3a5..b7a659b 100644 --- a/biz/master/auth/handler.go +++ b/biz/master/auth/handler.go @@ -3,10 +3,10 @@ package auth import ( "net/http" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/cache" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/cache" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/utils/logger" plugin "github.com/fatedier/frp/pkg/plugin/server" "github.com/gin-gonic/gin" ) diff --git a/biz/master/auth/init.go b/biz/master/auth/init.go index 0046dd6..107ced3 100644 --- a/biz/master/auth/init.go +++ b/biz/master/auth/init.go @@ -3,18 +3,17 @@ package auth import ( "context" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/cache" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/models" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/cache" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/samber/lo" - "github.com/sirupsen/logrus" ) func InitAuth(appInstance app.Application) { appCtx := app.NewContext(context.Background(), appInstance) - logrus.Info("start to init frp user auth token") + logger.Logger(appCtx).Info("start to init frp user auth token") u, err := dao.NewQuery(appCtx).AdminGetAllUsers() if err != nil { diff --git a/biz/master/auth/login.go b/biz/master/auth/login.go index 005b39c..e96620a 100644 --- a/biz/master/auth/login.go +++ b/biz/master/auth/login.go @@ -3,11 +3,11 @@ package auth import ( "fmt" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/conf" - "github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/middleware" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" ) func LoginHandler(ctx *app.Context, req *pb.LoginRequest) (*pb.LoginResponse, error) { diff --git a/biz/master/auth/logout.go b/biz/master/auth/logout.go index 40c493e..742db1f 100644 --- a/biz/master/auth/logout.go +++ b/biz/master/auth/logout.go @@ -1,9 +1,9 @@ package auth import ( - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" "github.com/gin-gonic/gin" ) diff --git a/biz/master/auth/register.go b/biz/master/auth/register.go index 356c5fa..630cb9d 100644 --- a/biz/master/auth/register.go +++ b/biz/master/auth/register.go @@ -3,10 +3,10 @@ package auth import ( "fmt" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" "github.com/VaalaCat/frp-panel/utils" "github.com/google/uuid" ) diff --git a/biz/master/client/create_client.go b/biz/master/client/create_client.go index 22e8ec0..29a1a24 100644 --- a/biz/master/client/create_client.go +++ b/biz/master/client/create_client.go @@ -1,11 +1,11 @@ package client import ( - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" "github.com/VaalaCat/frp-panel/utils" "github.com/google/uuid" ) diff --git a/biz/master/client/delete_client.go b/biz/master/client/delete_client.go index b328b2e..96fad8c 100644 --- a/biz/master/client/delete_client.go +++ b/biz/master/client/delete_client.go @@ -3,12 +3,12 @@ package client import ( "context" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/services/rpc" + "github.com/VaalaCat/frp-panel/utils/logger" ) func DeleteClientHandler(ctx *app.Context, req *pb.DeleteClientRequest) (*pb.DeleteClientResponse, error) { diff --git a/biz/master/client/delete_tunnel.go b/biz/master/client/delete_tunnel.go index 225a4da..defad77 100644 --- a/biz/master/client/delete_tunnel.go +++ b/biz/master/client/delete_tunnel.go @@ -4,12 +4,12 @@ import ( "context" "fmt" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/services/rpc" + "github.com/VaalaCat/frp-panel/utils/logger" ) func RemoveFrpcHandler(c *app.Context, req *pb.RemoveFRPCRequest) (*pb.RemoveFRPCResponse, error) { diff --git a/biz/master/client/get_client.go b/biz/master/client/get_client.go index e98d403..80a473f 100644 --- a/biz/master/client/get_client.go +++ b/biz/master/client/get_client.go @@ -1,12 +1,12 @@ package client import ( - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/samber/lo" ) diff --git a/biz/master/client/helper.go b/biz/master/client/helper.go index 9ff925f..b8531cd 100644 --- a/biz/master/client/helper.go +++ b/biz/master/client/helper.go @@ -3,11 +3,11 @@ package client import ( "fmt" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/models" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/samber/lo" "github.com/tiendc/go-deepcopy" ) diff --git a/biz/master/client/list_client.go b/biz/master/client/list_client.go index 22618fa..1acf867 100644 --- a/biz/master/client/list_client.go +++ b/biz/master/client/list_client.go @@ -1,12 +1,12 @@ package client import ( - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/samber/lo" ) diff --git a/biz/master/client/rpc_pull_config.go b/biz/master/client/rpc_pull_config.go index 81aec6a..aef657b 100644 --- a/biz/master/client/rpc_pull_config.go +++ b/biz/master/client/rpc_pull_config.go @@ -3,11 +3,11 @@ package client import ( "fmt" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/samber/lo" ) diff --git a/biz/master/client/start_client.go b/biz/master/client/start_client.go index b845634..b16d88e 100644 --- a/biz/master/client/start_client.go +++ b/biz/master/client/start_client.go @@ -3,12 +3,12 @@ package client import ( "context" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/services/rpc" + "github.com/VaalaCat/frp-panel/utils/logger" ) func StartFRPCHandler(ctx *app.Context, req *pb.StartFRPCRequest) (*pb.StartFRPCResponse, error) { diff --git a/biz/master/client/stop_client.go b/biz/master/client/stop_client.go index a5a0e33..1822c45 100644 --- a/biz/master/client/stop_client.go +++ b/biz/master/client/stop_client.go @@ -3,12 +3,12 @@ package client import ( "context" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/services/rpc" + "github.com/VaalaCat/frp-panel/utils/logger" ) func StopFRPCHandler(ctx *app.Context, req *pb.StopFRPCRequest) (*pb.StopFRPCResponse, error) { diff --git a/biz/master/client/sync_tunnel.go b/biz/master/client/sync_tunnel.go index b011f57..67b7e1f 100644 --- a/biz/master/client/sync_tunnel.go +++ b/biz/master/client/sync_tunnel.go @@ -3,11 +3,11 @@ package client import ( "context" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/defs" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/models" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/samber/lo" ) diff --git a/biz/master/client/update_tunnel.go b/biz/master/client/update_tunnel.go index c421d13..15c8ba2 100644 --- a/biz/master/client/update_tunnel.go +++ b/biz/master/client/update_tunnel.go @@ -5,15 +5,15 @@ import ( "encoding/json" "fmt" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/defs" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/services/rpc" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" v1 "github.com/fatedier/frp/pkg/config/v1" "github.com/samber/lo" ) diff --git a/biz/master/handler.go b/biz/master/handler.go index 5176b9e..0f3f796 100644 --- a/biz/master/handler.go +++ b/biz/master/handler.go @@ -3,7 +3,6 @@ package master import ( "embed" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/biz/master/auth" "github.com/VaalaCat/frp-panel/biz/master/client" "github.com/VaalaCat/frp-panel/biz/master/platform" @@ -13,6 +12,7 @@ import ( "github.com/VaalaCat/frp-panel/biz/master/streamlog" "github.com/VaalaCat/frp-panel/biz/master/user" "github.com/VaalaCat/frp-panel/middleware" + "github.com/VaalaCat/frp-panel/services/app" "github.com/gin-gonic/gin" ) diff --git a/biz/master/platform/get_clients_status.go b/biz/master/platform/get_clients_status.go index 38bcdd4..3d79aa7 100644 --- a/biz/master/platform/get_clients_status.go +++ b/biz/master/platform/get_clients_status.go @@ -4,11 +4,11 @@ import ( "context" "time" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/rpc" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/samber/lo" "google.golang.org/protobuf/proto" ) diff --git a/biz/master/platform/get_platform_info.go b/biz/master/platform/get_platform_info.go index 62a557d..5fce637 100644 --- a/biz/master/platform/get_platform_info.go +++ b/biz/master/platform/get_platform_info.go @@ -3,11 +3,11 @@ package platform import ( "fmt" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/conf" - "github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" "github.com/gin-gonic/gin" ) diff --git a/biz/master/proxy/create_proxy_config.go b/biz/master/proxy/create_proxy_config.go index 21aaba7..7b9e809 100644 --- a/biz/master/proxy/create_proxy_config.go +++ b/biz/master/proxy/create_proxy_config.go @@ -4,14 +4,14 @@ import ( "errors" "fmt" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/biz/master/client" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" v1 "github.com/fatedier/frp/pkg/config/v1" "github.com/samber/lo" diff --git a/biz/master/proxy/delete_proxy_config.go b/biz/master/proxy/delete_proxy_config.go index 53982ec..b555664 100644 --- a/biz/master/proxy/delete_proxy_config.go +++ b/biz/master/proxy/delete_proxy_config.go @@ -3,12 +3,12 @@ package proxy import ( "fmt" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/biz/master/client" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/utils/logger" v1 "github.com/fatedier/frp/pkg/config/v1" "github.com/samber/lo" ) diff --git a/biz/master/proxy/get_proxy_config.go b/biz/master/proxy/get_proxy_config.go index 08abfe8..30f389f 100644 --- a/biz/master/proxy/get_proxy_config.go +++ b/biz/master/proxy/get_proxy_config.go @@ -3,13 +3,13 @@ package proxy import ( "fmt" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/services/rpc" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/samber/lo" ) diff --git a/biz/master/proxy/get_stats_by_cid.go b/biz/master/proxy/get_stats_by_cid.go index 57f16b0..27d4094 100644 --- a/biz/master/proxy/get_stats_by_cid.go +++ b/biz/master/proxy/get_stats_by_cid.go @@ -4,11 +4,11 @@ import ( "context" "fmt" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/utils/logger" ) // GetProxyStatsByClientID get proxy info by client id diff --git a/biz/master/proxy/get_stats_by_sid.go b/biz/master/proxy/get_stats_by_sid.go index ce42d1f..1c3b051 100644 --- a/biz/master/proxy/get_stats_by_sid.go +++ b/biz/master/proxy/get_stats_by_sid.go @@ -4,11 +4,11 @@ import ( "context" "fmt" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/utils/logger" ) // GetProxyStatsByServerID get proxy info by server id diff --git a/biz/master/proxy/list_config.go b/biz/master/proxy/list_config.go index 679456e..acfe5b4 100644 --- a/biz/master/proxy/list_config.go +++ b/biz/master/proxy/list_config.go @@ -1,12 +1,12 @@ package proxy import ( - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/samber/lo" ) diff --git a/biz/master/proxy/task_collect_daily_stats.go b/biz/master/proxy/task_collect_daily_stats.go index 28feffd..d3a281f 100644 --- a/biz/master/proxy/task_collect_daily_stats.go +++ b/biz/master/proxy/task_collect_daily_stats.go @@ -3,10 +3,10 @@ package proxy import ( "context" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/models" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/samber/lo" ) diff --git a/biz/master/proxy/update_proxy_config.go b/biz/master/proxy/update_proxy_config.go index b5e78a1..cbd2b1a 100644 --- a/biz/master/proxy/update_proxy_config.go +++ b/biz/master/proxy/update_proxy_config.go @@ -3,14 +3,14 @@ package proxy import ( "fmt" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/biz/master/client" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" v1 "github.com/fatedier/frp/pkg/config/v1" "github.com/samber/lo" ) diff --git a/biz/master/server/create_server.go b/biz/master/server/create_server.go index 3da3351..f85ebbc 100644 --- a/biz/master/server/create_server.go +++ b/biz/master/server/create_server.go @@ -1,11 +1,11 @@ package server import ( - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" "github.com/VaalaCat/frp-panel/utils" "github.com/google/uuid" ) diff --git a/biz/master/server/delete_server.go b/biz/master/server/delete_server.go index 4e6f775..30b8a5c 100644 --- a/biz/master/server/delete_server.go +++ b/biz/master/server/delete_server.go @@ -1,10 +1,10 @@ package server import ( - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" ) func DeleteServerHandler(c *app.Context, req *pb.DeleteServerRequest) (*pb.DeleteServerResponse, error) { diff --git a/biz/master/server/delete_tunnel.go b/biz/master/server/delete_tunnel.go index dac3cbd..1f8955e 100644 --- a/biz/master/server/delete_tunnel.go +++ b/biz/master/server/delete_tunnel.go @@ -3,12 +3,12 @@ package server import ( "context" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/services/rpc" + "github.com/VaalaCat/frp-panel/utils/logger" ) func RemoveFrpsHandler(c *app.Context, req *pb.RemoveFRPSRequest) (*pb.RemoveFRPSResponse, error) { diff --git a/biz/master/server/get_server.go b/biz/master/server/get_server.go index 23f45d7..44c0e98 100644 --- a/biz/master/server/get_server.go +++ b/biz/master/server/get_server.go @@ -1,10 +1,10 @@ package server import ( - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" "github.com/samber/lo" ) diff --git a/biz/master/server/helper.go b/biz/master/server/helper.go index 32e3ac0..ad36d4d 100644 --- a/biz/master/server/helper.go +++ b/biz/master/server/helper.go @@ -3,9 +3,9 @@ package server import ( "fmt" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/models" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" ) type ValidateableServerRequest interface { diff --git a/biz/master/server/list_server.go b/biz/master/server/list_server.go index 13824b6..68fada5 100644 --- a/biz/master/server/list_server.go +++ b/biz/master/server/list_server.go @@ -1,11 +1,11 @@ package server import ( - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" "github.com/samber/lo" ) diff --git a/biz/master/server/rpc_frp_auth.go b/biz/master/server/rpc_frp_auth.go index 1ef3c2c..69ad83b 100644 --- a/biz/master/server/rpc_frp_auth.go +++ b/biz/master/server/rpc_frp_auth.go @@ -4,11 +4,11 @@ import ( "context" "fmt" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/cache" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/cache" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/utils/logger" ) func FRPAuth(ctx *app.Context, req *pb.FRPAuthRequest) (*pb.FRPAuthResponse, error) { diff --git a/biz/master/server/rpc_pull_config.go b/biz/master/server/rpc_pull_config.go index faa671e..557cfc0 100644 --- a/biz/master/server/rpc_pull_config.go +++ b/biz/master/server/rpc_pull_config.go @@ -1,9 +1,9 @@ package server import ( - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" "github.com/samber/lo" ) diff --git a/biz/master/server/rpc_push_proxy_info.go b/biz/master/server/rpc_push_proxy_info.go index f108dbc..cf3a4c5 100644 --- a/biz/master/server/rpc_push_proxy_info.go +++ b/biz/master/server/rpc_push_proxy_info.go @@ -1,10 +1,10 @@ package server import ( - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" ) func PushProxyInfo(ctx *app.Context, req *pb.PushProxyInfoReq) (*pb.PushProxyInfoResp, error) { diff --git a/biz/master/server/update_tunnel.go b/biz/master/server/update_tunnel.go index cb6f2d3..b4ccaf2 100644 --- a/biz/master/server/update_tunnel.go +++ b/biz/master/server/update_tunnel.go @@ -4,15 +4,15 @@ import ( "context" "fmt" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/conf" - "github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/defs" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/services/rpc" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" v1 "github.com/fatedier/frp/pkg/config/v1" ) diff --git a/biz/master/shell/handler.go b/biz/master/shell/handler.go index ebb9279..3e06d57 100644 --- a/biz/master/shell/handler.go +++ b/biz/master/shell/handler.go @@ -7,11 +7,11 @@ import ( "strconv" "time" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/rpc" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/fatedier/golib/log" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" diff --git a/biz/master/shell/recv_mgr.go b/biz/master/shell/recv_mgr.go index 2f1419b..672a02c 100644 --- a/biz/master/shell/recv_mgr.go +++ b/biz/master/shell/recv_mgr.go @@ -4,11 +4,11 @@ import ( "fmt" "io" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/biz/master/client" "github.com/VaalaCat/frp-panel/biz/master/server" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/utils/logger" ) func PTYConnect(ctx *app.Context, sender pb.Master_PTYConnectServer) error { diff --git a/biz/master/streamlog/collect_log.go b/biz/master/streamlog/collect_log.go index 6f83109..6ae7a88 100644 --- a/biz/master/streamlog/collect_log.go +++ b/biz/master/streamlog/collect_log.go @@ -6,12 +6,12 @@ import ( "io" "sync" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/biz/master/client" "github.com/VaalaCat/frp-panel/biz/master/server" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" ) const ( diff --git a/biz/master/streamlog/get_log.go b/biz/master/streamlog/get_log.go index e46e739..923d39e 100644 --- a/biz/master/streamlog/get_log.go +++ b/biz/master/streamlog/get_log.go @@ -5,11 +5,11 @@ import ( "encoding/json" "net/http" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/rpc" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/gin-gonic/gin" "github.com/sourcegraph/conc" ) diff --git a/biz/master/user/get_user_info.go b/biz/master/user/get_user_info.go index 16c6747..75f1b34 100644 --- a/biz/master/user/get_user_info.go +++ b/biz/master/user/get_user_info.go @@ -3,9 +3,9 @@ package user import ( "fmt" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" "github.com/samber/lo" ) diff --git a/biz/master/user/update_user_info.go b/biz/master/user/update_user_info.go index db7905f..e81d064 100644 --- a/biz/master/user/update_user_info.go +++ b/biz/master/user/update_user_info.go @@ -3,14 +3,14 @@ package user import ( "context" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/biz/master/client" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" ) func UpdateUserInfoHander(c *app.Context, req *pb.UpdateUserInfoRequest) (*pb.UpdateUserInfoResponse, error) { diff --git a/biz/server/auth_handler.go b/biz/server/auth_handler.go index d736463..28a1e72 100644 --- a/biz/server/auth_handler.go +++ b/biz/server/auth_handler.go @@ -3,10 +3,10 @@ package server import ( "net/http" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/defs" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/utils/logger" plugin "github.com/fatedier/frp/pkg/plugin/server" "github.com/gin-gonic/gin" ) @@ -68,7 +68,7 @@ func HandleLogin(ctx *app.Context) (interface{}, error) { return res, nil } cli := ctx.GetApp().GetMasterCli() - authResponse, err := cli.FRPCAuth(ctx, &pb.FRPAuthRequest{User: content.User, Token: token}) + authResponse, err := cli.Call().FRPCAuth(ctx, &pb.FRPAuthRequest{User: content.User, Token: token}) if err != nil { res.Reject = true res.RejectReason = "invalid meta token" diff --git a/biz/server/pty_connect.go b/biz/server/pty_connect.go index 4281a73..87af29e 100644 --- a/biz/server/pty_connect.go +++ b/biz/server/pty_connect.go @@ -1,9 +1,9 @@ package server import ( - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/biz/common" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" ) func StartPTYConnect(c *app.Context, req *pb.CommonRequest) (*pb.CommonResponse, error) { diff --git a/biz/server/remove_tunnel.go b/biz/server/remove_tunnel.go index 5496507..055c493 100644 --- a/biz/server/remove_tunnel.go +++ b/biz/server/remove_tunnel.go @@ -3,9 +3,9 @@ package server import ( "fmt" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/utils/logger" ) func RemoveFrpsHandler(ctx *app.Context, req *pb.RemoveFRPSRequest) (*pb.RemoveFRPSResponse, error) { diff --git a/biz/server/rpc_handler.go b/biz/server/rpc_handler.go index e5cadec..641a612 100644 --- a/biz/server/rpc_handler.go +++ b/biz/server/rpc_handler.go @@ -5,10 +5,10 @@ import ( "fmt" "runtime/debug" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/conf" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/utils/logger" "google.golang.org/protobuf/proto" ) diff --git a/biz/server/rpc_pull_config.go b/biz/server/rpc_pull_config.go index cd5dda0..b3a9fbe 100644 --- a/biz/server/rpc_pull_config.go +++ b/biz/server/rpc_pull_config.go @@ -4,11 +4,11 @@ import ( "context" "reflect" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" "github.com/VaalaCat/frp-panel/services/server" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" ) func PullConfig(appInstance app.Application, serverID, serverSecret string) error { @@ -16,7 +16,7 @@ func PullConfig(appInstance app.Application, serverID, serverSecret string) erro logger.Logger(ctx).Infof("start to pull server config, serverID: [%s]", serverID) cli := appInstance.GetMasterCli() - resp, err := cli.PullServerConfig(ctx, &pb.PullServerConfigReq{ + resp, err := cli.Call().PullServerConfig(ctx, &pb.PullServerConfigReq{ Base: &pb.ServerBase{ ServerId: serverID, ServerSecret: serverSecret, diff --git a/biz/server/rpc_push_proxy_info.go b/biz/server/rpc_push_proxy_info.go index f123179..3b51775 100644 --- a/biz/server/rpc_push_proxy_info.go +++ b/biz/server/rpc_push_proxy_info.go @@ -3,9 +3,9 @@ package server import ( "context" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/utils/logger" v1 "github.com/fatedier/frp/pkg/config/v1" "github.com/samber/lo" ) @@ -46,7 +46,7 @@ func PushProxyInfo(appInstance app.Application, serverID, serverSecret string) e if len(proxyInfos) > 0 { ctx := context.Background() cli := appInstance.GetMasterCli() - _, err := cli.PushProxyInfo(ctx, &pb.PushProxyInfoReq{ + _, err := cli.Call().PushProxyInfo(ctx, &pb.PushProxyInfoReq{ Base: &pb.ServerBase{ ServerId: serverID, ServerSecret: serverSecret, diff --git a/biz/server/stream_log.go b/biz/server/stream_log.go index f164a51..b23f41c 100644 --- a/biz/server/stream_log.go +++ b/biz/server/stream_log.go @@ -3,11 +3,11 @@ package server import ( "context" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/biz/common" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" "github.com/VaalaCat/frp-panel/utils" - "github.com/sirupsen/logrus" + "github.com/VaalaCat/frp-panel/utils/logger" ) func StartSteamLogHandler(ctx *app.Context, req *pb.CommonRequest) (*pb.CommonResponse, error) { @@ -22,10 +22,10 @@ func initStreamLog(ctx *app.Context, h app.StreamLogHookMgr) { clientID := ctx.GetApp().GetConfig().Client.ID clientSecret := ctx.GetApp().GetConfig().Client.Secret - handler, err := ctx.GetApp().GetClientRPCHandler().GetCli().PushServerStreamLog( + handler, err := ctx.GetApp().GetClientRPCHandler().GetCli().Call().PushServerStreamLog( context.Background()) if err != nil { - logrus.Error(err) + logger.Logger(ctx).Error(err) } h.AddStream(func(msg string) { diff --git a/biz/server/update_tunnel.go b/biz/server/update_tunnel.go index 4905e91..f97cca0 100644 --- a/biz/server/update_tunnel.go +++ b/biz/server/update_tunnel.go @@ -4,11 +4,11 @@ import ( "context" "reflect" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" "github.com/VaalaCat/frp-panel/services/server" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" ) func UpdateFrpsHander(ctx *app.Context, req *pb.UpdateFRPSRequest) (*pb.UpdateFRPSResponse, error) { diff --git a/cmd/frpp/client.go b/cmd/frpp/client.go index 1afb5aa..9c0f4ab 100644 --- a/cmd/frpp/client.go +++ b/cmd/frpp/client.go @@ -3,70 +3,81 @@ package main import ( "context" - "github.com/VaalaCat/frp-panel/app" bizclient "github.com/VaalaCat/frp-panel/biz/client" + "github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/defs" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/services/app" "github.com/VaalaCat/frp-panel/services/rpcclient" - "github.com/VaalaCat/frp-panel/tunnel" - "github.com/VaalaCat/frp-panel/utils" - "github.com/VaalaCat/frp-panel/watcher" + "github.com/VaalaCat/frp-panel/services/tunnel" + "github.com/VaalaCat/frp-panel/services/watcher" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/fatedier/golib/crypto" - "github.com/sirupsen/logrus" "github.com/sourcegraph/conc" + "go.uber.org/fx" ) -func runClient(appInstance app.Application) { +type runClientParam struct { + fx.In + + Lc fx.Lifecycle + + Ctx *app.Context + AppInstance app.Application + TaskManager watcher.Client `name:"clientTaskManager"` + Cfg conf.Config +} + +func runClient(param runClientParam) { var ( - c = context.Background() - clientID = appInstance.GetConfig().Client.ID - clientSecret = appInstance.GetConfig().Client.Secret + ctx = param.Ctx + clientID = param.AppInstance.GetConfig().Client.ID + clientSecret = param.AppInstance.GetConfig().Client.Secret + appInstance = param.AppInstance ) - crypto.DefaultSalt = appInstance.GetConfig().App.Secret - logger.Logger(c).Infof("start to run client") + crypto.DefaultSalt = param.AppInstance.GetConfig().App.Secret + logger.Logger(ctx).Infof("start to run client") if len(clientSecret) == 0 { - logrus.Fatal("client secret cannot be empty") + logger.Logger(ctx).Fatal("client secret cannot be empty") } if len(clientID) == 0 { - logrus.Fatal("client id cannot be empty") + logger.Logger(ctx).Fatal("client id cannot be empty") } - cred, err := utils.TLSClientCertNoValidate(rpc.GetClientCert( - appInstance, - clientID, clientSecret, pb.ClientType_CLIENT_TYPE_FRPC)) - if err != nil { - logrus.Fatal(err) - } - - appInstance.SetClientCred(cred) - appInstance.SetMasterCli(rpc.NewMasterCli(appInstance)) - appInstance.SetClientController(tunnel.NewClientController()) - - r := rpcclient.NewClientRPCHandler( - appInstance, - clientID, - clientSecret, - pb.Event_EVENT_REGISTER_CLIENT, - bizclient.HandleServerMessage, - ) - appInstance.SetClientRPCHandler(r) - - w := watcher.NewClient() - w.AddDurationTask(defs.PullConfigDuration, + param.TaskManager.AddDurationTask(defs.PullConfigDuration, bizclient.PullConfig, appInstance, clientID, clientSecret) - initClientOnce(appInstance, clientID, clientSecret) - - defer w.Stop() - defer r.Stop() - var wg conc.WaitGroup - wg.Go(r.Run) - wg.Go(w.Run) - wg.Wait() + param.Lc.Append(fx.Hook{ + OnStart: func(ctx context.Context) error { + appInstance.SetRPCCred(NewClientCred(appInstance)) + appInstance.SetMasterCli(NewClientMasterCli(appInstance)) + appInstance.SetClientController(tunnel.NewClientController()) + + cliRpcHandler := rpcclient.NewClientRPCHandler( + appInstance, + clientID, + clientSecret, + pb.Event_EVENT_REGISTER_CLIENT, + bizclient.HandleServerMessage, + ) + appInstance.SetClientRPCHandler(cliRpcHandler) + + initClientOnce(appInstance, clientID, clientSecret) + + wg.Go(cliRpcHandler.Run) + wg.Go(param.TaskManager.Run) + return nil + }, + OnStop: func(ctx context.Context) error { + param.TaskManager.Stop() + appInstance.GetClientRPCHandler().Stop() + + wg.Wait() + return nil + }, + }) } func initClientOnce(appInstance app.Application, clientID, clientSecret string) { diff --git a/cmd/frpp/cmd.go b/cmd/frpp/cmd.go index 9849fb4..70fee6f 100644 --- a/cmd/frpp/cmd.go +++ b/cmd/frpp/cmd.go @@ -6,162 +6,264 @@ import ( "fmt" "os" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/defs" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/rpc" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/joho/godotenv" - "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/pflag" + "go.uber.org/fx" ) -var ( - clientCmd *cobra.Command - serverCmd *cobra.Command - masterCmd *cobra.Command - rootCmd *cobra.Command -) +type CommonArgs struct { + ClientSecret *string + ClientID *string + AppSecret *string + RpcUrl *string + ApiUrl *string -func initCommand(appInstance app.Application) { - rootCmd = &cobra.Command{ - Use: "frp-panel", - Short: "frp-panel is a frp panel QwQ", - } - CmdListWithFlag := initCmdWithFlag(appInstance) - CmdListWithoutFlag := initCmdWithoutFlag(appInstance) - rootCmd.AddCommand(CmdListWithFlag...) - rootCmd.AddCommand(CmdListWithoutFlag...) + RpcHost *string + ApiHost *string + RpcPort *int + ApiPort *int + ApiScheme *string } -func initCmdWithFlag(appInstance app.Application) []*cobra.Command { - var ( - clientSecret string - clientID string - rpcHost string - apiHost string - appSecret string - rpcPort int - apiPort int - apiScheme string - joinToken string - rpcUrl string - apiUrl string +func buildCommand() *cobra.Command { + cfg := conf.NewConfig() + + return NewRootCmd( + NewMasterCmd(cfg), + NewClientCmd(cfg), + NewServerCmd(cfg), + NewJoinCmd(), + NewInstallServiceCmd(), + NewUninstallServiceCmd(), + NewStartServiceCmd(), + NewStopServiceCmd(), + NewRestartServiceCmd(), + NewVersionCmd(), ) +} - clientCmd = &cobra.Command{ - Use: "client [-s client secret] [-i client id] [-a app secret] [-t api host] [-r rpc host] [-c rpc port] [-p api port]", - Short: "run managed frpc", - Run: func(cmd *cobra.Command, args []string) { - run := func() { - patchConfig(appInstance, - apiHost, rpcHost, appSecret, - clientID, clientSecret, - apiScheme, rpcPort, apiPort, - apiUrl, rpcUrl) - runClient(appInstance) - } - if srv, err := utils.CreateSystemService(args, run); err != nil { - run() - } else { - srv.Run() - } - }, +func AddCommonFlags(commonCmd *cobra.Command) { + commonCmd.Flags().StringP("secret", "s", "", "client secret") + commonCmd.Flags().StringP("id", "i", "", "client id") + commonCmd.Flags().StringP("app", "a", "", "app secret") + commonCmd.Flags().String("rpc-url", "", "rpc url, master rpc url, scheme can be grpc/ws/wss://hostname:port") + commonCmd.Flags().String("api-url", "", "api url, master api url, scheme can be http/https://hostname:port") + + // deprecated start + commonCmd.Flags().StringP("rpc", "r", "", "deprecated, use --rpc-url instead, rpc host, canbe ip or domain") + commonCmd.Flags().StringP("api", "t", "", "deprecated, use --api-url instead, api host, canbe ip or domain") + commonCmd.Flags().IntP("rpc-port", "c", 0, "deprecated, use --rpc-url instead, rpc port, master rpc port, scheme is grpc") + commonCmd.Flags().IntP("api-port", "p", 0, "deprecated, use --api-url instead, api port, master api port, scheme is http/https") + commonCmd.Flags().StringP("api-scheme", "e", "", "deprecated, use --api-url instead, api scheme, master api scheme, scheme is http/https") + // deprecated end +} + +func GetCommonArgs(cmd *cobra.Command) CommonArgs { + var commonArgs CommonArgs + + if clientSecret, err := cmd.Flags().GetString("secret"); err == nil { + commonArgs.ClientSecret = &clientSecret } - serverCmd = &cobra.Command{ - Use: "server [-s client secret] [-i client id] [-a app secret] [-r rpc host] [-c rpc port] [-p api port]", - Short: "run managed frps", - Run: func(cmd *cobra.Command, args []string) { - run := func() { - patchConfig(appInstance, - apiHost, rpcHost, appSecret, - clientID, clientSecret, - apiScheme, rpcPort, apiPort, - apiUrl, rpcUrl) - runServer(appInstance) - } - if srv, err := utils.CreateSystemService(args, run); err != nil { - run() - } else { - srv.Run() - } - }, + if clientID, err := cmd.Flags().GetString("id"); err == nil { + commonArgs.ClientID = &clientID } + if appSecret, err := cmd.Flags().GetString("app"); err == nil { + commonArgs.AppSecret = &appSecret + } + + if rpcURL, err := cmd.Flags().GetString("rpc-url"); err == nil { + commonArgs.RpcUrl = &rpcURL + } + + if apiURL, err := cmd.Flags().GetString("api-url"); err == nil { + commonArgs.ApiUrl = &apiURL + } + + if rpcHost, err := cmd.Flags().GetString("rpc-host"); err == nil { + commonArgs.RpcHost = &rpcHost + } + + if apiHost, err := cmd.Flags().GetString("api-host"); err == nil { + commonArgs.ApiHost = &apiHost + } + + if rpcPort, err := cmd.Flags().GetInt("rpc-port"); err == nil { + commonArgs.RpcPort = &rpcPort + } + + if apiPort, err := cmd.Flags().GetInt("api-port"); err == nil { + commonArgs.ApiPort = &apiPort + } + + if apiScheme, err := cmd.Flags().GetString("api-scheme"); err == nil { + commonArgs.ApiScheme = &apiScheme + } + + return commonArgs +} + +type JoinArgs struct { + CommonArgs + JoinToken *string +} + +func NewJoinCmd() *cobra.Command { joinCmd := &cobra.Command{ Use: "join [-j join token] [-r rpc host] [-p api port] [-e api scheme]", Short: "join to master with token, save param to config", Run: func(cmd *cobra.Command, args []string) { - pullRunConfig(appInstance, - joinToken, appSecret, rpcHost, - apiScheme, rpcPort, apiPort, - clientID, apiHost, - apiUrl, rpcUrl) + commonArgs := GetCommonArgs(cmd) + joinArgs := &JoinArgs{ + CommonArgs: commonArgs, + } + if joinToken, err := cmd.Flags().GetString("join-token"); err == nil { + joinArgs.JoinToken = &joinToken + } + + appInstance := app.NewApp() + pullRunConfig(appInstance, joinArgs) }, } - clientCmd.Flags().StringVarP(&clientSecret, "secret", "s", "", "client secret") - serverCmd.Flags().StringVarP(&clientSecret, "secret", "s", "", "client secret") - clientCmd.Flags().StringVarP(&clientID, "id", "i", "", "client id") - serverCmd.Flags().StringVarP(&clientID, "id", "i", "", "client id") + joinCmd.Flags().StringP("join-token", "j", "", "your token from master") + AddCommonFlags(joinCmd) - clientCmd.Flags().StringVarP(&appSecret, "app", "a", "", "app secret") - serverCmd.Flags().StringVarP(&appSecret, "app", "a", "", "app secret") - - serverCmd.Flags().StringVar(&rpcUrl, "rpc-url", "", "rpc url, master rpc url, scheme can be grpc/ws/wss://hostname:port") - clientCmd.Flags().StringVar(&rpcUrl, "rpc-url", "", "rpc url, master rpc url, scheme can be grpc/ws/wss://hostname:port") - - serverCmd.Flags().StringVar(&apiUrl, "api-url", "", "api url, master api url, scheme can be http/https://hostname:port") - clientCmd.Flags().StringVar(&apiUrl, "api-url", "", "api url, master api url, scheme can be http/https://hostname:port") - - // deprecated start - clientCmd.Flags().StringVarP(&rpcHost, "rpc", "r", "", "deprecated, use --rpc-url instead, rpc host, canbe ip or domain") - serverCmd.Flags().StringVarP(&rpcHost, "rpc", "r", "", "deprecated, use --rpc-url instead, rpc host, canbe ip or domain") - clientCmd.Flags().StringVarP(&apiHost, "api", "t", "", "deprecated, use --api-url instead, api host, canbe ip or domain") - serverCmd.Flags().StringVarP(&apiHost, "api", "t", "", "deprecated, use --api-url instead, api host, canbe ip or domain") - clientCmd.Flags().IntVarP(&rpcPort, "rpc-port", "c", 0, "deprecated, use --rpc-url instead, rpc port, master rpc port, scheme is grpc") - serverCmd.Flags().IntVarP(&rpcPort, "rpc-port", "c", 0, "deprecated, use --rpc-url instead, rpc port, master rpc port, scheme is grpc") - clientCmd.Flags().IntVarP(&apiPort, "api-port", "p", 0, "deprecated, use --api-url instead, api port, master api port, scheme is http/https") - serverCmd.Flags().IntVarP(&apiPort, "api-port", "p", 0, "deprecated, use --api-url instead, api port, master api port, scheme is http/https") - clientCmd.Flags().StringVarP(&apiScheme, "api-scheme", "e", "", "deprecated, use --api-url instead, api scheme, master api scheme, scheme is http/https") - serverCmd.Flags().StringVarP(&apiScheme, "api-scheme", "e", "", "deprecated, use --api-url instead, api scheme, master api scheme, scheme is http/https") - joinCmd.Flags().IntVarP(&rpcPort, "rpc-port", "c", 0, "deprecated, use --rpc-url instead, rpc port, master rpc port, scheme is grpc") - joinCmd.Flags().IntVarP(&apiPort, "api-port", "p", 0, "deprecated, use --api-url instead, api port, master api port, scheme is http/https") - joinCmd.Flags().StringVarP(&rpcHost, "rpc", "r", "", "deprecated, use --rpc-url instead, rpc host, canbe ip or domain") - joinCmd.Flags().StringVarP(&apiHost, "api", "t", "", "deprecated, use --api-url instead, api host, canbe ip or domain") - joinCmd.Flags().StringVarP(&apiScheme, "api-scheme", "e", "", "deprecated, use --api-url instead, api scheme, master api scheme, scheme is http/https") - // deprecated end - - joinCmd.Flags().StringVarP(&appSecret, "app", "a", "", "app secret") - joinCmd.Flags().StringVarP(&joinToken, "join-token", "j", "", "your token from master") - joinCmd.Flags().StringVarP(&clientID, "id", "i", "", "client id") - joinCmd.Flags().StringVar(&rpcUrl, "rpc-url", "", "rpc url, master rpc url, scheme can be grpc/ws/wss://hostname:port") - joinCmd.Flags().StringVar(&apiUrl, "api-url", "", "api url, master api url, scheme can be http/https://hostname:port") - - return []*cobra.Command{clientCmd, serverCmd, joinCmd} + return joinCmd } -func initCmdWithoutFlag(appInstance app.Application) []*cobra.Command { - masterCmd = &cobra.Command{ +func NewMasterCmd(cfg conf.Config) *cobra.Command { + return &cobra.Command{ Use: "master", Short: "run frp-panel manager", Run: func(cmd *cobra.Command, args []string) { + + opts := []fx.Option{ + commonMod, + masterMod, + serverMod, + fx.Supply( + CommonArgs{}, + fx.Annotate(cfg, fx.ResultTags(`name:"originConfig"`)), + ), + fx.Provide(fx.Annotate(NewDefaultServerConfig, fx.ResultTags(`name:"defaultServerConfig"`))), + fx.Invoke(runMaster), + fx.Invoke(runServer), + } + + if !cfg.IsDebug { + opts = append(opts, fx.NopLogger) + } + run := func() { - runMaster(appInstance) + masterApp := fx.New(opts...) + masterApp.Run() + if err := masterApp.Err(); err != nil { + logger.Logger(context.Background()).Fatalf("masterApp FX Application Error: %v", err) + } + } + + if srv, err := utils.CreateSystemService(args, run); err != nil { + run() + } else { + srv.Run() + } + }, + } +} + +func NewClientCmd(cfg conf.Config) *cobra.Command { + clientCmd := &cobra.Command{ + Use: "client [-s client secret] [-i client id] [-a app secret] [-t api host] [-r rpc host] [-c rpc port] [-p api port]", + Short: "run managed frpc", + Run: func(cmd *cobra.Command, args []string) { + commonArgs := GetCommonArgs(cmd) + + opts := []fx.Option{ + clientMod, + commonMod, + fx.Supply( + commonArgs, + fx.Annotate(cfg, fx.ResultTags(`name:"originConfig"`)), + ), + fx.Invoke(runClient), + } + + if !cfg.IsDebug { + opts = append(opts, fx.NopLogger) + } + + run := func() { + clientApp := fx.New(opts...) + clientApp.Run() + if err := clientApp.Err(); err != nil { + logger.Logger(context.Background()).Fatalf("clientApp FX Application Error: %v", err) + } } if srv, err := utils.CreateSystemService(args, run); err != nil { - runMaster(appInstance) + run() } else { srv.Run() } }, } - installServiceCmd := &cobra.Command{ + AddCommonFlags(clientCmd) + + return clientCmd +} + +func NewServerCmd(cfg conf.Config) *cobra.Command { + serverCmd := &cobra.Command{ + Use: "server [-s client secret] [-i client id] [-a app secret] [-r rpc host] [-c rpc port] [-p api port]", + Short: "run managed frps", + Run: func(cmd *cobra.Command, args []string) { + commonArgs := GetCommonArgs(cmd) + opts := []fx.Option{ + serverMod, + commonMod, + fx.Supply( + commonArgs, + fx.Annotate(cfg, fx.ResultTags(`name:"originConfig"`)), + ), + fx.Invoke(runServer), + } + + if !cfg.IsDebug { + opts = append(opts, fx.NopLogger) + } + + run := func() { + serverApp := fx.New(opts...) + serverApp.Run() + if err := serverApp.Err(); err != nil { + logger.Logger(context.Background()).Fatalf("serverApp FX Application Error: %v", err) + } + } + if srv, err := utils.CreateSystemService(args, run); err != nil { + run() + } else { + srv.Run() + } + }, + } + + AddCommonFlags(serverCmd) + + return serverCmd +} + +func NewInstallServiceCmd() *cobra.Command { + return &cobra.Command{ Use: "install", Short: "install frp-panel as service", DisableFlagParsing: true, @@ -170,8 +272,10 @@ func initCmdWithoutFlag(appInstance app.Application) []*cobra.Command { utils.ControlSystemService(args, "install", func() {}) }, } +} - uninstallServiceCmd := &cobra.Command{ +func NewUninstallServiceCmd() *cobra.Command { + return &cobra.Command{ Use: "uninstall", Short: "uninstall frp-panel service", DisableFlagParsing: true, @@ -180,8 +284,10 @@ func initCmdWithoutFlag(appInstance app.Application) []*cobra.Command { utils.ControlSystemService(args, "uninstall", func() {}) }, } +} - startServiceCmd := &cobra.Command{ +func NewStartServiceCmd() *cobra.Command { + return &cobra.Command{ Use: "start", Short: "start frp-panel service", DisableFlagParsing: true, @@ -190,8 +296,10 @@ func initCmdWithoutFlag(appInstance app.Application) []*cobra.Command { utils.ControlSystemService(args, "start", func() {}) }, } +} - stopServiceCmd := &cobra.Command{ +func NewStopServiceCmd() *cobra.Command { + return &cobra.Command{ Use: "stop", Short: "stop frp-panel service", DisableFlagParsing: true, @@ -200,8 +308,10 @@ func initCmdWithoutFlag(appInstance app.Application) []*cobra.Command { utils.ControlSystemService(args, "stop", func() {}) }, } +} - restartServiceCmd := &cobra.Command{ +func NewRestartServiceCmd() *cobra.Command { + return &cobra.Command{ Use: "restart", Short: "restart frp-panel service", DisableFlagParsing: true, @@ -210,8 +320,10 @@ func initCmdWithoutFlag(appInstance app.Application) []*cobra.Command { utils.ControlSystemService(args, "restart", func() {}) }, } +} - versionCmd := &cobra.Command{ +func NewVersionCmd() *cobra.Command { + return &cobra.Command{ Use: "version", Short: "Print the version info of frp-panel", Long: `All software has versions. This is frp-panel's`, @@ -219,70 +331,60 @@ func initCmdWithoutFlag(appInstance app.Application) []*cobra.Command { fmt.Println(conf.GetVersion().String()) }, } - return []*cobra.Command{ - masterCmd, - installServiceCmd, - uninstallServiceCmd, - startServiceCmd, - stopServiceCmd, - restartServiceCmd, - versionCmd, - } } -func initLogger() { - logger.Instance().SetReportCaller(true) - logrus.SetReportCaller(true) -} - -func patchConfig(appInstance app.Application, apiHost, rpcHost, secret, clientID, clientSecret, apiScheme string, rpcPort, apiPort int, apiUrl, rpcUrl string) { +func patchConfig(appInstance app.Application, commonArgs CommonArgs) conf.Config { c := context.Background() tmpCfg := appInstance.GetConfig() - if len(rpcHost) != 0 { - tmpCfg.Master.RPCHost = rpcHost - tmpCfg.Master.APIHost = rpcHost + + if commonArgs.RpcHost != nil { + tmpCfg.Master.RPCHost = *commonArgs.RpcHost + tmpCfg.Master.APIHost = *commonArgs.RpcHost } - if len(apiHost) != 0 { - tmpCfg.Master.APIHost = apiHost + if commonArgs.ApiHost != nil { + tmpCfg.Master.APIHost = *commonArgs.ApiHost } - if len(secret) != 0 { - tmpCfg.App.Secret = secret + if commonArgs.AppSecret != nil { + tmpCfg.App.Secret = *commonArgs.AppSecret } - if rpcPort != 0 { - tmpCfg.Master.RPCPort = rpcPort + if commonArgs.RpcPort != nil { + tmpCfg.Master.RPCPort = *commonArgs.RpcPort } - if apiPort != 0 { - tmpCfg.Master.APIPort = apiPort + if commonArgs.ApiPort != nil { + tmpCfg.Master.APIPort = *commonArgs.ApiPort } - if len(apiScheme) != 0 { - tmpCfg.Master.APIScheme = apiScheme + if commonArgs.ApiScheme != nil { + tmpCfg.Master.APIScheme = *commonArgs.ApiScheme } - if len(clientID) != 0 { - tmpCfg.Client.ID = clientID + if commonArgs.ClientID != nil { + tmpCfg.Client.ID = *commonArgs.ClientID } - if len(clientSecret) != 0 { - tmpCfg.Client.Secret = clientSecret + if commonArgs.ClientSecret != nil { + tmpCfg.Client.Secret = *commonArgs.ClientSecret } - if len(apiUrl) != 0 { - tmpCfg.Client.APIUrl = apiUrl + if commonArgs.ApiUrl != nil { + tmpCfg.Client.APIUrl = *commonArgs.ApiUrl } - if len(rpcUrl) != 0 { - tmpCfg.Client.RPCUrl = rpcUrl + if commonArgs.RpcUrl != nil { + tmpCfg.Client.RPCUrl = *commonArgs.RpcUrl } - if rpcPort != 0 || apiPort != 0 || len(apiScheme) != 0 || len(rpcHost) != 0 || len(apiHost) != 0 { + if commonArgs.RpcPort != nil || commonArgs.ApiPort != nil || + commonArgs.ApiScheme != nil || + commonArgs.RpcHost != nil || commonArgs.ApiHost != nil { logger.Logger(c).Warnf("deprecatedenv configs !!! rpc host: %s, rpc port: %d, api host: %s, api port: %d, api scheme: %s", tmpCfg.Master.RPCHost, tmpCfg.Master.RPCPort, tmpCfg.Master.APIHost, tmpCfg.Master.APIPort, tmpCfg.Master.APIScheme) } logger.Logger(c).Infof("env config, api url: %s, rpc url: %s", tmpCfg.Client.APIUrl, tmpCfg.Client.RPCUrl) + return tmpCfg } -func setMasterCommandIfNonePresent() { +func setMasterCommandIfNonePresent(rootCmd *cobra.Command) { cmd, _, err := rootCmd.Find(os.Args[1:]) if err == nil && cmd.Use == rootCmd.Use && cmd.Flags().Parse(os.Args[1:]) != pflag.ErrHelp { args := append([]string{"master"}, os.Args[1:]...) @@ -290,9 +392,9 @@ func setMasterCommandIfNonePresent() { } } -func pullRunConfig(appInstance app.Application, joinToken, appSecret, rpcHost, apiScheme string, rpcPort, apiPort int, clientID, apiHost string, apiUrl, rpcUrl string) { +func pullRunConfig(appInstance app.Application, joinArgs *JoinArgs) { c := context.Background() - if err := checkPullParams(joinToken, apiHost, apiScheme, apiPort, apiUrl); err != nil { + if err := checkPullParams(joinArgs); err != nil { logger.Logger(c).Errorf("check pull params failed: %s", err.Error()) return } @@ -302,14 +404,16 @@ func pullRunConfig(appInstance app.Application, joinToken, appSecret, rpcHost, a return } - if len(clientID) == 0 { + var clientID string + + if cliID := joinArgs.ClientID; cliID == nil || len(*cliID) == 0 { clientID = utils.GetHostnameWithIP() } clientID = utils.MakeClientIDPermited(clientID) - patchConfig(appInstance, apiHost, rpcHost, appSecret, "", "", apiScheme, rpcPort, apiPort, apiUrl, rpcUrl) + patchConfig(appInstance, joinArgs.CommonArgs) - initResp, err := rpc.InitClient(appInstance, clientID, joinToken) + initResp, err := rpc.InitClient(appInstance, clientID, *joinArgs.JoinToken) if err != nil { logger.Logger(c).Errorf("init client failed: %s", err.Error()) return @@ -324,7 +428,7 @@ func pullRunConfig(appInstance app.Application, joinToken, appSecret, rpcHost, a } clientID = initResp.GetClientId() - clientResp, err := rpc.GetClient(appInstance, clientID, joinToken) + clientResp, err := rpc.GetClient(appInstance, clientID, *joinArgs.JoinToken) if err != nil { logger.Logger(c).Errorf("get client failed: %s", err.Error()) return @@ -350,11 +454,11 @@ func pullRunConfig(appInstance app.Application, joinToken, appSecret, rpcHost, a logger.Logger(c).Warnf("read env file failed, try to create: %s", err.Error()) } - envMap[defs.EnvAppSecret] = appSecret + envMap[defs.EnvAppSecret] = *joinArgs.AppSecret envMap[defs.EnvClientID] = clientID envMap[defs.EnvClientSecret] = client.GetSecret() - envMap[defs.EnvClientAPIUrl] = apiUrl - envMap[defs.EnvClientRPCUrl] = rpcUrl + envMap[defs.EnvClientAPIUrl] = *joinArgs.ApiUrl + envMap[defs.EnvClientRPCUrl] = *joinArgs.RpcUrl if err = godotenv.Write(envMap, defs.SysEnvPath); err != nil { logger.Logger(c).Errorf("write env file failed: %s", err.Error()) @@ -363,21 +467,34 @@ func pullRunConfig(appInstance app.Application, joinToken, appSecret, rpcHost, a logger.Logger(c).Infof("config saved to env file: %s, you can use `frp-panel client` without args to run client,\n\nconfig is: [%v]", defs.SysEnvPath, envMap) } -func checkPullParams(joinToken, apiHost, apiScheme string, apiPort int, apiUrl string) error { - if len(joinToken) == 0 { +func checkPullParams(joinArgs *JoinArgs) error { + if joinToken := joinArgs.JoinToken; joinToken != nil && len(*joinToken) == 0 { return errors.New("join token is empty") } - if len(apiUrl) == 0 { - if len(apiHost) == 0 { + + if apiUrl := joinArgs.ApiUrl; apiUrl == nil || len(*apiUrl) == 0 { + if apiHost := joinArgs.ApiHost; apiHost == nil || len(*apiHost) == 0 { return errors.New("api host is empty") } - if len(apiScheme) == 0 { + if apiScheme := joinArgs.ApiScheme; apiScheme == nil || len(*apiScheme) == 0 { return errors.New("api scheme is empty") } } - if apiPort == 0 { + if apiPort := joinArgs.ApiPort; apiPort == nil || *apiPort == 0 { return errors.New("api port is empty") } + return nil } + +func NewRootCmd(cmds ...*cobra.Command) *cobra.Command { + rootCmd := &cobra.Command{ + Use: "frp-panel", + Short: "frp-panel is a frp panel QwQ", + } + + rootCmd.AddCommand(cmds...) + + return rootCmd +} diff --git a/cmd/frpp/main.go b/cmd/frpp/main.go index 71ad110..642da84 100644 --- a/cmd/frpp/main.go +++ b/cmd/frpp/main.go @@ -1,30 +1,14 @@ package main import ( - "sync" - - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/biz/common" - "github.com/VaalaCat/frp-panel/biz/master/shell" - "github.com/VaalaCat/frp-panel/conf" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/spf13/cobra" ) func main() { - initLogger() + logger.InitLogger() cobra.MousetrapHelpText = "" - cfg := conf.NewConfig() - - appInstance := app.NewApp() - appInstance.SetConfig(cfg) - appInstance.SetClientsManager(rpc.NewClientsManager()) - appInstance.SetStreamLogHookMgr(&common.HookMgr{}) - appInstance.SetShellPTYMgr(shell.NewPTYMgr()) - appInstance.SetClientRecvMap(&sync.Map{}) - - initCommand(appInstance) - - setMasterCommandIfNonePresent() + rootCmd := buildCommand() + setMasterCommandIfNonePresent(rootCmd) rootCmd.Execute() } diff --git a/cmd/frpp/master.go b/cmd/frpp/master.go index abd3f8c..e9f12f3 100644 --- a/cmd/frpp/master.go +++ b/cmd/frpp/master.go @@ -2,199 +2,77 @@ package main import ( "context" - "embed" - "net/http" - "path/filepath" - "github.com/VaalaCat/frp-panel/app" - bizmaster "github.com/VaalaCat/frp-panel/biz/master" "github.com/VaalaCat/frp-panel/biz/master/auth" "github.com/VaalaCat/frp-panel/biz/master/proxy" - "github.com/VaalaCat/frp-panel/biz/master/streamlog" - bizserver "github.com/VaalaCat/frp-panel/biz/server" - "github.com/VaalaCat/frp-panel/cache" "github.com/VaalaCat/frp-panel/conf" - "github.com/VaalaCat/frp-panel/dao" - "github.com/VaalaCat/frp-panel/defs" - "github.com/VaalaCat/frp-panel/logger" - "github.com/VaalaCat/frp-panel/models" - "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/cache" "github.com/VaalaCat/frp-panel/services/master" "github.com/VaalaCat/frp-panel/services/mux" - "github.com/VaalaCat/frp-panel/services/rpcclient" - "github.com/VaalaCat/frp-panel/tunnel" - "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/services/watcher" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/VaalaCat/frp-panel/utils/wsgrpc" - "github.com/VaalaCat/frp-panel/watcher" "github.com/fatedier/golib/crypto" - "github.com/glebarez/sqlite" - "github.com/gorilla/websocket" - "github.com/sirupsen/logrus" + "github.com/gin-gonic/gin" "github.com/sourcegraph/conc" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/credentials/insecure" - "gorm.io/driver/mysql" - "gorm.io/driver/postgres" - "gorm.io/gorm" + "go.uber.org/fx" ) -//go:embed all:out -var fs embed.FS +type runMasterParam struct { + fx.In -func runMaster(appInstance app.Application) { - c := app.NewContext(context.Background(), appInstance) - cfg := appInstance.GetConfig() + Lc fx.Lifecycle + + Ctx *app.Context + AppInstance app.Application + DBManagerMgr app.DBManager + HTTPMuxServer mux.MuxServer `name:"httpMux"` + TLSMuxServer mux.MuxServer `name:"tlsMux"` + MasterRouter *gin.Engine `name:"masterRouter"` + ClientLogManager app.ClientLogManager + WsGrpcHandler gin.HandlerFunc `name:"wsGrpcHandler"` + MasterService master.MasterService `name:"wsMasterService"` + TaskManager watcher.Client `name:"masterTaskManager"` + WsListener *wsgrpc.WSListener + DefaultServerConfig conf.Config `name:"defaultServerConfig"` +} + +func runMaster(param runMasterParam) { + cfg := param.AppInstance.GetConfig() crypto.DefaultSalt = conf.MasterDefaultSalt(cfg) - appInstance.SetClientLogManager(streamlog.NewClientLogManager()) + param.AppInstance.SetClientLogManager(param.ClientLogManager) + param.MasterRouter.GET("/wsgrpc", param.WsGrpcHandler) - initDatabase(c, appInstance) - cache.InitCache(cfg) - auth.InitAuth(appInstance) - creds := dao.NewQuery(c).InitCert(conf.GetCertTemplate(cfg)) + cache.InitCache(param.AppInstance.GetConfig()) + auth.InitAuth(param.AppInstance) - router := bizmaster.NewRouter(fs, appInstance) - - lisOpt := conf.GetListener(c, cfg) - - // ---- ws grpc start ----- - wsListener := wsgrpc.NewWSListener("ws-listener", "wsgrpc", 100) - - upgrader := &websocket.Upgrader{ - CheckOrigin: func(r *http.Request) bool { return true }, - } - - router.GET("/wsgrpc", wsgrpc.GinWSHandler(wsListener, upgrader)) - // ---- ws grpc end ----- - - masterService := master.NewMasterService(appInstance, credentials.NewTLS(creds)) - server := masterService.GetServer() - muxServer := mux.NewMux(server, router, lisOpt.MuxLis, creds) - - masterH2CService := master.NewMasterService(appInstance, insecure.NewCredentials()) - serverH2c := masterH2CService.GetServer() - httpMuxServer := mux.NewMux(serverH2c, router, lisOpt.ApiLis, nil) - - tasks := watcher.NewClient() - tasks.AddCronTask("0 0 3 * * *", proxy.CollectDailyStats, appInstance) - defer tasks.Stop() + param.TaskManager.AddCronTask("0 0 3 * * *", proxy.CollectDailyStats, param.AppInstance) + defer param.TaskManager.Stop() + logger.Logger(param.Ctx).Infof("start to run master") var wg conc.WaitGroup - logger.Logger(c).Infof("start to run master") - - go func() { - wsGrpcServer := master.NewMasterService(appInstance, insecure.NewCredentials()).GetServer() - if err := wsGrpcServer.Serve(wsListener); err != nil { - logrus.Fatalf("gRPC server error: %v", err) - } - }() - wg.Go(func() { runDefaultInternalServer(appInstance) }) - wg.Go(muxServer.Run) - wg.Go(httpMuxServer.Run) - wg.Go(tasks.Run) - - wg.Wait() -} - -func initDatabase(c context.Context, appInstance app.Application) { - logger.Logger(c).Infof("start to init database, type: %s", appInstance.GetConfig().DB.Type) - mgr := models.NewDBManager(nil, appInstance.GetConfig().DB.Type) - appInstance.SetDBManager(mgr) - - if appInstance.GetConfig().IsDebug { - appInstance.GetDBManager().SetDebug(true) - } - - switch appInstance.GetConfig().DB.Type { - case "sqlite3": - if err := utils.EnsureDirectoryExists(appInstance.GetConfig().DB.DSN); err != nil { - logrus.WithError(err).Warnf("ensure directory failed, data location: [%s], keep data in current directory", - appInstance.GetConfig().DB.DSN) - tmpCfg := appInstance.GetConfig() - tmpCfg.DB.DSN = filepath.Base(appInstance.GetConfig().DB.DSN) - appInstance.SetConfig(tmpCfg) - logrus.Infof("new data location: [%s]", appInstance.GetConfig().DB.DSN) - } - - if sqlitedb, err := gorm.Open(sqlite.Open(appInstance.GetConfig().DB.DSN), &gorm.Config{}); err != nil { - logrus.Panic(err) - } else { - appInstance.GetDBManager().SetDB("sqlite3", sqlitedb) - logger.Logger(c).Infof("init database success, data location: [%s]", appInstance.GetConfig().DB.DSN) - } - case "mysql": - if mysqlDB, err := gorm.Open(mysql.Open(appInstance.GetConfig().DB.DSN), &gorm.Config{}); err != nil { - logrus.Panic(err) - } else { - appInstance.GetDBManager().SetDB("mysql", mysqlDB) - logger.Logger(c).Infof("init database success, data type: [%s]", "mysql") - } - case "postgres": - if postgresDB, err := gorm.Open(postgres.Open(appInstance.GetConfig().DB.DSN), &gorm.Config{}); err != nil { - logrus.Panic(err) - } else { - appInstance.GetDBManager().SetDB("postgres", postgresDB) - logger.Logger(c).Infof("init database success, data type: [%s]", "postgres") - } - default: - logrus.Panicf("currently unsupported database type: %s", appInstance.GetConfig().DB.Type) - } - - appInstance.GetDBManager().Init() -} - -func runDefaultInternalServer(appInstance app.Application) { - logger.Logger(context.Background()).Infof("init default internal server") - - appCtx := app.NewContext(clientCmd.Context(), appInstance) - - dao.NewQuery(appCtx).InitDefaultServer(appInstance.GetConfig().Master.APIHost) - defaultServer, err := dao.NewQuery(appCtx).GetDefaultServer() - if err != nil { - logrus.Fatal(err) - } - - cred, err := utils.TLSClientCertNoValidate(rpc.GetClientCert( - appInstance, - defaultServer.ServerID, defaultServer.ConnectSecret, pb.ClientType_CLIENT_TYPE_FRPS)) - if err != nil { - logrus.Fatal(err) - } - appInstance.SetClientCred(cred) - - appInstance.SetMasterCli(rpc.NewMasterCli(appInstance)) - appInstance.SetServerController(tunnel.NewServerController()) - - cliHandler := rpcclient.NewClientRPCHandler( - appInstance, - defaultServer.ServerID, defaultServer.ConnectSecret, - pb.Event_EVENT_REGISTER_SERVER, - bizserver.HandleServerMessage, - ) - - appInstance.SetClientRPCHandler(cliHandler) - - tmpCfg := appInstance.GetConfig() - tmpCfg.Client.ID = defaultServer.ServerID - tmpCfg.Client.Secret = defaultServer.ConnectSecret - appInstance.SetConfig(tmpCfg) - - r := cliHandler - - w := watcher.NewClient() - w.AddDurationTask(defs.PullConfigDuration, bizserver.PullConfig, appInstance, defaultServer.ServerID, defaultServer.ConnectSecret) - w.AddDurationTask(defs.PushProxyInfoDuration, bizserver.PushProxyInfo, appInstance, defaultServer.ServerID, defaultServer.ConnectSecret) - - go initServerOnce(appInstance, defaultServer.ServerID, defaultServer.ConnectSecret) - var wg conc.WaitGroup - - defer w.Stop() - defer r.Stop() - - wg.Go(w.Run) - wg.Go(r.Run) - - wg.Wait() + param.Lc.Append(fx.Hook{ + OnStart: func(ctx context.Context) error { + wg.Go(func() { + if err := param.MasterService.GetServer().Serve(param.WsListener); err != nil { + logger.Logger(param.Ctx).Fatalf("gRPC server error: %v", err) + } + }) + wg.Go(param.TLSMuxServer.Run) + wg.Go(param.HTTPMuxServer.Run) + wg.Go(param.TaskManager.Run) + return nil + }, + OnStop: func(ctx context.Context) error { + param.MasterService.GetServer().Stop() + param.TLSMuxServer.Stop() + param.HTTPMuxServer.Stop() + param.TaskManager.Stop() + wg.Wait() + return nil + }, + }) } diff --git a/cmd/frpp/modules.go b/cmd/frpp/modules.go new file mode 100644 index 0000000..7bcaad6 --- /dev/null +++ b/cmd/frpp/modules.go @@ -0,0 +1,44 @@ +package main + +import ( + "go.uber.org/fx" +) + +var ( + clientMod = fx.Module("cmd.client", fx.Provide( + fx.Annotate(NewWatcher, fx.ResultTags(`name:"clientTaskManager"`)), + )) + + serverMod = fx.Module("cmd.server", fx.Provide( + fx.Annotate(NewServerAPI, fx.ResultTags(`name:"serverApiService"`)), + fx.Annotate(NewServerRouter, fx.ResultTags(`name:"serverRouter"`)), + fx.Annotate(NewWatcher, fx.ResultTags(`name:"serverTaskManager"`)), + )) + + masterMod = fx.Module("cmd.master", fx.Provide( + NewListenerOptions, + NewDBManager, + NewWSListener, + NewMasterTLSConfig, + NewWSUpgrader, + NewFs, + NewClientLogManager, + fx.Annotate(NewWatcher, fx.ResultTags(`name:"masterTaskManager"`)), + fx.Annotate(NewMasterRouter, fx.ResultTags(`name:"masterRouter"`)), + fx.Annotate(NewHTTPMasterService, fx.ResultTags(`name:"httpMasterService"`)), + fx.Annotate(NewHTTPMasterService, fx.ResultTags(`name:"wsMasterService"`)), + fx.Annotate(NewTLSMasterService, fx.ResultTags(`name:"tlsMasterService"`)), + fx.Annotate(NewMux, fx.ResultTags(`name:"tlsMux"`)), + fx.Annotate(NewHTTPMux, fx.ResultTags(`name:"httpMux"`)), + fx.Annotate(NewWSGrpcHandler, fx.ResultTags(`name:"wsGrpcHandler"`)), + )) + + commonMod = fx.Module("common", fx.Provide( + NewPatchedConfig, + NewLogHookManager, + NewPTYManager, + NewBaseApp, + NewContext, + NewClientsManager, + )) +) diff --git a/cmd/frpp/providers.go b/cmd/frpp/providers.go new file mode 100644 index 0000000..9b7ee47 --- /dev/null +++ b/cmd/frpp/providers.go @@ -0,0 +1,278 @@ +package main + +import ( + "context" + "crypto/tls" + "embed" + "net" + "net/http" + "path/filepath" + "sync" + + bizcommon "github.com/VaalaCat/frp-panel/biz/common" + bizmaster "github.com/VaalaCat/frp-panel/biz/master" + "github.com/VaalaCat/frp-panel/biz/master/shell" + "github.com/VaalaCat/frp-panel/biz/master/streamlog" + bizserver "github.com/VaalaCat/frp-panel/biz/server" + "github.com/VaalaCat/frp-panel/conf" + "github.com/VaalaCat/frp-panel/models" + "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/api" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/services/master" + "github.com/VaalaCat/frp-panel/services/mux" + "github.com/VaalaCat/frp-panel/services/rpc" + "github.com/VaalaCat/frp-panel/services/watcher" + "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" + "github.com/VaalaCat/frp-panel/utils/wsgrpc" + "github.com/gin-gonic/gin" + "github.com/glebarez/sqlite" + "github.com/gorilla/websocket" + "go.uber.org/fx" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" + "gorm.io/driver/mysql" + "gorm.io/driver/postgres" + "gorm.io/gorm" +) + +//go:embed all:out +var fs embed.FS + +func NewLogHookManager() app.StreamLogHookMgr { + return &bizcommon.HookMgr{} +} + +func NewPTYManager() app.ShellPTYMgr { + return shell.NewPTYMgr() +} + +func NewBaseApp(param struct { + fx.In + + Cfg conf.Config `name:"originConfig"` + CliMgr app.ClientsManager + HookMgr app.StreamLogHookMgr + PtyMgr app.ShellPTYMgr +}) app.Application { + appInstance := app.NewApp() + appInstance.SetConfig(param.Cfg) + appInstance.SetClientsManager(param.CliMgr) + appInstance.SetStreamLogHookMgr(param.HookMgr) + appInstance.SetShellPTYMgr(param.PtyMgr) + appInstance.SetClientRecvMap(&sync.Map{}) + return appInstance +} + +func NewClientsManager() app.ClientsManager { + return rpc.NewClientsManager() +} + +func NewFs() embed.FS { + return fs +} + +func NewPatchedConfig(param struct { + fx.In + + AppInstance app.Application + CommonArgs CommonArgs +}) conf.Config { + patchedCfg := patchConfig(param.AppInstance, param.CommonArgs) + param.AppInstance.SetConfig(patchedCfg) + + return patchedCfg +} + +func NewContext(appInstance app.Application) *app.Context { + return app.NewContext(context.Background(), appInstance) +} + +func NewClientLogManager() app.ClientLogManager { + return streamlog.NewClientLogManager() +} + +func NewDBManager(ctx *app.Context, appInstance app.Application) app.DBManager { + logger.Logger(ctx).Infof("start to init database, type: %s", appInstance.GetConfig().DB.Type) + mgr := models.NewDBManager(nil, appInstance.GetConfig().DB.Type) + appInstance.SetDBManager(mgr) + + if appInstance.GetConfig().IsDebug { + appInstance.GetDBManager().SetDebug(true) + } + + switch appInstance.GetConfig().DB.Type { + case "sqlite3": + if err := utils.EnsureDirectoryExists(appInstance.GetConfig().DB.DSN); err != nil { + logger.Logger(ctx).WithError(err).Warnf("ensure directory failed, data location: [%s], keep data in current directory", + appInstance.GetConfig().DB.DSN) + tmpCfg := appInstance.GetConfig() + tmpCfg.DB.DSN = filepath.Base(appInstance.GetConfig().DB.DSN) + appInstance.SetConfig(tmpCfg) + logger.Logger(ctx).Infof("new data location: [%s]", appInstance.GetConfig().DB.DSN) + } + + if sqlitedb, err := gorm.Open(sqlite.Open(appInstance.GetConfig().DB.DSN), &gorm.Config{}); err != nil { + logger.Logger(ctx).Panic(err) + } else { + appInstance.GetDBManager().SetDB("sqlite3", sqlitedb) + logger.Logger(ctx).Infof("init database success, data location: [%s]", appInstance.GetConfig().DB.DSN) + } + case "mysql": + if mysqlDB, err := gorm.Open(mysql.Open(appInstance.GetConfig().DB.DSN), &gorm.Config{}); err != nil { + logger.Logger(ctx).Panic(err) + } else { + appInstance.GetDBManager().SetDB("mysql", mysqlDB) + logger.Logger(ctx).Infof("init database success, data type: [%s]", "mysql") + } + case "postgres": + if postgresDB, err := gorm.Open(postgres.Open(appInstance.GetConfig().DB.DSN), &gorm.Config{}); err != nil { + logger.Logger(ctx).Panic(err) + } else { + appInstance.GetDBManager().SetDB("postgres", postgresDB) + logger.Logger(ctx).Infof("init database success, data type: [%s]", "postgres") + } + default: + logger.Logger(ctx).Panicf("currently unsupported database type: %s", appInstance.GetConfig().DB.Type) + } + + appInstance.GetDBManager().Init() + return mgr +} + +func NewMasterTLSConfig(ctx *app.Context) *tls.Config { + return dao.NewQuery(ctx).InitCert(conf.GetCertTemplate(ctx.GetApp().GetConfig())) +} + +func NewMasterRouter(fs embed.FS, appInstance app.Application) *gin.Engine { + return bizmaster.NewRouter(fs, appInstance) +} + +func NewListenerOptions(ctx *app.Context, cfg conf.Config) conf.LisOpt { + return conf.GetListener(ctx, cfg) +} + +func NewTLSMasterService(appInstance app.Application, masterTLSConfig *tls.Config) master.MasterService { + return master.NewMasterService(appInstance, credentials.NewTLS(masterTLSConfig)) +} + +func NewHTTPMasterService(appInstance app.Application) master.MasterService { + return master.NewMasterService(appInstance, insecure.NewCredentials()) +} + +func NewServerMasterCli(appInstance app.Application) app.MasterClient { + return rpc.NewMasterCli(appInstance) +} + +func NewClientMasterCli(appInstance app.Application) app.MasterClient { + return rpc.NewMasterCli(appInstance) +} + +func NewMux(param struct { + fx.In + + MasterService master.MasterService `name:"tlsMasterService"` + Router *gin.Engine `name:"masterRouter"` + LisOpt conf.LisOpt + TLSCfg *tls.Config +}) mux.MuxServer { + return mux.NewMux(param.MasterService.GetServer(), param.Router, param.LisOpt.MuxLis, param.TLSCfg) +} + +func NewHTTPMux(param struct { + fx.In + + MasterService master.MasterService `name:"httpMasterService"` + Router *gin.Engine `name:"masterRouter"` + LisOpt conf.LisOpt +}) mux.MuxServer { + return mux.NewMux(param.MasterService.GetServer(), param.Router, param.LisOpt.ApiLis, nil) +} + +func NewWatcher() watcher.Client { + return watcher.NewClient() +} + +func NewWSListener(ctx *app.Context, cfg conf.Config) *wsgrpc.WSListener { + return wsgrpc.NewWSListener("ws-listener", "wsgrpc", 100) +} + +func NewWSGrpcHandler(ctx *app.Context, ws *wsgrpc.WSListener, upgrader *websocket.Upgrader) gin.HandlerFunc { + return wsgrpc.GinWSHandler(ws, upgrader) +} + +func NewWSUpgrader(ctx *app.Context, cfg conf.Config) *websocket.Upgrader { + return &websocket.Upgrader{ + CheckOrigin: func(r *http.Request) bool { return true }, + } +} + +func NewServerRouter(appInstance app.Application) *gin.Engine { + return bizserver.NewRouter(appInstance) +} + +func NewServerAPI(param struct { + fx.In + Ctx *app.Context + ServerRouter *gin.Engine `name:"serverRouter"` +}) app.Service { + l, err := net.Listen("tcp", conf.ServerAPIListenAddr(param.Ctx.GetApp().GetConfig())) + if err != nil { + logger.Logger(param.Ctx).WithError(err).Fatalf("failed to listen addr: %v", conf.ServerAPIListenAddr(param.Ctx.GetApp().GetConfig())) + return nil + } + + return api.NewApiService(l, param.ServerRouter, true) +} + +func NewServerCred(appInstance app.Application) credentials.TransportCredentials { + cfg := appInstance.GetConfig() + clientID := cfg.Client.ID + clientSecret := cfg.Client.Secret + ctx := context.Background() + + cred, err := utils.TLSClientCertNoValidate(rpc.GetClientCert(appInstance, clientID, clientSecret, pb.ClientType_CLIENT_TYPE_FRPS)) + if err != nil { + logger.Logger(ctx).WithError(err).Fatal("new tls client cert failed") + } + logger.Logger(ctx).Infof("new tls server cert success") + + return cred +} + +func NewClientCred(appInstance app.Application) credentials.TransportCredentials { + cfg := appInstance.GetConfig() + clientID := cfg.Client.ID + clientSecret := cfg.Client.Secret + ctx := context.Background() + + cred, err := utils.TLSClientCertNoValidate(rpc.GetClientCert(appInstance, clientID, clientSecret, pb.ClientType_CLIENT_TYPE_FRPC)) + if err != nil { + logger.Logger(ctx).WithError(err).Fatal("new tls client cert failed") + } + logger.Logger(ctx).Infof("new tls client cert success") + + return cred +} + +func NewDefaultServerConfig(ctx *app.Context) conf.Config { + appInstance := ctx.GetApp() + + logger.Logger(ctx).Infof("init default internal server") + + dao.NewQuery(ctx).InitDefaultServer(appInstance.GetConfig().Master.APIHost) + defaultServer, err := dao.NewQuery(ctx).GetDefaultServer() + + if err != nil { + logger.Logger(ctx).WithError(err).Fatal("get default server failed") + } + + tmpCfg := appInstance.GetConfig() + tmpCfg.Client.ID = defaultServer.ServerID + tmpCfg.Client.Secret = defaultServer.ConnectSecret + appInstance.SetConfig(tmpCfg) + + return tmpCfg +} diff --git a/cmd/frpp/server.go b/cmd/frpp/server.go index fff385d..6674f51 100644 --- a/cmd/frpp/server.go +++ b/cmd/frpp/server.go @@ -2,82 +2,88 @@ package main import ( "context" - "net" - "github.com/VaalaCat/frp-panel/app" bizserver "github.com/VaalaCat/frp-panel/biz/server" "github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/defs" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" - "github.com/VaalaCat/frp-panel/services/api" + "github.com/VaalaCat/frp-panel/services/app" "github.com/VaalaCat/frp-panel/services/rpcclient" - "github.com/VaalaCat/frp-panel/tunnel" - "github.com/VaalaCat/frp-panel/utils" - "github.com/VaalaCat/frp-panel/watcher" + "github.com/VaalaCat/frp-panel/services/tunnel" + "github.com/VaalaCat/frp-panel/services/watcher" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/fatedier/golib/crypto" - "github.com/sirupsen/logrus" "github.com/sourcegraph/conc" + "go.uber.org/fx" ) -func runServer(appInstance app.Application) { +type runServerParam struct { + fx.In + + Lc fx.Lifecycle + + AppInstance app.Application + AppCtx *app.Context + ServerApiService app.Service `name:"serverApiService"` + TaskManager watcher.Client `name:"serverTaskManager"` + Cfg conf.Config +} + +func runServer(param runServerParam) { var ( c = context.Background() - clientID = appInstance.GetConfig().Client.ID - clientSecret = appInstance.GetConfig().Client.Secret - cfg = appInstance.GetConfig() + clientID = param.AppInstance.GetConfig().Client.ID + clientSecret = param.AppInstance.GetConfig().Client.Secret + cfg = param.AppInstance.GetConfig() + appInstance = param.AppInstance + ctx = param.AppCtx ) + crypto.DefaultSalt = cfg.App.Secret - logger.Logger(c).Infof("start to run server") + logger.Logger(c).Infof("start to init server") if len(clientID) == 0 { - logrus.Fatal("client id cannot be empty") + logger.Logger(ctx).Fatal("client id cannot be empty") } - l, err := net.Listen("tcp", conf.ServerAPIListenAddr(cfg)) - if err != nil { - logger.Logger(c).WithError(err).Fatalf("failed to listen addr: %v", conf.ServerAPIListenAddr(cfg)) - return - } - - a := api.NewApiService(l, bizserver.NewRouter(appInstance), true) - defer a.Stop() - - cred, err := utils.TLSClientCertNoValidate(rpc.GetClientCert(appInstance, clientID, clientSecret, pb.ClientType_CLIENT_TYPE_FRPS)) - if err != nil { - logrus.Fatal(err) - } - appInstance.SetClientCred(cred) - - appInstance.SetMasterCli(rpc.NewMasterCli(appInstance)) - appInstance.SetServerController(tunnel.NewServerController()) - - cliHandler := rpcclient.NewClientRPCHandler( - appInstance, - clientID, - clientSecret, - pb.Event_EVENT_REGISTER_SERVER, - bizserver.HandleServerMessage, - ) - - appInstance.SetClientRPCHandler(cliHandler) - - r := cliHandler - defer r.Stop() - - w := watcher.NewClient() - w.AddDurationTask(defs.PullConfigDuration, bizserver.PullConfig, clientID, clientSecret) - w.AddDurationTask(defs.PushProxyInfoDuration, bizserver.PushProxyInfo, clientID, clientSecret) - defer w.Stop() - - initServerOnce(appInstance, clientID, clientSecret) + param.TaskManager.AddDurationTask(defs.PullConfigDuration, bizserver.PullConfig, appInstance, clientID, clientSecret) + param.TaskManager.AddDurationTask(defs.PushProxyInfoDuration, bizserver.PushProxyInfo, appInstance, clientID, clientSecret) var wg conc.WaitGroup - wg.Go(r.Run) - wg.Go(w.Run) - wg.Go(a.Run) - wg.Wait() + + param.Lc.Append(fx.Hook{ + OnStart: func(ctx context.Context) error { + logger.Logger(ctx).Infof("start to run server, serverID: [%s]", clientID) + appInstance.SetRPCCred(NewServerCred(appInstance)) + appInstance.SetMasterCli(NewServerMasterCli(appInstance)) + + cliHandler := rpcclient.NewClientRPCHandler( + appInstance, + clientID, + clientSecret, + pb.Event_EVENT_REGISTER_SERVER, + bizserver.HandleServerMessage, + ) + + appInstance.SetClientRPCHandler(cliHandler) + appInstance.SetServerController(tunnel.NewServerController()) + + go initServerOnce(appInstance, clientID, clientSecret) + wg.Go(cliHandler.Run) + wg.Go(param.TaskManager.Run) + wg.Go(param.ServerApiService.Run) + return nil + }, + OnStop: func(ctx context.Context) error { + param.TaskManager.Stop() + appInstance.GetClientRPCHandler().Stop() + param.ServerApiService.Stop() + wg.Wait() + return nil + }, + }) + + logger.Logger(ctx).Infof("server started successfully, serverID: [%s]", clientID) } func initServerOnce(appInstance app.Application, clientID, clientSecret string) { diff --git a/cmd/frpp/test.go b/cmd/frpp/test.go index d23f4bc..9f38051 100644 --- a/cmd/frpp/test.go +++ b/cmd/frpp/test.go @@ -11,7 +11,7 @@ package main // Data: []byte(fmt.Sprint(cnt)), // }) // if string(resp.Data) != fmt.Sprint(cnt) { -// logrus.Panicf("resp: %+v", resp) +// logger.Logger(ctx).Panicf("resp: %+v", resp) // } // }) // } diff --git a/cmd/frppc/client.go b/cmd/frppc/client.go index a7aa2bf..e3e728d 100644 --- a/cmd/frppc/client.go +++ b/cmd/frppc/client.go @@ -3,18 +3,17 @@ package main import ( "context" - "github.com/VaalaCat/frp-panel/app" bizclient "github.com/VaalaCat/frp-panel/biz/client" "github.com/VaalaCat/frp-panel/defs" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/rpc" "github.com/VaalaCat/frp-panel/services/rpcclient" - "github.com/VaalaCat/frp-panel/tunnel" + "github.com/VaalaCat/frp-panel/services/tunnel" + "github.com/VaalaCat/frp-panel/services/watcher" "github.com/VaalaCat/frp-panel/utils" - "github.com/VaalaCat/frp-panel/watcher" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/fatedier/golib/crypto" - "github.com/sirupsen/logrus" "github.com/sourcegraph/conc" ) @@ -23,23 +22,24 @@ func runClient(appInstance app.Application) { c = context.Background() clientID = appInstance.GetConfig().Client.ID clientSecret = appInstance.GetConfig().Client.Secret + ctx = context.Background() ) crypto.DefaultSalt = appInstance.GetConfig().App.Secret logger.Logger(c).Infof("start to run client") if len(clientSecret) == 0 { - logrus.Fatal("client secret cannot be empty") + logger.Logger(ctx).Fatal("client secret cannot be empty") } if len(clientID) == 0 { - logrus.Fatal("client id cannot be empty") + logger.Logger(ctx).Fatal("client id cannot be empty") } cred, err := utils.TLSClientCertNoValidate(rpc.GetClientCert(appInstance, clientID, clientSecret, pb.ClientType_CLIENT_TYPE_FRPC)) if err != nil { - logrus.Fatal(err) + logger.Logger(ctx).Fatal(err) } - appInstance.SetClientCred(cred) + appInstance.SetRPCCred(cred) appInstance.SetMasterCli(rpc.NewMasterCli(appInstance)) appInstance.SetClientController(tunnel.NewClientController()) diff --git a/cmd/frppc/cmd.go b/cmd/frppc/cmd.go index 8631dab..db73e8f 100644 --- a/cmd/frppc/cmd.go +++ b/cmd/frppc/cmd.go @@ -6,15 +6,14 @@ import ( "fmt" "os" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/defs" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/rpc" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/joho/godotenv" - "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/pflag" ) @@ -180,11 +179,6 @@ func initCmdWithoutFlag(appInstance app.Application) []*cobra.Command { } } -func initLogger() { - logger.Instance().SetReportCaller(true) - logrus.SetReportCaller(true) -} - func patchConfig(appInstance app.Application, apiHost, rpcHost, secret, clientID, clientSecret, apiScheme string, rpcPort, apiPort int, apiUrl, rpcUrl string) { c := context.Background() tmpCfg := appInstance.GetConfig() diff --git a/cmd/frppc/main.go b/cmd/frppc/main.go index 71ad110..6ec2361 100644 --- a/cmd/frppc/main.go +++ b/cmd/frppc/main.go @@ -3,16 +3,17 @@ package main import ( "sync" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/biz/common" "github.com/VaalaCat/frp-panel/biz/master/shell" "github.com/VaalaCat/frp-panel/conf" - "github.com/VaalaCat/frp-panel/rpc" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/rpc" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/spf13/cobra" ) func main() { - initLogger() + logger.InitLogger() cobra.MousetrapHelpText = "" cfg := conf.NewConfig() diff --git a/conf/helper.go b/conf/helper.go index 7f7fc67..ca1d1e2 100644 --- a/conf/helper.go +++ b/conf/helper.go @@ -11,8 +11,8 @@ import ( "time" "github.com/VaalaCat/frp-panel/defs" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" v1 "github.com/fatedier/frp/pkg/config/v1" ) diff --git a/conf/settings.go b/conf/settings.go index c1a47ff..c7a7206 100644 --- a/conf/settings.go +++ b/conf/settings.go @@ -6,10 +6,10 @@ import ( "os" "github.com/VaalaCat/frp-panel/defs" - "github.com/VaalaCat/frp-panel/logger" + "github.com/VaalaCat/frp-panel/utils/logger" + "github.com/gin-gonic/gin" "github.com/ilyakaznacheev/cleanenv" "github.com/joho/godotenv" - "github.com/sirupsen/logrus" ) type Config struct { @@ -77,15 +77,19 @@ func NewConfig() Config { } if !useEnvFile { - logrus.Info("use runtime env variables") + logger.Logger(ctx).Info("use runtime env variables") } cfg := Config{} if err = cleanenv.ReadEnv(&cfg); err != nil { - logrus.Panic(err) + logger.Logger(ctx).Panic(err) } cfg.Complete() + if !cfg.IsDebug { + gin.SetMode(gin.ReleaseMode) + } + return cfg } diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..5e46596 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1 @@ +cache \ No newline at end of file diff --git a/go.mod b/go.mod index 8b00a35..b095e8e 100644 --- a/go.mod +++ b/go.mod @@ -28,9 +28,10 @@ require ( github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 github.com/tiendc/go-deepcopy v1.2.0 + go.uber.org/fx v1.23.0 golang.org/x/crypto v0.31.0 golang.org/x/net v0.33.0 - google.golang.org/grpc v1.65.0 + google.golang.org/grpc v1.67.1 google.golang.org/protobuf v1.35.2 gorm.io/driver/mysql v1.5.2 gorm.io/driver/postgres v1.5.4 @@ -105,6 +106,7 @@ require ( github.com/refraction-networking/utls v1.6.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/robfig/cron/v3 v3.0.1 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/stretchr/testify v1.9.0 // indirect github.com/templexxx/cpu v0.1.1 // indirect @@ -116,19 +118,20 @@ require ( github.com/ugorji/go/codec v1.2.11 // indirect github.com/xtaci/kcp-go/v5 v5.6.13 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - go.uber.org/atomic v1.7.0 // indirect + go.uber.org/dig v1.18.1 // indirect go.uber.org/mock v0.4.0 // indirect - go.uber.org/multierr v1.9.0 // indirect + go.uber.org/multierr v1.10.0 // indirect + go.uber.org/zap v1.26.0 // indirect golang.org/x/arch v0.3.0 // indirect golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc // indirect golang.org/x/mod v0.17.0 // indirect - golang.org/x/oauth2 v0.20.0 // indirect + golang.org/x/oauth2 v0.22.0 // indirect golang.org/x/sync v0.10.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index c6566ae..bdbe421 100644 --- a/go.sum +++ b/go.sum @@ -225,8 +225,8 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94 github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/samber/lo v1.39.0 h1:4gTz1wUhNYLhFSKl6O+8peW0v2F4BCY034GRpU9WnuA= github.com/samber/lo v1.39.0/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= @@ -282,14 +282,18 @@ github.com/xtaci/lossyconn v0.0.0-20200209145036-adba10fffc37/go.mod h1:HpMP7DB2 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/dig v1.18.1 h1:rLww6NuajVjeQn+49u5NcezUJEGwd5uXmyoCKW2g5Es= +go.uber.org/dig v1.18.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= +go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg= +go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= -go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= @@ -327,8 +331,8 @@ golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= +golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -391,14 +395,14 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d h1:JU0iKnSg02Gmb5ZdV8nYsKEKsP6o/FGVWTrw4i1DA9A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/middleware/auth.go b/middleware/auth.go index 68335f8..d557871 100644 --- a/middleware/auth.go +++ b/middleware/auth.go @@ -1,13 +1,13 @@ package middleware import ( - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/defs" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/models" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/gin-gonic/gin" ) diff --git a/middleware/jwt.go b/middleware/jwt.go index af0ee88..ba31476 100644 --- a/middleware/jwt.go +++ b/middleware/jwt.go @@ -5,12 +5,12 @@ import ( "strings" "time" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/defs" - "github.com/VaalaCat/frp-panel/logger" + "github.com/VaalaCat/frp-panel/services/app" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt/v5" ) diff --git a/models/db.go b/models/db.go index 22801f8..c1ec611 100644 --- a/models/db.go +++ b/models/db.go @@ -3,7 +3,7 @@ package models import ( "context" - "github.com/VaalaCat/frp-panel/logger" + "github.com/VaalaCat/frp-panel/utils/logger" "gorm.io/gorm" ) diff --git a/models/helper.go b/models/helper.go index 1da853e..f09b15b 100644 --- a/models/helper.go +++ b/models/helper.go @@ -5,8 +5,8 @@ import ( "encoding/json" "errors" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" v1 "github.com/fatedier/frp/pkg/config/v1" "github.com/tiendc/go-deepcopy" ) diff --git a/app/app_impl.go b/services/app/app_impl.go similarity index 89% rename from app/app_impl.go rename to services/app/app_impl.go index 56bb875..5bfa69b 100644 --- a/app/app_impl.go +++ b/services/app/app_impl.go @@ -4,13 +4,12 @@ import ( "sync" "github.com/VaalaCat/frp-panel/conf" - "github.com/VaalaCat/frp-panel/pb" "google.golang.org/grpc/credentials" ) type application struct { streamLogHookMgr StreamLogHookMgr - masterCli pb.MasterClient + masterCli MasterClient shellPTYMgr ShellPTYMgr clientLogManager ClientLogManager @@ -21,13 +20,18 @@ type application struct { clientsManager ClientsManager serverHandler ServerHandler serverController ServerController - clientCred credentials.TransportCredentials + rpcCred credentials.TransportCredentials conf conf.Config } // GetClientCred implements Application. -func (a *application) GetClientCred() credentials.TransportCredentials { - return a.clientCred +func (a *application) GetRPCCred() credentials.TransportCredentials { + return a.rpcCred +} + +// SetClientCred implements Application. +func (a *application) SetRPCCred(cred credentials.TransportCredentials) { + a.rpcCred = cred } // GetConfig implements Application. @@ -35,11 +39,6 @@ func (a *application) GetConfig() conf.Config { return a.conf } -// SetClientCred implements Application. -func (a *application) SetClientCred(cred credentials.TransportCredentials) { - a.clientCred = cred -} - // SetConfig implements Application. func (a *application) SetConfig(c conf.Config) { a.conf = c @@ -86,12 +85,12 @@ func (a *application) SetClientRPCHandler(clientRPCHandler ClientRPCHandler) { } // GetMasterCli implements Application. -func (a *application) GetMasterCli() pb.MasterClient { +func (a *application) GetMasterCli() MasterClient { return a.masterCli } // SetMasterCli implements Application. -func (a *application) SetMasterCli(masterCli pb.MasterClient) { +func (a *application) SetMasterCli(masterCli MasterClient) { a.masterCli = masterCli } diff --git a/app/application.go b/services/app/application.go similarity index 89% rename from app/application.go rename to services/app/application.go index bb5b3b1..4312c8e 100644 --- a/app/application.go +++ b/services/app/application.go @@ -5,7 +5,6 @@ import ( "sync" "github.com/VaalaCat/frp-panel/conf" - "github.com/VaalaCat/frp-panel/pb" "github.com/gin-gonic/gin" "google.golang.org/grpc/credentials" ) @@ -23,8 +22,8 @@ type Application interface { SetClientRecvMap(*sync.Map) GetClientsManager() ClientsManager SetClientsManager(ClientsManager) - GetMasterCli() pb.MasterClient - SetMasterCli(pb.MasterClient) + GetMasterCli() MasterClient + SetMasterCli(MasterClient) GetClientRPCHandler() ClientRPCHandler SetClientRPCHandler(ClientRPCHandler) GetServerHandler() ServerHandler @@ -35,8 +34,8 @@ type Application interface { SetServerController(ServerController) GetConfig() conf.Config SetConfig(conf.Config) - GetClientCred() credentials.TransportCredentials - SetClientCred(credentials.TransportCredentials) + GetRPCCred() credentials.TransportCredentials + SetRPCCred(credentials.TransportCredentials) } type Context struct { diff --git a/app/helper.go b/services/app/helper.go similarity index 97% rename from app/helper.go rename to services/app/helper.go index 3b89519..d7d47a0 100644 --- a/app/helper.go +++ b/services/app/helper.go @@ -5,8 +5,8 @@ import ( "fmt" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/gin-gonic/gin" "google.golang.org/protobuf/proto" ) diff --git a/app/provider.go b/services/app/provider.go similarity index 97% rename from app/provider.go rename to services/app/provider.go index d2b29bc..d652fc1 100644 --- a/app/provider.go +++ b/services/app/provider.go @@ -114,7 +114,7 @@ type ClientHandler interface { type ClientRPCHandler interface { Run() Stop() - GetCli() pb.MasterClient + GetCli() MasterClient } type ClientController interface { @@ -152,3 +152,8 @@ type ServerHandler interface { GetMem() *mem.ServerStats GetProxyStatsByType(v1.ProxyType) []*mem.ProxyStats } + +// rpc/master.go +type MasterClient interface { + Call() pb.MasterClient +} diff --git a/cache/freecache.go b/services/cache/freecache.go similarity index 90% rename from cache/freecache.go rename to services/cache/freecache.go index 8cb615b..dbcb554 100644 --- a/cache/freecache.go +++ b/services/cache/freecache.go @@ -4,7 +4,7 @@ import ( "context" "github.com/VaalaCat/frp-panel/conf" - "github.com/VaalaCat/frp-panel/logger" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/coocood/freecache" ) diff --git a/services/client/frpc_service.go b/services/client/frpc_service.go index 4fa89da..733ba1b 100644 --- a/services/client/frpc_service.go +++ b/services/client/frpc_service.go @@ -7,9 +7,9 @@ import ( "syscall" "time" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/logger" + "github.com/VaalaCat/frp-panel/services/app" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/fatedier/frp/client" "github.com/fatedier/frp/client/proxy" v1 "github.com/fatedier/frp/pkg/config/v1" diff --git a/dao/cert.go b/services/dao/cert.go similarity index 89% rename from dao/cert.go rename to services/dao/cert.go index 488072f..106415a 100644 --- a/dao/cert.go +++ b/services/dao/cert.go @@ -2,6 +2,7 @@ package dao import ( "bytes" + "context" "crypto/rand" "crypto/rsa" "crypto/tls" @@ -10,22 +11,23 @@ import ( "github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/utils" - "github.com/sirupsen/logrus" + "github.com/VaalaCat/frp-panel/utils/logger" ) func (q *queryImpl) InitCert(template *x509.Certificate) *tls.Config { + ctx := context.Background() var ( certPem []byte keyPem []byte ) cnt, err := q.CountCerts() if err != nil { - logrus.Fatal(err) + logger.Logger(ctx).Fatal(err) } if cnt == 0 { certPem, keyPem, err = GenX509Info(template) if err != nil { - logrus.Fatal(err) + logger.Logger(ctx).Fatal(err) } if err = q.ctx.GetApp().GetDBManager().GetDefaultDB().Create(&models.Cert{ Name: "default", @@ -33,18 +35,18 @@ func (q *queryImpl) InitCert(template *x509.Certificate) *tls.Config { CaFile: certPem, KeyFile: keyPem, }).Error; err != nil { - logrus.Fatal(err) + logger.Logger(ctx).Fatal(err) } } else { keyPem, certPem, err = q.GetDefaultKeyPair() if err != nil { - logrus.Fatal(err) + logger.Logger(ctx).Fatal(err) } } resp, err := utils.TLSServerCert(certPem, keyPem) if err != nil { - logrus.Fatal(err) + logger.Logger(ctx).Fatal(err) } return resp } diff --git a/dao/client.go b/services/dao/client.go similarity index 100% rename from dao/client.go rename to services/dao/client.go diff --git a/dao/proxy.go b/services/dao/proxy.go similarity index 99% rename from dao/proxy.go rename to services/dao/proxy.go index 2289092..ff251c5 100644 --- a/dao/proxy.go +++ b/services/dao/proxy.go @@ -6,10 +6,10 @@ import ( "strings" "time" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/pb" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/samber/lo" "github.com/sourcegraph/conc/pool" "gorm.io/gorm" diff --git a/dao/query.go b/services/dao/query.go similarity index 76% rename from dao/query.go rename to services/dao/query.go index cfdb6ea..98878c1 100644 --- a/dao/query.go +++ b/services/dao/query.go @@ -1,6 +1,6 @@ package dao -import "github.com/VaalaCat/frp-panel/app" +import "github.com/VaalaCat/frp-panel/services/app" type Query interface{} diff --git a/dao/server.go b/services/dao/server.go similarity index 100% rename from dao/server.go rename to services/dao/server.go diff --git a/dao/stats.go b/services/dao/stats.go similarity index 100% rename from dao/stats.go rename to services/dao/stats.go diff --git a/dao/user.go b/services/dao/user.go similarity index 100% rename from dao/user.go rename to services/dao/user.go diff --git a/services/master/grpc_server.go b/services/master/grpc_server.go index b37a461..335649e 100644 --- a/services/master/grpc_server.go +++ b/services/master/grpc_server.go @@ -6,18 +6,17 @@ import ( "io" "net" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/biz/master/client" masterserver "github.com/VaalaCat/frp-panel/biz/master/server" "github.com/VaalaCat/frp-panel/biz/master/shell" "github.com/VaalaCat/frp-panel/biz/master/streamlog" "github.com/VaalaCat/frp-panel/conf" - "github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/defs" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" - "github.com/VaalaCat/frp-panel/rpc" - "github.com/sirupsen/logrus" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/services/dao" + "github.com/VaalaCat/frp-panel/services/rpc" + "github.com/VaalaCat/frp-panel/utils/logger" "google.golang.org/grpc" "google.golang.org/grpc/credentials" ) @@ -38,14 +37,16 @@ func newRpcServer(appInstance app.Application, creds credentials.TransportCreden } func runRpcServer(appInstance app.Application, s *grpc.Server) { + ctx := context.Background() + lis, err := net.Listen("tcp", conf.RPCListenAddr(appInstance.GetConfig())) if err != nil { - logrus.Fatalf("rpc server failed to listen: %v", err) + logger.Logger(ctx).Fatalf("rpc server failed to listen: %v", err) } - logrus.Infof("start server") + logger.Logger(ctx).Infof("start server") if err := s.Serve(lis); err != nil { - logrus.Fatalf("failed to serve: %v", err) + logger.Logger(ctx).Fatalf("failed to serve: %v", err) } } diff --git a/services/master/grpc_service.go b/services/master/grpc_service.go index 64b2c1c..642810a 100644 --- a/services/master/grpc_service.go +++ b/services/master/grpc_service.go @@ -1,7 +1,7 @@ package master import ( - "github.com/VaalaCat/frp-panel/app" + "github.com/VaalaCat/frp-panel/services/app" "google.golang.org/grpc" "google.golang.org/grpc/credentials" ) diff --git a/rpc/client.go b/services/rpc/client.go similarity index 77% rename from rpc/client.go rename to services/rpc/client.go index a586543..b8b1077 100644 --- a/rpc/client.go +++ b/services/rpc/client.go @@ -5,12 +5,11 @@ import ( "fmt" "io" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/common" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/google/uuid" - "github.com/sirupsen/logrus" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" ) @@ -29,10 +28,10 @@ func CallClientWrapper[R common.RespType](c *app.Context, clientID string, event return proto.Unmarshal(cresp.GetData(), protoMsgRef) } -func CallClient(c *app.Context, clientID string, event pb.Event, msg proto.Message) (*pb.ClientMessage, error) { - sender := c.GetApp().GetClientsManager().Get(clientID) +func CallClient(ctx *app.Context, clientID string, event pb.Event, msg proto.Message) (*pb.ClientMessage, error) { + sender := ctx.GetApp().GetClientsManager().Get(clientID) if sender == nil { - logger.Logger(c).Errorf("cannot get client, id: [%s]", clientID) + logger.Logger(ctx).Errorf("cannot get client, id: [%s]", clientID) return nil, fmt.Errorf("cannot get client, id: [%s]", clientID) } @@ -49,21 +48,21 @@ func CallClient(c *app.Context, clientID string, event pb.Event, msg proto.Messa ClientId: clientID, } - c.GetApp().GetClientRecvMap().Store(req.SessionId, make(chan *pb.ClientMessage)) + ctx.GetApp().GetClientRecvMap().Store(req.SessionId, make(chan *pb.ClientMessage)) err = sender.Conn.Send(req) if err != nil { logger.Logger(context.Background()).WithError(err).Errorf("cannot send") - c.GetApp().GetClientsManager().Remove(clientID) + ctx.GetApp().GetClientsManager().Remove(clientID) return nil, err } - respChAny, ok := c.GetApp().GetClientRecvMap().Load(req.SessionId) + respChAny, ok := ctx.GetApp().GetClientRecvMap().Load(req.SessionId) if !ok { - logrus.Fatalf("cannot load") + logger.Logger(ctx).Fatalf("cannot load") } respCh, ok := respChAny.(chan *pb.ClientMessage) if !ok { - logrus.Fatalf("cannot cast") + logger.Logger(ctx).Fatalf("cannot cast") } resp := <-respCh @@ -72,7 +71,7 @@ func CallClient(c *app.Context, clientID string, event pb.Event, msg proto.Messa } close(respCh) - c.GetApp().GetClientRecvMap().Delete(req.SessionId) + ctx.GetApp().GetClientRecvMap().Delete(req.SessionId) return resp, nil } diff --git a/rpc/client_manager.go b/services/rpc/client_manager.go similarity index 97% rename from rpc/client_manager.go rename to services/rpc/client_manager.go index 1b58313..e6951a2 100644 --- a/rpc/client_manager.go +++ b/services/rpc/client_manager.go @@ -3,8 +3,8 @@ package rpc import ( "time" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" "github.com/VaalaCat/frp-panel/utils" "google.golang.org/grpc/peer" ) diff --git a/rpc/master.go b/services/rpc/master.go similarity index 80% rename from rpc/master.go rename to services/rpc/master.go index 6f5ab90..623d9b6 100644 --- a/rpc/master.go +++ b/services/rpc/master.go @@ -1,39 +1,62 @@ package rpc import ( + "context" "crypto/tls" "errors" "fmt" "net/http" - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/defs" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/VaalaCat/frp-panel/utils/wsgrpc" "github.com/imroc/req/v3" - "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/protobuf/proto" ) -func NewMasterCli(appInstance app.Application) pb.MasterClient { +type masterClient struct { + cli pb.MasterClient + inited bool + appInstance app.Application +} + +func (m *masterClient) Call() pb.MasterClient { + if !m.inited { + m.cli = newMasterCli(m.appInstance) + m.inited = true + } + return m.cli +} + +func NewMasterCli(appInstance app.Application) *masterClient { + return &masterClient{ + inited: false, + appInstance: appInstance, + } +} + +func newMasterCli(appInstance app.Application) pb.MasterClient { connInfo := conf.GetRPCConnInfo(appInstance.GetConfig()) + ctx := context.Background() opt := []grpc.DialOption{} switch connInfo.Scheme { case conf.GRPC: if appInstance.GetConfig().Client.TLSRpc { - logrus.Infof("use tls rpc") - opt = append(opt, grpc.WithTransportCredentials(appInstance.GetClientCred())) + logger.Logger(ctx).Infof("use tls rpc") + opt = append(opt, grpc.WithTransportCredentials(appInstance.GetRPCCred())) } else { - logrus.Infof("use insecure rpc") + logger.Logger(ctx).Infof("use insecure rpc") opt = append(opt, grpc.WithTransportCredentials(insecure.NewCredentials())) } case conf.WS, conf.WSS: - logrus.Infof("use ws/wss rpc") + logger.Logger(ctx).Infof("use ws/wss rpc") wsURL := fmt.Sprintf("%s://%s/wsgrpc", connInfo.Scheme, connInfo.Host) header := http.Header{} @@ -44,7 +67,7 @@ func NewMasterCli(appInstance app.Application) pb.MasterClient { conn, err := grpc.NewClient(connInfo.Host, opt...) if err != nil { - logrus.Fatalf("did not connect: %v", err) + logger.Logger(ctx).Fatalf("did not connect: %v", err) } return pb.NewMasterClient(conn) diff --git a/services/rpcclient/rpc_handler.go b/services/rpcclient/rpc_handler.go index 42899b0..f31858e 100644 --- a/services/rpcclient/rpc_handler.go +++ b/services/rpcclient/rpc_handler.go @@ -5,11 +5,10 @@ import ( "io" "time" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/google/uuid" - "github.com/sirupsen/logrus" ) // func clientHandleServerSend(req *pb.ServerMessage) *pb.ClientMessage { @@ -23,8 +22,8 @@ import ( // } func RegistClientToMaster(appInstance app.Application, recvStream pb.Master_ServerSendClient, event pb.Event, clientID, clientSecret string) { - c := context.Background() - logger.Logger(c).Infof("start to regist client to master") + ctx := context.Background() + logger.Logger(ctx).Infof("start to regist client to master") for { err := recvStream.Send(&pb.ClientMessage{ Event: event, @@ -33,7 +32,7 @@ func RegistClientToMaster(appInstance app.Application, recvStream pb.Master_Serv Secret: clientSecret, }) if err != nil { - logger.Logger(context.Background()).WithError(err).Warnf("cannot send, sleep 3s and retry") + logger.Logger(ctx).WithError(err).Warnf("cannot send, sleep 3s and retry") time.Sleep(3 * time.Second) continue } @@ -43,11 +42,11 @@ func RegistClientToMaster(appInstance app.Application, recvStream pb.Master_Serv break } if err != nil { - logrus.Fatalf("cannot receive %v", err) + logger.Logger(ctx).Fatalf("cannot receive %v", err) } if resp.GetEvent() == event { - logger.Logger(c).Infof("client get server register envent success, clientID: %s", resp.GetClientId()) + logger.Logger(ctx).Infof("client get server register envent success, clientID: %s", resp.GetClientId()) break } } @@ -94,7 +93,7 @@ func RunRPCClient(appInstance app.Application, recvStream pb.Master_ServerSendCl } } -func StartRPCClient(appInstance app.Application, client pb.MasterClient, done chan bool, clientID, clientSecret string, event pb.Event, +func StartRPCClient(appInstance app.Application, client app.MasterClient, done chan bool, clientID, clientSecret string, event pb.Event, clientHandleServerSend func(appInstance app.Application, req *pb.ServerMessage) *pb.ClientMessage) { c := context.Background() logger.Logger(c).Infof("start to run rpc client") @@ -104,7 +103,7 @@ func StartRPCClient(appInstance app.Application, client pb.MasterClient, done ch logger.Logger(c).Infof("finish rpc client") return default: - recvStream, err := client.ServerSend(context.Background()) + recvStream, err := client.Call().ServerSend(context.Background()) if err != nil { logger.Logger(context.Background()).WithError(err).Errorf("cannot recv, sleep 3s and retry") time.Sleep(3 * time.Second) diff --git a/services/rpcclient/rpc_service.go b/services/rpcclient/rpc_service.go index 7678985..ada780f 100644 --- a/services/rpcclient/rpc_service.go +++ b/services/rpcclient/rpc_service.go @@ -1,8 +1,8 @@ package rpcclient import ( - "github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/pb" + "github.com/VaalaCat/frp-panel/services/app" ) type ClientRPCHandler interface { @@ -13,7 +13,7 @@ type ClientRPCHandler interface { type clientRPC struct { appInstance app.Application - rpcClient pb.MasterClient + rpcClient app.MasterClient done chan bool handerFunc func(appInstance app.Application, req *pb.ServerMessage) *pb.ClientMessage clientID string @@ -49,6 +49,6 @@ func (s *clientRPC) Stop() { close(s.done) } -func (s *clientRPC) GetCli() pb.MasterClient { +func (s *clientRPC) GetCli() app.MasterClient { return s.rpcClient } diff --git a/services/server/frps_service.go b/services/server/frps_service.go index b6e34f9..087aa78 100644 --- a/services/server/frps_service.go +++ b/services/server/frps_service.go @@ -4,14 +4,13 @@ import ( "context" "sync" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/logger" + "github.com/VaalaCat/frp-panel/services/app" + "github.com/VaalaCat/frp-panel/utils/logger" v1 "github.com/fatedier/frp/pkg/config/v1" "github.com/fatedier/frp/pkg/config/v1/validation" "github.com/fatedier/frp/pkg/metrics/mem" "github.com/fatedier/frp/pkg/util/log" "github.com/fatedier/frp/server" - "github.com/sirupsen/logrus" "github.com/sourcegraph/conc" ) @@ -23,13 +22,14 @@ type serverImpl struct { func NewServerHandler(svrCfg *v1.ServerConfig) app.ServerHandler { svrCfg.Complete() + ctx := context.Background() warning, err := validation.ValidateServerConfig(svrCfg) if warning != nil { logger.Logger(context.Background()).WithError(err).Warnf("validate server config warning: %+v", warning) } if err != nil { - logrus.Panic(err) + logger.Logger(ctx).Panic(err) } log.InitLogger(svrCfg.Log.To, svrCfg.Log.Level, int(svrCfg.Log.MaxDays), svrCfg.Log.DisablePrintColor) diff --git a/tunnel/client.go b/services/tunnel/client.go similarity index 97% rename from tunnel/client.go rename to services/tunnel/client.go index e506093..956abee 100644 --- a/tunnel/client.go +++ b/services/tunnel/client.go @@ -3,9 +3,9 @@ package tunnel import ( "context" - "github.com/VaalaCat/frp-panel/app" - "github.com/VaalaCat/frp-panel/logger" + "github.com/VaalaCat/frp-panel/services/app" "github.com/VaalaCat/frp-panel/utils" + "github.com/VaalaCat/frp-panel/utils/logger" ) type clientController struct { diff --git a/tunnel/master.go b/services/tunnel/master.go similarity index 100% rename from tunnel/master.go rename to services/tunnel/master.go diff --git a/tunnel/server.go b/services/tunnel/server.go similarity index 96% rename from tunnel/server.go rename to services/tunnel/server.go index 541b0ac..39e379f 100644 --- a/tunnel/server.go +++ b/services/tunnel/server.go @@ -3,7 +3,7 @@ package tunnel import ( "sync" - "github.com/VaalaCat/frp-panel/app" + "github.com/VaalaCat/frp-panel/services/app" "github.com/fatedier/frp/pkg/metrics" ) diff --git a/watcher/client.go b/services/watcher/client.go similarity index 92% rename from watcher/client.go rename to services/watcher/client.go index c55d026..25244a5 100644 --- a/watcher/client.go +++ b/services/watcher/client.go @@ -4,7 +4,7 @@ import ( "context" "time" - "github.com/VaalaCat/frp-panel/logger" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/go-co-op/gocron/v2" ) @@ -53,7 +53,7 @@ func (c *client) AddCronTask(cron string, function any, parameters ...any) error func (c *client) Run() { ctx := context.Background() - logger.Logger(ctx).Infof("start to run scheduler, interval: 30s") + logger.Logger(ctx).Infof("start to run scheduler") c.s.Start() } diff --git a/utils/cert.go b/utils/cert.go index b9a8a2d..b132d97 100644 --- a/utils/cert.go +++ b/utils/cert.go @@ -1,13 +1,14 @@ package utils import ( + "context" "crypto/ecdsa" "crypto/rsa" "crypto/tls" "crypto/x509" "encoding/pem" - "github.com/sirupsen/logrus" + "github.com/VaalaCat/frp-panel/utils/logger" "google.golang.org/grpc/credentials" ) @@ -23,13 +24,14 @@ func PublicKey(priv interface{}) interface{} { } func PemBlockForPrivKey(priv interface{}) *pem.Block { + ctx := context.Background() switch k := priv.(type) { case *rsa.PrivateKey: return &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(k)} case *ecdsa.PrivateKey: b, err := x509.MarshalECPrivateKey(k) if err != nil { - logrus.Fatalf("Unable to marshal ECDSA private key: %v", err) + logger.Logger(ctx).Fatalf("Unable to marshal ECDSA private key: %v", err) } return &pem.Block{Type: "EC PRIVATE KEY", Bytes: b} default: diff --git a/logger/hook.go b/utils/logger/hook.go similarity index 100% rename from logger/hook.go rename to utils/logger/hook.go diff --git a/utils/logger/init.go b/utils/logger/init.go new file mode 100644 index 0000000..daeccce --- /dev/null +++ b/utils/logger/init.go @@ -0,0 +1,85 @@ +package logger + +import ( + "bufio" + "fmt" + "os" + "path/filepath" + "runtime" + "strconv" + "strings" + + "github.com/sirupsen/logrus" +) + +func InitLogger() { + // projectRoot, projectPkg, _ := findProjectRootAndModule() + + Instance().SetReportCaller(true) + Instance().AddHook(NewStackTraceHook()) + + logrus.SetReportCaller(true) + logrus.SetReportCaller(true) +} + +func NewCallerPrettyfier(projectRoot, projectPkg string) func(frame *runtime.Frame) (function string, file string) { + return func(frame *runtime.Frame) (function string, file string) { + file = frame.File + if relPath, err := filepath.Rel(projectRoot, frame.File); err == nil { + file = relPath + } + file = " " + file + ":" + strconv.Itoa(frame.Line) + + function = frame.Function + if strings.HasPrefix(function, projectPkg) { + function = function[len(projectPkg):] + function = strings.TrimPrefix(function, "/") + function = strings.TrimPrefix(function, ".") + } + + return function, file + } +} + +func FindProjectRootAndModule() (projectRoot string, projectModule string, err error) { + _, filename, _, ok := runtime.Caller(2) + if !ok { + err = fmt.Errorf("cannot get caller info") + return + } + + dir := filepath.Dir(filename) + for { + if dir == "/" || dir == "." { + err = fmt.Errorf("go.mod not found") + return + } + modFile := filepath.Join(dir, "go.mod") + if _, statErr := os.Stat(modFile); statErr == nil { + projectRoot = dir + projectModule, err = readModuleName(modFile) + return + } + dir = filepath.Dir(dir) + } +} + +func readModuleName(modFile string) (string, error) { + f, err := os.Open(modFile) + if err != nil { + return "", err + } + defer f.Close() + + scanner := bufio.NewScanner(f) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if strings.HasPrefix(line, "module ") { + return strings.TrimSpace(strings.TrimPrefix(line, "module ")), nil + } + } + if err := scanner.Err(); err != nil { + return "", err + } + return "", fmt.Errorf("module name not found in go.mod") +} diff --git a/logger/logger.go b/utils/logger/logger.go similarity index 100% rename from logger/logger.go rename to utils/logger/logger.go diff --git a/utils/logger/trace.go b/utils/logger/trace.go new file mode 100644 index 0000000..6c909df --- /dev/null +++ b/utils/logger/trace.go @@ -0,0 +1,83 @@ +package logger + +import ( + "fmt" + "path/filepath" + "runtime" + "strconv" + "strings" + + "github.com/sirupsen/logrus" +) + +type StackTraceHook struct{} + +func NewStackTraceHook() *StackTraceHook { + return &StackTraceHook{} +} + +func (hook *StackTraceHook) Levels() []logrus.Level { + return []logrus.Level{ + logrus.FatalLevel, + } +} + +func (hook *StackTraceHook) Fire(entry *logrus.Entry) error { + stack := getConciseStackTrace() + if stack != "" { + entry.Data["stack"] = stack + } + return nil +} + +func getConciseStackTrace() string { + pcs := make([]uintptr, 32) + n := runtime.Callers(4, pcs) + if n == 0 { + return "" + } + + var conciseStack []string + frames := runtime.CallersFrames(pcs[:n]) + + for { + frame, more := frames.Next() + + if strings.HasPrefix(frame.Function, "runtime.") || + strings.HasPrefix(frame.Function, "reflect") || + strings.HasPrefix(frame.Function, "github.com/sirupsen/logrus") || + strings.HasPrefix(frame.Function, "go.uber.org/fx") || + strings.HasPrefix(frame.Function, "go.uber.org/dig") { + if more { + continue + } else { + break + } + } + + fileName := filepath.Base(frame.File) + frameStr := fmt.Sprintf("%s(%s:%d)", simpleFuncName(frame.Function), fileName, frame.Line) + conciseStack = append(conciseStack, frameStr) + + if !more { + break + } + } + + return strings.Join(conciseStack, " <- ") +} + +func simpleFuncName(fullName string) string { + lastSlash := strings.LastIndex(fullName, "/") + if lastSlash >= 0 { + fullName = fullName[lastSlash+1:] + } + lastDot := strings.LastIndex(fullName, ".") + if lastDot >= 0 { + if _, err := strconv.Atoi(fullName[lastDot+1:]); err == nil { + return fullName + } + return fullName[lastDot+1:] + } + return fullName +} diff --git a/utils/system_service.go b/utils/system_service.go index af83e2d..bf69374 100644 --- a/utils/system_service.go +++ b/utils/system_service.go @@ -1,14 +1,15 @@ package utils import ( + "context" "fmt" "io" "os" "path" "path/filepath" + "github.com/VaalaCat/frp-panel/utils/logger" "github.com/kardianos/service" - "github.com/sirupsen/logrus" ) type SystemService struct { @@ -60,18 +61,20 @@ func CreateSystemService(args []string, run func()) (service.Service, error) { } func ControlSystemService(args []string, action string, run func()) error { - logrus.Info("try to ", action, " service, args:", args) + ctx := context.Background() + + logger.Logger(ctx).Info("try to ", action, " service, args:", args) s, err := CreateSystemService(args, run) if err != nil { - logrus.WithError(err).Error("create service controller failed") + logger.Logger(ctx).WithError(err).Error("create service controller failed") return err } if err := service.Control(s, action); err != nil { - logrus.WithError(err).Errorf("controller %v service failed", action) + logger.Logger(ctx).WithError(err).Errorf("controller %v service failed", action) return err } - logrus.Infof("controller %v service success", action) + logger.Logger(ctx).Infof("controller %v service success", action) return nil }