[Python-checkins] cpython (2.7): #19855: uuid.get_node now looks on the PATH for executables on unix.

r.david.murray python-checkins at python.org
Wed Dec 18 03:33:13 CET 2013


http://hg.python.org/cpython/rev/9f9ae5f7c4ae
changeset:   88038:9f9ae5f7c4ae
branch:      2.7
parent:      88032:226c37c209fc
user:        R David Murray <rdmurray at bitdance.com>
date:        Tue Dec 17 21:27:56 2013 -0500
summary:
  #19855: uuid.get_node now looks on the PATH for executables on unix.

Patch by Serhiy Storchaka.

files:
  Lib/uuid.py |  55 ++++++++++++++++++++++------------------
  Misc/NEWS   |   4 ++
  2 files changed, 34 insertions(+), 25 deletions(-)


diff --git a/Lib/uuid.py b/Lib/uuid.py
--- a/Lib/uuid.py
+++ b/Lib/uuid.py
@@ -293,33 +293,38 @@
 
 def _find_mac(command, args, hw_identifiers, get_index):
     import os
-    for dir in ['', '/sbin/', '/usr/sbin']:
+    path = os.environ.get("PATH", os.defpath).split(os.pathsep)
+    path.extend(('/sbin', '/usr/sbin'))
+    for dir in path:
         executable = os.path.join(dir, command)
-        if not os.path.exists(executable):
-            continue
+        if (os.path.exists(executable) and
+            os.access(executable, os.F_OK | os.X_OK) and
+            not os.path.isdir(executable)):
+            break
+    else:
+        return None
 
-        try:
-            # LC_ALL to get English output, 2>/dev/null to
-            # prevent output on stderr
-            cmd = 'LC_ALL=C %s %s 2>/dev/null' % (executable, args)
-            with os.popen(cmd) as pipe:
-                for line in pipe:
-                    words = line.lower().split()
-                    for i in range(len(words)):
-                        if words[i] in hw_identifiers:
-                            try:
-                                return int(
-                                    words[get_index(i)].replace(':', ''), 16)
-                            except (ValueError, IndexError):
-                                # Virtual interfaces, such as those provided by
-                                # VPNs, do not have a colon-delimited MAC address
-                                # as expected, but a 16-byte HWAddr separated by
-                                # dashes. These should be ignored in favor of a
-                                # real MAC address
-                                pass
-        except IOError:
-            continue
-    return None
+    try:
+        # LC_MESSAGES to get English output, 2>/dev/null to
+        # prevent output on stderr
+        cmd = 'LC_MESSAGES=C %s %s 2>/dev/null' % (executable, args)
+        with os.popen(cmd) as pipe:
+            for line in pipe:
+                words = line.lower().split()
+                for i in range(len(words)):
+                    if words[i] in hw_identifiers:
+                        try:
+                            return int(
+                                words[get_index(i)].replace(':', ''), 16)
+                        except (ValueError, IndexError):
+                            # Virtual interfaces, such as those provided by
+                            # VPNs, do not have a colon-delimited MAC address
+                            # as expected, but a 16-byte HWAddr separated by
+                            # dashes. These should be ignored in favor of a
+                            # real MAC address
+                            pass
+    except IOError:
+        pass
 
 def _ifconfig_getnode():
     """Get the hardware address on Unix by running ifconfig."""
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -27,6 +27,10 @@
 Library
 -------
 
+- Issue #19855: uuid.getnode() on Unix now looks on the PATH for the
+  executables used to find the mac address, with /sbin and /usr/sbin as
+  fallbacks.
+
 - Issue #20007: HTTPResponse.read(0) no more prematurely closes connection.
   Original patch by Simon Sapin.
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list