mirror of
https://github.com/safedep/pmg.git
synced 2026-08-03 07:24:09 +02:00
* feat: Add cloud sync command * feat: Add pmg cloud commands * fix: Code review fixes * fix: Code review fixes * fix: Code review fixes * fix: Code review fixes * fix: Code review fixes * fix: Code review fixes
70 lines
1.6 KiB
Go
70 lines
1.6 KiB
Go
package audit
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/safedep/dry/cloud/endpointsync"
|
|
"github.com/safedep/dry/log"
|
|
"github.com/safedep/pmg/config"
|
|
)
|
|
|
|
type cloudSink struct {
|
|
*SyncClientBundle
|
|
invocationID string
|
|
}
|
|
|
|
func newCloudSink(cfg *config.RuntimeConfig) (*cloudSink, error) {
|
|
bundle, err := NewSyncClientBundle(cfg)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
invocationID, err := uuid.NewRandom()
|
|
if err != nil {
|
|
if closeErr := bundle.Close(); closeErr != nil {
|
|
log.Warnf("failed to close sync client bundle after invocation ID failure: %v", closeErr)
|
|
}
|
|
return nil, fmt.Errorf("failed to generate invocation ID: %w", err)
|
|
}
|
|
|
|
return &cloudSink{
|
|
SyncClientBundle: bundle,
|
|
invocationID: invocationID.String(),
|
|
}, nil
|
|
}
|
|
|
|
func (s *cloudSink) Handle(ctx context.Context, event AuditEvent) error {
|
|
pmgEvents := s.translateToPmgEvents(event)
|
|
if len(pmgEvents) == 0 {
|
|
return nil
|
|
}
|
|
|
|
for _, pmgEvent := range pmgEvents {
|
|
toolEvent, err := s.syncClient.NewEvent()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to create tool event: %w", err)
|
|
}
|
|
|
|
toolEvent.SetPmgEvent(pmgEvent)
|
|
toolEvent.SetInvocationId(s.invocationID)
|
|
|
|
if err := s.syncClient.Emit(ctx, toolEvent); err != nil {
|
|
if errors.Is(err, endpointsync.ErrWALFull) {
|
|
log.Warnf("Cloud sync WAL is full, dropping event: %v", err)
|
|
return nil
|
|
}
|
|
return fmt.Errorf("failed to emit cloud event: %w", err)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Close delegates to the embedded SyncClientBundle.Close().
|
|
func (s *cloudSink) Close() error {
|
|
return s.SyncClientBundle.Close()
|
|
}
|