File feat-add-grain-for-all-fqdns.patch of Package salt
From 682370355bac62938d0fd3812a6bfa5b7a957306 Mon Sep 17 00:00:00 2001
From: Michele Bologna <michele.bologna@suse.com>
Date: Thu, 14 Dec 2017 18:20:02 +0100
Subject: [PATCH] Feat: add grain for all FQDNs
This PR adds a grain named fqdns to the grains.
fqdns represents all the FQDNs known for the system on all available interfaces (excluding lo).
Note: hostname != FQDN
hostname is the UNIX name of the machine. A machine can have one and only one hostname.
FQDN is host.domain that resolves to an IP address that the machines is answering to.
A machine can have 1+ FQDNs.
Upstream PR:
https://github.com/saltstack/salt/pull/45060
---
salt/grains/core.py | 27 +++++++++++++++++++++++++++
tests/integration/modules/grains.py | 1 +
tests/unit/grains/core_test.py | 19 +++++++++++++++++++
3 files changed, 47 insertions(+)
diff --git a/salt/grains/core.py b/salt/grains/core.py
index f5ee390c53..f6cda56ba5 100644
--- a/salt/grains/core.py
+++ b/salt/grains/core.py
@@ -1667,6 +1667,33 @@ def append_domain():
return grain
+def fqdns():
+ '''
+ Return all known FQDNs for the system by enumerating all interfaces and
+ then trying to reverse resolve them (excluding 'lo' interface).
+ '''
+ # Provides:
+ # 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))
+
+ for ip in addresses:
+ try:
+ fqdns.add(socket.gethostbyaddr(ip)[0])
+ except (socket.error, socket.herror,
+ socket.gaierror, socket.timeout) as e:
+ log.error("Exception during resolving address: " + str(e))
+
+ grains['fqdns'] = list(fqdns)
+ return grains
+
+
def ip_fqdn():
'''
Return ip address and FQDN grains
diff --git a/tests/integration/modules/grains.py b/tests/integration/modules/grains.py
index 848a111720..ce0f037817 100644
--- a/tests/integration/modules/grains.py
+++ b/tests/integration/modules/grains.py
@@ -52,6 +52,7 @@ class TestModulesGrains(integration.ModuleCase):
'cpuarch',
'domain',
'fqdn',
+ 'fqdns',
'gid',
'groupname',
'host',
diff --git a/tests/unit/grains/core_test.py b/tests/unit/grains/core_test.py
index 51bb609a3b..6f55324b97 100644
--- a/tests/unit/grains/core_test.py
+++ b/tests/unit/grains/core_test.py
@@ -8,6 +8,7 @@ from __future__ import absolute_import
import logging
import os
import platform
+import socket
# Import Salt Testing Libs
from salttesting import TestCase, skipIf
@@ -615,6 +616,24 @@ PATCHLEVEL = 3
get_dns = core.dns()
self.assertEqual(get_dns, ret)
+ @skipIf(not salt.utils.is_linux(), 'System is not Linux')
+ def test_fqdns_return(self):
+ reverse_resolv_mock = [('foo.bar.baz', [], ['1.2.3.4']),
+ ('rinzler.evil-corp.com', [], ['5.6.7.8']),
+ ('foo.bar.baz', [], ['fe80::a8b2:93ff:fe00:0']),
+ ('bluesniff.foo.bar', [], ['fe80::a8b2:93ff:dead:beef'])]
+ ret = {'fqdns': ['rinzler.evil-corp.com', 'foo.bar.baz', 'bluesniff.foo.bar']}
+ self._run_fqdns_test(reverse_resolv_mock, ret)
+
+ def _run_fqdns_test(self, reverse_resolv_mock, ret):
+ with patch.object(salt.utils, 'is_windows', MagicMock(return_value=False)):
+ with 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'])):
+ with patch.object(socket, 'gethostbyaddr', side_effect=reverse_resolv_mock):
+ fqdns = core.fqdns()
+ self.assertEqual(fqdns, ret)
if __name__ == '__main__':
from integration import run_tests
--
2.17.1