Skip to content

Commit 7279bdb

Browse files
committed
Allow pifconfig script to show multiple IPv4 addresses
1 parent bd28fc3 commit 7279bdb

File tree

2 files changed

+27
-22
lines changed

2 files changed

+27
-22
lines changed

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)