From 4753953ed01e65d1cb519f83e5cc4f1177b16ac4 Mon Sep 17 00:00:00 2001 From: rajib-dutta1 <105753715+rajib-dutta1@users.noreply.github.com> Date: Mon, 26 Feb 2024 17:49:06 -0800 Subject: [PATCH] Ipmitool bookworm: Fix and patch enterprise-numbers URL (#17878) ### Why I did it ipmitool utility is used to access various HW sensors. Some platforms use "ipmitool raw " to read specific addresses. ipmitool_1.8.19-4_amd64.deb, that is part of bookworm has a defect. The package is missing file enterprise.txt that is expected by the "raw read" code path. It is so because the file the .deb tries to download at the build time does not have the necessary extension as it is available on remote server: https://www.iana.org/assignments/enterprise-numbers.txt ### How I did it The defect had been fixed using coding changes in next unstable version of Linux. It is expected to be available in future stable version of the OS. Hence to keep the changes to minimal, the .dsc file is downloaded and only the Makefile is modified to download the correct file. To make is work as patch necessary changes are made. #### How to verify it Build log is attached and installation of the file is noted line #2274 When using vanilla bookworm on platforms like 5212 or 5224: ------------------------------------------------------------------- root@sonic:~# ipmitool raw 0x04 0x2d 0x31 IANA PEN registry open failed: No such file or directory 00 c0 01 80 When fixed we should not see the above error: -------------------------------------------------- root@sonic:/home/admin# ipmitool raw 0x04 0x2d 0x31 00 c0 00 80 ### Description for the changelog This change is to address ipmitool raw read issue. This patch must be removed once it is available in next stable Linux release that contains the fix. https://github.com/ipmitool/ipmitool/commit/1edb0e27e44196d1ebe449aba0b9be22d376bcb6 --- build_debian.sh | 1 - .../build_templates/sonic_debian_extension.j2 | 4 + rules/ipmitool.dep | 11 ++ rules/ipmitool.mk | 17 +++ slave.mk | 1 + src/ipmitool/Makefile | 28 +++++ ...ges-needed-to-install-enterprise.txt.patch | 113 ++++++++++++++++++ src/ipmitool/patch/series | 1 + 8 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 rules/ipmitool.dep create mode 100644 rules/ipmitool.mk create mode 100644 src/ipmitool/Makefile create mode 100644 src/ipmitool/patch/0001-Changes-needed-to-install-enterprise.txt.patch create mode 100644 src/ipmitool/patch/series diff --git a/build_debian.sh b/build_debian.sh index c507275d11..65966f4a96 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -377,7 +377,6 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in mtr-tiny \ locales \ cgroup-tools \ - ipmitool \ ndisc6 \ makedumpfile \ conntrack \ diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 3dc242cc79..e0bd1242d9 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -101,6 +101,10 @@ sudo mkdir -p $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/ifupdown2_*.deb || \ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f +# Install a patched version of ipmitool (and its dependencies via 'apt-get -y install -f') +sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/ipmitool_*.deb || \ + sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y install -f + # Install a patched version of ntp (and its dependencies via 'apt-get -y install -f') sudo dpkg --root=$FILESYSTEM_ROOT --force-confdef --force-confold -i $debs_path/ntp_*.deb || \ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y \ diff --git a/rules/ipmitool.dep b/rules/ipmitool.dep new file mode 100644 index 0000000000..7643d2477b --- /dev/null +++ b/rules/ipmitool.dep @@ -0,0 +1,11 @@ + +SPATH := $($(IPMITOOL)_SRC_PATH) +DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/ipmitool.mk rules/ipmitool.dep +DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST) +DEP_FILES += $(shell git ls-files $(SPATH)) + +$(IPMITOOL)_CACHE_MODE := GIT_CONTENT_SHA +$(IPMITOOL)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) +$(IPMITOOL)_DEP_FILES := $(DEP_FILES) + + diff --git a/rules/ipmitool.mk b/rules/ipmitool.mk new file mode 100644 index 0000000000..aad6fea3a8 --- /dev/null +++ b/rules/ipmitool.mk @@ -0,0 +1,17 @@ +# ipmitool packages +IPMITOOL_VERSION = 1.8.19 +IPMITOOL_VERSION_SUFFIX = 4 +IPMITOOL_VERSION_FULL = $(IPMITOOL_VERSION)-$(IPMITOOL_VERSION_SUFFIX) +IPMITOOL = ipmitool_$(IPMITOOL_VERSION_FULL)_$(CONFIGURED_ARCH).deb +$(IPMITOOL)_SRC_PATH = $(SRC_PATH)/ipmitool +SONIC_MAKE_DEBS += $(IPMITOOL) +IPMITOOL_DBG = ipmitool-dbgsym_$(IPMITOOL_VERSION_FULL)_$(CONFIGURED_ARCH).deb +$(eval $(call add_derived_package,$(IPMITOOL),$(IPMITOOL_DBG))) +DBG_SRC_ARCHIVE += ipmitool +# The .c, .cpp, .h & .hpp files under src/{$DBG_SRC_ARCHIVE list} +# are archived into debug one image to facilitate debugging. +# Export these variables so they can be used in a sub-make +export IPMITOOL_VERSION +export IPMITOOL_VERSION_FULL +export IPMITOOL +export IPMITOOL_DBG diff --git a/slave.mk b/slave.mk index 8473b2b3e7..32e88c2b67 100644 --- a/slave.mk +++ b/slave.mk @@ -1356,6 +1356,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ $(LINUX_KERNEL) \ $(SONIC_DEVICE_DATA) \ $(IFUPDOWN2) \ + $(IPMITOOL) \ $(KDUMP_TOOLS) \ $(LIBPAM_RADIUS) \ $(LIBNSS_RADIUS) \ diff --git a/src/ipmitool/Makefile b/src/ipmitool/Makefile new file mode 100644 index 0000000000..dc8b9c05ca --- /dev/null +++ b/src/ipmitool/Makefile @@ -0,0 +1,28 @@ +.ONESHELL: +SHELL = /bin/bash +.SHELLFLAGS += -e + +MAIN_TARGET = $(IPMITOOL) +DERIVED_TARGETS = $(IPMITOOL_DBG) + +$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : + # Remove any stale files + rm -rf ./ipmitool-$(IPMITOOL_VERSION) ./ipmitool*.{deb,udeb,dsc,gz,xz} + # Obtain ipmitool + dget https://deb.debian.org/debian/pool/main/i/ipmitool/ipmitool_$(IPMITOOL_VERSION_FULL).dsc + # Build source and Debian packages + pushd ipmitool-$(IPMITOOL_VERSION) + + git init + git add -f * + git commit -m "unmodified ipmitool source" + + # Apply patches + stg init + stg import -s ../patch/series + dpkg-buildpackage -rfakeroot -d -b -us -uc -j$(SONIC_CONFIG_MAKE_JOBS) --admindir $(SONIC_DPKG_ADMINDIR) + popd + mv $* $(DERIVED_TARGETS) $(DEST)/ + +$(addprefix $(DEST)/, $(DERIVED_TARGETS)): $(DEST)/% : $(DEST)/$(MAIN_TARGET) + diff --git a/src/ipmitool/patch/0001-Changes-needed-to-install-enterprise.txt.patch b/src/ipmitool/patch/0001-Changes-needed-to-install-enterprise.txt.patch new file mode 100644 index 0000000000..dcaab247a9 --- /dev/null +++ b/src/ipmitool/patch/0001-Changes-needed-to-install-enterprise.txt.patch @@ -0,0 +1,113 @@ +From 719292c4800054ead278affc2972d8f77babd227 Mon Sep 17 00:00:00 2001 +From: rajib-dutta1 +Date: Wed, 10 Jan 2024 20:51:03 -0800 +Subject: [PATCH] Changes needed to install enterprise.txt + +--- + Makefile.am | 40 ++++++++++++++++++++-------------------- + configure.ac | 30 +++++++++++++++--------------- + 2 files changed, 35 insertions(+), 35 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index 355d3f0..ec9605c 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -49,25 +49,25 @@ dist-hook: + .PHONY: install-pen-database uninstall-pen-database + .INTERMEDIATE: %.o %.la enterprise-numbers + +-#if DOWNLOAD +- +-#enterprise-numbers: +-# @echo Downloading IANA PEN database... +-# @$(DOWNLOAD) "$(IANA_PEN)" > tmpfile.$$PPID || {\ +-# echo "FAILED to download the IANA PEN database"; \ +-# rm tmpfile.$$PPID; \ +-# false; \ +-# } +-# @mv tmpfile.$$PPID $@ +-# +-#install-pen-database: enterprise-numbers +-# mkdir -m 755 -p $(DESTDIR)$(IANADIR) +-# $(INSTALL_DATA) $< $(DESTDIR)$(IANADIR)/ +-# +-#uninstall-pen-database: +-# -rm -rf $(DESTDIR)$(IANADIR)/enterprise-numbers +-# +-#else ++if DOWNLOAD ++ ++enterprise-numbers.txt: ++ @echo Downloading IANA PEN database... ++ @$(DOWNLOAD) "$(IANA_PEN)" > tmpfile.$$PPID || {\ ++ echo "FAILED to download the IANA PEN database"; \ ++ rm tmpfile.$$PPID; \ ++ false; \ ++ } ++ @mv tmpfile.$$PPID $@ ++ ++install-pen-database: enterprise-numbers.txt ++ mkdir -m 755 -p $(DESTDIR)$(IANADIR) ++ $(INSTALL_DATA) $< $(DESTDIR)$(IANADIR)/ ++ ++uninstall-pen-database: ++ -rm -rf $(DESTDIR)$(IANADIR)/enterprise-numbers.txt ++ ++else + + install-pen-database: + @echo "*** NOT installing the IANA PEN database." +@@ -77,7 +77,7 @@ uninstall-pen-database: + @echo "*** NOT uninstalling the IANA PEN database." + @echo "*** It was installed manually (if ever)." + +-#endif ++endif + + install-data-local: install-pen-database + mkdir -p $(DESTDIR)$(DOCDIR) +diff --git a/configure.ac b/configure.ac +index b4321c6..d6ba62b 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -56,22 +56,22 @@ if test "x$exec_prefix" = "xNONE"; then + exec_prefix="$prefix" + fi + +-#if test "x$WGET" = "x"; then +-# if test "x$CURL" = "x"; then +-# AC_MSG_WARN([** Neither wget nor curl could be found.]) +-# AC_MSG_WARN([** IANA PEN database will not be installed by `make install` !]) +-# else +-# DOWNLOAD="$CURL --location --progress-bar" +-# AM_CONDITIONAL([DOWNLOAD], [true]) +-# fi +-#else +-# DOWNLOAD="$WGET -c -nd -O -" +-# AM_CONDITIONAL([DOWNLOAD], [true]) +-#fi ++if test "x$WGET" = "x"; then ++ if test "x$CURL" = "x"; then ++ AC_MSG_WARN([** Neither wget nor curl could be found.]) ++ AC_MSG_WARN([** IANA PEN database will not be installed by `make install` !]) ++ else ++ DOWNLOAD="$CURL --location --progress-bar" ++ AM_CONDITIONAL([DOWNLOAD], [true]) ++ fi ++else ++ DOWNLOAD="$WGET -c -nd -O -" ++ AM_CONDITIONAL([DOWNLOAD], [true]) ++fi + +-#AC_MSG_WARN([** Download is:]) +-#AC_MSG_WARN($DOWNLOAD) +-#AC_SUBST(DOWNLOAD, $DOWNLOAD) ++AC_MSG_WARN([** Download is:]) ++AC_MSG_WARN($DOWNLOAD) ++AC_SUBST(DOWNLOAD, $DOWNLOAD) + + dnl + dnl set default option values +-- +2.25.1 + diff --git a/src/ipmitool/patch/series b/src/ipmitool/patch/series new file mode 100644 index 0000000000..df9c99f748 --- /dev/null +++ b/src/ipmitool/patch/series @@ -0,0 +1 @@ +0001-Changes-needed-to-install-enterprise.txt.patch