Sync from SUSE:SLFO:Main ignition revision ac1bf2a1fe44fac888c359a805eaf2a5

This commit is contained in:
Adrian Schröter 2024-05-03 13:41:23 +02:00
commit 53bf0ed7fa
26 changed files with 2330 additions and 0 deletions

23
.gitattributes vendored Normal file
View File

@ -0,0 +1,23 @@
## Default LFS
*.7z filter=lfs diff=lfs merge=lfs -text
*.bsp filter=lfs diff=lfs merge=lfs -text
*.bz2 filter=lfs diff=lfs merge=lfs -text
*.gem filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text
*.jar filter=lfs diff=lfs merge=lfs -text
*.lz filter=lfs diff=lfs merge=lfs -text
*.lzma filter=lfs diff=lfs merge=lfs -text
*.obscpio filter=lfs diff=lfs merge=lfs -text
*.oxt filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.rpm filter=lfs diff=lfs merge=lfs -text
*.tbz filter=lfs diff=lfs merge=lfs -text
*.tbz2 filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.txz filter=lfs diff=lfs merge=lfs -text
*.whl filter=lfs diff=lfs merge=lfs -text
*.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text

View File

@ -0,0 +1,36 @@
From: Ignaz Forster <iforster@suse.com>
Date: Thu, 9 Feb 2023 16:05:27 +0100
Upstream: Ticket opened [gh#coreos/ignition#1556]
Continue with empty config on missing QEMU device
The two QEMU provider implementations (fwcfg for platforms with
native support and blockdev for the others) have slightly different
behaviour: If fwcfg doesn't contain any configuration, it will just
skip ("QEMU firmware config was not found. Ignoring..."). The blockdev
provider would error out if it can't read the configuration.
Change the behavior of the blockdev provider to match the fwcfg one
and continue with an empty configuration if the device is not there.
diff --git a/internal/providers/qemu/qemu_blockdev.go b/internal/providers/qemu/qemu_blockdev.go
index 911eb973..11739f3e 100644
--- a/internal/providers/qemu/qemu_blockdev.go
+++ b/internal/providers/qemu/qemu_blockdev.go
@@ -22,7 +22,6 @@ package qemu
import (
"bytes"
- "fmt"
"os"
"os/exec"
"time"
@@ -83,7 +83,7 @@ func fetchConfigFromBlockDevice(logger *log.Logger) ([]byte, error) {
return nil, err
}
case <-time.After(blockDeviceTimeout):
- return nil, fmt.Errorf("timed out after %v waiting for block device %q to appear", blockDeviceTimeout, ignitionBlockDevicePath)
+ logger.Info("timed out after %v waiting for block device %q to appear. Ignoring...", blockDeviceTimeout, ignitionBlockDevicePath)
}
return bytes.TrimRight(data, "\x00"), nil

View File

@ -0,0 +1,78 @@
From: Ignaz Forster <iforster@suse.com>
Date: Wed Jan 14 17:57:52 2020 +0100
Upstream: Ticket opened [gh#coreos/ignition#890]
Implement poor man's solution for mounting a device multiple times,
e.g. to mount several subvolumes from a Btrfs device or bind mounting
the device to multiple places, by also adding the path to the key.
Index: ignition-2.16.2/config/v3_1/types/filesystem.go
===================================================================
--- ignition-2.16.2.orig/config/v3_1/types/filesystem.go
+++ ignition-2.16.2/config/v3_1/types/filesystem.go
@@ -23,6 +23,9 @@ import (
)
func (f Filesystem) Key() string {
+ if (f.Path != nil) {
+ return f.Device + *f.Path
+ }
return f.Device
}
Index: ignition-2.16.2/config/v3_2/types/filesystem.go
===================================================================
--- ignition-2.16.2.orig/config/v3_2/types/filesystem.go
+++ ignition-2.16.2/config/v3_2/types/filesystem.go
@@ -23,6 +23,9 @@ import (
)
func (f Filesystem) Key() string {
+ if (f.Path != nil) {
+ return f.Device + *f.Path
+ }
return f.Device
}
Index: ignition-2.16.2/config/v3_3/types/filesystem.go
===================================================================
--- ignition-2.16.2.orig/config/v3_3/types/filesystem.go
+++ ignition-2.16.2/config/v3_3/types/filesystem.go
@@ -23,6 +23,9 @@ import (
)
func (f Filesystem) Key() string {
+ if (f.Path != nil) {
+ return f.Device + *f.Path
+ }
return f.Device
}
Index: ignition-2.16.2/config/v3_4/types/filesystem.go
===================================================================
--- ignition-2.16.2.orig/config/v3_4/types/filesystem.go
+++ ignition-2.16.2/config/v3_4/types/filesystem.go
@@ -23,6 +23,9 @@ import (
)
func (f Filesystem) Key() string {
+ if (f.Path != nil) {
+ return f.Device + *f.Path
+ }
return f.Device
}
Index: ignition-2.16.2/config/v3_5_experimental/types/filesystem.go
===================================================================
--- ignition-2.16.2.orig/config/v3_5_experimental/types/filesystem.go
+++ ignition-2.16.2/config/v3_5_experimental/types/filesystem.go
@@ -23,6 +23,9 @@ import (
)
func (f Filesystem) Key() string {
+ if (f.Path != nil) {
+ return f.Device + *f.Path
+ }
return f.Device
}

View File

@ -0,0 +1,30 @@
From: Ignaz Forster <iforster@suse.com>
Date: Tue, 22 Aug 2023 16:13:07 +0200
Subject: [PATCH] Move GTP header to the end on resized disk images
Fedora CoreOS is handling the GPT move by putting flags into the disk's
GUID (see also [gh#coreos/ignition#839]) and then adjusting the root disk
in
https://github.com/coreos/fedora-coreos-config/blob/testing-devel/overlay.d/05core/usr/lib/dracut/modules.d/35coreos-ignition/coreos-gpt-setup.sh.
We are not using the CoreOS Assembler and have no reason to change the
UUID, so introducing a dracut service just to possibly move the GPT seems
like overkill. Just do so when creating new partitions.
---
internal/sgdisk/sgdisk.go | 1 +
1 file changed, 1 insertion(+)
diff --git a/internal/sgdisk/sgdisk.go b/internal/sgdisk/sgdisk.go
index 29915809..9be5a9e6 100644
--- a/internal/sgdisk/sgdisk.go
+++ b/internal/sgdisk/sgdisk.go
@@ -138,6 +138,7 @@ func (op Operation) buildOptions() []string {
}
for _, p := range op.parts {
+ opts = append(opts, "--move-second-header")
opts = append(opts, fmt.Sprintf("--new=%d:%s:+%s", p.Number, partitionGetStart(p), partitionGetSize(p)))
if p.Label != nil {
opts = append(opts, fmt.Sprintf("--change-name=%d:%s", p.Number, *p.Label))
--
2.41.0

View File

@ -0,0 +1,34 @@
From: Fabian Vogt <fvogt@suse.de>
Date: Thu, 17 Aug 2023 13:51:24 +0200
Subject: [PATCH] Order ignition-disks.service before systemd-fsck-root.service
firstboot-detect.service needs initrd-root-device.target but has to be before
any ignition units, so ignition units can't use
Before=initrd-root-device.target. Use systemd-fsck-root.service and
dracut-pre-mount.service instead, which fits the comment above more anyway.
---
dracut/30ignition/ignition-disks.service | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
Index: ignition-2.16.2/dracut/30ignition/ignition-disks.service
===================================================================
--- ignition-2.16.2.orig/dracut/30ignition/ignition-disks.service
+++ ignition-2.16.2/dracut/30ignition/ignition-disks.service
@@ -9,7 +9,7 @@ Before=ignition-complete.target
After=ignition-fetch.service
Before=ignition-mount.service
-# This stage runs between `basic.target` and `initrd-root-device.target`,
+# This stage runs between `basic.target` and `systemd-fsck-root.service`,
# see https://www.freedesktop.org/software/systemd/man/bootup.html
# Make sure to run before the file system checks, as sgdisk will trigger
# udev events, potentially resulting in race conditions due to disappearing
@@ -18,7 +18,7 @@ Before=ignition-mount.service
# Note that CL runs this before `local-fs-pre.target` to allow for configs that
# completely wipe the rootfs. Though we're not there yet. But we still run
# before `sysroot.mount` on principle.
-Before=initrd-root-device.target
+Before=systemd-fsck-root.service dracut-pre-mount.service
Before=sysroot.mount
OnFailure=emergency.target

View File

@ -0,0 +1,28 @@
From: Fabian Vogt <fvogt@suse.de>
Date: Mon, 21 Aug 2023 14:17:01 +0200
Subject: [PATCH] dracut: Don't include the ignition module by default
Currently the module is automatically included in all initrds, hostonly or
generic. Leave it to the distro provided module to pull it in explicitly.
---
diff --git a/dracut/30ignition/module-setup.sh b/dracut/30ignition/module-setup.sh
index ad7e80fd..f431b7dc 100755
--- a/dracut/30ignition/module-setup.sh
+++ b/dracut/30ignition/module-setup.sh
@@ -2,6 +2,13 @@
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh
+check() {
+ # Only include this if another module requests it.
+ # In our case it'll be the distro provided module with integration and customizations
+ # (coreos-ignition/ignition-microos/...).
+ return 255
+}
+
depends() {
echo qemu systemd url-lib network
}
--
2.41.0

41
README.SUSE Normal file
View File

@ -0,0 +1,41 @@
Changes for openSUSE / SLE:
* ignition-mount-initrd-fstab.service / ignition-umount-initrd-fstab.service:
Upstream Ignition will only mount partitions or subvolumes explicitly
mentioned in the Ignition configuration. A default SUSE system, however,
is split over several subvolumes, and most users won't want to define
all the partitions again. On the other hand a lot of core functionality (e.g.
configuring a SSH certificate for the root user or adding a configuration
file) requires access to those subvolumes.
For better usability in addition to Ignition's own mount / umount stage all
files systems tagged for being mounted in the initrd ("x-initrd.mount" mount
flag) will automatically be mounted / umounted.
* ignition-setup-user.service / ignition-setup-user.sh:
The user configuration can be stored on a device with the label "ignition"
(e.g. by attaching a USB flash drive with that name) instead of using the
platform specific configuration storage mechanism.
* ignition-userconfig-timeout*.conf:
Set timeout for Ignition device so boot will just continue if no physical
Ignition configuration device is attached (e.g. when using platform
specific configuration).
* ignition-rmcfg-suse.conf:
Adapt systemd service to match our own packaging: We do not support
ConditionFirstBoot, and additionally support auto-detection of the platform
(see ignition-suse-generator), so the detection whether the stage should be
called has to be done via shell script.
* ignition-touch-selinux-autorelabel.conf:
Trigger SELinux autorelabel after Ignition runs; Ignition would support
SELinux itself, however this is a compile time option, so it can't be
used here.
* ignition-suse-generator:
Replaces the upstream generator by making use of firstboot.target provided
by combustion and hooking up the services provided by this module.
Additionally it will try to autodect the platform if it is not set on the
kernel command line.
* ignition-enable-network.service / ignition-enable-network.sh:
Ignition supports detection whether the configuration requires networking
to avoid having to boot with networking enabled even when it isn't
necessary; the actual implementation to start the network is left to the
distribution.
* ignition-kargs-helper:
Distribution specific helper script to implement kernel argument support.

14
_service Normal file
View File

@ -0,0 +1,14 @@
<services>
<service name="tar_scm" mode="disabled">
<param name="version">2.17.0</param>
<param name="revision">v2.17.0</param>
<param name="url">https://github.com/coreos/ignition</param>
<param name="scm">git</param>
<param name="changesgenerate">enable</param>
</service>
<service name="recompress" mode="disabled">
<param name="compression">xz</param>
<param name="file">*.tar</param>
</service>
<service name="set_version" mode="disabled"/>
</services>

6
_servicedata Normal file
View File

@ -0,0 +1,6 @@
<servicedata>
<service name="tar_scm">
<param name="url">https://github.com/coreos/ignition</param>
<param name="changesrevision">45e9d394a3e4f240e9d6745af0a83fa36179f510</param>
</service>
</servicedata>

BIN
ignition-2.17.0.tar.xz (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,23 @@
[Unit]
Description=Start network if needed
ConditionPathExists=/etc/initrd-release
DefaultDependencies=false
After=basic.target
# Triggering conditions for cases where we need network
ConditionPathExists=|/run/ignition/neednet
# Creates /run/ignition/neednet
After=ignition-fetch-offline.service
# Needs networking
Before=ignition-fetch.service
# See hack in coreos-enable-network, as well as coreos-copy-firstboot-network.service;
# adapted for SUSE / wicked use
After=dracut-cmdline.service
Before=dracut-initqueue.service nm-initrd.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/ignition-enable-network

View File

@ -0,0 +1,18 @@
#!/bin/bash
. /lib/dracut-lib.sh
if [ -f /run/ignition/neednet ] && ! getargbool 0 'rd.neednet'; then
echo "rd.neednet=1" > /etc/cmdline.d/40-ignition-neednet.conf
# Re-trigger generation of network rules and apply them
if [ -e /lib/dracut/hooks/pre-udev/60-net-genrules.sh ]; then
# Wicked
. /lib/dracut/hooks/pre-udev/60-net-genrules.sh
udevadm control --reload
udevadm trigger --subsystem-match net --action add
else
# NetworkManager
. /lib/dracut/hooks/cmdline/99-nm-config.sh
fi
fi

79
ignition-kargs-helper Normal file
View File

@ -0,0 +1,79 @@
#!/bin/bash
# Based on Ignition's examples/ignition-kargs-helper
set -euxo pipefail
grubcfg="/sysroot/etc/default/grub"
# Mount root file system. Note that we mount /boot but we don't unmount it
# because we are run in a systemd unit with MountFlags=slave so it is unmounted
# for us.
. /dracut-state.sh
mount "${root#block:}" "${NEWROOT}"
# Also mount x-initrd.mount flagged mounts to get the current /etc state
awk '$4 ~ /x-initrd.mount/ { system("findmnt /sysroot" $2 " >/dev/null || mount -t " $3 " -o " $4 " " $1 " /sysroot" $2) }' /sysroot/etc/fstab
orig_kernelopts="$(grep GRUB_CMDLINE_LINUX_DEFAULT "${grubcfg}")"
orig_kernelopts="${orig_kernelopts#*=}"
# trim the leading and trailing quote
orig_kernelopts="${orig_kernelopts:1:-1}"
# add leading and trailing whitespace to allow for easy sed replacements
kernelopts=" $orig_kernelopts "
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
--should-exist)
arg="$2"
# don't repeat the arg
if [[ ! "${kernelopts[*]}" =~ " ${arg} " ]]; then
kernelopts="$kernelopts$arg "
fi
shift 2
;;
--should-not-exist)
kernelopts="$(echo "$kernelopts" | sed "s| $2 | |g")"
shift 2
;;
*)
echo "Unknown option"
exit 1
;;
esac
done
# trim the leading and trailing whitespace
kernelopts="$(echo "$kernelopts" | sed -e 's,^[[:space:]]*,,' -e 's,[[:space:]]*$,,')"
# only apply the changes & reboot if changes have been made
if [[ "$kernelopts" != "$orig_kernelopts" ]]; then
combustiondir="/run/combustion/mount/combustion"
# The Combustion script may be located on an external device; if so the
# device is guaranteed to mounted here already:
# combustion-prepare: Before=dracutinitqueue.service
# ignition-fetch: After=basic.target
# Unmount the device, as the new Combustion script will be put at the
# same location below.
if findmnt "${combustiondir}"/.. >/dev/null; then
umount "${combustiondir}"/..
fi
mkdir -p "${combustiondir}"
# escape escapes to survive the multiple shell invocations
kernelopts="${kernelopts//\\/\\\\\\\\}"
kernelopts="${kernelopts//$/\\\$}"
cat << EOF > "${combustiondir}/script"
sed -i "s|^\(GRUB_CMDLINE_LINUX_DEFAULT=\).*|\1\"$kernelopts\"|" /etc/default/grub
/usr/sbin/grub2-mkconfig > /boot/grub2/grub.cfg
EOF
SYSTEMD_OFFLINE=1 combustion
# Reset health-checker to prevent an unintended rollback
echo "Clearing GRUB flag"
chroot /sysroot grub2-editenv - set health_checker_flag=0 || true
systemctl reboot --force
fi

View File

@ -0,0 +1,20 @@
[Unit]
Description=Mount initrd fstab entries for Ignition
DefaultDependencies=false
Before=ignition-complete.target
# Make sure ExecStop= runs before we switch root
Before=initrd-switch-root.target
After=initrd-root-fs.target
After=ignition-remount-sysroot.service
# Run only after Ignition's mount stage - mount points configured by Ignition
# itself will be skipped below, just mount the rest.
Requires=ignition-mount.service
After=ignition-mount.service
Before=ignition-files.service
[Service]
Type=oneshot
ExecStart=/bin/sh -e -c 'eval $(awk '"'"'$4 ~ /x-initrd.mount/ && $1 !~ /^#/ {print "if ! findmnt /sysroot" $2 " >/dev/null; then mount -t " $3 " -o " $4 " " $1 " /sysroot" $2 "; fi;" }'"'"' /sysroot/etc/fstab)'

View File

@ -0,0 +1,21 @@
[Unit]
Description=Disable firstboot wizard if ignition ran
# Make sure ignition completed
After=ignition-complete.target
# Don't race with combustion
After=combustion.service
# Make sure /sysroot/etc and var are available
After=initrd-parse-etc.service
RequiresMountsFor=/sysroot/etc
RequiresMountsFor=/sysroot/var
ConditionPathExists=/sysroot/etc/.ignition-result.json
ConditionPathExists=/sysroot/var/lib/YaST2/reconfig_system
[Service]
Type=oneshot
RemainAfterExit=yes
# Use grep to avoid pulling in jq
ExecStart=/bin/sh -ec 'if grep -q "\\"userConfigProvided\\":.*true" /sysroot/etc/.ignition-result.json; then rm /sysroot/var/lib/YaST2/reconfig_system; fi'

9
ignition-rmcfg-suse.conf Normal file
View File

@ -0,0 +1,9 @@
[Unit]
ConditionFirstBoot=
ConditionKernelCommandLine=
ConditionKernelCommandLine=|ignition.firstboot
[Service]
ExecStart=
ExecStart=/bin/bash -c 'if [ "${PLATFORM_ID}" = virtualbox -o "${PLATFORM_ID}" = vmware ]; then /usr/sbin/ignition-rmcfg --platform=${PLATFORM_ID}; fi'

View File

@ -0,0 +1,21 @@
[Unit]
Description=Ignition User Config Setup
Documentation=https://build.opensuse.org/package/view_file/devel:kubic:ignition/ignition/README.SUSE?expand=1
ConditionPathExists=/etc/initrd-release
DefaultDependencies=false
# We run before config fetch because we may copy in new/different configs
# for Ignition to consume.
Before=ignition-fetch-offline.service
OnFailure=emergency.target
OnFailureJobMode=isolate
Wants=dev-disk-by\x2dlabel-ignition.device
After=dev-disk-by\x2dlabel-ignition.device
[Service]
Type=oneshot
RemainAfterExit=yes
MountFlags=slave
ExecStart=/usr/sbin/ignition-setup-user

32
ignition-setup-user.sh Normal file
View File

@ -0,0 +1,32 @@
#!/bin/bash
set -euo pipefail
copy_file_if_exists() {
src="${1}"; dst="${2}"
if [ -f "${src}" ]; then
echo "Copying ${src} to ${dst}"
cp "${src}" "${dst}"
else
echo "File ${src} does not exist.. Skipping copy"
fi
}
destination=/usr/lib/ignition
mkdir -p $destination
if command -v is-live-image >/dev/null && is-live-image; then
# Live image. If the user has supplied a config.ign via an appended
# initrd, put it in the right place.
copy_file_if_exists "/config.ign" "${destination}/user.ign"
else
# We will support a user embedded config in the boot partition
# under $bootmnt/ignition/config.ign. Note that we mount /boot
# but we don't unmount boot because we are run in a systemd unit
# with MountFlags=slave so it is unmounted for us.
bootmnt=/mnt/boot_partition
mkdir -p $bootmnt
if [ -e /dev/disk/by-label/ignition ]; then
mount /dev/disk/by-label/ignition $bootmnt
fi
copy_file_if_exists "${bootmnt}/ignition/config.ign" "${destination}/user.ign"
fi

53
ignition-suse-generator Normal file
View File

@ -0,0 +1,53 @@
#!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh
set -e
# Generators don't have logging right now
# https://github.com/systemd/systemd/issues/15638
exec 1>/dev/kmsg; exec 2>&1
UNIT_DIR="${1:-/tmp}"
cmdline=( $(</proc/cmdline) )
cmdline_arg() {
local name="$1" value="$2"
for arg in "${cmdline[@]}"; do
if [[ "${arg%%=*}" == "${name}" ]]; then
value="${arg#*=}"
fi
done
echo "${value}"
}
add_requires() {
local name="$1"; shift
local target="$1"; shift
local requires_dir="${UNIT_DIR}/${target}.requires"
mkdir -p "${requires_dir}"
ln -sf "../${name}" "${requires_dir}/${name}"
}
add_requires ignition-complete.target firstboot.target
add_requires ignition-diskful.target ignition-complete.target
# TODO: Add support for ignition-subsequent.target, when needed?
echo "PLATFORM_ID=$(cmdline_arg ignition.platform.id)" > /run/ignition.env
. /run/ignition.env
add_requires ignition-mount-initrd-fstab.service ignition-files.service
add_requires ignition-umount-initrd-fstab.service ignition-files.service
add_requires ignition-enable-network.service ignition-fetch.service
if [ -z "${PLATFORM_ID}" ]; then
platform="$(systemd-detect-virt || true)"
case "${platform}" in
*vmware*) platform="vmware" ;;
*oracle*) platform="virtualbox" ;;
*kvm*|*qemu*) platform="qemu" ;;
*) platform="metal" ;;
esac
echo "PLATFORM_ID=${platform}" > /run/ignition.env
fi

