summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--0001-adapt-to-openEuler.patch173
-rw-r--r--0001-modify-the-templates-etc-dhcp.template.patch31
-rw-r--r--cobbler-nocov.patch41
-rw-r--r--cobbler.fc28
-rw-r--r--cobbler.if251
-rw-r--r--cobbler.spec344
-rw-r--r--cobbler.te243
-rw-r--r--migrate-settings.sh4
-rw-r--r--mkgrub.sh97
-rw-r--r--sources1
11 files changed, 1214 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..2742718 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/cobbler-3.3.7.tar.gz
diff --git a/0001-adapt-to-openEuler.patch b/0001-adapt-to-openEuler.patch
new file mode 100644
index 0000000..8bc392c
--- /dev/null
+++ b/0001-adapt-to-openEuler.patch
@@ -0,0 +1,173 @@
+From 06b74c082a2d031b31929403081c3bde242d98d8 Mon Sep 17 00:00:00 2001
+From: yanzhicong <mryanzhicong@163.com>
+Date: Tue, 18 Mar 2025 17:37:13 +0800
+Subject: [PATCH] adapt to openEuler
+
+---
+ cobbler/actions/check.py | 2 +-
+ cobbler/actions/reposync.py | 2 +-
+ cobbler/autoinstallgen.py | 2 +-
+ cobbler/tftpgen.py | 9 +++++----
+ cobbler/utils.py | 3 +++
+ config/cobbler/distro_signatures.json | 28 +++++++++++++++++++++++++++
+ distro_build_configs.sh | 5 ++++-
+ templates/etc/dhcp.template | 2 +-
+ 8 files changed, 44 insertions(+), 9 deletions(-)
+
+diff --git a/cobbler/actions/check.py b/cobbler/actions/check.py
+index b79706a..e35b53b 100644
+--- a/cobbler/actions/check.py
++++ b/cobbler/actions/check.py
+@@ -147,7 +147,7 @@ class CobblerCheck:
+ if return_code != 0:
+ status.append("service %s is not running%s" % (which, notes))
+ return
+- elif self.checked_family in ("redhat", "suse"):
++ elif self.checked_family in ("redhat", "suse", "generic_lower_os"):
+ if os.path.exists("/etc/rc.d/init.d/%s" % which):
+ return_code = utils.subprocess_call("/sbin/service %s status > /dev/null 2>/dev/null" % which,
+ shell=True)
+diff --git a/cobbler/actions/reposync.py b/cobbler/actions/reposync.py
+index c016335..f4f3d49 100644
+--- a/cobbler/actions/reposync.py
++++ b/cobbler/actions/reposync.py
+@@ -255,7 +255,7 @@ class RepoSync:
+ mdoptions.append("-g %s" % os.path.join(origin_path, groupmdfile))
+ if "prestodelta" in rd:
+ # need createrepo >= 0.9.7 to add deltas
+- if utils.get_family() in ("redhat", "suse"):
++ if utils.get_family() in ("redhat", "suse", "generic_lower_os"):
+ cmd = "/usr/bin/rpmquery --queryformat=%{VERSION} createrepo"
+ createrepo_ver = utils.subprocess_get(cmd)
+ if not createrepo_ver[0:1].isdigit():
+diff --git a/cobbler/autoinstallgen.py b/cobbler/autoinstallgen.py
+index 28187c5..d60be02 100644
+--- a/cobbler/autoinstallgen.py
++++ b/cobbler/autoinstallgen.py
+@@ -304,7 +304,7 @@ class AutoInstallationGen:
+ meta.update(autoinstall_meta)
+
+ # add package repositories metadata to autoinstall metavariables
+- if distro.breed == "redhat":
++ if distro.breed == "redhat" or distro.breed == "generic_lower_os":
+ meta["yum_repo_stanza"] = self.generate_repo_stanza(obj, (system is None))
+ meta["yum_config_stanza"] = self.generate_config_stanza(obj, (system is None))
+ # FIXME: implement something similar to zypper (SUSE based distros) and apt (Debian based distros)
+diff --git a/cobbler/tftpgen.py b/cobbler/tftpgen.py
+index d0b0dfc..6911d46 100644
+--- a/cobbler/tftpgen.py
++++ b/cobbler/tftpgen.py
+@@ -905,7 +905,7 @@ class TFTPGen:
+ autoinstall_path = "http://%s/cblr/svc/op/autoinstall/profile/%s" \
+ % (httpserveraddress, profile.name)
+
+- if distro.breed is None or distro.breed == "redhat":
++ if distro.breed is None or distro.breed == "redhat" or distro.breed == "generic_lower_os":
+
+ if distro.os_version in ["rhel4", "rhel5", "rhel6", "fedora16"]:
+ append_line += f" kssendmac ks={autoinstall_path}"
+@@ -914,9 +914,10 @@ class TFTPGen:
+ else:
+ append_line += f" inst.ks.sendmac inst.ks={autoinstall_path}"
+ if blended["autoinstall_meta"].get("tree"):
+- append_line += (
+- f" inst.repo={blended['autoinstall_meta']['tree']}"
+- )
++ #append_line += (
++ # f" inst.repo={blended['autoinstall_meta']['tree']}"
++ #)
++ append_line = append_line.replace("repo","inst.repo")
+ ipxe = blended["enable_ipxe"]
+ if ipxe:
+ append_line = append_line.replace('ksdevice=bootif', 'ksdevice=${net0/mac}')
+diff --git a/cobbler/utils.py b/cobbler/utils.py
+index 8586844..1a6ecbb 100644
+--- a/cobbler/utils.py
++++ b/cobbler/utils.py
+@@ -1097,6 +1097,9 @@ def os_release():
+ make = "unknown"
+ return make, float(distro_version)
+
++ elif family == "generic_lower_os":
++ return "generic_lower_os", float(distro_version)
++
+
+ def is_safe_to_hardlink(src: str, dst: str, api) -> bool:
+ """
+diff --git a/config/cobbler/distro_signatures.json b/config/cobbler/distro_signatures.json
+index 2c1ca82..90fd075 100644
+--- a/config/cobbler/distro_signatures.json
++++ b/config/cobbler/distro_signatures.json
+@@ -1,5 +1,33 @@
+ {
+ "breeds": {
++ "generic_lower_os": {
++ "generic_lower_os": {
++ "signatures": [
++ "Packages"
++ ],
++ "version_file": "generic_os-release-(.*).rpm",
++ "version_file_regex": null,
++ "kernel_arch": "kernel-(.*).rpm",
++ "kernel_arch_regex": null,
++ "supported_arches": [
++ "aarch64",
++ "x86_64"
++ ],
++ "supported_repo_breeds": [
++ "rsync",
++ "rhn",
++ "yum"
++ ],
++ "kernel_file": "vmlinuz(.*)",
++ "initrd_file": "initrd(.*)\\.img",
++ "isolinux_ok": true,
++ "default_autoinstall": "sample.ks",
++ "kernel_options": "repo=$tree",
++ "kernel_options_post": "",
++ "boot_files": [],
++ "boot_loaders": {}
++ }
++ },
+ "redhat": {
+ "rhel4": {
+ "signatures": [
+diff --git a/distro_build_configs.sh b/distro_build_configs.sh
+index 954e0f9..1de6ee0 100644
+--- a/distro_build_configs.sh
++++ b/distro_build_configs.sh
+@@ -38,6 +38,9 @@ if [ "$DISTRO" = "" ] && [ -r /etc/os-release ];then
+ ubuntu*|debian*)
+ DISTRO="UBUNTU"
+ ;;
++ generic_os*)
++ DISTRO=`echo 'generic_os'|tr 'a-z' 'A-Z'`
++ ;;
+ esac
+ fi
+
+@@ -59,7 +62,7 @@ elif [ "$DISTRO" = "UBUNTU" ];then
+ export MEMDISK_FOLDER="/usr/lib/syslinux/"
+ export SYSLINUX_DIR="/usr/lib/syslinux/modules/bios/"
+ export GRUB_MOD_FOLDER="/usr/lib/grub"
+-elif [ "$DISTRO" = "FEDORA" ];then
++elif [ "$DISTRO" = "FEDORA" ] || [ "$DISTRO" = `echo 'generic_os'|tr 'a-z' 'A-Z'` ];then
+ export APACHE_USER="apache"
+ export HTTP_USER=$APACHE_USER # overrule setup.py
+ export APACHE_GROUP="apache"
+diff --git a/templates/etc/dhcp.template b/templates/etc/dhcp.template
+index 9089439..698c826 100644
+--- a/templates/etc/dhcp.template
++++ b/templates/etc/dhcp.template
+@@ -31,7 +31,7 @@ subnet 192.168.1.0 netmask 255.255.255.0 {
+
+ # Legacy
+ if option system-arch = 00:00 {
+- filename "grub/grub.0";
++ filename "pxelinux.0";
+ }
+ # UEFI-32-1
+ if option system-arch = 00:06 {
+--
+2.33.0
+
diff --git a/0001-modify-the-templates-etc-dhcp.template.patch b/0001-modify-the-templates-etc-dhcp.template.patch
new file mode 100644
index 0000000..9e7cf10
--- /dev/null
+++ b/0001-modify-the-templates-etc-dhcp.template.patch
@@ -0,0 +1,31 @@
+From e4ff3cbad33c3d5549acc70c148b7a07d697d926 Mon Sep 17 00:00:00 2001
+From: YanZhicong <mryanzhicong@163.com>
+Date: Wed, 19 Mar 2025 09:53:01 +0800
+Subject: [PATCH] modify the templates/etc/dhcp.template
+
+---
+ templates/etc/dhcp.template | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/templates/etc/dhcp.template b/templates/etc/dhcp.template
+index 698c826..8afecea 100644
+--- a/templates/etc/dhcp.template
++++ b/templates/etc/dhcp.template
+@@ -34,12 +34,12 @@ subnet 192.168.1.0 netmask 255.255.255.0 {
+ filename "pxelinux.0";
+ }
+ # UEFI-32-1
+- if option system-arch = 00:06 {
++ else if option system-arch = 00:06 {
+ # Not supported, no 32 bit UEFI grub executable
+ filename "unsupported";
+ }
+ # UEFI-32-2
+- if option system-arch = 00:02 {
++ else if option system-arch = 00:02 {
+ # Not supported, no 32 bit UEFI grub executable
+ filename "unsupported";
+ }
+--
+2.33.0
+
diff --git a/cobbler-nocov.patch b/cobbler-nocov.patch
new file mode 100644
index 0000000..c50edfd
--- /dev/null
+++ b/cobbler-nocov.patch
@@ -0,0 +1,41 @@
+diff --git a/setup.py b/setup.py
+index 59f7601..023d84b 100644
+--- a/setup.py
++++ b/setup.py
+@@ -341,17 +341,9 @@ class test_command(Command):
+
+ def run(self):
+ import pytest
+- from coverage import Coverage
+-
+- cov = Coverage()
+- cov.erase()
+- cov.start()
+
+ result = pytest.main()
+
+- cov.stop()
+- cov.save()
+- cov.html_report(directory="covhtml")
+ sys.exit(int(bool(len(result.failures) > 0 or len(result.errors) > 0)))
+
+
+@@ -479,7 +471,6 @@ if __name__ == "__main__":
+ },
+ license="GPLv2+",
+ setup_requires=[
+- "coverage",
+ "distro",
+ "setuptools",
+ "sphinx",
+@@ -501,10 +492,7 @@ if __name__ == "__main__":
+ "lint": ["pyflakes", "pycodestyle", "pylint", "black", "mypy"],
+ "test": [
+ "pytest>6",
+- "pytest-cov",
+- "codecov",
+ "pytest-mock",
+- "pytest-benchmark",
+ ],
+ "docs": ["sphinx", "sphinx-rtd-theme", "sphinxcontrib-apidoc"],
+ # We require the current version to properly detect duplicate issues
diff --git a/cobbler.fc b/cobbler.fc
new file mode 100644
index 0000000..568bf88
--- /dev/null
+++ b/cobbler.fc
@@ -0,0 +1,28 @@
+/etc/cobbler(/.*)? gen_context(system_u:object_r:cobbler_etc_t,s0)
+
+/etc/rc\.d/init\.d/cobblerd -- gen_context(system_u:object_r:cobblerd_initrc_exec_t,s0)
+
+/usr/bin/cobblerd -- gen_context(system_u:object_r:cobblerd_exec_t,s0)
+
+/usr/lib/systemd/system/cobblerd.* -- gen_context(system_u:object_r:cobblerd_unit_file_t,s0)
+
+/var/cache/cobbler(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0)
+/var/lib/cobbler(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0)
+
+/var/lib/tftpboot/aarch64(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0)
+/var/lib/tftpboot/boot(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0)
+/var/lib/tftpboot/etc(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0)
+/var/lib/tftpboot/grub(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0)
+/var/lib/tftpboot/images(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0)
+/var/lib/tftpboot/images2(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0)
+/var/lib/tftpboot/memdisk -- gen_context(system_u:object_r:cobbler_var_lib_t,s0)
+/var/lib/tftpboot/menu\.c32 -- gen_context(system_u:object_r:cobbler_var_lib_t,s0)
+/var/lib/tftpboot/ppc(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0)
+/var/lib/tftpboot/pxelinux\.0 -- gen_context(system_u:object_r:cobbler_var_lib_t,s0)
+/var/lib/tftpboot/pxelinux\.cfg(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0)
+/var/lib/tftpboot/s390x(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0)
+/var/lib/tftpboot/yaboot -- gen_context(system_u:object_r:cobbler_var_lib_t,s0)
+
+/var/log/cobbler(/.*)? gen_context(system_u:object_r:cobbler_var_log_t,s0)
+
+/var/www/cobbler(/.*)? gen_context(system_u:object_r:cobbler_var_lib_t,s0)
diff --git a/cobbler.if b/cobbler.if
new file mode 100644
index 0000000..4054eab
--- /dev/null
+++ b/cobbler.if
@@ -0,0 +1,251 @@
+## <summary>Cobbler installation server.</summary>
+
+########################################
+## <summary>
+## Execute a domain transition to run cobblerd.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed to transition.
+## </summary>
+## </param>
+#
+interface(`cobblerd_domtrans',`
+ gen_require(`
+ type cobblerd_t, cobblerd_exec_t;
+ ')
+
+ corecmd_search_bin($1)
+ domtrans_pattern($1, cobblerd_exec_t, cobblerd_t)
+')
+
+########################################
+## <summary>
+## Execute cobblerd server in the cobblerd domain.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed to transition.
+## </summary>
+## </param>
+#
+interface(`cobblerd_systemctl',`
+ gen_require(`
+ type named_unit_file_t;
+ type named_t;
+ ')
+
+ systemd_exec_systemctl($1)
+ init_reload_services($1)
+ allow $1 named_unit_file_t:file read_file_perms;
+ allow $1 named_unit_file_t:service manage_service_perms;
+
+ ps_process_pattern($1, named_t)
+')
+
+########################################
+## <summary>
+## Execute cobblerd init scripts in
+## the init script domain.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed to transition.
+## </summary>
+## </param>
+#
+interface(`cobblerd_initrc_domtrans',`
+ gen_require(`
+ type cobblerd_initrc_exec_t;
+ ')
+
+ init_labeled_script_domtrans($1, cobblerd_initrc_exec_t)
+')
+
+
+
+########################################
+## <summary>
+## Read cobbler configuration dirs.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`cobbler_list_config',`
+ gen_require(`
+ type cobbler_etc_t;
+ ')
+
+ list_dirs_pattern($1, cobbler_etc_t, cobbler_etc_t)
+ files_search_etc($1)
+')
+
+
+########################################
+## <summary>
+## Read cobbler configuration files.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`cobbler_read_config',`
+ gen_require(`
+ type cobbler_etc_t;
+ ')
+
+ read_files_pattern($1, cobbler_etc_t, cobbler_etc_t)
+ files_search_etc($1)
+')
+
+########################################
+## <summary>
+## Do not audit attempts to read and write
+## cobbler log files.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain to not audit.
+## </summary>
+## </param>
+#
+interface(`cobbler_dontaudit_rw_log',`
+ gen_require(`
+ type cobbler_var_log_t;
+ ')
+
+ dontaudit $1 cobbler_var_log_t:file rw_file_perms;
+')
+
+########################################
+## <summary>
+## Search cobbler lib directories.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`cobbler_search_lib',`
+ gen_require(`
+ type cobbler_var_lib_t;
+ ')
+
+ files_search_var_lib($1)
+ search_dirs_pattern($1, cobbler_var_lib_t, cobbler_var_lib_t)
+')
+
+########################################
+## <summary>
+## Read cobbler lib files.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`cobbler_read_lib_files',`
+ gen_require(`
+ type cobbler_var_lib_t;
+ ')
+
+ files_search_var_lib($1)
+ read_files_pattern($1, cobbler_var_lib_t, cobbler_var_lib_t)
+ read_lnk_files_pattern($1, cobbler_var_lib_t, cobbler_var_lib_t)
+')
+
+########################################
+## <summary>
+## Create, read, write, and delete
+## cobbler lib files.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+#
+interface(`cobbler_manage_lib_files',`
+ gen_require(`
+ type cobbler_var_lib_t;
+ ')
+
+ files_search_var_lib($1)
+ manage_files_pattern($1, cobbler_var_lib_t, cobbler_var_lib_t)
+ manage_lnk_files_pattern($1, cobbler_var_lib_t, cobbler_var_lib_t)
+ manage_dirs_pattern($1, cobbler_var_lib_t, cobbler_var_lib_t)
+')
+
+########################################
+## <summary>
+## All of the rules required to
+## administrate an cobbler environment.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+## <param name="role">
+## <summary>
+## Role allowed access.
+## </summary>
+## </param>
+## <rolecap/>
+#
+interface(`cobblerd_admin',`
+ refpolicywarn(`$0($*) has been deprecated, use cobbler_admin() instead.')
+ cobbler_admin($1, $2)
+')
+
+########################################
+## <summary>
+## All of the rules required to
+## administrate an cobbler environment.
+## </summary>
+## <param name="domain">
+## <summary>
+## Domain allowed access.
+## </summary>
+## </param>
+## <param name="role">
+## <summary>
+## Role allowed access.
+## </summary>
+## </param>
+## <rolecap/>
+#
+interface(`cobbler_admin',`
+ gen_require(`
+ type cobblerd_t, cobbler_var_lib_t, cobbler_var_log_t;
+ type cobbler_etc_t, cobblerd_initrc_exec_t;
+ type cobbler_tmp_t;
+ ')
+
+ allow $1 cobblerd_t:process { ptrace signal_perms };
+ ps_process_pattern($1, cobblerd_t)
+
+ cobblerd_initrc_domtrans($1)
+ domain_system_change_exemption($1)
+ role_transition $2 cobblerd_initrc_exec_t system_r;
+ allow $2 system_r;
+
+ files_search_etc($1)
+ admin_pattern($1, cobbler_etc_t)
+
+ files_search_tmp($1)
+ admin_pattern($1, cobbler_tmp_t)
+
+ files_search_var_lib($1)
+ admin_pattern($1, cobbler_var_lib_t)
+
+ logging_search_logs($1)
+ admin_pattern($1, cobbler_var_log_t)
+')
diff --git a/cobbler.spec b/cobbler.spec
new file mode 100644
index 0000000..4ec2fa9
--- /dev/null
+++ b/cobbler.spec
@@ -0,0 +1,344 @@
+%global tftpboot_dir %{_sharedstatedir}/tftpboot/
+%global vendor_lower `echo %{_vendor}|tr 'A-Z' 'a-z'`
+
+%global selinuxtype targeted
+
+Name: cobbler
+Version: 3.3.7
+Release: 4%{?dist}
+Summary: Boot server configurator
+URL: https://cobbler.github.io/
+# Automatically converted from old format: GPLv2+ - review is highly recommended.
+License: GPL-2.0-or-later
+Source0: https://github.com/cobbler/cobbler/archive/v%{version}/%{name}-%{version}.tar.gz
+Source1: migrate-settings.sh
+Source2: %{name}.te
+Source3: %{name}.if
+Source4: %{name}.fc
+Source5: mkgrub.sh
+
+# Do not run coverage tests
+Patch0: cobbler-nocov.patch
+Patch1: 0001-adapt-to-openEuler.patch
+Patch2: 0001-modify-the-templates-etc-dhcp.template.patch
+BuildArch: noarch
+
+BuildRequires: make
+BuildRequires: python%{python3_pkgversion}-devel
+BuildRequires: python%{python3_pkgversion}-dns
+BuildRequires: python%{python3_pkgversion}-magic
+# Cheetah switched names from Cheetah3 to CT3 in its metadata in version 3.3.0.
+# https://github.com/CheetahTemplate3/cheetah3/commit/673259b2d139b4ea970b1c2da12607b7ac39cbec
+BuildRequires: %{py3_dist cheetah3}
+BuildRequires: %{py3_dist distro}
+BuildRequires: %{py3_dist netaddr}
+BuildRequires: %{py3_dist pyyaml}
+BuildRequires: %{py3_dist requests}
+BuildRequires: %{py3_dist schema}
+BuildRequires: %{py3_dist setuptools}
+# For docs
+BuildRequires: %{py3_dist sphinx}
+
+# This ensures that the *-selinux package and all it’s dependencies are not pulled
+# into containers and other systems that do not use SELinux
+Requires: (%{name}-selinux if selinux-policy-%{selinuxtype})
+
+Requires: httpd
+Requires: tftp-server
+Requires: dosfstools
+Requires: createrepo_c
+Requires: rsync
+Requires: xorriso
+
+Requires: genisoimage
+# Not everyone wants bash-completion...?
+Recommends: bash-completion
+Requires: dnf-plugins-core
+# syslinux is only available on x86
+Requires: (syslinux if (filesystem.x86_64 or filesystem.i686))
+# grub2 efi stuff is only available on x86
+Recommends: grub2-efi-ia32
+Recommends: grub2-efi-x64
+Recommends: logrotate
+Recommends: %{py3_dist librepo}
+# https://github.com/cobbler/cobbler/issues/1685
+Requires: /sbin/service
+Obsoletes: cobbler-web < 3.3
+
+BuildRequires: systemd
+Requires(post): systemd
+Requires(preun): systemd
+Requires(postun): systemd
+
+%description
+Cobbler is a network install server. Cobbler supports PXE, ISO
+virtualized installs, and re-installing existing Linux machines. The
+last two modes use a helper tool, 'koan', that integrates with cobbler.
+Cobbler's advanced features include importing distributions from DVDs
+and rsync mirrors, kickstart templating, integrated yum mirroring, and
+built-in DHCP/DNS Management. Cobbler has a XML-RPC API for integration
+with other applications.
+
+
+%package selinux
+Summary: SELinux policies for %{name}
+Requires: selinux-policy-%{selinuxtype}
+Requires(post): selinux-policy-%{selinuxtype}
+BuildRequires: selinux-policy-devel
+BuildArch: noarch
+%{?selinux_requires}
+
+
+%description selinux
+SELinux policies for %{name}.
+
+
+%package tests
+Summary: Unit tests for cobbler
+Requires: cobbler = %{version}-%{release}
+
+%description tests
+Unit test files from the Cobbler project.
+
+
+%package tests-containers
+Summary: Dockerfiles and scripts to setup testing containers
+Requires: cobbler = %{version}-%{release}
+
+%description tests-containers
+Dockerfiles and scripts to setup testing containers.
+
+
+%prep
+%autosetup -p1
+mkdir -p selinux
+cp -p %{SOURCE2} %{SOURCE3} %{SOURCE4} selinux/
+
+
+sed -i "s/generic_os/%{_vendor}/g" distro_build_configs.sh
+sed -i "s/generic_os/%{_vendor}/g" config/cobbler/distro_signatures.json
+sed -i "s/generic_lower_os/%{vendor_lower}/g" cobbler/actions/check.py
+sed -i "s/generic_lower_os/%{vendor_lower}/g" cobbler/utils.py
+sed -i "s/generic_lower_os/%{vendor_lower}/g" config/cobbler/distro_signatures.json
+sed -i "s/generic_lower_os/%{vendor_lower}/g" cobbler/tftpgen.py
+sed -i "s/generic_lower_os/%{vendor_lower}/g" cobbler/autoinstallgen.py
+
+
+%build
+. ./distro_build_configs.sh
+%py3_build
+make man
+
+# SELinux
+make -f %{_datadir}/selinux/devel/Makefile %{name}.pp
+bzip2 -9 %{name}.pp
+
+
+%install
+. ./distro_build_configs.sh
+# bypass install errors ( don't chown in install step)
+%py3_install ||:
+
+# cobbler
+rm %{buildroot}%{_sysconfdir}/cobbler/cobbler.conf
+
+mkdir -p %{buildroot}%{_sysconfdir}/logrotate.d
+mv %{buildroot}%{_sysconfdir}/cobbler/cobblerd_rotate %{buildroot}%{_sysconfdir}/logrotate.d/cobblerd
+
+# Create data directories in tftpboot_dir
+mkdir -p %{buildroot}%{tftpboot_dir}/{boot,etc,grub/system{,_link},images{,2},ppc,pxelinux.cfg,s390x}
+
+# systemd - move to proper location
+mkdir -p %{buildroot}%{_unitdir}
+mv %{buildroot}%{_sysconfdir}/cobbler/cobblerd.service %{buildroot}%{_unitdir}
+
+# ghosted files
+touch %{buildroot}%{_sharedstatedir}/cobbler/web.ss
+
+# migrate-settings.sh
+install -p -m0755 %SOURCE1 %{buildroot}%{_datadir}/cobbler/bin/migrate-settings.sh
+
+# mkgrub.sh
+install -p -m0755 %SOURCE5 %{buildroot}%{_datadir}/cobbler/bin/mkgrub.sh
+
+# SELinux
+install -D -m 0644 %{name}.pp.bz2 %{buildroot}%{_datadir}/selinux/packages/%{selinuxtype}/%{name}.pp.bz2
+install -D -p -m 0644 selinux/%{name}.if %{buildroot}%{_datadir}/selinux/devel/include/distributed/%{name}.if
+
+
+%check
+# These require an installed system with root access
+#pytest -v
+
+
+%pre
+if [ $1 -ge 2 ]; then
+ # package upgrade: backup configuration
+ DATE=$(date "+%%Y%%m%%d-%%H%%M%%S")
+ if [ ! -d "%{_sharedstatedir}/cobbler/backup/upgrade-${DATE}" ]; then
+ mkdir -p "%{_sharedstatedir}/cobbler/backup/upgrade-${DATE}"
+ fi
+ for i in "config" "snippets" "templates" "triggers" "scripts"; do
+ if [ -d "%{_sharedstatedir}/cobbler/${i}" ]; then
+ cp -r "%{_sharedstatedir}/cobbler/${i}" "%{_sharedstatedir}/cobbler/backup/upgrade-${DATE}"
+ fi
+ done
+ if [ -d %{_sysconfdir}/cobbler ]; then
+ cp -r %{_sysconfdir}/cobbler "%{_sharedstatedir}/cobbler/backup/upgrade-${DATE}"
+ fi
+fi
+
+%post
+%systemd_post cobblerd.service
+# Fixup permission for world readable settings files
+chmod 640 %{_sysconfdir}/cobbler/settings.yaml
+chmod 600 %{_sysconfdir}/cobbler/mongodb.conf
+chmod 600 %{_sysconfdir}/cobbler/modules.conf
+chmod 640 %{_sysconfdir}/cobbler/users.conf
+chmod 640 %{_sysconfdir}/cobbler/users.digest
+chmod 750 %{_sysconfdir}/cobbler/settings.d
+chmod 640 %{_sysconfdir}/cobbler/settings.d/*
+chgrp apache %{_sysconfdir}/cobbler/settings.yaml
+chgrp apache %{_sysconfdir}/cobbler/users.conf
+chgrp apache %{_sysconfdir}/cobbler/users.digest
+chgrp apache %{_sysconfdir}/cobbler/settings.d
+chgrp apache %{_sysconfdir}/cobbler/settings.d/*
+# Change from apache
+if [ -f %{_sharedstatedir}/cobbler/web.ss ]; then
+ chown root %{_sharedstatedir}/cobbler/web.ss
+fi
+
+%posttrans
+# Migrate pre-3.2.1 settings to settings.yaml
+if [ -f %{_sysconfdir}/cobbler/settings.rpmsave ]; then
+ echo warning: migrating old settings to settings.yaml
+ mv %{_sysconfdir}/cobbler/settings.yaml{,.rpmnew}
+ cp -a %{_sysconfdir}/cobbler/settings.{rpmsave,rpmorig}
+ mv %{_sysconfdir}/cobbler/settings.{rpmsave,yaml}
+ %{_datadir}/cobbler/bin/migrate-settings.sh
+fi
+# Add some missing options if needed
+grep -q '^reposync_rsync_flags:' %{_sysconfdir}/cobbler/settings.yaml || echo -e '#ADDED:\nreposync_rsync_flags: "-rltDv --copy-unsafe-links"' >> %{_sysconfdir}/cobbler/settings.yaml
+# Migrate pre-3 configuration data if needed
+if [ -d %{_sharedstatedir}/cobbler/kickstarts -a $(find %{_sharedstatedir}/cobbler/collections -type f | wc -l) -eq 0 ]; then
+ echo warning: migrating pre cobbler 3 configuration data
+ %{_datadir}/cobbler/bin/migrate-data-v2-to-v3.py
+fi
+
+%preun
+%systemd_preun cobblerd.service
+
+%postun
+%systemd_postun_with_restart cobblerd.service
+
+
+%pre selinux
+%selinux_relabel_pre -s %{selinuxtype}
+
+%post selinux
+%selinux_modules_install -s %{selinuxtype} %{_datadir}/selinux/packages/%{selinuxtype}/%{name}.pp.bz2
+%selinux_relabel_post -s %{selinuxtype}
+
+if [ "$1" -le "1" ]; then # First install
+ # the daemon needs to be restarted for the custom label to be applied
+ %systemd_postun_with_restart cobblerd.service
+fi
+
+%postun selinux
+if [ $1 -eq 0 ]; then
+ %selinux_modules_uninstall -s %{selinuxtype} %{name}
+ %selinux_relabel_post -s %{selinuxtype}
+fi
+
+
+%files
+%license COPYING
+%doc AUTHORS.in README.md
+%doc docs/developer-guide.rst docs/quickstart-guide.rst docs/installation-guide.rst
+%dir %{_sysconfdir}/cobbler
+%config(noreplace) %{_sysconfdir}/cobbler/auth.conf
+%config(noreplace) %{_sysconfdir}/cobbler/boot_loader_conf/
+%config(noreplace) %{_sysconfdir}/cobbler/cheetah_macros
+%config(noreplace) %{_sysconfdir}/cobbler/dhcp.template
+%config(noreplace) %{_sysconfdir}/cobbler/dhcp6.template
+%config(noreplace) %{_sysconfdir}/cobbler/dnsmasq.template
+%config(noreplace) %{_sysconfdir}/cobbler/genders.template
+%config(noreplace) %{_sysconfdir}/cobbler/import_rsync_whitelist
+%config(noreplace) %{_sysconfdir}/cobbler/iso/
+%config(noreplace) %{_sysconfdir}/cobbler/logging_config.conf
+%attr(600, root, root) %config(noreplace) %{_sysconfdir}/cobbler/modules.conf
+%attr(600, root, root) %config(noreplace) %{_sysconfdir}/cobbler/mongodb.conf
+%config(noreplace) %{_sysconfdir}/cobbler/named.template
+%config(noreplace) %{_sysconfdir}/cobbler/ndjbdns.template
+%config(noreplace) %{_sysconfdir}/cobbler/reporting/
+%config(noreplace) %{_sysconfdir}/cobbler/rsync.exclude
+%config(noreplace) %{_sysconfdir}/cobbler/rsync.template
+%config(noreplace) %{_sysconfdir}/cobbler/secondary.template
+%attr(640, root, apache) %config(noreplace) %{_sysconfdir}/cobbler/settings.yaml
+%attr(750, root, apache) %dir %{_sysconfdir}/cobbler/settings.d
+%attr(640, root, apache) %config(noreplace) %{_sysconfdir}/cobbler/settings.d/bind_manage_ipmi.settings
+%attr(640, root, apache) %config(noreplace) %{_sysconfdir}/cobbler/settings.d/manage_genders.settings
+%attr(640, root, apache) %config(noreplace) %{_sysconfdir}/cobbler/settings.d/nsupdate.settings
+%attr(640, root, apache) %config(noreplace) %{_sysconfdir}/cobbler/settings.d/windows.settings
+%attr(640, root, apache) %config(noreplace) %{_sysconfdir}/cobbler/users.conf
+%attr(640, root, apache) %config(noreplace) %{_sysconfdir}/cobbler/users.digest
+%config(noreplace) %{_sysconfdir}/cobbler/version
+%config(noreplace) %{_sysconfdir}/cobbler/windows/
+%config(noreplace) %{_sysconfdir}/cobbler/zone.template
+%config(noreplace) %{_sysconfdir}/cobbler/zone_templates/
+%config(noreplace) %{_sysconfdir}/logrotate.d/cobblerd
+%config(noreplace) /etc/httpd/conf.d/cobbler.conf
+%{_bindir}/cobbler
+%{_bindir}/cobbler-settings
+%{_bindir}/cobbler-ext-nodes
+%{_bindir}/cobblerd
+%{_datadir}/bash-completion/
+%dir %{_datadir}/cobbler
+%{_datadir}/cobbler/bin
+%{_mandir}/man1/cobbler.1*
+%{_mandir}/man5/cobbler.conf.5*
+%{_mandir}/man8/cobblerd.8*
+%{python3_sitelib}/cobbler/
+%{python3_sitelib}/cobbler*.egg-info
+%{_unitdir}/cobblerd.service
+%{tftpboot_dir}/*
+/var/www/cobbler
+%dir %{_sharedstatedir}/cobbler
+%ghost %attr(0755,root,root) %{_sharedstatedir}/cobbler/backup/
+%config(noreplace) %{_sharedstatedir}/cobbler/collections/
+%config(noreplace) %{_sharedstatedir}/cobbler/distro_signatures.json
+%config(noreplace) %{_sharedstatedir}/cobbler/grub_config/
+%config(noreplace) %{_sharedstatedir}/cobbler/loaders/
+%config(noreplace) %{_sharedstatedir}/cobbler/scripts/
+%config(noreplace) %{_sharedstatedir}/cobbler/snippets/
+%config(noreplace) %{_sharedstatedir}/cobbler/templates/
+%config(noreplace) %{_sharedstatedir}/cobbler/triggers/
+%ghost %attr(0644,root,root) %{_sharedstatedir}/cobbler/lock
+# Currently used for cli auth
+%ghost %attr(0644,root,root) %{_sharedstatedir}/cobbler/web.ss
+/var/log/cobbler
+
+%files selinux
+%{_datadir}/selinux/packages/%{selinuxtype}/%{name}.pp.*
+%{_datadir}/selinux/devel/include/distributed/%{name}.if
+%ghost %verify(not md5 size mode mtime) %{_sharedstatedir}/selinux/%{selinuxtype}/active/modules/200/%{name}
+
+%files tests
+%{_datadir}/cobbler/tests/
+
+%files tests-containers
+%{_datadir}/cobbler/docker/
+
+
+%changelog
+* Wed Mar 19 2025 YanZhicong <mryanzhicong@163.com> - 3.3.7-4
+- add the mkgrub.sh
+
+* Wed Mar 19 2025 YanZhicong <mryanzhicong@163.com> - 3.3.7-3
+- modify the templates/etc/dhcp.template
+
+* Wed Mar 19 2025 YanZhicong <mryanzhicong@163.com> - 3.3.7-2
+- adapt to openEuler
+
+* Sun Nov 17 2024 Orion Poplawski <orion@nwra.com> - 3.3.7-1
+- Update to 3.3.7 (CVE-2024-47533)
diff --git a/cobbler.te b/cobbler.te
new file mode 100644
index 0000000..96bdec4
--- /dev/null
+++ b/cobbler.te
@@ -0,0 +1,243 @@
+policy_module(cobbler, 1.3.0)
+
+########################################
+#
+# Declarations
+#
+
+## <desc>
+## <p>
+## Determine whether Cobbler can modify
+## public files used for public file
+## transfer services.
+## </p>
+## </desc>
+gen_tunable(cobbler_anon_write, false)
+
+## <desc>
+## <p>
+## Determine whether Cobbler can connect
+## to the network using TCP.
+## </p>
+## </desc>
+gen_tunable(cobbler_can_network_connect, false)
+
+## <desc>
+## <p>
+## Determine whether Cobbler can access
+## cifs file systems.
+## </p>
+## </desc>
+gen_tunable(cobbler_use_cifs, false)
+
+## <desc>
+## <p>
+## Determine whether Cobbler can access
+## nfs file systems.
+## </p>
+## </desc>
+gen_tunable(cobbler_use_nfs, false)
+
+gen_require(`
+ type debuginfo_exec_t;
+ type init_exec_t;
+ class file getattr;
+')
+
+type cobblerd_t;
+type cobblerd_exec_t;
+init_daemon_domain(cobblerd_t, cobblerd_exec_t)
+
+type cobblerd_initrc_exec_t;
+init_script_file(cobblerd_initrc_exec_t)
+
+type cobbler_etc_t;
+files_config_file(cobbler_etc_t)
+
+type cobbler_var_log_t;
+logging_log_file(cobbler_var_log_t)
+
+type cobbler_var_lib_t alias cobbler_content_t;
+files_type(cobbler_var_lib_t)
+
+type cobbler_tmp_t;
+files_tmp_file(cobbler_tmp_t)
+
+type cobblerd_unit_file_t;
+systemd_unit_file(cobblerd_unit_file_t)
+
+########################################
+#
+# Local policy
+#
+
+allow cobblerd_t self:capability { chown dac_read_search fowner fsetid sys_nice };
+dontaudit cobblerd_t self:capability sys_tty_config;
+allow cobblerd_t self:process { getsched setsched signal };
+allow cobblerd_t self:fifo_file rw_fifo_file_perms;
+allow cobblerd_t self:tcp_socket { accept listen };
+allow cobblerd_t self:netlink_audit_socket create_socket_perms;
+
+allow cobblerd_t cobbler_etc_t:dir list_dir_perms;
+allow cobblerd_t cobbler_etc_t:file read_file_perms;
+allow cobblerd_t cobbler_etc_t:lnk_file read_lnk_file_perms;
+
+allow cobblerd_t cobbler_tmp_t:file mmap_file_perms;
+# Allow cobbler to stat /usr/libexec/dnf-utils (aka reposync/yumdownloader)
+allow cobblerd_t debuginfo_exec_t:file getattr;
+# Allow cobbler to stat /usr/lib/systemd/systemd
+allow cobblerd_t init_exec_t:file getattr;
+# Allow cobbler to check status of itself
+allow cobblerd_t cobblerd_unit_file_t:service status;
+
+manage_dirs_pattern(cobblerd_t, cobbler_tmp_t, cobbler_tmp_t)
+manage_files_pattern(cobblerd_t, cobbler_tmp_t, cobbler_tmp_t)
+files_tmp_filetrans(cobblerd_t, cobbler_tmp_t, { dir file })
+
+manage_dirs_pattern(cobblerd_t, cobbler_var_lib_t, cobbler_var_lib_t)
+manage_files_pattern(cobblerd_t, cobbler_var_lib_t, cobbler_var_lib_t)
+manage_lnk_files_pattern(cobblerd_t, cobbler_var_lib_t, cobbler_var_lib_t)
+files_var_lib_filetrans(cobblerd_t, cobbler_var_lib_t, dir)
+files_var_filetrans(cobblerd_t, cobbler_var_lib_t, dir, "cobbler")
+
+append_files_pattern(cobblerd_t, cobbler_var_log_t, cobbler_var_log_t)
+create_files_pattern(cobblerd_t, cobbler_var_log_t, cobbler_var_log_t)
+read_files_pattern(cobblerd_t, cobbler_var_log_t, cobbler_var_log_t)
+setattr_files_pattern(cobblerd_t, cobbler_var_log_t, cobbler_var_log_t)
+logging_log_filetrans(cobblerd_t, cobbler_var_log_t, file)
+
+kernel_read_system_state(cobblerd_t)
+kernel_read_network_state(cobblerd_t)
+
+corecmd_exec_bin(cobblerd_t)
+corecmd_exec_shell(cobblerd_t)
+
+corenet_all_recvfrom_netlabel(cobblerd_t)
+corenet_all_recvfrom_unlabeled(cobblerd_t)
+corenet_tcp_sendrecv_generic_if(cobblerd_t)
+corenet_tcp_sendrecv_generic_node(cobblerd_t)
+corenet_tcp_bind_generic_node(cobblerd_t)
+
+corenet_sendrecv_cobbler_server_packets(cobblerd_t)
+corenet_tcp_bind_cobbler_port(cobblerd_t)
+corenet_tcp_sendrecv_cobbler_port(cobblerd_t)
+
+corenet_sendrecv_ftp_client_packets(cobblerd_t)
+corenet_tcp_connect_ftp_port(cobblerd_t)
+corenet_tcp_sendrecv_ftp_port(cobblerd_t)
+
+corenet_tcp_sendrecv_http_port(cobblerd_t)
+corenet_tcp_connect_http_port(cobblerd_t)
+corenet_sendrecv_http_client_packets(cobblerd_t)
+
+dev_read_sysfs(cobblerd_t)
+dev_read_urand(cobblerd_t)
+
+files_list_boot(cobblerd_t)
+files_list_tmp(cobblerd_t)
+files_read_boot_files(cobblerd_t)
+files_read_etc_runtime_files(cobblerd_t)
+
+fs_getattr_all_fs(cobblerd_t)
+fs_read_iso9660_files(cobblerd_t)
+
+selinux_get_enforce_mode(cobblerd_t)
+
+term_use_console(cobblerd_t)
+
+auth_use_nsswitch(cobblerd_t)
+
+logging_send_syslog_msg(cobblerd_t)
+
+miscfiles_read_localization(cobblerd_t)
+miscfiles_read_public_files(cobblerd_t)
+
+sysnet_dns_name_resolve(cobblerd_t)
+sysnet_rw_dhcp_config(cobblerd_t)
+sysnet_write_config(cobblerd_t)
+
+tunable_policy(`cobbler_anon_write',`
+ miscfiles_manage_public_files(cobblerd_t)
+')
+
+tunable_policy(`cobbler_can_network_connect',`
+ corenet_sendrecv_all_client_packets(cobblerd_t)
+ corenet_tcp_connect_all_ports(cobblerd_t)
+ corenet_tcp_sendrecv_all_ports(cobblerd_t)
+')
+
+tunable_policy(`cobbler_use_cifs',`
+ fs_manage_cifs_dirs(cobblerd_t)
+ fs_manage_cifs_files(cobblerd_t)
+ fs_manage_cifs_symlinks(cobblerd_t)
+')
+
+tunable_policy(`cobbler_use_nfs',`
+ fs_manage_nfs_dirs(cobblerd_t)
+ fs_manage_nfs_files(cobblerd_t)
+ fs_manage_nfs_symlinks(cobblerd_t)
+')
+
+optional_policy(`
+ apache_search_config(cobblerd_t)
+ apache_domtrans(cobblerd_t)
+ apache_search_sys_content(cobblerd_t)
+')
+
+optional_policy(`
+ bind_read_config(cobblerd_t)
+ bind_write_config(cobblerd_t)
+ bind_domtrans_ndc(cobblerd_t)
+ bind_domtrans(cobblerd_t)
+ bind_initrc_domtrans(cobblerd_t)
+ bind_manage_zone(cobblerd_t)
+ bind_systemctl(cobblerd_t)
+')
+
+optional_policy(`
+ certmaster_exec(cobblerd_t)
+')
+
+optional_policy(`
+ dhcpd_domtrans(cobblerd_t)
+ dhcpd_initrc_domtrans(cobblerd_t)
+ dhcpd_systemctl(cobblerd_t)
+')
+
+optional_policy(`
+ dnsmasq_domtrans(cobblerd_t)
+ dnsmasq_initrc_domtrans(cobblerd_t)
+ dnsmasq_write_config(cobblerd_t)
+ dnsmasq_systemctl(cobblerd_t)
+')
+
+# To run mkfs.fat when generating ISO
+optional_policy(`
+ fstools_exec(cobblerd_t)
+')
+
+optional_policy(`
+ libs_exec_ldconfig(cobblerd_t)
+')
+
+optional_policy(`
+ mysql_stream_connect(cobblerd_t)
+')
+
+optional_policy(`
+ rpm_exec(cobblerd_t)
+')
+
+optional_policy(`
+ rsync_exec(cobblerd_t)
+ rsync_read_config(cobblerd_t)
+ rsync_manage_config(cobblerd_t)
+ rsync_etc_filetrans_config(cobblerd_t, file, "rsync.conf")
+')
+
+optional_policy(`
+ tftp_manage_config(cobblerd_t)
+ tftp_manage_rw_content(cobblerd_t)
+ tftp_delete_content_dirs(cobblerd_t)
+ tftp_filetrans_tftpdir(cobblerd_t, cobbler_var_lib_t, { dir file })
+')
diff --git a/migrate-settings.sh b/migrate-settings.sh
new file mode 100644
index 0000000..6ef3c1a
--- /dev/null
+++ b/migrate-settings.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+sed -i -e 's,^default_kickstart: */var/lib/cobbler/kickstarts,default_autoinstall: /var/lib/cobbler/templates,' \
+ -e '/^\(consoles\|func_\|kernel_options_s390x\|power_template_dir\|pxe_template_dir\|redhat_management_type\|snippetsdir\|template_remote_kickstarts\):/s/^/# REMOVED: /' \
+ -e '$a#ADDED:' -e '$acache_enabled: true' -e '$areposync_rsync_flags: "-rltDv --copy-unsafe-links"' /etc/cobbler/settings.yaml
diff --git a/mkgrub.sh b/mkgrub.sh
new file mode 100644
index 0000000..7e8bdd7
--- /dev/null
+++ b/mkgrub.sh
@@ -0,0 +1,97 @@
+#!/bin/bash
+
+# DISTRO directory overrides. Pass these vars in from outside:
+# export SYSLINUX_DIR=/usr/share/...;./mkgrub.sh
+[[ -z "$SYSLINUX_DIR" ]] && SYSLINUX_DIR="/usr/share/syslinux"
+[[ -z "$GRUB2_MOD_DIR" ]] && GRUB2_MOD_DIR="/usr/lib/grub"
+
+BOOTLOADERS_DIR="/var/lib/cobbler/loaders"
+TARGETS="arm64-efi i386-pc-pxe powerpc-ieee1275 x86_64-efi"
+
+rm -rf "${BOOTLOADERS_DIR}/.cobbler_postun_cleanup"
+
+# grub2 internal executable naming
+# aarch64 => grubaa64.efi
+# x86_64 => grubx64.efi
+# i386/i686 => bootia32.efi
+# IA64 => bootia64.efi
+# arm => bootarm.efi
+
+FS_MODULES="btrfs ext2 xfs jfs reiserfs"
+CD_MODULES=" all_video boot cat configfile echo true \
+ font gfxmenu gfxterm gzio halt iso9660 \
+ jpeg minicmd normal part_apple part_msdos part_gpt \
+ password_pbkdf2 png reboot search search_fs_uuid \
+ search_fs_file search_label sleep test video fat loadenv linux"
+PXE_MODULES="tftp http"
+CRYPTO_MODULES="luks gcry_rijndael gcry_sha1 gcry_sha256"
+MISC_MODULES="mdraid09 mdraid1x lvm serial regexp tr"
+
+TARGET_EXTRA_MODULES=""
+
+function link_loader
+{
+ local T="$1"
+ local L="$2"
+
+ if [[ -e "$T" ]] && [[ ! -e "${BOOTLOADERS_DIR}/$L" ]];then
+ set -x
+ ln -s "$T" "${BOOTLOADERS_DIR}/$L"
+ set +x
+ # Remember links for later deletion/cleanups
+ echo "$L" >> "${BOOTLOADERS_DIR}/.cobbler_postun_cleanup"
+ fi
+}
+
+
+mkdir -p "${BOOTLOADERS_DIR}/grub"
+for TARGET in $TARGETS;do
+ TARGET_MOD_DIR="$TARGET"
+ case $TARGET in
+ i386-pc-pxe)
+ # Name the x86 PXE executble with .0 in the end
+ # pxelinux.0 only wants to chainload bootloaders ending with .0
+ BINARY="grub.0"
+ TARGET_EXTRA_MODULES="chain pxe biosdisk"
+ # For i386-pc-pxe target the modules dir still is i386-pc
+ TARGET_MOD_DIR="i386-pc"
+ ;;
+ x86_64-efi)
+ TARGET_EXTRA_MODULES="chain efinet"
+ BINARY="grubx64.efi"
+ ;;
+ arm64-efi)
+ TARGET_EXTRA_MODULES="efinet"
+ BINARY="grubaa64.efi"
+ ;;
+ powerpc-ieee1275)
+ TARGET_EXTRA_MODULES="net ofnet"
+ BINARY="grub.ppc64le"
+ ;;
+ esac
+ GRUB_MODULES="${CD_MODULES} ${FS_MODULES} ${PXE_MODULES} ${CRYPTO_MODULES} ${MISC_MODULES} ${TARGET_EXTRA_MODULES}"
+ [ "$TARGET" == "x86_64-efi" ] && GRUB_MODULES=$(for file in $(ls /usr/lib/grub/x86_64-efi/*.mod); do basename ${file} | sed "s/\.mod//"; done)
+ MODULE_DIR="${GRUB2_MOD_DIR}/${TARGET_MOD_DIR}"
+ set -x
+ grub2-mkimage -O ${TARGET} -o "${BOOTLOADERS_DIR}/grub/${BINARY}" --prefix= ${GRUB_MODULES}
+ set +x
+ echo "grub2/${BINARY}" >> "${BOOTLOADERS_DIR}/.cobbler_postun_cleanup"
+ if [[ -e "$MODULE_DIR" ]] && [[ ! -e "${BOOTLOADERS_DIR}/grub/$TARGET_MOD_DIR" ]];then
+ set -x
+ ln -s "$MODULE_DIR" "${BOOTLOADERS_DIR}/grub/$TARGET_MOD_DIR"
+ set +x
+ echo "$TARGET_MOD_DIR" >> "${BOOTLOADERS_DIR}/.cobbler_postun_cleanup"
+ fi
+
+done
+
+link_loader "/usr/share/efi/x86_64/shim.efi" "grub/shim.efi"
+link_loader "/usr/share/efi/x86_64/grub.efi" "grub/grub.efi"
+link_loader "${SYSLINUX_DIR}/pxelinux.0" "pxelinux.0"
+link_loader "${SYSLINUX_DIR}/menu.c32" "menu.c32"
+link_loader "${SYSLINUX_DIR}/ldlinux.c32" "ldlinux.c32"
+link_loader "${SYSLINUX_DIR}/memdisk" "memdisk"
+# ToDo: Do this properly if still used
+link_loader "/usr/share/*pxe/undionly.kpxe" "undionly.pxe"
+link_loader "${SYSLINUX_DIR}/lpxelinux.0" "lpxelinux.0"
+link_loader "${SYSLINUX_DIR}/libutil.c32" "libutil.c32"
diff --git a/sources b/sources
new file mode 100644
index 0000000..f5cab12
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+58a8aeaa6f8c41e320d7e8f96531816c cobbler-3.3.7.tar.gz