3 \dh'@s>dZdZdZdZdZddlmZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZy ddlZWnek rdZYnXy ddlZWnek rdZYnXeefZyeef7ZWnek rYnXdd d d d d dddddddddgZdZdZdZdZedZdZ dZ!dZ"dZ#dZ$d Z%dZ&d!Z'd"Z(d#Z)d$Z*d%Z+d&Z,d'Z-d(Z.d)Z/d*Z0d+Z1d,Z2d-Z3dZ4d.Z5d/Z6e5Z7e%e&e'e(e+e,e-e)e*e.e/e0f Z8e%e&e-e0fZ9e.e/e0fZ:dZ;d0d1d6d7hZe>e>d8Z?e j@d9krd:ZAnejBZAd;d<ZCd=d>ZDd?d@ZEdAe7fdBdCZFdDdEZGdedfdFdGZHdHdIZIdJdKZJGdLd d eKZLGdMddeLZMGdNd d eLZNGdOd d eLZOGdPddeLZPGdQddeLZQGdRdSdSeQZRGdTdUdUeQZSGdVdWdWeQZTGdXdYdYeQZUGdZd[d[eQZVGd\d]d]ZWGd^d_d_ZXGd`dadaeYZZGdbdcdceYZ[Gdddedee j\Z]GdfdgdgeLZ^Gdhdidie^Z_Gdjdkdke^Z`Gdldmdme^ZaGdndodoe^ZbGdpdqdqe^ZcGdrdsdse^Zde^eeMfZeddtduZfdvdwZgdxdyZhdzd{Ziegeheid|ZjeYZkejld}ZmGd~d d eYZnGdddeYZodd ZpeojZddZqerdkr:eqdS)z0.9.0u"Lars Gustäbel (lars@gustaebel.de)z5$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $z?$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $u4Gustavo Niemeyer, Niels Gustäbel, Richard Townsend.)openNTarFileTarInfo is_tarfileTarError ReadErrorCompressionError StreamError ExtractError HeaderErrorENCODING USTAR_FORMAT GNU_FORMAT PAX_FORMATDEFAULT_FORMATrTz/etc/python/tarfile.cfgisustar sustar00d01234567LKSxgXpathlinkpathsizemtimeuidgidunamegname)ZatimeZctimer(r)r*r'ntzutf-8cCs8|dkrtd|j||}|d||t|tS)Nzmetadata cannot contain None) ValueErrorencodelenNUL)slengthencodingerrorsr6/usr/lib64/python3.6/tarfile.pystns r8cCs*|jd}|dkr|d|}|j||S)Nrr#)finddecode)r2r4r5pr6r6r7ntss  r=c Cs|dd krfd}x0tt|dD]}|dK}|||d7}q"W|ddkrdt|d| }n@y"t|dd}t|jpd d}Wntk rtd YnX|S) Nrr#asciistrict0zinvalid header)r>r?)ranger0r=intstripr.InvalidHeaderError)r2nir6r6r7ntis   rKr@cCst|}d|ko"d|dknrDtd|d|fdt}n|tkrd|d |kopd|dknr|dkrtdg}ntdg}d||}x6t|dD]}|jd|d@|dL}qWntd |S) Nrr@r#z%0*orBrAr>r?zoverflow in number field)rFbytesr1r bytearrayrEinsertr.)rIdigitsformatr2rJr6r6r7itns  2   rQcCs0dttjd|}dttjd|}||fS)NrAZ 148B8x356BZ 148b8x356b)sumstructZ unpack_from)bufZunsigned_chksumZ signed_chksumr6r6r7 calc_chksumss rUc Cs|pd}|dkrdS|dkr.tj|||dSt||\}}x8t|D],}|j|}t||krh|d|j|qFW|dkr|j|}t||kr|d|j|dS)Nirzunexpected end of datai@)shutil copyfileobjdivmodrEreadr0write) srcdstr3 exceptionbufsizeblocks remainderbrTr6r6r7rXs$     rXcCs ddl}|jdtdtj|S)Nrz$deprecated in favor of stat.filemoder$)warningswarnDeprecationWarningstatfilemode)modercr6r6r7rgsrgcCs8ttjdd}|dk r(|j|dj|}t|dddS)Nr4backslashreplace )end)getattrsysstdoutr/r;print)r2r4r6r6r7 _safe_printsrpc@s eZdZdS)rN)__name__ __module__ __qualname__r6r6r6r7rsc@s eZdZdS)r N)rqrrrsr6r6r6r7r !sc@s eZdZdS)rN)rqrrrsr6r6r6r7r$sc@s eZdZdS)rN)rqrrrsr6r6r6r7r'sc@s eZdZdS)r N)rqrrrsr6r6r6r7r *sc@s eZdZdS)r N)rqrrrsr6r6r6r7r -sc@s eZdZdS)EmptyHeaderErrorN)rqrrrsr6r6r6r7rt0srtc@s eZdZdS)TruncatedHeaderErrorN)rqrrrsr6r6r6r7ru3sruc@s eZdZdS)EOFHeaderErrorN)rqrrrsr6r6r6r7rv6srvc@s eZdZdS)rHN)rqrrrsr6r6r6r7rH9srHc@s eZdZdS)SubsequentHeaderErrorN)rqrrrsr6r6r6r7rw<srwc@s,eZdZddZddZddZddZd S) _LowLevelFilecCsFtjtjtjBtjBd|}ttdr2|tjO}tj||d|_dS)N)rwO_BINARYi) osO_RDONLYO_WRONLYO_CREATO_TRUNChasattrr{rfd)selfnamerhr6r6r7__init__Is   z_LowLevelFile.__init__cCstj|jdS)N)r|closer)rr6r6r7rRsz_LowLevelFile.closecCstj|j|S)N)r|rZr)rr'r6r6r7rZUsz_LowLevelFile.readcCstj|j|dS)N)r|r[r)rr2r6r6r7r[Xsz_LowLevelFile.writeN)rqrrrsrrrZr[r6r6r6r7rxCs rxc@speZdZddZddZddZddZd d Zd d Zd dZ ddZ dddZ dddZ ddZ ddZdS)_Streamc Csd|_|dkrt||}d|_|dkr6t|}|j}|pt|j|jkrL|jj|jd|j|j|jd|_qWdS)N)rTr0r_rr[)rr2r6r6r7Z__writesz_Stream.__writec Cs|jr dSd|_z|jdkr:|jdkr:|j|jj7_|jdkr|jr|jj|jd|_|jdkr|jjtj d|j |jjtj d|j d@Wd|j s|jj XdS)NTrzrrrzd|fg}d|_g|_d}|j}xT|D]L\}}||kr~|jj d||df|jj d||||f||7}||}qZW||jkr|jj d||jdfdS)NrrFT) roffsetr'positionrlrr map_indexmapr)rrrr'Z blockinfoZlastposZrealposr6r6r7rus(   z_FileInFile.__init__cCsdS)Nr6)rr6r6r7rsz_FileInFile.flushcCsdS)NTr6)rr6r6r7readablesz_FileInFile.readablecCsdS)NFr6)rr6r6r7writablesz_FileInFile.writablecCs |jjS)N)rseekable)rr6r6r7rsz_FileInFile.seekablecCs|jS)N)r)rr6r6r7rsz_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_ENDr.)rrwhencer6r6r7rs   z_FileInFile.seekc Cs|dkr|j|j}nt||j|j}d}x|dkr xZ|j|j\}}}}||jkob|knrlPq:|jd7_|jt|jkr:d|_q:Wt|||j}|r|jj||j||jj|}t||krt d||7}n |t |7}||8}|j|7_q.W|S)Nrrr#zunexpected end of data) r'rrrrr0rrrZrr1) rr'rTdatastartstoprr3rbr6r6r7rZs.      z_FileInFile.readcCs&|jt|}||dt|<t|S)N)rZr0)rrbrTr6r6r7readintosz_FileInFile.readintocCs d|_dS)NT)r)rr6r6r7rsz_FileInFile.close)N)N)rqrrrsrrrrrrrrrrZrrr6r6r6r7ros  rcseZdZfddZZS) ExFileObjectcs&t|j|j|j|j}tj|dS)N)rr offset_datar'sparsesuperr)rtarfiletarinfor) __class__r6r7rs  zExFileObject.__init__)rqrrrsr __classcell__r6r6)rr7rsrc@s eZdZdS) FilterErrorN)rqrrrsr6r6r6r7rsrcseZdZfddZZS)AbsolutePathErrorcs ||_tjd|jddS)Nzmember z has an absolute path)rrrr)rr)rr6r7rszAbsolutePathError.__init__)rqrrrsrrr6r6)rr7rsrcseZdZfddZZS)OutsideDestinationErrorcs.||_||_tj|jd|dddS)Nz would be extracted to z, z which is outside the destination)r_pathrrr)rrr%)rr6r7rsz OutsideDestinationError.__init__)rqrrrsrrr6r6)rr7rsrcseZdZfddZZS)SpecialFileErrorcs||_tj|jddS)Nz is a special file)rrrr)rr)rr6r7rszSpecialFileError.__init__)rqrrrsrrr6r6)rr7rsrcseZdZfddZZS)AbsoluteLinkErrorcs||_tj|jddS)Nz! is a symlink to an absolute path)rrrr)rr)rr6r7rszAbsoluteLinkError.__init__)rqrrrsrrr6r6)rr7rsrcseZdZfddZZS)LinkOutsideDestinationErrorcs.||_||_tj|jd|dddS)Nz would link to z, z which is outside the destination)rrrrr)rrr%)rr6r7rsz$LinkOutsideDestinationError.__init__)rqrrrsrrr6r6)rr7rsrcseZdZfddZZS)LinkFallbackErrorcs2||_||_tjd|jdd|ddS)Nzlink z would be extracted as a zcopy of z, which was rejected)rrrrr)rrr%)rr6r7rszLinkFallbackError.__init__)rqrrrsrrr6r6)rr7rsrcCs$i}|j}tjj|tjjd}|jdtjfrH|jjdtj}|d<tjj|r\t |tjjtjj ||tjjd}tjj ||g|krt |||j }|dk r|d@}|r|js|jr|d@s|dM}|dO}n|js|jrd}nt|||j kr||d<|r |jdk r,d|d <|jdk r@d|d <|jdk rTd|d <|jdk rhd|d <|js||jr tjj|jrt|tjj|j}||jkr||d <|jrtjj |tjj||j}ntjj ||j}tjj|tjjd}tjj ||g|kr t|||S)N)rC/ri@Iirhr)r*r+r,linknamei)rr|r%realpath ALLOW_MISSINGrseplstripisabsrr commonpathrrhisregislnkisdirissymrr)r*r+r,rrnormpathdirnamer)member dest_pathZfor_data new_attrsrZ target_pathrhZ normalizedr6r6r7_get_filtered_attrssd                rcCs|S)Nr6)rrr6r6r7fully_trusted_filterTsrcCs(t||d}|r$|jf|ddiS|S)NFdeep)rr)rrrr6r6r7 tar_filterWs rcCs(t||d}|r$|jf|ddiS|S)NTrF)rr)rrrr6r6r7 data_filter]s r)Z fully_trustedrrs([0-9]{1,20}) c@seZdZdlZdmddZddZddZeeeZddZ ddZ ee e Z d d!Z e e e e e e e e d"e d# d$d%Zd&d'Zeed(fd)d*Zd+d,Zd-d.Zd/d0Zed1d2Zd3d4Zed5d6Zed7d8Zed9d:Zed;d<Zed=d>Zed?d@ZdAdBZ dCdDZ!dEdFZ"dGdHZ#dIdJZ$dKdLZ%dMdNZ&dOdPZ'dQdRZ(dSdTZ)dUdVZ*dWdXZ+dYdZZ,d[d\Z-d]d^Z.d_d`Z/dadbZ0dcddZ1dedfZ2dgdhZ3didjZ4dkS)nrrrhr)r*r'r(chksumtyperr+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)rrhr)r*r'r(rREGTYPErrr+r,rrrrrr)rrr6r6r7rs"zTarInfo.__init__cCs|jS)N)r)rr6r6r7_getpathszTarInfo._getpathcCs ||_dS)N)r)rrr6r6r7_setpathszTarInfo._setpathcCs|jS)N)r)rr6r6r7 _getlinkpathszTarInfo._getlinkpathcCs ||_dS)N)r)rrr6r6r7 _setlinkpathszTarInfo._setlinkpathcCsd|jj|jt|fS)Nz<%s %r at %#x>)rrqrid)rr6r6r7__repr__szTarInfo.__repr__T) rr(rhrr)r*r+r,r_KEEPc Cs| rtj|} n tj|} || k r(|| _|| k r6|| _|| k rD|| _|| k rR|| _|| k r`|| _|| k rn|| _|| k r||| _|| k r|| _ | S)N) copydeepcopyrr(rhrr)r*r+r,) rrr(rhrr)r*r+r,rr resultr6r6r7rs(  zTarInfo.replacecCs|jdkrd}n |jd@}|j||j|j|j|j|j|j|j|j |j |j |j d }|dt kr~|djd r~|dd7<|S)Ni) rrhr)r*r'r(rrrr+r,rrrrr)rhrr)r*r'r(rrrr+r,rrDIRTYPEr)rrhinfor6r6r7get_infos&   zTarInfo.get_infosurrogateescapecCs~|j}x(|jD]\}}|dkrtd|qW|tkrH|j|||S|tkr^|j|||S|tkrr|j||StddS)Nz%s may not be Nonezinvalid format) ritemsr.r create_ustar_headerrcreate_gnu_headerrcreate_pax_header)rrPr4r5rrvaluer6r6r7tobufs z TarInfo.tobufcCsnt|d<t|dj||tkr(tdt|dj||tkr^|j|d||\|d<|d<|j|t||S)Nmagicrzlinkname is too longrprefix) POSIX_MAGICr0r/ LENGTH_LINKr. LENGTH_NAME_posix_split_name_create_headerr )rrr4r5r6r6r7rs zTarInfo.create_ustar_headercCst|d<d}t|dj||tkr<||j|dt||7}t|dj||tkrl||j|dt||7}||j|t ||S)Nrrrr) GNU_MAGICr0r/r_create_gnu_long_headerGNUTYPE_LONGLINKrGNUTYPE_LONGNAMErr)rrr4r5rTr6r6r7rszTarInfo.create_gnu_headerc Cs4t|d<|jj}xddtfddtfddfD]h\}}}||kr@q,y||jd d Wn"tk rv||||<w,YnXt|||kr,||||<q,WxldD]d\}}||krd||<q||}d|kod |dkn st|t rt |||<d||<qW|r|j |t |} nd} | |j |td dS)Nrrr%rr&r+ r,rBrCr)r@r*r' r(rr#rr)r+r+r")r,r,r"r)r@r*r@r'r#r(r#)r$r%r&r')rrr rrr/UnicodeEncodeErrorr0 isinstancefloatstr_create_pax_generic_headerXHDTYPErr ) rrr4rrZhnamer3rOvalrTr6r6r7rs4  .  zTarInfo.create_pax_headercCs|j|tdS)Nzutf-8)r,XGLTYPE)clsrr6r6r7create_pax_global_header?sz TarInfo.create_pax_global_headercCs|jd}xltdt|D]R}dj|d|}dj||d}t|j||tkrt|j||tkrPqWtd||fS)Nrr#zname is too long)splitrEr0rr/ LENGTH_PREFIXrr.)rrr4r5Z componentsrJrr6r6r7rEs zTarInfo._posix_split_namec Cs|jdttfk}|r@t|jddd|}t|jddd|}ntdd||}tdd||}|jdt}|dkrxtdt|jddd ||t|jd dd @d|t|jd dd|t|jd dd|t|jddd|t|jddd|d|t|jddd |||jdtt|jddd||t|jddd||t|jddd|t|jddd|t|jddd||g}tj dt dj |} t | t dd} | ddt d| d| d d} | S)!Nrrrr@rrzTarInfo.type must not be Nonerrrhir)r*r'r#r(s rrr+r"r,rrz%dsrilz%06orBieii)getCHRTYPEBLKTYPErQr8rr.rrSrrrrUrL) rrPr4r5Zhas_device_fieldsrrZfiletypepartsrTrr6r6r7rUs8  &zTarInfo._create_headercCs.tt|t\}}|dkr*|t|t7}|S)Nr)rYr0rr1)Zpayloadr`rar6r6r7_create_payloadszTarInfo._create_payloadcCsR|j||t}i}d|d<||d<t||d<t|d<|j|t|||j|S)Nz ././@LongLinkrrr'r)r/r1r0rrr r8)r0rrr4r5rr6r6r7rs zTarInfo._create_gnu_long_headerc Cs:d}x@|jD]4\}}y|jddWqtk r@d}PYqXqWd}|rV|d7}x|jD]\}}|jd}|r|j|d}n |jd}t|t|d}d } } x"|tt| } | | krP| } qW|tt| d d |d |d 7}q`Wi} d| d<|| d<t|| d<t| d<|j| td d|j |S)NFzutf-8rCTrs21 hdrcharset=BINARY rrrrB = z././@PaxHeaderrrr'rr) rr/r(r0r+rLrrr r8) r0rrr4ZbinarykeywordrZrecordslrIr<rr6r6r7r,s<   * z"TarInfo._create_pax_generic_headerc Cstt|dkrtdt|tkr(td|jttkr>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 jdrt|_|jtkr6d}g}xrtdD]f} y0t|||d} t||d|d} Wntk rPYnX|j| | f|d7}qWt|d} t|dd} || | f|_ |j!rN|j j"d|_ |rp|jt#krp|d|j |_ |S)Nrz empty headerztruncated headerzend of file headerz bad checksumrlt|ii i)iIiQiYirirr#iii)$r0rtrrucountr1rvrKrUrHr=rrhr)r*r'r(rrrr+r,rrAREGTYPErr GNUTYPE_SPARSErEr.rboolrrrstrip GNU_TYPES)r0rTr4r5robjrrstructsrJrnumbytes isextendedorigsizer6r6r7frombufsZ       zTarInfo.frombufcCs8|jjt}|j||j|j}|jjt|_|j|S)N) rrZrrQr4r5rr _proc_member)r0rrTrLr6r6r7 fromtarfile s zTarInfo.fromtarfilecCsT|jttfkr|j|S|jtkr,|j|S|jtttfkrF|j |S|j |SdS)N) rr!r  _proc_gnulongrH _proc_sparser-r/SOLARIS_XHDTYPE _proc_pax _proc_builtin)rrr6r6r7rR!s    zTarInfo._proc_membercCsR|jj|_|j}|js$|jtkr4||j|j7}||_|j |j |j |j |S)N) rrrrrSUPPORTED_TYPES_blockr'r_apply_pax_inforr4r5)rrrr6r6r7rX.s zTarInfo._proc_builtinc Cs|jj|j|j}y|j|}Wntk r>tdYnX|j|_|jt krft ||j |j |_ n|jtkrt ||j |j |_|S)Nz missing or bad subsequent header)rrZrZr'rSr rwrrr!r=r4r5rr r)rrrTnextr6r6r7rT?s  zTarInfo._proc_gnulongc Cs|j\}}}|`x|r|jjt}d}xvtdD]j}y0t|||d}t||d|d} Wntk rzPYnX|r| r|j|| f|d7}q0Wt|d}qW||_ |jj |_ |j |j |j |_||_ |S)Nrr#rEi)rrrZrrErKr.rrIrrrrZr'r) rrrMrOrPrTrrJrrNr6r6r7rUUs(    zTarInfo._proc_sparsec Cs|jj|j|j}|jtkr&|j}n |jj}d}d}g}x0t||koV||dkrnt j ||}|srt dyt |j d}Wntk rt dYnX|dkrt d||t|krt d|jd|d} ||jdd| } | jd\} } } | s"| dks"|| dkr*t d|j|| | f| dkrd|dkrd| dkr`|j}nd }||7}q@W|dkr~d }x`|D]X\}} } |j| d d |j}|tkr|j| ||j|j}n|j| d d |j}|||<qWy|j|}Wntk r td YnXd |kr&|j||nFd |kr>|j||n.|jd dkrl|jddkrl|j||||jttfkr|j ||j|j|j!|_!d|kr|j"}|j#s|jt$kr||j|j7}||_!|S)Nrzinvalid headerr#r:rs hdrcharsetsBINARYzutf-8z missing or bad subsequent headerzGNU.sparse.mapzGNU.sparse.sizezGNU.sparse.major1zGNU.sparse.minorrDr')%rrZrZr'rr/rr r0_header_length_prefix_rematchrHrFgroupr.rrk partitionrr4_decode_pax_fieldr5PAX_NAME_FIELDSrSr rw_proc_gnusparse_01_proc_gnusparse_00r4_proc_gnusparse_10r-rVr[rrrrY)rrrTrrr4 raw_headersrar3Zheader_value_end_offsetZkeyword_and_valueZ raw_keywordZequalsZ raw_valuer<rr\rr6r6r7rWqsx                 zTarInfo._proc_paxc Csg}g}x|D]\}}}|dkrVy|jt|jWqtk rRtdYqXq|dkry|jt|jWqtk rtdYqXqWtt|||_dS)NsGNU.sparse.offsetzinvalid headersGNU.sparse.numbytes)rrFr;r.rHlistzipr)rr\riZoffsetsrN_r<rr6r6r7rgszTarInfo._proc_gnusparse_00cCs@dd|djdD}tt|ddd|ddd|_dS)NcSsg|] }t|qSr6)rF).0xr6r6r7 sz.TarInfo._proc_gnusparse_01..zGNU.sparse.map,r$r#)r2rjrkr)rr\rrr6r6r7rfszTarInfo._proc_gnusparse_01cCsd}g}|jjt}|jdd\}}t|}xJt||dkrvd|krV||jjt7}|jdd\}}|jt|q.W|jj|_t t |ddd|ddd|_ dS)Nr;r#r$) rrZrr2rFr0rrrrjrkr)rr\rrZfieldsrrTZnumberr6r6r7rhs  zTarInfo._proc_gnusparse_10c Csx|jD]\}}|dkr(t|d|q |dkrBt|dt|q |dkr\t|dt|q |tkr |tkryt||}Wntk rd}YnX|dkr|jd}t|||q W|j|_dS)NzGNU.sparse.namer%zGNU.sparse.sizer'zGNU.sparse.realsizerr) rsetattrrF PAX_FIELDSPAX_NUMBER_FIELDSr.rJr r)rrr4r5r<rr6r6r7r[s"  zTarInfo._apply_pax_infoc Cs.y |j|dStk r(|j||SXdS)NrC)r;UnicodeDecodeError)rrr4Zfallback_encodingZfallback_errorsr6r6r7rd,s zTarInfo._decode_pax_fieldcCs"t|t\}}|r|d7}|tS)Nr#)rYr)rrFr`rar6r6r7rZ4szTarInfo._blockcCs |jtkS)N)r REGULAR_TYPES)rr6r6r7r=sz TarInfo.isregcCs|jS)N)r)rr6r6r7isfile?szTarInfo.isfilecCs |jtkS)N)rr )rr6r6r7rAsz TarInfo.isdircCs |jtkS)N)rSYMTYPE)rr6r6r7rCsz TarInfo.issymcCs |jtkS)N)rLNKTYPE)rr6r6r7rEsz TarInfo.islnkcCs |jtkS)N)rr5)rr6r6r7ischrGsz TarInfo.ischrcCs |jtkS)N)rr6)rr6r6r7isblkIsz TarInfo.isblkcCs |jtkS)N)rFIFOTYPE)rr6r6r7isfifoKszTarInfo.isfifocCs |jdk S)N)r)rr6r6r7issparseMszTarInfo.issparsecCs|jtttfkS)N)rr5r6r{)rr6r6r7isdevOsz TarInfo.isdevN)rrhr)r*r'r(rrrr+r,rrrrrrrrr)r)5rqrrrs __slots__rrrpropertyr%rrr&rr rrrr rrrr classmethodr1r staticmethodrr8rr,rQrSrRrXrTrUrWrgrfrhr[rdrZrrvrrrryrzr|r}r~r6r6r6r7rssd    1  *  3 ?  z c @seZdZdZdZdZdZeZe Z dZ e Z eZdZdjddZedddefd d Zedkd d ZedlddZedmddZednddZdddddZddZddZddZdd Zdod!d"Zdpdd$d%d&Zdqdd'd(d)Z drd*d+Z!d,d-Z"dsddd/d0d1Z#d2d3Z$dtddd/d5d6Z%d7d8Z&dud9d:Z'd;d<Z(d=d>Z)d?d@Z*dvdddAdBdCZ+dDdEZ,dFdGZ-dHdIZ.dJdKZ/dLdMZ0dNdOZ1dPdQZ2dRdSZ3dTdUZ4dVdWZ5dXdYZ6dwdZd[Z7d\d]Z8dxd^d_Z9d`daZ:dbdcZ;dddeZdS)yrrFr#NryrcCsddddd}||krtd||_|||_|sj|jdkrVtjj| rVd|_d|_t||j}d |_n@|dkrt|d rt |j t t fr|j }t|d r|j|_d |_|rtjj |nd|_ ||_|dk r||_|dk r||_|dk r||_|dk r||_|dk r||_| |_| dk r4|jtkr4| |_ni|_| dk rJ| |_| dk rZ| |_| |_d |_g|_d |_|jj|_i|_y|jd krd|_ |j!|_ |jdkr8x|jj"|jy|jj#|}|jj$|WnTt%k r|jj"|jPYn0t&k r0}zt't |WYdd}~XnXqW|jdkrd |_|jr|jj(|jj)}|jj*||jt+|7_Wn&|js|jj,d |_YnXdS)Nrbzr+bwbZxb)ryarzrnz!mode must be 'r', 'a', 'w' or 'x'rrzFrrhTryrn)rrzrn)-r.rh_moder|r%exists bltn_openrrr)rr+rLabspathrrPr dereference ignore_zerosr4r5rrdebug errorlevel copybufsizermembers_loadedrrinodes firstmemberr\rrSrrvr rr1r r[r0r)rrrhrrPrrrr4r5rrrrZmodeserTr6r6r7ros             $   zTarFile.__init__c s| r| rtd|dkrfdd}xttj|dD]b}tj|}|dk r\|j} y||d|f|Sttfk r|dk r|j| w8Yq8Xq8Wtdnd|kr |jdd \} }| pd} |pd }|jkrtj|}n td |||| |f|Sd |kr|jd d \} }| p.d} |p8d }| dkrLtdt || |||} y|| | f|} Wn| j YnXd| _ | S|dkrj |||f|StddS)Nznothing to openryr:*csj|dkS)Ntaropen) OPEN_METH)r)r0r6r7not_compressedsz$TarFile.open..not_compressed)keyz%file could not be opened successfully:r#rzunknown compression type %r|rzzmode must be 'r' or 'w'Frrnzundiscernible mode)ryr)ryrz)rrzrn) r.sortedrrlrrrrr2rrrr) r0rrhrr_kwargsrrfuncZ saved_posrgstreamrr6)r0r7rsP%             z TarFile.opencKs |dkrtd||||f|S)Nryrrzrnz!mode must be 'r', 'a', 'w' or 'x')ryrrzrn)r.)r0rrhrrr6r6r7r9szTarFile.taropenrcKs|d krtdyddl}|jWn ttfk rBtdYnXy|j||d||}Wn.tk r|dk r|dkrtdYnXy|j|||f|}WnBtk r|j |dkrtdYn|j YnXd |_ |S) Nryrzrnzmode must be 'r', 'w' or 'x'rzgzip module is not availablerbznot a gzip fileF)ryrzrn) r.gzipZGzipFilerAttributeErrorrrrrrr)r0rrhr compresslevelrrrr6r6r7gzopenAs2 zTarFile.gzopencKs|d krtdy ddl}Wntk r8tdYnX|j|pD|||d}y|j|||f|}WnFttfk r|j|dkrt dYn|jYnXd |_ |S) Nryrzrnzmode must be 'r', 'w' or 'x'rzbz2 module is not available)rznot a bzip2 fileF)ryrzrn) r.rrrZBZ2FilerrEOFErrorrrr)r0rrhrrrrrr6r6r7bz2opencs(  zTarFile.bz2opencKs|d krtdy ddl}Wntk r8tdYnX|j|pD|||d}y|j|||f|}WnH|jtfk r|j|dkrt dYn|jYnXd |_ |S) Nryrzrnzmode must be 'r', 'w' or 'x'rzlzma module is not available)presetznot an lzma fileF)ryrzrn) r.rrrZLZMAFilerrrrrr)r0rrhrrrrrr6r6r7xzopens& zTarFile.xzopenrrrr)rrrrc Cs|jr dSd|_z`|jdkrn|jjttd|jtd7_t|jt\}}|dkrn|jjtt|Wd|j s|jj XdS)NTrrzrnr$r)rrzrn) rrhrr[r1rrrY RECORDSIZErr)rr`rar6r6r7rs z TarFile.closecCs"|j|}|dkrtd||S)Nzfilename %r not found) _getmemberKeyError)rrrr6r6r7 getmembers  zTarFile.getmembercCs|j|js|j|jS)N)_checkr_loadr)rr6r6r7 getmembersszTarFile.getmemberscCsdd|jDS)NcSsg|] }|jqSr6)r)rmrr6r6r7rosz$TarFile.getnames..)r)rr6r6r7getnamesszTarFile.getnamesc Csp|jd|dk r|j}|dkr$|}tjj|\}}|jtjd}|jd}|j}||_ |dkrt tdr|j rtj |}qtj |}ntj|j}d}|j}t j|r|j|jf} |j r|jdkr| |jkr||j| krt} |j| }nt} | drx||j| <nht j|r"t} nVt j|r4t} nDt j|rPt} tj|}n(t j|rbt } nt j!|rtt"} ndS||_||_#|j$|_%|j&|_'| tkr|j(|_)nd|_)|j*|_+| |_,||_-t.ryt.j/|j%d|_0Wnt1k rYnXt2r*yt2j3|j'd|_4Wnt1k r(YnX| t t"fkrlt tdrlt tdrltj5|j6|_7tj8|j6|_9|S) Nawxrlstatrr#rmajorminor):rrr|r% splitdriverrrrrrrrrffstatfilenost_modeS_ISREGst_inost_devst_nlinkrrxrS_ISDIRr S_ISFIFOr{S_ISLNKrwreadlinkS_ISCHRr5S_ISBLKr6rhst_uidr)st_gidr*st_sizer'st_mtimer(rrpwdgetpwuidr+rgrpZgetgrgidr,rst_rdevrrr) rrarcnamerZdrvrZstatresrZstmdinoderr6r6r7 gettarinfos~                 zTarFile.gettarinfoT)rcCs0|j|dkr|}x|D] }|r|jdkr:tdnttj|jtd|jpX|j|jpb|jf|j sz|j rtdd|j |j fntd|j |jdkrtdntdtj|jddt|j|jrd nd |r"|jr td |j|jr"td |jtqWdS) Nz ??????????z%s/%sz%10sz%d,%dz%10dz????-??-?? ??:??:??z%d-%02d-%02d %02d:%02d:%02drrrz-> zlink to )rrhrprfrgr+r)r,r*ryrzrrr'r(rZ localtimerrrrrro)rverboserrr6r6r7rj;s2      z TarFile.list)filterc Csv|jd|dkr|}|dk rPddl}|jdtd||rP|jdd|dS|jdk rtjj||jkr|jdd|dS|jd||j ||}|dkr|jdd|dS|dk r||}|dkr|jdd|dS|j rt |d }|j ||WdQRXnd|j rh|j ||rrxHtj|D].}|jtjj||tjj|||||d q4Wn |j |dS) Nrrzuse the filter argument insteadr$ztarfile: Excluded %rztarfile: Skipped %rr#ztarfile: Unsupported type %rr)r)rrcrdre_dbgrr|r%rrrraddfilerlistdiraddr) rrr recursiveZexcluderrcrfr6r6r7rasB       z TarFile.addcCs|jdtj|}|j|j|j|j}|jj||jt |7_|j }|dk rt ||j|j |dt |j t\}}|dkr|jjtt||d7}|j|t7_|jj|dS)Nr)r_rr#)rr rrPr4r5rr[rr0rrXr'rYrr1rr)rrrrTr_r`rar6r6r7rs   zTarFile.addfilec"CsH|dkr|j}|dkrtjjd}|dkry tt}Wntk rNYnBXddl}|jddd}||j |WdQRX|jdddd}|ry t |}Wn&t k rt d|d dYnX||_|St rtjdttStSt|trtd|St|r|Syt |St k rBt d|d dYnXdS)NZ PYTHON_TARFILE_EXTRACTION_FILTERr#)Z interpolationZcomment_prefixesrr)Zfallbackzfilter z not foundz4The default behavior of tarfile extraction has been z$changed to disallow common exploits z(including CVE-2007-4559). z1By default, absolute/parent paths are disallowed z and some mode bits are cleared. z/See https://access.redhat.com/articles/7004769 zfor more details.z#String names are not supported for z2TarFile.extraction_filter. Use a function such as ztarfile.data_filter directly.)rzXThe default behavior of tarfile extraction has been changed to disallow common exploits zsThe default behavior of tarfile extraction has been changed to disallow common exploits (including CVE-2007-4559). zThe default behavior of tarfile extraction has been changed to disallow common exploits (including CVE-2007-4559). By default, absolute/parent paths are disallowed zThe default behavior of tarfile extraction has been changed to disallow common exploits (including CVE-2007-4559). By default, absolute/parent paths are disallowed and some mode bits are cleared. zThe default behavior of tarfile extraction has been changed to disallow common exploits (including CVE-2007-4559). By default, absolute/parent paths are disallowed and some mode bits are cleared. See https://access.redhat.com/articles/7004769 aThe default behavior of tarfile extraction has been changed to disallow common exploits (including CVE-2007-4559). By default, absolute/parent paths are disallowed and some mode bits are cleared. See https://access.redhat.com/articles/7004769 for more details.zUString names are not supported for TarFile.extraction_filter. Use a function such as zrString names are not supported for TarFile.extraction_filter. Use a function such as tarfile.data_filter directly.)extraction_filterr|environr4r_CONFIG_FILENAMEFileNotFoundError configparserZ ConfigParserZ read_file_NAMED_FILTERSrr._RH_SAFER_DEFAULTrcrdRuntimeWarningrrr)r+ TypeErrorcallable)rrrfilerZconfr6r6r7_get_filter_functionsR       zTarFile._get_filter_function.) numeric_ownerrc"Csg}|j|}|dkr|}xT|D]L}|j|||\}} |dkr@q |jrR|j| |j|||j ||dq W|jddddx$|D]} yy|| |}Wn4tk r} z|j| t| wWYdd} ~ XnX|dkr|j| dwt j j ||j } yt j | } Wn$tk r.|j|dwYnXtj| jsL|j|dw|j|| |d |j|| |j|| Wqtk r} z|j| WYdd} ~ XqXqWdS) N) set_attrsrfilter_functioncSs|jS)N)r)rr6r6r7 sz$TarFile.extractall..T)rreversezexcluded by filterZmissingznot a directory)r)r_get_extract_tarinforr _extract_onesort_FILTER_ERRORS_log_no_directory_fixupreprr|r%rrrrrfrrchownutimechmodr _handle_nonfatal_error)rr%rrrZ directoriesrrr unfilteredexcdirpathrrr6r6r7 extractallsP       zTarFile.extractallcCs|jdd|j|fdS)Nr$z(tarfile: Not fixing up directory %r (%s))rr)rrreasonr6r6r7r1 szTarFile._log_no_directory_fixuprc Cs8|j|}|j|||\}}|dk r4|j||||dS)N)rrr) rrr%rrrrrrr6r6r7extract5 s  zTarFile.extractcCst|tr|j|}n|}d}y|||}WnZttfk r\}z|j|WYdd}~Xn,tk r}z|j|WYdd}~XnX|dkr|jdd|j dS|j rt j |}t j j||j|_||fS)Nr$ztarfile: Excluded %r)NN)r)r+rrr_handle_fatal_errorr rrrrr r|r%rrr)rrrr%rfilteredrr6r6r7rI s"   zTarFile._get_extract_tarinfocCs|jdy&|j|tjj||j||||dWnVtk r\}z|j|WYdd}~Xn,tk r}z|j |WYdd}~XnXdS)Nry)rrrextraction_root) r_extract_memberr|r%rrrrr r)rrr%rrrrr6r6r7rg s  zTarFile._extract_onecCs"|jdkrn|jdd|dS)Nr#z tarfile: %s)rr)rrr6r6r7r{ s zTarFile._handle_nonfatal_errorcCsn|jdkrn\t|trP|jdkr6|jdd|jqj|jdd|j|jfn|jddt|j|fdS)Nrr#z tarfile: %sztarfile: %s %rztarfile: %s %s)rr)rfilenamerstrerrorrrq)rrr6r6r7r s   zTarFile._handle_fatal_errorcCs|jdt|tr |j|}n|}|js6|jtkrB|j||S|jsR|j rzt|j t rht dq~|j |j|SndSdS)Nryz'cannot extract (sym)link as file object)rr)r+rrrrY fileobjectrrrrr extractfile_find_link_target)rrrr6r6r7r s      zTarFile.extractfile)rrcCs\|jd}|jdtj}tjj|}|r@tjj| r@tj||jsP|j rj|j dd|j |j fn|j d|j |j r|j||n|jr|j||n~|jr|j||nh|js|jr|j||nJ|js|j r|j||||dn&|jtkr|j||n |j|||rX|j||||j sX|j|||j||dS)Nrr#z%s -> %s)rr)rJrr|rr%rrmakedirsrrrrrrmakefilermakedirr|makefiforyrzmakedevmakelink_with_filterrrY makeunknownrrr)rr targetpathrrrrZ upperdirsr6r6r7r s:        zTarFile._extract_memberc Cs@y&|jdkrtj|n tj|dWntk r:YnXdS)Ni)rhr|mkdirFileExistsError)rrrr6r6r7r s   zTarFile.makedircCs|j}|j|j|j}t|df}|jdk rrx,|jD]"\}}|j|t|||t|q6W|j|j|j nt|||jt|WdQRXdS)Nr) rrrrrrrXrr'truncate)rrrsourcer_targetrr'r6r6r7r s      zTarFile.makefilecCs"|j|||jdd|jdS)Nr#z9tarfile: Unknown file type %r, extracted as regular file.)rrr)rrrr6r6r7r s zTarFile.makeunknowncCs"ttdrtj|ntddS)Nmkfifozfifo not supported by system)rr|r r )rrrr6r6r7r s  zTarFile.makefifocCsnttd sttd r td|j}|dkr2d}|jrF|tjO}n |tjO}tj||tj |j |j dS)Nmknodrz'special devices not supported by systemi) rr|r rhrzrfS_IFBLKS_IFCHRrrrr)rrrrhr6r6r7r s  zTarFile.makedevcCs|j||ddS)N)r)rrrr6r6r7makelink% szTarFile.makelinkc $Cs&d}yT|jr6tjj|r$tj|tj|j|dStjj|jrVtj |j|dSWnt k rpd}YnXy|j |}Wn$t k r|rt dnYnX|dkr|}nR|dkrt dy|||}Wn2tk r}zt||j|WYdd}~XnX|dk r"|j||||ddS)NFTz%unable to resolve link inside archivez6makelink_with_filter: if filter_function is not None, z%extraction_root must also not be None)rrz[makelink_with_filter: if filter_function is not None, extraction_root must also not be None)rr|r%lexistsunlinksymlinkrrrlinksymlink_exceptionrrr rrrr) rrrrrZkeyerror_to_extracterrorrrcauser6r6r7r( sB      zTarFile.makelink_with_filtercCsttdrtjdkr|j}|j}|sytrB|jrBtj|jd}Wntk rXYnXyt rv|j rvt j |j d}Wntk rYnX|dkrd}|dkrd}y4|j rttdrtj |||ntj|||Wntk rtdYnXdS) Ngeteuidrr$r#lchownzcould not change ownerr9r9)rr|rr*r)rr,Zgetgrnamrrr+getpwnamrrrrr )rrrrgur6r6r7rZ s0  z TarFile.chownc CsL|jdkrdSttdrHytj||jWntk rFtdYnXdS)Nrzcould not change mode)rhrr|rrr )rrrr6r6r7r{ s  z TarFile.chmodc CsV|j}|dkrdSttds dSytj|||fWntk rPtdYnXdS)Nrz"could not change modification time)r(rr|rrr )rrrr(r6r6r7r s z TarFile.utimecCs|jd|jdk r$|j}d|_|S|j|jjkrZ|jj|jd|jjdsZtdd}xby|jj |}WnHt k r}z2|j r|j dd|j|f|jt 7_wbWYdd}~Xntk r,}zN|j r|j dd|j|f|jt 7_wbn|jdkrtt|WYdd}~Xntk rT|jdkrPtdYnjtk r}z|jdkr~tt|WYdd}~Xn0tk r}ztt|WYdd}~XnXPqbW|dk r|jj|nd|_|S) NZrar#zunexpected end of datar$z0x%X: %srz empty fileT)rrrrrrrZrrrSrvrrrrHr+rtrurwrrr)rmrrr6r6r7r\ sL        z TarFile.nextc Cs|j}d}|dk rHy|j|}Wntk r:d}YnX|d|}|rXtjj|}xLt|D]@}|r||j|jkrbd}qb|rtjj|j}n|j}||krb|SqbW|rt|dS)NFT) rindexr.r|r%rreversedrr) rrr normalizerZskippingrr member_namer6r6r7r s,    zTarFile._getmembercCs"x|j}|dkrPqWd|_dS)NT)r\r)rrr6r6r7r s z TarFile._loadcCs:|jrtd|jj|dk r6|j|kr6td|jdS)Nz %s is closedzbad operation for mode %r)rrrrqrh)rrhr6r6r7r szTarFile._checkcCs`|jr.djtdtjj|j|jf}d}n |j}|}|j||dd}|dkr\t d||S)NrT)rr zlinkname %r not found) rrrr|r%rrrrr)rrrlimitrr6r6r7r s  zTarFile._find_link_targetccs|jr|jEdHdSd}|jdk r:|j}|d7}|VxN|t|jkrV|j|}n"|jst|j}|sxd|_dSndS|d7}|VqzFilter for extraction)metavarchoicesr.z-lz--list zShow listing of a tarfile)r/r.z-ez --extract+ zExtract tarfile into target dir)nargsr/r.z-cz--createzCreate tarfile from sourcesz-tz--testzTest if a tarfile is validr#z&--filter is only valid for extraction ry)rz{!r} is a tar archive.z{!r} is not a tar archive. zr:*)rr$)r%rrz{!r} file is extracted.z+{!r} file is extracted into {!r} directory.rrr)z.gzz.tgzz.xzz.txzz.bz2z.tbzz.tbz2z.tb2zw:rzz{!r} file created.)r1r3)r5r6)argparseArgumentParser add_argumentrZadd_mutually_exclusive_group parse_argsrrexitZtestrrrrormr$rrPrjrr0r|curdirZ format_helprZcreatepopr%splitextr)r7r*parserrbargsr\rZtfr<r&Ztar_namerlZextZ compressionsZtar_modeZ tar_files file_namer6r6r7main] s                  rB__main__)r%r&r'r(r)r*r+r,)T)sversion __author__Z__date__Z __cvsid__ __credits__builtinsrrrmr|rrWrfrrSr rercrrrrNotImplementedErrorrr NameError__all__rrr1rrrrrrr3rrGrxrwr5r6r r{ZCONTTYPEr!r rHr-r/rVr rrrrYrurKrrrer*rFrsrr getfilesystemencodingr8r=rKrQrUrXrgrp Exceptionrr rrr r rtrurvrHrwrxrobjectrrBufferedReaderrrrrrrrrrrrrrrr compiler`rrrrBrqr6r6r6r7 s$         wh   D e b