o hv @s dZdZdZddlmZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZzddlZWn eyFdZYnwzddlZWn eyXdZYnweefZzeef7ZWn eymYnwgdZdZdZed Zd Zd Zd Zd Zd Z dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2e2Z3e!e"e#e$e'e(e)e%e&e*e+e,f Z4e!e"e)e,fZ5e*e+e,fZ6dZ7hdZ8e9e9e9e:e:e:d Z;ejZ=d#d$Z?d%d&Z@d'd(ZAd)e3fd*d+ZBd,d-ZCdedfd.d/ZDd0d1ZEGd2d3d3eFZGGd4d5d5eGZHGd6d7d7eGZIGd8d9d9eGZJGd:d;d;eGZKGdd?d?eLZMGd@dAdAeLZNGdBdCdCeLZOGdDdEdEeLZPGdFdGdGeLZQGdHdIdIZRGdJdKdKZSGdLdMdMeTZUGdNdOdOeTZVGdPdQdQejWZXGdRdSdSeGZYGdTdUdUeYZZGdVdWdWeYZ[GdXdYdYeYZ\GdZd[d[eYZ]Gd\d]d]eYZ^Gd^d_d_eYZ_eYeeHfZ`dtdadbZadcddZbdedfZcdgdhZdebeceddiZeeTZfegdjZhGdkdldleTZiGdmdndneTZjdodpZkejjZdqdrZlemdskreldSdS)uz0.9.0u"Lars Gustäbel (lars@gustaebel.de)u4Gustavo Niemeyer, Niels Gustäbel, Richard Townsend.)openN)TarFileTarInfo is_tarfileTarError ReadErrorCompressionError StreamError ExtractError HeaderErrorENCODING USTAR_FORMAT GNU_FORMAT PAX_FORMATDEFAULT_FORMATrisustar sustar00d01234567LKSxgX)pathlinkpathsizemtimeuidgidunamegname>r%r&r+r,)Zatimectimer(r)r*r'ntutf-8cCs: |dur td|||}|d||t|tS)Nzmetadata cannot contain None) ValueErrorencodelenNUL)slengthencodingerrorsr8./opt/alt/python310/lib64/python3.10/tarfile.pystns  r:cCs, |d}|dkr|d|}|||S)Nr)finddecode)r4r6r7pr8r8r9ntss    r?cCs |ddvr3d}tt|dD]}|dK}|||d7}q|ddkr1dt|d| }|Szt|dd}t|p@d d}W|StyPtd w) Nr)r#rAasciistrict0invalid header)ranger2r?intstripr0InvalidHeaderError)r4nir8r8r9ntis     rNrBcCs |}t|}d|krd|dkr&nntd|d|fdt}|S|tkrnd|d |kr=d|dkrnntd |dkrLtdg}n tdg}d||}t|dD]}|d|d@|dL}q]|Std ) NrrBr#z%0*orDrCr@rAzoverflow in number field)rIbytesr3r bytearrayrHinsertr0)rLdigitsformatZ original_nr4rMr8r8r9itns"  0     rTcCs2 dttd|}dttd|}||fS)NrCZ 148B8x356BZ 148b8x356b)sumstructZ unpack_from)bufZunsigned_chksumZ signed_chksumr8r8r9 calc_chksumssrXc Cs |pd}|dkr dS|durt|||dSt||\}}t|D]}||}t||kr4|d||q#|dkrR||}t||krM|d||dS)Ni@runexpected end of data)shutil copyfileobjdivmodrHreadr2write) srcZdstr5 exceptionbufsizeblocks remainderbrWr8r8r9r[s&       r[cCs8ttjdd}|dur||d|}t|dddS)Nr6backslashreplace )end)getattrsysstdoutr1r=print)r4r6r8r8r9 _safe_printsrlc@eZdZ dS)rN__name__ __module__ __qualname__r8r8r8r9rrc@rm)r Nrnr8r8r8r9r rrr c@rm)rNrnr8r8r8r9rrrrc@rm)rNrnr8r8r8r9rrrrc@rm)r Nrnr8r8r8r9r rrr c@rm)r Nrnr8r8r8r9r rrr c@rm)EmptyHeaderErrorNrnr8r8r8r9rs!rrrsc@rm)TruncatedHeaderErrorNrnr8r8r8r9rt$rrrtc@rm)EOFHeaderErrorNrnr8r8r8r9ru'rrruc@rm)rKNrnr8r8r8r9rK*rrrKc@rm)SubsequentHeaderErrorNrnr8r8r8r9rv-rrrvc@.eZdZ ddZddZddZddZd S) _LowLevelFilecCsFtjtjtjBtjBd|}ttdr|tjO}t||d|_dS)NrwO_BINARYi) osO_RDONLYO_WRONLYO_CREATO_TRUNChasattrr|rfd)selfnamemoder8r8r9__init__:s  z_LowLevelFile.__init__cCst|jdSN)r}closerrr8r8r9rCz_LowLevelFile.closecCst|j|Sr)r}r]rrr'r8r8r9r]Fz_LowLevelFile.readcCst|j|dSr)r}r^rrr4r8r8r9r^Isz_LowLevelFile.writeN)rorprqrrr]r^r8r8r8r9rx4s   rxc@speZdZ ddZddZddZddZd d Zd d Zd dZ ddZ dddZ ddZ ddZ ddZdS)_Streamc Cs d|_|durt||}d|_|dkrt|}|}|pd|_||_||_||_||_d|_ d|_ d|_ z|dkrmzddl }Wn t yMtddw||_ |d|_|d krf||j|_WdS|WdS|d krzddl}Wn t ytd dw|d krd|_||_t|_WdS||_WdS|d krzddl}Wn t ytd dw|d krd|_||_|j|_WdS||_WdS|dkrtd|WdS|js|jd|_ )NTF*rgzzzlib module is not availablerzbz2bz2 module is not availablexzlzma module is not availabletarunknown compression type %r) _extfileobjrx _StreamProxy getcomptyperrcomptypefileobjrarWposclosedzlib ImportErrorrcrc32crc _init_read_gzerrorr`_init_write_gzrdbufZBZ2DecompressorcmpOSErrorZ BZ2CompressorlzmaZLZMADecompressor LZMAErrorZLZMACompressorr) rrrrrrarrrr8r8r9rWsv                 z_Stream.__init__cCs$t|dr|js|dSdSdS)Nr)rrrrr8r8r9__del__s z_Stream.__del__cCs |jd|jj|jj |jjd|_tdtt }| d|d|j dr4|j dd|_ t j|j |_ | |j dd tdS) N rs  rc@sheZdZ dddZddZddZdd Zd d Zd d Ze j fddZ dddZ ddZ ddZdS) _FileInFileNcCs||_||_||_d|_t|dd|_d|_|durd|fg}d|_g|_d}|j}|D]&\}}||kr>|j d||df|j d||||f||7}||}q,||jkre|j d||jdfdSdS)NrrFT) roffsetr'positionrhrr map_indexmapr)rrrr'Z blockinfoZlastposZrealposr8r8r9rbs*    z_FileInFile.__init__cCsdSrr8rr8r8r9r{z_FileInFile.flushcCdSNTr8rr8r8r9readable~rz_FileInFile.readablecCrNFr8rr8r8r9writablerz_FileInFile.writablecCs |jSr)rseekablerr8r8r9r z_FileInFile.seekablecCrr)rrr8r8r9rrz_FileInFile.tellcCs |tjkrtt|d|j|_|jS|tjkr5|dkr(t|j|d|_|jSt|j||j|_|jS|tjkrJtt|j||jd|_|jStd)NrzInvalid argument) ioSEEK_SETminmaxr'rSEEK_CURSEEK_ENDr0)rrwhencer8r8r9rs   z_FileInFile.seekc Cs |dur |j|j}n t||j|j}d}|dkr |j|j\}}}}||jkr1|kr4nnn|jd7_|jt|jkrFd|_qt|||j}|rq|j||j||j|}t||krlt d||7}n|t |7}||8}|j|7_|dks|S)NrrTr#rY) r'rrrrr2rrr]rr3) rr'rWdatastartstoprr5rdr8r8r9r]s4    z_FileInFile.readcCs&|t|}||dt|<t|Sr)r]r2)rrdrWr8r8r9readintosz_FileInFile.readintocCs d|_dSr)rrr8r8r9rrz_FileInFile.closer)rorprqrrrrrrrrrr]rrr8r8r8r9r\s   rceZdZfddZZS) ExFileObjectcs&t|j|j|j|j}t|dSr)rr offset_datar'sparsesuperr)rtarfiletarinfor __class__r8r9rs zExFileObject.__init__rorprqr __classcell__r8r8rr9rsrc@s eZdZdS) FilterErrorNrnr8r8r8r9rsrcr)AbsolutePathErrorcs ||_td|jddS)Nzmember z has an absolute pathrrrrrrrr8r9rszAbsolutePathError.__init__rr8r8rr9rrcr)OutsideDestinationErrorc.||_||_t|jd|dddS)Nz would be extracted to , which is outside the destinationr_pathrrrrrr%rr8r9r  z OutsideDestinationError.__init__rr8r8rr9rrrcr)SpecialFileErrorc||_t|jddS)Nz is a special filerrrr8r9rzSpecialFileError.__init__rr8r8rr9rrrcr)AbsoluteLinkErrorcr)Nz is a link to an absolute pathrrrr8r9rrzAbsoluteLinkError.__init__rr8r8rr9rrrcr)LinkOutsideDestinationErrorcr)Nz would link to rrrrrr8r9rrz$LinkOutsideDestinationError.__init__rr8r8rr9rrrcr)LinkFallbackErrorcs2||_||_td|jdd|ddS)Nzlink z would be extracted as a zcopy of z, which was rejectedrrrr8r9rs   zLinkFallbackError.__init__rr8r8rr9rrrTcCsi}|j}tjj|tjjd}|dtjfr$|jdtj}|d<tj|r.t |tjjtj ||tjjd}tj ||g|krLt |||j }|dur|d@}|r}|sa|rn|d@si|dM}|dO}n|sv|ryd}nt|||j kr||d<|r|jdurd|d <|jdurd|d <|jdurd|d <|jdurd|d <|s|rtj|jrt|tj|j}||jkr||d <|rtj |tj||j}ntj ||j}tjj|tjjd}tj ||g|krt|||S)N)rE/ri@irr)r*r+r,linkname)rr}r%realpath ALLOW_MISSINGrseplstripisabsrr commonpathrrisregislnkisdirissymrr)r*r+r,r rnormpathdirnamer)member dest_pathZfor_data new_attrsrZ target_pathrZ normalizedr8r8r9_get_filtered_attrssl           rcCs|Srr8)rrr8r8r9fully_trusted_filterArrcCs,t||d}|r|jdi|ddiS|S)NFdeepr8rrrrrr8r8r9 tar_filterD r cCs,t||d}|r|jdi|ddiS|S)NTrFr8rrr8r8r9 data_filterJr!r")Z fully_trustedrrs([0-9]{1,20}) c @s*eZdZ ed{iddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d$d&d$Zd|d(d)Zed*d+Zejd,d+Zed-d.Z e jd/d.Z d0d1Z e e e e e e e e d2e d3 d4d5Z d6d7Z eed8fd9d:Zd;d<Zd=d>Zd?d@ZedAdBZdCdDZedEdFZedGdHZedIdJZedKdLZedMdNZedOdPZdQdRZdSdTZdUdVZ dWdXZ!dYdZZ"d[d\Z#d]d^Z$d_d`Z%dadbZ&dcddZ'dedfZ(dgdhZ)didjZ*dkdlZ+dmdnZ,dodpZ-dqdrZ.dsdtZ/dudvZ0dwdxZ1dydzZ2d$S)}rrzName of the archive member.rzPermission bits.r)z6User ID of the user who originally stored this member.r*z7Group ID of the user who originally stored this member.r'zSize in bytes.r(zTime of last modification.chksumzHeader checksum.typezFile type. type is usually one of these constants: REGTYPE, AREGTYPE, LNKTYPE, SYMTYPE, DIRTYPE, FIFOTYPE, CONTTYPE, CHRTYPE, BLKTYPE, GNUTYPE_SPARSE.r zcName of the target file name, which is only present in TarInfo objects of type LNKTYPE and SYMTYPE.r+z User name.r,z Group name.devmajorzDevice major number.devminorzDevice minor number.rzThe tar header starts here.rzThe file's data starts here. pax_headerszMA dictionary containing key-value pairs of an associated pax extended header.rzSparse member information.rN_sparse_structs _link_targetrcCsl ||_d|_d|_d|_d|_d|_d|_t|_d|_ d|_ d|_ d|_ d|_ d|_d|_d|_i|_dS)Nirr)rrr)r*r'r(r#REGTYPEr$r r+r,r%r&rrrr'rrr8r8r9rs$ zTarInfo.__init__cCrrrrr8r8r9r%z TarInfo.pathcC ||_dSrr,r+r8r8r9r% cCrrr rr8r8r9r&r-zTarInfo.linkpathcCr.rr0)rr r8r8r9r&r/cCsd|jj|jt|fS)Nz<%s %r at %#x>)rroridrr8r8r9__repr__szTarInfo.__repr__T) rr(rr r)r*r+r,r_KEEPc Cs | r t|} nt|} || ur|| _|| ur|| _|| ur#|| _|| ur*|| _|| ur1|| _|| ur8|| _|| ur?|| _|| urF|| _ | Sr) copyZdeepcopyrr(rr r)r*r+r,) rrr(rr r)r*r+r,rr3resultr8r8r9rs*  zTarInfo.replacecCs |jdur d}n|jd@}|j||j|j|j|j|j|j|j|j |j |j |j d }|dt kr?|dds?|dd7<|S)N) rrr)r*r'r(r#r$r r+r,r%r&r$rr)rrr)r*r'r(r#r$r r+r,r%r&DIRTYPEr)rrinfor8r8r9get_infos*  zTarInfo.get_infosurrogateescapecCsx |}|D]\}}|durtd|q |tkr#||||S|tkr.||||S|tkr8|||Std)Nz%s may not be Nonezinvalid format) r9itemsr0r create_ustar_headerrcreate_gnu_headerrcreate_pax_header)rrSr6r7r8rvaluer8r8r9tobufs  z TarInfo.tobufcCsp t|d<t|d||tkrtdt|d||tkr0||d||\|d<|d<||t||S)Nmagicr zlinkname is too longrprefix) POSIX_MAGICr2r1 LENGTH_LINKr0 LENGTH_NAME_posix_split_name_create_headerr )rr8r6r7r8r8r9r<szTarInfo.create_ustar_headercCs t|d<d}t|d||tkr|||dt||7}t|d||tkr7|||dt||7}|||t ||S)NrArr r) GNU_MAGICr2r1rD_create_gnu_long_headerGNUTYPE_LONGLINKrEGNUTYPE_LONGNAMErGr)rr8r6r7rWr8r8r9r=szTarInfo.create_gnu_headerc CsF t|d<|j}ddtfddtfddfD]2\}}}||vr qz ||dd Wnty9||||<Yqwt|||krH||||<qd D]A\}}d }||} t| t } | r`t | n| } d | krpd |dksxnd ||<d}n| r| ||<d}|r||vrt | ||<qK|r| |t |} nd} | ||tddS)NrArr%r r&)r+r+ )r,r,rLrDrE))r)rB)r*rB)r' )r(rMFrrBr#Trr)rCr'r4rErDr1UnicodeEncodeErrorr2 isinstancefloatroundstr_create_pax_generic_headerXHDTYPErGr ) rr8r6r'rZhnamer5rRZ needs_paxvalZ val_is_floatZval_intrWr8r8r9r>sF        zTarInfo.create_pax_headercCs ||tdS)Nr/)rSXGLTYPE)clsr'r8r8r9create_pax_global_headerNsz TarInfo.create_pax_global_headercCs~ |d}tdt|D]-}d|d|}d||d}t|||tkr:t|||tkr:||fSq td)Nrr#zname is too long)splitrHr2rr1 LENGTH_PREFIXrEr0)rrr6r7Z componentsrMrBr8r8r9rFTs zTarInfo._posix_split_namec Cs |dttfv}|r!t|ddd|}t|ddd|}ntdd||}tdd||}|dt}|dur=tdt|ddd ||t|d dd @d|t|d dd|t|d dd|t|ddd|t|ddd|d|t|ddd |||dtt|ddd||t|ddd||||t|ddd||g}t dt d |} t | t dd} | ddt d| d| dd} | S)Nr$r%rrBr&rzTarInfo.type must not be Nonerrrr6r)r*r'rMr(s r rAr+rLr,rBrz%dsriz%06orDi)getCHRTYPEBLKTYPErTr:r*r0rCrVrrrrXrO) r8rSr6r7Zhas_device_fieldsr%r&ZfiletypepartsrWr#r8r8r9rGds<  &zTarInfo._create_headercCs0 tt|t\}}|dkr|t|t7}|S)Nr)r\r2rr3)Zpayloadrbrcr8r8r9_create_payloads zTarInfo._create_payloadcCsT |||t}i}d|d<||d<t||d<t|d<||t||||S)Nz ././@LongLinkrr$r'rA)r1r3r2rHrGr r_)rWrr$r6r7r8r8r8r9rIs zTarInfo._create_gnu_long_headerc Cs. d}|D]\}}z|ddWqtyd}Ynwd}|r(|d7}|D]I\}}|d}|r>||d}n|d}t|t|d}d } } |tt| } | | kr_n| } qR|tt| d d |d |d 7}q,i} d| d<|| d<t|| d<t| d<|| td d| |S)NFr/rETrs21 hdrcharset=BINARY r:rrrD = z././@PaxHeaderrr$r'rAr) r;r1rNr2rRrOrCrGr r_) rWr'r$r6Zbinarykeywordr?ZrecordslrLr>r8r8r8r9rSsD   ( z"TarInfo._create_pax_generic_headerc Csh t|dkr tdt|tkrtd|ttkr tdt|dd}|t|vr2t d|}t |dd|||_ t|dd |_ t|d d |_ t|d d |_t|d d |_t|d d|_||_|dd |_t |d d|||_t |dd|||_t |dd|||_t|dd|_t|dd|_t |dd||}|jtkr|j drt|_|jtkrd}g}tdD]0} zt|||d} t||d|d} Wn tyYn w|| | f|d7}qt|d} t|dd} || | f|_ |!r!|j "d|_ |r2|jt#vr2|d|j |_ |S)Nrz empty headerztruncated headerzend of file headerz bad checksumrlt|ii i)iIiQiYirirrMiii)$r2rsrrtcountr3rurNrXrKr?rrr)r*r'r(r#r$r r+r,r%r&AREGTYPErr7GNUTYPE_SPARSErHr0rboolr(rrstrip GNU_TYPES)rWrWr6r7r#objrBrstructsrMrnumbytes isextendedorigsizer8r8r9frombufs^          zTarInfo.frombufcCs: |jt}|||j|j}|jt|_||Sr) rr]rrxr6r7rr _proc_member)rWrrWrsr8r8r9 fromtarfiles   zTarInfo.fromtarfilecCsR |jttfvr ||S|jtkr||S|jtttfvr$| |S| |Sr) r$rKrJ _proc_gnulongro _proc_sparserTrVSOLARIS_XHDTYPE _proc_pax _proc_builtin)rrr8r8r9ry0s     zTarInfo._proc_membercCsj |j|_|j}|s|jtvr|||j7}||_| |j |j |j | r3|jd|_|SNr)rrrrr$SUPPORTED_TYPES_blockr'r_apply_pax_infor'r6r7rrrq)rrrr8r8r9r=s zTarInfo._proc_builtinc Cs |j||j}z||}Wnty%}ztt|dd}~ww|j|_|j t kr9t ||j |j |_n|j tkrGt ||j |j |_|rR|jd|_|Sr)rr]rr'rzr rvrRrr$rKr?r6r7rrJr r removesuffix)rrrWnextrr8r8r9r{Ss   zTarInfo._proc_gnulongc Cs |j\}}}|`|rT|jt}d}tdD]4}zt|||d}t||d|d} Wn ty;Ynw|rG| rG||| f|d7}qt|d}|s ||_ |j |_ |j | |j |_||_ |S)NrrMrli)r(rr]rrHrNr0rrprrrrr'r) rrrtrvrwrWrrMrrur8r8r9r|ns.       zTarInfo._proc_sparsec Cs |j||j}|jtkr|j}n|j}d}d}g}t||kr||dkrt ||}s7t dz t | d}Wn tyKt dw|dkrTt d||t|kr`t d|d|d} ||dd| } | d\} } } | r| dks|| dkrt d||| | f| dkr|dur| dkr|j}nd }||7}t||kr||dks+|durd }|D]*\}} } || d d |j}|tvr|| ||j|j}n || d d |j}|||<qz||}Wnty}ztt|dd}~wwd |vr|||n#d |vr|||n|d d kr4|ddkr4|||||jtt fvrg|!||j|j|j"|_"d|vrg|j#}|$s\|jt%vrd|||j7}||_"|S)NrrGr#rars hdrcharsetsBINARYr/GNU.sparse.mapGNU.sparse.sizezGNU.sparse.major1zGNU.sparse.minorrFr')&rr]rr'r$rVr'r4r2_header_length_prefix_rematchrKrIgroupr0rrg partitionrr6_decode_pax_fieldr7PAX_NAME_FIELDSrzr rvrR_proc_gnusparse_01_proc_gnusparse_00r[_proc_gnusparse_10rTr}rrrrr)rrrWr'rr6 raw_headersrr5Zheader_value_end_offsetZkeyword_and_valueZ raw_keywordZequalsZ raw_valuercr?rrrr8r8r9r~s    )        zTarInfo._proc_paxc Cs g}g}|D];\}}}|dkr'z |t|Wqty&tdw|dkrBz |t|WqtyAtdwqtt|||_dS)NsGNU.sparse.offsetrGsGNU.sparse.numbytes)rrIr=r0rKlistzipr)rrrZoffsetsru_rcr?r8r8r9rs$  zTarInfo._proc_gnusparse_00cCsB dd|ddD}tt|ddd|ddd|_dS)NcSsg|]}t|qSr8)rI).0xr8r8r9 sz.TarInfo._proc_gnusparse_01..r,r$r#)rYrrr)rrr'rr8r8r9rs(zTarInfo._proc_gnusparse_01cCs d}g}|jt}|dd\}}t|}t||dkrBd|vr+||jt7}|dd\}}|t|t||dks|j|_t t |ddd|ddd|_ dS)Nrbr#r$) rr]rrYrIr2rrrrrr)rrr'rZfieldsrrWZnumberr8r8r9rs  (zTarInfo._proc_gnusparse_10c Cs |D]T\}}|dkrt|d|q|dkr!t|dt|q|dkr.t|dt|q|tvrY|tvrJzt||}Wn tyId}Ynw|dkrS|d}t|||q||_dS)NzGNU.sparse.namer%rr'zGNU.sparse.realsizerr) r;setattrrI PAX_FIELDSPAX_NUMBER_FIELDSr0rqr4r')rr'r6r7rcr?r8r8r9r-s(   zTarInfo._apply_pax_infocCs0 z||dWSty|||YSw)NrE)r=UnicodeDecodeError)rr?r6Zfallback_encodingZfallback_errorsr8r8r9rDs  zTarInfo._decode_pax_fieldcCs4 |dkr tdt|t\}}|r|d7}|tS)Nrzinvalid offsetr#)rKr\r)rrmrbrcr8r8r9rLszTarInfo._blockcCs |jtvSr)r$ REGULAR_TYPESrr8r8r9rX z TarInfo.isregcCs |Sr)rrr8r8r9isfile\szTarInfo.isfilecC |jtkSr)r$r7rr8r8r9r`rz TarInfo.isdircCrr)r$SYMTYPErr8r8r9rdrz TarInfo.issymcCrr)r$LNKTYPErr8r8r9rhrz TarInfo.islnkcCrr)r$r\rr8r8r9ischrlrz TarInfo.ischrcCrr)r$r]rr8r8r9isblkprz TarInfo.isblkcCrr)r$FIFOTYPErr8r8r9isfifotrzTarInfo.isfifocCs |jduSr)rrr8r8r9issparsexrzTarInfo.issparsecCs |jtttfvSr)r$r\r]rrr8r8r9isdev{sz TarInfo.isdevr8)r)3rorprqdict __slots__rpropertyr%setterr&r2r3rr9rr r@r<r=r> classmethodrXrF staticmethodrGr_rIrSrxrzryrr{r|r~rrrrrrrrrrrrrrrrr8r8r8r9r`s         :  )   2 >  y  rc@s eZdZ dZdZdZdZeZe Z dZ e Z eZdZ    djddZedddefd d Zedkd d ZedlddZedlddZedmddZdddddZddZddZddZdd Zdnd!d"Zdodd$d%d&Zdpdd'd(d)Z dqd*d+Z!d,d-Z"drddd/d0d1Z#d2d3Z$dsddd/d5d6Z%d7d8Z& dqd9d:Z'd;d<Z(d=d>Z)d?d@Z* # dtdddAdBdCZ+dDdEZ,dFdGZ-dHdIZ.dJdKZ/dLdMZ0dNdOZ1dPdQZ2dRdSZ3dTdUZ4dVdWZ5dXdYZ6dudZd[Z7d\d]Z8dqd^d_Z9d`daZ:dbdcZ;dddeZdS)vrrFr#Nrzr:c Cs ddddd}||vrtd||_|||_|s5|jdkr+tj|s+d|_d|_t||j}d |_n |durIt|d rIt |j t t frI|j }t|d rR|j|_d |_|r]tj |nd|_ ||_|durj||_|durq||_|durx||_|dur||_|dur||_| |_| dur|jtkr| |_ni|_| dur| |_| dur| |_| |_d |_g|_d |_|j|_i|_z||jd krd|_ |!|_ |jdkr |j"|jz|j#|}|j$|Wn#t%y|j"|jYnt&y }zt't |dd}~wwq|jdvr3d |_|jr6|j(|j)}|j*||jt+|7_WdSWdSWdS|jsE|j,d |_)Nrbzr+bwbZxbrzar{r!mode must be 'r', 'a', 'w' or 'x'rr{FrrTrzrr{r)-r0r_moder}r%exists bltn_openrrrOrrRrOabspathrrSr dereference ignore_zerosr6r7rr'debug errorlevel copybufsizermembers_loadedrrinodes firstmemberrrrzrrur rrXr4r^r2r)rrrrrSrrrr6r7r'rrrZmodesrrWr8r8r9rs            zTarFile.__init__c s |s |s td|dvrpfdd}g}tj|dD]G}tj|} |dur.|} z | |d|fi|WSttfyc} z|d|d| |durY|| WYd} ~ qd} ~ wwd |} td | d |vr| d d \} }| pd} |pd }|jvrtj|} ntd|| || |fi|Sd|vr| dd \} }| pd} |pd }| dvrtdt || |||}z || |fi|}Wn| d|_ |S|dvrj|||fi|Std)Nznothing to open)rzr:*csj|dkS)Ntaropen) OPEN_METH)rrWr8r9not_compressed5rz$TarFile.open..not_compressed)keyrzz - method z:  z'file could not be opened successfully: :r#rr|ryzmode must be 'r' or 'w'Frzundiscernible mode)r0sortedrrhrrrrrrrYrrrr)rWrrrrakwargsrZ error_msgsrfuncZ saved_posrZerror_msgs_summaryfilemodestreamrr8rr9r s\#      z TarFile.opencKs& |dvr td||||fi|S)Nrr)r0)rWrrrrr8r8r9riszTarFile.taropenrc Ks |dvr tdzddlm}Wn tytddwz |||d||}WntyC}z|dur>|dkr>td|d}~wwz |j|||fi|}Wn!tyk}z||dkrftd|d}~w|d |_ |S) Nrzr{rmode must be 'r', 'w' or 'x'r)GzipFilezgzip module is not availablerdrzrF) r0Zgziprrrrrrrr) rWrrr compresslevelrrrrr8r8r9gzopenqs:    zTarFile.gzopenc Ks |dvr tdzddlm}Wn tytddw||p"|||d}z |j|||fi|}Wn#ttfyP}z||dkrKt d|d}~w|d |_ |S) Nrrr)BZ2Filer)rrzznot a bzip2 fileF) r0rrrrrrEOFErrorrrr) rWrrrrrrrrr8r8r9bz2opens,   zTarFile.bz2openc Ks |dvr tdz ddlm}m}Wn tytddw||p$|||d}z |j|||fi|}Wn#|tfyR} z||dkrMt d| d} ~ w|d |_ |S) Nrrr)LZMAFilerr)presetrzznot an lzma fileF) r0rrrrrrrrrr) rWrrrrrrrrrr8r8r9xzopens,   zTarFile.xzopenrrrr)rrrrcCs |jrdSd|_z;|jdvr8|jttd|jtd7_t|jt\}}|dkr8|jtt|W|j sC|j dSdS|j sN|j ww)NTrr$r) rrrr^r3rrr\ RECORDSIZErr)rrbrcr8r8r9rs"  z TarFile.closecCs* ||d}|durtd||S)Nrzfilename %r not found) _getmemberrqKeyError)rrrr8r8r9 getmembers  zTarFile.getmembercCs ||js ||jSr)_checkr_loadrrr8r8r9 getmemberss zTarFile.getmemberscCs dd|DS)NcSsg|]}|jqSr8r,)rrr8r8r9rsz$TarFile.getnames..)rrr8r8r9getnamesszTarFile.getnamesc CsL |d|dur |j}|dur|}tj|\}}|tjd}|d}|}||_ |durA|j s;t |}n t |}nt |}d}|j}t |r|j|jf} |j st|jdkrt| |jvrt||j| krtt} |j| }n;t} | dr||j| <n/t |rt} n't |rt} nt |rt} t|}nt |rt} n t |rt!} ndS||_||_"|j#|_$|j%|_&| tkr|j'|_(nd|_(|j)|_*| |_+||_,t-rz t-.|j$d|_/Wn t0yYnwt1rz t12|j&d|_3Wn t0yYnw| tt!fvr$t4tdr$t4tdr$t5|j6|_7t8|j6|_9|S)Nawxrrr#rmajorminor):rrr}r% splitdriverrrrrrlstatstatfstatfilenost_modeS_ISREGst_inost_devst_nlinkrrr*S_ISDIRr7S_ISFIFOrS_ISLNKrreadlinkS_ISCHRr\S_ISBLKr]rst_uidr)st_gidr*st_sizer'st_mtimer(r$r pwdgetpwuidr+rgrpZgetgrgidr,rrst_rdevr%rr&) rrarcnamerZdrvrZstatresr Zstmdinoder$r8r8r9 gettarinfos                zTarFile.gettarinfoT)rcCs$ ||dur |}|D]}|rg|jdurtdntt|jtd|jp*|j|jp/|jf| s;| rHtdd|j |j fntd|j |jdurYtdntdt|jddt|j|rpd nd |r|rtd |j|rtd |jtq dS) Nz ??????????z%s/%sz%10sz%d,%dz%10dz????-??-?? ??:??:??z%d-%02d-%02d %02d:%02d:%02drrrz-> zlink to )rrrlrrr+r)r,r*rrr%r&r'r(r localtimerrrr rrk)rverboserrr8r8r9rhs<     z TarFile.listfiltercCsR |d|dur |}|jdur$tj||jkr$|dd|dS|d||||}|dur>|dd|dS|durT||}|durT|dd|dS|rvt|d}| ||WddS1sowYdS| r| ||rt t |D]}|j tj||tj||||dqdSdS| |dS) Nrr$ztarfile: Skipped %rr#ztarfile: Unsupported type %rtarfile: Excluded %rrr)rrr}r%r_dbgrrraddfilerrlistdiraddr)rrr recursiverrfr8r8r9r s>    " z TarFile.addcCs |dt|}||j|j|j}|j||jt |7_|j }|durXt ||j|j |dt |j t\}}|dkrO|jtt||d7}|j|t7_|j|dS)Nr)rarr#)rr4r@rSr6r7rr^rr2rr[r'r\rr3rr)rrrrWrarbrcr8r8r9r s   zTarFile.addfilecCsh|dur|j}|dur tSt|trtd|St|r|Szt|WSty3td|ddw)NzrString names are not supported for TarFile.extraction_filter. Use a function such as tarfile.data_filter directly.zfilter z not found) extraction_filterrrOrR TypeErrorcallable_NAMED_FILTERSrr0)rrr8r8r9_get_filter_functions    zTarFile._get_filter_function.) numeric_ownerrc Cs g}||}|dur|}|D]&}||||\}} |dur q|r)|| |j||| ||dq|jdddd|D]} zsz|| |}Wntyg} z|| t| WYd} ~ WqBd} ~ ww|durt|| dWqBt j ||j } zt | } Wnty||dYWqBwt| js||dWqB|j|| |d ||| ||| WqBty} z || WYd} ~ qBd} ~ wwdS) N) set_attrsrfilter_functioncSs|jSrr,)rr8r8r9 sz$TarFile.extractall..T)rreversezexcluded by filterZmissingznot a directory)r)r_get_extract_tarinforr _extract_onesort_FILTER_ERRORS_log_no_directory_fixupreprr}r%rrrFileNotFoundErrorrrrchownutimechmodr _handle_nonfatal_error)rr%rrrZ directoriesrrr unfilteredexcdirpathrrr8r8r9 extractallsd       zTarFile.extractallcCs|dd|j|fdS)Nr$z(tarfile: Not fixing up directory %r (%s))r r)rrreasonr8r8r9r1 s zTarFile._log_no_directory_fixuprc Cs> ||}||||\}}|dur|||||dSdSr)rrr) rrr%rrrrrr%r8r8r9extract5 s zTarFile.extractc Cs t|tr ||}n|}d}z|||}Wn/ttfy0}z ||WYd}~nd}~wtyF}z ||WYd}~nd}~ww|durV|dd|j dS| rht |}t j ||j|_||fS)Nr$r)NN)rOrRrrr_handle_fatal_errorr r$r rrr4r}r%rr r))rrrr%r%filteredrr8r8r9rI s*   zTarFile._get_extract_tarinfoc Cs |dz|j|tj||j||||dWdSty2}z ||WYd}~dSd}~wtyI}z | |WYd}~dSd}~ww)Nrz)rrrextraction_root) r_extract_memberr}r%rrrr+r r$)rrr%rrrrr8r8r9rg s   zTarFile._extract_onecCs" |jdkr|dd|dS)Nr# tarfile: %s)rr rrr8r8r9r${ s zTarFile._handle_nonfatal_errorcCsr |jdkrt|tr*|jdur|dd|jdS|dd|j|jfdS|ddt|j|fdS)Nrr#r/ztarfile: %s %rztarfile: %s %s)rrOrfilenamer strerrorr$ror0r8r8r9r+ s   zTarFile._handle_fatal_errorcCs| |dt|tr||}n|}|s|jtvr"|||S|s*| r|r]|||n3|se|rl|||n$|st| r~|j||||dn|jtvr|||n||||r||||| s||||||dSdSdS)Nrr#z%s -> %sr6)rqrr}rr%rrmakedirsrrr rr rmakefilermakedirrmakefiforrmakedevmakelink_with_filterr$r makeunknownr!r#r")rr targetpathrrrr-Z upperdirsr8r8r9r. sB      zTarFile._extract_membercCsD z|jdurt|WdSt|dWdSty!YdSw)Ni)rr}mkdirFileExistsErrorrrr>r8r8r9r9 s  zTarFile.makedircCs |j}||j|j}t|d?}|jdur8|jD]\}}||t|||t|q||j| nt|||jt|WddSWddS1sTwYdS)Nr) rrrrrrr[rr'truncate)rrr>sourceratargetrr'r8r8r9r8 s      "zTarFile.makefilecCs$ ||||dd|jdS)Nr#z9tarfile: Unknown file type %r, extracted as regular file.)r8r r$rAr8r8r9r= s   zTarFile.makeunknowncCs" ttdr t|dStd)Nmkfifozfifo not supported by system)rr}rEr rAr8r8r9r: s zTarFile.makefifocCsl ttdr ttdstd|j}|durd}|r"|tjO}n|tjO}t||t |j |j dS)Nmknodr;z'special devices not supported by systemr ) rr}r rrrS_IFBLKS_IFCHRrFr;r%r&)rrr>rr8r8r9r; s  zTarFile.makedevcCs|||ddSr)r<rAr8r8r9makelink& rzTarFile.makelinkc Cs d}z,|rtj|rt|t|j|WdStj|jr.t |j|WdSWn t y:d}Ynwz| |}Wnt yQ|rPt ddw|durY|}n#|durat dz|||}Wnty{}zt||j|d}~ww|dur|j||||ddSdS)NFTz%unable to resolve link inside archivez[makelink_with_filter: if filter_function is not None, extraction_root must also not be Noner6)rr}r%lexistsunlinksymlinkr rr)linksymlink_exceptionr5rr rrrr.) rrr>rr-Zkeyerror_to_extracterrorr%r,causer8r8r9r<) sX     zTarFile.makelink_with_filterc Cs  ttdrtdkr|j}|j}|sFztr"|jr"t|jd}Wn ty,Ynwzt r;|j r;t |j d}Wn tyEYnw|durLd}|durRd}z| rfttdrft |||WdSt|||WdSty}ztd|d}~wwdSdS)Ngeteuidrr$r;lchownzcould not change owner)rr}rPr*r)rr,Zgetgrnamrrr+getpwnamrrQr!rr )rrr>rgurr8r8r9r![ s@     z TarFile.chownc CsH |jdurdSz t||jWdSty#}ztd|d}~ww)Nzcould not change mode)rr}r#rr )rrr>rr8r8r9r#| s  z TarFile.chmodc Cs\ |j}|dur dSttdsdSz t|||fWdSty-}ztd|d}~ww)Nr"z"could not change modification time)r(rr}r"rr )rrr>r(rr8r8r9r" s  z TarFile.utimec Cs< |d|jdur|j}d|_|S|j|jkr.|j|jd|jds.tdd} z|j |}Wnt yf}z!|j r\| dd|j|f|jt 7_WYd}~q0WYd}~nd}~wty}z-|j r| dd|j|f|jt 7_WYd}~q0|jdkrtt|dWYd}~nqd}~wty|jdkrtddYn[ty}z|jdkrtt|dWYd}~nBd}~wty}ztt|dd}~wty }zzddl}t||jrtd |d|ty|wd}~ww |dur|j||Sd|_|S) NZrar#rYTr$z0x%X: %srz empty filez zlib error: )rrrrrrr]rrrzrurr rrKrRrsrtrv ExceptionrrOrrrrr)rmrrrr8r8r9r sv                z TarFile.nextc Cs |}d}|dur$z||}Wn tyd}Ynw|d|}|r,tj|}t|D]"}|r=|j|jkrzFilter for extraction)metavarchoicesrjT)Zrequiredz-lz--list zShow listing of a tarfile)rkrjz-ez --extract+)rmz zExtract tarfile into target dir)nargsrkrjz-cz--create)zzzCreate tarfile from sourcesz-tz--testzTest if a tarfile is validr#z&--filter is only valid for extraction rzr]z{!r} is a tar archive.z{!r} is not a tar archive. r)rr$)r%rrz{!r} file is extracted.z+{!r} file is extracted into {!r} directory.rrr)rz.tgzz.xzz.txzz.bz2z.tbzz.tbz2z.tb2zw:r{z{!r} file created.)argparseArgumentParser add_argumentrZadd_mutually_exclusive_group parse_argsrr*exittestrrrrkrir_rrSrrr2r}curdirZ format_helpr(Zcreatepopr%splitextr )rprfparserrargsr_rZtfrvraZtar_namerZextZ compressionsZtar_modeZ tar_files file_namer8r8r9maink s           "          r|__main__re)nversion __author__ __credits__builtinsrrrir}rrZrrrVr4rewarningsrrrAttributeErrorNotImplementedErrorrNr NameError__all__r3rrrHrCrErDrZr*rnrrr\r]r7rZCONTTYPErKrJrorTrVr}r rrrrrrrrrrPrIrrr getfilesystemencodingr:r?rNrTrXr[rlrUrr rrr r rsrtrurKrvrxrobjectrrBufferedReaderrrrrrrrrrrrr r"rr3compilerrrrr|ror8r8r8r9s(         sh  D &a _