Commit graph

857 commits

Author SHA1 Message Date
Achilleas Koutsou
e31084e520 stages/tar: add --numeric-owner option
The numeric-owner option omits the inclusion of user and group names in
the archive metadata.  This is often desirable since name and group
mappings can change the ownership of files during extraction.

The test uses the tarfile module to check that the uname and gname
attributes in the tar archive itself are empty, which is the intended
effect of enabling numeric-owner [1].

RHEL-102854

[1] https://www.gnu.org/software/tar//manual/html_section/Attributes.html
2025-08-12 19:44:14 +02:00
Brian C. Lane
e3236a8b34 org.osbuild.grub2.iso.legacy: Add support for default menu selection
Currently the grub2 menu defaults to the first entry. This adds support
for setting the default to a later entry. The default in the official
boot.iso is entry 1 -- booting with the iso checksum check.

This includes a test for the new behavior.
2025-07-29 10:09:14 -07:00
Brian C. Lane
f49621ce44 org.osbuild.grub2.iso: Add support for default menu selection
Currently the grub2 menu defaults to the first entry. This adds support
for setting the default to a later entry. The default in the official
boot.iso is entry 1 -- booting with the iso checksum check.

This includes a test for the new behavior.
2025-07-29 10:09:14 -07:00
jbtrystram
f4698da5bb stages/ignition: parametrize the path to boot
Allow passing a mount to specify where to write the igntion.firstboot
file.
This keeps the default `tree:///` value to not break existing stages.
2025-07-28 21:14:02 +02:00
Brian C. Lane
de22369919 org.osbuild.isolinux: Add support for optional fips menu
On RHEL 9.7+ and on RHEL 10.1+ we need to be able to include a menu that
boots the installer environment with fips=1 on the cmdline. This adds an
optional menu entry controlled by the "fips" boolean.

This also includes a new test for the menus with and without fips
included.

Related: RHEL-104075
2025-07-25 22:52:19 +02:00
Brian C. Lane
d085681911 org.osbuild.grub2.iso.legacy: Add support for optional fips menu
On RHEL 9.7+ and on RHEL 10.1+ we need to be able to include a menu that
boots the installer environment with fips=1 on the cmdline. This adds an
optional menu entry controlled by the "fips" boolean.

This also includes a test for the new behavior.

Related: RHEL-104075
2025-07-25 22:52:19 +02:00
Brian C. Lane
9a563f8306 org.osbuild.grub2.iso: Add support for optional fips menu
On RHEL 9.7+ and on RHEL 10.1+ we need to be able to include a menu that
boots the installer environment with fips=1 on the cmdline. This adds an
optional menu entry controlled by the "fips" boolean.

This also includes a new test for the menus with and without fips
included.

Related: RHEL-104075
2025-07-25 22:52:19 +02:00
Bipin B Narayan
7593b65dc7 live-artifacts: read os name from /usr/lib/os-release
With importing ociarchive, the treefile.json doesn't contain osname.
2025-07-16 14:43:18 +02:00
Simon de Vlieger
fd6801e380 stages/vagrant: allow configuring synced folders
When guest additions are not installed in VirtualBox Vagrant boxes then
the default shared `/vagrant` directory must be set to `rsync`,
otherwise Vagrant fails to start as the shared directory cannot be
mounted with the `vboxfs` filesystem.

Let's expand the schema to allow for `synced-folders` (currently only
accepted under the `virtualbox` variant of the schema) to allow setting
the bare subset of relevant options to configure this from `images`.

Signed-off-by: Simon de Vlieger <supakeen@redhat.com>
2025-07-11 17:13:49 +02:00
Achilleas Koutsou
a4061f831e stages/dnf4.versionlock: respect SOURCE_DATE_EPOCH
Respect the SOURCE_DATE_EPOCH environment variable for reproducible
builds.

https://reproducible-builds.org/docs/source-date-epoch/
2025-07-07 17:19:25 +02:00
Achilleas Koutsou
ece618d0d0 stages/test: add unit tests for the dnf4.versionlock stage 2025-07-07 17:19:25 +02:00
Achilleas Koutsou
06344b6827 stages: add a new dnf4.versionlock stage
New stage that writes a versionlock.list to lock packages in the format
used by the dnf4 versionlock plugin.
2025-07-07 17:19:25 +02:00
Leonardo Rossetti
4af53e4c6e add ssh_pwauth to org.osbuild.cloud-init
Signed-off-by: Leonardo Rossetti <lrossett@redhat.com>
2025-07-04 21:52:00 +02:00
Jelle van der Waa
f7ef1d6464 stages/vagrant: add virtualbox support
This adds support generating a virtualbox vagrant image. It differs from
libvirt by requiring an xml file and a vmdk image.

