mirror of
https://github.com/kairos-io/kairos-agent.git
synced 2025-04-28 03:32:27 +00:00
224 lines
8.1 KiB
Go
224 lines
8.1 KiB
Go
/*
|
|
Copyright © 2022 SUSE LLC
|
|
|
|
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 constants
|
|
|
|
import (
|
|
"errors"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/gofrs/uuid"
|
|
)
|
|
|
|
const (
|
|
GrubConf = "/etc/cos/grub.cfg"
|
|
GrubOEMEnv = "grub_oem_env"
|
|
GrubDefEntry = "Kairos"
|
|
DefaultTty = "tty1"
|
|
BiosPartName = "bios"
|
|
EfiLabel = "COS_GRUB"
|
|
EfiPartName = "efi"
|
|
ActiveLabel = "COS_ACTIVE"
|
|
PassiveLabel = "COS_PASSIVE"
|
|
SystemLabel = "COS_SYSTEM"
|
|
RecoveryLabel = "COS_RECOVERY"
|
|
RecoveryPartName = "recovery"
|
|
StateLabel = "COS_STATE"
|
|
StatePartName = "state"
|
|
InstallStateFile = "state.yaml"
|
|
PersistentLabel = "COS_PERSISTENT"
|
|
PersistentPartName = "persistent"
|
|
OEMLabel = "COS_OEM"
|
|
OEMPartName = "oem"
|
|
MountBinary = "/usr/bin/mount"
|
|
EfiDevice = "/sys/firmware/efi"
|
|
LinuxFs = "ext4"
|
|
LinuxImgFs = "ext2"
|
|
SquashFs = "squashfs"
|
|
EfiFs = "vfat"
|
|
EfiSize = uint(64)
|
|
OEMSize = uint(64)
|
|
PersistentSize = uint(0)
|
|
BiosSize = uint(1)
|
|
ImgSize = uint(3072)
|
|
HTTPTimeout = 60
|
|
LiveDir = "/run/initramfs/live"
|
|
RecoveryDir = "/run/cos/recovery"
|
|
StateDir = "/run/cos/state"
|
|
OEMDir = "/run/cos/oem"
|
|
PersistentDir = "/run/cos/persistent"
|
|
ActiveDir = "/run/cos/active"
|
|
TransitionDir = "/run/cos/transition"
|
|
EfiDir = "/run/cos/efi"
|
|
RecoverySquashFile = "recovery.squashfs"
|
|
IsoRootFile = "rootfs.squashfs"
|
|
ActiveImgFile = "active.img"
|
|
PassiveImgFile = "passive.img"
|
|
RecoveryImgFile = "recovery.img"
|
|
IsoBaseTree = "/run/rootfsbase"
|
|
AfterInstallChrootHook = "after-install-chroot"
|
|
AfterInstallHook = "after-install"
|
|
BeforeInstallHook = "before-install"
|
|
AfterResetChrootHook = "after-reset-chroot"
|
|
AfterResetHook = "after-reset"
|
|
BeforeResetHook = "before-reset"
|
|
AfterUpgradeChrootHook = "after-upgrade-chroot"
|
|
AfterUpgradeHook = "after-upgrade"
|
|
BeforeUpgradeHook = "before-upgrade"
|
|
TransitionImgFile = "transition.img"
|
|
RunningStateDir = "/run/initramfs/cos-state" // TODO: converge this constant with StateDir/RecoveryDir in dracut module from cos-toolkit
|
|
RunningRecoveryStateDir = "/run/initramfs/isoscan" // TODO: converge this constant with StateDir/RecoveryDir in dracut module from cos-toolkit
|
|
FailInstallationFileSentinel = "/run/cos/fail_installation"
|
|
ActiveImgName = "active"
|
|
PassiveImgName = "passive"
|
|
RecoveryImgName = "recovery"
|
|
StateResetImgName = "statereset"
|
|
GPT = "gpt"
|
|
UsrLocalPath = "/usr/local"
|
|
OEMPath = "/oem"
|
|
BootEntryRecovery = "recovery"
|
|
|
|
// SELinux targeted policy paths
|
|
SELinuxTargetedPath = "/etc/selinux/targeted"
|
|
SELinuxTargetedContextFile = SELinuxTargetedPath + "/contexts/files/file_contexts"
|
|
SELinuxTargetedPolicyPath = SELinuxTargetedPath + "/policy"
|
|
|
|
// Default directory and file fileModes
|
|
DirPerm = os.ModeDir | os.ModePerm
|
|
FilePerm = 0666
|
|
ConfigPerm = 0640 // Used for config files that contain secrets or other sensitive data
|
|
NoWriteDirPerm = 0555 | os.ModeDir
|
|
TempDirPerm = os.ModePerm | os.ModeSticky | os.ModeDir
|
|
|
|
// Eject script
|
|
EjectScript = "#!/bin/sh\n/usr/bin/eject -rmF"
|
|
|
|
ArchAmd64 = "amd64"
|
|
Archx86 = "x86_64"
|
|
ArchArm64 = "arm64"
|
|
SignedShim = "shim.efi"
|
|
SignedGrub = "grub.efi"
|
|
Rsync = "rsync"
|
|
|
|
UkiSource = "/run/install/uki"
|
|
UkiCdromSource = "/run/initramfs/live"
|
|
UkiEfiDir = "/efi"
|
|
UkiEfiDiskByLabel = `/dev/disk/by-label/` + EfiLabel
|
|
UkiMaxEntries = 3
|
|
|
|
// Boot labeling
|
|
PassiveBootSuffix = " (fallback)"
|
|
RecoveryBootSuffix = " recovery"
|
|
StateResetBootSuffix = " state reset (auto)"
|
|
|
|
// Error
|
|
UpgradeNoSourceError = "Could not find a proper source for the upgrade.\nThis can be configured in the cloud config files under the 'upgrade.system.uri' key or via cmdline using the '--source' flag."
|
|
MultipleEntriesAssessmentError = "multiple boot entries found for %s"
|
|
NoBootAssessmentWarning = "No boot assessment found in current boot entry config file"
|
|
)
|
|
|
|
func UkiDefaultMenuEntries() []string {
|
|
return []string{"cos", "fallback", "recovery", "statereset"}
|
|
}
|
|
|
|
func UkiDefaultSkipEntries() []string {
|
|
return []string{"interactive-install", "install-mode-interactive"}
|
|
}
|
|
|
|
func GetCloudInitPaths() []string {
|
|
return []string{"/system/oem", "/oem/", "/usr/local/cloud-config/"}
|
|
}
|
|
|
|
// GetDefaultSquashfsOptions returns the default options to use when creating a squashfs
|
|
func GetDefaultSquashfsOptions() []string {
|
|
return []string{"-b", "1024k"}
|
|
}
|
|
|
|
func GetDefaultSquashfsCompressionOptions() []string {
|
|
return []string{"-comp", "gzip"}
|
|
}
|
|
|
|
func GetFallBackEfi(arch string) string {
|
|
switch arch {
|
|
case ArchArm64:
|
|
return "bootaa64.efi"
|
|
default:
|
|
return "bootx64.efi"
|
|
}
|
|
}
|
|
|
|
// GetGrubFonts returns the default font files for grub
|
|
func GetGrubFonts() []string {
|
|
return []string{"ascii.pf2", "euro.pf2", "unicode.pf2"}
|
|
}
|
|
|
|
// GetGrubModules returns the default module files for grub
|
|
func GetGrubModules() []string {
|
|
return []string{"loopback.mod", "squash4.mod", "xzio.mod", "gzio.mod", "regexp.mod"}
|
|
}
|
|
|
|
// GetYipConfigDirs returns all the directories where "yip" configuration might
|
|
// live. These include the directories were we store our system overlay files:
|
|
// https://github.com/kairos-io/packages/tree/main/packages/static/kairos-overlay-files/files/system/oem
|
|
func GetYipConfigDirs() []string {
|
|
return append(GetUserConfigDirs(), "/system/oem")
|
|
}
|
|
|
|
// GetUserConfigDirs returns all the directories that might have configuration
|
|
// supplied by the user. They are in an order which allows the users to override
|
|
// baked-in configuration (e.g. in livecd, under /run/initramfs/live) with
|
|
// configuration coming from datasource (e.g. a datasource cdrom, written under /oem).
|
|
// That's why writable paths are last.
|
|
func GetUserConfigDirs() []string {
|
|
return []string{
|
|
"/run/initramfs/live",
|
|
"/etc/kairos", // Default system configuration file https://github.com/kairos-io/kairos/issues/2221
|
|
"/etc/elemental", // for backwards compatibility
|
|
"/usr/local/cloud-config",
|
|
"/oem",
|
|
}
|
|
}
|
|
|
|
func BaseBootTitle(title string) string {
|
|
if strings.HasSuffix(title, RecoveryBootSuffix) {
|
|
return strings.TrimSuffix(title, RecoveryBootSuffix)
|
|
} else if strings.HasSuffix(title, PassiveBootSuffix) {
|
|
return strings.TrimSuffix(title, PassiveBootSuffix)
|
|
} else if strings.HasSuffix(title, StateResetBootSuffix) {
|
|
return strings.TrimSuffix(title, StateResetBootSuffix)
|
|
}
|
|
return title
|
|
}
|
|
|
|
func BootTitleForRole(role, title string) (string, error) {
|
|
switch role {
|
|
case ActiveImgName:
|
|
return BaseBootTitle(title), nil
|
|
case PassiveImgName:
|
|
return BaseBootTitle(title) + PassiveBootSuffix, nil
|
|
case RecoveryImgName:
|
|
return BaseBootTitle(title) + RecoveryBootSuffix, nil
|
|
case StateResetImgName:
|
|
return BaseBootTitle(title) + StateResetBootSuffix, nil
|
|
default:
|
|
return "", errors.New("invalid role")
|
|
}
|
|
}
|
|
|
|
// DiskUUID is the static UUID for main disk identification
|
|
var DiskUUID = uuid.NewV5(uuid.NamespaceURL, "KAIROS_DISK").String()
|