xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/uuid.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Workerr"""UUID objects (universally unique identifiers) according to RFC 4122.
2*cda5da8dSAndroid Build Coastguard Worker
3*cda5da8dSAndroid Build Coastguard WorkerThis module provides immutable UUID objects (class UUID) and the functions
4*cda5da8dSAndroid Build Coastguard Workeruuid1(), uuid3(), uuid4(), uuid5() for generating version 1, 3, 4, and 5
5*cda5da8dSAndroid Build Coastguard WorkerUUIDs as specified in RFC 4122.
6*cda5da8dSAndroid Build Coastguard Worker
7*cda5da8dSAndroid Build Coastguard WorkerIf all you want is a unique ID, you should probably call uuid1() or uuid4().
8*cda5da8dSAndroid Build Coastguard WorkerNote that uuid1() may compromise privacy since it creates a UUID containing
9*cda5da8dSAndroid Build Coastguard Workerthe computer's network address.  uuid4() creates a random UUID.
10*cda5da8dSAndroid Build Coastguard Worker
11*cda5da8dSAndroid Build Coastguard WorkerTypical usage:
12*cda5da8dSAndroid Build Coastguard Worker
13*cda5da8dSAndroid Build Coastguard Worker    >>> import uuid
14*cda5da8dSAndroid Build Coastguard Worker
15*cda5da8dSAndroid Build Coastguard Worker    # make a UUID based on the host ID and current time
16*cda5da8dSAndroid Build Coastguard Worker    >>> uuid.uuid1()    # doctest: +SKIP
17*cda5da8dSAndroid Build Coastguard Worker    UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')
18*cda5da8dSAndroid Build Coastguard Worker
19*cda5da8dSAndroid Build Coastguard Worker    # make a UUID using an MD5 hash of a namespace UUID and a name
20*cda5da8dSAndroid Build Coastguard Worker    >>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')
21*cda5da8dSAndroid Build Coastguard Worker    UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')
22*cda5da8dSAndroid Build Coastguard Worker
23*cda5da8dSAndroid Build Coastguard Worker    # make a random UUID
24*cda5da8dSAndroid Build Coastguard Worker    >>> uuid.uuid4()    # doctest: +SKIP
25*cda5da8dSAndroid Build Coastguard Worker    UUID('16fd2706-8baf-433b-82eb-8c7fada847da')
26*cda5da8dSAndroid Build Coastguard Worker
27*cda5da8dSAndroid Build Coastguard Worker    # make a UUID using a SHA-1 hash of a namespace UUID and a name
28*cda5da8dSAndroid Build Coastguard Worker    >>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')
29*cda5da8dSAndroid Build Coastguard Worker    UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')
30*cda5da8dSAndroid Build Coastguard Worker
31*cda5da8dSAndroid Build Coastguard Worker    # make a UUID from a string of hex digits (braces and hyphens ignored)
32*cda5da8dSAndroid Build Coastguard Worker    >>> x = uuid.UUID('{00010203-0405-0607-0809-0a0b0c0d0e0f}')
33*cda5da8dSAndroid Build Coastguard Worker
34*cda5da8dSAndroid Build Coastguard Worker    # convert a UUID to a string of hex digits in standard form
35*cda5da8dSAndroid Build Coastguard Worker    >>> str(x)
36*cda5da8dSAndroid Build Coastguard Worker    '00010203-0405-0607-0809-0a0b0c0d0e0f'
37*cda5da8dSAndroid Build Coastguard Worker
38*cda5da8dSAndroid Build Coastguard Worker    # get the raw 16 bytes of the UUID
39*cda5da8dSAndroid Build Coastguard Worker    >>> x.bytes
40*cda5da8dSAndroid Build Coastguard Worker    b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
41*cda5da8dSAndroid Build Coastguard Worker
42*cda5da8dSAndroid Build Coastguard Worker    # make a UUID from a 16-byte string
43*cda5da8dSAndroid Build Coastguard Worker    >>> uuid.UUID(bytes=x.bytes)
44*cda5da8dSAndroid Build Coastguard Worker    UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')
45*cda5da8dSAndroid Build Coastguard Worker"""
46*cda5da8dSAndroid Build Coastguard Worker
47*cda5da8dSAndroid Build Coastguard Workerimport os
48*cda5da8dSAndroid Build Coastguard Workerimport sys
49*cda5da8dSAndroid Build Coastguard Worker
50*cda5da8dSAndroid Build Coastguard Workerfrom enum import Enum, _simple_enum
51*cda5da8dSAndroid Build Coastguard Worker
52*cda5da8dSAndroid Build Coastguard Worker
53*cda5da8dSAndroid Build Coastguard Worker__author__ = 'Ka-Ping Yee <[email protected]>'
54*cda5da8dSAndroid Build Coastguard Worker
55*cda5da8dSAndroid Build Coastguard Worker# The recognized platforms - known behaviors
56*cda5da8dSAndroid Build Coastguard Workerif sys.platform in ('win32', 'darwin'):
57*cda5da8dSAndroid Build Coastguard Worker    _AIX = _LINUX = False
58*cda5da8dSAndroid Build Coastguard Workerelse:
59*cda5da8dSAndroid Build Coastguard Worker    import platform
60*cda5da8dSAndroid Build Coastguard Worker    _platform_system = platform.system()
61*cda5da8dSAndroid Build Coastguard Worker    _AIX     = _platform_system == 'AIX'
62*cda5da8dSAndroid Build Coastguard Worker    _LINUX   = _platform_system == 'Linux'
63*cda5da8dSAndroid Build Coastguard Worker
64*cda5da8dSAndroid Build Coastguard Worker_MAC_DELIM = b':'
65*cda5da8dSAndroid Build Coastguard Worker_MAC_OMITS_LEADING_ZEROES = False
66*cda5da8dSAndroid Build Coastguard Workerif _AIX:
67*cda5da8dSAndroid Build Coastguard Worker    _MAC_DELIM = b'.'
68*cda5da8dSAndroid Build Coastguard Worker    _MAC_OMITS_LEADING_ZEROES = True
69*cda5da8dSAndroid Build Coastguard Worker
70*cda5da8dSAndroid Build Coastguard WorkerRESERVED_NCS, RFC_4122, RESERVED_MICROSOFT, RESERVED_FUTURE = [
71*cda5da8dSAndroid Build Coastguard Worker    'reserved for NCS compatibility', 'specified in RFC 4122',
72*cda5da8dSAndroid Build Coastguard Worker    'reserved for Microsoft compatibility', 'reserved for future definition']
73*cda5da8dSAndroid Build Coastguard Worker
74*cda5da8dSAndroid Build Coastguard Workerint_ = int      # The built-in int type
75*cda5da8dSAndroid Build Coastguard Workerbytes_ = bytes  # The built-in bytes type
76*cda5da8dSAndroid Build Coastguard Worker
77*cda5da8dSAndroid Build Coastguard Worker
78*cda5da8dSAndroid Build Coastguard Worker@_simple_enum(Enum)
79*cda5da8dSAndroid Build Coastguard Workerclass SafeUUID:
80*cda5da8dSAndroid Build Coastguard Worker    safe = 0
81*cda5da8dSAndroid Build Coastguard Worker    unsafe = -1
82*cda5da8dSAndroid Build Coastguard Worker    unknown = None
83*cda5da8dSAndroid Build Coastguard Worker
84*cda5da8dSAndroid Build Coastguard Worker
85*cda5da8dSAndroid Build Coastguard Workerclass UUID:
86*cda5da8dSAndroid Build Coastguard Worker    """Instances of the UUID class represent UUIDs as specified in RFC 4122.
87*cda5da8dSAndroid Build Coastguard Worker    UUID objects are immutable, hashable, and usable as dictionary keys.
88*cda5da8dSAndroid Build Coastguard Worker    Converting a UUID to a string with str() yields something in the form
89*cda5da8dSAndroid Build Coastguard Worker    '12345678-1234-1234-1234-123456789abc'.  The UUID constructor accepts
90*cda5da8dSAndroid Build Coastguard Worker    five possible forms: a similar string of hexadecimal digits, or a tuple
91*cda5da8dSAndroid Build Coastguard Worker    of six integer fields (with 32-bit, 16-bit, 16-bit, 8-bit, 8-bit, and
92*cda5da8dSAndroid Build Coastguard Worker    48-bit values respectively) as an argument named 'fields', or a string
93*cda5da8dSAndroid Build Coastguard Worker    of 16 bytes (with all the integer fields in big-endian order) as an
94*cda5da8dSAndroid Build Coastguard Worker    argument named 'bytes', or a string of 16 bytes (with the first three
95*cda5da8dSAndroid Build Coastguard Worker    fields in little-endian order) as an argument named 'bytes_le', or a
96*cda5da8dSAndroid Build Coastguard Worker    single 128-bit integer as an argument named 'int'.
97*cda5da8dSAndroid Build Coastguard Worker
98*cda5da8dSAndroid Build Coastguard Worker    UUIDs have these read-only attributes:
99*cda5da8dSAndroid Build Coastguard Worker
100*cda5da8dSAndroid Build Coastguard Worker        bytes       the UUID as a 16-byte string (containing the six
101*cda5da8dSAndroid Build Coastguard Worker                    integer fields in big-endian byte order)
102*cda5da8dSAndroid Build Coastguard Worker
103*cda5da8dSAndroid Build Coastguard Worker        bytes_le    the UUID as a 16-byte string (with time_low, time_mid,
104*cda5da8dSAndroid Build Coastguard Worker                    and time_hi_version in little-endian byte order)
105*cda5da8dSAndroid Build Coastguard Worker
106*cda5da8dSAndroid Build Coastguard Worker        fields      a tuple of the six integer fields of the UUID,
107*cda5da8dSAndroid Build Coastguard Worker                    which are also available as six individual attributes
108*cda5da8dSAndroid Build Coastguard Worker                    and two derived attributes:
109*cda5da8dSAndroid Build Coastguard Worker
110*cda5da8dSAndroid Build Coastguard Worker            time_low                the first 32 bits of the UUID
111*cda5da8dSAndroid Build Coastguard Worker            time_mid                the next 16 bits of the UUID
112*cda5da8dSAndroid Build Coastguard Worker            time_hi_version         the next 16 bits of the UUID
113*cda5da8dSAndroid Build Coastguard Worker            clock_seq_hi_variant    the next 8 bits of the UUID
114*cda5da8dSAndroid Build Coastguard Worker            clock_seq_low           the next 8 bits of the UUID
115*cda5da8dSAndroid Build Coastguard Worker            node                    the last 48 bits of the UUID
116*cda5da8dSAndroid Build Coastguard Worker
117*cda5da8dSAndroid Build Coastguard Worker            time                    the 60-bit timestamp
118*cda5da8dSAndroid Build Coastguard Worker            clock_seq               the 14-bit sequence number
119*cda5da8dSAndroid Build Coastguard Worker
120*cda5da8dSAndroid Build Coastguard Worker        hex         the UUID as a 32-character hexadecimal string
121*cda5da8dSAndroid Build Coastguard Worker
122*cda5da8dSAndroid Build Coastguard Worker        int         the UUID as a 128-bit integer
123*cda5da8dSAndroid Build Coastguard Worker
124*cda5da8dSAndroid Build Coastguard Worker        urn         the UUID as a URN as specified in RFC 4122
125*cda5da8dSAndroid Build Coastguard Worker
126*cda5da8dSAndroid Build Coastguard Worker        variant     the UUID variant (one of the constants RESERVED_NCS,
127*cda5da8dSAndroid Build Coastguard Worker                    RFC_4122, RESERVED_MICROSOFT, or RESERVED_FUTURE)
128*cda5da8dSAndroid Build Coastguard Worker
129*cda5da8dSAndroid Build Coastguard Worker        version     the UUID version number (1 through 5, meaningful only
130*cda5da8dSAndroid Build Coastguard Worker                    when the variant is RFC_4122)
131*cda5da8dSAndroid Build Coastguard Worker
132*cda5da8dSAndroid Build Coastguard Worker        is_safe     An enum indicating whether the UUID has been generated in
133*cda5da8dSAndroid Build Coastguard Worker                    a way that is safe for multiprocessing applications, via
134*cda5da8dSAndroid Build Coastguard Worker                    uuid_generate_time_safe(3).
135*cda5da8dSAndroid Build Coastguard Worker    """
136*cda5da8dSAndroid Build Coastguard Worker
137*cda5da8dSAndroid Build Coastguard Worker    __slots__ = ('int', 'is_safe', '__weakref__')
138*cda5da8dSAndroid Build Coastguard Worker
139*cda5da8dSAndroid Build Coastguard Worker    def __init__(self, hex=None, bytes=None, bytes_le=None, fields=None,
140*cda5da8dSAndroid Build Coastguard Worker                       int=None, version=None,
141*cda5da8dSAndroid Build Coastguard Worker                       *, is_safe=SafeUUID.unknown):
142*cda5da8dSAndroid Build Coastguard Worker        r"""Create a UUID from either a string of 32 hexadecimal digits,
143*cda5da8dSAndroid Build Coastguard Worker        a string of 16 bytes as the 'bytes' argument, a string of 16 bytes
144*cda5da8dSAndroid Build Coastguard Worker        in little-endian order as the 'bytes_le' argument, a tuple of six
145*cda5da8dSAndroid Build Coastguard Worker        integers (32-bit time_low, 16-bit time_mid, 16-bit time_hi_version,
146*cda5da8dSAndroid Build Coastguard Worker        8-bit clock_seq_hi_variant, 8-bit clock_seq_low, 48-bit node) as
147*cda5da8dSAndroid Build Coastguard Worker        the 'fields' argument, or a single 128-bit integer as the 'int'
148*cda5da8dSAndroid Build Coastguard Worker        argument.  When a string of hex digits is given, curly braces,
149*cda5da8dSAndroid Build Coastguard Worker        hyphens, and a URN prefix are all optional.  For example, these
150*cda5da8dSAndroid Build Coastguard Worker        expressions all yield the same UUID:
151*cda5da8dSAndroid Build Coastguard Worker
152*cda5da8dSAndroid Build Coastguard Worker        UUID('{12345678-1234-5678-1234-567812345678}')
153*cda5da8dSAndroid Build Coastguard Worker        UUID('12345678123456781234567812345678')
154*cda5da8dSAndroid Build Coastguard Worker        UUID('urn:uuid:12345678-1234-5678-1234-567812345678')
155*cda5da8dSAndroid Build Coastguard Worker        UUID(bytes='\x12\x34\x56\x78'*4)
156*cda5da8dSAndroid Build Coastguard Worker        UUID(bytes_le='\x78\x56\x34\x12\x34\x12\x78\x56' +
157*cda5da8dSAndroid Build Coastguard Worker                      '\x12\x34\x56\x78\x12\x34\x56\x78')
158*cda5da8dSAndroid Build Coastguard Worker        UUID(fields=(0x12345678, 0x1234, 0x5678, 0x12, 0x34, 0x567812345678))
159*cda5da8dSAndroid Build Coastguard Worker        UUID(int=0x12345678123456781234567812345678)
160*cda5da8dSAndroid Build Coastguard Worker
161*cda5da8dSAndroid Build Coastguard Worker        Exactly one of 'hex', 'bytes', 'bytes_le', 'fields', or 'int' must
162*cda5da8dSAndroid Build Coastguard Worker        be given.  The 'version' argument is optional; if given, the resulting
163*cda5da8dSAndroid Build Coastguard Worker        UUID will have its variant and version set according to RFC 4122,
164*cda5da8dSAndroid Build Coastguard Worker        overriding the given 'hex', 'bytes', 'bytes_le', 'fields', or 'int'.
165*cda5da8dSAndroid Build Coastguard Worker
166*cda5da8dSAndroid Build Coastguard Worker        is_safe is an enum exposed as an attribute on the instance.  It
167*cda5da8dSAndroid Build Coastguard Worker        indicates whether the UUID has been generated in a way that is safe
168*cda5da8dSAndroid Build Coastguard Worker        for multiprocessing applications, via uuid_generate_time_safe(3).
169*cda5da8dSAndroid Build Coastguard Worker        """
170*cda5da8dSAndroid Build Coastguard Worker
171*cda5da8dSAndroid Build Coastguard Worker        if [hex, bytes, bytes_le, fields, int].count(None) != 4:
172*cda5da8dSAndroid Build Coastguard Worker            raise TypeError('one of the hex, bytes, bytes_le, fields, '
173*cda5da8dSAndroid Build Coastguard Worker                            'or int arguments must be given')
174*cda5da8dSAndroid Build Coastguard Worker        if hex is not None:
175*cda5da8dSAndroid Build Coastguard Worker            hex = hex.replace('urn:', '').replace('uuid:', '')
176*cda5da8dSAndroid Build Coastguard Worker            hex = hex.strip('{}').replace('-', '')
177*cda5da8dSAndroid Build Coastguard Worker            if len(hex) != 32:
178*cda5da8dSAndroid Build Coastguard Worker                raise ValueError('badly formed hexadecimal UUID string')
179*cda5da8dSAndroid Build Coastguard Worker            int = int_(hex, 16)
180*cda5da8dSAndroid Build Coastguard Worker        if bytes_le is not None:
181*cda5da8dSAndroid Build Coastguard Worker            if len(bytes_le) != 16:
182*cda5da8dSAndroid Build Coastguard Worker                raise ValueError('bytes_le is not a 16-char string')
183*cda5da8dSAndroid Build Coastguard Worker            bytes = (bytes_le[4-1::-1] + bytes_le[6-1:4-1:-1] +
184*cda5da8dSAndroid Build Coastguard Worker                     bytes_le[8-1:6-1:-1] + bytes_le[8:])
185*cda5da8dSAndroid Build Coastguard Worker        if bytes is not None:
186*cda5da8dSAndroid Build Coastguard Worker            if len(bytes) != 16:
187*cda5da8dSAndroid Build Coastguard Worker                raise ValueError('bytes is not a 16-char string')
188*cda5da8dSAndroid Build Coastguard Worker            assert isinstance(bytes, bytes_), repr(bytes)
189*cda5da8dSAndroid Build Coastguard Worker            int = int_.from_bytes(bytes)  # big endian
190*cda5da8dSAndroid Build Coastguard Worker        if fields is not None:
191*cda5da8dSAndroid Build Coastguard Worker            if len(fields) != 6:
192*cda5da8dSAndroid Build Coastguard Worker                raise ValueError('fields is not a 6-tuple')
193*cda5da8dSAndroid Build Coastguard Worker            (time_low, time_mid, time_hi_version,
194*cda5da8dSAndroid Build Coastguard Worker             clock_seq_hi_variant, clock_seq_low, node) = fields
195*cda5da8dSAndroid Build Coastguard Worker            if not 0 <= time_low < 1<<32:
196*cda5da8dSAndroid Build Coastguard Worker                raise ValueError('field 1 out of range (need a 32-bit value)')
197*cda5da8dSAndroid Build Coastguard Worker            if not 0 <= time_mid < 1<<16:
198*cda5da8dSAndroid Build Coastguard Worker                raise ValueError('field 2 out of range (need a 16-bit value)')
199*cda5da8dSAndroid Build Coastguard Worker            if not 0 <= time_hi_version < 1<<16:
200*cda5da8dSAndroid Build Coastguard Worker                raise ValueError('field 3 out of range (need a 16-bit value)')
201*cda5da8dSAndroid Build Coastguard Worker            if not 0 <= clock_seq_hi_variant < 1<<8:
202*cda5da8dSAndroid Build Coastguard Worker                raise ValueError('field 4 out of range (need an 8-bit value)')
203*cda5da8dSAndroid Build Coastguard Worker            if not 0 <= clock_seq_low < 1<<8:
204*cda5da8dSAndroid Build Coastguard Worker                raise ValueError('field 5 out of range (need an 8-bit value)')
205*cda5da8dSAndroid Build Coastguard Worker            if not 0 <= node < 1<<48:
206*cda5da8dSAndroid Build Coastguard Worker                raise ValueError('field 6 out of range (need a 48-bit value)')
207*cda5da8dSAndroid Build Coastguard Worker            clock_seq = (clock_seq_hi_variant << 8) | clock_seq_low
208*cda5da8dSAndroid Build Coastguard Worker            int = ((time_low << 96) | (time_mid << 80) |
209*cda5da8dSAndroid Build Coastguard Worker                   (time_hi_version << 64) | (clock_seq << 48) | node)
210*cda5da8dSAndroid Build Coastguard Worker        if int is not None:
211*cda5da8dSAndroid Build Coastguard Worker            if not 0 <= int < 1<<128:
212*cda5da8dSAndroid Build Coastguard Worker                raise ValueError('int is out of range (need a 128-bit value)')
213*cda5da8dSAndroid Build Coastguard Worker        if version is not None:
214*cda5da8dSAndroid Build Coastguard Worker            if not 1 <= version <= 5:
215*cda5da8dSAndroid Build Coastguard Worker                raise ValueError('illegal version number')
216*cda5da8dSAndroid Build Coastguard Worker            # Set the variant to RFC 4122.
217*cda5da8dSAndroid Build Coastguard Worker            int &= ~(0xc000 << 48)
218*cda5da8dSAndroid Build Coastguard Worker            int |= 0x8000 << 48
219*cda5da8dSAndroid Build Coastguard Worker            # Set the version number.
220*cda5da8dSAndroid Build Coastguard Worker            int &= ~(0xf000 << 64)
221*cda5da8dSAndroid Build Coastguard Worker            int |= version << 76
222*cda5da8dSAndroid Build Coastguard Worker        object.__setattr__(self, 'int', int)
223*cda5da8dSAndroid Build Coastguard Worker        object.__setattr__(self, 'is_safe', is_safe)
224*cda5da8dSAndroid Build Coastguard Worker
225*cda5da8dSAndroid Build Coastguard Worker    def __getstate__(self):
226*cda5da8dSAndroid Build Coastguard Worker        d = {'int': self.int}
227*cda5da8dSAndroid Build Coastguard Worker        if self.is_safe != SafeUUID.unknown:
228*cda5da8dSAndroid Build Coastguard Worker            # is_safe is a SafeUUID instance.  Return just its value, so that
229*cda5da8dSAndroid Build Coastguard Worker            # it can be un-pickled in older Python versions without SafeUUID.
230*cda5da8dSAndroid Build Coastguard Worker            d['is_safe'] = self.is_safe.value
231*cda5da8dSAndroid Build Coastguard Worker        return d
232*cda5da8dSAndroid Build Coastguard Worker
233*cda5da8dSAndroid Build Coastguard Worker    def __setstate__(self, state):
234*cda5da8dSAndroid Build Coastguard Worker        object.__setattr__(self, 'int', state['int'])
235*cda5da8dSAndroid Build Coastguard Worker        # is_safe was added in 3.7; it is also omitted when it is "unknown"
236*cda5da8dSAndroid Build Coastguard Worker        object.__setattr__(self, 'is_safe',
237*cda5da8dSAndroid Build Coastguard Worker                           SafeUUID(state['is_safe'])
238*cda5da8dSAndroid Build Coastguard Worker                           if 'is_safe' in state else SafeUUID.unknown)
239*cda5da8dSAndroid Build Coastguard Worker
240*cda5da8dSAndroid Build Coastguard Worker    def __eq__(self, other):
241*cda5da8dSAndroid Build Coastguard Worker        if isinstance(other, UUID):
242*cda5da8dSAndroid Build Coastguard Worker            return self.int == other.int
243*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
244*cda5da8dSAndroid Build Coastguard Worker
245*cda5da8dSAndroid Build Coastguard Worker    # Q. What's the value of being able to sort UUIDs?
246*cda5da8dSAndroid Build Coastguard Worker    # A. Use them as keys in a B-Tree or similar mapping.
247*cda5da8dSAndroid Build Coastguard Worker
248*cda5da8dSAndroid Build Coastguard Worker    def __lt__(self, other):
249*cda5da8dSAndroid Build Coastguard Worker        if isinstance(other, UUID):
250*cda5da8dSAndroid Build Coastguard Worker            return self.int < other.int
251*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
252*cda5da8dSAndroid Build Coastguard Worker
253*cda5da8dSAndroid Build Coastguard Worker    def __gt__(self, other):
254*cda5da8dSAndroid Build Coastguard Worker        if isinstance(other, UUID):
255*cda5da8dSAndroid Build Coastguard Worker            return self.int > other.int
256*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
257*cda5da8dSAndroid Build Coastguard Worker
258*cda5da8dSAndroid Build Coastguard Worker    def __le__(self, other):
259*cda5da8dSAndroid Build Coastguard Worker        if isinstance(other, UUID):
260*cda5da8dSAndroid Build Coastguard Worker            return self.int <= other.int
261*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
262*cda5da8dSAndroid Build Coastguard Worker
263*cda5da8dSAndroid Build Coastguard Worker    def __ge__(self, other):
264*cda5da8dSAndroid Build Coastguard Worker        if isinstance(other, UUID):
265*cda5da8dSAndroid Build Coastguard Worker            return self.int >= other.int
266*cda5da8dSAndroid Build Coastguard Worker        return NotImplemented
267*cda5da8dSAndroid Build Coastguard Worker
268*cda5da8dSAndroid Build Coastguard Worker    def __hash__(self):
269*cda5da8dSAndroid Build Coastguard Worker        return hash(self.int)
270*cda5da8dSAndroid Build Coastguard Worker
271*cda5da8dSAndroid Build Coastguard Worker    def __int__(self):
272*cda5da8dSAndroid Build Coastguard Worker        return self.int
273*cda5da8dSAndroid Build Coastguard Worker
274*cda5da8dSAndroid Build Coastguard Worker    def __repr__(self):
275*cda5da8dSAndroid Build Coastguard Worker        return '%s(%r)' % (self.__class__.__name__, str(self))
276*cda5da8dSAndroid Build Coastguard Worker
277*cda5da8dSAndroid Build Coastguard Worker    def __setattr__(self, name, value):
278*cda5da8dSAndroid Build Coastguard Worker        raise TypeError('UUID objects are immutable')
279*cda5da8dSAndroid Build Coastguard Worker
280*cda5da8dSAndroid Build Coastguard Worker    def __str__(self):
281*cda5da8dSAndroid Build Coastguard Worker        hex = '%032x' % self.int
282*cda5da8dSAndroid Build Coastguard Worker        return '%s-%s-%s-%s-%s' % (
283*cda5da8dSAndroid Build Coastguard Worker            hex[:8], hex[8:12], hex[12:16], hex[16:20], hex[20:])
284*cda5da8dSAndroid Build Coastguard Worker
285*cda5da8dSAndroid Build Coastguard Worker    @property
286*cda5da8dSAndroid Build Coastguard Worker    def bytes(self):
287*cda5da8dSAndroid Build Coastguard Worker        return self.int.to_bytes(16)  # big endian
288*cda5da8dSAndroid Build Coastguard Worker
289*cda5da8dSAndroid Build Coastguard Worker    @property
290*cda5da8dSAndroid Build Coastguard Worker    def bytes_le(self):
291*cda5da8dSAndroid Build Coastguard Worker        bytes = self.bytes
292*cda5da8dSAndroid Build Coastguard Worker        return (bytes[4-1::-1] + bytes[6-1:4-1:-1] + bytes[8-1:6-1:-1] +
293*cda5da8dSAndroid Build Coastguard Worker                bytes[8:])
294*cda5da8dSAndroid Build Coastguard Worker
295*cda5da8dSAndroid Build Coastguard Worker    @property
296*cda5da8dSAndroid Build Coastguard Worker    def fields(self):
297*cda5da8dSAndroid Build Coastguard Worker        return (self.time_low, self.time_mid, self.time_hi_version,
298*cda5da8dSAndroid Build Coastguard Worker                self.clock_seq_hi_variant, self.clock_seq_low, self.node)
299*cda5da8dSAndroid Build Coastguard Worker
300*cda5da8dSAndroid Build Coastguard Worker    @property
301*cda5da8dSAndroid Build Coastguard Worker    def time_low(self):
302*cda5da8dSAndroid Build Coastguard Worker        return self.int >> 96
303*cda5da8dSAndroid Build Coastguard Worker
304*cda5da8dSAndroid Build Coastguard Worker    @property
305*cda5da8dSAndroid Build Coastguard Worker    def time_mid(self):
306*cda5da8dSAndroid Build Coastguard Worker        return (self.int >> 80) & 0xffff
307*cda5da8dSAndroid Build Coastguard Worker
308*cda5da8dSAndroid Build Coastguard Worker    @property
309*cda5da8dSAndroid Build Coastguard Worker    def time_hi_version(self):
310*cda5da8dSAndroid Build Coastguard Worker        return (self.int >> 64) & 0xffff
311*cda5da8dSAndroid Build Coastguard Worker
312*cda5da8dSAndroid Build Coastguard Worker    @property
313*cda5da8dSAndroid Build Coastguard Worker    def clock_seq_hi_variant(self):
314*cda5da8dSAndroid Build Coastguard Worker        return (self.int >> 56) & 0xff
315*cda5da8dSAndroid Build Coastguard Worker
316*cda5da8dSAndroid Build Coastguard Worker    @property
317*cda5da8dSAndroid Build Coastguard Worker    def clock_seq_low(self):
318*cda5da8dSAndroid Build Coastguard Worker        return (self.int >> 48) & 0xff
319*cda5da8dSAndroid Build Coastguard Worker
320*cda5da8dSAndroid Build Coastguard Worker    @property
321*cda5da8dSAndroid Build Coastguard Worker    def time(self):
322*cda5da8dSAndroid Build Coastguard Worker        return (((self.time_hi_version & 0x0fff) << 48) |
323*cda5da8dSAndroid Build Coastguard Worker                (self.time_mid << 32) | self.time_low)
324*cda5da8dSAndroid Build Coastguard Worker
325*cda5da8dSAndroid Build Coastguard Worker    @property
326*cda5da8dSAndroid Build Coastguard Worker    def clock_seq(self):
327*cda5da8dSAndroid Build Coastguard Worker        return (((self.clock_seq_hi_variant & 0x3f) << 8) |
328*cda5da8dSAndroid Build Coastguard Worker                self.clock_seq_low)
329*cda5da8dSAndroid Build Coastguard Worker
330*cda5da8dSAndroid Build Coastguard Worker    @property
331*cda5da8dSAndroid Build Coastguard Worker    def node(self):
332*cda5da8dSAndroid Build Coastguard Worker        return self.int & 0xffffffffffff
333*cda5da8dSAndroid Build Coastguard Worker
334*cda5da8dSAndroid Build Coastguard Worker    @property
335*cda5da8dSAndroid Build Coastguard Worker    def hex(self):
336*cda5da8dSAndroid Build Coastguard Worker        return '%032x' % self.int
337*cda5da8dSAndroid Build Coastguard Worker
338*cda5da8dSAndroid Build Coastguard Worker    @property
339*cda5da8dSAndroid Build Coastguard Worker    def urn(self):
340*cda5da8dSAndroid Build Coastguard Worker        return 'urn:uuid:' + str(self)
341*cda5da8dSAndroid Build Coastguard Worker
342*cda5da8dSAndroid Build Coastguard Worker    @property
343*cda5da8dSAndroid Build Coastguard Worker    def variant(self):
344*cda5da8dSAndroid Build Coastguard Worker        if not self.int & (0x8000 << 48):
345*cda5da8dSAndroid Build Coastguard Worker            return RESERVED_NCS
346*cda5da8dSAndroid Build Coastguard Worker        elif not self.int & (0x4000 << 48):
347*cda5da8dSAndroid Build Coastguard Worker            return RFC_4122
348*cda5da8dSAndroid Build Coastguard Worker        elif not self.int & (0x2000 << 48):
349*cda5da8dSAndroid Build Coastguard Worker            return RESERVED_MICROSOFT
350*cda5da8dSAndroid Build Coastguard Worker        else:
351*cda5da8dSAndroid Build Coastguard Worker            return RESERVED_FUTURE
352*cda5da8dSAndroid Build Coastguard Worker
353*cda5da8dSAndroid Build Coastguard Worker    @property
354*cda5da8dSAndroid Build Coastguard Worker    def version(self):
355*cda5da8dSAndroid Build Coastguard Worker        # The version bits are only meaningful for RFC 4122 UUIDs.
356*cda5da8dSAndroid Build Coastguard Worker        if self.variant == RFC_4122:
357*cda5da8dSAndroid Build Coastguard Worker            return int((self.int >> 76) & 0xf)
358*cda5da8dSAndroid Build Coastguard Worker
359*cda5da8dSAndroid Build Coastguard Worker
360*cda5da8dSAndroid Build Coastguard Workerdef _get_command_stdout(command, *args):
361*cda5da8dSAndroid Build Coastguard Worker    import io, os, shutil, subprocess
362*cda5da8dSAndroid Build Coastguard Worker
363*cda5da8dSAndroid Build Coastguard Worker    try:
364*cda5da8dSAndroid Build Coastguard Worker        path_dirs = os.environ.get('PATH', os.defpath).split(os.pathsep)
365*cda5da8dSAndroid Build Coastguard Worker        path_dirs.extend(['/sbin', '/usr/sbin'])
366*cda5da8dSAndroid Build Coastguard Worker        executable = shutil.which(command, path=os.pathsep.join(path_dirs))
367*cda5da8dSAndroid Build Coastguard Worker        if executable is None:
368*cda5da8dSAndroid Build Coastguard Worker            return None
369*cda5da8dSAndroid Build Coastguard Worker        # LC_ALL=C to ensure English output, stderr=DEVNULL to prevent output
370*cda5da8dSAndroid Build Coastguard Worker        # on stderr (Note: we don't have an example where the words we search
371*cda5da8dSAndroid Build Coastguard Worker        # for are actually localized, but in theory some system could do so.)
372*cda5da8dSAndroid Build Coastguard Worker        env = dict(os.environ)
373*cda5da8dSAndroid Build Coastguard Worker        env['LC_ALL'] = 'C'
374*cda5da8dSAndroid Build Coastguard Worker        # Empty strings will be quoted by popen so we should just ommit it
375*cda5da8dSAndroid Build Coastguard Worker        if args != ('',):
376*cda5da8dSAndroid Build Coastguard Worker            command = (executable, *args)
377*cda5da8dSAndroid Build Coastguard Worker        else:
378*cda5da8dSAndroid Build Coastguard Worker            command = (executable,)
379*cda5da8dSAndroid Build Coastguard Worker        proc = subprocess.Popen(command,
380*cda5da8dSAndroid Build Coastguard Worker                                stdout=subprocess.PIPE,
381*cda5da8dSAndroid Build Coastguard Worker                                stderr=subprocess.DEVNULL,
382*cda5da8dSAndroid Build Coastguard Worker                                env=env)
383*cda5da8dSAndroid Build Coastguard Worker        if not proc:
384*cda5da8dSAndroid Build Coastguard Worker            return None
385*cda5da8dSAndroid Build Coastguard Worker        stdout, stderr = proc.communicate()
386*cda5da8dSAndroid Build Coastguard Worker        return io.BytesIO(stdout)
387*cda5da8dSAndroid Build Coastguard Worker    except (OSError, subprocess.SubprocessError):
388*cda5da8dSAndroid Build Coastguard Worker        return None
389*cda5da8dSAndroid Build Coastguard Worker
390*cda5da8dSAndroid Build Coastguard Worker
391*cda5da8dSAndroid Build Coastguard Worker# For MAC (a.k.a. IEEE 802, or EUI-48) addresses, the second least significant
392*cda5da8dSAndroid Build Coastguard Worker# bit of the first octet signifies whether the MAC address is universally (0)
393*cda5da8dSAndroid Build Coastguard Worker# or locally (1) administered.  Network cards from hardware manufacturers will
394*cda5da8dSAndroid Build Coastguard Worker# always be universally administered to guarantee global uniqueness of the MAC
395*cda5da8dSAndroid Build Coastguard Worker# address, but any particular machine may have other interfaces which are
396*cda5da8dSAndroid Build Coastguard Worker# locally administered.  An example of the latter is the bridge interface to
397*cda5da8dSAndroid Build Coastguard Worker# the Touch Bar on MacBook Pros.
398*cda5da8dSAndroid Build Coastguard Worker#
399*cda5da8dSAndroid Build Coastguard Worker# This bit works out to be the 42nd bit counting from 1 being the least
400*cda5da8dSAndroid Build Coastguard Worker# significant, or 1<<41.  We'll prefer universally administered MAC addresses
401*cda5da8dSAndroid Build Coastguard Worker# over locally administered ones since the former are globally unique, but
402*cda5da8dSAndroid Build Coastguard Worker# we'll return the first of the latter found if that's all the machine has.
403*cda5da8dSAndroid Build Coastguard Worker#
404*cda5da8dSAndroid Build Coastguard Worker# See https://en.wikipedia.org/wiki/MAC_address#Universal_vs._local
405*cda5da8dSAndroid Build Coastguard Worker
406*cda5da8dSAndroid Build Coastguard Workerdef _is_universal(mac):
407*cda5da8dSAndroid Build Coastguard Worker    return not (mac & (1 << 41))
408*cda5da8dSAndroid Build Coastguard Worker
409*cda5da8dSAndroid Build Coastguard Worker
410*cda5da8dSAndroid Build Coastguard Workerdef _find_mac_near_keyword(command, args, keywords, get_word_index):
411*cda5da8dSAndroid Build Coastguard Worker    """Searches a command's output for a MAC address near a keyword.
412*cda5da8dSAndroid Build Coastguard Worker
413*cda5da8dSAndroid Build Coastguard Worker    Each line of words in the output is case-insensitively searched for
414*cda5da8dSAndroid Build Coastguard Worker    any of the given keywords.  Upon a match, get_word_index is invoked
415*cda5da8dSAndroid Build Coastguard Worker    to pick a word from the line, given the index of the match.  For
416*cda5da8dSAndroid Build Coastguard Worker    example, lambda i: 0 would get the first word on the line, while
417*cda5da8dSAndroid Build Coastguard Worker    lambda i: i - 1 would get the word preceding the keyword.
418*cda5da8dSAndroid Build Coastguard Worker    """
419*cda5da8dSAndroid Build Coastguard Worker    stdout = _get_command_stdout(command, args)
420*cda5da8dSAndroid Build Coastguard Worker    if stdout is None:
421*cda5da8dSAndroid Build Coastguard Worker        return None
422*cda5da8dSAndroid Build Coastguard Worker
423*cda5da8dSAndroid Build Coastguard Worker    first_local_mac = None
424*cda5da8dSAndroid Build Coastguard Worker    for line in stdout:
425*cda5da8dSAndroid Build Coastguard Worker        words = line.lower().rstrip().split()
426*cda5da8dSAndroid Build Coastguard Worker        for i in range(len(words)):
427*cda5da8dSAndroid Build Coastguard Worker            if words[i] in keywords:
428*cda5da8dSAndroid Build Coastguard Worker                try:
429*cda5da8dSAndroid Build Coastguard Worker                    word = words[get_word_index(i)]
430*cda5da8dSAndroid Build Coastguard Worker                    mac = int(word.replace(_MAC_DELIM, b''), 16)
431*cda5da8dSAndroid Build Coastguard Worker                except (ValueError, IndexError):
432*cda5da8dSAndroid Build Coastguard Worker                    # Virtual interfaces, such as those provided by
433*cda5da8dSAndroid Build Coastguard Worker                    # VPNs, do not have a colon-delimited MAC address
434*cda5da8dSAndroid Build Coastguard Worker                    # as expected, but a 16-byte HWAddr separated by
435*cda5da8dSAndroid Build Coastguard Worker                    # dashes. These should be ignored in favor of a
436*cda5da8dSAndroid Build Coastguard Worker                    # real MAC address
437*cda5da8dSAndroid Build Coastguard Worker                    pass
438*cda5da8dSAndroid Build Coastguard Worker                else:
439*cda5da8dSAndroid Build Coastguard Worker                    if _is_universal(mac):
440*cda5da8dSAndroid Build Coastguard Worker                        return mac
441*cda5da8dSAndroid Build Coastguard Worker                    first_local_mac = first_local_mac or mac
442*cda5da8dSAndroid Build Coastguard Worker    return first_local_mac or None
443*cda5da8dSAndroid Build Coastguard Worker
444*cda5da8dSAndroid Build Coastguard Worker
445*cda5da8dSAndroid Build Coastguard Workerdef _parse_mac(word):
446*cda5da8dSAndroid Build Coastguard Worker    # Accept 'HH:HH:HH:HH:HH:HH' MAC address (ex: '52:54:00:9d:0e:67'),
447*cda5da8dSAndroid Build Coastguard Worker    # but reject IPv6 address (ex: 'fe80::5054:ff:fe9' or '123:2:3:4:5:6:7:8').
448*cda5da8dSAndroid Build Coastguard Worker    #
449*cda5da8dSAndroid Build Coastguard Worker    # Virtual interfaces, such as those provided by VPNs, do not have a
450*cda5da8dSAndroid Build Coastguard Worker    # colon-delimited MAC address as expected, but a 16-byte HWAddr separated
451*cda5da8dSAndroid Build Coastguard Worker    # by dashes. These should be ignored in favor of a real MAC address
452*cda5da8dSAndroid Build Coastguard Worker    parts = word.split(_MAC_DELIM)
453*cda5da8dSAndroid Build Coastguard Worker    if len(parts) != 6:
454*cda5da8dSAndroid Build Coastguard Worker        return
455*cda5da8dSAndroid Build Coastguard Worker    if _MAC_OMITS_LEADING_ZEROES:
456*cda5da8dSAndroid Build Coastguard Worker        # (Only) on AIX the macaddr value given is not prefixed by 0, e.g.
457*cda5da8dSAndroid Build Coastguard Worker        # en0   1500  link#2      fa.bc.de.f7.62.4 110854824     0 160133733     0     0
458*cda5da8dSAndroid Build Coastguard Worker        # not
459*cda5da8dSAndroid Build Coastguard Worker        # en0   1500  link#2      fa.bc.de.f7.62.04 110854824     0 160133733     0     0
460*cda5da8dSAndroid Build Coastguard Worker        if not all(1 <= len(part) <= 2 for part in parts):
461*cda5da8dSAndroid Build Coastguard Worker            return
462*cda5da8dSAndroid Build Coastguard Worker        hexstr = b''.join(part.rjust(2, b'0') for part in parts)
463*cda5da8dSAndroid Build Coastguard Worker    else:
464*cda5da8dSAndroid Build Coastguard Worker        if not all(len(part) == 2 for part in parts):
465*cda5da8dSAndroid Build Coastguard Worker            return
466*cda5da8dSAndroid Build Coastguard Worker        hexstr = b''.join(parts)
467*cda5da8dSAndroid Build Coastguard Worker    try:
468*cda5da8dSAndroid Build Coastguard Worker        return int(hexstr, 16)
469*cda5da8dSAndroid Build Coastguard Worker    except ValueError:
470*cda5da8dSAndroid Build Coastguard Worker        return
471*cda5da8dSAndroid Build Coastguard Worker
472*cda5da8dSAndroid Build Coastguard Worker
473*cda5da8dSAndroid Build Coastguard Workerdef _find_mac_under_heading(command, args, heading):
474*cda5da8dSAndroid Build Coastguard Worker    """Looks for a MAC address under a heading in a command's output.
475*cda5da8dSAndroid Build Coastguard Worker
476*cda5da8dSAndroid Build Coastguard Worker    The first line of words in the output is searched for the given
477*cda5da8dSAndroid Build Coastguard Worker    heading. Words at the same word index as the heading in subsequent
478*cda5da8dSAndroid Build Coastguard Worker    lines are then examined to see if they look like MAC addresses.
479*cda5da8dSAndroid Build Coastguard Worker    """
480*cda5da8dSAndroid Build Coastguard Worker    stdout = _get_command_stdout(command, args)
481*cda5da8dSAndroid Build Coastguard Worker    if stdout is None:
482*cda5da8dSAndroid Build Coastguard Worker        return None
483*cda5da8dSAndroid Build Coastguard Worker
484*cda5da8dSAndroid Build Coastguard Worker    keywords = stdout.readline().rstrip().split()
485*cda5da8dSAndroid Build Coastguard Worker    try:
486*cda5da8dSAndroid Build Coastguard Worker        column_index = keywords.index(heading)
487*cda5da8dSAndroid Build Coastguard Worker    except ValueError:
488*cda5da8dSAndroid Build Coastguard Worker        return None
489*cda5da8dSAndroid Build Coastguard Worker
490*cda5da8dSAndroid Build Coastguard Worker    first_local_mac = None
491*cda5da8dSAndroid Build Coastguard Worker    for line in stdout:
492*cda5da8dSAndroid Build Coastguard Worker        words = line.rstrip().split()
493*cda5da8dSAndroid Build Coastguard Worker        try:
494*cda5da8dSAndroid Build Coastguard Worker            word = words[column_index]
495*cda5da8dSAndroid Build Coastguard Worker        except IndexError:
496*cda5da8dSAndroid Build Coastguard Worker            continue
497*cda5da8dSAndroid Build Coastguard Worker
498*cda5da8dSAndroid Build Coastguard Worker        mac = _parse_mac(word)
499*cda5da8dSAndroid Build Coastguard Worker        if mac is None:
500*cda5da8dSAndroid Build Coastguard Worker            continue
501*cda5da8dSAndroid Build Coastguard Worker        if _is_universal(mac):
502*cda5da8dSAndroid Build Coastguard Worker            return mac
503*cda5da8dSAndroid Build Coastguard Worker        if first_local_mac is None:
504*cda5da8dSAndroid Build Coastguard Worker            first_local_mac = mac
505*cda5da8dSAndroid Build Coastguard Worker
506*cda5da8dSAndroid Build Coastguard Worker    return first_local_mac
507*cda5da8dSAndroid Build Coastguard Worker
508*cda5da8dSAndroid Build Coastguard Worker
509*cda5da8dSAndroid Build Coastguard Worker# The following functions call external programs to 'get' a macaddr value to
510*cda5da8dSAndroid Build Coastguard Worker# be used as basis for an uuid
511*cda5da8dSAndroid Build Coastguard Workerdef _ifconfig_getnode():
512*cda5da8dSAndroid Build Coastguard Worker    """Get the hardware address on Unix by running ifconfig."""
513*cda5da8dSAndroid Build Coastguard Worker    # This works on Linux ('' or '-a'), Tru64 ('-av'), but not all Unixes.
514*cda5da8dSAndroid Build Coastguard Worker    keywords = (b'hwaddr', b'ether', b'address:', b'lladdr')
515*cda5da8dSAndroid Build Coastguard Worker    for args in ('', '-a', '-av'):
516*cda5da8dSAndroid Build Coastguard Worker        mac = _find_mac_near_keyword('ifconfig', args, keywords, lambda i: i+1)
517*cda5da8dSAndroid Build Coastguard Worker        if mac:
518*cda5da8dSAndroid Build Coastguard Worker            return mac
519*cda5da8dSAndroid Build Coastguard Worker    return None
520*cda5da8dSAndroid Build Coastguard Worker
521*cda5da8dSAndroid Build Coastguard Workerdef _ip_getnode():
522*cda5da8dSAndroid Build Coastguard Worker    """Get the hardware address on Unix by running ip."""
523*cda5da8dSAndroid Build Coastguard Worker    # This works on Linux with iproute2.
524*cda5da8dSAndroid Build Coastguard Worker    mac = _find_mac_near_keyword('ip', 'link', [b'link/ether'], lambda i: i+1)
525*cda5da8dSAndroid Build Coastguard Worker    if mac:
526*cda5da8dSAndroid Build Coastguard Worker        return mac
527*cda5da8dSAndroid Build Coastguard Worker    return None
528*cda5da8dSAndroid Build Coastguard Worker
529*cda5da8dSAndroid Build Coastguard Workerdef _arp_getnode():
530*cda5da8dSAndroid Build Coastguard Worker    """Get the hardware address on Unix by running arp."""
531*cda5da8dSAndroid Build Coastguard Worker    import os, socket
532*cda5da8dSAndroid Build Coastguard Worker    if not hasattr(socket, "gethostbyname"):
533*cda5da8dSAndroid Build Coastguard Worker        return None
534*cda5da8dSAndroid Build Coastguard Worker    try:
535*cda5da8dSAndroid Build Coastguard Worker        ip_addr = socket.gethostbyname(socket.gethostname())
536*cda5da8dSAndroid Build Coastguard Worker    except OSError:
537*cda5da8dSAndroid Build Coastguard Worker        return None
538*cda5da8dSAndroid Build Coastguard Worker
539*cda5da8dSAndroid Build Coastguard Worker    # Try getting the MAC addr from arp based on our IP address (Solaris).
540*cda5da8dSAndroid Build Coastguard Worker    mac = _find_mac_near_keyword('arp', '-an', [os.fsencode(ip_addr)], lambda i: -1)
541*cda5da8dSAndroid Build Coastguard Worker    if mac:
542*cda5da8dSAndroid Build Coastguard Worker        return mac
543*cda5da8dSAndroid Build Coastguard Worker
544*cda5da8dSAndroid Build Coastguard Worker    # This works on OpenBSD
545*cda5da8dSAndroid Build Coastguard Worker    mac = _find_mac_near_keyword('arp', '-an', [os.fsencode(ip_addr)], lambda i: i+1)
546*cda5da8dSAndroid Build Coastguard Worker    if mac:
547*cda5da8dSAndroid Build Coastguard Worker        return mac
548*cda5da8dSAndroid Build Coastguard Worker
549*cda5da8dSAndroid Build Coastguard Worker    # This works on Linux, FreeBSD and NetBSD
550*cda5da8dSAndroid Build Coastguard Worker    mac = _find_mac_near_keyword('arp', '-an', [os.fsencode('(%s)' % ip_addr)],
551*cda5da8dSAndroid Build Coastguard Worker                    lambda i: i+2)
552*cda5da8dSAndroid Build Coastguard Worker    # Return None instead of 0.
553*cda5da8dSAndroid Build Coastguard Worker    if mac:
554*cda5da8dSAndroid Build Coastguard Worker        return mac
555*cda5da8dSAndroid Build Coastguard Worker    return None
556*cda5da8dSAndroid Build Coastguard Worker
557*cda5da8dSAndroid Build Coastguard Workerdef _lanscan_getnode():
558*cda5da8dSAndroid Build Coastguard Worker    """Get the hardware address on Unix by running lanscan."""
559*cda5da8dSAndroid Build Coastguard Worker    # This might work on HP-UX.
560*cda5da8dSAndroid Build Coastguard Worker    return _find_mac_near_keyword('lanscan', '-ai', [b'lan0'], lambda i: 0)
561*cda5da8dSAndroid Build Coastguard Worker
562*cda5da8dSAndroid Build Coastguard Workerdef _netstat_getnode():
563*cda5da8dSAndroid Build Coastguard Worker    """Get the hardware address on Unix by running netstat."""
564*cda5da8dSAndroid Build Coastguard Worker    # This works on AIX and might work on Tru64 UNIX.
565*cda5da8dSAndroid Build Coastguard Worker    return _find_mac_under_heading('netstat', '-ian', b'Address')
566*cda5da8dSAndroid Build Coastguard Worker
567*cda5da8dSAndroid Build Coastguard Workerdef _ipconfig_getnode():
568*cda5da8dSAndroid Build Coastguard Worker    """[DEPRECATED] Get the hardware address on Windows."""
569*cda5da8dSAndroid Build Coastguard Worker    # bpo-40501: UuidCreateSequential() is now the only supported approach
570*cda5da8dSAndroid Build Coastguard Worker    return _windll_getnode()
571*cda5da8dSAndroid Build Coastguard Worker
572*cda5da8dSAndroid Build Coastguard Workerdef _netbios_getnode():
573*cda5da8dSAndroid Build Coastguard Worker    """[DEPRECATED] Get the hardware address on Windows."""
574*cda5da8dSAndroid Build Coastguard Worker    # bpo-40501: UuidCreateSequential() is now the only supported approach
575*cda5da8dSAndroid Build Coastguard Worker    return _windll_getnode()
576*cda5da8dSAndroid Build Coastguard Worker
577*cda5da8dSAndroid Build Coastguard Worker
578*cda5da8dSAndroid Build Coastguard Worker# Import optional C extension at toplevel, to help disabling it when testing
579*cda5da8dSAndroid Build Coastguard Workertry:
580*cda5da8dSAndroid Build Coastguard Worker    import _uuid
581*cda5da8dSAndroid Build Coastguard Worker    _generate_time_safe = getattr(_uuid, "generate_time_safe", None)
582*cda5da8dSAndroid Build Coastguard Worker    _UuidCreate = getattr(_uuid, "UuidCreate", None)
583*cda5da8dSAndroid Build Coastguard Worker    _has_uuid_generate_time_safe = _uuid.has_uuid_generate_time_safe
584*cda5da8dSAndroid Build Coastguard Workerexcept ImportError:
585*cda5da8dSAndroid Build Coastguard Worker    _uuid = None
586*cda5da8dSAndroid Build Coastguard Worker    _generate_time_safe = None
587*cda5da8dSAndroid Build Coastguard Worker    _UuidCreate = None
588*cda5da8dSAndroid Build Coastguard Worker    _has_uuid_generate_time_safe = None
589*cda5da8dSAndroid Build Coastguard Worker
590*cda5da8dSAndroid Build Coastguard Worker
591*cda5da8dSAndroid Build Coastguard Workerdef _load_system_functions():
592*cda5da8dSAndroid Build Coastguard Worker    """[DEPRECATED] Platform-specific functions loaded at import time"""
593*cda5da8dSAndroid Build Coastguard Worker
594*cda5da8dSAndroid Build Coastguard Worker
595*cda5da8dSAndroid Build Coastguard Workerdef _unix_getnode():
596*cda5da8dSAndroid Build Coastguard Worker    """Get the hardware address on Unix using the _uuid extension module."""
597*cda5da8dSAndroid Build Coastguard Worker    if _generate_time_safe:
598*cda5da8dSAndroid Build Coastguard Worker        uuid_time, _ = _generate_time_safe()
599*cda5da8dSAndroid Build Coastguard Worker        return UUID(bytes=uuid_time).node
600*cda5da8dSAndroid Build Coastguard Worker
601*cda5da8dSAndroid Build Coastguard Workerdef _windll_getnode():
602*cda5da8dSAndroid Build Coastguard Worker    """Get the hardware address on Windows using the _uuid extension module."""
603*cda5da8dSAndroid Build Coastguard Worker    if _UuidCreate:
604*cda5da8dSAndroid Build Coastguard Worker        uuid_bytes = _UuidCreate()
605*cda5da8dSAndroid Build Coastguard Worker        return UUID(bytes_le=uuid_bytes).node
606*cda5da8dSAndroid Build Coastguard Worker
607*cda5da8dSAndroid Build Coastguard Workerdef _random_getnode():
608*cda5da8dSAndroid Build Coastguard Worker    """Get a random node ID."""
609*cda5da8dSAndroid Build Coastguard Worker    # RFC 4122, $4.1.6 says "For systems with no IEEE address, a randomly or
610*cda5da8dSAndroid Build Coastguard Worker    # pseudo-randomly generated value may be used; see Section 4.5.  The
611*cda5da8dSAndroid Build Coastguard Worker    # multicast bit must be set in such addresses, in order that they will
612*cda5da8dSAndroid Build Coastguard Worker    # never conflict with addresses obtained from network cards."
613*cda5da8dSAndroid Build Coastguard Worker    #
614*cda5da8dSAndroid Build Coastguard Worker    # The "multicast bit" of a MAC address is defined to be "the least
615*cda5da8dSAndroid Build Coastguard Worker    # significant bit of the first octet".  This works out to be the 41st bit
616*cda5da8dSAndroid Build Coastguard Worker    # counting from 1 being the least significant bit, or 1<<40.
617*cda5da8dSAndroid Build Coastguard Worker    #
618*cda5da8dSAndroid Build Coastguard Worker    # See https://en.wikipedia.org/wiki/MAC_address#Unicast_vs._multicast
619*cda5da8dSAndroid Build Coastguard Worker    import random
620*cda5da8dSAndroid Build Coastguard Worker    return random.getrandbits(48) | (1 << 40)
621*cda5da8dSAndroid Build Coastguard Worker
622*cda5da8dSAndroid Build Coastguard Worker
623*cda5da8dSAndroid Build Coastguard Worker# _OS_GETTERS, when known, are targeted for a specific OS or platform.
624*cda5da8dSAndroid Build Coastguard Worker# The order is by 'common practice' on the specified platform.
625*cda5da8dSAndroid Build Coastguard Worker# Note: 'posix' and 'windows' _OS_GETTERS are prefixed by a dll/dlload() method
626*cda5da8dSAndroid Build Coastguard Worker# which, when successful, means none of these "external" methods are called.
627*cda5da8dSAndroid Build Coastguard Worker# _GETTERS is (also) used by test_uuid.py to SkipUnless(), e.g.,
628*cda5da8dSAndroid Build Coastguard Worker#     @unittest.skipUnless(_uuid._ifconfig_getnode in _uuid._GETTERS, ...)
629*cda5da8dSAndroid Build Coastguard Workerif _LINUX:
630*cda5da8dSAndroid Build Coastguard Worker    _OS_GETTERS = [_ip_getnode, _ifconfig_getnode]
631*cda5da8dSAndroid Build Coastguard Workerelif sys.platform == 'darwin':
632*cda5da8dSAndroid Build Coastguard Worker    _OS_GETTERS = [_ifconfig_getnode, _arp_getnode, _netstat_getnode]
633*cda5da8dSAndroid Build Coastguard Workerelif sys.platform == 'win32':
634*cda5da8dSAndroid Build Coastguard Worker    # bpo-40201: _windll_getnode will always succeed, so these are not needed
635*cda5da8dSAndroid Build Coastguard Worker    _OS_GETTERS = []
636*cda5da8dSAndroid Build Coastguard Workerelif _AIX:
637*cda5da8dSAndroid Build Coastguard Worker    _OS_GETTERS = [_netstat_getnode]
638*cda5da8dSAndroid Build Coastguard Workerelse:
639*cda5da8dSAndroid Build Coastguard Worker    _OS_GETTERS = [_ifconfig_getnode, _ip_getnode, _arp_getnode,
640*cda5da8dSAndroid Build Coastguard Worker                   _netstat_getnode, _lanscan_getnode]
641*cda5da8dSAndroid Build Coastguard Workerif os.name == 'posix':
642*cda5da8dSAndroid Build Coastguard Worker    _GETTERS = [_unix_getnode] + _OS_GETTERS
643*cda5da8dSAndroid Build Coastguard Workerelif os.name == 'nt':
644*cda5da8dSAndroid Build Coastguard Worker    _GETTERS = [_windll_getnode] + _OS_GETTERS
645*cda5da8dSAndroid Build Coastguard Workerelse:
646*cda5da8dSAndroid Build Coastguard Worker    _GETTERS = _OS_GETTERS
647*cda5da8dSAndroid Build Coastguard Worker
648*cda5da8dSAndroid Build Coastguard Worker_node = None
649*cda5da8dSAndroid Build Coastguard Worker
650*cda5da8dSAndroid Build Coastguard Workerdef getnode():
651*cda5da8dSAndroid Build Coastguard Worker    """Get the hardware address as a 48-bit positive integer.
652*cda5da8dSAndroid Build Coastguard Worker
653*cda5da8dSAndroid Build Coastguard Worker    The first time this runs, it may launch a separate program, which could
654*cda5da8dSAndroid Build Coastguard Worker    be quite slow.  If all attempts to obtain the hardware address fail, we
655*cda5da8dSAndroid Build Coastguard Worker    choose a random 48-bit number with its eighth bit set to 1 as recommended
656*cda5da8dSAndroid Build Coastguard Worker    in RFC 4122.
657*cda5da8dSAndroid Build Coastguard Worker    """
658*cda5da8dSAndroid Build Coastguard Worker    global _node
659*cda5da8dSAndroid Build Coastguard Worker    if _node is not None:
660*cda5da8dSAndroid Build Coastguard Worker        return _node
661*cda5da8dSAndroid Build Coastguard Worker
662*cda5da8dSAndroid Build Coastguard Worker    for getter in _GETTERS + [_random_getnode]:
663*cda5da8dSAndroid Build Coastguard Worker        try:
664*cda5da8dSAndroid Build Coastguard Worker            _node = getter()
665*cda5da8dSAndroid Build Coastguard Worker        except:
666*cda5da8dSAndroid Build Coastguard Worker            continue
667*cda5da8dSAndroid Build Coastguard Worker        if (_node is not None) and (0 <= _node < (1 << 48)):
668*cda5da8dSAndroid Build Coastguard Worker            return _node
669*cda5da8dSAndroid Build Coastguard Worker    assert False, '_random_getnode() returned invalid value: {}'.format(_node)
670*cda5da8dSAndroid Build Coastguard Worker
671*cda5da8dSAndroid Build Coastguard Worker
672*cda5da8dSAndroid Build Coastguard Worker_last_timestamp = None
673*cda5da8dSAndroid Build Coastguard Worker
674*cda5da8dSAndroid Build Coastguard Workerdef uuid1(node=None, clock_seq=None):
675*cda5da8dSAndroid Build Coastguard Worker    """Generate a UUID from a host ID, sequence number, and the current time.
676*cda5da8dSAndroid Build Coastguard Worker    If 'node' is not given, getnode() is used to obtain the hardware
677*cda5da8dSAndroid Build Coastguard Worker    address.  If 'clock_seq' is given, it is used as the sequence number;
678*cda5da8dSAndroid Build Coastguard Worker    otherwise a random 14-bit sequence number is chosen."""
679*cda5da8dSAndroid Build Coastguard Worker
680*cda5da8dSAndroid Build Coastguard Worker    # When the system provides a version-1 UUID generator, use it (but don't
681*cda5da8dSAndroid Build Coastguard Worker    # use UuidCreate here because its UUIDs don't conform to RFC 4122).
682*cda5da8dSAndroid Build Coastguard Worker    if _generate_time_safe is not None and node is clock_seq is None:
683*cda5da8dSAndroid Build Coastguard Worker        uuid_time, safely_generated = _generate_time_safe()
684*cda5da8dSAndroid Build Coastguard Worker        try:
685*cda5da8dSAndroid Build Coastguard Worker            is_safe = SafeUUID(safely_generated)
686*cda5da8dSAndroid Build Coastguard Worker        except ValueError:
687*cda5da8dSAndroid Build Coastguard Worker            is_safe = SafeUUID.unknown
688*cda5da8dSAndroid Build Coastguard Worker        return UUID(bytes=uuid_time, is_safe=is_safe)
689*cda5da8dSAndroid Build Coastguard Worker
690*cda5da8dSAndroid Build Coastguard Worker    global _last_timestamp
691*cda5da8dSAndroid Build Coastguard Worker    import time
692*cda5da8dSAndroid Build Coastguard Worker    nanoseconds = time.time_ns()
693*cda5da8dSAndroid Build Coastguard Worker    # 0x01b21dd213814000 is the number of 100-ns intervals between the
694*cda5da8dSAndroid Build Coastguard Worker    # UUID epoch 1582-10-15 00:00:00 and the Unix epoch 1970-01-01 00:00:00.
695*cda5da8dSAndroid Build Coastguard Worker    timestamp = nanoseconds // 100 + 0x01b21dd213814000
696*cda5da8dSAndroid Build Coastguard Worker    if _last_timestamp is not None and timestamp <= _last_timestamp:
697*cda5da8dSAndroid Build Coastguard Worker        timestamp = _last_timestamp + 1
698*cda5da8dSAndroid Build Coastguard Worker    _last_timestamp = timestamp
699*cda5da8dSAndroid Build Coastguard Worker    if clock_seq is None:
700*cda5da8dSAndroid Build Coastguard Worker        import random
701*cda5da8dSAndroid Build Coastguard Worker        clock_seq = random.getrandbits(14) # instead of stable storage
702*cda5da8dSAndroid Build Coastguard Worker    time_low = timestamp & 0xffffffff
703*cda5da8dSAndroid Build Coastguard Worker    time_mid = (timestamp >> 32) & 0xffff
704*cda5da8dSAndroid Build Coastguard Worker    time_hi_version = (timestamp >> 48) & 0x0fff
705*cda5da8dSAndroid Build Coastguard Worker    clock_seq_low = clock_seq & 0xff
706*cda5da8dSAndroid Build Coastguard Worker    clock_seq_hi_variant = (clock_seq >> 8) & 0x3f
707*cda5da8dSAndroid Build Coastguard Worker    if node is None:
708*cda5da8dSAndroid Build Coastguard Worker        node = getnode()
709*cda5da8dSAndroid Build Coastguard Worker    return UUID(fields=(time_low, time_mid, time_hi_version,
710*cda5da8dSAndroid Build Coastguard Worker                        clock_seq_hi_variant, clock_seq_low, node), version=1)
711*cda5da8dSAndroid Build Coastguard Worker
712*cda5da8dSAndroid Build Coastguard Workerdef uuid3(namespace, name):
713*cda5da8dSAndroid Build Coastguard Worker    """Generate a UUID from the MD5 hash of a namespace UUID and a name."""
714*cda5da8dSAndroid Build Coastguard Worker    from hashlib import md5
715*cda5da8dSAndroid Build Coastguard Worker    digest = md5(
716*cda5da8dSAndroid Build Coastguard Worker        namespace.bytes + bytes(name, "utf-8"),
717*cda5da8dSAndroid Build Coastguard Worker        usedforsecurity=False
718*cda5da8dSAndroid Build Coastguard Worker    ).digest()
719*cda5da8dSAndroid Build Coastguard Worker    return UUID(bytes=digest[:16], version=3)
720*cda5da8dSAndroid Build Coastguard Worker
721*cda5da8dSAndroid Build Coastguard Workerdef uuid4():
722*cda5da8dSAndroid Build Coastguard Worker    """Generate a random UUID."""
723*cda5da8dSAndroid Build Coastguard Worker    return UUID(bytes=os.urandom(16), version=4)
724*cda5da8dSAndroid Build Coastguard Worker
725*cda5da8dSAndroid Build Coastguard Workerdef uuid5(namespace, name):
726*cda5da8dSAndroid Build Coastguard Worker    """Generate a UUID from the SHA-1 hash of a namespace UUID and a name."""
727*cda5da8dSAndroid Build Coastguard Worker    from hashlib import sha1
728*cda5da8dSAndroid Build Coastguard Worker    hash = sha1(namespace.bytes + bytes(name, "utf-8")).digest()
729*cda5da8dSAndroid Build Coastguard Worker    return UUID(bytes=hash[:16], version=5)
730*cda5da8dSAndroid Build Coastguard Worker
731*cda5da8dSAndroid Build Coastguard Worker# The following standard UUIDs are for use with uuid3() or uuid5().
732*cda5da8dSAndroid Build Coastguard Worker
733*cda5da8dSAndroid Build Coastguard WorkerNAMESPACE_DNS = UUID('6ba7b810-9dad-11d1-80b4-00c04fd430c8')
734*cda5da8dSAndroid Build Coastguard WorkerNAMESPACE_URL = UUID('6ba7b811-9dad-11d1-80b4-00c04fd430c8')
735*cda5da8dSAndroid Build Coastguard WorkerNAMESPACE_OID = UUID('6ba7b812-9dad-11d1-80b4-00c04fd430c8')
736*cda5da8dSAndroid Build Coastguard WorkerNAMESPACE_X500 = UUID('6ba7b814-9dad-11d1-80b4-00c04fd430c8')
737