When the provider is set to libvirt it is required to pass a
`virtualbox` configuration section to this stage which must include the
mac address.

Signed-off-by: Simon de Vlieger <supakeen@redhat.com>
2025-07-04 14:09:47 +02:00
Simon de Vlieger
ae70eb08d2 stages/ovf: test vbox_mac_address
Test that different calls result in different mac addresses (with the
same prefix), also test that when the correct options are passed that
the mac address is returned as is.

Signed-off-by: Simon de Vlieger <supakeen@redhat.com>
2025-07-01 15:16:35 +02:00
Simon de Vlieger
54ac04e001 stage/ovf: mac address pattern
Adds a pattern for the mac address, without delimiters; as this is the
direct input for the virtualbox mac address property.

Signed-off-by: Simon de Vlieger <supakeen@redhat.com>
2025-07-01 15:16:35 +02:00
Simon de Vlieger
02537089d8 stage/ovf: additional schema tests
Adds tests to more thoroughly look at the vmware and virtualbox schemas
by passing wrong types.

Signed-off-by: Simon de Vlieger <supakeen@redhat.com>
2025-07-01 15:16:35 +02:00
Simon de Vlieger
19c38cb38f stages/ovf: allow setting mac address for vbox
The MAC address will need to be the same as the one being used by the
Vagrant stage *if* it's being used. This leaves it up to images to
generate the correct MAC address and set it in both places.

When the OVF stage is used separately it's still fine to use a random
MAC address.

Signed-off-by: Simon de Vlieger <supakeen@redhat.com>
2025-07-01 15:16:35 +02:00
Simon de Vlieger
1cb0f26b09 stages/ovf: virtualbox's ostype as option
Let the user of the stage set the os type for the virtualbox bits.

Signed-off-by: Simon de Vlieger <supakeen@redhat.com>
2025-07-01 15:16:35 +02:00
Simon de Vlieger
ce2bda719c stages/ovf: vmware's ostype as option
Let the user of the stage set the os type for the vmware bits.

Signed-off-by: Simon de Vlieger <supakeen@redhat.com>
2025-07-01 15:16:35 +02:00
Simon de Vlieger
9559cd0528 stages/ovf: write virtualbox
Expand the written XML to include information as used by VirtualBox.
This should not affect any other use cases of the OVF document that is
generated and is purely extra information consumed by VirtualBox.

Signed-off-by: Simon de Vlieger <supakeen@redhat.com>
2025-07-01 15:16:35 +02:00
Simon de Vlieger
d85ead3956 stages/ovf: reformat
Signed-off-by: Simon de Vlieger <supakeen@redhat.com>
2025-07-01 15:16:35 +02:00
Alexander Larsson
b7c0520392 stages: Add tests for org.osbuild.write-device
Signed-off-by: Alexander Larsson <alexl@redhat.com>
2025-06-25 11:12:25 +02:00
Alexander Larsson
30ca57de2c stages: Add org.osbuild.write-device stage
This stage writes a file to a device using dd. This is a
rewrite/backport of one of the stages in osbuild-auto.

The osbuild-auto stage is used in automotive-image-builder to write
the aboot image to the "boot_a" partition, to allow android boot
systems to boot. We will want similar functionallity in
bootc-image-builder, so it is important to upstream this.

Signed-off-by: Alexander Larsson <alexl@redhat.com>
2025-06-25 11:12:25 +02:00
Karolina Surma
7390f91592 Mark tests needing TOML-writing library with a custom marker
This way they can be conveniently skipped with `pytest -m "not
tomlwrite"` in environments where such libraries aren't available.
2025-06-23 19:51:29 +02:00
Karolina Surma
516301c02b Skip tests creating system units in RPM environment
Attempting to run them during the RPM build ends with an error:
'Failed to create directory '/run/systemd/': Permission denied'
2025-06-23 19:51:29 +02:00
Simon de Vlieger
d566c68f94 stages/wsl-distribution: stage to write wsl config
This is a new stage to be able to write a (subset) of relevant keys into
the `wsl-distribution` configuration file.

The file, and these options, are necessary for the enablement of fancy
logos and experiences in WSL2.

Signed-off-by: Simon de Vlieger <supakeen@redhat.com>
2025-06-19 10:22:57 +02:00
Simon de Vlieger
bc99513c0a stages/test: kickstart different messages
On Python 3.6 we're getting a *different* error message from other
versions in CI. Let's accept both versions.

Signed-off-by: Simon de Vlieger <supakeen@redhat.com>
2025-06-16 09:31:49 -07:00
Achilleas Koutsou
0968ee8d81 stages/grub2: add compat_version for fixed behaviour
For the terminal_input, terminal_output, and serial variables in the
GRUB_CFG_TEMPLATE, the keys were not set when those variables were not
defined in the options.  This caused the template variables to show up
in the final file itself, which could break the config.  For example,
the following line was being generated for one of our images:

    serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1${terminal_input}${terminal_output}

