From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.90_1) id 1iKOPo-0005Dq-U0 for mharc-grub-devel@gnu.org; Tue, 15 Oct 2019 11:07:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:44083) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iKOPe-0004z9-KI for grub-devel@gnu.org; Tue, 15 Oct 2019 11:07:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iKOPd-0005YB-4j for grub-devel@gnu.org; Tue, 15 Oct 2019 11:07:02 -0400 Received: from dibed.net-space.pl ([84.10.22.86]:42686) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_3DES_EDE_CBC_SHA1:24) (Exim 4.71) (envelope-from ) id 1iKOPc-0005X5-Os for grub-devel@gnu.org; Tue, 15 Oct 2019 11:07:01 -0400 Received: from router-fw.i.net-space.pl ([192.168.52.1]:52206 "EHLO tomti.i.net-space.pl") by router-fw-old.i.net-space.pl with ESMTP id S1001311AbfJOOfg (ORCPT ); Tue, 15 Oct 2019 16:35:36 +0200 X-Comment: RFC 2476 MSA function at dibed.net-space.pl logged sender identity as: dkiper Date: Tue, 15 Oct 2019 16:35:34 +0200 From: Daniel Kiper To: Javier Martinez Canillas Cc: grub-devel@gnu.org, Vladimir Serbinenko , Daniel Kiper , Paulo Flabiano Smorigo Subject: Re: [PATCH 3/3] Search for specific config files for netboot Message-ID: <20191015143534.oqbuktxtnczb553s@tomti.i.net-space.pl> References: <20191004224427.22480-1-javierm@redhat.com> <20191004224427.22480-4-javierm@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20191004224427.22480-4-javierm@redhat.com> User-Agent: NeoMutt/20170113 (1.7.2) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 84.10.22.86 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Oct 2019 15:07:04 -0000 On Sat, Oct 05, 2019 at 12:44:27AM +0200, Javier Martinez Canillas wrote: > From: Paulo Flabiano Smorigo > > This patch implements a search for a specific configuration when the config > file is on a remoteserver. It uses the following order: > 1) DHCP client UUID option. > 2) MAC address (in lower case hexadecimal with dash separators); > 3) IP (in upper case hexadecimal) or IPv6; > 4) The original grub.cfg file. > > This procedure is similar to what is used by pxelinux and yaboot: > http://www.syslinux.org/wiki/index.php/PXELINUX#config > > Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=873406 > > Signed-off-by: Paulo Flabiano Smorigo > Signed-off-by: Javier Martinez Canillas Reviewed-by: Daniel Kiper However, one nitpick below... > --- > > grub-core/net/net.c | 117 ++++++++++++++++++++++++++++++++++++++++ > grub-core/normal/main.c | 17 ++++-- > include/grub/net.h | 3 ++ > 3 files changed, 133 insertions(+), 4 deletions(-) > > diff --git a/grub-core/net/net.c b/grub-core/net/net.c > index d5d726a315e..6492bb74274 100644 > --- a/grub-core/net/net.c > +++ b/grub-core/net/net.c > @@ -1735,6 +1735,123 @@ grub_net_restore_hw (void) > return GRUB_ERR_NONE; > } > > +grub_err_t > +grub_net_search_configfile (char *config) s/grub_net_search_configfile/grub_net_search_config_file/ Daniel > +{ > + grub_size_t config_len; > + char *suffix; > + > + auto int search_through (grub_size_t num_tries, grub_size_t slice_size); > + int search_through (grub_size_t num_tries, grub_size_t slice_size) > + { > + while (num_tries-- > 0) > + { > + grub_dprintf ("net", "attempt to fetch config %s\n", config); > + > + grub_file_t file; > + file = grub_file_open (config, GRUB_FILE_TYPE_CONFIG); > + > + if (file) > + { > + grub_file_close (file); > + return 0; > + } > + else > + { > + if (grub_errno == GRUB_ERR_IO) > + grub_errno = GRUB_ERR_NONE; > + } > + > + if (grub_strlen (suffix) < slice_size) > + break; > + > + config[grub_strlen (config) - slice_size] = '\0'; > + } > + > + return 1; > + } > + > + config_len = grub_strlen (config); > + config[config_len] = '-'; > + suffix = config + config_len + 1; > + > + struct grub_net_network_level_interface *inf; > + FOR_NET_NETWORK_LEVEL_INTERFACES (inf) > + { > + /* By the Client UUID. */ > + > + char client_uuid_var[sizeof ("net_") + grub_strlen (inf->name) + > + sizeof ("_clientuuid") + 1]; > + grub_snprintf (client_uuid_var, sizeof (client_uuid_var), > + "net_%s_clientuuid", inf->name); > + > + const char *client_uuid; > + client_uuid = grub_env_get (client_uuid_var); > + > + if (client_uuid) > + { > + grub_strcpy (suffix, client_uuid); > + if (search_through (1, 0) == 0) return GRUB_ERR_NONE; > + } > + > + /* By the MAC address. */ > + > + /* Add ethernet type */ > + grub_strcpy (suffix, "01-"); > + > + grub_net_hwaddr_to_str (&inf->hwaddress, suffix + 3); > + > + char *ptr; > + for (ptr = suffix; *ptr; ptr++) > + if (*ptr == ':') > + *ptr = '-'; > + > + if (search_through (1, 0) == 0) return GRUB_ERR_NONE; > + > + /* By IP address */ > + > + switch ((&inf->address)->type) > + { > + case GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV4: > + { > + grub_uint32_t n = grub_be_to_cpu32 ((&inf->address)->ipv4); > + grub_snprintf (suffix, GRUB_NET_MAX_STR_ADDR_LEN, "%02X%02X%02X%02X", \ > + ((n >> 24) & 0xff), ((n >> 16) & 0xff), \ > + ((n >> 8) & 0xff), ((n >> 0) & 0xff)); > + > + if (search_through (8, 1) == 0) return GRUB_ERR_NONE; > + break; > + } > + case GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV6: > + { > + char buf[GRUB_NET_MAX_STR_ADDR_LEN]; > + struct grub_net_network_level_address base; > + base.type = GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV6; > + grub_memcpy (&base.ipv6, ((&inf->address)->ipv6), 16); > + grub_net_addr_to_str (&base, buf); > + > + for (ptr = buf; *ptr; ptr++) > + if (*ptr == ':') > + *ptr = '-'; > + > + grub_snprintf (suffix, GRUB_NET_MAX_STR_ADDR_LEN, "%s", buf); > + if (search_through (1, 0) == 0) return GRUB_ERR_NONE; > + break; > + } > + case GRUB_NET_NETWORK_LEVEL_PROTOCOL_DHCP_RECV: > + return grub_error (GRUB_ERR_BUG, "shouldn't reach here"); > + default: > + return grub_error (GRUB_ERR_BUG, > + "unsupported address type %d", (&inf->address)->type); > + } > + } > + > + /* Remove the remaining minus sign at the end. */ > + config[config_len] = '\0'; > + > + return GRUB_ERR_NONE; > +} > + > static struct grub_preboot *fini_hnd; > > static grub_command_t cmd_addaddr, cmd_deladdr, cmd_addroute, cmd_delroute; > diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c > index 1b03dfd57b9..62ad546f4f7 100644 > --- a/grub-core/normal/main.c > +++ b/grub-core/normal/main.c > @@ -323,10 +323,19 @@ grub_cmd_normal (struct grub_command *cmd __attribute__ ((unused)), > > prefix = grub_env_get ("prefix"); > if (prefix) > - { > - config = grub_xasprintf ("%s/grub.cfg", prefix); > - if (! config) > - goto quit; > + { > + grub_size_t config_len; > + config_len = grub_strlen (prefix) + > + sizeof ("/grub.cfg-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"); > + config = grub_malloc (config_len); > + > + if (! config) > + goto quit; > + > + grub_snprintf (config, config_len, "%s/grub.cfg", prefix); > + > + if (grub_strncmp (prefix + 1, "tftp", sizeof ("tftp") - 1) == 0) > + grub_net_search_configfile (config); > > grub_enter_normal_mode (config); > grub_free (config); > diff --git a/include/grub/net.h b/include/grub/net.h > index 556c54e579f..ff6d347f7da 100644 > --- a/include/grub/net.h > +++ b/include/grub/net.h > @@ -578,4 +578,7 @@ extern char *grub_net_default_server; > > #define VLANTAG_IDENTIFIER 0x8100 > > +grub_err_t > +grub_net_search_configfile (char *config); > + > #endif /* ! GRUB_NET_HEADER */ > -- > 2.21.0