227 lines
9.4 KiB
Go
227 lines
9.4 KiB
Go
|
// Copyright 2017 CoreOS, Inc.
|
||
|
// Copyright 2011 The Chromium OS Authors.
|
||
|
//
|
||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
// you may not use this file except in compliance with the License.
|
||
|
// You may obtain a copy of the License at
|
||
|
//
|
||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||
|
//
|
||
|
// Unless required by applicable law or agreed to in writing, software
|
||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
// See the License for the specific language governing permissions and
|
||
|
// limitations under the License.
|
||
|
|
||
|
package client
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/coreos/go-omaha/omaha"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
// These events are what update_engine sends to CoreUpdate to
|
||
|
// mark different steps in the update process.
|
||
|
EventDownloading = &omaha.EventRequest{
|
||
|
Type: omaha.EventTypeUpdateDownloadStarted,
|
||
|
Result: omaha.EventResultSuccess,
|
||
|
}
|
||
|
EventDownloaded = &omaha.EventRequest{
|
||
|
Type: omaha.EventTypeUpdateDownloadFinished,
|
||
|
Result: omaha.EventResultSuccess,
|
||
|
}
|
||
|
EventInstalled = &omaha.EventRequest{
|
||
|
Type: omaha.EventTypeUpdateComplete,
|
||
|
Result: omaha.EventResultSuccess,
|
||
|
}
|
||
|
EventComplete = &omaha.EventRequest{
|
||
|
Type: omaha.EventTypeUpdateComplete,
|
||
|
Result: omaha.EventResultSuccessReboot,
|
||
|
}
|
||
|
)
|
||
|
|
||
|
// ExitCode is used for omaha event error codes derived from update_engine
|
||
|
type ExitCode int
|
||
|
|
||
|
// These error codes are from CoreOS Container Linux update_engine 0.4.x
|
||
|
// https://github.com/coreos/update_engine/blob/master/src/update_engine/action_processor.h
|
||
|
// The whole list is included for the sake of completeness but lots of these
|
||
|
// are not generally applicable and not even used by update_engine any more.
|
||
|
// Also there are clearly duplicate errors for the same condition.
|
||
|
const (
|
||
|
ExitCodeSuccess ExitCode = 0
|
||
|
ExitCodeError ExitCode = 1
|
||
|
ExitCodeOmahaRequestError ExitCode = 2
|
||
|
ExitCodeOmahaResponseHandlerError ExitCode = 3
|
||
|
ExitCodeFilesystemCopierError ExitCode = 4
|
||
|
ExitCodePostinstallRunnerError ExitCode = 5
|
||
|
ExitCodeSetBootableFlagError ExitCode = 6
|
||
|
ExitCodeInstallDeviceOpenError ExitCode = 7
|
||
|
ExitCodeKernelDeviceOpenError ExitCode = 8
|
||
|
ExitCodeDownloadTransferError ExitCode = 9
|
||
|
ExitCodePayloadHashMismatchError ExitCode = 10
|
||
|
ExitCodePayloadSizeMismatchError ExitCode = 11
|
||
|
ExitCodeDownloadPayloadVerificationError ExitCode = 12
|
||
|
ExitCodeDownloadNewPartitionInfoError ExitCode = 13
|
||
|
ExitCodeDownloadWriteError ExitCode = 14
|
||
|
ExitCodeNewRootfsVerificationError ExitCode = 15
|
||
|
ExitCodeNewKernelVerificationError ExitCode = 16
|
||
|
ExitCodeSignedDeltaPayloadExpectedError ExitCode = 17
|
||
|
ExitCodeDownloadPayloadPubKeyVerificationError ExitCode = 18
|
||
|
ExitCodePostinstallBootedFromFirmwareB ExitCode = 19
|
||
|
ExitCodeDownloadStateInitializationError ExitCode = 20
|
||
|
ExitCodeDownloadInvalidMetadataMagicString ExitCode = 21
|
||
|
ExitCodeDownloadSignatureMissingInManifest ExitCode = 22
|
||
|
ExitCodeDownloadManifestParseError ExitCode = 23
|
||
|
ExitCodeDownloadMetadataSignatureError ExitCode = 24
|
||
|
ExitCodeDownloadMetadataSignatureVerificationError ExitCode = 25
|
||
|
ExitCodeDownloadMetadataSignatureMismatch ExitCode = 26
|
||
|
ExitCodeDownloadOperationHashVerificationError ExitCode = 27
|
||
|
ExitCodeDownloadOperationExecutionError ExitCode = 28
|
||
|
ExitCodeDownloadOperationHashMismatch ExitCode = 29
|
||
|
ExitCodeOmahaRequestEmptyResponseError ExitCode = 30
|
||
|
ExitCodeOmahaRequestXMLParseError ExitCode = 31
|
||
|
ExitCodeDownloadInvalidMetadataSize ExitCode = 32
|
||
|
ExitCodeDownloadInvalidMetadataSignature ExitCode = 33
|
||
|
ExitCodeOmahaResponseInvalid ExitCode = 34
|
||
|
ExitCodeOmahaUpdateIgnoredPerPolicy ExitCode = 35
|
||
|
ExitCodeOmahaUpdateDeferredPerPolicy ExitCode = 36
|
||
|
ExitCodeOmahaErrorInHTTPResponse ExitCode = 37
|
||
|
ExitCodeDownloadOperationHashMissingError ExitCode = 38
|
||
|
ExitCodeDownloadMetadataSignatureMissingError ExitCode = 39
|
||
|
ExitCodeOmahaUpdateDeferredForBackoff ExitCode = 40
|
||
|
ExitCodePostinstallPowerwashError ExitCode = 41
|
||
|
ExitCodeNewPCRPolicyVerificationError ExitCode = 42
|
||
|
ExitCodeNewPCRPolicyHTTPError ExitCode = 43
|
||
|
|
||
|
// Use the 2xxx range to encode HTTP errors from the Omaha server.
|
||
|
// Sometimes aggregated into ExitCodeOmahaErrorInHTTPResponse
|
||
|
ExitCodeOmahaRequestHTTPResponseBase ExitCode = 2000 // + HTTP response code
|
||
|
)
|
||
|
|
||
|
func (e ExitCode) String() string {
|
||
|
switch e {
|
||
|
case ExitCodeSuccess:
|
||
|
return "success"
|
||
|
case ExitCodeError:
|
||
|
return "error"
|
||
|
case ExitCodeOmahaRequestError:
|
||
|
return "omaha request error"
|
||
|
case ExitCodeOmahaResponseHandlerError:
|
||
|
return "omaha response handler error"
|
||
|
case ExitCodeFilesystemCopierError:
|
||
|
return "filesystem copier error"
|
||
|
case ExitCodePostinstallRunnerError:
|
||
|
return "postinstall runner error"
|
||
|
case ExitCodeSetBootableFlagError:
|
||
|
return "set bootable flag error"
|
||
|
case ExitCodeInstallDeviceOpenError:
|
||
|
return "install device open error"
|
||
|
case ExitCodeKernelDeviceOpenError:
|
||
|
return "kernel device open error"
|
||
|
case ExitCodeDownloadTransferError:
|
||
|
return "download transfer error"
|
||
|
case ExitCodePayloadHashMismatchError:
|
||
|
return "payload hash mismatch error"
|
||
|
case ExitCodePayloadSizeMismatchError:
|
||
|
return "payload size mismatch error"
|
||
|
case ExitCodeDownloadPayloadVerificationError:
|
||
|
return "download payload verification error"
|
||
|
case ExitCodeDownloadNewPartitionInfoError:
|
||
|
return "download new partition info error"
|
||
|
case ExitCodeDownloadWriteError:
|
||
|
return "download write error"
|
||
|
case ExitCodeNewRootfsVerificationError:
|
||
|
return "new rootfs verification error"
|
||
|
case ExitCodeNewKernelVerificationError:
|
||
|
return "new kernel verification error"
|
||
|
case ExitCodeSignedDeltaPayloadExpectedError:
|
||
|
return "signed delta payload expected error"
|
||
|
case ExitCodeDownloadPayloadPubKeyVerificationError:
|
||
|
return "download payload pubkey verification error"
|
||
|
case ExitCodePostinstallBootedFromFirmwareB:
|
||
|
return "postinstall booted from firmware B"
|
||
|
case ExitCodeDownloadStateInitializationError:
|
||
|
return "download state initialization error"
|
||
|
case ExitCodeDownloadInvalidMetadataMagicString:
|
||
|
return "download invalid metadata magic string"
|
||
|
case ExitCodeDownloadSignatureMissingInManifest:
|
||
|
return "download signature missing in manifest"
|
||
|
case ExitCodeDownloadManifestParseError:
|
||
|
return "download manifest parse error"
|
||
|
case ExitCodeDownloadMetadataSignatureError:
|
||
|
return "download metadata signature error"
|
||
|
case ExitCodeDownloadMetadataSignatureVerificationError:
|
||
|
return "download metadata signature verification error"
|
||
|
case ExitCodeDownloadMetadataSignatureMismatch:
|
||
|
return "download metadata signature mismatch"
|
||
|
case ExitCodeDownloadOperationHashVerificationError:
|
||
|
return "download operation hash verification error"
|
||
|
case ExitCodeDownloadOperationExecutionError:
|
||
|
return "download operation execution error"
|
||
|
case ExitCodeDownloadOperationHashMismatch:
|
||
|
return "download operation hash mismatch"
|
||
|
case ExitCodeOmahaRequestEmptyResponseError:
|
||
|
return "omaha request empty response error"
|
||
|
case ExitCodeOmahaRequestXMLParseError:
|
||
|
return "omaha request XML parse error"
|
||
|
case ExitCodeDownloadInvalidMetadataSize:
|
||
|
return "download invalid metadata size"
|
||
|
case ExitCodeDownloadInvalidMetadataSignature:
|
||
|
return "download invalid metadata signature"
|
||
|
case ExitCodeOmahaResponseInvalid:
|
||
|
return "omaha response invalid"
|
||
|
case ExitCodeOmahaUpdateIgnoredPerPolicy:
|
||
|
return "omaha update ignored per policy"
|
||
|
case ExitCodeOmahaUpdateDeferredPerPolicy:
|
||
|
return "omaha update deferred per policy"
|
||
|
case ExitCodeOmahaErrorInHTTPResponse:
|
||
|
return "omaha error in HTTP response"
|
||
|
case ExitCodeDownloadOperationHashMissingError:
|
||
|
return "download operation hash missing error"
|
||
|
case ExitCodeDownloadMetadataSignatureMissingError:
|
||
|
return "download metadata signature missing error"
|
||
|
case ExitCodeOmahaUpdateDeferredForBackoff:
|
||
|
return "omaha update deferred for backoff"
|
||
|
case ExitCodePostinstallPowerwashError:
|
||
|
return "postinstall powerwash error"
|
||
|
case ExitCodeNewPCRPolicyVerificationError:
|
||
|
return "new PCR policy verification error"
|
||
|
case ExitCodeNewPCRPolicyHTTPError:
|
||
|
return "new PCR policy HTTP error"
|
||
|
default:
|
||
|
if e > ExitCodeOmahaRequestHTTPResponseBase {
|
||
|
return fmt.Sprintf("omaha response HTTP %d error",
|
||
|
e-ExitCodeOmahaRequestHTTPResponseBase)
|
||
|
}
|
||
|
return fmt.Sprintf("error code %d", e)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// NewErrorEvent creates an EventRequest for reporting errors.
|
||
|
func NewErrorEvent(e ExitCode) *omaha.EventRequest {
|
||
|
return &omaha.EventRequest{
|
||
|
Type: omaha.EventTypeUpdateComplete,
|
||
|
Result: omaha.EventResultError,
|
||
|
ErrorCode: int(e),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// EventString allows for easily logging events in a readable format.
|
||
|
func EventString(e *omaha.EventRequest) string {
|
||
|
s := fmt.Sprintf("omaha event: %s: %s", e.Type, e.Result)
|
||
|
if e.ErrorCode != 0 {
|
||
|
s = fmt.Sprintf("%s (%d - %s)", s,
|
||
|
e.ErrorCode, ExitCode(e.ErrorCode))
|
||
|
}
|
||
|
return s
|
||
|
}
|
||
|
|
||
|
// ErrorEvent is an error type that can generate EventRequests for reporting.
|
||
|
type ErrorEvent interface {
|
||
|
error
|
||
|
ErrorEvent() *omaha.EventRequest
|
||
|
}
|