Skip to content

Commit b76af41

Browse files
committed
handle missing gob registration gracefully
1 parent 27be62d commit b76af41

File tree

1 file changed

+40
-2
lines changed

1 file changed

+40
-2
lines changed

ossec/agent.go

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"io/ioutil"
88
"os"
99
"path/filepath"
10+
"reflect"
1011
"runtime"
1112
"strconv"
1213
"strings"
@@ -180,6 +181,8 @@ func init() {
180181
gob.Register(RemoteFileInfo{})
181182
gob.Register(Client{})
182183
gob.Register(sentry.TraceID{})
184+
gob.Register(sentry.SpanID{})
185+
gob.Register(QueuePosting{})
183186
}
184187

185188
// AgentOption allows setting custom parameters during construction
@@ -948,6 +951,32 @@ func itemBuilder() interface{} {
948951
return &QueuePosting{}
949952
}
950953

954+
// Helper function to dynamically register a type with Gob
955+
func registerType(obj interface{}) {
956+
typ := reflect.TypeOf(obj)
957+
if typ.Kind() == reflect.Ptr {
958+
typ = typ.Elem() // Dereference pointer type
959+
}
960+
gob.Register(obj)
961+
fmt.Printf("Registered type: %s\n", typ.Name())
962+
}
963+
964+
func encodeData(data interface{}) ([]byte, error) {
965+
var buf bytes.Buffer
966+
enc := gob.NewEncoder(&buf)
967+
err := enc.Encode(data)
968+
if err != nil {
969+
return nil, err
970+
}
971+
return buf.Bytes(), nil
972+
}
973+
974+
func decodeData(data []byte, obj interface{}) error {
975+
buf := bytes.NewBuffer(data)
976+
dec := gob.NewDecoder(buf)
977+
return dec.Decode(obj)
978+
}
979+
951980
func (a *Client) openQueue(ctx context.Context) (chan *QueuePosting, *dque.DQue, error) {
952981
q, err := dque.NewOrOpen("event-queue", a.basePath, 500, itemBuilder)
953982
queuePath := a.basePath + "/event-queue"
@@ -979,8 +1008,17 @@ func (a *Client) openQueue(ctx context.Context) (chan *QueuePosting, *dque.DQue,
9791008
if err = q.Enqueue(msg); err == nil {
9801009
AgentCollector.Enqueue(a)
9811010
} else {
982-
a.logger.Error("enqueueItem", zap.Any("agentId", a.AgentID), zap.Any("item", msg), zap.Error(err))
983-
AgentCollector.SetQueueSize(a, q.Size())
1011+
if strings.Contains(err.Error(), "gob: type not registered") {
1012+
a.logger.Info("enqueueItem - late register type", zap.Any("agentId", a.AgentID), zap.Any("item", msg), zap.String("cause", err.Error()))
1013+
registerType(msg)
1014+
if err = q.Enqueue(msg); err == nil {
1015+
AgentCollector.Enqueue(a)
1016+
}
1017+
}
1018+
if err != nil {
1019+
a.logger.Error("enqueueItem", zap.Any("agentId", a.AgentID), zap.Any("item", msg), zap.Error(err))
1020+
AgentCollector.SetQueueSize(a, q.Size())
1021+
}
9841022
}
9851023
}
9861024
if ctx.Err() != nil {

0 commit comments

Comments
 (0)