Skip to content

Commit 8dd5f63

Browse files
Merge pull request #53 from frenzymadness/fix_multiple_ipv4_addrs_bug
Fix multiple ipv4 addrs bug
2 parents bd28fc3 + b64bfb2 commit 8dd5f63

File tree

3 files changed

+46
-23
lines changed

3 files changed

+46
-23
lines changed

.travis.yml

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,23 @@ cache:
1919
- $HOME/virtualenv/python$TRAVIS_PYTHON_VERSION/bin
2020
notifications:
2121
email: false
22-
install: pip install --upgrade tox tox-travis
22+
install:
23+
- pip install --upgrade tox tox-travis
24+
- sudo ip link add dummy1 type dummy
25+
- sudo ip link add dummy4 type dummy
26+
- sudo ip addr add 203.0.113.1 broadcast 203.0.113.255 dev dummy4
27+
- sudo ip addr add 198.51.100.1 broadcast 198.51.100.255 dev dummy4
28+
- sudo ip link set dummy1 up
29+
- sudo ip link set dummy4 up
30+
# Be ready for IPv6
31+
# - sudo ip link add dummy46 type dummy
32+
# - sudo ip addr add 203.0.113.10 broadcast 203.0.113.255 dev dummy46
33+
# - sudo ip addr add 198.51.100.10 broadcast 198.51.100.255 dev dummy46
34+
# - sudo ip addr add 2001:db8::10/64 dev dummy46
35+
# - sudo ip addr add 2001:db9::10/64 dev dummy46
36+
# - sudo ip link add dummy6 type dummy
37+
# - sudo ip addr add 2001:db8::1/64 dev dummy6
38+
# - sudo ip addr add 2001:db9::1/64 dev dummy6
39+
# - sudo ip link set dummy6 up
40+
# - sudo ip link set dummy46 up
2341
script: tox

scripts/pifconfig

100644100755
Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,17 @@
1717
from __future__ import unicode_literals, print_function
1818

1919
import ethtool
20+
import socket
21+
import struct
2022
import sys
2123
from optparse import OptionParser
2224

2325

26+
def bits2netmask(bits):
27+
mask = (1 << 32) - (1 << 32 >> bits)
28+
return socket.inet_ntoa(struct.pack(">L", mask))
29+
30+
2431
def flags2str(flags):
2532
string = ''
2633
if flags & ethtool.IFF_UP:
@@ -60,24 +67,19 @@ def flags2str(flags):
6067

6168

6269
def show_config(device):
63-
try:
64-
ipaddr = ethtool.get_ipaddr(device)
65-
netmask = ethtool.get_netmask(device)
66-
broadcast = ethtool.get_broadcast(device)
67-
except (IOError, OSError):
68-
ipaddr, netmask, broadcast = None, None, None
6970
flags = ethtool.get_flags(device)
70-
print('%s' % device)
71-
if not (flags & ethtool.IFF_LOOPBACK):
72-
print('\tHWaddr %s' % ethtool.get_hwaddr(device))
73-
if ipaddr is not None:
74-
print('\tinet addr:%s' % ipaddr)
75-
if broadcast is not None and \
76-
not (flags & (ethtool.IFF_LOOPBACK | ethtool.IFF_POINTOPOINT)):
77-
print('\tBcast:%s' % broadcast)
78-
if netmask is not None:
79-
print('\tMask:%s' % netmask)
71+
8072
for info in ethtool.get_interfaces_info(device):
73+
print(device)
74+
if not (flags & ethtool.IFF_LOOPBACK):
75+
print('\tHWaddr %s' % ethtool.get_hwaddr(device))
76+
77+
for addr in info.get_ipv4_addresses():
78+
print('\tinet addr:%s' % addr.address, end=" ")
79+
if not (flags & (ethtool.IFF_LOOPBACK | ethtool.IFF_POINTOPOINT)):
80+
print('Bcast:%s' % addr.broadcast, end=" ")
81+
print('Mask:%s' % bits2netmask(addr.netmask))
82+
8183
for addr in info.get_ipv6_addresses():
8284
print('\tinet6 addr: %s/%s Scope: %s'
8385
% (addr.address,

tests/test_ethtool.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -175,17 +175,20 @@ def _verify_etherinfo_object(self, ei):
175175
scraped = None
176176

177177
self.assertIsStringOrNone(ei.ipv4_address)
178-
if scraped:
179-
self.assertEqual(ei.ipv4_address, scraped.inet)
178+
if scraped and scraped.inet:
179+
addresses = [ip.address for ip in ei.get_ipv4_addresses()]
180+
self.assertTrue(scraped.inet in addresses)
180181

181182
self.assertIsStringOrNone(ei.ipv4_broadcast)
182-
if scraped and scraped.broadcast:
183+
if scraped and scraped.broadcast not in (None, '0.0.0.0'):
183184
# Broadcast is optional
184-
self.assertEqual(ei.ipv4_broadcast, scraped.broadcast)
185+
broadcasts = [ip.broadcast for ip in ei.get_ipv4_addresses()]
186+
self.assertTrue(scraped.broadcast in broadcasts)
185187

186188
self.assertIsInt(ei.ipv4_netmask)
187-
if scraped:
188-
self.assertEqual(ei.ipv4_netmask, scraped.get_netmask_bits())
189+
if scraped and scraped.netmask:
190+
netmasks = [ip.netmask for ip in ei.get_ipv4_addresses()]
191+
self.assertTrue(scraped.get_netmask_bits(), netmasks)
189192

190193
self.assertIsStringOrNone(ei.mac_address)
191194
if scraped and scraped.hwaddr and scraped.hwtitle.lower() != 'unspec':

0 commit comments

Comments
 (0)