Fix duplicate activities created when running lock/unlocking scripts on hosts with scripts disabled (#16861)
This commit is contained in:
@@ -0,0 +1 @@
|
||||
* Fixed generating duplicate activities when locking or unlocking a host with scripts disabled.
|
||||
@@ -54,6 +54,17 @@ func newHostScriptExecutionRequest(ctx context.Context, request *fleet.HostScrip
|
||||
}
|
||||
|
||||
func (ds *Datastore) SetHostScriptExecutionResult(ctx context.Context, result *fleet.HostScriptResultPayload) (*fleet.HostScriptResult, error) {
|
||||
const resultExistsStmt = `
|
||||
SELECT
|
||||
1
|
||||
FROM
|
||||
host_script_results
|
||||
WHERE
|
||||
host_id = ? AND
|
||||
execution_id = ? AND
|
||||
exit_code IS NOT NULL
|
||||
`
|
||||
|
||||
const updStmt = `
|
||||
UPDATE host_script_results SET
|
||||
output = ?,
|
||||
@@ -91,6 +102,16 @@ func (ds *Datastore) SetHostScriptExecutionResult(ctx context.Context, result *f
|
||||
|
||||
var hsr *fleet.HostScriptResult
|
||||
err := ds.withRetryTxx(ctx, func(tx sqlx.ExtContext) error {
|
||||
var resultExists bool
|
||||
err := sqlx.GetContext(ctx, tx, &resultExists, resultExistsStmt, result.HostID, result.ExecutionID)
|
||||
if err != nil && !errors.Is(err, sql.ErrNoRows) {
|
||||
return ctxerr.Wrap(ctx, err, "check if host script result exists")
|
||||
}
|
||||
if resultExists {
|
||||
// succeed but leave hsr nil
|
||||
return nil
|
||||
}
|
||||
|
||||
res, err := tx.ExecContext(ctx, updStmt,
|
||||
output,
|
||||
result.Runtime,
|
||||
|
||||
@@ -90,6 +90,17 @@ func testHostScriptResult(t *testing.T, ds *Datastore) {
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
// record a duplicate result for this execution, will be ignored
|
||||
hsr, err := ds.SetHostScriptExecutionResult(ctx, &fleet.HostScriptResultPayload{
|
||||
HostID: 1,
|
||||
ExecutionID: createdScript.ExecutionID,
|
||||
Output: "foobarbaz",
|
||||
Runtime: 22,
|
||||
ExitCode: 1,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
require.Nil(t, hsr)
|
||||
|
||||
// it is not pending anymore
|
||||
pending, err = ds.ListPendingHostScriptExecutions(ctx, 1)
|
||||
require.NoError(t, err)
|
||||
|
||||
Reference in New Issue
Block a user