@@ -4,8 +4,12 @@ import (
44 "context"
55 "fmt"
66 "io"
7+ "net"
8+ "strconv"
79
810 "github.com/jumpserver/wisp/cmd/common"
11+ "github.com/jumpserver/wisp/pkg/forward"
12+ modelCommon "github.com/jumpserver/wisp/pkg/jms-sdk-go/common"
913 "github.com/jumpserver/wisp/pkg/jms-sdk-go/model"
1014 "github.com/jumpserver/wisp/pkg/jms-sdk-go/service"
1115 "github.com/jumpserver/wisp/pkg/logger"
@@ -15,9 +19,10 @@ import (
1519func NewJMServer (apiClient * service.JMService , uploader * common.UploaderService ,
1620 beat * common.BeatService ) * JMServer {
1721 return & JMServer {
18- apiClient : apiClient ,
19- uploader : uploader ,
20- beat : beat ,
22+ apiClient : apiClient ,
23+ uploader : uploader ,
24+ beat : beat ,
25+ forwardStore : common .NewForwardCache (),
2126 }
2227}
2328
@@ -27,6 +32,8 @@ type JMServer struct {
2732
2833 uploader * common.UploaderService
2934 beat * common.BeatService
35+
36+ forwardStore * common.ForwardCache
3037}
3138
3239func (j * JMServer ) GetDBTokenAuthInfo (ctx context.Context , req * pb.DBTokenRequest ) (* pb.DBTokenResponse , error ) {
@@ -45,6 +52,7 @@ func (j *JMServer) GetDBTokenAuthInfo(ctx context.Context, req *pb.DBTokenReques
4552 logger .Error (msg )
4653 return & pb.DBTokenResponse {Status : & status }, nil
4754 }
55+ setting := j .uploader .GetTerminalSetting ()
4856 dbTokenInfo := pb.DBTokenAuthInfo {
4957 KeyId : tokenAuthInfo .Id ,
5058 SecreteId : tokenAuthInfo .Secret ,
@@ -54,7 +62,8 @@ func (j *JMServer) GetDBTokenAuthInfo(ctx context.Context, req *pb.DBTokenReques
5462 SystemUser : ConvertToProtobufSystemUser (tokenAuthInfo .SystemUserAuthInfo ),
5563 Permission : ConvertToProtobufPermission (model.Permission {Actions : tokenAuthInfo .Actions }),
5664 ExpireInfo : ConvertToProtobufExpireInfo (model.ExpireInfo {ExpireAt : tokenAuthInfo .ExpiredAt }),
57- Gateways : ConvertToProtobufGateWays ([]model.Gateway {tokenAuthInfo .Gateway }),
65+ Gateways : ConvertToProtobufGateWays (tokenAuthInfo .Domain .Gateways ),
66+ Setting : ConvertToPbSetting (& setting ),
5867 }
5968 status .Ok = true
6069 logger .Debugf ("Get database auth info success by token: %s" , req .Token )
@@ -260,3 +269,61 @@ func (j *JMServer) CheckOrCreateAssetLoginTicket(ctx context.Context,
260269 TicketInfo : ConvertToPbTicketInfo (& res .TicketInfo ),
261270 Status : & status }, nil
262271}
272+
273+ func (j * JMServer ) CreateForward (ctx context.Context , req * pb.ForwardRequest ) (* pb.ForwardResponse , error ) {
274+ var (
275+ status pb.Status
276+ )
277+ host := req .GetHost ()
278+ port := strconv .FormatInt (int64 (req .GetPort ()), 10 )
279+ dstAddr := net .JoinHostPort (host , port )
280+ gateways := req .GetGateways ()
281+ client , err := common .FindAvailableGateway (gateways )
282+ if err != nil {
283+ status .Err = err .Error ()
284+ return & pb.ForwardResponse {
285+ Status : & status ,
286+ }, nil
287+ }
288+ forwardProxy := forward.SSHForward {
289+ Client : client ,
290+ DstAddr : dstAddr ,
291+ }
292+ if err = forwardProxy .Start (); err != nil {
293+ status .Err = err .Error ()
294+ _ = client .Close ()
295+ logger .Errorf ("Start forward proxy failed: %s" , err )
296+ return & pb.ForwardResponse {
297+ Status : & status ,
298+ }, nil
299+ }
300+ id := modelCommon .UUID ()
301+ j .forwardStore .Add (id , & forwardProxy )
302+ lnAddr := forwardProxy .GetTCPAddr ()
303+ status .Ok = true
304+ logger .Infof ("Start forward proxy: id %s on %s" , id , lnAddr .String ())
305+ ret := & pb.ForwardResponse {
306+ Status : & status ,
307+ Id : id ,
308+ Host : lnAddr .IP .String (),
309+ Port : int32 (lnAddr .Port ),
310+ }
311+ return ret , nil
312+ }
313+
314+ func (j * JMServer ) DeleteForward (ctx context.Context , req * pb.ForwardDeleteRequest ) (* pb.StatusResponse , error ) {
315+ var (
316+ status pb.Status
317+ )
318+ id := req .GetId ()
319+ if forwardProxy := j .forwardStore .Get (id ); forwardProxy != nil {
320+ forwardProxy .Stop ()
321+ status .Ok = true
322+ j .forwardStore .Remove (id )
323+ logger .Infof ("Forward remove id %s" , id )
324+ return & pb.StatusResponse {Status : & status }, nil
325+ }
326+ status .Err = fmt .Sprintf ("not found forward %s" , id )
327+ logger .Errorf ("Forward not found id %s" , id )
328+ return & pb.StatusResponse {Status : & status }, nil
329+ }
0 commit comments