Skip to content

Commit 14f247d

Browse files
committed
Add output sequencing to high-level RTR client.
1 parent 6379571 commit 14f247d

File tree

2 files changed

+63
-6
lines changed

2 files changed

+63
-6
lines changed

falcon/rtr.go

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/crowdstrike/gofalcon/falcon/client/real_time_response"
1010
"github.com/crowdstrike/gofalcon/falcon/client/real_time_response_admin"
1111
"github.com/crowdstrike/gofalcon/falcon/models"
12+
"github.com/crowdstrike/gofalcon/pkg/falcon_util"
1213
)
1314

1415
type RTR struct {
@@ -193,10 +194,17 @@ func (s RTRSession) AdminExecute(ctx context.Context, baseCommand, commandString
193194
}
194195

195196
func (s *RTRSession) WaitForExecution(ctx context.Context, cloudRequestId string, opts ...real_time_response.ClientOption) (*models.DomainStatusResponse, error) {
197+
var lastSequenceID int64 = 0
198+
var completeResponse = models.DomainStatusResponse{
199+
Stdout: new(string),
200+
Stderr: new(string),
201+
}
202+
196203
for {
197204
response, err := s.client.RTRCheckCommandStatus(&real_time_response.RTRCheckCommandStatusParams{
198205
Context: ctx,
199206
CloudRequestID: cloudRequestId,
207+
SequenceID: lastSequenceID,
200208
}, opts...)
201209
if err != nil {
202210
return nil, err
@@ -207,18 +215,33 @@ func (s *RTRSession) WaitForExecution(ctx context.Context, cloudRequestId string
207215
if len(response.Payload.Resources) != 1 {
208216
return nil, fmt.Errorf("Unexpected return from RTRCheckActiverResponderCommandStatus: %v", response)
209217
}
210-
if *response.Payload.Resources[0].Complete {
211-
return response.Payload.Resources[0], nil
218+
resource := *response.Payload.Resources[0]
219+
*completeResponse.Stderr += falcon_util.DerefString(resource.Stderr)
220+
*completeResponse.Stdout += falcon_util.DerefString(resource.Stdout)
221+
if *resource.Complete {
222+
completeResponse.BaseCommand = resource.BaseCommand
223+
completeResponse.Complete = resource.Complete
224+
completeResponse.SequenceID = resource.SequenceID
225+
completeResponse.SessionID = resource.SessionID
226+
completeResponse.TaskID = resource.TaskID
227+
return &completeResponse, nil
212228
}
229+
lastSequenceID = resource.SequenceID
213230
time.Sleep(120 * time.Millisecond)
214231
}
215232
}
216233

217234
func (s *RTRSession) ActiveResponderWaitForExecution(ctx context.Context, cloudRequestId string, opts ...real_time_response.ClientOption) (*models.DomainStatusResponse, error) {
235+
var lastSequenceID int64 = 0
236+
var completeResponse = models.DomainStatusResponse{
237+
Stdout: new(string),
238+
Stderr: new(string),
239+
}
218240
for {
219241
response, err := s.client.RTRCheckActiveResponderCommandStatus(&real_time_response.RTRCheckActiveResponderCommandStatusParams{
220242
Context: ctx,
221243
CloudRequestID: cloudRequestId,
244+
SequenceID: lastSequenceID,
222245
}, opts...)
223246
if err != nil {
224247
return nil, err
@@ -229,18 +252,33 @@ func (s *RTRSession) ActiveResponderWaitForExecution(ctx context.Context, cloudR
229252
if len(response.Payload.Resources) != 1 {
230253
return nil, fmt.Errorf("Unexpected return from RTRCheckActiverResponderCommandStatus: %v", response)
231254
}
232-
if *response.Payload.Resources[0].Complete {
233-
return response.Payload.Resources[0], nil
255+
resource := *response.Payload.Resources[0]
256+
*completeResponse.Stderr += falcon_util.DerefString(resource.Stderr)
257+
*completeResponse.Stdout += falcon_util.DerefString(resource.Stdout)
258+
if *resource.Complete {
259+
completeResponse.BaseCommand = resource.BaseCommand
260+
completeResponse.Complete = resource.Complete
261+
completeResponse.SequenceID = resource.SequenceID
262+
completeResponse.SessionID = resource.SessionID
263+
completeResponse.TaskID = resource.TaskID
264+
return &completeResponse, nil
234265
}
266+
lastSequenceID = resource.SequenceID
235267
time.Sleep(120 * time.Millisecond)
236268
}
237269
}
238270

239271
func (s *RTRSession) AdminWaitForExecution(ctx context.Context, cloudRequestId string, opts ...real_time_response_admin.ClientOption) (*models.DomainStatusResponse, error) {
272+
var lastSequenceID int64 = 0
273+
var completeResponse = models.DomainStatusResponse{
274+
Stdout: new(string),
275+
Stderr: new(string),
276+
}
240277
for {
241278
response, err := s.adminClient.RTRCheckAdminCommandStatus(&real_time_response_admin.RTRCheckAdminCommandStatusParams{
242279
Context: ctx,
243280
CloudRequestID: cloudRequestId,
281+
SequenceID: lastSequenceID,
244282
}, opts...)
245283
if err != nil {
246284
return nil, err
@@ -251,9 +289,18 @@ func (s *RTRSession) AdminWaitForExecution(ctx context.Context, cloudRequestId s
251289
if len(response.Payload.Resources) != 1 {
252290
return nil, fmt.Errorf("Unexpected return from RTRCheckActiverResponderCommandStatus: %v", response)
253291
}
254-
if *response.Payload.Resources[0].Complete {
255-
return response.Payload.Resources[0], nil
292+
resource := *response.Payload.Resources[0]
293+
*completeResponse.Stderr += falcon_util.DerefString(resource.Stderr)
294+
*completeResponse.Stdout += falcon_util.DerefString(resource.Stdout)
295+
if *resource.Complete {
296+
completeResponse.BaseCommand = resource.BaseCommand
297+
completeResponse.Complete = resource.Complete
298+
completeResponse.SequenceID = resource.SequenceID
299+
completeResponse.SessionID = resource.SessionID
300+
completeResponse.TaskID = resource.TaskID
301+
return &completeResponse, nil
256302
}
303+
lastSequenceID = resource.SequenceID
257304
time.Sleep(120 * time.Millisecond)
258305
}
259306
}

pkg/falcon_util/string.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package falcon_util
2+
3+
// DerefString returns the deferenced string value or empty string if nil.
4+
func DerefString(s *string) string {
5+
if s != nil {
6+
return *s
7+
}
8+
9+
return ""
10+
}

0 commit comments

Comments
 (0)