Skip to content

Commit 9049351

Browse files
authored
#96 Savepoint (#97)
* #96 Savepoint * #96 Savepoint * #96 Add gosec
1 parent de61f05 commit 9049351

File tree

17 files changed

+372
-52
lines changed

17 files changed

+372
-52
lines changed

.github/workflows/go-security.yaml

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Based on
2+
# - https://github.com/securego/gosec
3+
4+
name: go-security.yaml
5+
on:
6+
push:
7+
branches:
8+
- main
9+
pull_request:
10+
branches:
11+
- main
12+
jobs:
13+
tests:
14+
runs-on: ubuntu-latest
15+
env:
16+
GO111MODULE: on
17+
steps:
18+
- name: Checkout Source
19+
uses: actions/checkout@v3
20+
- name: Run Gosec Security Scanner
21+
uses: securego/gosec@master
22+
with:
23+
args: ./...

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010

1111
-
1212

13+
## [0.4.5] - 2023-05-17
14+
15+
### Added in 0.4.5
16+
17+
- Support for gRPC Observer aggregator
18+
1319
## [0.4.4] - 2023-05-11
1420

1521
### Changed in 0.4.4

cmd/root.go

+21-3
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ const (
3131
defaultEngineLogLevel int = 0
3232
defaultGrpcPort int = 8258
3333
defaultLogLevel string = "INFO"
34+
defaultObserverOrigin string = ""
35+
defaultObserverUrl string = ""
3436
Short string = "Start a gRPC server for the Senzing SDK API"
3537
Use string = "serve-grpc"
3638
Long string = `
@@ -61,6 +63,8 @@ func init() {
6163
RootCmd.Flags().String(option.EngineConfigurationJson, defaultEngineConfigurationJson, fmt.Sprintf("JSON string sent to Senzing's init() function [%s]", envar.EngineConfigurationJson))
6264
RootCmd.Flags().String(option.EngineModuleName, defaultEngineModuleName, fmt.Sprintf("Identifier given to the Senzing engine [%s]", envar.EngineModuleName))
6365
RootCmd.Flags().String(option.LogLevel, defaultLogLevel, fmt.Sprintf("Log level of TRACE, DEBUG, INFO, WARN, ERROR, FATAL, or PANIC [%s]", envar.LogLevel))
66+
RootCmd.Flags().String("observer-url", defaultObserverUrl, fmt.Sprintf("URL of Observer [%s]", "SENZING_TOOLS_OBSERVER_URL")) // FIXME: use "option." and "envar." when available.
67+
RootCmd.Flags().String("observer-origin", defaultObserverOrigin, fmt.Sprintf("Identify this instance to the Observer [%s]", "SENZING_TOOLS_OBSERVER_ORIGIN")) // FIXME: use "option." and "envar." when available.
6468
}
6569

6670
// If a configuration file is present, load it.
@@ -100,6 +104,7 @@ func loadConfigurationFile(cobraCommand *cobra.Command) {
100104

101105
// Configure Viper with user-specified options.
102106
func loadOptions(cobraCommand *cobra.Command) {
107+
var err error = nil
103108
viper.AutomaticEnv()
104109
replacer := strings.NewReplacer("-", "_")
105110
viper.SetEnvKeyReplacer(replacer)
@@ -116,7 +121,10 @@ func loadOptions(cobraCommand *cobra.Command) {
116121
}
117122
for optionKey, optionValue := range boolOptions {
118123
viper.SetDefault(optionKey, optionValue)
119-
viper.BindPFlag(optionKey, cobraCommand.Flags().Lookup(optionKey))
124+
err = viper.BindPFlag(optionKey, cobraCommand.Flags().Lookup(optionKey))
125+
if err != nil {
126+
panic(err)
127+
}
120128
}
121129

122130
// Ints
@@ -127,7 +135,10 @@ func loadOptions(cobraCommand *cobra.Command) {
127135
}
128136
for optionKey, optionValue := range intOptions {
129137
viper.SetDefault(optionKey, optionValue)
130-
viper.BindPFlag(optionKey, cobraCommand.Flags().Lookup(optionKey))
138+
err = viper.BindPFlag(optionKey, cobraCommand.Flags().Lookup(optionKey))
139+
if err != nil {
140+
panic(err)
141+
}
131142
}
132143

133144
// Strings
@@ -138,10 +149,15 @@ func loadOptions(cobraCommand *cobra.Command) {
138149
option.EngineConfigurationJson: defaultEngineConfigurationJson,
139150
option.EngineModuleName: defaultEngineModuleName,
140151
option.LogLevel: defaultLogLevel,
152+
"observer-url": defaultObserverUrl,
153+
"observer-origin": defaultObserverOrigin,
141154
}
142155
for optionKey, optionValue := range stringOptions {
143156
viper.SetDefault(optionKey, optionValue)
144-
viper.BindPFlag(optionKey, cobraCommand.Flags().Lookup(optionKey))
157+
err = viper.BindPFlag(optionKey, cobraCommand.Flags().Lookup(optionKey))
158+
if err != nil {
159+
panic(err)
160+
}
145161
}
146162
}
147163

@@ -186,6 +202,8 @@ func RunE(_ *cobra.Command, _ []string) error {
186202
EnableG2diagnostic: viper.GetBool(option.EnableG2diagnostic),
187203
EnableG2engine: viper.GetBool(option.EnableG2engine),
188204
EnableG2product: viper.GetBool(option.EnableG2product),
205+
ObserverOrigin: viper.GetString("observer-origin"),
206+
ObserverUrl: viper.GetString("observer-url"),
189207
Port: viper.GetInt(option.GrpcPort),
190208
LogLevelName: logLevelName,
191209
SenzingEngineConfigurationJson: senzingEngineConfigurationJson,

g2configmgrserver/g2configmgrserver.go

+30-2
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,17 @@ func (server *G2ConfigmgrServer) GetDefaultConfigID(ctx context.Context, request
154154
return &response, err
155155
}
156156

157+
func (server *G2ConfigmgrServer) GetObserverOrigin(ctx context.Context) string {
158+
var err error = nil
159+
if server.isTrace {
160+
entryTime := time.Now()
161+
server.traceEntry(25)
162+
defer func() { server.traceExit(26, err, time.Since(entryTime)) }()
163+
}
164+
g2configmgr := getG2configmgr()
165+
return g2configmgr.GetObserverOrigin(ctx)
166+
}
167+
157168
func (server *G2ConfigmgrServer) Init(ctx context.Context, request *g2pb.InitRequest) (*g2pb.InitResponse, error) {
158169
var err error = nil
159170
if server.isTrace {
@@ -217,12 +228,29 @@ func (server *G2ConfigmgrServer) SetLogLevel(ctx context.Context, logLevelName s
217228
return fmt.Errorf("invalid error level: %s", logLevelName)
218229
}
219230
g2configmgr := getG2configmgr()
220-
g2configmgr.SetLogLevel(ctx, logLevelName)
221-
server.getLogger().SetLogLevel(logLevelName)
231+
err = g2configmgr.SetLogLevel(ctx, logLevelName)
232+
if err != nil {
233+
return err
234+
}
235+
err = server.getLogger().SetLogLevel(logLevelName)
236+
if err != nil {
237+
return err
238+
}
222239
server.isTrace = (logLevelName == logging.LevelTraceName)
223240
return err
224241
}
225242

243+
func (server *G2ConfigmgrServer) SetObserverOrigin(ctx context.Context, origin string) {
244+
var err error = nil
245+
if server.isTrace {
246+
entryTime := time.Now()
247+
server.traceEntry(27, origin)
248+
defer func() { server.traceExit(28, origin, err, time.Since(entryTime)) }()
249+
}
250+
g2configmgr := getG2configmgr()
251+
g2configmgr.SetObserverOrigin(ctx, origin)
252+
}
253+
226254
func (server *G2ConfigmgrServer) UnregisterObserver(ctx context.Context, observer observer.Observer) error {
227255
var err error = nil
228256
if server.isTrace {

g2configmgrserver/main.go

+4
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ var IdMessages = map[int]string{
5454
22: "Exit " + Prefix + "SetDefaultConfigID(%+v) returned (%v).",
5555
23: "Enter " + Prefix + "SetLogLevel(%s).",
5656
24: "Exit " + Prefix + "SetLogLevel(%s) returned (%v).",
57+
25: "Enter " + Prefix + "GetObserverOrigin().",
58+
26: "Exit " + Prefix + "GetObserverOrigin() returned (%v).",
59+
27: "Enter " + Prefix + "SetObserverOrigin(%s).",
60+
28: "Exit " + Prefix + "SetObserverOrigin(%s) returned (%v).",
5761
4001: Prefix + "Destroy() not supported in gRPC",
5862
4002: Prefix + "Init() not supported in gRPC",
5963
4003: Prefix + "InitWithConfigID() not supported in gRPC",

g2configserver/g2configserver.go

+30-2
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,17 @@ func (server *G2ConfigServer) Destroy(ctx context.Context, request *g2pb.Destroy
148148
return &response, err
149149
}
150150

151+
func (server *G2ConfigServer) GetObserverOrigin(ctx context.Context) string {
152+
var err error = nil
153+
if server.isTrace {
154+
entryTime := time.Now()
155+
server.traceEntry(27)
156+
defer func() { server.traceExit(28, err, time.Since(entryTime)) }()
157+
}
158+
g2config := getG2config()
159+
return g2config.GetObserverOrigin(ctx)
160+
}
161+
151162
func (server *G2ConfigServer) Init(ctx context.Context, request *g2pb.InitRequest) (*g2pb.InitResponse, error) {
152163
var err error = nil
153164
if server.isTrace {
@@ -230,12 +241,29 @@ func (server *G2ConfigServer) SetLogLevel(ctx context.Context, logLevelName stri
230241
return fmt.Errorf("invalid error level: %s", logLevelName)
231242
}
232243
g2config := getG2config()
233-
g2config.SetLogLevel(ctx, logLevelName)
234-
server.getLogger().SetLogLevel(logLevelName)
244+
err = g2config.SetLogLevel(ctx, logLevelName)
245+
if err != nil {
246+
return err
247+
}
248+
err = server.getLogger().SetLogLevel(logLevelName)
249+
if err != nil {
250+
return err
251+
}
235252
server.isTrace = (logLevelName == logging.LevelTraceName)
236253
return err
237254
}
238255

256+
func (server *G2ConfigServer) SetObserverOrigin(ctx context.Context, origin string) {
257+
var err error = nil
258+
if server.isTrace {
259+
entryTime := time.Now()
260+
server.traceEntry(29, origin)
261+
defer func() { server.traceExit(30, origin, err, time.Since(entryTime)) }()
262+
}
263+
g2config := getG2config()
264+
g2config.SetObserverOrigin(ctx, origin)
265+
}
266+
239267
func (server *G2ConfigServer) UnregisterObserver(ctx context.Context, observer observer.Observer) error {
240268
var err error = nil
241269
if server.isTrace {

g2configserver/main.go

+4
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ var IdMessages = map[int]string{
5656
24: "Exit " + Prefix + "Save(%+v) returned (%s, %v).",
5757
25: "Enter " + Prefix + "SetLogLevel(%s).",
5858
26: "Exit " + Prefix + "SetLogLevel(%s) returned (%v).",
59+
27: "Enter " + Prefix + "GetObserverOrigin().",
60+
28: "Exit " + Prefix + "GetObserverOrigin() returned (%v).",
61+
29: "Enter " + Prefix + "SetObserverOrigin(%s).",
62+
30: "Exit " + Prefix + "SetObserverOrigin(%s) returned (%v).",
5963
4001: Prefix + "Destroy() not supported in gRPC",
6064
4002: Prefix + "Init() not supported in gRPC",
6165
4003: Prefix + "InitWithConfigID() not supported in gRPC",

g2diagnosticserver/g2diagnosticserver.go

+30-2
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,17 @@ func (server *G2DiagnosticServer) GetMappingStatistics(ctx context.Context, requ
334334
return &response, err
335335
}
336336

337+
func (server *G2DiagnosticServer) GetObserverOrigin(ctx context.Context) string {
338+
var err error = nil
339+
if server.isTrace {
340+
entryTime := time.Now()
341+
server.traceEntry(55)
342+
defer func() { server.traceExit(56, err, time.Since(entryTime)) }()
343+
}
344+
g2diagnostic := getG2diagnostic()
345+
return g2diagnostic.GetObserverOrigin(ctx)
346+
}
347+
337348
func (server *G2DiagnosticServer) GetPhysicalCores(ctx context.Context, request *g2pb.GetPhysicalCoresRequest) (*g2pb.GetPhysicalCoresResponse, error) {
338349
var err error = nil
339350
var result int
@@ -463,12 +474,29 @@ func (server *G2DiagnosticServer) SetLogLevel(ctx context.Context, logLevelName
463474
return fmt.Errorf("invalid error level: %s", logLevelName)
464475
}
465476
g2diagnostic := getG2diagnostic()
466-
g2diagnostic.SetLogLevel(ctx, logLevelName)
467-
server.getLogger().SetLogLevel(logLevelName)
477+
err = g2diagnostic.SetLogLevel(ctx, logLevelName)
478+
if err != nil {
479+
return err
480+
}
481+
err = server.getLogger().SetLogLevel(logLevelName)
482+
if err != nil {
483+
return err
484+
}
468485
server.isTrace = (logLevelName == logging.LevelTraceName)
469486
return err
470487
}
471488

489+
func (server *G2DiagnosticServer) SetObserverOrigin(ctx context.Context, origin string) {
490+
var err error = nil
491+
if server.isTrace {
492+
entryTime := time.Now()
493+
server.traceEntry(57, origin)
494+
defer func() { server.traceExit(58, origin, err, time.Since(entryTime)) }()
495+
}
496+
g2diagnostic := getG2diagnostic()
497+
g2diagnostic.SetObserverOrigin(ctx, origin)
498+
}
499+
472500
func (server *G2DiagnosticServer) StreamEntityListBySize(request *g2pb.StreamEntityListBySizeRequest, stream g2pb.G2Diagnostic_StreamEntityListBySizeServer) (err error) {
473501
if server.isTrace {
474502
server.traceEntry(163, request)

g2diagnosticserver/main.go

+4
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ var IdMessages = map[int]string{
8484
52: "Exit " + Prefix + "Reinit(%+v) returned (%v).",
8585
53: "Enter " + Prefix + "SetLogLevel(%s).",
8686
54: "Exit " + Prefix + "SetLogLevel(%s) returned (%v).",
87+
55: "Enter " + Prefix + "GetObserverOrigin().",
88+
56: "Exit " + Prefix + "GetObserverOrigin() returned (%v).",
89+
57: "Enter " + Prefix + "SetObserverOrigin(%s).",
90+
58: "Exit " + Prefix + "SetObserverOrigin(%s) returned (%v).",
8791
4001: Prefix + "Destroy() not supported in gRPC",
8892
4002: Prefix + "Init() not supported in gRPC",
8993
4003: Prefix + "InitWithConfigID() not supported in gRPC",

g2engineserver/g2engineserver.go

+35-7
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,17 @@ func (server *G2EngineServer) GetEntityByRecordID_V2(ctx context.Context, reques
677677
return &response, err
678678
}
679679

680+
func (server *G2EngineServer) GetObserverOrigin(ctx context.Context) string {
681+
var err error = nil
682+
if server.isTrace {
683+
entryTime := time.Now()
684+
server.traceEntry(161)
685+
defer func() { server.traceExit(162, err, time.Since(entryTime)) }()
686+
}
687+
g2engine := getG2engine()
688+
return g2engine.GetObserverOrigin(ctx)
689+
}
690+
680691
func (server *G2EngineServer) GetRecord(ctx context.Context, request *g2pb.GetRecordRequest) (*g2pb.GetRecordResponse, error) {
681692
var err error = nil
682693
var result string
@@ -1110,12 +1121,29 @@ func (server *G2EngineServer) SetLogLevel(ctx context.Context, logLevelName stri
11101121
return fmt.Errorf("invalid error level: %s", logLevelName)
11111122
}
11121123
g2engine := getG2engine()
1113-
g2engine.SetLogLevel(ctx, logLevelName)
1114-
server.getLogger().SetLogLevel(logLevelName)
1124+
err = g2engine.SetLogLevel(ctx, logLevelName)
1125+
if err != nil {
1126+
return err
1127+
}
1128+
err = server.getLogger().SetLogLevel(logLevelName)
1129+
if err != nil {
1130+
return err
1131+
}
11151132
server.isTrace = (logLevelName == logging.LevelTraceName)
11161133
return err
11171134
}
11181135

1136+
func (server *G2EngineServer) SetObserverOrigin(ctx context.Context, origin string) {
1137+
var err error = nil
1138+
if server.isTrace {
1139+
entryTime := time.Now()
1140+
server.traceEntry(163, origin)
1141+
defer func() { server.traceExit(164, origin, err, time.Since(entryTime)) }()
1142+
}
1143+
g2engine := getG2engine()
1144+
g2engine.SetObserverOrigin(ctx, origin)
1145+
}
1146+
11191147
func (server *G2EngineServer) Stats(ctx context.Context, request *g2pb.StatsRequest) (*g2pb.StatsResponse, error) {
11201148
var err error = nil
11211149
var result string
@@ -1154,7 +1182,7 @@ func (server *G2EngineServer) StreamExportCSVEntityReport(request *g2pb.StreamEx
11541182
defer func() {
11551183
err = g2engine.CloseExport(ctx, queryHandle)
11561184
if server.isTrace {
1157-
server.traceExit(159, request, rowsFetched, err, time.Since(entryTime))
1185+
server.traceExit(158, request, rowsFetched, err, time.Since(entryTime))
11581186
}
11591187
}()
11601188

@@ -1175,7 +1203,7 @@ func (server *G2EngineServer) StreamExportCSVEntityReport(request *g2pb.StreamEx
11751203
if err = stream.Send(&response); err != nil {
11761204
return err
11771205
}
1178-
server.traceEntry(158, request, fetchResult)
1206+
server.traceEntry(601, request, fetchResult)
11791207
rowsFetched += 1
11801208
}
11811209

@@ -1185,7 +1213,7 @@ func (server *G2EngineServer) StreamExportCSVEntityReport(request *g2pb.StreamEx
11851213

11861214
func (server *G2EngineServer) StreamExportJSONEntityReport(request *g2pb.StreamExportJSONEntityReportRequest, stream g2pb.G2Engine_StreamExportJSONEntityReportServer) (err error) {
11871215
if server.isTrace {
1188-
server.traceEntry(160, request)
1216+
server.traceEntry(159, request)
11891217
}
11901218
ctx := stream.Context()
11911219
entryTime := time.Now()
@@ -1205,7 +1233,7 @@ func (server *G2EngineServer) StreamExportJSONEntityReport(request *g2pb.StreamE
12051233
defer func() {
12061234
err = g2engine.CloseExport(ctx, queryHandle)
12071235
if server.isTrace {
1208-
server.traceExit(162, request, rowsFetched, err, time.Since(entryTime))
1236+
server.traceExit(160, request, rowsFetched, err, time.Since(entryTime))
12091237
}
12101238
}()
12111239

@@ -1226,7 +1254,7 @@ func (server *G2EngineServer) StreamExportJSONEntityReport(request *g2pb.StreamE
12261254
if err = stream.Send(&response); err != nil {
12271255
return err
12281256
}
1229-
server.traceEntry(161, request, fetchResult)
1257+
server.traceEntry(602, request, fetchResult)
12301258
rowsFetched += 1
12311259
}
12321260

0 commit comments

Comments
 (0)