View File

@ -0,0 +1,2 @@
[Service]
ExecStart=/bin/sh -c 'if [ -e /sysroot/etc/selinux/.relabelled ]; then >> /sysroot/etc/selinux/.autorelabel; fi'

View File

@ -0,0 +1,12 @@
[Unit]
Description=Unmount initrd fstab entries for Ignition
DefaultDependencies=false
Before=ignition-complete.target
After=ignition-files.service
# Make sure not to unmount the real sysroot-*.mount units
Before=initrd-parse-etc.service
[Service]
Type=oneshot
ExecStart=/bin/sh -e -c 'if [ -f /sysroot/etc/systemd/system-preset/20-ignition.preset ]; then while read line; do systemctl --root=/sysroot $line; done < /sysroot/etc/systemd/system-preset/20-ignition.preset; fi'
ExecStart=/bin/sh -e -c 'eval $(awk '"'"'$4 ~ /x-initrd.mount/ && $1 !~ /^#/ {print "if findmnt /sysroot" $2 " >/dev/null; then umount -R /sysroot" $2 "; fi;" }'"'"' /sysroot/etc/fstab)'

View File

@ -0,0 +1,2 @@
[Unit]
JobTimeoutSec=20

View File

@ -0,0 +1,2 @@
[Unit]
JobTimeoutSec=10

