diff --git a/make-ipxe-binary-source-configureable.patch b/make-ipxe-binary-source-configureable.patch new file mode 100644 index 0000000..a570ea3 --- /dev/null +++ b/make-ipxe-binary-source-configureable.patch @@ -0,0 +1,163 @@ +From 32ab50f299502fce7bf588852a75c63cf3332cf8 Mon Sep 17 00:00:00 2001 +From: Christian Goll +Date: Fri, 20 Jan 2023 15:05:42 +0100 +Subject: [PATCH] make ipxe binary source configureable + +--- + internal/pkg/buildconfig/defaults.go | 2 +- + internal/pkg/configure/tftp.go | 17 ++++++++++------- + internal/pkg/overlay/datastructure.go | 2 ++ + internal/pkg/warewulfconf/constructors.go | 12 ++++++++++-- + internal/pkg/warewulfconf/datastructure.go | 2 ++ + overlays/host/etc/dhcp/dhcpd.conf.ww | 14 +++++--------- + 6 files changed, 30 insertions(+), 19 deletions(-) + +diff --git a/internal/pkg/buildconfig/defaults.go b/internal/pkg/buildconfig/defaults.go +index 24cb2d40..17baecba 100644 +--- a/internal/pkg/buildconfig/defaults.go ++++ b/internal/pkg/buildconfig/defaults.go +@@ -27,7 +27,7 @@ func BINDIR() string { + } + + func DATADIR() string { +- wwlog.Debug("DATADIR = '%s'", bindir) ++ wwlog.Debug("DATADIR = '%s'", datadir) + return datadir + } + +diff --git a/internal/pkg/configure/tftp.go b/internal/pkg/configure/tftp.go +index d321f023..842d7fb4 100644 +--- a/internal/pkg/configure/tftp.go ++++ b/internal/pkg/configure/tftp.go +@@ -11,9 +11,8 @@ import ( + "github.com/hpcng/warewulf/internal/pkg/wwlog" + ) + +-var tftpdir string = path.Join(buildconfig.TFTPDIR(), "warewulf") +- + func TFTP() error { ++ var tftpdir string = path.Join(buildconfig.TFTPDIR(), "warewulf") + controller, err := warewulfconf.New() + if err != nil { + wwlog.Error("%s", err) +@@ -27,11 +26,15 @@ func TFTP() error { + } + + fmt.Printf("Writing PXE files to: %s\n", tftpdir) +- for _, f := range [4]string{"x86_64.efi", "x86_64.kpxe", "arm64.efi"} { +- err = util.SafeCopyFile(path.Join(buildconfig.DATADIR(), "warewulf", "ipxe", f), path.Join(tftpdir, f)) ++ copyCheck := make(map[string]bool) ++ for _, f := range controller.Tftp.IpxeBinaries { ++ if copyCheck[f] { ++ continue ++ } ++ copyCheck[f] = true ++ err = util.SafeCopyFile(path.Join(buildconfig.DATADIR(), f), path.Join(tftpdir, f)) + if err != nil { +- wwlog.Error("%s", err) +- return err ++ wwlog.Warn("ipxe binary could not be copied, not booting may not work: %s", err) + } + } + +@@ -39,7 +42,7 @@ func TFTP() error { + wwlog.Info("Warewulf does not auto start TFTP services due to disable by warewulf.conf") + os.Exit(0) + } +- ++ + fmt.Printf("Enabling and restarting the TFTP services\n") + err = util.SystemdStart(controller.Tftp.SystemdName) + if err != nil { +diff --git a/internal/pkg/overlay/datastructure.go b/internal/pkg/overlay/datastructure.go +index 2a427bee..eb8004cf 100644 +--- a/internal/pkg/overlay/datastructure.go ++++ b/internal/pkg/overlay/datastructure.go +@@ -31,6 +31,7 @@ type TemplateStruct struct { + Dhcp warewulfconf.DhcpConf + Nfs warewulfconf.NfsConf + Warewulf warewulfconf.WarewulfConf ++ Tftp warewulfconf.TftpConf + AllNodes []node.NodeInfo + node.NodeConf + // backward compatiblity +@@ -64,6 +65,7 @@ func InitStruct(nodeInfo node.NodeInfo) TemplateStruct { + tstruct.AllNodes = allNodes + tstruct.Nfs = *controller.Nfs + tstruct.Dhcp = *controller.Dhcp ++ tstruct.Tftp = *controller.Tftp + tstruct.Warewulf = *controller.Warewulf + tstruct.Ipaddr = controller.Ipaddr + tstruct.Ipaddr6 = controller.Ipaddr6 +diff --git a/internal/pkg/warewulfconf/constructors.go b/internal/pkg/warewulfconf/constructors.go +index 1d68564a..904d0d31 100644 +--- a/internal/pkg/warewulfconf/constructors.go ++++ b/internal/pkg/warewulfconf/constructors.go +@@ -36,8 +36,14 @@ func New() (ControllerConf, error) { + ret.Tftp = &tftpconf + ret.Nfs = &nfsConf + err := defaults.Set(&ret) ++ // ipxe binaries are merged not overwritten, store defaults separate ++ defIpxe := make(map[string]string) ++ for k, v := range ret.Tftp.IpxeBinaries { ++ defIpxe[k] = v ++ delete(ret.Tftp.IpxeBinaries, k) ++ } + if err != nil { +- wwlog.Error("Coult initialize default variables") ++ wwlog.Error("Could initialize default variables") + return ret, err + } + // Check if cached config is old before re-reading config file +@@ -53,7 +59,9 @@ func New() (ControllerConf, error) { + if err != nil { + return ret, err + } +- ++ if len(ret.Tftp.IpxeBinaries) == 0 { ++ ret.Tftp.IpxeBinaries = defIpxe ++ } + if ret.Ipaddr == "" || ret.Netmask == "" { + conn, error := net.Dial("udp", "8.8.8.8:80") + if error != nil { +diff --git a/internal/pkg/warewulfconf/datastructure.go b/internal/pkg/warewulfconf/datastructure.go +index c3eebf8c..eb195a2e 100644 +--- a/internal/pkg/warewulfconf/datastructure.go ++++ b/internal/pkg/warewulfconf/datastructure.go +@@ -44,6 +44,8 @@ type TftpConf struct { + Enabled bool `yaml:"enabled" default:"true"` + TftpRoot string `yaml:"tftproot" default:"/var/lib/tftpboot"` + SystemdName string `yaml:"systemd name" default:"tftp"` ++ // Path is relative to buildconfig.DATADIR() ++ IpxeBinaries map[string]string `yaml:"ipxe" default:"{\"00:09\": \"x86_64.efi\",\"00:00\": \"x86_64.kpxe\",\"00:0B\": \"arm64.efi\",\"00:07\": \"x86_64.efi\"}"` + } + + type NfsConf struct { +diff --git a/overlays/host/etc/dhcp/dhcpd.conf.ww b/overlays/host/etc/dhcp/dhcpd.conf.ww +index 82b96cec..66b9d22e 100644 +--- a/overlays/host/etc/dhcp/dhcpd.conf.ww ++++ b/overlays/host/etc/dhcp/dhcpd.conf.ww +@@ -20,15 +20,11 @@ option architecture-type code 93 = unsigned integer 16; + if exists user-class and option user-class = "iPXE" { + filename "http://{{$.Ipaddr}}:{{$.Warewulf.Port}}/ipxe/${mac:hexhyp}"; + } else { +- if option architecture-type = 00:0B { +- filename "/warewulf/arm64.efi"; +- } elsif option architecture-type = 00:09 { +- filename "/warewulf/x86_64.efi"; +- } elsif option architecture-type = 00:07 { +- filename "/warewulf/x86_64.efi"; +- } elsif option architecture-type = 00:00 { +- filename "/warewulf/x86_64.kpxe"; +- } ++{{range $type,$name := $.Tftp.IpxeBinaries }} ++ if option architecture-type = {{ $type }} { ++ filename "/warewulf/{{ $name }}"; ++ } ++{{ end }} + } + + {{if eq .Dhcp.Template "static" -}} +-- +2.39.0 + diff --git a/warewulf4.changes b/warewulf4.changes index 8dd6d97..03249e2 100644 --- a/warewulf4.changes +++ b/warewulf4.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Tue Jan 24 11:17:32 UTC 2023 - Christian Goll + +- added make-ipxe-binary-source-configureable.patch + ------------------------------------------------------------------- Thu Jan 19 11:13:58 UTC 2023 - Christian Goll diff --git a/warewulf4.spec b/warewulf4.spec index 658f741..c5a966e 100644 --- a/warewulf4.spec +++ b/warewulf4.spec @@ -30,7 +30,7 @@ URL: https://warewulf.org Source0: https://github.com/hpcng/warewulf/archive/v%{version}%{?rls_cndt}.tar.gz#/warewulf4-v%{version}.tar.gz Source1: vendor.tar.gz Source3: warewulf4-rpmlintrc -#Patch1: upstream.patch +Patch1: make-ipxe-binary-source-configureable.patch # no firewalld in sle12 %if 0%{?sle_version} >= 150000 || 0%{?suse_version} > 1500 @@ -44,12 +44,16 @@ BuildRequires: make BuildRequires: munge BuildRequires: sysuser-tools BuildRequires: tftp +BuildRequires: yq BuildRoot: %{_tmppath}/%{name}-%{version}-build -Requires: %{name}-ipxe = %{version} +#Requires: %{name}-ipxe = %{version} Requires: %{name}-overlay = %{version} -Requires: dhcp-server -Requires: ipmitool -Requires: nfs-kernel-server +Recommends: dhcp-server +Recommends: ipmitool +Recommends: ipxe-bootimgs +Recommends: ipxe-bootimgs +Recommends: nfs-kernel-server +Recommends: tftp %{go_nostrip} @@ -77,13 +81,13 @@ Summary: Contains the service for the warewulf rest API Containts the binaries for the access of warewulf through a rest API and from the commandline from an external host. %package ipxe -Requires: tftp Summary: Binaries of iPXE for ww4 installation BuildArch: noarch %description ipxe For the boot of the nodes iPXE binaries are needed. As these package includes these files for x86, i386 and ARM. +These are the binaries from the upstream project. %package slurm Summary: Configuration template for slurm @@ -106,7 +110,7 @@ make %{?_smp_mflags} genconfig \ PREFIX=%{_prefix} \ BINDIR=%{_bindir} \ SYSCONFDIR=%{_sysconfdir} \ - DATADIR=%{_datadir} \ + DATADIR=%{_datadir}/ipxe \ LOCALSTATEDIR=%{_datadir} \ SHAREDSTATEDIR=%{_sharedstatedir} \ MANDIR=%{_mandir} \ @@ -136,6 +140,15 @@ mv -v %{buildroot}%{_sysconfdir}/bash_completion.d/warewulf %{buildroot}%{_datad #cp %{S:2} %{buildroot}%{_sysconfdir}/warewulf/warewulf.conf #rm -rf %{buildroot}%{_datadir}/warewulf/ipxe rm -f %{buildroot}/usr/share/doc/packages/warewulf/LICENSE.md +rm -rf %{buildroot}%{_localstatedir}/lib/warewulf +# use ipxe-bootimgs images +yq e ' + .tftp.ipxe."00:00" = "undionly.kpxe" | + .tftp.ipxe."00:07" = "ipxe-x86_64.efi" | + .tftp.ipxe."00:09" = "ipxe-x86_64.efi" | + .tftp.ipxe."00:0B" = "snp-arm64.efi"'\ + -i %{buildroot}%{_sysconfdir}/warewulf/warewulf.conf +sed -i 's@\(^\s*\)\(.*:.*\):@\1"\2":@' %{buildroot}%{_sysconfdir}/warewulf/warewulf.conf # create systemuser echo "u warewulf -" > system-user-%{name}.conf @@ -144,15 +157,15 @@ echo "g warewulf -" >> system-user-%{name}.conf install -D -m 644 system-user-%{name}.conf %{buildroot}%{_sysusersdir}/system-user-%{name}.conf # get the slurm package readay -mkdir -p %{buildroot}%{_localstatedir}/lib/warewulf/overlays/host/etc/slurm -mv %{buildroot}%{_sysconfdir}/warewulf/examples/slurm.conf.ww %{buildroot}%{_localstatedir}/lib/warewulf/overlays/host/etc/slurm -mkdir -p %{buildroot}%{_localstatedir}/lib/warewulf/overlays/generic/etc/munge -cat > %{buildroot}%{_localstatedir}/lib/warewulf/overlays/generic/etc/munge/munge.key.ww < %{buildroot}%{_datadir}/warewulf/overlays/generic/etc/munge/munge.key.ww < %{buildroot}%{_localstatedir}/lib/warewulf/overlays/generic/etc/slurm/slurm.conf.ww < %{buildroot}%{_datadir}/warewulf/overlays/generic/etc/slurm/slurm.conf.ww <