artifacts.go (100 lines of code) (raw):
package dalec
import (
"io/fs"
"maps"
"path/filepath"
)
// Artifacts describes all the artifacts to include in the package.
// Artifacts are broken down into types, e.g. binaries, manpages, etc.
// This differentiation is used to determine where to place the artifact on install.
type Artifacts struct {
// Binaries is the list of binaries to include in the package.
Binaries map[string]ArtifactConfig `yaml:"binaries,omitempty" json:"binaries,omitempty"`
// Libexec is the list of additional binaries that may be invoked by the main package binary.
Libexec map[string]ArtifactConfig `yaml:"libexec,omitempty" json:"libexec,omitempty"`
// Manpages is the list of manpages to include in the package.
Manpages map[string]ArtifactConfig `yaml:"manpages,omitempty" json:"manpages,omitempty"`
// DataDirs is a list of read-only architecture-independent data files, to be placed in /usr/share/
DataDirs map[string]ArtifactConfig `yaml:"data_dirs,omitempty" json:"data_dirs,omitempty"`
// Directories is a list of various directories that should be created by the package.
Directories *CreateArtifactDirectories `yaml:"createDirectories,omitempty" json:"createDirectories,omitempty"`
// ConfigFiles is a list of files that should be marked as config files in the package.
ConfigFiles map[string]ArtifactConfig `yaml:"configFiles,omitempty" json:"configFiles,omitempty"`
// Docs is a list of doc files included in the package
Docs map[string]ArtifactConfig `yaml:"docs,omitempty" json:"docs,omitempty"`
// Licenses is a list of doc files included in the package
Licenses map[string]ArtifactConfig `yaml:"licenses,omitempty" json:"licenses,omitempty"`
// Systemd is the list of systemd units and dropin files for the package
Systemd *SystemdConfiguration `yaml:"systemd,omitempty" json:"systemd,omitempty"`
// Libs is the list of library files to be installed.
// On linux this would typically be installed to /usr/lib/<package name>
Libs map[string]ArtifactConfig `yaml:"libs,omitempty" json:"libs,omitempty"`
// Links is the list of symlinks to be installed with the package
// Links should only be used if the *package* should contain the link.
// For making a container compatible with another image, use [PostInstall] in
// the [ImageConfig].
Links []ArtifactSymlinkConfig `yaml:"links,omitempty" json:"links,omitempty"`
// Headers is a list of header files and/or folders to be installed.
// On linux this would typically be installed to /usr/include/.
Headers map[string]ArtifactConfig `yaml:"headers,omitempty" json:"headers,omitempty"`
// Users is a list of users to add to the system when the package is installed.
Users []AddUserConfig `yaml:"users,omitempty" json:"users,omitempty"`
// Groups is a list of groups to add to the system when the package is installed.
Groups []AddGroupConfig `yaml:"groups,omitempty" json:"groups,omitempty"`
// DisableStrip is used to disable stripping of artifacts.
DisableStrip bool `yaml:"disable_strip,omitempty" json:"disable_strip,omitempty"`
}
type ArtifactSymlinkConfig struct {
// Source is the path that is being linked to
// Example:
// If you want a symlink in /usr/bin/foo that is linking to /usr/bin/foo/foo
// then the `Source` is `/usr/bin/foo/foo`
Source string `yaml:"source,omitempty" json:"source,omitempty"`
// Dest is the path where the symlink will be installed
Dest string `yaml:"dest,omitempty" json:"dest,omitempty"`
}
// CreateArtifactDirectories describes various directories that should be created on install.
// CreateArtifactDirectories represents different directory paths that are common to RPM systems.
type CreateArtifactDirectories struct {
// Config is a list of directories the RPM should place under the system config directory (i.e. /etc)
Config map[string]ArtifactDirConfig `yaml:"config,omitempty" json:"config,omitempty"`
// State is a list of directories the RPM should place under the common directory for shared state and libs (i.e. /var/lib).
State map[string]ArtifactDirConfig `yaml:"state,omitempty" json:"state,omitempty"`
}
func (d *CreateArtifactDirectories) GetConfig() map[string]ArtifactDirConfig {
if d == nil {
return nil
}
return maps.Clone(d.Config)
}
func (d *CreateArtifactDirectories) GetState() map[string]ArtifactDirConfig {
if d == nil {
return nil
}
return maps.Clone(d.State)
}
// ArtifactDirConfig contains information about the directory to be created
type ArtifactDirConfig struct {
// Mode is used to set the file permission bits of the final created directory to the specified mode.
// Mode is the octal permissions to set on the dir.
Mode fs.FileMode `yaml:"mode,omitempty" json:"mode,omitempty"`
}
// ArtifactConfig is the configuration for a given artifact type.
// This is used to customize where an artifact will be placed when installed.
type ArtifactConfig struct {
// Subpath is the subpath to use in the package for the artifact type.
//
// As an example, binaries are typically placed in /usr/bin when installed.
// If you want to nest them in a subdirectory, you can specify it here.
SubPath string `yaml:"subpath,omitempty" json:"subpath,omitempty"`
// Name is file or dir name to use for the artifact in the package.
// If empty, the file or dir name from the produced artifact will be used.
Name string `yaml:"name,omitempty" json:"name,omitempty"`
// Permissions is the file permissions to set on the artifact.
// If not set, the default value will depend on the kind of artifact or the underlying artifact's already set permissions.
Permissions fs.FileMode `yaml:"permissions,omitempty" json:"permissions,omitempty"`
}
func (a *ArtifactConfig) ResolveName(path string) string {
if a.Name != "" {
return a.Name
}
return filepath.Base(path)
}
// AddUserConfig is the configuration for adding a user to the system.
type AddUserConfig struct {
// Name is the name of the user to add to the system.
Name string `yaml:"name" json:"name"`
}
// AddGroupConfig is the configuration for adding a group to the system.
type AddGroupConfig struct {
// Name is the name of the group to add to the system.
Name string `yaml:"name" json:"name"`
}
// IsEmpty is used to determine if there are any artifacts to include in the package.
func (a *Artifacts) IsEmpty() bool {
if len(a.Binaries) > 0 {
return false
}
if len(a.Manpages) > 0 {
return false
}
if a.Directories != nil && (len(a.Directories.Config) > 0 || len(a.Directories.State) > 0) {
return false
}
if len(a.DataDirs) > 0 {
return false
}
if len(a.ConfigFiles) > 0 {
return false
}
if a.Systemd != nil &&
(len(a.Systemd.Units) > 0 || len(a.Systemd.Dropins) > 0) {
return false
}
if len(a.Docs) > 0 {
return false
}
if len(a.Licenses) > 0 {
return false
}
if len(a.Libs) > 0 {
return false
}
if len(a.Links) > 0 {
return false
}
if len(a.Headers) > 0 {
return false
}
return true
}