117 lines
4.7 KiB
Python
117 lines
4.7 KiB
Python
# This file is part of Ansible
|
|
#
|
|
# Ansible 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 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# Ansible 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 Ansible. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
from __future__ import (absolute_import, division, print_function)
|
|
__metaclass__ = type
|
|
|
|
import re
|
|
|
|
from ansible.module_utils.facts.network.base import NetworkCollector
|
|
from ansible.module_utils.facts.network.generic_bsd import GenericBsdIfconfigNetwork
|
|
|
|
|
|
class SunOSNetwork(GenericBsdIfconfigNetwork):
|
|
"""
|
|
This is the SunOS Network Class.
|
|
It uses the GenericBsdIfconfigNetwork.
|
|
|
|
Solaris can have different FLAGS and MTU for IPv4 and IPv6 on the same interface
|
|
so these facts have been moved inside the 'ipv4' and 'ipv6' lists.
|
|
"""
|
|
platform = 'SunOS'
|
|
|
|
# Solaris 'ifconfig -a' will print interfaces twice, once for IPv4 and again for IPv6.
|
|
# MTU and FLAGS also may differ between IPv4 and IPv6 on the same interface.
|
|
# 'parse_interface_line()' checks for previously seen interfaces before defining
|
|
# 'current_if' so that IPv6 facts don't clobber IPv4 facts (or vice versa).
|
|
def get_interfaces_info(self, ifconfig_path):
|
|
interfaces = {}
|
|
current_if = {}
|
|
ips = dict(
|
|
all_ipv4_addresses=[],
|
|
all_ipv6_addresses=[],
|
|
)
|
|
rc, out, err = self.module.run_command([ifconfig_path, '-a'])
|
|
|
|
for line in out.splitlines():
|
|
|
|
if line:
|
|
words = line.split()
|
|
|
|
if re.match(r'^\S', line) and len(words) > 3:
|
|
current_if = self.parse_interface_line(words, current_if, interfaces)
|
|
interfaces[current_if['device']] = current_if
|
|
elif words[0].startswith('options='):
|
|
self.parse_options_line(words, current_if, ips)
|
|
elif words[0] == 'nd6':
|
|
self.parse_nd6_line(words, current_if, ips)
|
|
elif words[0] == 'ether':
|
|
self.parse_ether_line(words, current_if, ips)
|
|
elif words[0] == 'media:':
|
|
self.parse_media_line(words, current_if, ips)
|
|
elif words[0] == 'status:':
|
|
self.parse_status_line(words, current_if, ips)
|
|
elif words[0] == 'lladdr':
|
|
self.parse_lladdr_line(words, current_if, ips)
|
|
elif words[0] == 'inet':
|
|
self.parse_inet_line(words, current_if, ips)
|
|
elif words[0] == 'inet6':
|
|
self.parse_inet6_line(words, current_if, ips)
|
|
else:
|
|
self.parse_unknown_line(words, current_if, ips)
|
|
|
|
# 'parse_interface_line' and 'parse_inet*_line' leave two dicts in the
|
|
# ipv4/ipv6 lists which is ugly and hard to read.
|
|
# This quick hack merges the dictionaries. Purely cosmetic.
|
|
for iface in interfaces:
|
|
for v in 'ipv4', 'ipv6':
|
|
combined_facts = {}
|
|
for facts in interfaces[iface][v]:
|
|
combined_facts.update(facts)
|
|
if len(combined_facts.keys()) > 0:
|
|
interfaces[iface][v] = [combined_facts]
|
|
|
|
return interfaces, ips
|
|
|
|
def parse_interface_line(self, words, current_if, interfaces):
|
|
device = words[0][0:-1]
|
|
if device not in interfaces:
|
|
current_if = {'device': device, 'ipv4': [], 'ipv6': [], 'type': 'unknown'}
|
|
else:
|
|
current_if = interfaces[device]
|
|
flags = self.get_options(words[1])
|
|
v = 'ipv4'
|
|
if 'IPv6' in flags:
|
|
v = 'ipv6'
|
|
if 'LOOPBACK' in flags:
|
|
current_if['type'] = 'loopback'
|
|
current_if[v].append({'flags': flags, 'mtu': words[3]})
|
|
current_if['macaddress'] = 'unknown' # will be overwritten later
|
|
return current_if
|
|
|
|
# Solaris displays single digit octets in MAC addresses e.g. 0:1:2:d:e:f
|
|
# Add leading zero to each octet where needed.
|
|
def parse_ether_line(self, words, current_if, ips):
|
|
macaddress = ''
|
|
for octet in words[1].split(':'):
|
|
octet = ('0' + octet)[-2:None]
|
|
macaddress += (octet + ':')
|
|
current_if['macaddress'] = macaddress[0:-1]
|
|
|
|
|
|
class SunOSNetworkCollector(NetworkCollector):
|
|
_fact_class = SunOSNetwork
|
|
_platform = 'SunOS'
|