1551
ignition.changes Normal file

File diff suppressed because it is too large Load Diff

140
ignition.spec Normal file
View File

@ -0,0 +1,140 @@
#
# spec file for package ignition
#
# Copyright (c) 2023 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
Name: ignition
Version: 2.17.0
Release: 0
Summary: First boot installer and configuration tool
License: Apache-2.0
Group: System/Management
URL: https://github.com/coreos/ignition
Source: %{name}-%{version}.tar.xz
Source1: ignition-mount-initrd-fstab.service
Source2: ignition-umount-initrd-fstab.service
Source3: ignition-suse-generator
Source4: module-setup.sh
Source7: README.SUSE
Source8: ignition-setup-user.sh
Source9: ignition-setup-user.service
Source10: ignition-enable-network.service
Source11: ignition-enable-network.sh
Source12: ignition-kargs-helper
Source13: ignition-remove-reconfig_system.service
Source14: ignition-touch-selinux-autorelabel.conf
Source15: ignition-rmcfg-suse.conf
Source20: ignition-userconfig-timeout.conf
Source21: ignition-userconfig-timeout-arm.conf
Patch1: 0001-ignore-missing-qemu-blockdev.patch
Patch2: 0002-allow-multiple-mounts-of-same-device.patch
Patch3: 0003-Move-the-GPT-header-on-resized-disks.patch
Patch4: 0004-Order-ignition-disks.service-before-systemd-fsck-roo.patch
# https://github.com/coreos/ignition/pull/1698
Patch5: 0005-dracut-Don-t-include-the-ignition-module-by-default.patch
BuildRequires: dracut
BuildRequires: libblkid-devel
BuildRequires: systemd-rpm-macros
BuildRequires: update-bootloader-rpm-macros
BuildRequires: golang(API) >= 1.19
# combustion provides firstboot.target and ignition-kargs-helper calls combustion
Requires: combustion >= 1.2
Requires: dracut
Recommends: %{_sbindir}/groupadd
Recommends: %{_sbindir}/sgdisk
Recommends: %{_sbindir}/useradd
Recommends: %{_sbindir}/usermod
Recommends: /sbin/mkfs.btrfs
Recommends: /sbin/mkfs.ext4
Recommends: /sbin/mkfs.vfat
Recommends: /sbin/mkfs.xfs
Recommends: /sbin/mkswap
Recommends: /sbin/udevadm
Suggests: /sbin/mdadm
Provides: ignition-dracut = 0.0+git20200722.98ed51d
Obsoletes: ignition-dracut < 0.0+git20200722.98ed51d
# Not provided because the mechanism is different
Obsoletes: ignition-dracut-grub2 < %{version}-%{release}
%{update_bootloader_requires}
%description
Ignition is an utility to manipulate disks and configuration files
during the initramfs. This includes partitioning disks, formatting
partitions, writing files (regular files, systemd units, etc.), and
creating users.
On first boot, Ignition reads its configuration from a source of truth
(remote URL, network metadata service, hypervisor bridge, etc.) and
applies the configuration.
%prep
%autosetup -p1
mkdir -p dracut/30ignition-microos grub systemd_suse/ignition-delete-config.service.d
chmod +x %{SOURCE3} %{SOURCE4} %{SOURCE8} %{SOURCE12}
cp %{SOURCE1} %{SOURCE2} %{SOURCE3} %{SOURCE4} %{SOURCE8} %{SOURCE9} %{SOURCE10} %{SOURCE11} %{SOURCE13} %{SOURCE14} dracut/30ignition-microos/
%ifarch aarch64 %{arm}
cp %{SOURCE21} dracut/30ignition-microos/ignition-userconfig-timeout.conf
%else
cp %{SOURCE20} dracut/30ignition-microos/ignition-userconfig-timeout.conf
%endif
cp %{SOURCE15} systemd_suse/ignition-delete-config.service.d/
cp %{SOURCE7} .
cp %{SOURCE12} dracut/30ignition/ignition-kargs-helper.sh
%build
sed -i -e 's|go build -ldflags|go build -buildmode=pie -ldflags|g' build
env VERSION=%{version} GLDFLAGS='-X github.com/coreos/ignition/v2/internal/distro.selinuxRelabel=false -X github.com/coreos/ignition/v2/internal/distro.writeAuthorizedKeysFragment=false ' bash -x ./build
%install
make -o all install DESTDIR=%{buildroot}
install -d %{buildroot}%{_sysconfdir}/grub.d
install -d %{buildroot}%{_unitdir}/ignition-delete-config.service.d
install -p -m 0644 systemd_suse/ignition-delete-config.service.d/* %{buildroot}%{_prefix}/lib/systemd/system/ignition-delete-config.service.d
install -d %{buildroot}%{_sbindir}/
mv %{buildroot}/usr/libexec/* %{buildroot}/%{_sbindir}/
rmdir %{buildroot}/usr/libexec
%pre
%service_add_pre ignition-delete-config.service
%post
%{?regenerate_initrd_post}
%service_add_post ignition-delete-config.service
%preun
%service_del_preun ignition-delete-config.service
%postun
%service_del_postun_without_restart ignition-delete-config.service
%posttrans
%{?regenerate_initrd_posttrans}
%files
%license LICENSE
%doc README.md README.SUSE docs/*.md
# Paths are hardcoded in the Makefile
/usr/lib/dracut/modules.d/30ignition
/usr/lib/dracut/modules.d/30ignition-microos
/usr/bin/ignition-validate
/usr/lib/systemd/system/ignition-delete-config.service
%{_sbindir}/ignition-apply
%{_sbindir}/ignition-rmcfg
%dir %{_unitdir}/ignition-delete-config.service.d
%{_unitdir}/ignition-delete-config.service.d/ignition-rmcfg-suse.conf
%changelog

52
module-setup.sh Normal file
View File

@ -0,0 +1,52 @@
#!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh
check() {
# Omit if building for this already configured system
if [[ $hostonly ]] && [ -e /etc/machine-id ]; then
return 255
fi
return 0
}
depends() {
echo combustion crypt dm firstboot ignition
}
install_ignition_unit() {
local unit="$1"; shift
local target="${1:-ignition-complete.target}"; shift
local instantiated="${1:-$unit}"; shift
inst_simple "$moddir/$unit" "$systemdsystemunitdir/$unit"
# note we `|| exit 1` here so we error out if e.g. the units are missing
# see https://github.com/coreos/fedora-coreos-config/issues/799
systemctl -q --root="$initdir" add-requires "$target" "$instantiated" || exit 1
}
install() {
inst_simple "$moddir/ignition-enable-network.service" \
"$systemdsystemunitdir/ignition-enable-network.service"
inst_simple "$moddir/ignition-mount-initrd-fstab.service" \
"$systemdsystemunitdir/ignition-mount-initrd-fstab.service"
inst_simple "$moddir/ignition-umount-initrd-fstab.service" \
"$systemdsystemunitdir/ignition-umount-initrd-fstab.service"
inst_simple "$moddir/ignition-userconfig-timeout.conf" \
"$systemdsystemunitdir/dev-disk-by\x2dlabel-ignition.device.d/ignition-userconfig-timeout.conf"
inst_simple "$moddir/ignition-touch-selinux-autorelabel.conf" \
"$systemdsystemunitdir/ignition-files.service.d/ignition-touch-selinux-autorelabel.conf"
inst_simple "$moddir/ignition-suse-generator" \
"/etc/systemd/system-generators/ignition-generator"
inst_script "$moddir/ignition-enable-network.sh" \
"/usr/sbin/ignition-enable-network"
inst_script "$moddir/ignition-setup-user.sh" \
"/usr/sbin/ignition-setup-user"
inst_multiple awk systemd-detect-virt cryptsetup
install_ignition_unit ignition-remove-reconfig_system.service initrd.target
install_ignition_unit ignition-setup-user.service
}
installkernel() {
# Make sure we can read configuration from ISO image and vfat formated USB drives
hostonly='' instmods iso9660 vfat =fs/nls
}