common/update/report.go (76 lines of code) (raw):
package update
import (
"errors"
"io"
"net/url"
"os"
"os/exec"
"github.com/aliyun/aliyun_assist_client/agent/clientreport"
"github.com/aliyun/aliyun_assist_client/agent/util/errnoutil"
)
func ReportDownloadPackageFailed(err error, updateInfo *UpdateCheckResp, failureContext map[string]interface{}) {
failureType := "DownloadPackageFailed"
if errors.Is(err, os.ErrPermission) {
failureType += ":AccessDenied"
} else if urlErr, ok := err.(*url.Error); ok && urlErr.Timeout() {
failureType += ":NetworkTimeout"
} else if errors.Is(err, os.ErrDeadlineExceeded) {
failureType += ":NetworkTimeout"
} else if errnoutil.IsNoEnoughSpaceError(err) {
failureType += ":NoEnoughSpace"
} else if errors.Is(err, io.ErrUnexpectedEOF) {
failureType += ":UnexpectedEOF"
}
clientreport.ReportUpdateFailure(failureType, clientreport.UpdateFailure{
UpdateInfo: updateInfo,
FailureContext: failureContext,
ErrorMessage: err.Error(),
})
}
func ReportCheckMD5Failed(err error, updateInfo *UpdateCheckResp, failureContext map[string]interface{}) {
clientreport.ReportUpdateFailure("CheckMD5Failed", clientreport.UpdateFailure{
UpdateInfo: updateInfo,
FailureContext: failureContext,
ErrorMessage: err.Error(),
})
}
func ReportExtractPackageFailed(err error, updateInfo *UpdateCheckResp, failureContext map[string]interface{}) {
clientreport.ReportUpdateFailure("ExtractPackageFailed", clientreport.UpdateFailure{
UpdateInfo: updateInfo,
FailureContext: failureContext,
ErrorMessage: err.Error(),
})
}
func ReportValidateExecutableFailed(err error, updateInfo *UpdateCheckResp, failureContext map[string]interface{}) {
clientreport.ReportUpdateFailure("ValidateExecutableFailed", clientreport.UpdateFailure{
UpdateInfo: updateInfo,
FailureContext: failureContext,
ErrorMessage: err.Error(),
})
}
func ReportExecuteUpdateScriptRunnerTimeout(err error, updateInfo *UpdateCheckResp, failureContext map[string]interface{}) {
reportExecutingFailure("ExecuteUpdateScriptRunnerTimeout", err, updateInfo, failureContext)
}
func ReportExecuteUpdateScriptRunnerFailed(err error, updateInfo *UpdateCheckResp, failureContext map[string]interface{}) {
reportExecutingFailure("ExecuteUpdateScriptRunnerFailed", err, updateInfo, failureContext)
}
func ReportExecuteUpdateScriptFailed(err error, updateInfo *UpdateCheckResp, failureContext map[string]interface{}) {
reportExecutingFailure("ExecuteUpdateScriptFailed", err, updateInfo, failureContext)
}
func reportExecutingFailure(failureType string, err error, updateInfo *UpdateCheckResp, failureContext map[string]interface{}) {
if errors.Is(err, os.ErrNotExist) {
failureType += ":FileNotExist"
} else if exitError := (*exec.ExitError)(nil); errors.As(err, &exitError) {
failureType += categorizeExitCode(exitError.ExitCode())
if _, ok := failureContext["exitcode"]; !ok {
failureContext["exitcode"] = exitError.ExitCode()
}
} else if err.Error() == "signal: killed" {
// TODO: Replace error message string matching with error type or
// attribute assertion
failureType += ":Killed"
}
clientreport.ReportUpdateFailure(failureType, clientreport.UpdateFailure{
UpdateInfo: updateInfo,
FailureContext: failureContext,
ErrorMessage: err.Error(),
})
}