Merge branch 'setup-linux-network-advanced' of git://github.com/dagwieers/ansible into devel

pull/2586/merge
Michael DeHaan 12 years ago
commit aa897571b4

@ -995,21 +995,53 @@ class LinuxNetwork(Network):
all_ipv4_addresses = [], all_ipv4_addresses = [],
all_ipv6_addresses = [], all_ipv6_addresses = [],
) )
rc, out, err = module.run_command([ip_path, 'addr', 'show'])
for line in out.split('\n'): for path in glob.glob('/sys/class/net/*'):
if line: if not os.path.isdir(path): continue
device = os.path.basename(path)
interfaces[device] = { 'device': device }
if os.path.exists(os.path.join(path, 'address')):
macaddress = open(os.path.join(path, 'address')).read().strip()
if macaddress and macaddress != '00:00:00:00:00:00':
interfaces[device]['macaddress'] = macaddress
if os.path.exists(os.path.join(path, 'mtu')):
interfaces[device]['mtu'] = int(open(os.path.join(path, 'mtu')).read().strip())
if os.path.exists(os.path.join(path, 'operstate')):
interfaces[device]['active'] = open(os.path.join(path, 'operstate')).read().strip() != 'down'
# if os.path.exists(os.path.join(path, 'carrier')):
# interfaces[device]['link'] = open(os.path.join(path, 'carrier')).read().strip() == '1'
if os.path.exists(os.path.join(path, 'device','driver', 'module')):
interfaces[device]['module'] = os.path.basename(os.path.realpath(os.path.join(path, 'device', 'driver', 'module')))
if os.path.exists(os.path.join(path, 'type')):
type = open(os.path.join(path, 'type')).read().strip()
if type == '1':
interfaces[device]['type'] = 'ether'
elif type == '512':
interfaces[device]['type'] = 'ppp'
elif type == '772':
interfaces[device]['type'] = 'loopback'
if os.path.exists(os.path.join(path, 'bridge')):
interfaces[device]['type'] = 'bridge'
interfaces[device]['interfaces'] = [ os.path.basename(b) for b in glob.glob(os.path.join(path, 'brif', '*')) ]
if os.path.exists(os.path.join(path, 'bridge', 'bridge_id')):
interfaces[device]['id'] = open(os.path.join(path, 'bridge', 'bridge_id')).read().strip()
if os.path.exists(os.path.join(path, 'bridge', 'stp_state')):
interfaces[device]['stp'] = open(os.path.join(path, 'bridge', 'stp_state')).read().strip() == '1'
if os.path.exists(os.path.join(path, 'bonding')):
interfaces[device]['type'] = 'bonding'
interfaces[device]['slaves'] = open(os.path.join(path, 'bonding', 'slaves')).read().split()
interfaces[device]['mode'] = open(os.path.join(path, 'bonding', 'mode')).read().split()[0]
interfaces[device]['miimon'] = open(os.path.join(path, 'bonding', 'miimon')).read().split()[0]
interfaces[device]['lacp_rate'] = open(os.path.join(path, 'bonding', 'lacp_rate')).read().split()[0]
primary = open(os.path.join(path, 'bonding', 'primary')).read()
if primary:
interfaces[device]['primary'] = primary
interfaces[device]['all_slaves_active'] = open(os.path.join(path, 'bonding', 'all_slaves_active')).read() == '1'
output = subprocess.Popen(['/sbin/ip', 'addr', 'show', device], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
for line in output.split('\n'):
if not line: continue
words = line.split() words = line.split()
if not line.startswith(' '): if words[0] == 'inet':
device = words[1][0:-1]
mtu = words[4]
elif words[0].startswith('link/'):
iface_type = words[0].split('/')[1]
# tun interfaces can have any interface type, but won't have an address
if iface_type in ('void', 'none') or len(words) == 1:
macaddress = 'unknown'
else:
macaddress = words[1]
elif words[0] == 'inet':
if '/' in words[1]: if '/' in words[1]:
address, netmask_length = words[1].split('/') address, netmask_length = words[1].split('/')
else: else:
@ -1017,26 +1049,13 @@ class LinuxNetwork(Network):
address = words[1] address = words[1]
netmask_length = "32" netmask_length = "32"
address_bin = struct.unpack('!L', socket.inet_aton(address))[0] address_bin = struct.unpack('!L', socket.inet_aton(address))[0]
netmask_bin = (1<<32) - (1<<32>>int(netmask_length)) netmask_bin = (1<<32) - (1<<32>>int(netmask_length))
netmask = socket.inet_ntoa(struct.pack('!L', netmask_bin)) netmask = socket.inet_ntoa(struct.pack('!L', netmask_bin))
network = socket.inet_ntoa(struct.pack('!L', address_bin & netmask_bin)) network = socket.inet_ntoa(struct.pack('!L', address_bin & netmask_bin))
iface = words[-1] iface = words[-1]
# If an interface has multiple IPv4 addresses, make up an if iface != device:
# interface name for each address interfaces[iface] = {}
if iface in interfaces: interfaces[iface].update(facts[device])
i = 0
while str(iface) + "_" + str(i) in interfaces:
i += 1
iface = str(iface) + "_" + str(i)
interfaces[iface] = {}
interfaces[iface]['macaddress'] = macaddress
interfaces[iface]['mtu'] = mtu
interfaces[iface]['type'] = iface_type
interfaces[iface]['device'] = device
interfaces[iface]['ipv4'] = {'address': address, interfaces[iface]['ipv4'] = {'address': address,
'netmask': netmask, 'netmask': netmask,
'network': network} 'network': network}
@ -1046,26 +1065,18 @@ class LinuxNetwork(Network):
default_ipv4['netmask'] = netmask default_ipv4['netmask'] = netmask
default_ipv4['network'] = network default_ipv4['network'] = network
default_ipv4['macaddress'] = macaddress default_ipv4['macaddress'] = macaddress
default_ipv4['mtu'] = mtu default_ipv4['mtu'] = interfaces[device]['mtu']
default_ipv4['type'] = iface_type default_ipv4['type'] = interfaces[device]['type']
default_ipv4['alias'] = words[-1] default_ipv4['alias'] = words[-1]
if not address.startswith('127.'): if not address.startswith('127.'):
ips['all_ipv4_addresses'].append(address) ips['all_ipv4_addresses'].append(address)
elif words[0] == 'inet6': elif words[0] == 'inet6':
address, prefix = words[1].split('/') address, prefix = words[1].split('/')
scope = words[3] scope = words[3]
if 'ipv6' not in interfaces[device]:
iface = device interfaces[device]['ipv6'] = []
if iface not in interfaces: interfaces[device]['ipv6'].append( {
interfaces[iface] = {}
interfaces[iface]['macaddress'] = macaddress
interfaces[iface]['mtu'] = mtu
interfaces[iface]['device'] = device
if 'ipv6' not in interfaces[iface]:
interfaces[iface]['ipv6'] = []
interfaces[iface]['ipv6'].append( {
'address': address, 'address': address,
'prefix': prefix, 'prefix': prefix,
'scope': scope} ) 'scope': scope} )
@ -1075,8 +1086,8 @@ class LinuxNetwork(Network):
default_ipv6['prefix'] = prefix default_ipv6['prefix'] = prefix
default_ipv6['scope'] = scope default_ipv6['scope'] = scope
default_ipv6['macaddress'] = macaddress default_ipv6['macaddress'] = macaddress
default_ipv6['mtu'] = mtu default_ipv6['mtu'] = interfaces[device]['mtu']
default_ipv6['type'] = iface_type default_ipv6['type'] = interfaces[device]['type']
if not address == '::1': if not address == '::1':
ips['all_ipv6_addresses'].append(address) ips['all_ipv6_addresses'].append(address)

Loading…
Cancel
Save