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, bizclient.PullConfig, appInstance, clientID, clientSecret)
clientID, clientSecret, pb.ClientType_CLIENT_TYPE_FRPC))
if err != nil {
logrus.Fatal(err)
}
appInstance.SetClientCred(cred) var wg conc.WaitGroup
appInstance.SetMasterCli(rpc.NewMasterCli(appInstance)) param.Lc.Append(fx.Hook{
OnStart: func(ctx context.Context) error {
appInstance.SetRPCCred(NewClientCred(appInstance))
appInstance.SetMasterCli(NewClientMasterCli(appInstance))
appInstance.SetClientController(tunnel.NewClientController()) appInstance.SetClientController(tunnel.NewClientController())
r := rpcclient.NewClientRPCHandler( cliRpcHandler := rpcclient.NewClientRPCHandler(
appInstance, appInstance,
clientID, clientID,
clientSecret, clientSecret,
pb.Event_EVENT_REGISTER_CLIENT, pb.Event_EVENT_REGISTER_CLIENT,
bizclient.HandleServerMessage, bizclient.HandleServerMessage,
) )
appInstance.SetClientRPCHandler(r) appInstance.SetClientRPCHandler(cliRpcHandler)
w := watcher.NewClient()
w.AddDurationTask(defs.PullConfigDuration,
bizclient.PullConfig, appInstance, clientID, clientSecret)
initClientOnce(appInstance, clientID, clientSecret) initClientOnce(appInstance, clientID, clientSecret)
defer w.Stop() wg.Go(cliRpcHandler.Run)
defer r.Stop() wg.Go(param.TaskManager.Run)
return nil
},
OnStop: func(ctx context.Context) error {
param.TaskManager.Stop()
appInstance.GetClientRPCHandler().Stop()
var wg conc.WaitGroup
wg.Go(r.Run)
wg.Go(w.Run)
wg.Wait() 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
RpcHost *string
ApiHost *string
RpcPort *int
ApiPort *int
ApiScheme *string
}
func buildCommand() *cobra.Command {
cfg := conf.NewConfig()
return NewRootCmd(
NewMasterCmd(cfg),
NewClientCmd(cfg),
NewServerCmd(cfg),
NewJoinCmd(),
NewInstallServiceCmd(),
NewUninstallServiceCmd(),
NewStartServiceCmd(),
NewStopServiceCmd(),
NewRestartServiceCmd(),
NewVersionCmd(),
) )
func initCommand(appInstance app.Application) {
rootCmd = &cobra.Command{
Use: "frp-panel",
Short: "frp-panel is a frp panel QwQ",
}
CmdListWithFlag := initCmdWithFlag(appInstance)
CmdListWithoutFlag := initCmdWithoutFlag(appInstance)
rootCmd.AddCommand(CmdListWithFlag...)
rootCmd.AddCommand(CmdListWithoutFlag...)
} }
func initCmdWithFlag(appInstance app.Application) []*cobra.Command { func AddCommonFlags(commonCmd *cobra.Command) {
var ( commonCmd.Flags().StringP("secret", "s", "", "client secret")
clientSecret string commonCmd.Flags().StringP("id", "i", "", "client id")
clientID string commonCmd.Flags().StringP("app", "a", "", "app secret")
rpcHost string commonCmd.Flags().String("rpc-url", "", "rpc url, master rpc url, scheme can be grpc/ws/wss://hostname:port")
apiHost string commonCmd.Flags().String("api-url", "", "api url, master api url, scheme can be http/https://hostname:port")
appSecret string
rpcPort int
apiPort int
apiScheme string
joinToken string
rpcUrl string
apiUrl string
)
clientCmd = &cobra.Command{ // deprecated start
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("rpc", "r", "", "deprecated, use --rpc-url instead, rpc host, canbe ip or domain")
Short: "run managed frpc", commonCmd.Flags().StringP("api", "t", "", "deprecated, use --api-url instead, api host, canbe ip or domain")
Run: func(cmd *cobra.Command, args []string) { commonCmd.Flags().IntP("rpc-port", "c", 0, "deprecated, use --rpc-url instead, rpc port, master rpc port, scheme is grpc")
run := func() { commonCmd.Flags().IntP("api-port", "p", 0, "deprecated, use --api-url instead, api port, master api port, scheme is http/https")
patchConfig(appInstance, commonCmd.Flags().StringP("api-scheme", "e", "", "deprecated, use --api-url instead, api scheme, master api scheme, scheme is http/https")
apiHost, rpcHost, appSecret, // deprecated end
clientID, clientSecret,
apiScheme, rpcPort, apiPort,
apiUrl, rpcUrl)
runClient(appInstance)
}
if srv, err := utils.CreateSystemService(args, run); err != nil {
run()
} else {
srv.Run()
}
},
} }
serverCmd = &cobra.Command{ func GetCommonArgs(cmd *cobra.Command) CommonArgs {
Use: "server [-s client secret] [-i client id] [-a app secret] [-r rpc host] [-c rpc port] [-p api port]", var commonArgs CommonArgs
Short: "run managed frps",
Run: func(cmd *cobra.Command, args []string) { if clientSecret, err := cmd.Flags().GetString("secret"); err == nil {
run := func() { commonArgs.ClientSecret = &clientSecret
patchConfig(appInstance,
apiHost, rpcHost, appSecret,
clientID, clientSecret,
apiScheme, rpcPort, apiPort,
apiUrl, rpcUrl)
runServer(appInstance)
}
if srv, err := utils.CreateSystemService(args, run); err != nil {
run()
} else {
srv.Run()
}
},
} }
if clientID, err := cmd.Flags().GetString("id"); err == nil {
commonArgs.ClientID = &clientID
}
if appSecret, err := cmd.Flags().GetString("app"); err == nil {
commonArgs.AppSecret = &appSecret
}
if rpcURL, err := cmd.Flags().GetString("rpc-url"); err == nil {
commonArgs.RpcUrl = &rpcURL
}
if apiURL, err := cmd.Flags().GetString("api-url"); err == nil {
commonArgs.ApiUrl = &apiURL
}
if rpcHost, err := cmd.Flags().GetString("rpc-host"); err == nil {
commonArgs.RpcHost = &rpcHost
}
if apiHost, err := cmd.Flags().GetString("api-host"); err == nil {
commonArgs.ApiHost = &apiHost
}
if rpcPort, err := cmd.Flags().GetInt("rpc-port"); err == nil {
commonArgs.RpcPort = &rpcPort
}
if apiPort, err := cmd.Flags().GetInt("api-port"); err == nil {
commonArgs.ApiPort = &apiPort
}
if apiScheme, err := cmd.Flags().GetString("api-scheme"); err == nil {
commonArgs.ApiScheme = &apiScheme
}
return commonArgs
}
type JoinArgs struct {
CommonArgs
JoinToken *string
}
func NewJoinCmd() *cobra.Command {
joinCmd := &cobra.Command{ 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(func() { runDefaultInternalServer(appInstance) }) wg.Go(param.TLSMuxServer.Run)
wg.Go(muxServer.Run) wg.Go(param.HTTPMuxServer.Run)
wg.Go(httpMuxServer.Run) wg.Go(param.TaskManager.Run)
wg.Go(tasks.Run) return nil
},
wg.Wait() OnStop: func(ctx context.Context) error {
} param.MasterService.GetServer().Stop()
param.TLSMuxServer.Stop()
func initDatabase(c context.Context, appInstance app.Application) { param.HTTPMuxServer.Stop()
logger.Logger(c).Infof("start to init database, type: %s", appInstance.GetConfig().DB.Type) param.TaskManager.Stop()
mgr := models.NewDBManager(nil, appInstance.GetConfig().DB.Type)
appInstance.SetDBManager(mgr)
if appInstance.GetConfig().IsDebug {
appInstance.GetDBManager().SetDebug(true)
}
switch appInstance.GetConfig().DB.Type {
case "sqlite3":
if err := utils.EnsureDirectoryExists(appInstance.GetConfig().DB.DSN); err != nil {
logrus.WithError(err).Warnf("ensure directory failed, data location: [%s], keep data in current directory",
appInstance.GetConfig().DB.DSN)
tmpCfg := appInstance.GetConfig()
tmpCfg.DB.DSN = filepath.Base(appInstance.GetConfig().DB.DSN)
appInstance.SetConfig(tmpCfg)
logrus.Infof("new data location: [%s]", appInstance.GetConfig().DB.DSN)
}
if sqlitedb, err := gorm.Open(sqlite.Open(appInstance.GetConfig().DB.DSN), &gorm.Config{}); err != nil {
logrus.Panic(err)
} else {
appInstance.GetDBManager().SetDB("sqlite3", sqlitedb)
logger.Logger(c).Infof("init database success, data location: [%s]", appInstance.GetConfig().DB.DSN)
}
case "mysql":
if mysqlDB, err := gorm.Open(mysql.Open(appInstance.GetConfig().DB.DSN), &gorm.Config{}); err != nil {
logrus.Panic(err)
} else {
appInstance.GetDBManager().SetDB("mysql", mysqlDB)
logger.Logger(c).Infof("init database success, data type: [%s]", "mysql")
}
case "postgres":
if postgresDB, err := gorm.Open(postgres.Open(appInstance.GetConfig().DB.DSN), &gorm.Config{}); err != nil {
logrus.Panic(err)
} else {
appInstance.GetDBManager().SetDB("postgres", postgresDB)
logger.Logger(c).Infof("init database success, data type: [%s]", "postgres")
}
default:
logrus.Panicf("currently unsupported database type: %s", appInstance.GetConfig().DB.Type)
}
appInstance.GetDBManager().Init()
}
func runDefaultInternalServer(appInstance app.Application) {
logger.Logger(context.Background()).Infof("init default internal server")
appCtx := app.NewContext(clientCmd.Context(), appInstance)
dao.NewQuery(appCtx).InitDefaultServer(appInstance.GetConfig().Master.APIHost)
defaultServer, err := dao.NewQuery(appCtx).GetDefaultServer()
if err != nil {
logrus.Fatal(err)
}
cred, err := utils.TLSClientCertNoValidate(rpc.GetClientCert(
appInstance,
defaultServer.ServerID, defaultServer.ConnectSecret, pb.ClientType_CLIENT_TYPE_FRPS))
if err != nil {
logrus.Fatal(err)
}
appInstance.SetClientCred(cred)
appInstance.SetMasterCli(rpc.NewMasterCli(appInstance))
appInstance.SetServerController(tunnel.NewServerController())
cliHandler := rpcclient.NewClientRPCHandler(
appInstance,
defaultServer.ServerID, defaultServer.ConnectSecret,
pb.Event_EVENT_REGISTER_SERVER,
bizserver.HandleServerMessage,
)
appInstance.SetClientRPCHandler(cliHandler)
tmpCfg := appInstance.GetConfig()
tmpCfg.Client.ID = defaultServer.ServerID
tmpCfg.Client.Secret = defaultServer.ConnectSecret
appInstance.SetConfig(tmpCfg)
r := cliHandler
w := watcher.NewClient()
w.AddDurationTask(defs.PullConfigDuration, bizserver.PullConfig, appInstance, defaultServer.ServerID, defaultServer.ConnectSecret)
w.AddDurationTask(defs.PushProxyInfoDuration, bizserver.PushProxyInfo, appInstance, defaultServer.ServerID, defaultServer.ConnectSecret)
go initServerOnce(appInstance, defaultServer.ServerID, defaultServer.ConnectSecret)
var wg conc.WaitGroup
defer w.Stop()
defer r.Stop()
wg.Go(w.Run)
wg.Go(r.Run)
wg.Wait() wg.Wait()
return nil
},
})
} }

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,56 +2,60 @@ 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) var wg conc.WaitGroup
defer a.Stop()
cred, err := utils.TLSClientCertNoValidate(rpc.GetClientCert(appInstance, clientID, clientSecret, pb.ClientType_CLIENT_TYPE_FRPS)) param.Lc.Append(fx.Hook{
if err != nil { OnStart: func(ctx context.Context) error {
logrus.Fatal(err) logger.Logger(ctx).Infof("start to run server, serverID: [%s]", clientID)
} appInstance.SetRPCCred(NewServerCred(appInstance))
appInstance.SetClientCred(cred) appInstance.SetMasterCli(NewServerMasterCli(appInstance))
appInstance.SetMasterCli(rpc.NewMasterCli(appInstance))
appInstance.SetServerController(tunnel.NewServerController())
cliHandler := rpcclient.NewClientRPCHandler( cliHandler := rpcclient.NewClientRPCHandler(
appInstance, appInstance,
@@ -62,22 +66,24 @@ func runServer(appInstance app.Application) {
) )
appInstance.SetClientRPCHandler(cliHandler) appInstance.SetClientRPCHandler(cliHandler)
appInstance.SetServerController(tunnel.NewServerController())
r := cliHandler go initServerOnce(appInstance, clientID, clientSecret)
defer r.Stop() wg.Go(cliHandler.Run)
wg.Go(param.TaskManager.Run)
w := watcher.NewClient() wg.Go(param.ServerApiService.Run)
w.AddDurationTask(defs.PullConfigDuration, bizserver.PullConfig, clientID, clientSecret) return nil
w.AddDurationTask(defs.PushProxyInfoDuration, bizserver.PushProxyInfo, clientID, clientSecret) },
defer w.Stop() OnStop: func(ctx context.Context) error {
param.TaskManager.Stop()
initServerOnce(appInstance, clientID, clientSecret) appInstance.GetClientRPCHandler().Stop()
param.ServerApiService.Stop()
var wg conc.WaitGroup
wg.Go(r.Run)
wg.Go(w.Run)
wg.Go(a.Run)
wg.Wait() 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