o ?Og @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^drd_d`Z_dadbZ`dcddZadedfZbe`eaebdgZceTZdeedhZfGdidjdjeTZgGdkdldleTZhdmdnZiehjZdodpZjekdqkrejdSdS)sz0.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}closerrr8r8r9rCsz_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__rr8r8rr9rrrTcCsi}|j}tj|}|dtjfr |jdtj}|d<tj|r*t|tjtj ||}tj ||g|krDt |||j }|dur~|d@}|ru| sY|rf|d@sa|dM}|dO}n|sn|rqd}nt|||j kr~||d<|r|jdurd|d<|jdurd|d <|jdurd|d <|jdurd|d <|s|rtj|jrt||rtj |tj||j}ntj ||j}tj|}tj ||g|krt|||S) N/ri@irr)r*r+r,)rr}r%realpathrseplstripisabsrr commonpathrrisregislnkisdirissymrr)r*r+r,linknamerdirnamer)member dest_pathZfor_data new_attrsrZ target_pathrr8r8r9_get_filtered_attrss^            rcCs|Srr8)rrr8r8r9fully_trusted_filter0rrcCs,t||d}|r|jdi|ddiS|S)NFdeepr8rrrrrr8r8r9 tar_filter3 rcCs,t||d}|r|jdi|ddiS|S)NTrFr8rrr8r8r9 data_filter9rr)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.rzcName 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(rREGTYPEr rr+r,r!r"rrrr#rrr8r8r9rrs$ zTarInfo.__init__cCrrrrr8r8r9r%z TarInfo.pathcC ||_dSrr(r'r8r8r9r% cCrrrrr8r8r9r&r)zTarInfo.linkpathcCr*rr,)rrr8r8r9r&r+cCsd|jj|jt|fS)Nz<%s %r at %#x>)rroridrr8r8r9__repr__szTarInfo.__repr__T) rr(rrr)r*r+r,r_KEEPc Cs | r t|} nt|} || ur|| _|| ur|| _|| ur#|| _|| ur*|| _|| ur1|| _|| ur8|| _|| ur?|| _|| urF|| _ | Sr) copyZdeepcopyrr(rrr)r*r+r,) rrr(rrr)r*r+r,rr/resultr8r8r9rs*  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(rr rr+r,r!r"r rr)rrr)r*r'r(rr rr+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) r5itemsr0r create_ustar_headerrcreate_gnu_headerrcreate_pax_header)rrSr6r7r4rvaluer8r8r9tobufs  z TarInfo.tobufcCsp t|d<t|d||tkrtdt|d||tkr0||d||\|d<|d<||t||S)Nmagicrzlinkname is too longrprefix) POSIX_MAGICr2r1 LENGTH_LINKr0 LENGTH_NAME_posix_split_name_create_headerr )rr4r6r7r8r8r9r8szTarInfo.create_ustar_headercCs t|d<d}t|d||tkr|||dt||7}t|d||tkr7|||dt||7}|||t ||S)Nr=rrr) GNU_MAGICr2r1r@_create_gnu_long_headerGNUTYPE_LONGLINKrAGNUTYPE_LONGNAMErCr)rr4r6r7rWr8r8r9r9szTarInfo.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)Nr=rr%rr&)r+r+ )r,r,rHrDrE))r)rB)r*rB)r' )r(rIFrrBr#Trr)r?r#r0rAr@r1UnicodeEncodeErrorr2 isinstancefloatroundstr_create_pax_generic_headerXHDTYPErCr ) rr4r6r#rZhnamer5rRZ needs_paxvalZ val_is_floatZval_intrWr8r8r9r:sF        zTarInfo.create_pax_headercCs ||tdS)Nr/)rOXGLTYPE)clsr#r8r8r9create_pax_global_header=sz 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_PREFIXrAr0)rrr6r7Z componentsrMr>r8r8r9rBCs 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 Nonerrrr2r)r*r'rIr(s rr=r+rHr,r>rz%dsriz%06orDi)getCHRTYPEBLKTYPErTr:r&r0r?rVrrrrXrO) r4rSr6r7Zhas_device_fieldsr!r"ZfiletypepartsrWrr8r8r9rCSs<  &zTarInfo._create_headercCs0 tt|t\}}|dkr|t|t7}|S)Nr)r\r2rr3)Zpayloadrbrcr8r8r9_create_payload}s zTarInfo._create_payloadcCsT |||t}i}d|d<||d<t||d<t|d<||t||||S)Nz ././@LongLinkrr r'r=)r1r3r2rDrCr r[)rSrr r6r7r4r8r8r9rEs 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 r6rrrD = z././@PaxHeaderrr r'r=r) r7r1rJr2rNrOr?rCr r[) rSr#r r6Zbinarykeywordr;ZrecordslrLr>r4r8r8r9rOsD   ( 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)iIiQiYirirrIiii)$r2rsrrtcountr3rurNrXrKr?rrr)r*r'r(rr rr+r,r!r"AREGTYPErr3GNUTYPE_SPARSErHr0rboolr$rrstrip GNU_TYPES)rSrWr6r7robjr>rstructsrMrnumbytes isextendedorigsizer8r8r9frombufs^          zTarInfo.frombufcCs: |jt}|||j|j}|jt|_||Sr) rr]rrtr6r7rr _proc_member)rSrrWror8r8r9 fromtarfile s   zTarInfo.fromtarfilecCsR |jttfvr ||S|jtkr||S|jtttfvr$| |S| |Sr) r rGrF _proc_gnulongrk _proc_sparserPrRSOLARIS_XHDTYPE _proc_pax _proc_builtin)rrr8r8r9rus     zTarInfo._proc_membercCsj |j|_|j}|s|jtvr|||j7}||_| |j |j |j | r3|jd|_|SNr)rrrrr SUPPORTED_TYPES_blockr'r_apply_pax_infor#r6r7rrrm)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]r~r'rvr rvrNrr rGr?r6r7rrFrr removesuffix)rrrWnextrr8r8r9rwBs   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)NrrIrhi)r$rr]rrHrNr0rrlrrrr~r'r) rrrprrrsrWrrMrrqr8r8r9rx]s.       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#r]rs hdrcharsetsBINARYr/GNU.sparse.mapGNU.sparse.sizezGNU.sparse.major1zGNU.sparse.minorrFr')&rr]r~r'r rRr#r0r2_header_length_prefix_rematchrKrIgroupr0rrg partitionrr6_decode_pax_fieldr7PAX_NAME_FIELDSrvr rvrN_proc_gnusparse_01_proc_gnusparse_00rW_proc_gnusparse_10rPryrrrrr})rrrWr#rr6 raw_headersrr5Zheader_value_end_offsetZkeyword_and_valueZ raw_keywordZequalsZ raw_valuer_r;rrrr8r8r9rzys    )        zTarInfo._proc_paxc Cs g}g}|D];\}}}|dkr'z |t|Wqty&tdw|dkrBz |t|WqtyAtdwqtt|||_dS)NsGNU.sparse.offsetrGsGNU.sparse.numbytes)rrIr=r0rKlistzipr)rrrZoffsetsrq_r_r;r8r8r9rs$  zTarInfo._proc_gnusparse_00cCsB dd|ddD}tt|ddd|ddd|_dS)NcSsg|]}t|qSr8)rI).0xr8r8r9 sz.TarInfo._proc_gnusparse_01..r,r$r#)rUrrr)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)Nr^r#r$) rr]rrUrIr2rrrrrr)rrr#rZfieldsrrWZnumberr8r8r9r s  (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) r7setattrrI PAX_FIELDSPAX_NUMBER_FIELDSr0rmr0r#)rr#r6r7r_r;r8r8r9rs(   zTarInfo._apply_pax_infocCs0 z||dWSty|||YSw)NrE)r=UnicodeDecodeError)rr;r6Zfallback_encodingZfallback_errorsr8r8r9r3s  zTarInfo._decode_pax_fieldcCs$ t|t\}}|r|d7}|tS)Nr#)r\r)rrirbrcr8r8r9r~;s zTarInfo._blockcCs |jtvSr)r  REGULAR_TYPESrr8r8r9rD z TarInfo.isregcCs |Sr)rrr8r8r9isfileHszTarInfo.isfilecC |jtkSr)r r3rr8r8r9rLrz TarInfo.isdircCrr)r SYMTYPErr8r8r9rPrz TarInfo.issymcCrr)r LNKTYPErr8r8r9rTrz TarInfo.islnkcCrr)r rXrr8r8r9ischrXrz TarInfo.ischrcCrr)r rYrr8r8r9isblk\rz TarInfo.isblkcCrr)r FIFOTYPErr8r8r9isfifo`rzTarInfo.isfifocCs |jduSr)rrr8r8r9issparsedrzTarInfo.issparsecCs |jtttfvSr)r rXrYrrr8r8r9isdevgsz TarInfo.isdevr8)r)3rorprqdict __slots__rpropertyr%setterr&r.r/rr5rr r<r8r9r: classmethodrTrB staticmethodrCr[rErOrtrvrur{rwrxrzrrrrrr~rrrrrrrrrrr8r8r8r9rOs         :  )   2 >  y  rc@seZdZ dZdZdZdZeZe Z dZ e Z eZdZ    deddZedddefd d Zedfd d ZedgddZedgddZedhddZdddddZddZddZddZdd Zdid!d"Zdjdd$d%d&Zdkdd'd(d)Z dld*d+Z!d,d-Z"dmddd/d0d1Z#dnddd/d3d4Z$d5d6Z%d7d8Z&d9d:Z'd;d<Z(d=d>Z) # dod?d@Z*dAdBZ+dCdDZ,dEdFZ-dGdHZ.dIdJZ/dKdLZ0dMdNZ1dOdPZ2dQdRZ3dSdTZ4dpdUdVZ5dWdXZ6dldYdZZ7d[d\Z8d]d^Z9d_d`Z:dadbZ;dcddZ.not_compressed)keyrzz - method z:  z'file could not be opened successfully: :r#rr|ryzmode must be 'r' or 'w'Frzundiscernible mode)r0sortedrrhrrrrrrrUrrrr)rSrrrrakwargsrZ error_msgsrfuncZ saved_posrZerror_msgs_summaryfilemodestreamrr8rr9rs\#      z TarFile.opencKs& |dvr td||||fi|S)Nrr)r0)rSrrrrr8r8r9rUszTarFile.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) rSrrr compresslevelrrrrr8r8r9gzopen]s:    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) rSrrrrrrrrr8r8r9bz2open~s,   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) rSrrrrrrrrrr8r8r9xzopens,   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) _getmemberrmKeyError)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% splitdriverr r rrrlstatstatfstatfilenost_modeS_ISREGst_inost_devst_nlinkrrr&S_ISDIRr3S_ISFIFOrS_ISLNKrreadlinkS_ISCHRrXS_ISBLKrYrst_uidr)st_gidr*st_sizer'st_mtimer(r rpwdgetpwuidr+rgrpZgetgrgidr,rrst_rdevr!rr") rrarcnamerZdrvrZstatresrZstmdinoder 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 localtimerrrrrrk)rverboserrr8r8r9rTs<     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 recursiverrfr8r8r9rzs>    " 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#)rr0r<rSr6r7rr^rr2rr[r'r\rr3rr)rrrrWrarbrcr8r8r9rs   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_filterrrKrN TypeErrorcallable_NAMED_FILTERSrr0)rrr8r8r9_get_filter_functions    zTarFile._get_filter_function.) numeric_ownerrc Cs g}||}|dur|}|D]#}||||}|durq|r'|||j||| |dq|jdddd|D]7}tj||j } z|j || |d| || | || Wq?t yv} z || WYd} ~ q?d} ~ wwdS)N set_attrsrcSs|jSrr()rr8r8r9sz$TarFile.extractall..T)rreverse)r)r_get_extract_tarinforr _extract_onesortr}r%rrchownutimechmodr _handle_nonfatal_error) rr%rrrZ directoriesfilter_functionrrdirpathrr8r8r9 extractalls4   zTarFile.extractallrcCs: ||}||||}|dur|||||dSdSr)rrr)rrr%rrrrrr8r8r9extract s  zTarFile.extractc Cs t|tr ||}n|}|}z|||}Wn/ttfy0}z ||WYd}~nd}~wtyF}z ||WYd}~nd}~ww|durV|dd|j dS| rht |}t j ||j|_|S)Nr$r)rKrNrrr_handle_fatal_errorr rrrrr0r}r%rrr%)rrrr%rZ unfilteredrr8r8r9r s*   zTarFile._get_extract_tarinfoc Cs |dz|j|tj||j||dWdSty0}z ||WYd}~dSd}~wtyG}z | |WYd}~dSd}~ww)Nrzr) r_extract_memberr}r%rrrr!r r)rrr%rrrr8r8r9r/ s  zTarFile._extract_onecCs" |jdkr|dd|dS)Nr# tarfile: %s)rrrrr8r8r9r< s zTarFile._handle_nonfatal_errorcCsr |jdkrt|tr*|jdur|dd|jdS|dd|j|jfdS|ddt|j|fdS)Nrr#r#ztarfile: %s %rztarfile: %s %s)rrKrfilenamerstrerrorr ror$r8r8r9r!C s   zTarFile._handle_fatal_errorcCs| |dt|tr||}n|}|s|jtvr"|||S|s*| r %s)rmrr}r r%rrmakedirsrrrrrrmakefilermakedirrmakefiforrmakedevmakelinkr r} makeunknownrrr)rr targetpathrrZ upperdirsr8r8r9r"o s:      zTarFile._extract_membercCsD z|jdurt|WdSt|dWdSty!YdSw)Ni)rr}mkdirFileExistsErrorrrr1r8r8r9r, s  zTarFile.makedircCs |j}||j|j}t|d?}|jdur8|jD]\}}||t|||t|q||j| nt|||jt|WddSWddS1sTwYdS)Nr) rrrrrrr[rr'truncate)rrr1sourceratargetrr'r8r8r9r+ s      "zTarFile.makefilecCs$ ||||dd|jdS)Nr#z9tarfile: Unknown file type %r, extracted as regular file.)r+rr r4r8r8r9r0 s   zTarFile.makeunknowncCs" ttdr t|dStd)Nmkfifozfifo not supported by system)rr}r8r r4r8r8r9r- 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_IFCHRr9r.r!r")rrr1rr8r8r9r. s  zTarFile.makedevc Cs z6|rtj|rt|t|j|WdStj|jr,t |j|WdS| | ||WdSt yXz | | ||WYdSt yWtddww)Nz%unable to resolve link inside archive)rr}r%lexistsunlinksymlinkrrr%linkr"r)symlink_exceptionrr r4r8r8r9r/ s(       zTarFile.makelinkc 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}rAr*r)rr,Zgetgrnamrrr+getpwnamrrBrrr )rrr1rgurr8r8r9r s@     z TarFile.chownc CsH |jdurdSz t||jWdSty#}ztd|d}~ww)Nzcould not change mode)rr}rrr )rrr1rr8r8r9r s  z TarFile.chmodc Cs\ |j}|dur dSttdsdSz t|||fWdSty-}ztd|d}~ww)Nrz"could not change modification time)r(rr}rrr )rrr1r(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]rrrvrurrrrKrNrsrtrv ExceptionrrKrrrrr)rmrrrr8r8r9r2 sv                z TarFile.nextc Cs |}d}|dur$z||}Wn tyd}Ynw|d|}|r,tj|}t|D]"}|r=|j|jkrzFilter for extraction)metavarchoicesr\T)Zrequiredz-lz--list zShow listing of a tarfile)r]r\z-ez --extract+)r_z zExtract tarfile into target dir)nargsr]r\z-cz--create)zzzCreate tarfile from sourcesz-tz--testzTest if a tarfile is validr#z&--filter is only valid for extraction rzrOz{!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 exittestrrrrkrirQrrSrrr2r}curdirZ format_helprZcreatepopr%splitextr)rbrXparserrargsr_rZtfrhrSZtar_namerZextZ compressionsZtar_modeZ tar_files file_namer8r8r9main s           "          rn__main__rW)lversion __author__ __credits__builtinsrrrir}rrZrrrVr0rewarningsrrrAttributeErrorNotImplementedErrorr@r NameError__all__r3rrrDr?rAr@rVr&rjrrrXrYr3rZCONTTYPErGrFrkrPrRryr rrrr}rrnrrrLrIrrr getfilesystemencodingr:r?rNrTrXr[rlrFrr rrr r rsrtrurKrvrxrobjectrrBufferedReaderrrrrrrrrrrrrr/compilerrrrrnror8r8r8r9s$         sh  ? # _