diff mbox series

[1/1] package/ipmitool: allow configuring PEN registry source

Message ID 20230119183953.1609871-1-vfazio@xes-inc.com
State Accepted
Headers show
Series [1/1] package/ipmitool: allow configuring PEN registry source | expand

Commit Message

Vincent Fazio Jan. 19, 2023, 6:39 p.m. UTC
From: Vincent Fazio <vfazio@gmail.com>

The default, the IANA PEN registry used by ipmitool is large (4 MiB+)
and changes at the whim of IANA, meaning reproducible builds may not be
possible by using the default package.

Add a configuration option to specify the source of the registry file.

Remote and local files are supported. If no source is specified, no
registry file will be installed to the target.

Backport upstream patches to allow this to add requisite support:
  Make a missing registry file non-fatal
  Make downloading/installing the registry optional

Signed-off-by: Vincent Fazio <vfazio@gmail.com>
Co-Developed-by: Yann E. MORIN <yann.morin.1998@free.fr>
---
 ...t-require-the-IANA-PEN-registry-file.patch | 115 ++++++++++++++++++
 ...c-allow-disabling-registry-downloads.patch |  75 ++++++++++++
 package/ipmitool/Config.in                    |  12 ++
 package/ipmitool/ipmitool.mk                  |  20 +++
 4 files changed, 222 insertions(+)
 create mode 100644 package/ipmitool/0003-Do-not-require-the-IANA-PEN-registry-file.patch
 create mode 100644 package/ipmitool/0004-configure.ac-allow-disabling-registry-downloads.patch

Comments

Yann E. MORIN Jan. 21, 2023, 2:17 p.m. UTC | #1
Vincent, All,

On 2023-01-19 12:39 -0600, Vincent Fazio spake thusly:
> From: Vincent Fazio <vfazio@gmail.com>
> 
> The default, the IANA PEN registry used by ipmitool is large (4 MiB+)
> and changes at the whim of IANA, meaning reproducible builds may not be
> possible by using the default package.
> 
> Add a configuration option to specify the source of the registry file.
> 
> Remote and local files are supported. If no source is specified, no
> registry file will be installed to the target.
> 
> Backport upstream patches to allow this to add requisite support:
>   Make a missing registry file non-fatal
>   Make downloading/installing the registry optional
> 
> Signed-off-by: Vincent Fazio <vfazio@gmail.com>
> Co-Developed-by: Yann E. MORIN <yann.morin.1998@free.fr>

I did further cleanup tweaks;

  - use https for the default URL
  - use simple assignment for first _CONF_OPTS
  - squeeze empty lines, comment closing endif

Applied to master, thanks.

Regards,
Yann E. MORIN.

