Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

# 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'