U :en@sfdZdZdZddlmZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZz ddlZWnek rdZYnXz ddlZWnek rdZYnXeefZzeef7ZWnek rYnXdddd d d d d dddddddgZdZdZedZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$d Z%d!Z&d"Z'd#Z(d$Z)d%Z*d&Z+d'Z,d(Z-d)Z.dZ/d*Z0d+Z1e1Z2e e!e"e#e&e'e(e$e%e)e*e+f Z3e e!e(e+fZ4e)e*e+fZ5d,Z6d-d.d/d0hZ7e8e8e8e9e9e9d1Z:ej;d2krd3Zd6d7Z?d8d9Z@d:e2fd;d<ZAd=d>ZBdedfd?d@ZCdAdBZDGdCd d eEZFGdDd d eFZGGdEd d eFZHGdFd d eFZIGdGd d eFZJGdHddeFZKGdIdJdJeKZLGdKdLdLeKZMGdMdNdNeKZNGdOdPdPeKZOGdQdRdReKZPGdSdTdTZQGdUdVdVZRGdWdXdXeSZTGdYdZdZeSZUGd[d\d\ejVZWGd]ddeSZXGd^ddeSZYd_dZZeYjZd`daZ[e\dbkrbe[dS)cz0.9.0u"Lars Gustäbel (lars@gustaebel.de)u4Gustavo Niemeyer, Niels Gustäbel, Richard Townsend.)openNTarFileTarInfo is_tarfileTarError ReadErrorCompressionError StreamError ExtractError HeaderErrorENCODING USTAR_FORMAT GNU_FORMAT PAX_FORMATDEFAULT_FORMATrisustar sustar00d01234567LKSxgX)pathlinkpathsizemtimeuidgidunamegnamer%r&r+r,)Zatimectimer(r)r*r'ntutf-8cCs(|||}|d||t|tSN)encodelenNUL)slengthencodingerrorsr8,/usr/local/python38/lib/python3.8/tarfile.pystns r:cCs*|d}|dkr|d|}|||S)Nr)finddecode)r4r6r7pr8r8r9ntss  r?cCs|ddkrbd}tt|dD]}|dK}|||d7}q |ddkrdt|d| }n@z"t|dd}t|p|d d}Wntk rtd YnX|S) Nr)r#rAasciistrict0invalid header)ranger2r?intstrip ValueErrorInvalidHeaderError)r4nir8r8r9ntis   rOrBcCst|}d|kr$d|dkrDnntd|d|fdt}n|tkrd|d |krrd|dkrnnV|dkrtdg}ntdg}d||}t|dD]}|d|d@|dL}qntd |S) NrrBr#z%0*orDrCr@rAzoverflow in number field)rIbytesr3r bytearrayrHinsertrK)rMdigitsformatr4rNr8r8r9itns  2    rUcCs0dttd|}dttd|}||fS)NrCZ 148B8x356BZ 148b8x356b)sumstruct unpack_from)bufZunsigned_chksumZ signed_chksumr8r8r9 calc_chksumss rZc Cs|pd}|dkrdS|dkr.t|||dSt||\}}t|D],}||}t||krf|d||qD|dkr||}t||kr|d||dS)Ni@runexpected end of data)shutil copyfileobjdivmodrHreadr2write) srcdstr5 exceptionbufsizeblocks remainderbrYr8r8r9r]s$       r]cCs8ttjdd}|dk r(||d|}t|dddS)Nr6backslashreplace )end)getattrsysstdoutr1r=print)r4r6r8r8r9 _safe_printsroc@s eZdZdS)rN__name__ __module__ __qualname__r8r8r8r9r sc@s eZdZdS)r Nrpr8r8r8r9r sc@s eZdZdS)rNrpr8r8r8r9rsc@s eZdZdS)rNrpr8r8r8r9rsc@s eZdZdS)r Nrpr8r8r8r9r sc@s eZdZdS)r Nrpr8r8r8r9r sc@s eZdZdS)EmptyHeaderErrorNrpr8r8r8r9rtsrtc@s eZdZdS)TruncatedHeaderErrorNrpr8r8r8r9rusruc@s eZdZdS)EOFHeaderErrorNrpr8r8r8r9rv"srvc@s eZdZdS)rLNrpr8r8r8r9rL%srLc@s eZdZdS)SubsequentHeaderErrorNrpr8r8r8r9rw(srwc@s,eZdZddZddZddZddZd S) _LowLevelFilecCsFtjtjtjBtjBd|}ttdr2|tjO}t||d|_dS)NrwO_BINARYi) osO_RDONLYO_WRONLYO_CREATO_TRUNChasattrr|rfd)selfnamemoder8r8r9__init__5s  z_LowLevelFile.__init__cCst|jdSr0)r}closerrr8r8r9r>sz_LowLevelFile.closecCst|j|Sr0)r}r_rrr'r8r8r9r_Asz_LowLevelFile.readcCst|j|dSr0)r}r`rrr4r8r8r9r`Dsz_LowLevelFile.writeN)rqrrrsrrr_r`r8r8r8r9rx/s rxc@sneZdZddZddZddZddZd d Zd d Zd dZ ddZ dddZ ddZ ddZ ddZdS)_Streamc Csd|_|dkrt||}d|_|dkr6t|}|}|psz_StreamProxy.__init__cCs|jj|_|jSr0)rr_rYrr8r8r9r_Bs z_StreamProxy.readcCsP|jdrdS|jdddkr8|jdddkr8d S|jd rHd Sd SdS) NsrrsBZhr s1AY&SYr)s]s7zXZrr)rY startswithrr8r8r9rFs $ z_StreamProxy.getcomptypecCs|jdSr0)rrrr8r8r9rPsz_StreamProxy.closeN)rqrrrsrr_rrr8r8r8r9r9s rc@sfeZdZdddZddZddZdd Zd d Zd d Ze j fddZ dddZ ddZ ddZdS) _FileInFileNcCs||_||_||_d|_t|dd|_d|_|dkr>d|fg}d|_g|_d}|j}|D]L\}}||kr||j d||df|j d||||f||7}||}qX||jkr|j d||jdfdS)NrrFT) roffsetr'positionrkrr map_indexmapr)rrrr'Z blockinfoZlastposZrealposr8r8r9r]s(    z_FileInFile.__init__cCsdSr0r8rr8r8r9rvsz_FileInFile.flushcCsdSNTr8rr8r8r9readableysz_FileInFile.readablecCsdS)NFr8rr8r8r9writable|sz_FileInFile.writablecCs |jSr0)rseekablerr8r8r9rsz_FileInFile.seekablecCs|jSr0)rrr8r8r9rsz_FileInFile.tellcCs|tjkr tt|d|j|_nj|tjkr\|dkrFt|j|d|_qt|j||j|_n.|tjkrtt|j||jd|_ntd|jS)NrzInvalid argument) ioSEEK_SETminmaxr'rSEEK_CURSEEK_ENDrK)rrwhencer8r8r9rs   z_FileInFile.seekc Cs |dkr|j|j}nt||j|j}d}|dkr|j|j\}}}}||jkr`|krhqnqq6|jd7_|jt|jkr6d|_q6t|||j}|r|j||j||j|}t||krt d||7}n |t |7}||8}|j|7_q,|S)Nrrr#r[) r'rrrrr2rrr_rr3) rr'rYdatastartstoprr5rgr8r8r9r_s,     z_FileInFile.readcCs&|t|}||dt|<t|Sr0)r_r2)rrgrYr8r8r9readintosz_FileInFile.readintocCs d|_dSr)rrr8r8r9rsz_FileInFile.close)N)N)rqrrrsrrrrrrrrrr_rrr8r8r8r9rWs  rcseZdZfddZZS) ExFileObjectcs&t|j|j|j|j}t|dSr0)rr offset_datar'sparsesuperr)rtarfiletarinfor __class__r8r9rs  zExFileObject.__init__)rqrrrsr __classcell__r8r8rr9rsrc@seZdZeddddddddd d d d d ddddddddZddddZeddZejddZeddZ e jddZ ddZ dd Z e e d!fd"d#Zd$d%Zd&d'Zd(d)Zed*d+Zd,d-Zed.d/Zed0d1Zed2d3Zed4d5Zed6d7Zed8d9Zd:d;Zdd?Zd@dAZdBdCZ dDdEZ!dFdGZ"dHdIZ#dJdKZ$dLdMZ%dNdOZ&dPdQZ'dRdSZ(dTdUZ)dVdWZ*dXdYZ+dZd[Z,d\d]Z-d^d_Z.d`daZ/dbdcZ0dS)erzName of the archive member.zPermission bits.z6User ID of the user who originally stored this member.z7Group ID of the user who originally stored this member.zSize in bytes.zTime of last modification.zHeader checksum.zFile type. type is usually one of these constants: REGTYPE, AREGTYPE, LNKTYPE, SYMTYPE, DIRTYPE, FIFOTYPE, CONTTYPE, CHRTYPE, BLKTYPE, GNUTYPE_SPARSE.zcName of the target file name, which is only present in TarInfo objects of type LNKTYPE and SYMTYPE.z User name.z Group name.zDevice major number.zDevice minor number.zThe tar header starts here.zThe file's data starts here.zMA dictionary containing key-value pairs of an associated pax extended header.zSparse member information.N)rrr)r*r'r(chksumtypelinknamer+r,devmajordevminorrr pax_headersrr_sparse_structs _link_targetrcCsj||_d|_d|_d|_d|_d|_d|_t|_d|_ d|_ d|_ d|_ d|_ d|_d|_d|_i|_dS)Nirr)rrr)r*r'r(rREGTYPErrr+r,rrrrrrrrr8r8r9rs"zTarInfo.__init__cCs|jSr0rrr8r8r9r%sz TarInfo.pathcCs ||_dSr0rrr8r8r9r% scCs|jSr0rrr8r8r9r&szTarInfo.linkpathcCs ||_dSr0r)rrr8r8r9r&scCsd|jj|jt|fS)Nz<%s %r at %#x>)rrqridrr8r8r9__repr__szTarInfo.__repr__cCsl|j|jd@|j|j|j|j|j|j|j|j |j |j |j d }|dt krh|ddsh|dd7<|S)N) rrr)r*r'r(rrrr+r,rrrr/)rrr)r*r'r(rrrr+r,rrDIRTYPEr)rinfor8r8r9get_infos"zTarInfo.get_infosurrogateescapecCsT|}|tkr||||S|tkr4||||S|tkrH|||StddS)Nzinvalid format)rr create_ustar_headerrcreate_gnu_headerrcreate_pax_headerrK)rrTr6r7rr8r8r9tobuf2s z TarInfo.tobufcCsnt|d<t|d||tkr(tdt|d||tkr^||d||\|d<|d<||t||S)Nmagicrzlinkname is too longrprefix) POSIX_MAGICr2r1 LENGTH_LINKrK LENGTH_NAME_posix_split_name_create_headerr )rrr6r7r8r8r9r@s zTarInfo.create_ustar_headercCst|d<d}t|d||tkr<|||dt||7}t|d||tkrl|||dt||7}|||t ||S)Nrrrr) GNU_MAGICr2r1r _create_gnu_long_headerGNUTYPE_LONGLINKr GNUTYPE_LONGNAMEr r)rrr6r7rYr8r8r9rMszTarInfo.create_gnu_headerc Cs*t|d<|j}ddtfddtfddfD]j\}}}||kr>q*z||dd Wn$tk rv||||<Yq*YnXt|||kr*||||<q*d D]`\}}||krd ||<q||}d |krd |d krnn t|t rt |||<d ||<q|r| |t |} nd} | | |tddS)Nrrr%rr&)r+r+ )r,r,rrDrE))r)rB)r*rB)r' )r(rrrBr#rr)rrcopyr r r1UnicodeEncodeErrorr2 isinstancefloatstr_create_pax_generic_headerXHDTYPEr r ) rrr6rrZhnamer5rSvalrYr8r8r9r[s8    *  zTarInfo.create_pax_headercCs||tdS)Nr/)rXGLTYPE)clsrr8r8r9create_pax_global_headersz TarInfo.create_pax_global_headercCs~|d}tdt|D]T}d|d|}d||d}t|||tkrt|||tkrqvqtd||fS)Nrr#zname is too long)splitrHr2rr1 LENGTH_PREFIXr rK)rrr6r7Z componentsrNrr8r8r9r s zTarInfo._posix_split_namecCsVt|ddd||t|ddd@d|t|ddd|t|d dd|t|d dd |t|d dd |d |dtt|ddd|||dtt|ddd||t|ddd||t|ddd|t|ddd|t|ddd||g}tdtd|}t |t dd}|ddt d|d|dd}|S)NrrrrrrrBr)r*r'rr(s rrrr+rr,rrrrz%dsriz%06orDi) r:getrUrrrWrrrrZrP)rrTr6r7partsrYrr8r8r9r s(  &zTarInfo._create_headercCs.tt|t\}}|dkr*|t|t7}|S)Nr)r^r2rr3)payloadrerfr8r8r9_create_payloadszTarInfo._create_payloadcCsR|||t}i}d|d<||d<t||d<t|d<||t||||S)Nz ././@LongLinkrrr'r)r1r3r2r r r r#)rrrr6r7rr8r8r9rs zTarInfo._create_gnu_long_headerc Cs2d}|D]8\}}z|ddWq tk rBd}YqFYq Xq d}|rV|d7}|D]\}}|d}|r||d}n |d}t|t|d}d } } |tt| } | | krq| } q|tt| d d |d |d 7}q^i} d| d<|| d<t|| d<t| d<|| td d| |S)NFr/rETrs21 hdrcharset=BINARY rrrrD = z././@PaxHeaderrrr'rr) itemsr1rr2rrPrr r r#) rrrr6binarykeywordvaluerecordslrMr>rr8r8r9rs<  ( z"TarInfo._create_pax_generic_headerc Csvt|dkrtdt|tkr(td|ttkr>tdt|dd}|t|krbt 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|_|jtkr8d}g}tdD]l} z0t|||d} t||d|d} Wntk rYqYnX|| | f|d7}qt|d} t|dd} || | f|_ |!rP|j "d|_ |rr|jt#krr|d|j |_ |S)Nrz empty headerztruncated headerzend of file headerz bad checksumrlt|ii i)iIiQiYirirriii)$r2rtrrucountr3rvrOrZrLr?rrr)r*r'r(rrrr+r,rrAREGTYPErrGNUTYPE_SPARSErHrKrboolrisdirrstrip GNU_TYPES)rrYr6r7robjrrstructsrNrnumbytes isextendedorigsizer8r8r9frombuf sZ         zTarInfo.frombufcCs8|jt}|||j|j}|jt|_||Sr0) rr_rrAr6r7rr _proc_member)rrrYr<r8r8r9 fromtarfileKs zTarInfo.fromtarfilecCsT|jttfkr||S|jtkr,||S|jtttfkrF| |S| |SdSr0) rrr _proc_gnulongr7 _proc_sparserrSOLARIS_XHDTYPE _proc_pax _proc_builtin)rrr8r8r9rB`s    zTarInfo._proc_membercCsR|j|_|j}|s$|jtkr4|||j7}||_| |j |j |j |Sr0) rrrisregrSUPPORTED_TYPES_blockr'r_apply_pax_inforr6r7)rrrr8r8r9rHms zTarInfo._proc_builtincCs|j||j}z||}Wntk r>tdYnX|j|_|jt krft ||j |j |_ n|jtkrt ||j |j |_|S)N missing or bad subsequent header)rr_rKr'rCr rwrrrr?r6r7rrr)rrrYnextr8r8r9rD~s  zTarInfo._proc_gnulongc Cs|j\}}}|`|r|jt}d}tdD]n}z0t|||d}t||d|d} Wntk rzYqYnX|r| r||| f|d7}q,t|d}q||_ |j |_ |j | |j |_||_ |S)Nrrr4i)rrr_rrHrOrKrr8rrrrKr'r) rrr=r?r@rYrrNrr>r8r8r9rEs(      zTarInfo._proc_sparsecCs.|j||j}|jtkr&|j}n |j}t d|}|dk rX| d d|d<| d}|dkrr|j }nd}td}d}|||}|sq6|\} } t| } | dkrtd||d d|d| d} || dd|j} | tkr|| ||j |j} n|| dd|j} | || <|| 7}qz||} Wntk rbtd YnXd |kr||| |nHd |kr|| ||n.| d dkr| ddkr|| |||jttfkr*| ||j |j|j!| _!d|kr*| j"} | #s| jt$kr$| | | j7} | |_!| S)Ns\d+ hdrcharset=([^\n]+)\nr#r/ hdrcharsetZBINARYs(\d+) ([^=]+)=rrGr$rMGNU.sparse.mapGNU.sparse.sizezGNU.sparse.major1zGNU.sparse.minorrFr')%rr_rKr'rrrrresearchgroupr=r r6compilematchgroupsrIrLrjr_decode_pax_fieldr7PAX_NAME_FIELDSrCr rw_proc_gnusparse_01_proc_gnusparse_00_proc_gnusparse_10rrFrLrrrIrJ)rrrYrrXrPr6Zregexrr5r)r*rNrr8r8r9rGsh       $         zTarInfo._proc_paxcCshg}td|D]}|t|dqg}td|D]}|t|dq:tt|||_dS)Ns\d+ GNU.sparse.offset=(\d+)\nr#s\d+ GNU.sparse.numbytes=(\d+)\n)rTfinditerrrIrVlistzipr)rrNrrYZoffsetsrXr>r8r8r9r]szTarInfo._proc_gnusparse_00cCs@dd|ddD}tt|ddd|ddd|_dS)NcSsg|] }t|qSr8)rI).0xr8r8r9 &sz.TarInfo._proc_gnusparse_01..rQ,r$r#)rr`rar)rrNrrr8r8r9r\#szTarInfo._proc_gnusparse_01cCsd}g}|jt}|dd\}}t|}t||dkrtd|krT||jt7}|dd\}}|t|q,|j|_t t |ddd|ddd|_ dS)Nr&r#r$) rr_rrrIr2rrrr`rar)rrNrrfieldsrrYZnumberr8r8r9r^)s  zTarInfo._proc_gnusparse_10c Cs|D]\}}|dkr&t|d|q|dkr@t|dt|q|dkrZt|dt|q|tkr|tkrzt||}Wntk rd}YnX|dkr|d}t|||q||_dS)NzGNU.sparse.namer%rRr'zGNU.sparse.realsizerr) r'setattrrI PAX_FIELDSPAX_NUMBER_FIELDSrKr:rr)rrr6r7r)r*r8r8r9rL9s"  zTarInfo._apply_pax_infocCs4z||dWStk r.|||YSXdS)NrE)r=UnicodeDecodeError)rr*r6Zfallback_encodingZfallback_errorsr8r8r9rZPszTarInfo._decode_pax_fieldcCs"t|t\}}|r|d7}|tS)Nr#)r^r)rr5rerfr8r8r9rKXszTarInfo._blockcCs |jtkSr0)r REGULAR_TYPESrr8r8r9rIasz TarInfo.isregcCs|Sr0)rIrr8r8r9isfileeszTarInfo.isfilecCs |jtkSr0)rrrr8r8r9r9isz TarInfo.isdircCs |jtkSr0)rSYMTYPErr8r8r9issymmsz TarInfo.issymcCs |jtkSr0)rLNKTYPErr8r8r9islnkqsz TarInfo.islnkcCs |jtkSr0)rCHRTYPErr8r8r9ischrusz TarInfo.ischrcCs |jtkSr0)rBLKTYPErr8r8r9isblkysz TarInfo.isblkcCs |jtkSr0)rFIFOTYPErr8r8r9isfifo}szTarInfo.isfifocCs |jdk Sr0)rrr8r8r9issparseszTarInfo.issparsecCs|jtttfkSr0)rrqrsrurr8r8r9isdevsz TarInfo.isdev)r)1rqrrrsdict __slots__rpropertyr%setterr&rrrr rrrr classmethodrr  staticmethodr r#rrrArCrBrHrDrErGr]r\r^rLrZrKrIrlr9rnrprrrtrvrwrxr8r8r8r9rs      1     2 >  h  c @seZdZdZdZdZdZeZe Z dZ e Z eZd[ddZedddefd d Zed\d d Zed]ddZed^ddZed_ddZdddddZddZddZddZdd Zd`d!d"Zdadd$d%d&Zdbdd'd(d)Zdcd*d+Z dddd-d.d/Z!dedd-d1d2Z"d3d4Z#dfd5d6Z$d7d8Z%d9d:Z&d;d<Z'd=d>Z(d?d@Z)dAdBZ*dCdDZ+dEdFZ,dGdHZ-dIdJZ.dgdKdLZ/dMdNZ0dhdOdPZ1dQdRZ2dSdTZ3dUdVZ4dWdXZ5dYdZZ6dS)irrFr#Nrzrc Csddddd}||krtd||_|||_|sh|jdkrTtj|sTd|_d|_t||j}d |_n@|dkrt|d rt |j t t fr|j }t|d r|j|_d |_|rtj |nd|_ ||_|dk r||_|dk r||_|dk r||_|dk r||_|dk r ||_| |_| dk r0|jtkr0| |_ni|_| dk rF| |_| dk rV| |_| |_d |_g|_d |_|j|_i|_z|jd krd|_ |!|_ |jdkr2|j"|jz|j#|}|j$|WnXt%k r|j"|jYq2Yn0t&k r,}zt't |W5d}~XYnXq|jdkr|d |_|jr||j(|j)}|j*||jt+|7_Wn&|js|j,d |_YnXdS)Nrbzr+bwbZxbrzar{rc!mode must be 'r', 'a', 'w' or 'x'rr{FrrTrzrr{rc)-rKr_moder}r%exists bltn_openrrrrrrPabspathrrTr dereference ignore_zerosr6r7rrdebug errorlevel copybufsizermembers_loadedrrinodes firstmemberrNrrCrrvr rrrr`r2r)rrrrrTrrrr6r7rrrrZmodeserYr8r8r9rs             "   zTarFile.__init__c s|s|std|dkrfdd}tj|dD]j}tj|}|dk rV|} z||d|f|WSttfk r|dk r|| Yq2Yq2Xq2tdnd|kr |dd \} }| pd} |pd }|jkrtj|}n td |||| |f|Sd |kr|d d \} }| p.d} |p8d }| d krLtdt || |||} z|| | f|} Wn| YnXd| _ | S|dkrj |||f|StddS)Nznothing to open)rzr:*csj|dkS)Ntaropen) OPEN_METH)rrr8r9not_compressed<sz$TarFile.open..not_compressedkeyrzz%file could not be opened successfully:r#rr|ryzmode must be 'r' or 'w'Frzundiscernible mode) rKsortedrrkrrrrrrrrr) rrrrrdkwargsrrfuncZ saved_posfilemodestreamrr8rr9rsP%            z TarFile.opencKs |dkrtd||||f|S)Nrr)rK)rrrrrr8r8r9rmszTarFile.taropenrcKs|dkrtdzddlm}Wntk r<tdYnXz|||d||}Wn.tk r|dk r||dkr|tdYnXz|j|||f|}WnBtk r||dkrtdYn|YnXd |_ |S) Nrzr{rcmode must be 'r', 'w' or 'x'r)GzipFilezgzip module is not availablergrzrF) rKgziprrrrrrrr)rrrr compresslevelrrrr8r8r9gzopenus0zTarFile.gzopenc Ks|dkrtdzddlm}Wntk r<tdYnX||pF|||d}z|j|||f|}WnFttfk r||dkrt dYn|YnXd |_ |S) Nrrr)BZ2Filer)rrzznot a bzip2 fileF) rKrrrrrrEOFErrorrrr)rrrrrrrrr8r8r9bz2opens&zTarFile.bz2openc Ks|dkrtdzddlm}m}Wntk r@tdYnX||pJ|||d}z|j|||f|}WnF|tfk r||dkrt dYn|YnXd |_ |S) Nrrr)LZMAFilerr)presetrzznot an lzma fileF) rKrrrrrrrrrr) rrrrrrrrrr8r8r9xzopens&zTarFile.xzopenrrrr)rrrrcCs|jr dSd|_z`|jdkrn|jttd|jtd7_t |jt \}}|dkrn|jtt |W5|js|jXdS)NTrr$r) rrrrrr`r3rrr^ RECORDSIZE)rrerfr8r8r9rs z TarFile.closecCs"||}|dkrtd||S)Nzfilename %r not found) _getmemberKeyError)rrrr8r8r9 getmembers  zTarFile.getmembercCs||js||jSr0)_checkr_loadrrr8r8r9 getmembersszTarFile.getmemberscCsdd|DS)NcSsg|] }|jqSr8r)rbrr8r8r9rdsz$TarFile.getnames..)rrr8r8r9getnamesszTarFile.getnamesc Cs^|d|dk r|j}|dkr$|}tj|\}}|tjd}|d}|}||_ |dkr|j stt |}qt |}nt |}d}|j}t |r|j|jf} |j s|jdkr| |jkr||j| krt} |j| }nt} | dr||j| <nht |rt} nVt |r"t} nDt |r>t} t|}n(t |rPt} nt |rbt!} ndS||_||_"|j#|_$|j%|_&| tkr|j'|_(nd|_(|j)|_*| |_+||_,t-rzt-.|j$d|_/Wnt0k rYnXt1rzt12|j&d|_3Wnt0k rYnX| tt!fkrZt4tdrZt4tdrZt5|j6|_7t8|j6|_9|S)Nawxrrr#rmajorminor):rrr}r% splitdriverseplstriprrrlstatstatfstatfilenost_modeS_ISREGst_inost_devst_nlinkrrorS_ISDIRrS_ISFIFOruS_ISLNKrmreadlinkS_ISCHRrqS_ISBLKrsrst_uidr)st_gidr*st_sizer'st_mtimer(rrpwdgetpwuidr+rgrpgetgrgidr,rrst_rdevrrr) rrarcnamerZdrvrZstatresrZstmdinoderr8r8r9 gettarinfo s                 zTarFile.gettarinfoT)rcCs||dkr|}|D]}|rtt|jtd|jp>|j|jpH|jf| s`| rztdd|j |j fntd|j tdt|jddt|j|rdnd|r|rtd |j|rtd |jtqdS) Nz%s/%sz%10sz%d,%dz%10dz%d-%02d-%02d %02d:%02d:%02drrrz-> zlink to )rrorrrr+r)r,r*rrrtrrr'r localtimer(rr9rnrrprn)rverboserrr8r8r9r`ls0 z TarFile.listfilterc Cs6|d|dkr|}|jdk rFtj||jkrF|dd|dS|d||||}|dkrz|dd|dS|dk r||}|dkr|dd|dS|rt|d}| ||W5QRXn`| r(| ||r2t t |D]*}|j tj||tj||||dqn | |dS) Nrr$ztarfile: Skipped %rr#ztarfile: Unsupported type %rztarfile: Excluded %rrr)rrr}r%r_dbgrrIraddfiler9rlistdiraddr)rrr recursiverrfr8r8r9rs8       z TarFile.addcCs|dt|}||j|j|j}|j||jt |7_|j }|dk rt ||j|j |dt |j t\}}|dkr|jtt||d7}|j|t7_|j|dS)Nr)rdrr#)rrrrTr6r7rr`rr2rr]r'r^rr3rr)rrrrYrdrerfr8r8r9rs   zTarFile.addfile. numeric_ownerc Csg}|dkr|}|D]>}|r:||t|}d|_|j||| |dq|jddd||D]}tj ||j }z,|j |||d| ||| ||Wqptk r}z"|jdkrЂn|dd|W5d}~XYqpXqpdS) N set_attrsrcSs|jSr0r)rr8r8r9rz$TarFile.extractall..rrr# tarfile: %s)r9rrrextractsortreverser}r%rrchownutimechmodr rr)rr%rrZ directoriesrdirpathrr8r8r9 extractalls.    zTarFile.extractallrc Cs |dt|tr ||}n|}|r>tj||j|_ z"|j |tj||j ||dWnt k r}zH|j dkrn6|jdkr|dd|jn|dd|j|jfW5d}~XYnBtk r}z"|j dkrn|dd|W5d}~XYnXdS)Nrzrrr#rztarfile: %s %r)rrrrrpr}r%rrr_extract_memberrrrfilenamerstrerrorr )rmemberr%rrrrr8r8r9rs*      ( zTarFile.extractcCs|dt|tr ||}n|}|s6|jtkrB|||S|sR| rzt|j t rht dq~| ||SndSdS)Nrzz'cannot extract (sym)link as file object)rrrrrIrrJ fileobjectrprnrrr extractfile_find_link_target)rrrr8r8r9r&s      zTarFile.extractfilecCsT|d}|dtj}tj|}|r>tj|s>t||sN| rh| dd|j |j fn| d|j | r|||n|r|||nx|r|||nb|s|r|||nD|s| r|||n&|jtkr|||n ||||rP||||| sP||||||dS)Nrr#z%s -> %s)r:rr}rr%dirnamermakedirsrprnrrrrImakefiler9makedirrvmakefiforrrtmakedevmakelinkrrJ makeunknownrrr)rr targetpathrrZ upperdirsr8r8r9rEs4       zTarFile._extract_membercCs*zt|dWntk r$YnXdS)Nr)r}mkdirFileExistsErrorrrrr8r8r9rvszTarFile.makedirc Cs|j}||j|j}t|db}|jdk rn|jD]"\}}||t|||t|q4||j| nt|||jt|W5QRXdS)Nr) rrrrrrr]rr'truncate)rrrsourcerdtargetrr'r8r8r9rs      zTarFile.makefilecCs"||||dd|jdS)Nr#z9tarfile: Unknown file type %r, extracted as regular file.)rrrrr8r8r9rs zTarFile.makeunknowncCs"ttdrt|ntddS)Nmkfifozfifo not supported by system)rr}rr rr8r8r9rs  zTarFile.makefifocCs^ttdrttdstd|j}|r6|tjO}n |tjO}t||t |j |j dS)Nmknodrz'special devices not supported by system) rr}r rrtrS_IFBLKS_IFCHRrrrr)rrrrr8r8r9rs  zTarFile.makedevc Cszb|r0tj|r t|t|j|n0tj|jrNt |j|n| | ||WnHt k rz| | ||Wnt k rtdYnXYnXdS)Nz%unable to resolve link inside archive)rnr}r%lexistsunlinksymlinkrrrlinkrrsymlink_exceptionrr rr8r8r9rs"    zTarFile.makelinkcCsttdrtdkr|j}|j}|sztrzShow listing of a tarfile)metavarr)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 validrzrz{!r} is a tar archive.r#z{!r} is not a tar archive. r)rr$)r%rz{!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_argumentadd_mutually_exclusive_group parse_argstestrrrrnrlrrrTexitr`rrr2r}curdir format_helprZcreatepopr%splitextr)r/r%parserrVargsrarZtfr6r!Ztar_name_extZ compressionsZtar_modeZ tar_files file_namer8r8r9main s                     r?__main__)]version __author__ __credits__builtinsrrrlr}rr\rrrWrrTrrrAttributeErrorNotImplementedErrorrr NameError__all__r3rrr rr r rrr6rormrqrsrruZCONTTYPErrr7rrrFr rrrrJrkr;rhr[rrIrirr getfilesystemencodingr:r?rOrUrZr]ro Exceptionrr rrr r rtrurvrLrwrxrobjectrrBufferedReaderrrrrr?rqr8r8r8r9 s         sh D! W