> ---
>  ...t-require-the-IANA-PEN-registry-file.patch | 115 ++++++++++++++++++
>  ...c-allow-disabling-registry-downloads.patch |  75 ++++++++++++
>  package/ipmitool/Config.in                    |  12 ++
>  package/ipmitool/ipmitool.mk                  |  20 +++
>  4 files changed, 222 insertions(+)
>  create mode 100644 package/ipmitool/0003-Do-not-require-the-IANA-PEN-registry-file.patch
>  create mode 100644 package/ipmitool/0004-configure.ac-allow-disabling-registry-downloads.patch
> 
> diff --git a/package/ipmitool/0003-Do-not-require-the-IANA-PEN-registry-file.patch b/package/ipmitool/0003-Do-not-require-the-IANA-PEN-registry-file.patch
> new file mode 100644
> index 0000000000..3f35a78af2
> --- /dev/null
> +++ b/package/ipmitool/0003-Do-not-require-the-IANA-PEN-registry-file.patch
> @@ -0,0 +1,115 @@
> +From 26b088193a55624df4cbe2a0d33c7bba5bca108d Mon Sep 17 00:00:00 2001
> +From: Vincent Fazio <vfazio@gmail.com>
> +Date: Sat, 7 Jan 2023 21:02:48 -0600
> +Subject: [PATCH] Do not require the IANA PEN registry file
> +
> +Previously, ipmitool would fail to run if the local copy of the IANA PEN
> +registry could not be parsed.
> +
> +When the registry is not available the manufacturer will be "Unknown" but
> +ipmitool will otherwise function so should not be considered fatal.
> +
> +Also, fix an issue with improperly handling the `oem_info_list_load`
> +return value. Previously, in `ipmi_oem_info_init`, if `oem_info_list_load`
> +returned a negative value due to the registry file not existing, an
> +improper count would cause `oem_info_init_from_list` to aallocate a list
> +that didn't encompass the full header/tail list.
> +
> +  IANA PEN registry open failed: No such file or directory
> +    Allocating      3 entries
> +    [     1] 16777214 | A Debug Assisting Company, Ltd.
> +    [     0]  1048575 | Unspecified
> +
> +Now, use a signed int and ensure a valid count of loaded OEMs is used.
> +
> +Signed-off-by: Vincent Fazio <vfazio@gmail.com>
> +
> +[vfazio: backport from upstream 26b088193a55624df4cbe2a0d33c7bba5bca108d]
> +Signed-off-by: Vincent Fazio <vfazio@gmail.com>
> +---
> + include/ipmitool/ipmi_strings.h |  2 +-
> + lib/ipmi_main.c                 |  5 +----
> + lib/ipmi_strings.c              | 19 +++++--------------
> + 3 files changed, 7 insertions(+), 19 deletions(-)
> +
> +diff --git a/include/ipmitool/ipmi_strings.h b/include/ipmitool/ipmi_strings.h
> +index 17c37c6..d60179c 100644
> +--- a/include/ipmitool/ipmi_strings.h
> ++++ b/include/ipmitool/ipmi_strings.h
> +@@ -55,7 +55,7 @@ extern const struct valstr ipmi_integrity_algorithms[];
> + extern const struct valstr ipmi_encryption_algorithms[];
> + extern const struct valstr ipmi_user_enable_status_vals[];
> + extern const struct valstr *ipmi_oem_info;
> +-int ipmi_oem_info_init();
> ++void ipmi_oem_info_init();
> + void ipmi_oem_info_free();
> + 
> + extern const struct valstr picmg_frucontrol_vals[];
> +diff --git a/lib/ipmi_main.c b/lib/ipmi_main.c
> +index a673a30..510bc2d 100644
> +--- a/lib/ipmi_main.c
> ++++ b/lib/ipmi_main.c
> +@@ -853,10 +853,7 @@ ipmi_main(int argc, char ** argv,
> + 	}
> + 
> + 	/* load the IANA PEN registry */
> +-	if (ipmi_oem_info_init()) {
> +-		lprintf(LOG_ERR, "Failed to initialize the OEM info dictionary");
> +-		goto out_free;
> +-	}
> ++	ipmi_oem_info_init();
> + 
> + 	/* run OEM setup if found */
> + 	if (oemtype &&
> +diff --git a/lib/ipmi_strings.c b/lib/ipmi_strings.c
> +index 26b359f..c8fc2d0 100644
> +--- a/lib/ipmi_strings.c
> ++++ b/lib/ipmi_strings.c
> +@@ -1719,39 +1719,30 @@ out:
> + 	return rc;
> + }
> + 
> +-int ipmi_oem_info_init()
> ++void ipmi_oem_info_init()
> + {
> + 	oem_valstr_list_t terminator = { { -1, NULL}, NULL }; /* Terminator */
> + 	oem_valstr_list_t *oemlist = &terminator;
> + 	bool free_strings = true;
> +-	size_t count;
> +-	int rc = -4;
> ++	int count;
> + 
> + 	lprintf(LOG_INFO, "Loading IANA PEN Registry...");
> + 
> + 	if (ipmi_oem_info) {
> + 		lprintf(LOG_INFO, "IANA PEN Registry is already loaded");
> +-		rc = 0;
> + 		goto out;
> + 	}
> + 
> +-	if (!(count = oem_info_list_load(&oemlist))) {
> +-		/*
> +-		 * We can't identify OEMs without a loaded registry.
> +-		 * Set the pointer to dummy and return.
> +-		 */
> +-		ipmi_oem_info = ipmi_oem_info_dummy;
> +-		goto out;
> ++	if ((count = oem_info_list_load(&oemlist)) < 1) {
> ++		lprintf(LOG_WARN, "Failed to load entries from IANA PEN Registry");
> ++		count = 0;
> + 	}
> + 
> + 	/* In the array was allocated, don't free the strings at cleanup */
> + 	free_strings = !oem_info_init_from_list(oemlist, count);
> + 
> +-	rc = IPMI_CC_OK;
> +-
> + out:
> + 	oem_info_list_free(&oemlist, free_strings);
> +-	return rc;
> + }
> + 
> + void ipmi_oem_info_free()
> +-- 
> +2.25.1
> +
> diff --git a/package/ipmitool/0004-configure.ac-allow-disabling-registry-downloads.patch b/package/ipmitool/0004-configure.ac-allow-disabling-registry-downloads.patch
> new file mode 100644
> index 0000000000..9a995b9a14
> --- /dev/null
> +++ b/package/ipmitool/0004-configure.ac-allow-disabling-registry-downloads.patch
> @@ -0,0 +1,75 @@
> +From be11d948f89b10be094e28d8a0a5e8fb532c7b60 Mon Sep 17 00:00:00 2001
> +From: Vincent Fazio <vfazio@gmail.com>
> +Date: Wed, 11 Jan 2023 22:55:51 -0600
> +Subject: [PATCH] configure.ac: allow disabling registry downloads
> +
> +Some environments require reproducible builds. Since the IANA PEN
> +registry is constantly updating and there is no snapshot available,
> +installing ipmitool via `make install` is not reproducible.
> +
> +Provide a configure mechanism to disable the registry download/install..
> +
> +[vfazio: backport from upstream be11d948f89b10be094e28d8a0a5e8fb532c7b60]
> +Signed-off-by: Vincent Fazio <vfazio@gmail.com>
> +---
> + configure.ac | 30 ++++++++++++++++++++----------
> + 1 file changed, 20 insertions(+), 10 deletions(-)
> +
> +diff --git a/configure.ac b/configure.ac
> +index 4ee1be8..1dd2742 100644
> +--- a/configure.ac
> ++++ b/configure.ac
> +@@ -18,8 +18,6 @@ AC_PROG_LN_S
> + AC_PROG_MAKE_SET
> + AC_CHECK_PROG([RPMBUILD], [rpmbuild], [rpmbuild], [rpm])
> + AC_CHECK_PROG([SED], [sed], [sed])
> +-AC_CHECK_PROG([WGET], [wget], [wget])
> +-AC_CHECK_PROG([CURL], [curl], [curl])
> + 
> + AC_HEADER_STDC
> + AC_CHECK_HEADERS([stdlib.h string.h sys/ioctl.h sys/stat.h unistd.h paths.h])
> +@@ -56,21 +54,33 @@ if test "x$exec_prefix" = "xNONE"; then
> + 	exec_prefix="$prefix"
> + fi
> + 
> +-if test "x$WGET" = "x"; then
> +-	if test "x$CURL" = "x"; then
> ++dnl allow enabling/disabling the fetching of the IANA PEN registry
> ++AC_ARG_ENABLE([registry-download],
> ++	[AC_HELP_STRING([--enable-registry-download],
> ++			[download/install the IANA PEN registry [default=yes]])],
> ++	[xenable_registry_download=$enableval],
> ++	[xenable_registry_download=yes])
> ++
> ++AM_CONDITIONAL([DOWNLOAD], [false])
> ++
> ++if test "x$xenable_registry_download" = "xyes"; then
> ++	AC_CHECK_PROG([WGET], [wget], [wget])
> ++	AC_CHECK_PROG([CURL], [curl], [curl])
> ++
> ++	if test "x$WGET" = "x" && 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])
> ++		if test "x$WGET" != "x"; then
> ++			DOWNLOAD="$WGET -c -nd -O -"
> ++		else
> ++			DOWNLOAD="$CURL --location --progress-bar"
> ++		fi
> + 	fi
> +-else
> +-	DOWNLOAD="$WGET -c -nd -O -"
> +-	AM_CONDITIONAL([DOWNLOAD], [true])
> + fi
> + 
> +-AC_MSG_WARN([** Download is:])
> +-AC_MSG_WARN($DOWNLOAD)
> ++AC_MSG_WARN([** Download is: $DOWNLOAD])
> + AC_SUBST(DOWNLOAD, $DOWNLOAD)
> + 
> + dnl
> +-- 
> +2.25.1
> +
> diff --git a/package/ipmitool/Config.in b/package/ipmitool/Config.in
> index dbd6483110..8e217ecc45 100644
> --- a/package/ipmitool/Config.in
> +++ b/package/ipmitool/Config.in
> @@ -9,6 +9,18 @@ config BR2_PACKAGE_IPMITOOL
>  
>  if BR2_PACKAGE_IPMITOOL
>  
> +config BR2_PACKAGE_IPMITOOL_PEN_REG_URI
> +	string "IANA PEN registry URL or path"
> +	default "http://www.iana.org/assignments/enterprise-numbers.txt"
> +	help
> +	  Enter an URL or a file path to the PEN registry to use.
> +
> +	  Note that the official registry is 4MiB+ and may change any
> +	  time and is thus not guaranteed to be reproducible.
> +
> +	  Leave empty to not use a registry; vendor IDs will be
> +	  displayed instead of the corresponding names.
> +
>  config BR2_PACKAGE_IPMITOOL_LANPLUS
>  	bool "enable lanplus interface"
>  	select BR2_PACKAGE_OPENSSL
> diff --git a/package/ipmitool/ipmitool.mk b/package/ipmitool/ipmitool.mk
> index 5e34434a03..6fc4283e47 100644
> --- a/package/ipmitool/ipmitool.mk
> +++ b/package/ipmitool/ipmitool.mk
> @@ -13,6 +13,8 @@ IPMITOOL_CPE_ID_VENDOR = ipmitool_project
>  IPMITOOL_AUTORECONF = YES
>  IPMITOOL_DEPENDENCIES = host-pkgconf
>  
> +IPMITOOL_CONF_OPTS += --disable-registry-download
> +
>  ifeq ($(BR2_PACKAGE_FREEIPMI),y)
>  IPMITOOL_DEPENDENCIES += freeipmi
>  IPMITOOL_CONF_OPTS += --enable-intf-free
> @@ -47,4 +49,22 @@ endef
>  IPMITOOL_POST_INSTALL_TARGET_HOOKS += IPMITOOL_REMOVE_IPMIEVD
>  endif
>  
> +IPMITOOL_PEN_REG_URI = $(call qstrip,$(BR2_PACKAGE_IPMITOOL_PEN_REG_URI))
> +
> +ifneq ($(IPMITOOL_PEN_REG_URI),)
> +ifneq ($(findstring ://,$(IPMITOOL_PEN_REG_URI)),)
> +IPMITOOL_EXTRA_DOWNLOADS += $(IPMITOOL_PEN_REG_URI)
> +BR_NO_CHECK_HASH_FOR += $(notdir $(IPMITOOL_PEN_REG_URI))
> +IPMITOOL_PEN_REG = $(IPMITOOL_DL_DIR)/$(notdir $(IPMITOOL_PEN_REG_URI))
> +else
> +IPMITOOL_PEN_REG = $(IPMITOOL_PEN_REG_URI)
> +endif #findstring
> +
> +define IPMITOOL_INSTALL_PEN_REG
> +	$(INSTALL) -D -m 0644 $(IPMITOOL_PEN_REG) \
> +		$(TARGET_DIR)/usr/share/misc/enterprise-numbers
> +endef
> +IPMITOOL_POST_INSTALL_TARGET_HOOKS += IPMITOOL_INSTALL_PEN_REG
> +endif
> +
>  $(eval $(autotools-package))
> -- 
> 2.25.1
> 
> _______________________________________________
> buildroot mailing list
> buildroot@buildroot.org
> https://lists.buildroot.org/mailman/listinfo/buildroot
diff mbox series

Patch

diff --git a/package/ipmitool/0003-Do-not-require-the-IANA-PEN-registry-file.patch b/package/ipmitool/0003-Do-not-require-the-IANA-PEN-registry-file.patch
new file mode 100644
index 0000000000..3f35a78af2
--- /dev/null
+++ b/package/ipmitool/0003-Do-not-require-the-IANA-PEN-registry-file.patch
@@ -0,0 +1,115 @@ 
+From 26b088193a55624df4cbe2a0d33c7bba5bca108d Mon Sep 17 00:00:00 2001
+From: Vincent Fazio <vfazio@gmail.com>
+Date: Sat, 7 Jan 2023 21:02:48 -0600
+Subject: [PATCH] Do not require the IANA PEN registry file
+
+Previously, ipmitool would fail to run if the local copy of the IANA PEN
+registry could not be parsed.
+
+When the registry is not available the manufacturer will be "Unknown" but
+ipmitool will otherwise function so should not be considered fatal.
+
+Also, fix an issue with improperly handling the `oem_info_list_load`
+return value. Previously, in `ipmi_oem_info_init`, if `oem_info_list_load`
+returned a negative value due to the registry file not existing, an
+improper count would cause `oem_info_init_from_list` to aallocate a list
+that didn't encompass the full header/tail list.
+
+  IANA PEN registry open failed: No such file or directory
+    Allocating      3 entries
+    [     1] 16777214 | A Debug Assisting Company, Ltd.
+    [     0]  1048575 | Unspecified
+
+Now, use a signed int and ensure a valid count of loaded OEMs is used.
+
+Signed-off-by: Vincent Fazio <vfazio@gmail.com>
+
+[vfazio: backport from upstream 26b088193a55624df4cbe2a0d33c7bba5bca108d]
+Signed-off-by: Vincent Fazio <vfazio@gmail.com>
+---
+ include/ipmitool/ipmi_strings.h |  2 +-
+ lib/ipmi_main.c                 |  5 +----
+ lib/ipmi_strings.c              | 19 +++++--------------
+ 3 files changed, 7 insertions(+), 19 deletions(-)
+
+diff --git a/include/ipmitool/ipmi_strings.h b/include/ipmitool/ipmi_strings.h
+index 17c37c6..d60179c 100644
+--- a/include/ipmitool/ipmi_strings.h
++++ b/include/ipmitool/ipmi_strings.h
+@@ -55,7 +55,7 @@ extern const struct valstr ipmi_integrity_algorithms[];
+ extern const struct valstr ipmi_encryption_algorithms[];
+ extern const struct valstr ipmi_user_enable_status_vals[];
+ extern const struct valstr *ipmi_oem_info;
+-int ipmi_oem_info_init();
++void ipmi_oem_info_init();
+ void ipmi_oem_info_free();
+ 
+ extern const struct valstr picmg_frucontrol_vals[];
+diff --git a/lib/ipmi_main.c b/lib/ipmi_main.c
+index a673a30..510bc2d 100644
+--- a/lib/ipmi_main.c
++++ b/lib/ipmi_main.c
+@@ -853,10 +853,7 @@ ipmi_main(int argc, char ** argv,
+ 	}
+ 
+ 	/* load the IANA PEN registry */
+-	if (ipmi_oem_info_init()) {
+-		lprintf(LOG_ERR, "Failed to initialize the OEM info dictionary");
+-		goto out_free;
+-	}
++	ipmi_oem_info_init();
+ 
+ 	/* run OEM setup if found */
+ 	if (oemtype &&
+diff --git a/lib/ipmi_strings.c b/lib/ipmi_strings.c
+index 26b359f..c8fc2d0 100644
+--- a/lib/ipmi_strings.c
++++ b/lib/ipmi_strings.c
+@@ -1719,39 +1719,30 @@ out:
+ 	return rc;
+ }
+ 
+-int ipmi_oem_info_init()
++void ipmi_oem_info_init()
+ {
+ 	oem_valstr_list_t terminator = { { -1, NULL}, NULL }; /* Terminator */
+ 	oem_valstr_list_t *oemlist = &terminator;
+ 	bool free_strings = true;
+-	size_t count;
+-	int rc = -4;
++	int count;
+ 
+ 	lprintf(LOG_INFO, "Loading IANA PEN Registry...");
+ 
+ 	if (ipmi_oem_info) {
+ 		lprintf(LOG_INFO, "IANA PEN Registry is already loaded");
+-		rc = 0;
+ 		goto out;
+ 	}
+ 
+-	if (!(count = oem_info_list_load(&oemlist))) {
+-		/*
+-		 * We can't identify OEMs without a loaded registry.
+-		 * Set the pointer to dummy and return.
+-		 */
+-		ipmi_oem_info = ipmi_oem_info_dummy;
+-		goto out;
++	if ((count = oem_info_list_load(&oemlist)) < 1) {
++		lprintf(LOG_WARN, "Failed to load entries from IANA PEN Registry");
++		count = 0;
+ 	}
+ 
+ 	/* In the array was allocated, don't free the strings at cleanup */
+ 	free_strings = !oem_info_init_from_list(oemlist, count);
+ 
+-	rc = IPMI_CC_OK;
+-
+ out:
+ 	oem_info_list_free(&oemlist, free_strings);
+-	return rc;
+ }
+ 
+ void ipmi_oem_info_free()
+-- 
+2.25.1
+
diff --git a/package/ipmitool/0004-configure.ac-allow-disabling-registry-downloads.patch b/package/ipmitool/0004-configure.ac-allow-disabling-registry-downloads.patch
new file mode 100644
index 0000000000..9a995b9a14
--- /dev/null
+++ b/package/ipmitool/0004-configure.ac-allow-disabling-registry-downloads.patch
@@ -0,0 +1,75 @@ 
+From be11d948f89b10be094e28d8a0a5e8fb532c7b60 Mon Sep 17 00:00:00 2001
+From: Vincent Fazio <vfazio@gmail.com>
+Date: Wed, 11 Jan 2023 22:55:51 -0600
+Subject: [PATCH] configure.ac: allow disabling registry downloads
+
+Some environments require reproducible builds. Since the IANA PEN
+registry is constantly updating and there is no snapshot available,
+installing ipmitool via `make install` is not reproducible.
+
+Provide a configure mechanism to disable the registry download/install..
+
+[vfazio: backport from upstream be11d948f89b10be094e28d8a0a5e8fb532c7b60]
+Signed-off-by: Vincent Fazio <vfazio@gmail.com>
+---
+ configure.ac | 30 ++++++++++++++++++++----------
+ 1 file changed, 20 insertions(+), 10 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 4ee1be8..1dd2742 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -18,8 +18,6 @@ AC_PROG_LN_S
+ AC_PROG_MAKE_SET
+ AC_CHECK_PROG([RPMBUILD], [rpmbuild], [rpmbuild], [rpm])
+ AC_CHECK_PROG([SED], [sed], [sed])
+-AC_CHECK_PROG([WGET], [wget], [wget])
+-AC_CHECK_PROG([CURL], [curl], [curl])
+ 
+ AC_HEADER_STDC
+ AC_CHECK_HEADERS([stdlib.h string.h sys/ioctl.h sys/stat.h unistd.h paths.h])
+@@ -56,21 +54,33 @@ if test "x$exec_prefix" = "xNONE"; then
+ 	exec_prefix="$prefix"
+ fi
+ 
+-if test "x$WGET" = "x"; then
+-	if test "x$CURL" = "x"; then
++dnl allow enabling/disabling the fetching of the IANA PEN registry
++AC_ARG_ENABLE([registry-download],
++	[AC_HELP_STRING([--enable-registry-download],
++			[download/install the IANA PEN registry [default=yes]])],
++	[xenable_registry_download=$enableval],
++	[xenable_registry_download=yes])
++
++AM_CONDITIONAL([DOWNLOAD], [false])
++
++if test "x$xenable_registry_download" = "xyes"; then
++	AC_CHECK_PROG([WGET], [wget], [wget])
++	AC_CHECK_PROG([CURL], [curl], [curl])
++
++	if test "x$WGET" = "x" && 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])
++		if test "x$WGET" != "x"; then
++			DOWNLOAD="$WGET -c -nd -O -"
++		else
++			DOWNLOAD="$CURL --location --progress-bar"
++		fi
+ 	fi
+-else
+-	DOWNLOAD="$WGET -c -nd -O -"
+-	AM_CONDITIONAL([DOWNLOAD], [true])
+ fi
+ 
+-AC_MSG_WARN([** Download is:])
+-AC_MSG_WARN($DOWNLOAD)
++AC_MSG_WARN([** Download is: $DOWNLOAD])
+ AC_SUBST(DOWNLOAD, $DOWNLOAD)
+ 
+ dnl
+-- 
+2.25.1
+
diff --git a/package/ipmitool/Config.in b/package/ipmitool/Config.in
index dbd6483110..8e217ecc45 100644
--- a/package/ipmitool/Config.in
+++ b/package/ipmitool/Config.in
@@ -9,6 +9,18 @@  config BR2_PACKAGE_IPMITOOL
 
 if BR2_PACKAGE_IPMITOOL
 
+config BR2_PACKAGE_IPMITOOL_PEN_REG_URI
+	string "IANA PEN registry URL or path"
+	default "http://www.iana.org/assignments/enterprise-numbers.txt"
+	help
+	  Enter an URL or a file path to the PEN registry to use.
+
+	  Note that the official registry is 4MiB+ and may change any
+	  time and is thus not guaranteed to be reproducible.
+
+	  Leave empty to not use a registry; vendor IDs will be
+	  displayed instead of the corresponding names.
+
 config BR2_PACKAGE_IPMITOOL_LANPLUS
 	bool "enable lanplus interface"
 	select BR2_PACKAGE_OPENSSL
diff --git a/package/ipmitool/ipmitool.mk b/package/ipmitool/ipmitool.mk
index 5e34434a03..6fc4283e47 100644
--- a/package/ipmitool/ipmitool.mk
+++ b/package/ipmitool/ipmitool.mk
@@ -13,6 +13,8 @@  IPMITOOL_CPE_ID_VENDOR = ipmitool_project
 IPMITOOL_AUTORECONF = YES
 IPMITOOL_DEPENDENCIES = host-pkgconf
 
+IPMITOOL_CONF_OPTS += --disable-registry-download
+
 ifeq ($(BR2_PACKAGE_FREEIPMI),y)
 IPMITOOL_DEPENDENCIES += freeipmi
 IPMITOOL_CONF_OPTS += --enable-intf-free
@@ -47,4 +49,22 @@  endef
 IPMITOOL_POST_INSTALL_TARGET_HOOKS += IPMITOOL_REMOVE_IPMIEVD
 endif
 
+IPMITOOL_PEN_REG_URI = $(call qstrip,$(BR2_PACKAGE_IPMITOOL_PEN_REG_URI))
+
+ifneq ($(IPMITOOL_PEN_REG_URI),)
+ifneq ($(findstring ://,$(IPMITOOL_PEN_REG_URI)),)
+IPMITOOL_EXTRA_DOWNLOADS += $(IPMITOOL_PEN_REG_URI)
+BR_NO_CHECK_HASH_FOR += $(notdir $(IPMITOOL_PEN_REG_URI))
+IPMITOOL_PEN_REG = $(IPMITOOL_DL_DIR)/$(notdir $(IPMITOOL_PEN_REG_URI))
+else
+IPMITOOL_PEN_REG = $(IPMITOOL_PEN_REG_URI)
+endif #findstring
+
+define IPMITOOL_INSTALL_PEN_REG
+	$(INSTALL) -D -m 0644 $(IPMITOOL_PEN_REG) \
+		$(TARGET_DIR)/usr/share/misc/enterprise-numbers
+endef
+IPMITOOL_POST_INSTALL_TARGET_HOOKS += IPMITOOL_INSTALL_PEN_REG
+endif
+
 $(eval $(autotools-package))