Setting the keys to an empty string when they're not defined solves the
issue.

Since this is a stage behaviour change, the new behaviour is toggled by
an option that maintains backwards compatibility when not set.
This introduces a new convention of adding a `compat_version` number to
the stage options to control the behaviour.  The value defaults to 1,
which is the old (broken) behaviour.  Manifest generators should always
set it to 2 to get the correct behaviour.
2025-06-13 14:14:57 +02:00
Simon de Vlieger
42281231b0 stages/containers: don't validate keys
In Python 3.14 configparser started validating keys. We use hacky bits
to write duplicate keys which means we have delimiters in our keys which
is now no longer allowed.

Let's explicitly turn off key validation for now as suggested by
mhroncok in [1].

[1]: https://github.com/osbuild/osbuild/issues/2109#issuecomment-2964585958

Signed-off-by: Simon de Vlieger <supakeen@redhat.com>
2025-06-12 15:31:34 +02:00
Simon de Vlieger
44cb7934db stages/systemd: don't validate keys
In Python 3.14 configparser started validating keys. We use hacky bits
to write duplicate keys which means we have delimiters in our keys which
is now no longer allowed.

Let's explicitly turn off key validation for now as suggested by
mhroncok in [1].

[1]: https://github.com/osbuild/osbuild/issues/2109#issuecomment-2964585958

Signed-off-by: Simon de Vlieger <supakeen@redhat.com>
2025-06-12 15:31:34 +02:00
Brian C. Lane
a828ef95d6 stages/erofs: Add exclude_paths support
Add the ability to exclude files and directories from the erofs
image. This uses the mkfs.erofs --exclude-regex feature, so simple
matches or regexes can be used.
2025-06-11 20:22:23 +02:00
Brian C. Lane
86c89a2421 stages/squashfs: Add exclude_paths support
Add the ability to exclude files and directories from the squashfs
image. This uses the mksquashfs -regex -e FILES... feature, so simple
matches or regexes can be used.

This also adds a new test for squashfs, based on the existing test for
erofs.
2025-06-11 20:22:23 +02:00
Simon de Vlieger
a464815ea8 stages/tar: allow chosen compression
The `org.osbuild.tar` stage only supports auto compression which is
based on the filename. For several (newer) artifacts such as Vagrant
(`.box`) and WSL (`.wsl`) we want to explicitly give the compression
algorithm.

I've chosen a (few) commonly used compression algorithms. If others are
needed they are one-line followups away.

Signed-off-by: Simon de Vlieger <supakeen@redhat.com>
2025-06-03 18:18:23 +02:00
Achilleas Koutsou
0ac83fd421 stages/kickstart: post-installation scripts
Add a new %post option to the kickstart stage that supports adding
multiple post blocks to a kickstart file, with all the options supported
by the directive.
2025-05-14 09:06:40 +02:00
Nikita Dubrovskii
73e3544e86 stages/coreos.live-artifacts: fix kernel and initrd paths in s390x ISO
The `generic.ins` template uses:
  images/kernel.img
  images/initrd.img

However, kernel and initrd are currently stored as:
  images/pxeboot/vmlinuz
  images/pxeboot/initrd.img

This change ensures correct paths are used.
2025-04-23 08:01:11 +02:00
Tomáš Hozza
7ff3fe0b50 Stages/waagent.conf: support additional options
Extend the stage to support setting new options:
 - Provisioning.UseCloudInit
 - Provisioning.Enabled

Extend the stage test to use them and add a simple stage unit test for
the schema.

Related to https://github.com/osbuild/images/issues/1416

Signed-off-by: Tomáš Hozza <thozza@redhat.com>
2025-04-14 08:18:04 +02:00
Tomáš Hozza
d41d8ecb3f Stages/waagent.conf: fix copy&paste error
Signed-off-by: Tomáš Hozza <thozza@redhat.com>
2025-04-14 08:18:04 +02:00
Tomáš Hozza
bea378f191 Stages/rhsm: add unit test for the stage schema
I forgot to add the file to
https://github.com/osbuild/osbuild/pull/2070.

Signed-off-by: Tomáš Hozza <thozza@redhat.com>
2025-04-11 15:39:20 +02:00
Achilleas Koutsou
db9f03ad41 stages: add unit tests for chrony stage
Add unit tests that check the schema and file contents for the chrony
stage.
2025-04-11 09:00:42 +02:00
Achilleas Koutsou
8baf16da06 stages/chrony: support specifying refclocks
The refclock directive can be used to specify one or more hardware
reference clocks to be used as a time source.  Each refclock line must
specify a driver and a mandatory parameter, in the form:

  refclock driver parameter

