File virt-create-rootfs.patch of Package libvirt.26629

From 18f0bcacea9985a930dbf30417edf31757fcba91 Mon Sep 17 00:00:00 2001
From: Jim Fehlig <jfehlig@suse.com>
Date: Mon, 27 Jun 2022 16:46:36 -0600
Subject: Add virt-create-rootfs utility

From <cbosdonnat@suse.com>
---
 docs/manpages/meson.build            |   1 +
 docs/manpages/virt-create-rootfs.rst |  88 ++++++++++
 tools/meson.build                    |   2 +
 tools/virt-create-rootfs             | 236 +++++++++++++++++++++++++++
 4 files changed, 327 insertions(+)
 create mode 100644 docs/manpages/virt-create-rootfs.rst
 create mode 100644 tools/virt-create-rootfs

Index: libvirt-8.0.0/docs/manpages/meson.build
===================================================================
--- libvirt-8.0.0.orig/docs/manpages/meson.build
+++ libvirt-8.0.0/docs/manpages/meson.build
@@ -20,6 +20,7 @@ docs_man_files = [
   { 'name': 'virt-pki-validate', 'section': '1', 'install': true },
   { 'name': 'virt-qemu-run', 'section': '1', 'install': conf.has('WITH_QEMU') },
   { 'name': 'virt-xml-validate', 'section': '1', 'install': true },
+  { 'name': 'virt-create-rootfs', 'section': '1', 'install': true },
 
   { 'name': 'libvirt-guests', 'section': '8', 'install': conf.has('WITH_LIBVIRTD') },
   { 'name': 'libvirtd', 'section': '8', 'install': conf.has('WITH_LIBVIRTD') },
Index: libvirt-8.0.0/docs/manpages/virt-create-rootfs.rst
===================================================================
--- /dev/null
+++ libvirt-8.0.0/docs/manpages/virt-create-rootfs.rst
@@ -0,0 +1,88 @@
+==================
+virt-create-rootfs
+==================
+
+---------------------------------------------------------
+A tool to create a root file system for distro containers
+---------------------------------------------------------
+
+:Manual section: 1
+:Manual group: Virtualization Support
+
+.. contents::
+
+SYNOPSIS
+========
+
+
+``virt-create-rootfs`` [*OPTION*]
+
+
+DESCRIPTION
+===========
+
+The ``virt-create-rootfs`` program is a shell script setting up a root file
+system for a distribution container.
+
+The basic structure of most virt-create-rootfs usage is:
+
+  ``virt-create-rootfs`` -r /path/to/root -d distro-name
+
+
+OPTIONS
+=======
+
+``-h``, ``--help``
+
+Display command line help usage then exit.
+
+``-r``, ``--root``
+
+Set the path where to create the new root file system.
+
+``-d``, ``--distro``
+
+Set the name of distribution to use for the root file system.
+
+As of now, only SLED-<XXX>, SLES-<XXX> and openSUSE-<XXX> are implemented
+where <XXX> is the version number. Examples are openSUSE-15.3, openSUSE-tumbleweed,
+and SLES-15.3. Note that SUSEConnect is required to handle SLE distributions.
+
+``-a``, ``--arch``
+
+Set the target architecture of the root file system to either i586 or x86_64.
+
+``-c``, ``--regcode``
+
+Set the registration code for the product to install in the root file system.
+For SLE distributions, use a registration code from SUSE Customer Center.
+
+``-u``, ``--url``
+
+For SLE distributions, set the registration server to use.
+Default: http://scc.suse.com.
+
+``--dry-run``
+
+Don't do anything, just report what would be done.
+
+
+COPYRIGHT
+=========
+
+Copyright (C) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
+
+
+LICENSE
+=======
+
+``virt-create-rootfs`` is distributed under the terms of the GNU LGPL v2+.
+This is free software; see the source for copying conditions. There
+is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE
+
+
+SEE ALSO
+========
+
+virsh(1), `https://libvirt.org/ <https://libvirt.org/>`_
Index: libvirt-8.0.0/tools/meson.build
===================================================================
--- libvirt-8.0.0.orig/tools/meson.build
+++ libvirt-8.0.0/tools/meson.build
@@ -154,6 +154,8 @@ else
   virsh_icon_res = []
 endif
 
+install_data('virt-create-rootfs', install_dir: bindir, install_mode: 'rwxr-xr-x',)
+
 executable(
   'virsh',
   [
Index: libvirt-8.0.0/tools/virt-create-rootfs
===================================================================
--- /dev/null
+++ libvirt-8.0.0/tools/virt-create-rootfs
@@ -0,0 +1,236 @@
+#!/bin/sh
+set -e
+
+function fail
+{
+    echo $1
+    exit 1
+}
+
+function print_help
+{
+cat << EOF
+virt-create-rootfs --root /path/to/rootfs [ARGS]
+
+Create a new root file system to use for distribution containers.
+
+ARGUMENTS
+
+    -h, --help          print this help and exit
+    -r, --root          path where to create the root FS
+    -d, --distro        distribution to install
+    -a, --arch          target architecture
+    -u, --url           URL of the registration server
+    -c, --regcode       registration code for the product
+    --dry-run           don't actually run it
+EOF
+}
+
+ARCH=$(uname -i)
+ROOT=
+DISTRO=
+URL=
+REG_CODE=
+DRY_RUN=
+
+while test $# -gt 0
+do
+    case $1 in
+
+    -h | --help)
+        # usage and help
+        print_help
+        ;;
+
+    -r | --root)
+        if test $# -lt 2; then
+            fail "$1 needs a value"
+        fi
+        ROOT="$2"
+        shift
+        ;;
+
+    -a | --arch)
+        if test $# -lt 2; then
+            fail "$1 needs a value"
+        fi
+        case "$2" in
+            i586 | x86_64)
+                ARCH=$2
+                shift
+                ;;
+            *)
+                fail "$1 valid values are 'i586', 'x86_64'"
+        esac
+        # Sanity checks for the arch
+        HOST_ARCH=$(uname -i)
+        case "$HOST_ARCH" in
+            i?86)
+                if test $ARCH = "x86_64"; then
+                    fail "Host won't run x86_64 container"
+                fi
+            ;;
+        esac
+        ;;
+
+    -u | --url)
+        if test $# -lt 2; then
+            fail "$1 needs a value"
+        fi
+        URL="$2"
+        shift
+        ;;
+
+    -d | --distro)
+        if test $# -lt 2; then
+            fail "$1 needs a value"
+        fi
+        case "$2" in
+            SLED-* | SLES-* | openSUSE-*)
+                DISTRO=$2
+                shift
+                ;;
+            *)
+                fail "$1 valid values are 'SLED-*', 'SLES-*', 'openSUSE-*'"
+        esac
+        ;;
+
+    -c | --regcode)
+        if test $# -lt 2; then
+            fail "$1 needs a value"
+        fi
+        REG_CODE=$2
+        shift
+        ;;
+
+    --dry-run)
+        DRY_RUN="yes"
+        ;;
+
+    *)
+        fail "Unknown option: $1"
+        ;;
+    esac
+
+    shift
+done
+
+if test -z "$ROOT"; then
+    fail "--root argument need to be provided"
+fi
+
+RUN=
+if test "$DRY_RUN" = "yes"; then
+    RUN="echo"
+fi
+
+function call_zypper
+{
+    $RUN zypper --root "$ROOT" $*
+}
+
+function install_sle
+{
+    PRODUCT="$1"
+    TARGET_VERSION="$2"
+
+    case "$TARGET_VERSION" in
+        12.0)
+            # Transform into zypper internal version scheme
+            TARGET_VERSION="12"
+            ;;
+        15.0)
+            TARGET_VERSION="15"
+            ;;
+        12.*|15.*)
+            ;;
+        *)
+            fail "Unhandled SLE version: $TARGET_VERSION"
+            ;;
+    esac
+
+    # Depending on the distro we run, we may have some preliminary things to do
+    . /etc/os-release
+    case "$VERSION_ID" in
+        15*)
+            # on SLE 15 we need to symlink the two path to the RPM DB or the GPG
+            # key won't be found.
+            mkdir -p "$ROOT/usr/lib/sysimage/rpm"
+            mkdir -p "$ROOT/var/lib"
+            ln -s ../../usr/lib/sysimage/rpm "$ROOT/var/lib"
+            ;;
+    esac
+
+    # First copy the SUSE GPG keys from the host to the new root
+    rpm -qa gpg-pubkey\* --qf "%{name}-%{version}-%{release}: %{summary}\n" | \
+    grep 'gpg(SuSE Package Signing Key <build@suse.de>)' | \
+    while read -r line; do
+        key=$(echo $line | cut -d ':' -f 1)
+        tmpkey=$(mktemp)
+        rpm -qi $key | sed -n '/BEGIN/,/END/p' > "$tmpkey"
+        rpm --root "$ROOT" --import "$tmpkey"
+        rm "$tmpkey"
+    done
+
+    # SUSE Connect adds the repositories, and refreshes them,
+    # but requires the GPG key to be already imported
+    CONNECT_ARGS=
+    if test -n "$REG_CODE"; then
+        CONNECT_ARGS="$CONNECT_ARGS -r $REG_CODE"
+    fi
+    if test -n "$URL"; then
+        CONNECT_ARGS="$CONNECT_ARGS --url $URL"
+    fi
+
+    PATTERN=Minimal
+    case "$TARGET_VERSION" in
+        12*)
+            $RUN SUSEConnect -p "$PRODUCT/$TARGET_VERSION/$ARCH" --root "$ROOT" $CONNECT_ARGS
+            ;;
+        15*)
+            # Due to SLE 15 modules we need to add the product first, let it fail,
+            # add the basesystem
+            set +e
+            $RUN SUSEConnect -p "$PRODUCT/$TARGET_VERSION/$ARCH" --root "$ROOT" $CONNECT_ARGS
+            set -e
+            $RUN SUSEConnect -p "sle-module-basesystem/$TARGET_VERSION/$ARCH" --root "$ROOT" $CONNECT_ARGS
+            PATTERN=base
+            ;;
+    esac
+
+    # Then we install what we need
+    call_zypper -n in --auto-agree-with-licenses -t pattern $PATTERN
+
+    # Create the baseproduct symlink if missing
+    if ! test -e "$ROOT/etc/products.d/baseproduct"; then
+        ln -s $PRODUCT.prod "$ROOT/etc/products.d/baseproduct"
+    fi
+}
+
+case "$DISTRO" in
+    SLED-*)
+        install_sle "SLED" "${DISTRO:5}"
+        ;;
+    SLED-* | SLES-*)
+        install_sle "SLES" "${DISTRO:5}"
+        ;;
+
+    openSUSE-*)
+        TARGET_VERSION=${DISTRO:9}
+        if test $TARGET_VERSION = "tumbleweed"; then
+            REPO="http://download.opensuse.org/tumbleweed/repo/oss/"
+            call_zypper ar "$REPO" "openSUSE"
+        else
+            REPO="http://download.opensuse.org/distribution/leap/$TARGET_VERSION/repo/oss/"
+            UPDATE_REPO="http://download.opensuse.org/update/leap/$TARGET_VERSION/oss/"
+            call_zypper ar "$REPO" "openSUSE"
+            call_zypper ar "$UPDATE_REPO" "openSUSE-udpate"
+        fi
+        call_zypper in --no-recommends -t pattern base
+        ;;
+esac
+
+if test "$DRY_RUN" != "yes"; then
+    echo "pts/0" >> "$ROOT/etc/securetty"
+    chroot "$ROOT" /usr/bin/passwd
+fi
openSUSE Build Service is sponsored by