This commit is contained in:
VaalaCat
2025-04-26 10:52:21 +00:00
parent c37e19189d
commit f07c03ce68
117 changed files with 1307 additions and 784 deletions

View File

@@ -20,7 +20,7 @@ jobs:
- name: Setup Go - name: Setup Go
uses: actions/setup-go@v4 uses: actions/setup-go@v4
with: with:
go-version: "1.22.x" go-version: "1.24.x"
- name: npm install and build - name: npm install and build
run: | run: |
cd www cd www

View File

@@ -21,7 +21,7 @@ jobs:
- name: Setup Go - name: Setup Go
uses: actions/setup-go@v4 uses: actions/setup-go@v4
with: with:
go-version: "1.22.x" go-version: "1.24.x"
- name: npm install and build - name: npm install and build
run: | run: |
cd www cd www

1
.gitignore vendored
View File

@@ -20,7 +20,6 @@ dist/
.vite_opt_cache .vite_opt_cache
.vscode .vscode
dist dist
cache
temp temp
examples-temp examples-temp
node_modules node_modules

View File

@@ -3,9 +3,9 @@ package client
import ( import (
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "github.com/VaalaCat/frp-panel/pb"
"github.com/VaalaCat/frp-panel/services/app"
"github.com/VaalaCat/frp-panel/utils/logger"
"github.com/samber/lo" "github.com/samber/lo"
) )

View File