Drivers can have driver-specific options:

  refclock driver parameter:[driver-option,...]

General refclock options can also be specified:

  refclock driver parameter:[driver-option,...] [general-option]...

The stage options schema is written so that the "driver" property is an
object that must match one of four schemas corresponding to the four
drivers, each with a "name" property matching the driver name.
Each driver defines its required property and any optional
driver-specific options.

There are more general refclock options supported than the ones defined
in this commit, but we can add them if and when we need them in the
future.

Note that the restriction on the top-level stage options schema is now
lifted and any set of options can be specified.  Servers are not
required.  However, at least one top-level property is required still.

Docs: https://chrony-project.org/doc/3.4/chrony.conf.html
2025-04-11 09:00:42 +02:00
Tomáš Hozza
c9639c41f9 Stages/rhsm: support setting 'auto_enable_yum_plugins' option
Support setting the `auto_enable_yum_plugins` option in the `rhsm`
section of `rhsm.conf`.

Add a unit test for the stage schema and also adjust the stage test
manifest.

Related to: https://github.com/osbuild/images/issues/1408

Signed-off-by: Tomáš Hozza <thozza@redhat.com>
2025-04-10 12:29:21 +02:00
Achilleas Koutsou
52a822075e stages/systemd.unit.create: support StandardOutput
Add support for the StandardOutput option in the [Service] section of
systemd units.

https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html#StandardOutput=
2025-04-08 12:43:28 +02:00
luizademelo
cda3c43b2c stages: fix description for org.osbuild.containers.unit.create
Fixes #2053
2025-04-03 02:25:31 +02:00
Achilleas Koutsou
5b77ff6f65 stages: add new stage org.osbuild.hmac
The new org.osbuild.hmac stage can be used to calculate hmac digests to
be stored alongside files for verification.
2025-04-02 13:06:47 +02:00
Dusty Mabe
5a19d41f3e stages/coreos.live-artifacts: loosen requirements on modules dir
We originally required there to be only one kernel modules directory
since we typically only have one kernel installed. Change this check
up a bit since some kernel module RPMs aren't delivering a new kernel
but do deliver kmods that were built against a different kernel.

For example v4l2loopback from https://elrepo.org/

```
bash-5.1# rpm -ql kmod-v4l2loopback
/etc/depmod.d/kmod-v4l2loopback.conf
/lib/modules/5.14.0-427.13.1.el9_4.x86_64
/lib/modules/5.14.0-427.13.1.el9_4.x86_64/extra
/lib/modules/5.14.0-427.13.1.el9_4.x86_64/extra/v4l2loopback
/lib/modules/5.14.0-427.13.1.el9_4.x86_64/extra/v4l2loopback/v4l2loopback.ko
/usr/share/doc/kmod-v4l2loopback-0.12.7
/usr/share/doc/kmod-v4l2loopback-0.12.7/GPL-v2.0.txt
/usr/share/doc/kmod-v4l2loopback-0.12.7/greylist.txt
```

This patch now allows an image built from a Containerfile like the
following to work as input to the live artifacts stage.

```
FROM rhcos
RUN <<EOF
    set -eux -o pipefail
    dnf install -y https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm
    dnf install -y v4l2loopback
    dnf clean all
    ostree container commit
EOF
```
2025-03-19 22:25:59 +01:00
rverdile
a62276c7dc stages: add insights-client config stage 2025-03-17 19:34:16 +01:00
Michael Vogt
e93cd75e5b test/rpm: add schema validation test for boot_root 2025-03-13 13:47:43 +01:00
Achilleas Koutsou
305a54f1a2 stages/rpm: add new kernel_install_env options
Add support for setting environment variables for kernel-install and its
plugins.  These can be used to control the behaviour of kernel-install
during the kernel rpm installation.  Currently, we only add support for
$BOOT_ROOT, which we need to control the path where the kernel should be
installed.

Normally, kernel-install scripts will detect the correct path based on
the filesystem layout, specifically the ESP path.  However, during our
installation the filesystem is not yet set up, so with this option, we
can control the installation path based on the location we know the ESP
will be mounted in the final image.

This is a very similar override to what we do with the
org.osbuild.fix-bls stage.

The stage option is added under a kernel_install_env object so we can
potentially support more of the known env vars in the future.
2025-03-13 13:47:43 +01:00
Achilleas Koutsou
7be822d6e9 stages/rpm: set encoding for subprocess.run()
Printing 'owner' in an fstring triggers the mypy warning 'str-bytes-safe'

  Error: If x = b'abc' then f"{x}" or "{}".format(x) produces "b'abc'",
  not "abc".

We can't yet use the nicer run() argument, 'text=True', because we still
target the RHEL 7 build root which only has Python 3.6 and 'text' was
introduced in Python 3.7.
2025-03-13 13:47:43 +01:00