github.com/nextlinux/gosbom@v0.81.1-0.20230627115839-1ff50c281391/gosbom/event/parsers/parsers.go (about) 1 /* 2 Package parsers provides parser helpers to extract payloads for each event type that the gosbom library publishes onto the event bus. 3 */ 4 package parsers 5 6 import ( 7 "fmt" 8 "io" 9 10 "github.com/nextlinux/gosbom/gosbom/event" 11 "github.com/nextlinux/gosbom/gosbom/event/monitor" 12 "github.com/nextlinux/gosbom/gosbom/file/cataloger/secrets" 13 "github.com/nextlinux/gosbom/gosbom/pkg/cataloger" 14 "github.com/wagoodman/go-partybus" 15 "github.com/wagoodman/go-progress" 16 ) 17 18 type ErrBadPayload struct { 19 Type partybus.EventType 20 Field string 21 Value interface{} 22 } 23 24 func (e *ErrBadPayload) Error() string { 25 return fmt.Sprintf("event='%s' has bad event payload field='%v': '%+v'", string(e.Type), e.Field, e.Value) 26 } 27 28 func newPayloadErr(t partybus.EventType, field string, value interface{}) error { 29 return &ErrBadPayload{ 30 Type: t, 31 Field: field, 32 Value: value, 33 } 34 } 35 36 func checkEventType(actual, expected partybus.EventType) error { 37 if actual != expected { 38 return newPayloadErr(expected, "Type", actual) 39 } 40 return nil 41 } 42 43 func ParsePackageCatalogerStarted(e partybus.Event) (*cataloger.Monitor, error) { 44 if err := checkEventType(e.Type, event.PackageCatalogerStarted); err != nil { 45 return nil, err 46 } 47 48 monitor, ok := e.Value.(cataloger.Monitor) 49 if !ok { 50 return nil, newPayloadErr(e.Type, "Value", e.Value) 51 } 52 53 return &monitor, nil 54 } 55 56 func ParseSecretsCatalogingStarted(e partybus.Event) (*secrets.Monitor, error) { 57 if err := checkEventType(e.Type, event.SecretsCatalogerStarted); err != nil { 58 return nil, err 59 } 60 61 monitor, ok := e.Value.(secrets.Monitor) 62 if !ok { 63 return nil, newPayloadErr(e.Type, "Value", e.Value) 64 } 65 66 return &monitor, nil 67 } 68 69 func ParseFileMetadataCatalogingStarted(e partybus.Event) (progress.StagedProgressable, error) { 70 if err := checkEventType(e.Type, event.FileMetadataCatalogerStarted); err != nil { 71 return nil, err 72 } 73 74 prog, ok := e.Value.(progress.StagedProgressable) 75 if !ok { 76 return nil, newPayloadErr(e.Type, "Value", e.Value) 77 } 78 79 return prog, nil 80 } 81 82 func ParseFileDigestsCatalogingStarted(e partybus.Event) (progress.StagedProgressable, error) { 83 if err := checkEventType(e.Type, event.FileDigestsCatalogerStarted); err != nil { 84 return nil, err 85 } 86 87 prog, ok := e.Value.(progress.StagedProgressable) 88 if !ok { 89 return nil, newPayloadErr(e.Type, "Value", e.Value) 90 } 91 92 return prog, nil 93 } 94 95 func ParseFileIndexingStarted(e partybus.Event) (string, progress.StagedProgressable, error) { 96 if err := checkEventType(e.Type, event.FileIndexingStarted); err != nil { 97 return "", nil, err 98 } 99 100 path, ok := e.Source.(string) 101 if !ok { 102 return "", nil, newPayloadErr(e.Type, "Source", e.Source) 103 } 104 105 prog, ok := e.Value.(progress.StagedProgressable) 106 if !ok { 107 return "", nil, newPayloadErr(e.Type, "Value", e.Value) 108 } 109 110 return path, prog, nil 111 } 112 113 func ParseCatalogerTaskStarted(e partybus.Event) (*event.CatalogerTask, error) { 114 if err := checkEventType(e.Type, event.CatalogerTaskStarted); err != nil { 115 return nil, err 116 } 117 118 source, ok := e.Source.(*event.CatalogerTask) 119 if !ok { 120 return nil, newPayloadErr(e.Type, "Source", e.Source) 121 } 122 123 return source, nil 124 } 125 126 func ParseExit(e partybus.Event) (func() error, error) { 127 if err := checkEventType(e.Type, event.Exit); err != nil { 128 return nil, err 129 } 130 131 fn, ok := e.Value.(func() error) 132 if !ok { 133 return nil, newPayloadErr(e.Type, "Value", e.Value) 134 } 135 136 return fn, nil 137 } 138 139 func ParseAppUpdateAvailable(e partybus.Event) (string, error) { 140 if err := checkEventType(e.Type, event.AppUpdateAvailable); err != nil { 141 return "", err 142 } 143 144 newVersion, ok := e.Value.(string) 145 if !ok { 146 return "", newPayloadErr(e.Type, "Value", e.Value) 147 } 148 149 return newVersion, nil 150 } 151 152 func ParseImportStarted(e partybus.Event) (string, progress.StagedProgressable, error) { 153 if err := checkEventType(e.Type, event.ImportStarted); err != nil { 154 return "", nil, err 155 } 156 157 host, ok := e.Source.(string) 158 if !ok { 159 return "", nil, newPayloadErr(e.Type, "Source", e.Source) 160 } 161 162 prog, ok := e.Value.(progress.StagedProgressable) 163 if !ok { 164 return "", nil, newPayloadErr(e.Type, "Value", e.Value) 165 } 166 167 return host, prog, nil 168 } 169 170 func ParseAttestationStartedEvent(e partybus.Event) (io.Reader, progress.Progressable, *monitor.GenericTask, error) { 171 if err := checkEventType(e.Type, event.AttestationStarted); err != nil { 172 return nil, nil, nil, err 173 } 174 175 source, ok := e.Source.(monitor.GenericTask) 176 if !ok { 177 return nil, nil, nil, newPayloadErr(e.Type, "Source", e.Source) 178 } 179 180 sp, ok := e.Value.(*monitor.ShellProgress) 181 if !ok { 182 return nil, nil, nil, newPayloadErr(e.Type, "Value", e.Value) 183 } 184 185 return sp.Reader, sp.Manual, &source, nil 186 }