@@ -1,9 +1,9 @@
package client package client
import ( import (
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/biz/common" "github.com/VaalaCat/frp-panel/biz/common"
"github.com/VaalaCat/frp-panel/pb" "github.com/VaalaCat/frp-panel/pb"
"github.com/VaalaCat/frp-panel/services/app"
) )
func StartPTYConnect(c *app.Context, req *pb.CommonRequest) (*pb.CommonResponse, error) { func StartPTYConnect(c *app.Context, req *pb.CommonRequest) (*pb.CommonResponse, error) {

View File

@@ -4,9 +4,9 @@ import (
"os" "os"
"time" "time"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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) { func RemoveFrpcHandler(ctx *app.Context, req *pb.RemoveFRPCRequest) (*pb.RemoveFRPCResponse, error) {

View File

@@ -5,10 +5,10 @@ import (
"fmt" "fmt"
"runtime/debug" "runtime/debug"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/conf"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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" "google.golang.org/protobuf/proto"
) )

View File

@@ -4,11 +4,11 @@ import (
"context" "context"
"reflect" "reflect"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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/services/client"
"github.com/VaalaCat/frp-panel/utils" "github.com/VaalaCat/frp-panel/utils"
"github.com/VaalaCat/frp-panel/utils/logger"
"github.com/samber/lo" "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) logger.Logger(ctx).Infof("start to pull client config, clientID: [%s]", clientID)
cli := appInstance.GetMasterCli() cli := appInstance.GetMasterCli()
resp, err := cli.PullClientConfig(ctx, &pb.PullClientConfigReq{ resp, err := cli.Call().PullClientConfig(ctx, &pb.PullClientConfigReq{
Base: &pb.ClientBase{ Base: &pb.ClientBase{
ClientId: clientID, ClientId: clientID,
ClientSecret: clientSecret, ClientSecret: clientSecret,

View File

@@ -1,9 +1,9 @@
package client package client
import ( import (
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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) { func StartFRPCHandler(ctx *app.Context, req *pb.StartFRPCRequest) (*pb.StartFRPCResponse, error) {

View File

@@ -1,9 +1,9 @@
package client package client
import ( import (
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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) { func StopFRPCHandler(ctx *app.Context, req *pb.StopFRPCRequest) (*pb.StopFRPCResponse, error) {

View File

@@ -3,11 +3,11 @@ package client
import ( import (
"context" "context"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/biz/common" "github.com/VaalaCat/frp-panel/biz/common"
"github.com/VaalaCat/frp-panel/pb" "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"
"github.com/sirupsen/logrus" "github.com/VaalaCat/frp-panel/utils/logger"
) )
func StartSteamLogHandler(ctx *app.Context, req *pb.CommonRequest) (*pb.CommonResponse, error) { 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 clientID := ctx.GetApp().GetConfig().Client.ID
clientSecret := ctx.GetApp().GetConfig().Client.Secret clientSecret := ctx.GetApp().GetConfig().Client.Secret
handler, err := ctx.GetApp().GetClientRPCHandler().GetCli().PushClientStreamLog( handler, err := ctx.GetApp().GetClientRPCHandler().GetCli().Call().PushClientStreamLog(
context.Background()) context.Background())
if err != nil { if err != nil {
logrus.Error(err) logger.Logger(ctx).Error(err)
} }
h.AddStream(func(msg string) { h.AddStream(func(msg string) {

View File

@@ -3,11 +3,11 @@ package client
import ( import (
"reflect" "reflect"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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/services/client"
"github.com/VaalaCat/frp-panel/utils" "github.com/VaalaCat/frp-panel/utils"
"github.com/VaalaCat/frp-panel/utils/logger"
) )
func UpdateFrpcHander(ctx *app.Context, req *pb.UpdateFRPCRequest) (*pb.UpdateFRPCResponse, error) { func UpdateFrpcHander(ctx *app.Context, req *pb.UpdateFRPCRequest) (*pb.UpdateFRPCResponse, error) {

View File

@@ -4,16 +4,16 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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/VaalaCat/frp-panel/utils/pty"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/sourcegraph/conc" "github.com/sourcegraph/conc"
) )
func StartPTYConnect(c *app.Context, req *pb.CommonRequest, initMsg *pb.PTYClientMessage) (*pb.CommonResponse, error) { 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 { if err != nil {
logger.Logger(c).WithError(err).Infof("rpc connect master error") logger.Logger(c).WithError(err).Infof("rpc connect master error")
return nil, err return nil, err

View File

@@ -3,9 +3,9 @@ package common
import ( import (
"sync" "sync"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "github.com/VaalaCat/frp-panel/pb"
"github.com/VaalaCat/frp-panel/services/app"
"github.com/VaalaCat/frp-panel/utils/logger"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )

View File

@@ -1,9 +1,9 @@
package auth package auth
import ( import (
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/dao"
"github.com/VaalaCat/frp-panel/pb" "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) { func GetClientCert(ctx *app.Context, req *pb.GetClientCertRequest) (*pb.GetClientCertResponse, error) {

View File

@@ -3,10 +3,10 @@ package auth
import ( import (
"net/http" "net/http"
"github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/services/app"
"github.com/VaalaCat/frp-panel/cache" "github.com/VaalaCat/frp-panel/services/cache"
"github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/services/dao"
"github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/utils/logger"
plugin "github.com/fatedier/frp/pkg/plugin/server" plugin "github.com/fatedier/frp/pkg/plugin/server"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )

View File

@@ -3,18 +3,17 @@ package auth
import ( import (
"context" "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/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/samber/lo"
"github.com/sirupsen/logrus"
) )
func InitAuth(appInstance app.Application) { func InitAuth(appInstance app.Application) {
appCtx := app.NewContext(context.Background(), appInstance) 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() u, err := dao.NewQuery(appCtx).AdminGetAllUsers()
if err != nil { if err != nil {

View File

@@ -3,11 +3,11 @@ package auth
import ( import (
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/conf"
"github.com/VaalaCat/frp-panel/dao"
"github.com/VaalaCat/frp-panel/middleware" "github.com/VaalaCat/frp-panel/middleware"
"github.com/VaalaCat/frp-panel/pb" "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) { func LoginHandler(ctx *app.Context, req *pb.LoginRequest) (*pb.LoginResponse, error) {

View File

@@ -1,9 +1,9 @@
package auth package auth
import ( import (
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/common"
"github.com/VaalaCat/frp-panel/pb" "github.com/VaalaCat/frp-panel/pb"
"github.com/VaalaCat/frp-panel/services/app"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )

View File

@@ -3,10 +3,10 @@ package auth
import ( import (
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/dao"
"github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/models"
"github.com/VaalaCat/frp-panel/pb" "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"
"github.com/google/uuid" "github.com/google/uuid"
) )

View File

@@ -1,11 +1,11 @@
package client package client
import ( import (
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/common"
"github.com/VaalaCat/frp-panel/dao"
"github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/models"
"github.com/VaalaCat/frp-panel/pb" "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"
"github.com/google/uuid" "github.com/google/uuid"
) )

View File

@@ -3,12 +3,12 @@ package client
import ( import (
"context" "context"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "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/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) { func DeleteClientHandler(ctx *app.Context, req *pb.DeleteClientRequest) (*pb.DeleteClientResponse, error) {

View File

@@ -4,12 +4,12 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "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/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) { func RemoveFrpcHandler(c *app.Context, req *pb.RemoveFRPCRequest) (*pb.RemoveFRPCResponse, error) {

View File

@@ -1,12 +1,12 @@
package client package client
import ( import (
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "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/models"
"github.com/VaalaCat/frp-panel/pb" "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" "github.com/samber/lo"
) )

View File

@@ -3,11 +3,11 @@ package client
import ( import (
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "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/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/samber/lo"
"github.com/tiendc/go-deepcopy" "github.com/tiendc/go-deepcopy"
) )

View File

@@ -1,12 +1,12 @@
package client package client
import ( import (
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "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/models"
"github.com/VaalaCat/frp-panel/pb" "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" "github.com/samber/lo"
) )

View File

@@ -3,11 +3,11 @@ package client
import ( import (
"fmt" "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/models"
"github.com/VaalaCat/frp-panel/pb" "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" "github.com/samber/lo"
) )

View File

@@ -3,12 +3,12 @@ package client
import ( import (
"context" "context"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "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/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) { func StartFRPCHandler(ctx *app.Context, req *pb.StartFRPCRequest) (*pb.StartFRPCResponse, error) {

View File

@@ -3,12 +3,12 @@ package client
import ( import (
"context" "context"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "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/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) { func StopFRPCHandler(ctx *app.Context, req *pb.StopFRPCRequest) (*pb.StopFRPCResponse, error) {

View File

@@ -3,11 +3,11 @@ package client
import ( import (
"context" "context"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/dao"
"github.com/VaalaCat/frp-panel/defs" "github.com/VaalaCat/frp-panel/defs"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/models" "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/samber/lo"
) )

View File

@@ -5,15 +5,15 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/common"
"github.com/VaalaCat/frp-panel/dao"
"github.com/VaalaCat/frp-panel/defs" "github.com/VaalaCat/frp-panel/defs"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/models"
"github.com/VaalaCat/frp-panel/pb" "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"
"github.com/VaalaCat/frp-panel/utils/logger"
v1 "github.com/fatedier/frp/pkg/config/v1" v1 "github.com/fatedier/frp/pkg/config/v1"
"github.com/samber/lo" "github.com/samber/lo"
) )

View File

@@ -3,7 +3,6 @@ package master
import ( import (
"embed" "embed"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/biz/master/auth" "github.com/VaalaCat/frp-panel/biz/master/auth"
"github.com/VaalaCat/frp-panel/biz/master/client" "github.com/VaalaCat/frp-panel/biz/master/client"
"github.com/VaalaCat/frp-panel/biz/master/platform" "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/streamlog"
"github.com/VaalaCat/frp-panel/biz/master/user" "github.com/VaalaCat/frp-panel/biz/master/user"
"github.com/VaalaCat/frp-panel/middleware" "github.com/VaalaCat/frp-panel/middleware"
"github.com/VaalaCat/frp-panel/services/app"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )

View File

@@ -4,11 +4,11 @@ import (
"context" "context"
"time" "time"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/common"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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" "github.com/samber/lo"
"google.golang.org/protobuf/proto" "google.golang.org/protobuf/proto"
) )

View File

@@ -3,11 +3,11 @@ package platform
import ( import (
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/common"
"github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/conf"
"github.com/VaalaCat/frp-panel/dao"
"github.com/VaalaCat/frp-panel/pb" "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" "github.com/gin-gonic/gin"
) )

View File

@@ -4,14 +4,14 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/biz/master/client" "github.com/VaalaCat/frp-panel/biz/master/client"
"github.com/VaalaCat/frp-panel/common" "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/models"
"github.com/VaalaCat/frp-panel/pb" "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"
"github.com/VaalaCat/frp-panel/utils/logger"
v1 "github.com/fatedier/frp/pkg/config/v1" v1 "github.com/fatedier/frp/pkg/config/v1"
"github.com/samber/lo" "github.com/samber/lo"

View File

@@ -3,12 +3,12 @@ package proxy
import ( import (
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/biz/master/client" "github.com/VaalaCat/frp-panel/biz/master/client"
"github.com/VaalaCat/frp-panel/common" "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/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" v1 "github.com/fatedier/frp/pkg/config/v1"
"github.com/samber/lo" "github.com/samber/lo"
) )

View File

@@ -3,13 +3,13 @@ package proxy
import ( import (
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "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/models"
"github.com/VaalaCat/frp-panel/pb" "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" "github.com/samber/lo"
) )

View File

@@ -4,11 +4,11 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "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/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 // GetProxyStatsByClientID get proxy info by client id

View File

@@ -4,11 +4,11 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "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/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 // GetProxyStatsByServerID get proxy info by server id

View File

@@ -1,12 +1,12 @@
package proxy package proxy
import ( import (
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "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/models"
"github.com/VaalaCat/frp-panel/pb" "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" "github.com/samber/lo"
) )

View File

@@ -3,10 +3,10 @@ package proxy
import ( import (
"context" "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/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/samber/lo"
) )

View File

@@ -3,14 +3,14 @@ package proxy
import ( import (
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/biz/master/client" "github.com/VaalaCat/frp-panel/biz/master/client"
"github.com/VaalaCat/frp-panel/common" "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/models"
"github.com/VaalaCat/frp-panel/pb" "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"
"github.com/VaalaCat/frp-panel/utils/logger"
v1 "github.com/fatedier/frp/pkg/config/v1" v1 "github.com/fatedier/frp/pkg/config/v1"
"github.com/samber/lo" "github.com/samber/lo"
) )

View File

@@ -1,11 +1,11 @@
package server package server
import ( import (
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/common"
"github.com/VaalaCat/frp-panel/dao"
"github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/models"
"github.com/VaalaCat/frp-panel/pb" "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"
"github.com/google/uuid" "github.com/google/uuid"
) )

View File

@@ -1,10 +1,10 @@
package server package server
import ( import (
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/common"
"github.com/VaalaCat/frp-panel/dao"
"github.com/VaalaCat/frp-panel/pb" "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) { func DeleteServerHandler(c *app.Context, req *pb.DeleteServerRequest) (*pb.DeleteServerResponse, error) {

View File

@@ -3,12 +3,12 @@ package server
import ( import (
"context" "context"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "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/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) { func RemoveFrpsHandler(c *app.Context, req *pb.RemoveFRPSRequest) (*pb.RemoveFRPSResponse, error) {

View File

@@ -1,10 +1,10 @@
package server package server
import ( import (
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/common"
"github.com/VaalaCat/frp-panel/dao"
"github.com/VaalaCat/frp-panel/pb" "github.com/VaalaCat/frp-panel/pb"
"github.com/VaalaCat/frp-panel/services/app"
"github.com/VaalaCat/frp-panel/services/dao"
"github.com/samber/lo" "github.com/samber/lo"
) )

View File

@@ -3,9 +3,9 @@ package server
import ( import (
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/dao"
"github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/models"
"github.com/VaalaCat/frp-panel/services/app"
"github.com/VaalaCat/frp-panel/services/dao"
) )
type ValidateableServerRequest interface { type ValidateableServerRequest interface {

View File

@@ -1,11 +1,11 @@
package server package server
import ( import (
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/common"
"github.com/VaalaCat/frp-panel/dao"
"github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/models"
"github.com/VaalaCat/frp-panel/pb" "github.com/VaalaCat/frp-panel/pb"
"github.com/VaalaCat/frp-panel/services/app"
"github.com/VaalaCat/frp-panel/services/dao"
"github.com/samber/lo" "github.com/samber/lo"
) )

View File

@@ -4,11 +4,11 @@ import (
"context" "context"
"fmt" "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/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) { func FRPAuth(ctx *app.Context, req *pb.FRPAuthRequest) (*pb.FRPAuthResponse, error) {

View File

@@ -1,9 +1,9 @@
package server package server
import ( import (
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/models"
"github.com/VaalaCat/frp-panel/pb" "github.com/VaalaCat/frp-panel/pb"
"github.com/VaalaCat/frp-panel/services/app"
"github.com/samber/lo" "github.com/samber/lo"
) )

View File

@@ -1,10 +1,10 @@
package server package server
import ( import (
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/dao"
"github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/models"
"github.com/VaalaCat/frp-panel/pb" "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) { func PushProxyInfo(ctx *app.Context, req *pb.PushProxyInfoReq) (*pb.PushProxyInfoResp, error) {

View File

@@ -4,15 +4,15 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/common"
"github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/conf"
"github.com/VaalaCat/frp-panel/dao"
"github.com/VaalaCat/frp-panel/defs" "github.com/VaalaCat/frp-panel/defs"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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"
"github.com/VaalaCat/frp-panel/utils/logger"
v1 "github.com/fatedier/frp/pkg/config/v1" v1 "github.com/fatedier/frp/pkg/config/v1"
) )

View File

@@ -7,11 +7,11 @@ import (
"strconv" "strconv"
"time" "time"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/common"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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/fatedier/golib/log"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"

View File

@@ -4,11 +4,11 @@ import (
"fmt" "fmt"
"io" "io"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/biz/master/client" "github.com/VaalaCat/frp-panel/biz/master/client"
"github.com/VaalaCat/frp-panel/biz/master/server" "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/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 { func PTYConnect(ctx *app.Context, sender pb.Master_PTYConnectServer) error {

View File

@@ -6,12 +6,12 @@ import (
"io" "io"
"sync" "sync"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/biz/master/client" "github.com/VaalaCat/frp-panel/biz/master/client"
"github.com/VaalaCat/frp-panel/biz/master/server" "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/pb"
"github.com/VaalaCat/frp-panel/services/app"
"github.com/VaalaCat/frp-panel/utils" "github.com/VaalaCat/frp-panel/utils"
"github.com/VaalaCat/frp-panel/utils/logger"
) )
const ( const (

View File

@@ -5,11 +5,11 @@ import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/common"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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/gin-gonic/gin"
"github.com/sourcegraph/conc" "github.com/sourcegraph/conc"
) )

View File

@@ -3,9 +3,9 @@ package user
import ( import (
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/common"
"github.com/VaalaCat/frp-panel/pb" "github.com/VaalaCat/frp-panel/pb"
"github.com/VaalaCat/frp-panel/services/app"
"github.com/samber/lo" "github.com/samber/lo"
) )

View File

@@ -3,14 +3,14 @@ package user
import ( import (
"context" "context"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/biz/master/client" "github.com/VaalaCat/frp-panel/biz/master/client"
"github.com/VaalaCat/frp-panel/common" "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/models"
"github.com/VaalaCat/frp-panel/pb" "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"
"github.com/VaalaCat/frp-panel/utils/logger"
) )
func UpdateUserInfoHander(c *app.Context, req *pb.UpdateUserInfoRequest) (*pb.UpdateUserInfoResponse, error) { func UpdateUserInfoHander(c *app.Context, req *pb.UpdateUserInfoRequest) (*pb.UpdateUserInfoResponse, error) {

View File

@@ -3,10 +3,10 @@ package server
import ( import (
"net/http" "net/http"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/defs" "github.com/VaalaCat/frp-panel/defs"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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" plugin "github.com/fatedier/frp/pkg/plugin/server"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@@ -68,7 +68,7 @@ func HandleLogin(ctx *app.Context) (interface{}, error) {
return res, nil return res, nil
} }
cli := ctx.GetApp().GetMasterCli() 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 { if err != nil {
res.Reject = true res.Reject = true
res.RejectReason = "invalid meta token" res.RejectReason = "invalid meta token"

View File

@@ -1,9 +1,9 @@
package server package server
import ( import (
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/biz/common" "github.com/VaalaCat/frp-panel/biz/common"
"github.com/VaalaCat/frp-panel/pb" "github.com/VaalaCat/frp-panel/pb"
"github.com/VaalaCat/frp-panel/services/app"
) )
func StartPTYConnect(c *app.Context, req *pb.CommonRequest) (*pb.CommonResponse, error) { func StartPTYConnect(c *app.Context, req *pb.CommonRequest) (*pb.CommonResponse, error) {

View File

@@ -3,9 +3,9 @@ package server
import ( import (
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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) { func RemoveFrpsHandler(ctx *app.Context, req *pb.RemoveFRPSRequest) (*pb.RemoveFRPSResponse, error) {

View File

@@ -5,10 +5,10 @@ import (
"fmt" "fmt"
"runtime/debug" "runtime/debug"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/conf"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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" "google.golang.org/protobuf/proto"
) )

View File

@@ -4,11 +4,11 @@ import (
"context" "context"
"reflect" "reflect"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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/services/server"
"github.com/VaalaCat/frp-panel/utils" "github.com/VaalaCat/frp-panel/utils"
"github.com/VaalaCat/frp-panel/utils/logger"
) )
func PullConfig(appInstance app.Application, serverID, serverSecret string) error { 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) logger.Logger(ctx).Infof("start to pull server config, serverID: [%s]", serverID)
cli := appInstance.GetMasterCli() cli := appInstance.GetMasterCli()
resp, err := cli.PullServerConfig(ctx, &pb.PullServerConfigReq{ resp, err := cli.Call().PullServerConfig(ctx, &pb.PullServerConfigReq{
Base: &pb.ServerBase{ Base: &pb.ServerBase{
ServerId: serverID, ServerId: serverID,
ServerSecret: serverSecret, ServerSecret: serverSecret,

View File

@@ -3,9 +3,9 @@ package server
import ( import (
"context" "context"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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" v1 "github.com/fatedier/frp/pkg/config/v1"
"github.com/samber/lo" "github.com/samber/lo"
) )
@@ -46,7 +46,7 @@ func PushProxyInfo(appInstance app.Application, serverID, serverSecret string) e
if len(proxyInfos) > 0 { if len(proxyInfos) > 0 {
ctx := context.Background() ctx := context.Background()
cli := appInstance.GetMasterCli() cli := appInstance.GetMasterCli()
_, err := cli.PushProxyInfo(ctx, &pb.PushProxyInfoReq{ _, err := cli.Call().PushProxyInfo(ctx, &pb.PushProxyInfoReq{
Base: &pb.ServerBase{ Base: &pb.ServerBase{
ServerId: serverID, ServerId: serverID,
ServerSecret: serverSecret, ServerSecret: serverSecret,

View File

@@ -3,11 +3,11 @@ package server
import ( import (
"context" "context"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/biz/common" "github.com/VaalaCat/frp-panel/biz/common"
"github.com/VaalaCat/frp-panel/pb" "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"
"github.com/sirupsen/logrus" "github.com/VaalaCat/frp-panel/utils/logger"
) )
func StartSteamLogHandler(ctx *app.Context, req *pb.CommonRequest) (*pb.CommonResponse, error) { 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 clientID := ctx.GetApp().GetConfig().Client.ID
clientSecret := ctx.GetApp().GetConfig().Client.Secret clientSecret := ctx.GetApp().GetConfig().Client.Secret
handler, err := ctx.GetApp().GetClientRPCHandler().GetCli().PushServerStreamLog( handler, err := ctx.GetApp().GetClientRPCHandler().GetCli().Call().PushServerStreamLog(
context.Background()) context.Background())
if err != nil { if err != nil {
logrus.Error(err) logger.Logger(ctx).Error(err)
} }
h.AddStream(func(msg string) { h.AddStream(func(msg string) {

View File

@@ -4,11 +4,11 @@ import (
"context" "context"
"reflect" "reflect"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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/services/server"
"github.com/VaalaCat/frp-panel/utils" "github.com/VaalaCat/frp-panel/utils"
"github.com/VaalaCat/frp-panel/utils/logger"
) )
func UpdateFrpsHander(ctx *app.Context, req *pb.UpdateFRPSRequest) (*pb.UpdateFRPSResponse, error) { func UpdateFrpsHander(ctx *app.Context, req *pb.UpdateFRPSRequest) (*pb.UpdateFRPSResponse, error) {

View File

@@ -3,70 +3,81 @@ package main
import ( import (
"context" "context"
"github.com/VaalaCat/frp-panel/app"
bizclient "github.com/VaalaCat/frp-panel/biz/client" 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/defs"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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/services/rpcclient"
"github.com/VaalaCat/frp-panel/tunnel" "github.com/VaalaCat/frp-panel/services/tunnel"
"github.com/VaalaCat/frp-panel/utils" "github.com/VaalaCat/frp-panel/services/watcher"
"github.com/VaalaCat/frp-panel/watcher" "github.com/VaalaCat/frp-panel/utils/logger"
"github.com/fatedier/golib/crypto" "github.com/fatedier/golib/crypto"
"github.com/sirupsen/logrus"
"github.com/sourcegraph/conc" "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 ( var (
c = context.Background() ctx = param.Ctx
clientID = appInstance.GetConfig().Client.ID clientID = param.AppInstance.GetConfig().Client.ID
clientSecret = appInstance.GetConfig().Client.Secret clientSecret = param.AppInstance.GetConfig().Client.Secret
appInstance = param.AppInstance
) )
crypto.DefaultSalt = appInstance.GetConfig().App.Secret crypto.DefaultSalt = param.AppInstance.GetConfig().App.Secret
logger.Logger(c).Infof("start to run client") logger.Logger(ctx).Infof("start to run client")
if len(clientSecret) == 0 { if len(clientSecret) == 0 {
logrus.Fatal("client secret cannot be empty") logger.Logger(ctx).Fatal("client secret cannot be empty")
} }
if len(clientID) == 0 { 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( param.TaskManager.AddDurationTask(defs.PullConfigDuration,
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,
bizclient.PullConfig, appInstance, clientID, clientSecret) bizclient.PullConfig, appInstance, clientID, clientSecret)
initClientOnce(appInstance, clientID, clientSecret)
defer w.Stop()
defer r.Stop()
var wg conc.WaitGroup var wg conc.WaitGroup
wg.Go(r.Run) param.Lc.Append(fx.Hook{
wg.Go(w.Run) OnStart: func(ctx context.Context) error {
wg.Wait() 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) { func initClientOnce(appInstance app.Application, clientID, clientSecret string) {

View File

@@ -6,162 +6,264 @@ import (
"fmt" "fmt"
"os" "os"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/conf"
"github.com/VaalaCat/frp-panel/defs" "github.com/VaalaCat/frp-panel/defs"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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"
"github.com/VaalaCat/frp-panel/utils/logger"
"github.com/joho/godotenv" "github.com/joho/godotenv"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag" "github.com/spf13/pflag"
"go.uber.org/fx"
) )
var ( type CommonArgs struct {
clientCmd *cobra.Command ClientSecret *string
serverCmd *cobra.Command ClientID *string
masterCmd *cobra.Command AppSecret *string
rootCmd *cobra.Command RpcUrl *string
) ApiUrl *string
func initCommand(appInstance app.Application) { RpcHost *string
rootCmd = &cobra.Command{ ApiHost *string
Use: "frp-panel", RpcPort *int
Short: "frp-panel is a frp panel QwQ", ApiPort *int
} ApiScheme *string
CmdListWithFlag := initCmdWithFlag(appInstance)
CmdListWithoutFlag := initCmdWithoutFlag(appInstance)
rootCmd.AddCommand(CmdListWithFlag...)
rootCmd.AddCommand(CmdListWithoutFlag...)
} }
func initCmdWithFlag(appInstance app.Application) []*cobra.Command { func buildCommand() *cobra.Command {
var ( cfg := conf.NewConfig()
clientSecret string
clientID string return NewRootCmd(
rpcHost string NewMasterCmd(cfg),
apiHost string NewClientCmd(cfg),
appSecret string NewServerCmd(cfg),
rpcPort int NewJoinCmd(),
apiPort int NewInstallServiceCmd(),
apiScheme string NewUninstallServiceCmd(),
joinToken string NewStartServiceCmd(),
rpcUrl string NewStopServiceCmd(),
apiUrl string NewRestartServiceCmd(),
NewVersionCmd(),
) )
}
clientCmd = &cobra.Command{ func AddCommonFlags(commonCmd *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]", commonCmd.Flags().StringP("secret", "s", "", "client secret")
Short: "run managed frpc", commonCmd.Flags().StringP("id", "i", "", "client id")
Run: func(cmd *cobra.Command, args []string) { commonCmd.Flags().StringP("app", "a", "", "app secret")
run := func() { commonCmd.Flags().String("rpc-url", "", "rpc url, master rpc url, scheme can be grpc/ws/wss://hostname:port")
patchConfig(appInstance, commonCmd.Flags().String("api-url", "", "api url, master api url, scheme can be http/https://hostname:port")
apiHost, rpcHost, appSecret,
clientID, clientSecret, // deprecated start
apiScheme, rpcPort, apiPort, commonCmd.Flags().StringP("rpc", "r", "", "deprecated, use --rpc-url instead, rpc host, canbe ip or domain")
apiUrl, rpcUrl) commonCmd.Flags().StringP("api", "t", "", "deprecated, use --api-url instead, api host, canbe ip or domain")
runClient(appInstance) 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")
if srv, err := utils.CreateSystemService(args, run); err != nil { commonCmd.Flags().StringP("api-scheme", "e", "", "deprecated, use --api-url instead, api scheme, master api scheme, scheme is http/https")
run() // deprecated end
} else { }
srv.Run()
} func GetCommonArgs(cmd *cobra.Command) CommonArgs {
}, var commonArgs CommonArgs
if clientSecret, err := cmd.Flags().GetString("secret"); err == nil {
commonArgs.ClientSecret = &clientSecret
} }
serverCmd = &cobra.Command{ if clientID, err := cmd.Flags().GetString("id"); err == nil {
Use: "server [-s client secret] [-i client id] [-a app secret] [-r rpc host] [-c rpc port] [-p api port]", commonArgs.ClientID = &clientID
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 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{ joinCmd := &cobra.Command{
Use: "join [-j join token] [-r rpc host] [-p api port] [-e api scheme]", Use: "join [-j join token] [-r rpc host] [-p api port] [-e api scheme]",
Short: "join to master with token, save param to config", Short: "join to master with token, save param to config",
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
pullRunConfig(appInstance, commonArgs := GetCommonArgs(cmd)
joinToken, appSecret, rpcHost, joinArgs := &JoinArgs{
apiScheme, rpcPort, apiPort, CommonArgs: commonArgs,
clientID, apiHost, }
apiUrl, rpcUrl) 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") joinCmd.Flags().StringP("join-token", "j", "", "your token from master")
serverCmd.Flags().StringVarP(&clientSecret, "secret", "s", "", "client secret") AddCommonFlags(joinCmd)
clientCmd.Flags().StringVarP(&clientID, "id", "i", "", "client id")
serverCmd.Flags().StringVarP(&clientID, "id", "i", "", "client id")
clientCmd.Flags().StringVarP(&appSecret, "app", "a", "", "app secret") return joinCmd
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}
} }
func initCmdWithoutFlag(appInstance app.Application) []*cobra.Command { func NewMasterCmd(cfg conf.Config) *cobra.Command {
masterCmd = &cobra.Command{ return &cobra.Command{
Use: "master", Use: "master",
Short: "run frp-panel manager", Short: "run frp-panel manager",
Run: func(cmd *cobra.Command, args []string) { 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() { 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 { if srv, err := utils.CreateSystemService(args, run); err != nil {
runMaster(appInstance) run()
} else { } else {
srv.Run() 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", Use: "install",
Short: "install frp-panel as service", Short: "install frp-panel as service",
DisableFlagParsing: true, DisableFlagParsing: true,
@@ -170,8 +272,10 @@ func initCmdWithoutFlag(appInstance app.Application) []*cobra.Command {
utils.ControlSystemService(args, "install", func() {}) utils.ControlSystemService(args, "install", func() {})
}, },
} }
}
uninstallServiceCmd := &cobra.Command{ func NewUninstallServiceCmd() *cobra.Command {
return &cobra.Command{
Use: "uninstall", Use: "uninstall",
Short: "uninstall frp-panel service", Short: "uninstall frp-panel service",
DisableFlagParsing: true, DisableFlagParsing: true,
@@ -180,8 +284,10 @@ func initCmdWithoutFlag(appInstance app.Application) []*cobra.Command {
utils.ControlSystemService(args, "uninstall", func() {}) utils.ControlSystemService(args, "uninstall", func() {})
}, },
} }
}
startServiceCmd := &cobra.Command{ func NewStartServiceCmd() *cobra.Command {
return &cobra.Command{
Use: "start", Use: "start",
Short: "start frp-panel service", Short: "start frp-panel service",
DisableFlagParsing: true, DisableFlagParsing: true,
@@ -190,8 +296,10 @@ func initCmdWithoutFlag(appInstance app.Application) []*cobra.Command {
utils.ControlSystemService(args, "start", func() {}) utils.ControlSystemService(args, "start", func() {})
}, },
} }
}
stopServiceCmd := &cobra.Command{ func NewStopServiceCmd() *cobra.Command {
return &cobra.Command{
Use: "stop", Use: "stop",
Short: "stop frp-panel service", Short: "stop frp-panel service",
DisableFlagParsing: true, DisableFlagParsing: true,
@@ -200,8 +308,10 @@ func initCmdWithoutFlag(appInstance app.Application) []*cobra.Command {
utils.ControlSystemService(args, "stop", func() {}) utils.ControlSystemService(args, "stop", func() {})
}, },
} }
}
restartServiceCmd := &cobra.Command{ func NewRestartServiceCmd() *cobra.Command {
return &cobra.Command{
Use: "restart", Use: "restart",
Short: "restart frp-panel service", Short: "restart frp-panel service",
DisableFlagParsing: true, DisableFlagParsing: true,
@@ -210,8 +320,10 @@ func initCmdWithoutFlag(appInstance app.Application) []*cobra.Command {
utils.ControlSystemService(args, "restart", func() {}) utils.ControlSystemService(args, "restart", func() {})
}, },
} }
}
versionCmd := &cobra.Command{ func NewVersionCmd() *cobra.Command {
return &cobra.Command{
Use: "version", Use: "version",
Short: "Print the version info of frp-panel", Short: "Print the version info of frp-panel",
Long: `All software has versions. This is frp-panel's`, 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()) fmt.Println(conf.GetVersion().String())
}, },
} }
return []*cobra.Command{
masterCmd,
installServiceCmd,
uninstallServiceCmd,
startServiceCmd,
stopServiceCmd,
restartServiceCmd,
versionCmd,
}
} }
func initLogger() { func patchConfig(appInstance app.Application, commonArgs CommonArgs) conf.Config {
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() c := context.Background()
tmpCfg := appInstance.GetConfig() tmpCfg := appInstance.GetConfig()
if len(rpcHost) != 0 {
tmpCfg.Master.RPCHost = rpcHost if commonArgs.RpcHost != nil {
tmpCfg.Master.APIHost = rpcHost tmpCfg.Master.RPCHost = *commonArgs.RpcHost
tmpCfg.Master.APIHost = *commonArgs.RpcHost
} }
if len(apiHost) != 0 { if commonArgs.ApiHost != nil {
tmpCfg.Master.APIHost = apiHost tmpCfg.Master.APIHost = *commonArgs.ApiHost
} }
if len(secret) != 0 { if commonArgs.AppSecret != nil {
tmpCfg.App.Secret = secret tmpCfg.App.Secret = *commonArgs.AppSecret
} }
if rpcPort != 0 { if commonArgs.RpcPort != nil {
tmpCfg.Master.RPCPort = rpcPort tmpCfg.Master.RPCPort = *commonArgs.RpcPort
} }
if apiPort != 0 { if commonArgs.ApiPort != nil {
tmpCfg.Master.APIPort = apiPort tmpCfg.Master.APIPort = *commonArgs.ApiPort
} }
if len(apiScheme) != 0 { if commonArgs.ApiScheme != nil {
tmpCfg.Master.APIScheme = apiScheme tmpCfg.Master.APIScheme = *commonArgs.ApiScheme
} }
if len(clientID) != 0 { if commonArgs.ClientID != nil {
tmpCfg.Client.ID = clientID tmpCfg.Client.ID = *commonArgs.ClientID
} }
if len(clientSecret) != 0 { if commonArgs.ClientSecret != nil {
tmpCfg.Client.Secret = clientSecret tmpCfg.Client.Secret = *commonArgs.ClientSecret
} }
if len(apiUrl) != 0 { if commonArgs.ApiUrl != nil {
tmpCfg.Client.APIUrl = apiUrl tmpCfg.Client.APIUrl = *commonArgs.ApiUrl
} }
if len(rpcUrl) != 0 { if commonArgs.RpcUrl != nil {
tmpCfg.Client.RPCUrl = rpcUrl 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", 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.RPCHost, tmpCfg.Master.RPCPort,
tmpCfg.Master.APIHost, tmpCfg.Master.APIPort, tmpCfg.Master.APIHost, tmpCfg.Master.APIPort,
tmpCfg.Master.APIScheme) tmpCfg.Master.APIScheme)
} }
logger.Logger(c).Infof("env config, api url: %s, rpc url: %s", tmpCfg.Client.APIUrl, tmpCfg.Client.RPCUrl) 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:]) cmd, _, err := rootCmd.Find(os.Args[1:])
if err == nil && cmd.Use == rootCmd.Use && cmd.Flags().Parse(os.Args[1:]) != pflag.ErrHelp { if err == nil && cmd.Use == rootCmd.Use && cmd.Flags().Parse(os.Args[1:]) != pflag.ErrHelp {
args := append([]string{"master"}, os.Args[1:]...) 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() 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()) logger.Logger(c).Errorf("check pull params failed: %s", err.Error())
return return
} }
@@ -302,14 +404,16 @@ func pullRunConfig(appInstance app.Application, joinToken, appSecret, rpcHost, a
return return
} }
if len(clientID) == 0 { var clientID string
if cliID := joinArgs.ClientID; cliID == nil || len(*cliID) == 0 {
clientID = utils.GetHostnameWithIP() clientID = utils.GetHostnameWithIP()
} }
clientID = utils.MakeClientIDPermited(clientID) 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 { if err != nil {
logger.Logger(c).Errorf("init client failed: %s", err.Error()) logger.Logger(c).Errorf("init client failed: %s", err.Error())
return return
@@ -324,7 +428,7 @@ func pullRunConfig(appInstance app.Application, joinToken, appSecret, rpcHost, a
} }
clientID = initResp.GetClientId() clientID = initResp.GetClientId()
clientResp, err := rpc.GetClient(appInstance, clientID, joinToken) clientResp, err := rpc.GetClient(appInstance, clientID, *joinArgs.JoinToken)
if err != nil { if err != nil {
logger.Logger(c).Errorf("get client failed: %s", err.Error()) logger.Logger(c).Errorf("get client failed: %s", err.Error())
return 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()) 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.EnvClientID] = clientID
envMap[defs.EnvClientSecret] = client.GetSecret() envMap[defs.EnvClientSecret] = client.GetSecret()
envMap[defs.EnvClientAPIUrl] = apiUrl envMap[defs.EnvClientAPIUrl] = *joinArgs.ApiUrl
envMap[defs.EnvClientRPCUrl] = rpcUrl envMap[defs.EnvClientRPCUrl] = *joinArgs.RpcUrl
if err = godotenv.Write(envMap, defs.SysEnvPath); err != nil { if err = godotenv.Write(envMap, defs.SysEnvPath); err != nil {
logger.Logger(c).Errorf("write env file failed: %s", err.Error()) 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) 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 { func checkPullParams(joinArgs *JoinArgs) error {
if len(joinToken) == 0 { if joinToken := joinArgs.JoinToken; joinToken != nil && len(*joinToken) == 0 {
return errors.New("join token is empty") 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") 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") 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 errors.New("api port is empty")
} }
return nil 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
}

View File

@@ -1,30 +1,14 @@
package main package main
import ( import (
"sync" "github.com/VaalaCat/frp-panel/utils/logger"
"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/spf13/cobra" "github.com/spf13/cobra"
) )
func main() { func main() {
initLogger() logger.InitLogger()
cobra.MousetrapHelpText = "" cobra.MousetrapHelpText = ""
cfg := conf.NewConfig() rootCmd := buildCommand()
setMasterCommandIfNonePresent(rootCmd)
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.Execute() rootCmd.Execute()
} }

View File

@@ -2,199 +2,77 @@ package main
import ( import (
"context" "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/auth"
"github.com/VaalaCat/frp-panel/biz/master/proxy" "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/conf"
"github.com/VaalaCat/frp-panel/dao" "github.com/VaalaCat/frp-panel/services/app"
"github.com/VaalaCat/frp-panel/defs" "github.com/VaalaCat/frp-panel/services/cache"
"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/master" "github.com/VaalaCat/frp-panel/services/master"
"github.com/VaalaCat/frp-panel/services/mux" "github.com/VaalaCat/frp-panel/services/mux"
"github.com/VaalaCat/frp-panel/services/rpcclient" "github.com/VaalaCat/frp-panel/services/watcher"
"github.com/VaalaCat/frp-panel/tunnel" "github.com/VaalaCat/frp-panel/utils/logger"
"github.com/VaalaCat/frp-panel/utils"
"github.com/VaalaCat/frp-panel/utils/wsgrpc" "github.com/VaalaCat/frp-panel/utils/wsgrpc"
"github.com/VaalaCat/frp-panel/watcher"
"github.com/fatedier/golib/crypto" "github.com/fatedier/golib/crypto"
"github.com/glebarez/sqlite" "github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
"github.com/sirupsen/logrus"
"github.com/sourcegraph/conc" "github.com/sourcegraph/conc"
"google.golang.org/grpc/credentials" "go.uber.org/fx"
"google.golang.org/grpc/credentials/insecure"
"gorm.io/driver/mysql"
"gorm.io/driver/postgres"
"gorm.io/gorm"
) )
//go:embed all:out type runMasterParam struct {
var fs embed.FS fx.In
func runMaster(appInstance app.Application) { Lc fx.Lifecycle
c := app.NewContext(context.Background(), appInstance)
cfg := appInstance.GetConfig() 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) 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(param.AppInstance.GetConfig())
cache.InitCache(cfg) auth.InitAuth(param.AppInstance)
auth.InitAuth(appInstance)
creds := dao.NewQuery(c).InitCert(conf.GetCertTemplate(cfg))
router := bizmaster.NewRouter(fs, appInstance) param.TaskManager.AddCronTask("0 0 3 * * *", proxy.CollectDailyStats, param.AppInstance)
defer param.TaskManager.Stop()
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()
logger.Logger(param.Ctx).Infof("start to run master")
var wg conc.WaitGroup var wg conc.WaitGroup
logger.Logger(c).Infof("start to run master") param.Lc.Append(fx.Hook{
OnStart: func(ctx context.Context) error {
go func() { wg.Go(func() {
wsGrpcServer := master.NewMasterService(appInstance, insecure.NewCredentials()).GetServer() if err := param.MasterService.GetServer().Serve(param.WsListener); err != nil {
if err := wsGrpcServer.Serve(wsListener); err != nil { logger.Logger(param.Ctx).Fatalf("gRPC server error: %v", err)
logrus.Fatalf("gRPC server error: %v", err) }
} })
}() wg.Go(param.TLSMuxServer.Run)
wg.Go(func() { runDefaultInternalServer(appInstance) }) wg.Go(param.HTTPMuxServer.Run)
wg.Go(muxServer.Run) wg.Go(param.TaskManager.Run)
wg.Go(httpMuxServer.Run) return nil
wg.Go(tasks.Run) },
OnStop: func(ctx context.Context) error {
wg.Wait() param.MasterService.GetServer().Stop()
} param.TLSMuxServer.Stop()
param.HTTPMuxServer.Stop()
func initDatabase(c context.Context, appInstance app.Application) { param.TaskManager.Stop()
logger.Logger(c).Infof("start to init database, type: %s", appInstance.GetConfig().DB.Type) wg.Wait()
mgr := models.NewDBManager(nil, appInstance.GetConfig().DB.Type) return nil
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()
} }

44
cmd/frpp/modules.go Normal file
View File

@@ -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,
))
)

278
cmd/frpp/providers.go Normal file
View File

@@ -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
}

View File

@@ -2,82 +2,88 @@ package main
import ( import (
"context" "context"
"net"
"github.com/VaalaCat/frp-panel/app"
bizserver "github.com/VaalaCat/frp-panel/biz/server" bizserver "github.com/VaalaCat/frp-panel/biz/server"
"github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/conf"
"github.com/VaalaCat/frp-panel/defs" "github.com/VaalaCat/frp-panel/defs"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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/api"
"github.com/VaalaCat/frp-panel/services/rpcclient" "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/utils" "github.com/VaalaCat/frp-panel/services/watcher"
"github.com/VaalaCat/frp-panel/watcher" "github.com/VaalaCat/frp-panel/utils/logger"
"github.com/fatedier/golib/crypto" "github.com/fatedier/golib/crypto"
"github.com/sirupsen/logrus"
"github.com/sourcegraph/conc" "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 ( var (
c = context.Background() c = context.Background()
clientID = appInstance.GetConfig().Client.ID clientID = param.AppInstance.GetConfig().Client.ID
clientSecret = appInstance.GetConfig().Client.Secret clientSecret = param.AppInstance.GetConfig().Client.Secret
cfg = appInstance.GetConfig() cfg = param.AppInstance.GetConfig()
appInstance = param.AppInstance
ctx = param.AppCtx
) )
crypto.DefaultSalt = cfg.App.Secret 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 { 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)) param.TaskManager.AddDurationTask(defs.PullConfigDuration, bizserver.PullConfig, appInstance, clientID, clientSecret)
if err != nil { param.TaskManager.AddDurationTask(defs.PushProxyInfoDuration, bizserver.PushProxyInfo, appInstance, clientID, clientSecret)
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)
var wg conc.WaitGroup var wg conc.WaitGroup
wg.Go(r.Run)
wg.Go(w.Run) param.Lc.Append(fx.Hook{
wg.Go(a.Run) OnStart: func(ctx context.Context) error {
wg.Wait() 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) { func initServerOnce(appInstance app.Application, clientID, clientSecret string) {

View File

@@ -11,7 +11,7 @@ package main
// Data: []byte(fmt.Sprint(cnt)), // Data: []byte(fmt.Sprint(cnt)),
// }) // })
// if string(resp.Data) != fmt.Sprint(cnt) { // if string(resp.Data) != fmt.Sprint(cnt) {
// logrus.Panicf("resp: %+v", resp) // logger.Logger(ctx).Panicf("resp: %+v", resp)
// } // }
// }) // })
// } // }

View File

@@ -3,18 +3,17 @@ package main
import ( import (
"context" "context"
"github.com/VaalaCat/frp-panel/app"
bizclient "github.com/VaalaCat/frp-panel/biz/client" bizclient "github.com/VaalaCat/frp-panel/biz/client"
"github.com/VaalaCat/frp-panel/defs" "github.com/VaalaCat/frp-panel/defs"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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/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/utils"
"github.com/VaalaCat/frp-panel/watcher" "github.com/VaalaCat/frp-panel/utils/logger"
"github.com/fatedier/golib/crypto" "github.com/fatedier/golib/crypto"
"github.com/sirupsen/logrus"
"github.com/sourcegraph/conc" "github.com/sourcegraph/conc"
) )
@@ -23,23 +22,24 @@ func runClient(appInstance app.Application) {
c = context.Background() c = context.Background()
clientID = appInstance.GetConfig().Client.ID clientID = appInstance.GetConfig().Client.ID
clientSecret = appInstance.GetConfig().Client.Secret clientSecret = appInstance.GetConfig().Client.Secret
ctx = context.Background()
) )
crypto.DefaultSalt = appInstance.GetConfig().App.Secret crypto.DefaultSalt = appInstance.GetConfig().App.Secret
logger.Logger(c).Infof("start to run client") logger.Logger(c).Infof("start to run client")
if len(clientSecret) == 0 { if len(clientSecret) == 0 {
logrus.Fatal("client secret cannot be empty") logger.Logger(ctx).Fatal("client secret cannot be empty")
} }
if len(clientID) == 0 { 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)) cred, err := utils.TLSClientCertNoValidate(rpc.GetClientCert(appInstance, clientID, clientSecret, pb.ClientType_CLIENT_TYPE_FRPC))
if err != nil { if err != nil {
logrus.Fatal(err) logger.Logger(ctx).Fatal(err)
} }
appInstance.SetClientCred(cred) appInstance.SetRPCCred(cred)
appInstance.SetMasterCli(rpc.NewMasterCli(appInstance)) appInstance.SetMasterCli(rpc.NewMasterCli(appInstance))
appInstance.SetClientController(tunnel.NewClientController()) appInstance.SetClientController(tunnel.NewClientController())

View File

@@ -6,15 +6,14 @@ import (
"fmt" "fmt"
"os" "os"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/conf"
"github.com/VaalaCat/frp-panel/defs" "github.com/VaalaCat/frp-panel/defs"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "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"
"github.com/VaalaCat/frp-panel/utils/logger"
"github.com/joho/godotenv" "github.com/joho/godotenv"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag" "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) { func patchConfig(appInstance app.Application, apiHost, rpcHost, secret, clientID, clientSecret, apiScheme string, rpcPort, apiPort int, apiUrl, rpcUrl string) {
c := context.Background() c := context.Background()
tmpCfg := appInstance.GetConfig() tmpCfg := appInstance.GetConfig()

View File

@@ -3,16 +3,17 @@ package main
import ( import (
"sync" "sync"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/biz/common" "github.com/VaalaCat/frp-panel/biz/common"
"github.com/VaalaCat/frp-panel/biz/master/shell" "github.com/VaalaCat/frp-panel/biz/master/shell"
"github.com/VaalaCat/frp-panel/conf" "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" "github.com/spf13/cobra"
) )
func main() { func main() {
initLogger() logger.InitLogger()
cobra.MousetrapHelpText = "" cobra.MousetrapHelpText = ""
cfg := conf.NewConfig() cfg := conf.NewConfig()

View File

@@ -11,8 +11,8 @@ import (
"time" "time"
"github.com/VaalaCat/frp-panel/defs" "github.com/VaalaCat/frp-panel/defs"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/utils" "github.com/VaalaCat/frp-panel/utils"
"github.com/VaalaCat/frp-panel/utils/logger"
v1 "github.com/fatedier/frp/pkg/config/v1" v1 "github.com/fatedier/frp/pkg/config/v1"
) )

View File

@@ -6,10 +6,10 @@ import (
"os" "os"
"github.com/VaalaCat/frp-panel/defs" "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/ilyakaznacheev/cleanenv"
"github.com/joho/godotenv" "github.com/joho/godotenv"
"github.com/sirupsen/logrus"
) )
type Config struct { type Config struct {
@@ -77,15 +77,19 @@ func NewConfig() Config {
} }
if !useEnvFile { if !useEnvFile {
logrus.Info("use runtime env variables") logger.Logger(ctx).Info("use runtime env variables")
} }
cfg := Config{} cfg := Config{}
if err = cleanenv.ReadEnv(&cfg); err != nil { if err = cleanenv.ReadEnv(&cfg); err != nil {
logrus.Panic(err) logger.Logger(ctx).Panic(err)
} }
cfg.Complete() cfg.Complete()
if !cfg.IsDebug {
gin.SetMode(gin.ReleaseMode)
}
return cfg return cfg
} }

1
docs/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
cache

13
go.mod
View File

@@ -28,9 +28,10 @@ require (
github.com/spf13/cobra v1.8.0 github.com/spf13/cobra v1.8.0
github.com/spf13/pflag v1.0.5 github.com/spf13/pflag v1.0.5
github.com/tiendc/go-deepcopy v1.2.0 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/crypto v0.31.0
golang.org/x/net v0.33.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 google.golang.org/protobuf v1.35.2
gorm.io/driver/mysql v1.5.2 gorm.io/driver/mysql v1.5.2
gorm.io/driver/postgres v1.5.4 gorm.io/driver/postgres v1.5.4
@@ -105,6 +106,7 @@ require (
github.com/refraction-networking/utls v1.6.0 // indirect github.com/refraction-networking/utls v1.6.0 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/robfig/cron/v3 v3.0.1 // 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/objx v0.5.2 // indirect
github.com/stretchr/testify v1.9.0 // indirect github.com/stretchr/testify v1.9.0 // indirect
github.com/templexxx/cpu v0.1.1 // 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/ugorji/go/codec v1.2.11 // indirect
github.com/xtaci/kcp-go/v5 v5.6.13 // indirect github.com/xtaci/kcp-go/v5 v5.6.13 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // 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/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/arch v0.3.0 // indirect
golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc // indirect golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc // indirect
golang.org/x/mod v0.17.0 // 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/sync v0.10.0 // indirect
golang.org/x/sys v0.28.0 // indirect golang.org/x/sys v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect golang.org/x/text v0.21.0 // indirect
golang.org/x/time v0.5.0 // indirect golang.org/x/time v0.5.0 // indirect
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // 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/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect

28
go.sum
View File

@@ -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/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 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= 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.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= 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/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 h1:4gTz1wUhNYLhFSKl6O+8peW0v2F4BCY034GRpU9WnuA=
github.com/samber/lo v1.39.0/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= 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/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 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= 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/dig v1.18.1 h1:rLww6NuajVjeQn+49u5NcezUJEGwd5uXmyoCKW2g5Es=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= 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 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= 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 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= 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.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= 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.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 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= 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 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= 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.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA=
golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 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-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-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/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/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-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 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-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs=
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/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 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.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= 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.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= 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-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-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=

View File

@@ -1,13 +1,13 @@
package middleware package middleware
import ( import (
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/common"
"github.com/VaalaCat/frp-panel/dao"
"github.com/VaalaCat/frp-panel/defs" "github.com/VaalaCat/frp-panel/defs"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/models" "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"
"github.com/VaalaCat/frp-panel/utils/logger"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )

View File

@@ -5,12 +5,12 @@ import (
"strings" "strings"
"time" "time"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/common"
"github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/conf"
"github.com/VaalaCat/frp-panel/defs" "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"
"github.com/VaalaCat/frp-panel/utils/logger"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/golang-jwt/jwt/v5" "github.com/golang-jwt/jwt/v5"
) )

View File

@@ -3,7 +3,7 @@ package models
import ( import (
"context" "context"
"github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/utils/logger"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -5,8 +5,8 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/utils" "github.com/VaalaCat/frp-panel/utils"
"github.com/VaalaCat/frp-panel/utils/logger"
v1 "github.com/fatedier/frp/pkg/config/v1" v1 "github.com/fatedier/frp/pkg/config/v1"
"github.com/tiendc/go-deepcopy" "github.com/tiendc/go-deepcopy"
) )

View File

@@ -4,13 +4,12 @@ import (
"sync" "sync"
"github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/conf"
"github.com/VaalaCat/frp-panel/pb"
"google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials"
) )
type application struct { type application struct {
streamLogHookMgr StreamLogHookMgr streamLogHookMgr StreamLogHookMgr
masterCli pb.MasterClient masterCli MasterClient
shellPTYMgr ShellPTYMgr shellPTYMgr ShellPTYMgr
clientLogManager ClientLogManager clientLogManager ClientLogManager
@@ -21,13 +20,18 @@ type application struct {
clientsManager ClientsManager clientsManager ClientsManager
serverHandler ServerHandler serverHandler ServerHandler
serverController ServerController serverController ServerController
clientCred credentials.TransportCredentials rpcCred credentials.TransportCredentials
conf conf.Config conf conf.Config
} }
// GetClientCred implements Application. // GetClientCred implements Application.
func (a *application) GetClientCred() credentials.TransportCredentials { func (a *application) GetRPCCred() credentials.TransportCredentials {
return a.clientCred return a.rpcCred
}
// SetClientCred implements Application.
func (a *application) SetRPCCred(cred credentials.TransportCredentials) {
a.rpcCred = cred
} }
// GetConfig implements Application. // GetConfig implements Application.
@@ -35,11 +39,6 @@ func (a *application) GetConfig() conf.Config {
return a.conf return a.conf
} }
// SetClientCred implements Application.
func (a *application) SetClientCred(cred credentials.TransportCredentials) {
a.clientCred = cred
}
// SetConfig implements Application. // SetConfig implements Application.
func (a *application) SetConfig(c conf.Config) { func (a *application) SetConfig(c conf.Config) {
a.conf = c a.conf = c
@@ -86,12 +85,12 @@ func (a *application) SetClientRPCHandler(clientRPCHandler ClientRPCHandler) {
} }
// GetMasterCli implements Application. // GetMasterCli implements Application.
func (a *application) GetMasterCli() pb.MasterClient { func (a *application) GetMasterCli() MasterClient {
return a.masterCli return a.masterCli
} }
// SetMasterCli implements Application. // SetMasterCli implements Application.
func (a *application) SetMasterCli(masterCli pb.MasterClient) { func (a *application) SetMasterCli(masterCli MasterClient) {
a.masterCli = masterCli a.masterCli = masterCli
} }

View File

@@ -5,7 +5,6 @@ import (
"sync" "sync"
"github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/conf"
"github.com/VaalaCat/frp-panel/pb"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials"
) )
@@ -23,8 +22,8 @@ type Application interface {
SetClientRecvMap(*sync.Map) SetClientRecvMap(*sync.Map)
GetClientsManager() ClientsManager GetClientsManager() ClientsManager
SetClientsManager(ClientsManager) SetClientsManager(ClientsManager)
GetMasterCli() pb.MasterClient GetMasterCli() MasterClient
SetMasterCli(pb.MasterClient) SetMasterCli(MasterClient)
GetClientRPCHandler() ClientRPCHandler GetClientRPCHandler() ClientRPCHandler
SetClientRPCHandler(ClientRPCHandler) SetClientRPCHandler(ClientRPCHandler)
GetServerHandler() ServerHandler GetServerHandler() ServerHandler
@@ -35,8 +34,8 @@ type Application interface {
SetServerController(ServerController) SetServerController(ServerController)
GetConfig() conf.Config GetConfig() conf.Config
SetConfig(conf.Config) SetConfig(conf.Config)
GetClientCred() credentials.TransportCredentials GetRPCCred() credentials.TransportCredentials
SetClientCred(credentials.TransportCredentials) SetRPCCred(credentials.TransportCredentials)
} }
type Context struct { type Context struct {

View File

@@ -5,8 +5,8 @@ import (
"fmt" "fmt"
"github.com/VaalaCat/frp-panel/common" "github.com/VaalaCat/frp-panel/common"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "github.com/VaalaCat/frp-panel/pb"
"github.com/VaalaCat/frp-panel/utils/logger"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"google.golang.org/protobuf/proto" "google.golang.org/protobuf/proto"
) )

View File

@@ -114,7 +114,7 @@ type ClientHandler interface {
type ClientRPCHandler interface { type ClientRPCHandler interface {
Run() Run()
Stop() Stop()
GetCli() pb.MasterClient GetCli() MasterClient
} }
type ClientController interface { type ClientController interface {
@@ -152,3 +152,8 @@ type ServerHandler interface {
GetMem() *mem.ServerStats GetMem() *mem.ServerStats
GetProxyStatsByType(v1.ProxyType) []*mem.ProxyStats GetProxyStatsByType(v1.ProxyType) []*mem.ProxyStats
} }
// rpc/master.go
type MasterClient interface {
Call() pb.MasterClient
}

View File

@@ -4,7 +4,7 @@ import (
"context" "context"
"github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/conf"
"github.com/VaalaCat/frp-panel/logger" "github.com/VaalaCat/frp-panel/utils/logger"
"github.com/coocood/freecache" "github.com/coocood/freecache"
) )

View File

@@ -7,9 +7,9 @@ import (
"syscall" "syscall"
"time" "time"
"github.com/VaalaCat/frp-panel/app" "github.com/VaalaCat/frp-panel/services/app"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/utils" "github.com/VaalaCat/frp-panel/utils"
"github.com/VaalaCat/frp-panel/utils/logger"
"github.com/fatedier/frp/client" "github.com/fatedier/frp/client"
"github.com/fatedier/frp/client/proxy" "github.com/fatedier/frp/client/proxy"
v1 "github.com/fatedier/frp/pkg/config/v1" v1 "github.com/fatedier/frp/pkg/config/v1"

View File

@@ -2,6 +2,7 @@ package dao
import ( import (
"bytes" "bytes"
"context"
"crypto/rand" "crypto/rand"
"crypto/rsa" "crypto/rsa"
"crypto/tls" "crypto/tls"
@@ -10,22 +11,23 @@ import (
"github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/models"
"github.com/VaalaCat/frp-panel/utils" "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 { func (q *queryImpl) InitCert(template *x509.Certificate) *tls.Config {
ctx := context.Background()
var ( var (
certPem []byte certPem []byte
keyPem []byte keyPem []byte
) )
cnt, err := q.CountCerts() cnt, err := q.CountCerts()
if err != nil { if err != nil {
logrus.Fatal(err) logger.Logger(ctx).Fatal(err)
} }
if cnt == 0 { if cnt == 0 {
certPem, keyPem, err = GenX509Info(template) certPem, keyPem, err = GenX509Info(template)
if err != nil { if err != nil {
logrus.Fatal(err) logger.Logger(ctx).Fatal(err)
} }
if err = q.ctx.GetApp().GetDBManager().GetDefaultDB().Create(&models.Cert{ if err = q.ctx.GetApp().GetDBManager().GetDefaultDB().Create(&models.Cert{
Name: "default", Name: "default",
@@ -33,18 +35,18 @@ func (q *queryImpl) InitCert(template *x509.Certificate) *tls.Config {
CaFile: certPem, CaFile: certPem,
KeyFile: keyPem, KeyFile: keyPem,
}).Error; err != nil { }).Error; err != nil {
logrus.Fatal(err) logger.Logger(ctx).Fatal(err)
} }
} else { } else {
keyPem, certPem, err = q.GetDefaultKeyPair() keyPem, certPem, err = q.GetDefaultKeyPair()
if err != nil { if err != nil {
logrus.Fatal(err) logger.Logger(ctx).Fatal(err)
} }
} }
resp, err := utils.TLSServerCert(certPem, keyPem) resp, err := utils.TLSServerCert(certPem, keyPem)
if err != nil { if err != nil {
logrus.Fatal(err) logger.Logger(ctx).Fatal(err)
} }
return resp return resp
} }

View File

@@ -6,10 +6,10 @@ import (
"strings" "strings"
"time" "time"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/models" "github.com/VaalaCat/frp-panel/models"
"github.com/VaalaCat/frp-panel/pb" "github.com/VaalaCat/frp-panel/pb"
"github.com/VaalaCat/frp-panel/utils" "github.com/VaalaCat/frp-panel/utils"
"github.com/VaalaCat/frp-panel/utils/logger"
"github.com/samber/lo" "github.com/samber/lo"
"github.com/sourcegraph/conc/pool" "github.com/sourcegraph/conc/pool"
"gorm.io/gorm" "gorm.io/gorm"

View File

@@ -1,6 +1,6 @@
package dao package dao
import "github.com/VaalaCat/frp-panel/app" import "github.com/VaalaCat/frp-panel/services/app"
type Query interface{} type Query interface{}

View File

@@ -6,18 +6,17 @@ import (
"io" "io"
"net" "net"
"github.com/VaalaCat/frp-panel/app"
"github.com/VaalaCat/frp-panel/biz/master/client" "github.com/VaalaCat/frp-panel/biz/master/client"
masterserver "github.com/VaalaCat/frp-panel/biz/master/server" masterserver "github.com/VaalaCat/frp-panel/biz/master/server"
"github.com/VaalaCat/frp-panel/biz/master/shell" "github.com/VaalaCat/frp-panel/biz/master/shell"
"github.com/VaalaCat/frp-panel/biz/master/streamlog" "github.com/VaalaCat/frp-panel/biz/master/streamlog"
"github.com/VaalaCat/frp-panel/conf" "github.com/VaalaCat/frp-panel/conf"
"github.com/VaalaCat/frp-panel/dao"
"github.com/VaalaCat/frp-panel/defs" "github.com/VaalaCat/frp-panel/defs"
"github.com/VaalaCat/frp-panel/logger"
"github.com/VaalaCat/frp-panel/pb" "github.com/VaalaCat/frp-panel/pb"
"github.com/VaalaCat/frp-panel/rpc" "github.com/VaalaCat/frp-panel/services/app"
"github.com/sirupsen/logrus" "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"
"google.golang.org/grpc/credentials" "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) { func runRpcServer(appInstance app.Application, s *grpc.Server) {
ctx := context.Background()
lis, err := net.Listen("tcp", conf.RPCListenAddr(appInstance.GetConfig())) lis, err := net.Listen("tcp", conf.RPCListenAddr(appInstance.GetConfig()))
if err != nil { 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 { if err := s.Serve(lis); err != nil {
logrus.Fatalf("failed to serve: %v", err) logger.Logger(ctx).Fatalf("failed to serve: %v", err)
} }
} }

Some files were not shown because too many files have changed in this diff Show More