diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | 0001-adapt-to-openEuler.patch | 173 | ||||
-rw-r--r-- | 0001-modify-the-templates-etc-dhcp.template.patch | 31 | ||||
-rw-r--r-- | cobbler-nocov.patch | 41 | ||||
-rw-r--r-- | cobbler.fc | 28 | ||||
-rw-r--r-- | cobbler.if | 251 | ||||
-rw-r--r-- | cobbler.spec | 344 | ||||
-rw-r--r-- | cobbler.te | 243 | ||||
-rw-r--r-- | migrate-settings.sh | 4 | ||||
-rw-r--r-- | mkgrub.sh | 97 | ||||
-rw-r--r-- | sources | 1 |
11 files changed, 1214 insertions, 0 deletions
@@ -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" @@ -0,0 +1 @@ +58a8aeaa6f8c41e320d7e8f96531816c cobbler-3.3.7.tar.gz |