dede5bd1d4
OBS-URL: https://build.opensuse.org/package/show/systemsmanagement:saltstack/salt?expand=0&rev=166
160 lines
6.9 KiB
Diff
160 lines
6.9 KiB
Diff
From 512b189808ea0d7b333587689d7e7eb52d16b189 Mon Sep 17 00:00:00 2001
|
|
From: Bo Maryniuk <bo@suse.de>
|
|
Date: Tue, 29 Jan 2019 11:11:38 +0100
|
|
Subject: [PATCH] Include aliases in the fqdns grains
|
|
|
|
Add UT for "is_fqdn"
|
|
|
|
Add "is_fqdn" check to the network utils
|
|
|
|
Bugfix: include FQDNs aliases
|
|
|
|
Deprecate UnitTest assertion in favour of built-in assert keyword
|
|
|
|
Add UT for fqdns aliases
|
|
|
|
Leverage cached interfaces, if any.
|
|
---
|
|
salt/grains/core.py | 14 ++++++--------
|
|
salt/utils/network.py | 12 ++++++++++++
|
|
tests/unit/grains/test_core.py | 28 +++++++++++++++++++++++++---
|
|
tests/unit/utils/test_network.py | 24 ++++++++++++++++++++++++
|
|
4 files changed, 67 insertions(+), 11 deletions(-)
|
|
|
|
diff --git a/salt/grains/core.py b/salt/grains/core.py
|
|
index 7b7e328520..309e4c9c4a 100644
|
|
--- a/salt/grains/core.py
|
|
+++ b/salt/grains/core.py
|
|
@@ -2275,14 +2275,13 @@ def fqdns():
|
|
grains = {}
|
|
fqdns = set()
|
|
|
|
- addresses = salt.utils.network.ip_addrs(include_loopback=False,
|
|
- interface_data=_INTERFACES)
|
|
- addresses.extend(salt.utils.network.ip_addrs6(include_loopback=False,
|
|
- interface_data=_INTERFACES))
|
|
- err_message = 'An exception occurred resolving address \'%s\': %s'
|
|
+ addresses = salt.utils.network.ip_addrs(include_loopback=False, interface_data=_get_interfaces())
|
|
+ addresses.extend(salt.utils.network.ip_addrs6(include_loopback=False, interface_data=_get_interfaces()))
|
|
+ err_message = 'Exception during resolving address: %s'
|
|
for ip in addresses:
|
|
try:
|
|
- fqdns.add(socket.getfqdn(socket.gethostbyaddr(ip)[0]))
|
|
+ name, aliaslist, addresslist = socket.gethostbyaddr(ip)
|
|
+ fqdns.update([socket.getfqdn(name)] + [als for als in aliaslist if salt.utils.network.is_fqdn(als)])
|
|
except socket.herror as err:
|
|
if err.errno in (0, HOST_NOT_FOUND, NO_DATA):
|
|
# No FQDN for this IP address, so we don't need to know this all the time.
|
|
@@ -2292,8 +2291,7 @@ def fqdns():
|
|
except (socket.error, socket.gaierror, socket.timeout) as err:
|
|
log.error(err_message, ip, err)
|
|
|
|
- grains['fqdns'] = sorted(list(fqdns))
|
|
- return grains
|
|
+ return {"fqdns": sorted(list(fqdns))}
|
|
|
|
|
|
def ip_fqdn():
|
|
diff --git a/salt/utils/network.py b/salt/utils/network.py
|
|
index 906d1cb3bc..2ae2e213b7 100644
|
|
--- a/salt/utils/network.py
|
|
+++ b/salt/utils/network.py
|
|
@@ -1958,3 +1958,15 @@ def parse_host_port(host_port):
|
|
raise ValueError('bad hostname: "{}"'.format(host))
|
|
|
|
return host, port
|
|
+
|
|
+
|
|
+def is_fqdn(hostname):
|
|
+ """
|
|
+ Verify if hostname conforms to be a FQDN.
|
|
+
|
|
+ :param hostname: text string with the name of the host
|
|
+ :return: bool, True if hostname is correct FQDN, False otherwise
|
|
+ """
|
|
+
|
|
+ compliant = re.compile(r"(?!-)[A-Z\d\-\_]{1,63}(?<!-)$", re.IGNORECASE)
|
|
+ return "." in hostname and len(hostname) < 0xff and all(compliant.match(x) for x in hostname.rstrip(".").split("."))
|
|
diff --git a/tests/unit/grains/test_core.py b/tests/unit/grains/test_core.py
|
|
index c40595eb3f..ac03b57226 100644
|
|
--- a/tests/unit/grains/test_core.py
|
|
+++ b/tests/unit/grains/test_core.py
|
|
@@ -1046,9 +1046,9 @@ class CoreGrainsTestCase(TestCase, LoaderModuleMockMixin):
|
|
ret = {'fqdns': ['bluesniff.foo.bar', 'foo.bar.baz', 'rinzler.evil-corp.com']}
|
|
with patch.object(socket, 'gethostbyaddr', side_effect=reverse_resolv_mock):
|
|
fqdns = core.fqdns()
|
|
- self.assertIn('fqdns', fqdns)
|
|
- self.assertEqual(len(fqdns['fqdns']), len(ret['fqdns']))
|
|
- self.assertEqual(set(fqdns['fqdns']), set(ret['fqdns']))
|
|
+ assert "fqdns" in fqdns
|
|
+ assert len(fqdns['fqdns']) == len(ret['fqdns'])
|
|
+ assert set(fqdns['fqdns']) == set(ret['fqdns'])
|
|
|
|
@skipIf(not salt.utils.platform.is_linux(), 'System is not Linux')
|
|
@patch('salt.utils.network.ip_addrs', MagicMock(return_value=['1.2.3.4']))
|
|
@@ -1081,6 +1081,28 @@ class CoreGrainsTestCase(TestCase, LoaderModuleMockMixin):
|
|
mock_log.debug.assert_not_called()
|
|
mock_log.error.assert_called_once()
|
|
|
|
+ @patch.object(salt.utils.platform, 'is_windows', MagicMock(return_value=False))
|
|
+ @patch('salt.utils.network.ip_addrs', MagicMock(return_value=['1.2.3.4', '5.6.7.8']))
|
|
+ @patch('salt.utils.network.ip_addrs6',
|
|
+ MagicMock(return_value=['fe80::a8b2:93ff:fe00:0', 'fe80::a8b2:93ff:dead:beef']))
|
|
+ @patch('salt.utils.network.socket.getfqdn', MagicMock(side_effect=lambda v: v)) # Just pass-through
|
|
+ def test_fqdns_aliases(self):
|
|
+ '''
|
|
+ FQDNs aliases
|
|
+ '''
|
|
+ reverse_resolv_mock = [('foo.bar.baz', ["throwmeaway", "this.is.valid.alias"], ['1.2.3.4']),
|
|
+ ('rinzler.evil-corp.com', ["false-hostname", "badaliass"], ['5.6.7.8']),
|
|
+ ('foo.bar.baz', [], ['fe80::a8b2:93ff:fe00:0']),
|
|
+ ('bluesniff.foo.bar', ["alias.bluesniff.foo.bar"], ['fe80::a8b2:93ff:dead:beef'])]
|
|
+ with patch.object(socket, 'gethostbyaddr', side_effect=reverse_resolv_mock):
|
|
+ fqdns = core.fqdns()
|
|
+ assert "fqdns" in fqdns
|
|
+ for alias in ["this.is.valid.alias", "alias.bluesniff.foo.bar"]:
|
|
+ assert alias in fqdns["fqdns"]
|
|
+
|
|
+ for alias in ["throwmeaway", "false-hostname", "badaliass"]:
|
|
+ assert alias not in fqdns["fqdns"]
|
|
+
|
|
def test_core_virtual(self):
|
|
'''
|
|
test virtual grain with cmd virt-what
|
|
diff --git a/tests/unit/utils/test_network.py b/tests/unit/utils/test_network.py
|
|
index 7dcca0166e..74479b0cae 100644
|
|
--- a/tests/unit/utils/test_network.py
|
|
+++ b/tests/unit/utils/test_network.py
|
|
@@ -701,3 +701,27 @@ class NetworkTestCase(TestCase):
|
|
# An exception is raised if unicode is passed to socket.getfqdn
|
|
minion_id = network.generate_minion_id()
|
|
assert minion_id != '', minion_id
|
|
+
|
|
+ def test_netlink_tool_remote_on(self):
|
|
+ with patch('subprocess.check_output', return_value=NETLINK_SS):
|
|
+ remotes = network._netlink_tool_remote_on('4505', 'remote')
|
|
+ self.assertEqual(remotes, set(['127.0.0.1', '::ffff:1.2.3.4']))
|
|
+
|
|
+ def test_is_fqdn(self):
|
|
+ """
|
|
+ Test is_fqdn function passes possible FQDN names.
|
|
+
|
|
+ :return: None
|
|
+ """
|
|
+ for fqdn in ["host.domain.com", "something.with.the.dots.still.ok", "UPPERCASE.ALSO.SHOULD.WORK",
|
|
+ "MiXeD.CaSe.AcCePtAbLe", "123.host.com", "host123.com", "some_underscore.com", "host-here.com"]:
|
|
+ assert network.is_fqdn(fqdn)
|
|
+
|
|
+ def test_is_not_fqdn(self):
|
|
+ """
|
|
+ Test is_fqdn function rejects FQDN names.
|
|
+
|
|
+ :return: None
|
|
+ """
|
|
+ for fqdn in ["hostname", "/some/path", "$variable.here", "verylonghostname.{}".format("domain" * 45)]:
|
|
+ assert not network.is_fqdn(fqdn)
|
|
--
|
|
2.16.4
|
|
|
|
|