Skip to content

Commit

Permalink
fix: http application tls info get
Browse files Browse the repository at this point in the history
  • Loading branch information
minoic committed Apr 22, 2024
1 parent acc7ecf commit beb8d6d
Show file tree
Hide file tree
Showing 6 changed files with 124 additions and 66 deletions.
35 changes: 35 additions & 0 deletions common/cache/user_entity_list.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package cache

import (
"github.com/bellis-daemon/bellis/common/models"
"github.com/bellis-daemon/bellis/common/storage"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"golang.org/x/net/context"
"time"
)

const UserEntitiesKey = "UserEntities_"

func GetUserEntities(ctx context.Context, userId primitive.ObjectID) ([]models.Application, error) {
ret, err := storage.QuickRCSearch[[]models.Application](ctx, UserEntitiesKey+UserEntitiesKey+userId.Hex(), func() ([]models.Application, error) {
var entities []models.Application
find, err := storage.CEntity.Find(ctx, bson.M{"UserID": userId})
if err != nil {
return nil, err
}
err = find.All(ctx, &entities)
if err != nil {
return nil, err
}
return entities, nil
}, 10*time.Minute)
if err != nil {
return nil, err
}
return *ret, nil
}

func ExpireUserEntities(ctx context.Context, userId primitive.ObjectID) error {
return storage.Redis().Del(ctx, "QUICK_RC_"+UserEntitiesKey+userId.Hex()).Err()
}
5 changes: 4 additions & 1 deletion common/storage/redis.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,10 @@ func QuickRCSearch[T any](ctx context.Context, key string, fallback func() (T, e
glgf.Warn(err)
return
}
Redis().Set(ctx, QuickRc+key, buf.String(), dur)
err = Redis().Set(ctx, QuickRc+key, buf.String(), dur).Err()
if err != nil {
glgf.Warn(err)
}
}()
return &value, nil
}
Expand Down
48 changes: 18 additions & 30 deletions modules/backend/app/mobile/entity/entity.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,7 @@ func (h handler) GetStreamAllStatus(e *emptypb.Empty, server EntityService_GetSt
glgf.Success("starting streaming all status with deadline", ddl, ok)
defer glgf.Warn("stopping stream")
user := midwares.GetUserFromCtx(server.Context())
var entities []models.Application
find, err := storage.CEntity.Find(server.Context(), bson.M{"UserID": user.ID})
if err != nil {
glgf.Error(err)
return status.Error(codes.Internal, err.Error())
}
err = find.All(server.Context(), &entities)
entities, err := cache.GetUserEntities(server.Context(), user.ID)
if err != nil {
glgf.Error(err)
return status.Error(codes.Internal, err.Error())
Expand Down Expand Up @@ -254,7 +248,7 @@ func (h handler) UpdateEntity(ctx context.Context, entity *Entity) (*emptypb.Emp
glgf.Error(err)
return &emptypb.Empty{}, status.Error(codes.Internal, err.Error())
}
go afterUpdateEntity(e)
go afterUpdateEntity(midwares.GetUserFromCtx(ctx), e)
return &emptypb.Empty{}, nil
}

Expand Down Expand Up @@ -301,18 +295,12 @@ func (h handler) GetEntity(ctx context.Context, id *EntityID) (*Entity, error) {
// The options for each entity are converted to structpb.Struct format before being included in the response.
func (h handler) GetAllEntities(ctx context.Context, e *emptypb.Empty) (*AllEntities, error) {
user := midwares.GetUserFromCtx(ctx)
var entities []models.Application
find, err := storage.CEntity.Find(ctx, bson.M{"UserID": user.ID})
if err != nil {
glgf.Error(err)
return &AllEntities{}, status.Error(codes.Internal, err.Error())
}
err = find.All(ctx, &entities)
res := &AllEntities{}
entities, err := cache.GetUserEntities(ctx, user.ID)
if err != nil {
glgf.Error(err)
return &AllEntities{}, status.Error(codes.Internal, err.Error())
return res, status.Error(codes.Internal, err.Error())
}
res := &AllEntities{}
for i := range entities {
options, err := structpb.NewStruct(entities[i].Options)
if err != nil {
Expand Down Expand Up @@ -470,25 +458,25 @@ from(bucket: "backend")
func (h handler) GetAllStatus(ctx context.Context, e *emptypb.Empty) (*AllEntityStatus, error) {
ret := &AllEntityStatus{}
user := midwares.GetUserFromCtx(ctx)
var entities []models.Application
find, err := storage.CEntity.Find(ctx, bson.M{"UserID": user.ID})
if err != nil {
glgf.Error(err)
return ret, status.Error(codes.Internal, err.Error())
}
err = find.All(ctx, &entities)
entities, err := cache.GetUserEntities(ctx, user.ID)
if err != nil {
glgf.Error(err)
return ret, status.Error(codes.Internal, err.Error())
}
var wg sync.WaitGroup
for i := range entities {
s, err := h.GetStatus(ctx, &EntityID{ID: entities[i].ID.Hex(), Scheme: &entities[i].Scheme})
if err != nil {
glgf.Error(err)
return ret, status.Error(codes.Internal, err.Error())
}
ret.Status = append(ret.Status, s)
wg.Add(1)
go func() {
defer wg.Done()
s, err := h.GetStatus(ctx, &EntityID{ID: entities[i].ID.Hex(), Scheme: &entities[i].Scheme})
if err != nil {
glgf.Error(err)
return
}
ret.Status = append(ret.Status, s)
}()
}
wg.Wait()
return ret, nil
}

Expand Down
6 changes: 5 additions & 1 deletion modules/backend/app/mobile/entity/entity_services.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"errors"
"fmt"
"github.com/bellis-daemon/bellis/common/cache"
"time"

"github.com/bellis-daemon/bellis/common/cryptoo"
Expand Down Expand Up @@ -160,15 +161,18 @@ func afterDeleteEntity(user *models.User, entityID string) {
storage.COfflineLog.DeleteMany(ctx, bson.M{"EntityID": id})
user.UsageEntityIncr(ctx, -1)
producer.NoticeEntityDelete(ctx, entityID)
cache.ExpireUserEntities(ctx, user.ID)
}

func afterCreateEntity(user *models.User, entity *models.Application) {
ctx := context.Background()
user.UsageEntityIncr(ctx, 1)
producer.NoticeEntityUpdate(ctx, entity.ID.Hex(), entity)
cache.ExpireUserEntities(ctx, user.ID)
}

func afterUpdateEntity(entity *models.Application) {
func afterUpdateEntity(user *models.User, entity *models.Application) {
ctx := context.Background()
producer.NoticeEntityUpdate(ctx, entity.ID.Hex(), entity)
cache.ExpireUserEntities(ctx, user.ID)
}
10 changes: 5 additions & 5 deletions modules/backend/app/mobile/profile/profile.go
Original file line number Diff line number Diff line change
Expand Up @@ -277,25 +277,25 @@ func (h handler) GetUserProfile(ctx context.Context, empty *emptypb.Empty) (*Use
wg.Add(1)
go func() {
defer wg.Done()
avatar, err := storage.QuickRCSearch[string](ctx, "AVATAR_CACHE_"+user.ID.Hex(), func() (string, error) {
avatar, err := storage.QuickRCSearch[[]byte](ctx, "AVATAR_CACHE_"+user.ID.Hex(), func() ([]byte, error) {
cl := &http.Client{
Timeout: 3 * time.Second,
}
get, err := cl.Get(gravatar.NewGravatarFromEmail(user.Email).GetURL())
if err != nil {
return "", err
return nil, err
}
defer get.Body.Close()
ret, err := io.ReadAll(get.Body)
if err != nil {
return "", err
return nil, err
}
return string(ret), nil
return ret, nil
}, time.Hour)
if err != nil {
glgf.Error(err)
} else {
ret.Avatar = []byte(*avatar)
ret.Avatar = *avatar
}
}()
for i := range user.EnvoyPolicies {
Expand Down
86 changes: 57 additions & 29 deletions modules/sentry/apps/implements/http/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,33 @@ import (
"context"
"crypto/tls"
"errors"
"github.com/bellis-daemon/bellis/modules/sentry/apps/implements"
"github.com/bellis-daemon/bellis/modules/sentry/apps/option"
"github.com/bellis-daemon/bellis/modules/sentry/apps/status"
"go.mongodb.org/mongo-driver/bson"
"io"
"net/http"
"net/http/httptrace"
"strings"
"time"

"github.com/bellis-daemon/bellis/modules/sentry/apps/implements"
"github.com/bellis-daemon/bellis/modules/sentry/apps/option"
"github.com/bellis-daemon/bellis/modules/sentry/apps/status"
"github.com/minoic/glgf"
"go.mongodb.org/mongo-driver/bson"
)

var httpClient = http.Client{
Timeout: 5 * time.Second,
Transport: &http.Transport{
MaxIdleConns: 100,
IdleConnTimeout: 10 * time.Second,
TLSHandshakeTimeout: 4 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
},
}

type HTTP struct {
implements.Template
options httpOptions
options httpOptions
tlsState *tls.ConnectionState
}

func (this *HTTP) Fetch(ctx context.Context) (status.Status, error) {
Expand All @@ -33,41 +47,51 @@ func (this *HTTP) Fetch(ctx context.Context) (status.Status, error) {
}
},
TLSHandshakeDone: func(state tls.ConnectionState, err error) {
switch state.Version {
case tls.VersionTLS10:
ret.TLSVersion = "TLS10"
case tls.VersionTLS11:
ret.TLSVersion = "TLS11"
case tls.VersionTLS12:
ret.TLSVersion = "TLS12"
case tls.VersionTLS13:
ret.TLSVersion = "TLS13"
default:
ret.TLSVersion = "None"
}
if len(state.PeerCertificates) > 0 {
ret.TLSStartTime = state.PeerCertificates[0].NotBefore.Format(time.RFC3339Nano)
ret.TLSExpireTime = state.PeerCertificates[0].NotAfter.Format(time.RFC3339Nano)
if len(state.PeerCertificates[0].Issuer.Organization) > 0 {
ret.TLSIssuer = state.PeerCertificates[0].Issuer.Organization[0]
}
if this.tlsState == nil {
this.tlsState = &state
}
},
}
req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
client := http.Client{
Timeout: 10 * time.Second,
}
resp, err := client.Do(req)
resp, err := httpClient.Do(req)
if err != nil {
return ret, err
}
if resp.StatusCode >= 400 {
return ret, errors.New(resp.Status)
}
ret.StatusCode = resp.StatusCode
ret.ContentLength = resp.ContentLength
ret.ContentType = resp.Header.Get("Content-Type")
ret.ContentLength = resp.ContentLength
if ret.ContentLength == -1 {
length, err := io.Copy(io.Discard, resp.Body)
if err != nil {
glgf.Warn(err)
} else {
ret.ContentLength = length
}
}
if this.tlsState != nil {
switch this.tlsState.Version {
case tls.VersionTLS10:
ret.TLSVersion = "TLS10"
case tls.VersionTLS11:
ret.TLSVersion = "TLS11"
case tls.VersionTLS12:
ret.TLSVersion = "TLS12"
case tls.VersionTLS13:
ret.TLSVersion = "TLS13"
default:
ret.TLSVersion = "None"
}
if len(this.tlsState.PeerCertificates) > 0 {
ret.TLSStartTime = this.tlsState.PeerCertificates[0].NotBefore.Format(time.RFC3339Nano)
ret.TLSExpireTime = this.tlsState.PeerCertificates[0].NotAfter.Format(time.RFC3339Nano)
if len(this.tlsState.PeerCertificates[0].Issuer.Organization) > 0 {
ret.TLSIssuer = this.tlsState.PeerCertificates[0].Issuer.Organization[0]
}
}
}
return ret, nil
}

Expand Down Expand Up @@ -96,6 +120,10 @@ type httpOptions struct {

func init() {
implements.Register("http", func(options bson.M) implements.Implement {
return &HTTP{options: option.ToOption[httpOptions](options)}
o := option.ToOption[httpOptions](options)
if o.Method == "" {
o.Method = "GET"
}
return &HTTP{options: o}
})
}

0 comments on commit beb8d6d

Please sign in to comment.