in agentendpoint/patch_task.go [228:296]
func (r *patchTask) run(ctx context.Context) (err error) {
ctx = clog.WithLabels(ctx, r.state.Labels)
clog.Infof(ctx, "Beginning ApplyPatchesTask")
defer func() {
// This should not happen but the WUA libraries are complicated and
// recovering with an error is better than crashing.
if rec := recover(); rec != nil {
err = fmt.Errorf("Recovered from panic: %v", rec)
r.reportFailed(ctx, err.Error())
return
}
r.complete(ctx)
if agentconfig.OSInventoryEnabled() {
go r.client.ReportInventory(ctx)
}
}()
for {
clog.Debugf(ctx, "Running PatchStep %q.", r.PatchStep)
switch r.PatchStep {
default:
return r.reportFailed(ctx, fmt.Sprintf("unknown step: %q", r.PatchStep))
case prePatch:
r.StartedAt = time.Now()
if err := r.setStep(patching); err != nil {
return r.reportFailed(ctx, fmt.Sprintf("Error saving agent step: %v", err))
}
if err := r.reportContinuingState(ctx, agentendpointpb.ApplyPatchesTaskProgress_STARTED); err != nil {
return r.handleErrorState(ctx, err.Error(), err)
}
if err := r.prePatchReboot(ctx); err != nil {
return r.handleErrorState(ctx, fmt.Sprintf("Error running prePatchReboot: %v", err), err)
}
case patching:
if err := r.reportContinuingState(ctx, agentendpointpb.ApplyPatchesTaskProgress_APPLYING_PATCHES); err != nil {
return r.handleErrorState(ctx, err.Error(), err)
}
if err := r.runUpdates(ctx); err != nil {
return r.handleErrorState(ctx, fmt.Sprintf("Failed to apply patches: %v", err), err)
}
if err := r.postPatchReboot(ctx); err != nil {
return r.handleErrorState(ctx, fmt.Sprintf("Error running postPatchReboot: %v", err), err)
}
// We have not rebooted so patching is complete.
if err := r.setStep(postPatch); err != nil {
return r.reportFailed(ctx, fmt.Sprintf("Error saving agent step: %v", err))
}
case postPatch:
isRebootRequired, err := systemRebootRequired(ctx)
if err != nil {
return r.reportFailed(ctx, fmt.Sprintf("Error checking if system reboot is required: %v", err))
}
finalState := agentendpointpb.ApplyPatchesTaskOutput_SUCCEEDED
if isRebootRequired {
finalState = agentendpointpb.ApplyPatchesTaskOutput_SUCCEEDED_REBOOT_REQUIRED
}
if err := r.reportCompletedState(ctx, "", &agentendpointpb.ReportTaskCompleteRequest_ApplyPatchesTaskOutput{
ApplyPatchesTaskOutput: &agentendpointpb.ApplyPatchesTaskOutput{State: finalState},
}); err != nil {
return fmt.Errorf("failed to report state %s: %v", finalState, err)
}
clog.Infof(ctx, "Successfully completed ApplyPatchesTask")
return nil
}
}
}