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

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

# 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 AIXNetwork(GenericBsdIfconfigNetwork): 

""" 

This is the AIX Network Class. 

It uses the GenericBsdIfconfigNetwork unchanged. 

""" 

platform = 'AIX' 

 

def get_default_interfaces(self, route_path): 

netstat_path = self.module.get_bin_path('netstat') 

 

rc, out, err = self.module.run_command([netstat_path, '-nr']) 

 

interface = dict(v4={}, v6={}) 

 

lines = out.splitlines() 

for line in lines: 

words = line.split() 

if len(words) > 1 and words[0] == 'default': 

if '.' in words[1]: 

interface['v4']['gateway'] = words[1] 

interface['v4']['interface'] = words[5] 

elif ':' in words[1]: 

interface['v6']['gateway'] = words[1] 

interface['v6']['interface'] = words[5] 

 

return interface['v4'], interface['v6'] 

 

# AIX 'ifconfig -a' does not have three words in the interface line 

def get_interfaces_info(self, ifconfig_path, ifconfig_options='-a'): 

interfaces = {} 

current_if = {} 

ips = dict( 

all_ipv4_addresses=[], 

all_ipv6_addresses=[], 

) 

 

uname_rc = None 

uname_out = None 

uname_err = None 

uname_path = self.module.get_bin_path('uname') 

if uname_path: 

uname_rc, uname_out, uname_err = self.module.run_command([uname_path, '-W']) 

 

rc, out, err = self.module.run_command([ifconfig_path, ifconfig_options]) 

 

for line in out.splitlines(): 

 

if line: 

words = line.split() 

 

# only this condition differs from GenericBsdIfconfigNetwork 

if re.match(r'^\w*\d*:', line): 

current_if = self.parse_interface_line(words) 

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) 

 

# don't bother with wpars it does not work 

# zero means not in wpar 

if not uname_rc and uname_out.split()[0] == '0': 

 

if current_if['macaddress'] == 'unknown' and re.match('^en', current_if['device']): 

entstat_path = self.module.get_bin_path('entstat') 

if entstat_path: 

rc, out, err = self.module.run_command([entstat_path, current_if['device']]) 

if rc != 0: 

break 

for line in out.splitlines(): 

if not line: 

pass 

buff = re.match('^Hardware Address: (.*)', line) 

if buff: 

current_if['macaddress'] = buff.group(1) 

 

buff = re.match('^Device Type:', line) 

if buff and re.match('.*Ethernet', line): 

current_if['type'] = 'ether' 

 

# device must have mtu attribute in ODM 

if 'mtu' not in current_if: 

lsattr_path = self.module.get_bin_path('lsattr') 

if lsattr_path: 

rc, out, err = self.module.run_command([lsattr_path, '-El', current_if['device']]) 

if rc != 0: 

break 

for line in out.splitlines(): 

if line: 

words = line.split() 

if words[0] == 'mtu': 

current_if['mtu'] = words[1] 

return interfaces, ips 

 

# AIX 'ifconfig -a' does not inform about MTU, so remove current_if['mtu'] here 

def parse_interface_line(self, words): 

device = words[0][0:-1] 

current_if = {'device': device, 'ipv4': [], 'ipv6': [], 'type': 'unknown'} 

current_if['flags'] = self.get_options(words[1]) 

current_if['macaddress'] = 'unknown' # will be overwritten later 

return current_if 

 

 

class AIXNetworkCollector(NetworkCollector): 

_fact_class = AIXNetwork 

_platform = 'AIX'