B /g^Ns@svdZddlZddlZddlmZdZddddg\ZZZZ e Z e Z Gd d d eZGd d d Zd dZddZddZddZddZddZddZddZddZdd Zdaaday ddlZWnek rdZYnXd!d"Zd#d$Z d%d&Z!d'd(Z"da#e!eegZ$e eeeeegZ%dd)d*d+Z&da'd8d,d-Z(d.d/Z)d0d1Z*d2d3Z+ed4Z,ed5Z-ed6Z.ed7Z/dS)9aQUUID objects (universally unique identifiers) according to RFC 4122. This module provides immutable UUID objects (class UUID) and the functions uuid1(), uuid3(), uuid4(), uuid5() for generating version 1, 3, 4, and 5 UUIDs as specified in RFC 4122. If all you want is a unique ID, you should probably call uuid1() or uuid4(). Note that uuid1() may compromise privacy since it creates a UUID containing the computer's network address. uuid4() creates a random UUID. Typical usage: >>> import uuid # make a UUID based on the host ID and current time >>> uuid.uuid1() # doctest: +SKIP UUID('a8098c1a-f86e-11da-bd1a-00112444be1e') # make a UUID using an MD5 hash of a namespace UUID and a name >>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org') UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e') # make a random UUID >>> uuid.uuid4() # doctest: +SKIP UUID('16fd2706-8baf-433b-82eb-8c7fada847da') # make a UUID using a SHA-1 hash of a namespace UUID and a name >>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org') UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d') # make a UUID from a string of hex digits (braces and hyphens ignored) >>> x = uuid.UUID('{00010203-0405-0607-0809-0a0b0c0d0e0f}') # convert a UUID to a string of hex digits in standard form >>> str(x) '00010203-0405-0607-0809-0a0b0c0d0e0f' # get the raw 16 bytes of the UUID >>> x.bytes b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f' # make a UUID from a 16-byte string >>> uuid.UUID(bytes=x.bytes) UUID('00010203-0405-0607-0809-0a0b0c0d0e0f') N)EnumzKa-Ping Yee zreserved for NCS compatibilityzspecified in RFC 4122z$reserved for Microsoft compatibilityzreserved for future definitionc@seZdZdZdZdZdS)SafeUUIDrN)__name__ __module__ __qualname__ZsafeZunsafeunknownr r /usr/lib64/python3.7/uuid.pyr?src@s6eZdZdZd| B}|d">| d#>B| d$>B|d%>B| B}|dk rZd|krPd&d'>ksZntd(|dk rd&|kr|dksntd)|d*M}|d+O}|d,M}||d->O}||j d.<||j d/<dS)0aLCreate a UUID from either a string of 32 hexadecimal digits, a string of 16 bytes as the 'bytes' argument, a string of 16 bytes in little-endian order as the 'bytes_le' argument, a tuple of six integers (32-bit time_low, 16-bit time_mid, 16-bit time_hi_version, 8-bit clock_seq_hi_variant, 8-bit clock_seq_low, 48-bit node) as the 'fields' argument, or a single 128-bit integer as the 'int' argument. When a string of hex digits is given, curly braces, hyphens, and a URN prefix are all optional. For example, these expressions all yield the same UUID: UUID('{12345678-1234-5678-1234-567812345678}') UUID('12345678123456781234567812345678') UUID('urn:uuid:12345678-1234-5678-1234-567812345678') UUID(bytes='\x12\x34\x56\x78'*4) UUID(bytes_le='\x78\x56\x34\x12\x34\x12\x78\x56' + '\x12\x34\x56\x78\x12\x34\x56\x78') UUID(fields=(0x12345678, 0x1234, 0x5678, 0x12, 0x34, 0x567812345678)) UUID(int=0x12345678123456781234567812345678) Exactly one of 'hex', 'bytes', 'bytes_le', 'fields', or 'int' must be given. The 'version' argument is optional; if given, the resulting UUID will have its variant and version set according to RFC 4122, overriding the given 'hex', 'bytes', 'bytes_le', 'fields', or 'int'. is_safe is an enum exposed as an attribute on the instance. It indicates whether the UUID has been generated in a way that is safe for multiprocessing applications, via uuid_generate_time_safe(3). NzGone of the hex, bytes, bytes_le, fields, or int arguments must be givenzurn:zuuid:z{}- z$badly formed hexadecimal UUID stringz bytes_le is not a 16-char stringrzbytes is not a 16-char stringbig) byteorderzfields is not a 6-tuplerlz*field 1 out of range (need a 32-bit value)iz*field 2 out of range (need a 16-bit value)z*field 3 out of range (need a 16-bit value)z*field 4 out of range (need an 8-bit value)z*field 5 out of range (need an 8-bit value)lz*field 6 out of range (need a 48-bit value)`P@0z*int is out of range (need a 128-bit value)zillegal version numberl llLintr ) count TypeErrorreplacestriplen ValueErrorint_ isinstancebytes_AssertionErrorrepr from_bytes__dict__)selfhexbytesbytes_lefieldsr!versionr time_lowtime_midtime_hi_versionclock_seq_hi_variant clock_seq_lownode clock_seqr r r __init__ys^    6   $    z UUID.__init__cCs.|j}|jtjkr$|jj|d<n|d=|S)Nr )r.copyr rrvalue)r/stater r r __getstate__s   zUUID.__getstate__cCs0|j|d|kr t|dntj|jd<dS)Nr )r.updaterr)r/r?r r r __setstate__s zUUID.__setstate__cCst|tr|j|jkStS)N)r)r r!NotImplemented)r/otherr r r __eq__s  z UUID.__eq__cCst|tr|j|jkStS)N)r)r r!rC)r/rDr r r __lt__s  z UUID.__lt__cCst|tr|j|jkStS)N)r)r r!rC)r/rDr r r __gt__s  z UUID.__gt__cCst|tr|j|jkStS)N)r)r r!rC)r/rDr r r __le__s  z UUID.__le__cCst|tr|j|jkStS)N)r)r r!rC)r/rDr r r __ge__s  z UUID.__ge__cCs t|jS)N)hashr!)r/r r r __hash__sz UUID.__hash__cCs|jS)N)r!)r/r r r __int__sz UUID.__int__cCsd|jjt|fS)Nz%s(%r)) __class__rstr)r/r r r __repr__sz UUID.__repr__cCs tddS)NzUUID objects are immutable)r#)r/namer>r r r __setattr__szUUID.__setattr__cCsDd|j}d|dd|dd|dd|dd|ddfS)Nz%032xz%s-%s-%s-%s-%sr r)r!)r/r0r r r __str__ s z UUID.__str__cCs|jddS)Nrr)r!to_bytes)r/r r r r1sz UUID.bytescCs<|j}|ddd|ddd|ddd|ddS)Nrrrrr)r1)r/r1r r r r2s(z UUID.bytes_lecCs|j|j|j|j|j|jfS)N)r5r6r7r8r9r:)r/r r r r3s z UUID.fieldscCs |jd?S)Nr)r!)r/r r r r5sz UUID.time_lowcCs|jd?d@S)Nri)r!)r/r r r r6"sz UUID.time_midcCs|jd?d@S)Nri)r!)r/r r r r7&szUUID.time_hi_versioncCs|jd?d@S)N8)r!)r/r r r r8*szUUID.clock_seq_hi_variantcCs|jd?d@S)NrrW)r!)r/r r r r9.szUUID.clock_seq_lowcCs|jd@d>|jd>B|jBS)Nirr)r7r6r5)r/r r r time2sz UUID.timecCs|jd@d>|jBS)N?r)r8r9)r/r r r r;7s zUUID.clock_seqcCs |jd@S)Nl)r!)r/r r r r:<sz UUID.nodecCs d|jS)Nz%032x)r!)r/r r r r0@szUUID.hexcCs dt|S)Nz urn:uuid:)rN)r/r r r urnDszUUID.urncCs2|jd@stS|jd@stS|jd@s*tStSdS)Nlll)r! RESERVED_NCSRFC_4122RESERVED_MICROSOFTRESERVED_FUTURE)r/r r r variantHs   z UUID.variantcCs |jtkrt|jd?d@SdS)Nr )r_r\r!)r/r r r r4Ss z UUID.version)NNNNNN)#rrr__doc__rrr<r@rBrErFrGrHrIrKrLrOrQrTpropertyr1r2r3r5r6r7r8r9rXr;r:r0rZr_r4r r r r r Es>2T               r c Gsddl}ddl}ddl}||}|dkrP|jd}|j||d}|dkrPdSt|j}d|d<|j|f||j |j |d}|S)Nr)z/sbinz /usr/sbin)pathCLC_ALL)stdoutstderrenv) osshutil subprocessZwhichpathsepjoindictenvironPopenPIPEZDEVNULL) commandargsrirjrk executablercrhprocr r r _popenYs    rvcCs |d@ S)Nlr )macr r r _is_universal{srxc Csd}yt|f|}|s dS|x|jD]}|}xptt|D]`}|||krPy6|||} t| ddd} t | r| S|p| }WqPt t fk rYqPXqPWq.WWdQRXWnt k rYnX|pdS)N:r) rvsplitrflowerrstripranger&r!r$rxr' IndexErrorOSError) rrrsZhw_identifiersZ get_indexfirst_local_macrulinewordsiwordrwr r r _find_mac~s*    rcCs2d}x(dD] }td||dd}|r(|SdSWdS)z5Get the hardware address on Unix by running ifconfig.)shwaddrsethersaddress:slladdr)rz-az-avZifconfigcSs|dS)Nrr )rr r r rzz#_ifconfig_getnode..N)r)keywordsrsrwr r r _ifconfig_getnodes  rcCs tdddgdd}|r|SdS)z/Get the hardware address on Unix by running ip.Ziplinks link/ethercSs|dS)Nrr )rr r r rrzz_ip_getnode..N)r)rwr r r _ip_getnodesrcCsddl}ddl}y||}Wntk r6dSXtdd||gdd}|rZ|Stdd||gdd}|r||Stdd|d|gd d}|r|SdS) z0Get the hardware address on Unix by running arp.rNZarpz-ancSsdS)Nrr )rr r r rrzz_arp_getnode..cSs|dS)Nrr )rr r r rrzz(%s)cSs|dS)Nr )rr r r rrz)risocketZ gethostbynameZ gethostnamerrfsencode)rirZip_addrrwr r r _arp_getnodes  rcCstdddgddS)z4Get the hardware address on Unix by running lanscan.Zlanscanz-aislan0cSsdS)Nrr )rr r r rrzz"_lanscan_getnode..)rr r r r _lanscan_getnodesrc Csd}ytdd}|sdS||j}y|d}Wntk rRdSXx|jD]v}yX|}||}t|dkr|ddkrt | ddd }t |r|S|p|}Wq\tt fk rYq\Xq\WWdQRXWnt k rYnX|pdS) z4Get the hardware address on Unix by running netstat.NZnetstatz-iasAddressryrrzr)rvrfreadliner}r{indexr'r&r"r!r$rxrr)rrurrrrrwr r r _netstat_getnodes2    rc Cs.ddl}ddl}ddl}d}dddg}y:ddl}|d}|jj|d|d|j dWn YnXx|D]}y$|j |j |dd g|jd d }Wntk rwtYnX|bxZ|jD]P} | d d } |d| rt| ddd} t| r| S|p| }qWWdQRXqtW|p,dS)zdecoderprcrmrqrrfr{r%r| fullmatchr!r$rx) rirrkrdirsrbufferdirrurr>rwr r r _ipconfig_getnodes4       rc Cs6ddl}ddl}d}|}|j|_||_}|||dkrLdS| xt |j D]}| |j |_t|j||_||dkrq`| |j|_t|j||_dd|_||_}||dkrq`| |jdd}t|dkrq`t|d}t|r|S|p&|}q`W|p4dS)ztGet the hardware address on Windows using NetBIOS calls. See http://support.microsoft.com/kb/118623 for details.rN*rrr) win32wnetnetbiosZNCBZNCBENUMZCommandZ LANA_ENUMZBufferZ_packZNetbiosZ_unpackr~lengthZResetZNCBRESETordZlanaZLana_numZNCBASTATljustZCallnameZADAPTER_STATUSZadapter_addressr&r!r-rx) rrrZncbZadaptersrZstatusr1rwr r r _netbios_getnodes>   rc s~tdk r dSdatjdkr8ttjdddkr8ntdk rPtj a tj adSyddl ddl dg}tjds~|d x|D]~}yj|}Wntk rwYnXt|d r|jfd d a d aPqt|dr|jd_fdd a PqWy jj}Wnd}YnXt|dt|ddaWn>tk rx}zddl}|d|tWdd}~XYnXdS)zG Try to load platform-specific functions for generating uuids. NFdarwin.r Zuuidwincuuid_generate_time_safecs d}|}t|j|fS)Nr)rr1raw)_bufferZres)_uuid_generate_time_saferr r _generate_time_safeas rTuuid_generate_timecs d}|t|jdfS)Nr)rr1r)r)_uuid_generate_timerr r rls ZUuidCreateSequentialZ UuidCreatez/Could not find fallback ctypes uuid functions: )_has_uuid_generate_time_safesysplatformr!riunamereleaser{_uuidZgenerate_time_saferZhas_uuid_generate_time_saferZ ctypes.util startswithappendZCDLLutilZ find_library ExceptionhasattrrrZrestyperZrpcrt4getattr _UuidCreatewarningswarn ImportWarning)Z _libnamesZlibnamelibexcrr )rrrr _load_system_functions3sP&         rcCstt\}}t|djS)zPGet the hardware address on Unix using the _uuid extension module or ctypes.)r1)rrr r:) uuid_time_r r r _unix_getnodes rcCs:ddl}t|d}t|dkr6tt|jdjSdS)z1Get the hardware address on Windows using ctypes.rNr)r1)rrrrr r*rr:)rrr r r _windll_getnodes   rcCsddl}|ddBS)zGet a random node ID.rNrl)random getrandbits)rr r r _random_getnodes r)getterscCstdk r tStjdkrt}nt}xP|tgD]B}y |aWnw,YnXtdk r,dtkrfdkr,nq,tSq,WdstdtdS)a3Get the hardware address as a 48-bit positive integer. The first time this runs, it may launch a separate program, which could be quite slow. If all attempts to obtain the hardware address fail, we choose a random 48-bit number with its eighth bit set to 1 as recommended in RFC 4122. NZwin32rlFz,_random_getnode() returned invalid value: {})_noderr_NODE_GETTERS_WIN32_NODE_GETTERS_UNIXrr+format)rgetterr r r getnodes    rcCsttdk rd||kr"dkrdnn>t\}}y t|}Wntk rVtj}YnXt||dSddl}t|d}t|dd}tdk r|tkrtd}|a|dkrddl }| d}|d @} |d ?d @} |d ?d @} |d@} |d?d@} |dkrt }t| | | | | |fddS)aGenerate a UUID from a host ID, sequence number, and the current time. If 'node' is not given, getnode() is used to obtain the hardware address. If 'clock_seq' is given, it is used as the sequence number; otherwise a random 14-bit sequence number is chosen.N)r1r rgeAdl@'Hw rlririrWrrY)r3r4) rrrr'rr rXr!_last_timestamprrr)r:r;rZsafely_generatedr rXZ nanosecondsZ timestamprr5r6r7r9r8r r r uuid1s4          rcCs8ddlm}||jt|d}t|ddddS)zAGenerate a UUID from the MD5 hash of a namespace UUID and a name.r)md5zutf-8Nrr)r1r4)hashlibrr1digestr ) namespacerPrrJr r r uuid3s rcCsttdddS)zGenerate a random UUID.rr )r1r4)r riurandomr r r r uuid4srcCs8ddlm}||jt|d}t|ddddS)zCGenerate a UUID from the SHA-1 hash of a namespace UUID and a name.r)sha1zutf-8Nrr)r1r4)rrr1rr )rrPrrJr r r uuid5s rz$6ba7b810-9dad-11d1-80b4-00c04fd430c8z$6ba7b811-9dad-11d1-80b4-00c04fd430c8z$6ba7b812-9dad-11d1-80b4-00c04fd430c8z$6ba7b814-9dad-11d1-80b4-00c04fd430c8)NN)0rarirenumr __author__r[r\r]r^r!r(r1r*rr rvrxrrrrrrrrrrrr ImportErrorrrrrrrrrrrrrrZ NAMESPACE_DNSZ NAMESPACE_URLZ NAMESPACE_OIDZNAMESPACE_X500r r r r -s\ " $  T   '