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
1415type RTR struct {
@@ -193,10 +194,17 @@ func (s RTRSession) AdminExecute(ctx context.Context, baseCommand, commandString
193194}
194195
195196func (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
217234func (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
239271func (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}
0 commit comments