summaryrefslogtreecommitdiffstats
path: root/plugins/network_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/network_utils.py')
-rw-r--r--plugins/network_utils.py83
1 files changed, 83 insertions, 0 deletions
diff --git a/plugins/network_utils.py b/plugins/network_utils.py
new file mode 100644
index 0000000..83fecc0
--- /dev/null
+++ b/plugins/network_utils.py
@@ -0,0 +1,83 @@
+#!/usr/bin/python
+# network_utils.py Network utility
+# Copyright (C) 2014 Red Hat Inc
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+import re
+import socket
+import ethtool
+import logging
+
+
+IPADDR_RE = re.compile(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')
+DOMAIN_RE = re.compile(
+ flags=re.VERBOSE,
+ pattern=r"""
+ ^
+ [\w\.\-\_]+
+ \w+
+ $
+ """
+)
+
+
+def getNonLoopbackAddresses():
+ devices = ethtool.get_active_devices()
+ iplist = []
+
+ for device in devices:
+ try:
+ flags = ethtool.get_flags(device)
+ if flags and not (flags & ethtool.IFF_LOOPBACK):
+ iplist.append(ethtool.get_ipaddr(device))
+ except IOError as e:
+ logging.error("unable to get ipaddr/flags for %s: %s"
+ % (device, e))
+ return set(iplist)
+
+
+def validateFQDNresolvability(fqdn):
+ try:
+ resolvedAddresses = set(socket.gethostbyname_ex(fqdn)[2])
+ except socket.error:
+ return "%s did not resolve into an IP address" % fqdn
+
+ if not resolvedAddresses.issubset(getNonLoopbackAddresses()):
+ return "The following addreses: '%s' can't be mapped to non " \
+ "loopback devices on this host" % resolvedAddresses
+
+
+def validateHostAddress(address):
+ if not address:
+ return "Please specify host Address"
+
+ if IPADDR_RE.match(address):
+ if not address in getNonLoopbackAddresses():
+ return "Address '%s' can't be mapped to non loopback devices " \
+ "on this host" % address
+ else:
+ return
+
+ if len(address) > 1000:
+ return "FQDN has invalid length"
+
+ components = address.split('.', 1)
+ if len(components) < 2:
+ return "Host FQDN name '%s' has no domain suffix" % address
+ else:
+ if not DOMAIN_RE.match(components[1]):
+ return "Host FQDN name '%s' has invalid domain name" % address
+ return validateFQDNresolvability(address)