From debb66b59cfff00b34c55cd6965b240f783187bb Mon Sep 17 00:00:00 2001 From: Radek Vykydal Date: Aug 06 2020 08:07:49 +0000 Subject: network: fix parsing of hostname from ip= if mac is defined in dhcp Resolves: rhbz#1852560 --- diff --git a/pyanaconda/core/regexes.py b/pyanaconda/core/regexes.py index 63ab668..ee5cc37 100644 --- a/pyanaconda/core/regexes.py +++ b/pyanaconda/core/regexes.py @@ -191,3 +191,6 @@ ZFCP_WWPN_NUMBER = re.compile(r'^(?:0x|)[0-9A-Fa-f]{16}$') # IPv6 address in dracut IP option (including the square brackets) IPV6_ADDRESS_IN_DRACUT_IP_OPTION = re.compile(r'\[[^\]]+\]') + +# Octet of MAC address +MAC_OCTET = re.compile(r'[a-fA-F0-9][a-fA-F0-9]') diff --git a/pyanaconda/network.py b/pyanaconda/network.py index f8e9b19..80bdb3e 100644 --- a/pyanaconda/network.py +++ b/pyanaconda/network.py @@ -37,7 +37,7 @@ from dasbus.typing import get_native from pyanaconda.core.i18n import _ from pyanaconda.core.kernel import kernel_arguments from pyanaconda.core.regexes import HOSTNAME_PATTERN_WITHOUT_ANCHORS, \ - IPV6_ADDRESS_IN_DRACUT_IP_OPTION + IPV6_ADDRESS_IN_DRACUT_IP_OPTION, MAC_OCTET from pyanaconda.core.configuration.anaconda import conf from pyanaconda.modules.common.constants.services import NETWORK, TIMEZONE, STORAGE from pyanaconda.modules.common.constants.objects import FCOE @@ -209,7 +209,7 @@ def hostname_from_cmdline(kernel_args): """ # legacy hostname= option hostname = kernel_args.get('hostname', "") - # ip= option + # ip= option (man dracut.cmdline) ipopts = kernel_args.get('ip') # Example (2 options): # ens3:dhcp 10.34.102.244::10.34.102.54:255.255.255.0:myhostname:ens9:none @@ -219,10 +219,13 @@ def hostname_from_cmdline(kernel_args): # Replace ipv6 addresses with empty string, example of ipv6 config: # [fd00:10:100::84:5]::[fd00:10:100::86:49]:80:myhostname:ens9:none ipopt = IPV6_ADDRESS_IN_DRACUT_IP_OPTION.sub('', ipopt) - try: + elements = ipopt.split(':') + # Hostname can be defined only in option having more than 6 elements. + # But filter out auto ip= with mac address set by MAC_OCTET matching, eg: + # ip=:dhcp::52:54:00:12:34:56 + # where the 4th element is not hostname. + if len(elements) > 6 and not re.match(MAC_OCTET, elements[6]): hostname = ipopt.split(':')[4] - except IndexError: - pass return hostname diff --git a/tests/nosetests/pyanaconda_tests/network_test.py b/tests/nosetests/pyanaconda_tests/network_test.py index e7ca630..161e883 100644 --- a/tests/nosetests/pyanaconda_tests/network_test.py +++ b/tests/nosetests/pyanaconda_tests/network_test.py @@ -233,9 +233,11 @@ class NetworkTests(unittest.TestCase): cmdline = {"ip": "10.34.102.244::10.34.102.54:255.255.255.0:myhostname:ens9:none", "hostname": "hostname_bootopt"} self.assertEqual(network.hostname_from_cmdline(cmdline), "myhostname") - cmdline = {"ip": "ens3:dhcp "} + cmdline = {"ip": "ens3:dhcp"} self.assertEqual(network.hostname_from_cmdline(cmdline), "") - cmdline = {"ip": "ens3:dhcp ", + cmdline = {"ip": "ens3:dhcp:1500"} + self.assertEqual(network.hostname_from_cmdline(cmdline), "") + cmdline = {"ip": "ens3:dhcp", "hostname": "hostname_bootopt"} self.assertEqual(network.hostname_from_cmdline(cmdline), "hostname_bootopt") # two ip configurations @@ -248,6 +250,9 @@ class NetworkTests(unittest.TestCase): self.assertEqual(network.hostname_from_cmdline(cmdline), "myhostname") cmdline = {"ip": "[fd00:10:100::84:5]::[fd00:10:100::86:49]:80::ens50:none"} self.assertEqual(network.hostname_from_cmdline(cmdline), "") - cmdline = {"ip": "[fd00:10:100::84:5]::[fd00:10:100::86:49]:80::ens50:none" + cmdline = {"ip": "[fd00:10:100::84:5]::[fd00:10:100::86:49]:80::ens50:none " "ens3:dhcp 10.34.102.244::10.34.102.54:255.255.255.0:myhostname:ens9:none"} self.assertEqual(network.hostname_from_cmdline(cmdline), "myhostname") + # automatic ip= whith MAC address set + cmdline = {"ip": "ens3:dhcp::52:54:00:12:34:56"} + self.assertEqual(network.hostname_from_cmdline(cmdline), "")