bpo-9678: Fix determining the MAC address in the uuid module. (GH-4264) (#4269)

* Using ifconfig on NetBSD and OpenBSD.
* Using arp on Linux, FreeBSD, NetBSD and OpenBSD.

Based on patch by Takayuki Shimizukawa.
(cherry picked from commit ee1a9a2b78)
This commit is contained in:
Miss Islington (bot) 2017-11-04 01:11:20 -07:00 committed by Serhiy Storchaka
parent 8ce98543ef
commit ec2b2dcdd6
2 changed files with 22 additions and 2 deletions

View File

@ -349,8 +349,9 @@ def _find_mac(command, args, hw_identifiers, get_index):
def _ifconfig_getnode():
"""Get the hardware address on Unix by running ifconfig."""
# This works on Linux ('' or '-a'), Tru64 ('-av'), but not all Unixes.
keywords = (b'hwaddr', b'ether', b'address:', b'lladdr')
for args in ('', '-a', '-av'):
mac = _find_mac('ifconfig', args, [b'hwaddr', b'ether'], lambda i: i+1)
mac = _find_mac('ifconfig', args, keywords, lambda i: i+1)
if mac:
return mac
@ -370,7 +371,20 @@ def _arp_getnode():
return None
# Try getting the MAC addr from arp based on our IP address (Solaris).
return _find_mac('arp', '-an', [os.fsencode(ip_addr)], lambda i: -1)
mac = _find_mac('arp', '-an', [os.fsencode(ip_addr)], lambda i: -1)
if mac:
return mac
# This works on OpenBSD
mac = _find_mac('arp', '-an', [os.fsencode(ip_addr)], lambda i: i+1)
if mac:
return mac
# This works on Linux, FreeBSD and NetBSD
mac = _find_mac('arp', '-an', [os.fsencode('(%s)' % ip_addr)],
lambda i: i+2)
if mac:
return mac
def _lanscan_getnode():
"""Get the hardware address on Unix by running lanscan."""

View File

@ -0,0 +1,6 @@
Fixed determining the MAC address in the uuid module:
* Using ifconfig on NetBSD and OpenBSD.
* Using arp on Linux, FreeBSD, NetBSD and OpenBSD.
Based on patch by Takayuki Shimizukawa.