Documentation ¶
Overview ¶
go-selfupdate detects the information of the latest release via GitHub Releases API and checks the current version. If newer version than itself is detected, it downloads released binary from GitHub and replaces itself.
- Automatically detects the latest version of released binary on GitHub
- Retrieve the proper binary for the OS and arch where the binary is running
- Update the binary with rollback support on failure
- Tested on Linux, macOS and Windows
- Many archive and compression formats are supported (zip, gzip, xzip, bzip2, tar)
There are some naming rules. Please read following links.
Naming Rules of Released Binaries:
https://github.com/creativeprojects/go-selfupdate#naming-rules-of-released-binaries
Naming Rules of Git Tags:
https://github.com/creativeprojects/go-selfupdate#naming-rules-of-versions-git-tags
This package is hosted on GitHub:
https://github.com/creativeprojects/go-selfupdate
Small CLI tools as wrapper of this library are available also:
https://github.com/creativeprojects/go-selfupdate/cmd/detect-latest-release https://github.com/creativeprojects/go-selfupdate/cmd/go-get-release
Index ¶
- Variables
- func DecompressCommand(src io.Reader, url, cmd, os, arch string) (io.Reader, error)
- func ExecutablePath() (string, error)
- func IsDarwinUniversalBinary(filename string) bool
- func SetLogger(logger Logger)
- func UpdateTo(ctx context.Context, assetURL, assetFileName, cmdPath string) error
- type ChecksumValidator
- type Config
- type ECDSAValidator
- type GitHubAsset
- type GitHubConfig
- type GitHubRelease
- func (r *GitHubRelease) GetAssets() []SourceAsset
- func (r *GitHubRelease) GetDraft() bool
- func (a *GitHubRelease) GetID() int64
- func (r *GitHubRelease) GetName() string
- func (r *GitHubRelease) GetPrerelease() bool
- func (r *GitHubRelease) GetPublishedAt() time.Time
- func (r *GitHubRelease) GetReleaseNotes() string
- func (r *GitHubRelease) GetTagName() string
- func (r *GitHubRelease) GetURL() string
- type GitHubSource
- type GitLabAsset
- type GitLabConfig
- type GitLabRelease
- func (r *GitLabRelease) GetAssets() []SourceAsset
- func (r *GitLabRelease) GetDraft() bool
- func (r *GitLabRelease) GetID() int64
- func (r *GitLabRelease) GetName() string
- func (r *GitLabRelease) GetPrerelease() bool
- func (r *GitLabRelease) GetPublishedAt() time.Time
- func (r *GitLabRelease) GetReleaseNotes() string
- func (r *GitLabRelease) GetTagName() string
- func (r *GitLabRelease) GetURL() string
- type GitLabSource
- type GiteaAsset
- type GiteaConfig
- type GiteaRelease
- func (r *GiteaRelease) GetAssets() []SourceAsset
- func (r *GiteaRelease) GetDraft() bool
- func (r *GiteaRelease) GetID() int64
- func (r *GiteaRelease) GetName() string
- func (r *GiteaRelease) GetPrerelease() bool
- func (r *GiteaRelease) GetPublishedAt() time.Time
- func (r *GiteaRelease) GetReleaseNotes() string
- func (r *GiteaRelease) GetTagName() string
- func (r *GiteaRelease) GetURL() string
- type GiteaSource
- type HttpAsset
- type HttpConfig
- type HttpManifest
- type HttpRelease
- func (r *HttpRelease) GetAssets() []SourceAsset
- func (r *HttpRelease) GetDraft() bool
- func (r *HttpRelease) GetID() int64
- func (r *HttpRelease) GetName() string
- func (r *HttpRelease) GetPrerelease() bool
- func (r *HttpRelease) GetPublishedAt() time.Time
- func (r *HttpRelease) GetReleaseNotes() string
- func (r *HttpRelease) GetTagName() string
- func (r *HttpRelease) GetURL() string
- type HttpSource
- type Logger
- type PGPValidator
- type PatternValidator
- func (m *PatternValidator) Add(glob string, validator Validator) *PatternValidator
- func (m *PatternValidator) GetValidationAssetName(releaseFilename string) string
- func (m *PatternValidator) MustContinueValidation(filename string) bool
- func (m *PatternValidator) SkipValidation(glob string) *PatternValidator
- func (m *PatternValidator) Validate(filename string, release, asset []byte) error
- type RecursiveValidator
- type Release
- func DetectLatest(ctx context.Context, repository Repository) (*Release, bool, error)
- func DetectVersion(ctx context.Context, repository Repository, version string) (*Release, bool, error)
- func UpdateCommand(ctx context.Context, cmdPath string, current string, repository Repository) (*Release, error)
- func UpdateSelf(ctx context.Context, current string, repository Repository) (*Release, error)
- type Repository
- type RepositoryID
- type RepositorySlug
- type SHAValidator
- type Source
- type SourceAsset
- type SourceRelease
- type Updater
- func (up *Updater) DetectLatest(ctx context.Context, repository Repository) (release *Release, found bool, err error)
- func (up *Updater) DetectVersion(ctx context.Context, repository Repository, version string) (release *Release, found bool, err error)
- func (up *Updater) UpdateCommand(ctx context.Context, cmdPath string, current string, repository Repository) (*Release, error)
- func (up *Updater) UpdateSelf(ctx context.Context, current string, repository Repository) (*Release, error)
- func (up *Updater) UpdateTo(ctx context.Context, rel *Release, cmdPath string) error
- type Validator
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( ErrNotSupported = errors.New("operation not supported") ErrInvalidSlug = errors.New("invalid slug format, expected 'owner/name'") ErrIncorrectParameterOwner = errors.New("incorrect parameter \"owner\"") ErrIncorrectParameterRepo = errors.New("incorrect parameter \"repo\"") ErrInvalidID = errors.New("invalid repository ID, expected 'owner/name' but found number") ErrInvalidRelease = errors.New("invalid release (nil argument)") ErrAssetNotFound = errors.New("asset not found") ErrValidationAssetNotFound = errors.New("validation file not found") ErrValidatorNotFound = errors.New("file did not match a configured validator") ErrIncorrectChecksumFile = errors.New("incorrect checksum file format") ErrChecksumValidationFailed = errors.New("sha256 validation failed") ErrHashNotFound = errors.New("hash not found in checksum file") ErrECDSAValidationFailed = errors.New("ECDSA signature verification failed") ErrInvalidECDSASignature = errors.New("invalid ECDSA signature") ErrInvalidPGPSignature = errors.New("invalid PGP signature") ErrPGPKeyRingNotSet = errors.New("PGP key ring not set") ErrCannotDecompressFile = errors.New("failed to decompress") ErrExecutableNotFoundInArchive = errors.New("executable not found") )
Possible errors returned
Functions ¶
func DecompressCommand ¶
DecompressCommand decompresses the given source. Archive and compression format is automatically detected from 'url' parameter, which represents the URL of asset, or simply a filename (with an extension). This returns a reader for the decompressed command given by 'cmd'. '.zip', '.tar.gz', '.tar.xz', '.tgz', '.gz', '.bz2' and '.xz' are supported.
These wrapped errors can be returned:
- ErrCannotDecompressFile
- ErrExecutableNotFoundInArchive
func ExecutablePath ¶ added in v1.3.0
func IsDarwinUniversalBinary ¶ added in v1.3.0
IsDarwinUniversalBinary checks if the file is a universal binary (also called a fat binary).
func SetLogger ¶
func SetLogger(logger Logger)
SetLogger redirects all logs to the logger defined in parameter. By default logs are not sent anywhere.
Example ¶
// you can plug-in any logger providing the 2 methods Print and Printf // the default log.Logger satisfies the interface logger := stdlog.New(os.Stdout, "selfupdate ", 0) SetLogger(logger)
Output:
func UpdateTo ¶
UpdateTo downloads an executable from assetURL and replaces the current binary with the downloaded one. This function is low-level API to update the binary. Because it does not use a source provider and downloads asset directly from the URL via HTTP, this function is not available to update a release for private repositories. cmdPath is a file path to command executable.
Types ¶
type ChecksumValidator ¶
type ChecksumValidator struct { // UniqueFilename is the name of the global file containing all the checksums // Usually "checksums.txt", "SHA256SUMS", etc. UniqueFilename string }
ChecksumValidator is a SHA256 checksum validator where all the validation hash are in a single file (one per line)
func (*ChecksumValidator) GetValidationAssetName ¶
func (v *ChecksumValidator) GetValidationAssetName(releaseFilename string) string
GetValidationAssetName returns the unique asset name for SHA256 validation.
type Config ¶
type Config struct { // Source where to load the releases from (example: GitHubSource). Source Source // Validator represents types which enable additional validation of downloaded release. Validator Validator // Filters are regexp used to filter on specific assets for releases with multiple assets. // An asset is selected if it matches any of those, in addition to the regular tag, os, arch, extensions. // Please make sure that your filter(s) uniquely match an asset. Filters []string // OS is set to the value of runtime.GOOS by default, but you can force another value here. OS string // Arch is set to the value of runtime.GOARCH by default, but you can force another value here. Arch string // Arm 32bits version. Valid values are 0 (unknown), 5, 6 or 7. Default is detected value (if available). Arm uint8 // Arch name for macOS universal binary. Default to none. // If set, the updater will only pick the universal binary if the Arch is not found. UniversalArch string // Draft permits an upgrade to a "draft" version (default to false). Draft bool // Prerelease permits an upgrade to a "pre-release" version (default to false). Prerelease bool // To prevent automatic removal of the old binary, and allow you to test an update prior to manual removal. OldSavePath string }
Config represents the configuration of self-update.
type ECDSAValidator ¶
ECDSAValidator specifies a ECDSA validator for additional file validation before updating.
func (*ECDSAValidator) GetValidationAssetName ¶
func (v *ECDSAValidator) GetValidationAssetName(releaseFilename string) string
GetValidationAssetName returns the asset name for ECDSA validation.
func (*ECDSAValidator) Validate ¶
func (v *ECDSAValidator) Validate(filename string, input, signature []byte) error
Validate checks the ECDSA signature of the release against the signature contained in an additional asset file.
func (*ECDSAValidator) WithPublicKey ¶ added in v1.0.0
func (v *ECDSAValidator) WithPublicKey(pemData []byte) *ECDSAValidator
WithPublicKey is a convenience method to set PublicKey from a PEM encoded ECDSA certificate
type GitHubAsset ¶
type GitHubAsset struct {
// contains filtered or unexported fields
}
func NewGitHubAsset ¶
func NewGitHubAsset(from *github.ReleaseAsset) *GitHubAsset
func (*GitHubAsset) GetBrowserDownloadURL ¶
func (a *GitHubAsset) GetBrowserDownloadURL() string
func (*GitHubAsset) GetID ¶
func (a *GitHubAsset) GetID() int64
func (*GitHubAsset) GetName ¶
func (a *GitHubAsset) GetName() string
func (*GitHubAsset) GetSize ¶
func (a *GitHubAsset) GetSize() int
type GitHubConfig ¶
type GitHubConfig struct { // APIToken represents GitHub API token. If it's not empty, it will be used for authentication of GitHub API APIToken string // EnterpriseBaseURL is a base URL of GitHub API. If you want to use this library with GitHub Enterprise, // please set "https://{your-organization-address}/api/v3/" to this field. EnterpriseBaseURL string // EnterpriseUploadURL is a URL to upload stuffs to GitHub Enterprise instance. This is often the same as an API base URL. // So if this field is not set and EnterpriseBaseURL is set, EnterpriseBaseURL is also set to this field. EnterpriseUploadURL string // Deprecated: Context option is no longer used Context context.Context }
GitHubConfig is an object to pass to NewGitHubSource
type GitHubRelease ¶
type GitHubRelease struct {
// contains filtered or unexported fields
}
func NewGitHubRelease ¶
func NewGitHubRelease(from *github.RepositoryRelease) *GitHubRelease
func (*GitHubRelease) GetAssets ¶
func (r *GitHubRelease) GetAssets() []SourceAsset
func (*GitHubRelease) GetDraft ¶
func (r *GitHubRelease) GetDraft() bool
func (*GitHubRelease) GetID ¶ added in v0.5.0
func (a *GitHubRelease) GetID() int64
func (*GitHubRelease) GetName ¶
func (r *GitHubRelease) GetName() string
func (*GitHubRelease) GetPrerelease ¶
func (r *GitHubRelease) GetPrerelease() bool
func (*GitHubRelease) GetPublishedAt ¶
func (r *GitHubRelease) GetPublishedAt() time.Time
func (*GitHubRelease) GetReleaseNotes ¶
func (r *GitHubRelease) GetReleaseNotes() string
func (*GitHubRelease) GetTagName ¶
func (r *GitHubRelease) GetTagName() string
func (*GitHubRelease) GetURL ¶
func (r *GitHubRelease) GetURL() string
type GitHubSource ¶
type GitHubSource struct {
// contains filtered or unexported fields
}
GitHubSource is used to load release information from GitHub
func NewGitHubSource ¶
func NewGitHubSource(config GitHubConfig) (*GitHubSource, error)
NewGitHubSource creates a new GitHubSource from a config object. It initializes a GitHub API client. If you set your API token to the $GITHUB_TOKEN environment variable, the client will use it. You can pass an empty GitHubSource{} to use the default configuration The function will return an error if the GitHub Enterprise URLs in the config object cannot be parsed
func (*GitHubSource) DownloadReleaseAsset ¶
func (s *GitHubSource) DownloadReleaseAsset(ctx context.Context, rel *Release, assetID int64) (io.ReadCloser, error)
DownloadReleaseAsset downloads an asset from a release. It returns an io.ReadCloser: it is your responsibility to Close it.
func (*GitHubSource) ListReleases ¶
func (s *GitHubSource) ListReleases(ctx context.Context, repository Repository) ([]SourceRelease, error)
ListReleases returns all available releases
type GitLabAsset ¶ added in v1.0.0
type GitLabAsset struct {
// contains filtered or unexported fields
}
func NewGitLabAsset ¶ added in v1.0.0
func NewGitLabAsset(from *gitlab.ReleaseLink) *GitLabAsset
func (*GitLabAsset) GetBrowserDownloadURL ¶ added in v1.0.0
func (a *GitLabAsset) GetBrowserDownloadURL() string
func (*GitLabAsset) GetID ¶ added in v1.0.0
func (a *GitLabAsset) GetID() int64
func (*GitLabAsset) GetName ¶ added in v1.0.0
func (a *GitLabAsset) GetName() string
func (*GitLabAsset) GetSize ¶ added in v1.0.0
func (a *GitLabAsset) GetSize() int
type GitLabConfig ¶ added in v1.0.0
type GitLabConfig struct { // APIToken represents GitLab API token. If it's not empty, it will be used for authentication for the API APIToken string // BaseURL is a base URL of your private GitLab instance BaseURL string }
GitLabConfig is an object to pass to NewGitLabSource
type GitLabRelease ¶ added in v1.0.0
type GitLabRelease struct {
// contains filtered or unexported fields
}
func NewGitLabRelease ¶ added in v1.0.0
func NewGitLabRelease(from *gitlab.Release) *GitLabRelease
func (*GitLabRelease) GetAssets ¶ added in v1.0.0
func (r *GitLabRelease) GetAssets() []SourceAsset
func (*GitLabRelease) GetDraft ¶ added in v1.0.0
func (r *GitLabRelease) GetDraft() bool
func (*GitLabRelease) GetID ¶ added in v1.0.0
func (r *GitLabRelease) GetID() int64
func (*GitLabRelease) GetName ¶ added in v1.0.0
func (r *GitLabRelease) GetName() string
func (*GitLabRelease) GetPrerelease ¶ added in v1.0.0
func (r *GitLabRelease) GetPrerelease() bool
func (*GitLabRelease) GetPublishedAt ¶ added in v1.0.0
func (r *GitLabRelease) GetPublishedAt() time.Time
func (*GitLabRelease) GetReleaseNotes ¶ added in v1.0.0
func (r *GitLabRelease) GetReleaseNotes() string
func (*GitLabRelease) GetTagName ¶ added in v1.0.0
func (r *GitLabRelease) GetTagName() string
func (*GitLabRelease) GetURL ¶ added in v1.0.0
func (r *GitLabRelease) GetURL() string
type GitLabSource ¶ added in v1.0.0
type GitLabSource struct {
// contains filtered or unexported fields
}
GitLabSource is used to load release information from GitLab
func NewGitLabSource ¶ added in v1.0.0
func NewGitLabSource(config GitLabConfig) (*GitLabSource, error)
NewGitLabSource creates a new GitLabSource from a config object. It initializes a GitLab API client. If you set your API token to the $GITLAB_TOKEN environment variable, the client will use it. You can pass an empty GitLabSource{} to use the default configuration The function will return an error if the GitLab Enterprise URLs in the config object cannot be parsed
func (*GitLabSource) DownloadReleaseAsset ¶ added in v1.0.0
func (s *GitLabSource) DownloadReleaseAsset(ctx context.Context, rel *Release, assetID int64) (io.ReadCloser, error)
DownloadReleaseAsset downloads an asset from a release. It returns an io.ReadCloser: it is your responsibility to Close it.
func (*GitLabSource) ListReleases ¶ added in v1.0.0
func (s *GitLabSource) ListReleases(ctx context.Context, repository Repository) ([]SourceRelease, error)
ListReleases returns all available releases
type GiteaAsset ¶ added in v0.5.0
type GiteaAsset struct {
// contains filtered or unexported fields
}
func NewGiteaAsset ¶ added in v0.5.0
func NewGiteaAsset(from *gitea.Attachment) *GiteaAsset
func (*GiteaAsset) GetBrowserDownloadURL ¶ added in v0.5.0
func (a *GiteaAsset) GetBrowserDownloadURL() string
func (*GiteaAsset) GetID ¶ added in v0.5.0
func (a *GiteaAsset) GetID() int64
func (*GiteaAsset) GetName ¶ added in v0.5.0
func (a *GiteaAsset) GetName() string
func (*GiteaAsset) GetSize ¶ added in v0.5.0
func (a *GiteaAsset) GetSize() int
type GiteaConfig ¶ added in v0.5.0
type GiteaConfig struct { // APIToken represents Gitea API token. If it's not empty, it will be used for authentication for the API APIToken string // BaseURL is a base URL of your gitea instance. This parameter has NO default value. BaseURL string // Deprecated: Context option is no longer used Context context.Context }
GiteaConfig is an object to pass to NewGiteaSource
type GiteaRelease ¶ added in v0.5.0
type GiteaRelease struct {
// contains filtered or unexported fields
}
func NewGiteaRelease ¶ added in v0.5.0
func NewGiteaRelease(from *gitea.Release) *GiteaRelease
func (*GiteaRelease) GetAssets ¶ added in v0.5.0
func (r *GiteaRelease) GetAssets() []SourceAsset
func (*GiteaRelease) GetDraft ¶ added in v0.5.0
func (r *GiteaRelease) GetDraft() bool
func (*GiteaRelease) GetID ¶ added in v0.5.0
func (r *GiteaRelease) GetID() int64
func (*GiteaRelease) GetName ¶ added in v0.5.0
func (r *GiteaRelease) GetName() string
func (*GiteaRelease) GetPrerelease ¶ added in v0.5.0
func (r *GiteaRelease) GetPrerelease() bool
func (*GiteaRelease) GetPublishedAt ¶ added in v0.5.0
func (r *GiteaRelease) GetPublishedAt() time.Time
func (*GiteaRelease) GetReleaseNotes ¶ added in v0.5.0
func (r *GiteaRelease) GetReleaseNotes() string
func (*GiteaRelease) GetTagName ¶ added in v0.5.0
func (r *GiteaRelease) GetTagName() string
func (*GiteaRelease) GetURL ¶ added in v0.5.0
func (r *GiteaRelease) GetURL() string
type GiteaSource ¶ added in v0.5.0
type GiteaSource struct {
// contains filtered or unexported fields
}
GiteaSource is used to load release information from Gitea
func NewGiteaSource ¶ added in v0.5.0
func NewGiteaSource(config GiteaConfig) (*GiteaSource, error)
NewGiteaSource creates a new NewGiteaSource from a config object. It initializes a Gitea API Client. If you set your API token to the $GITEA_TOKEN environment variable, the client will use it. You can pass an empty GiteaSource{} to use the default configuration
func (*GiteaSource) DownloadReleaseAsset ¶ added in v0.5.0
func (s *GiteaSource) DownloadReleaseAsset(ctx context.Context, rel *Release, assetID int64) (io.ReadCloser, error)
DownloadReleaseAsset downloads an asset from a release. It returns an io.ReadCloser: it is your responsibility to Close it.
func (*GiteaSource) ListReleases ¶ added in v0.5.0
func (s *GiteaSource) ListReleases(ctx context.Context, repository Repository) ([]SourceRelease, error)
ListReleases returns all available releases
type HttpAsset ¶ added in v1.4.0
type HttpAsset struct { ID int64 `yaml:"id"` Name string `yaml:"name"` Size int `yaml:"size"` URL string `yaml:"url"` }
func (*HttpAsset) GetBrowserDownloadURL ¶ added in v1.4.0
type HttpConfig ¶ added in v1.4.0
type HttpConfig struct { // BaseURL is a base URL of your update server. This parameter has NO default value. BaseURL string // HTTP Transport Config Transport *http.Transport // Additional headers Headers http.Header }
HttpConfig is an object to pass to NewHttpSource
type HttpManifest ¶ added in v1.4.0
type HttpManifest struct { LastReleaseID int64 `yaml:"last_release_id"` LastAssetID int64 `yaml:"last_asset_id"` Releases []*HttpRelease `yaml:"releases"` }
type HttpRelease ¶ added in v1.4.0
type HttpRelease struct { ID int64 `yaml:"id"` Name string `yaml:"name"` TagName string `yaml:"tag_name"` URL string `yaml:"url"` Draft bool `yaml:"draft"` Prerelease bool `yaml:"prerelease"` PublishedAt time.Time `yaml:"published_at"` ReleaseNotes string `yaml:"release_notes"` Assets []*HttpAsset `yaml:"assets"` }
func (*HttpRelease) GetAssets ¶ added in v1.4.0
func (r *HttpRelease) GetAssets() []SourceAsset
func (*HttpRelease) GetDraft ¶ added in v1.4.0
func (r *HttpRelease) GetDraft() bool
func (*HttpRelease) GetID ¶ added in v1.4.0
func (r *HttpRelease) GetID() int64
func (*HttpRelease) GetName ¶ added in v1.4.0
func (r *HttpRelease) GetName() string
func (*HttpRelease) GetPrerelease ¶ added in v1.4.0
func (r *HttpRelease) GetPrerelease() bool
func (*HttpRelease) GetPublishedAt ¶ added in v1.4.0
func (r *HttpRelease) GetPublishedAt() time.Time
func (*HttpRelease) GetReleaseNotes ¶ added in v1.4.0
func (r *HttpRelease) GetReleaseNotes() string
func (*HttpRelease) GetTagName ¶ added in v1.4.0
func (r *HttpRelease) GetTagName() string
func (*HttpRelease) GetURL ¶ added in v1.4.0
func (r *HttpRelease) GetURL() string
type HttpSource ¶ added in v1.4.0
type HttpSource struct {
// contains filtered or unexported fields
}
HttpSource is used to load release information from an http repository
func NewHttpSource ¶ added in v1.4.0
func NewHttpSource(config HttpConfig) (*HttpSource, error)
NewHttpSource creates a new HttpSource from a config object.
func (*HttpSource) DownloadReleaseAsset ¶ added in v1.4.0
func (s *HttpSource) DownloadReleaseAsset(ctx context.Context, rel *Release, assetID int64) (io.ReadCloser, error)
DownloadReleaseAsset downloads an asset from a release. It returns an io.ReadCloser: it is your responsibility to Close it.
func (*HttpSource) ListReleases ¶ added in v1.4.0
func (s *HttpSource) ListReleases(ctx context.Context, repository Repository) ([]SourceRelease, error)
ListReleases returns all available releases
type Logger ¶
type Logger interface { // Print calls Output to print to the standard logger. Arguments are handled in the manner of fmt.Print. Print(v ...interface{}) // Printf calls Output to print to the standard logger. Arguments are handled in the manner of fmt.Printf. Printf(format string, v ...interface{}) }
Logger interface. Compatible with standard log.Logger
type PGPValidator ¶ added in v1.0.0
type PGPValidator struct { // KeyRing is usually filled by openpgp.ReadArmoredKeyRing(bytes.NewReader(key)) with key being the PGP pub key. KeyRing openpgp.EntityList // Binary toggles whether to validate detached *.sig (binary) or *.asc (ascii) signature files Binary bool }
PGPValidator specifies a PGP validator for additional file validation before updating.
func (*PGPValidator) GetValidationAssetName ¶ added in v1.0.0
func (g *PGPValidator) GetValidationAssetName(releaseFilename string) string
GetValidationAssetName returns the asset name for PGP validation.
func (*PGPValidator) Validate ¶ added in v1.0.0
func (g *PGPValidator) Validate(filename string, release, signature []byte) (err error)
Validate checks the PGP signature of the release against the signature contained in an additional asset file.
func (*PGPValidator) WithArmoredKeyRing ¶ added in v1.0.0
func (g *PGPValidator) WithArmoredKeyRing(key []byte) *PGPValidator
WithArmoredKeyRing is a convenience method to set KeyRing
type PatternValidator ¶ added in v1.0.0
type PatternValidator struct {
// contains filtered or unexported fields
}
PatternValidator specifies a validator for additional file validation that redirects to other validators depending on glob file patterns.
Unlike others, PatternValidator is a recursive validator that also checks validation assets (e.g. SHA256SUMS file checks assets and SHA256SUMS.asc checks the SHA256SUMS file). Depending on the used validators, a validation loop might be created, causing validation errors. In order to prevent this, use SkipValidation for validation assets that should not be checked (e.g. signature files). Note that glob pattern are matched in the order of addition. Add general patterns like "*" at last.
Usage Example (validate assets by SHA256SUMS and SHA256SUMS.asc):
new(PatternValidator). // "SHA256SUMS" file is checked by PGP signature (from "SHA256SUMS.asc") Add("SHA256SUMS", new(PGPValidator).WithArmoredKeyRing(key)). // "SHA256SUMS.asc" file is not checked (is the signature for "SHA256SUMS") SkipValidation("*.asc"). // All other files are checked by the "SHA256SUMS" file Add("*", &ChecksumValidator{UniqueFilename:"SHA256SUMS"})
func (*PatternValidator) Add ¶ added in v1.0.0
func (m *PatternValidator) Add(glob string, validator Validator) *PatternValidator
Add maps a new validator to the given glob pattern.
func (*PatternValidator) GetValidationAssetName ¶ added in v1.0.0
func (m *PatternValidator) GetValidationAssetName(releaseFilename string) string
GetValidationAssetName returns the asset name for validation.
func (*PatternValidator) MustContinueValidation ¶ added in v1.0.0
func (m *PatternValidator) MustContinueValidation(filename string) bool
MustContinueValidation returns true if validation must continue on the specified filename
func (*PatternValidator) SkipValidation ¶ added in v1.0.0
func (m *PatternValidator) SkipValidation(glob string) *PatternValidator
SkipValidation skips validation for the given glob pattern.
type RecursiveValidator ¶ added in v1.0.0
type RecursiveValidator interface { // MustContinueValidation returns true if validation must continue on the provided filename MustContinueValidation(filename string) bool }
RecursiveValidator may be implemented by validators that can continue validation on validation assets (multistep validation).
type Release ¶
type Release struct { // AssetURL is a URL to the uploaded file for the release AssetURL string // AssetSize represents the size of asset in bytes AssetByteSize int // AssetID is the ID of the asset on the source platform AssetID int64 // ReleaseID is the ID of the release on the source platform ReleaseID int64 // AssetName is the filename of the asset AssetName string // ValidationAssetID is the ID of additional validation asset on the source platform ValidationAssetID int64 // ValidationAssetURL is the URL of additional validation asset on the source platform ValidationAssetURL string // ValidationChain is the list of validation assets being used (first record is ValidationAssetID). ValidationChain []struct { // ValidationAssetID is the ID of additional validation asset on the source platform ValidationAssetID int64 // ValidationAssetURL is the filename of additional validation asset on the source platform ValidationAssetName string // ValidationAssetURL is the URL of additional validation asset on the source platform ValidationAssetURL string } // URL is a URL to release page for browsing URL string // ReleaseNotes is a release notes of the release ReleaseNotes string // Name represents a name of the release Name string // PublishedAt is the time when the release was published PublishedAt time.Time // OS this release is for OS string // Arch this release is for Arch string // Arm 32bits version (if any). Valid values are 0 (unknown), 5, 6 or 7 Arm uint8 // Prerelease is set to true for alpha, beta or release candidates Prerelease bool // contains filtered or unexported fields }
Release represents a release asset for current OS and arch.
func DetectLatest ¶
DetectLatest detects the latest release from the repository. This function is a shortcut version of updater.DetectLatest with the DefaultUpdater.
func DetectVersion ¶
func DetectVersion(ctx context.Context, repository Repository, version string) (*Release, bool, error)
DetectVersion detects the given release from the repository.
func UpdateCommand ¶
func UpdateCommand(ctx context.Context, cmdPath string, current string, repository Repository) (*Release, error)
UpdateCommand updates a given command binary to the latest version. This function is a shortcut version of updater.UpdateCommand using a DefaultUpdater()
func UpdateSelf ¶
UpdateSelf updates the running executable itself to the latest version. This function is a shortcut version of updater.UpdateSelf using a DefaultUpdater()
func (Release) GreaterOrEqual ¶
GreaterOrEqual tests if one version is greater than or equal to another one.
func (Release) GreaterThan ¶
GreaterThan tests if one version is greater than another one.
func (Release) LessOrEqual ¶
LessOrEqual tests if one version is less than or equal to another one.
type Repository ¶ added in v1.0.0
type RepositoryID ¶ added in v1.0.0
type RepositoryID int
func NewRepositoryID ¶ added in v1.0.0
func NewRepositoryID(id int) RepositoryID
NewRepositoryID creates a repository ID from an integer
func (RepositoryID) Get ¶ added in v1.0.0
func (r RepositoryID) Get() (interface{}, error)
type RepositorySlug ¶ added in v1.0.0
type RepositorySlug struct {
// contains filtered or unexported fields
}
func NewRepositorySlug ¶ added in v1.0.0
func NewRepositorySlug(owner, repo string) RepositorySlug
NewRepositorySlug creates a RepositorySlug from owner and repo parameters
func ParseSlug ¶ added in v1.0.0
func ParseSlug(slug string) RepositorySlug
ParseSlug is used to take a string "owner/repo" to make a RepositorySlug
func (RepositorySlug) Get ¶ added in v1.0.0
func (r RepositorySlug) Get() (interface{}, error)
type SHAValidator ¶
type SHAValidator struct { }
SHAValidator specifies a SHA256 validator for additional file validation before updating.
func (*SHAValidator) GetValidationAssetName ¶
func (v *SHAValidator) GetValidationAssetName(releaseFilename string) string
GetValidationAssetName returns the asset name for SHA256 validation.
type Source ¶
type Source interface { ListReleases(ctx context.Context, repository Repository) ([]SourceRelease, error) DownloadReleaseAsset(ctx context.Context, rel *Release, assetID int64) (io.ReadCloser, error) }
Source interface to load the releases from (GitHubSource for example)
type SourceAsset ¶
type SourceRelease ¶
type Updater ¶
type Updater struct {
// contains filtered or unexported fields
}
Updater is responsible for managing the context of self-update.
func DefaultUpdater ¶
func DefaultUpdater() *Updater
DefaultUpdater creates a new updater instance with default configuration. It initializes GitHub API client with default API base URL. If you set your API token to $GITHUB_TOKEN, the client will use it. Every call to this function will always return the same instance, it's only created once
func NewUpdater ¶
NewUpdater creates a new updater instance. If you don't specify a source in the config object, GitHub will be used
func (*Updater) DetectLatest ¶
func (up *Updater) DetectLatest(ctx context.Context, repository Repository) (release *Release, found bool, err error)
DetectLatest tries to get the latest version from the source provider. It fetches releases information from the source provider and find out the latest release with matching the tag names and asset names. Drafts and pre-releases are ignored. Assets would be suffixed by the OS name and the arch name such as 'foo_linux_amd64' where 'foo' is a command name. '-' can also be used as a separator. File can be compressed with zip, gzip, xz, bzip2, tar&gzip or tar&xz. So the asset can have a file extension for the corresponding compression format such as '.zip'. On Windows, '.exe' also can be contained such as 'foo_windows_amd64.exe.zip'.
func (*Updater) DetectVersion ¶
func (up *Updater) DetectVersion(ctx context.Context, repository Repository, version string) (release *Release, found bool, err error)
DetectVersion tries to get the given version from the source provider. And version indicates the required version.
func (*Updater) UpdateCommand ¶
func (up *Updater) UpdateCommand(ctx context.Context, cmdPath string, current string, repository Repository) (*Release, error)
UpdateCommand updates a given command binary to the latest version. 'current' is used to check the latest version against the current version.
func (*Updater) UpdateSelf ¶
func (up *Updater) UpdateSelf(ctx context.Context, current string, repository Repository) (*Release, error)
UpdateSelf updates the running executable itself to the latest version. 'current' is used to check the latest version against the current version.
type Validator ¶
type Validator interface { // Validate validates release bytes against an additional asset bytes. // See SHAValidator or ECDSAValidator for more information. Validate(filename string, release, asset []byte) error // GetValidationAssetName returns the additional asset name containing the validation checksum. // The asset containing the checksum can be based on the release asset name // Please note if the validation file cannot be found, the DetectLatest and DetectVersion methods // will fail with a wrapped ErrValidationAssetNotFound error GetValidationAssetName(releaseFilename string) string }
Validator represents an interface which enables additional validation of releases.
func NewChecksumWithECDSAValidator ¶ added in v1.0.0
NewChecksumWithECDSAValidator returns a validator that checks assets with a checksums file (e.g. SHA256SUMS) and the checksums file with an ECDSA signature (e.g. SHA256SUMS.sig).
func NewChecksumWithPGPValidator ¶ added in v1.0.0
NewChecksumWithPGPValidator returns a validator that checks assets with a checksums file (e.g. SHA256SUMS) and the checksums file with an armored PGP signature (e.g. SHA256SUMS.asc).
Source Files ¶
- arch.go
- arm.go
- config.go
- decompress.go
- detect.go
- doc.go
- errors.go
- gitea_release.go
- gitea_source.go
- github_release.go
- github_source.go
- gitlab_release.go
- gitlab_source.go
- http_release.go
- http_source.go
- log.go
- package.go
- path.go
- release.go
- repository.go
- repository_id.go
- repository_slug.go
- source.go
- token.go
- universal_binary.go
- update.go
- updater.go
- validate.go
Directories ¶
Path | Synopsis |
---|---|
serve-repo
Simple implementation of a HTTP server to be used by the updater with the http source
|
Simple implementation of a HTTP server to be used by the updater with the http source |
Package update provides functionality to implement secure, self-updating Go programs (or other single-file targets).
|
Package update provides functionality to implement secure, self-updating Go programs (or other single-file targets). |