Ë ý|´)Ýh^ãóØ—dZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z eje«ZdZej$fd„ZGd„d e«Zd „ZGd „d e«Zy) a This module allows opening and reading local and remote files and decompress them on-the-fly if needed. Remote files are read using urllib (except of "ssh://" URLs, which are handled differently). Supported file extentions are: 'bz2', 'gz', 'xz', 'lzo', 'zst' and a "tar" version of them: 'tar.bz2', 'tbz2', 'tbz', 'tb2', 'tar.gz', 'tgz', 'tar.xz', 'txz', 'tar.lzo', 'tzo', 'tar.lz4', 'tlz4', '.tar.zst', 'tzst'. This module uses the following system programs for decompressing: pbzip2, bzip2, gzip, pigz, xz, lzop, lz4, zstd, tar and unzip. éN)Úparseé)Ú BmapHelpers) Úbz2ÚgzÚxzÚlzoÚlz4Úzstztar.gzztar.bz2ztar.xzztar.lzoztar.lz4ztar.zstÚzipcóž—|tjk(r|}nF|tjk(r||z}n-tdtjtj|fz«‚||krtd||fz«‚||z }|}|dkDr4t |d«}|j |«}|sn|t |«z}|dkDrŒ4|dkrtd||z |fz«‚||z S)zº This function implements the 'seek()' method for file object 'file_obj'. Only seeking forward and is allowed, and 'whence' may be either 'os.SEEK_SET' or 'os.SEEK_CUR'. zP'seek()' method requires the 'whence' argument to be %d or %d, but %d was passedzT''seek()' method supports only seeking forward, seeking from %d to %d is not allowedréz seeked too far: %d instead of %d)ÚosÚSEEK_SETÚSEEK_CURÚErrorÚminÚreadÚlen) Úfile_objÚcur_posÚoffsetÚwhenceÚnew_posÚlengthÚto_readÚ chunk_sizeÚbufs ú7/usr/lib/python3.12/site-packages/bmaptool/TransRead.pyÚ_fake_seek_forwardr Isý€ð”—‘ÒØ‰Ø ”2—;‘;Ò Ø˜FÑ"‰äð 0Ü35·;±;ÄÇ Á ÈVÐ2Tñ Uó ð ð �ÒÜð 3Ø6=¸wÐ5Gñ Hó ð ð �wÑ €FØ€GØ �AŠ+ܘ +Ó.ˆ Ø�m‰m˜JÓ'ˆÙØ Ø”3�s“8шð �A‹+ð�‚{ÜÐ6¸'ÀGÑ:KÈWÐ9UÑUÓVÐVà �WÑ Ðócó—eZdZdZy)rzÁ A class for exceptions generated by this module. We currently support only one type of exceptions, and we basically throw human-readable problem description in case of errors. N)Ú__name__Ú __module__Ú __qualname__Ú__doc__©r!rrros „ñð  r!rcóˆ—|dk(rd}|S|dk(rd}|S|dk(rd}|S|dk(rd}|S|d k(rd }|S|d k(rd }|S|d k(rd}|Sd}|S)z‡ A helper function which converts "sshpass" command-line tool's exit code into a human-readable string. See "man sshpass". rzinvalid command line argumentézconflicting arguments givenézgeneral run-time erroréz,unrecognized response from ssh (parse error)ézinvalid/incorrect passwordézHhost public key is unknown. sshpass exits without confirming the new keyéÿz ssh errorÚunknownr')ÚcodeÚresults rÚ_decode_sshpass_exit_coder2ys¦€ð  ˆq‚yØ0ˆð( €Mð' �ŠØ.ˆð$ €Mð# �ŠØ)ˆð €Mð �ŠØ?ˆð €Mð �ŠØ-ˆð €Mð �Šð %ð ð €Mð �Šàˆð €Mðˆà €Mr!cól—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z dd„Z e jfd „Z d „Zd „Zd „Zy )Ú TransReadz¡ This class implement the transparent reading functionality. Instances of this class are file-like objects which you can read and seek only forward. cóP—||_d|_d|_d|_d|_g|_d|_d|_g|_d|_ d|_ |jdk(r4|jjtjj«n/|jjt|jd««|j+«y#t $rJ}|j"t"j$k(r|j'|«nt)d|›d|›�«‚Yd}~Œ_d}~wwxYw) zx Class constructor. The 'filepath' argument is the full path to the file to read transparently. NÚnoneFrÚ-Úrbzcannot open file 'ú': )ÚnameÚsizeÚcompression_typeÚ bz2file_foundÚis_urlÚ_child_processesÚ_rthreadÚ_doneÚ_f_objsÚ _fake_seekÚ_posÚappendÚsysÚstdinÚbufferÚopenÚIOErrorÚerrnoÚENOENTÚ _open_urlrÚ_open_compressed_file)ÚselfÚfilepathÚerrs rÚ__init__zTransRead.__init__�sø€ð ˆŒ ðˆŒ à &ˆÔà"ˆÔàˆŒ à "ˆÔàˆŒ ðˆŒ ðˆŒ àˆŒØˆŒ ð KØ�y‰y˜CÒØ— ‘ ×#Ñ#¤C§I¡I×$4Ñ$4Õ5à— ‘ ×#Ñ#¤D¨¯©°DÓ$9Ô:ð ×"Ñ"Õ$øôò KØ�y‰yœEŸL™LÒ(à—‘˜xÕ(åº8ÁSÐIÓJÐJô)ûð KúsÁA2Cà D%ÃAD Ä D%có€—d|_t|d«r(|jD]}|j«Œd|_t|d«r!|jj «d|_t|d«rJ|j D]3}|j«�Œ|j«|j«Œ5g|_yy)z/The class destructor which closes opened files.TrBNr@r?) rAÚgetattrrBÚcloser@Újoinr?ÚpollÚkillÚwait)rOrÚchilds rÚ__del__zTransRead.__del__Ïs›€àˆŒ ä �4˜Ô #Ø ŸLœL�Ø—‘Õ ð)àˆDŒLä �4˜Ô $Ø �M‰M× Ñ Ô Ø ˆDŒMä �4Ð+Ô ,Ø×.Ô.�Ø—:‘:“<Ñ'Ø—J‘J”LØ—J‘J•Lð/ð%'ˆDÕ !ð -r!cóЗd} |js2|j|«}|sn|j|«|jsŒ2|j«y#|j«wxYw)a7 This function is used when reading compressed files. It runs in a spearate thread, reads data from the 'f_from' file-like object, and writes them to the 'f_to' file-like object. 'F_from' may be a urllib object, while 'f_to' is usually stdin of the decompressor process. rN)rArÚwriterU)rOÚf_fromÚf_torrs rÚ _read_threadzTransRead._read_threadãsR€ð!ˆ ð Ø—j’jØ—k‘k *Ó-�ÙØà— ‘ ˜3”ð —j“jð �J‰J�LøˆD�J‰J�Lús „=AÁA%cóL—d„}d„}d„}d„}d„}d„}d„}d„}d „} d „} d „} d „} d } ||j«s||j«r=d|_tjd«rd}nd}||j«rd}�núd} d}�nô||j«s||j«r=d|_tjd«rd}nd}||j«rd}�n™d} d}�n“| |j«s||j«r%d|_d}||j«rd}�nPd} d}�nJ| |j«s||j«r%d|_d}||j«rd}�nd} d}�n|jj d«r d|_d}d}nÚ| |j«s||j«r#d|_d}||j«rd}n˜d} d }n“| |j«s||j«r#d!|_d"}||j«rd#}nQd} d$}nL|j s?t j|jd%j««j|_ y | dk(r|d&z }tj|«std'|›d(|j›d)�«‚| r1tj| «std'| ›d*|j›d)�«‚| r | d+z|z}n|d+z|z}|j rtj}n|jd%j«}tj|d,d-|tj¬.«}|tjk(rl|jd%|j f}t#j$|j&|¬/«|_d,|j(_|j(j-«d,|_|jj1|j2«|j4j1|«y )0zª Detect file compression type and open it with the corresponding compression module, or just plain 'open() if the file is not compressed. cól—|jd«s"|jd«r|jd«syy)z8Returns 'True' if file 'name' is compressed with 'gzip'.z.gzipz.gzú.tar.gzTF©Úendswith©r:s rÚis_gzipz0TransRead._open_compressed_file..is_gzipÿs+€à�}‰}˜WÔ%Ø— ‘ ˜eÔ$¨T¯]©]¸9Ô-EàØr!cóJ—|jd«r|jd«syy)z9Returns 'True' if file 'name' is compressed with 'bzip2'.z.bz2ú.tar.bz2TFrdrfs rÚis_bzip2z1TransRead._open_compressed_file..is_bzip2ó€à�}‰}˜VÔ$¨T¯]©]¸:Ô-FØØr!cóJ—|jd«r|jd«syy)z6Returns 'True' if file 'name' is compressed with 'xz'.z.xzú.tar.xzTFrdrfs rÚis_xzz.TransRead._open_compressed_file..is_xz s€à�}‰}˜UÔ#¨D¯M©M¸)Ô,DØØr!cóJ—|jd«r|jd«syy)z8Returns 'True' if file 'name' is compressed with 'lzop'.z.lzoú.tar.lzoTFrdrfs rÚis_lzopz0TransRead._open_compressed_file..is_lzoprkr!cóJ—|jd«r|jd«syy)z7Returns 'True' if file 'name' is compressed with 'lz4'.z.lz4ú.tar.lz4TFrdrfs rÚis_lz4z/TransRead._open_compressed_file..is_lz4rkr!cóJ—|jd«r|jd«syy)z8Returns 'True' if file 'name' is compressed with 'zstd'.z.zstú.tar.zstTFrdrfs rÚis_zstz/TransRead._open_compressed_file..is_zstrkr!cóJ—|jd«s|jd«ryy)zl Returns 'True' if file 'name' is a tar archive compressed with 'gzip'. rcz.tgzTFrdrfs rÚ is_tar_gzz2TransRead._open_compressed_file..is_tar_gz%s!€ð �}‰}˜YÔ'¨4¯=©=¸Ô+@ØØr!cóŽ—|jd«s3|jd«s"|jd«s|jd«ryy)zm Returns 'True' if file 'name' is a tar archive compressed with 'bzip2'. riz.tbzz.tbz2z.tb2TFrdrfs rÚ is_tar_bz2z3TransRead._open_compressed_file..is_tar_bz2/s:€ð— ‘ ˜jÔ)Ø—=‘= Ô(Ø—=‘= Ô)Ø—=‘= Ô(àØr!cóJ—|jd«s|jd«ryy)z^ Returns 'True' if file 'name' is a tar archive compressed with 'xz'. rmz.txzTFrdrfs rÚ is_tar_xzz2TransRead._open_compressed_file..is_tar_xz>s!€ð �}‰}˜YÔ'¨4¯=©=¸Ô+@ØØr!cóJ—|jd«s|jd«ryy)zl Returns 'True' if file 'name' is a tar archive compressed with 'lzop'. rpz.tzoTFrdrfs rÚ is_tar_lzoz3TransRead._open_compressed_file..is_tar_lzoGs!€ð �}‰}˜ZÔ(¨D¯M©M¸&Ô,AØØr!cóJ—|jd«s|jd«ryy)zk Returns 'True' if file 'name' is a tar archive compressed with 'lz4'. rsz.tlz4TFrdrfs rÚ is_tar_lz4z3TransRead._open_compressed_file..is_tar_lz4Qó!€ð �}‰}˜ZÔ(¨D¯M©M¸'Ô,BØØr!cóJ—|jd«s|jd«ryy)zl Returns 'True' if file 'name' is a tar archive compressed with 'zstd'. rvz.tzstTFrdrfs rÚ is_tar_zstz3TransRead._open_compressed_file..is_tar_zst[r‚r!NÚgzipÚpigzz-d -cÚtarz-x -z -OÚbzip2Úpbzip2z-x -j -Orz-x -J -Or Úlzopz -x --lzo -Oz.zipr ÚfunzipÚr z -x -Ilz4 -Or Úzstdz-dz -x -Izstd -Oéÿÿÿÿz -P -C /zthe "z=" program is not available but it is required decompressing "Ú"z7" program is not available but it is required reading "Ú Tr)ÚshellÚbufsizerGÚstdout)ÚtargetÚargs)r:r<rÚprogram_is_availablerer>rÚfstatrBÚfilenoÚst_sizer;rÚ subprocessÚPIPEÚPopenrGÚ threadingÚThreadr`r@ÚdaemonÚstartrCrEr“r?)rOrgrjrnrqrtrwryr{r}rr�r„ÚarchiverÚ decompressorr•Ú child_stdinÚ child_processs rrNzTransRead._open_compressed_fileøs¬€ò ò ò  ò  ò  ò  ò  ò ò ò ò ò ðˆÙ �T—Y‘YÔ ¡7¨4¯9©9Ô#5Ø$*ˆDÔ !Ü×/Ñ/°Ô7Ø%‘ à%� á�t—y‘yÔ!Ø’à �Ø!’Ù ˜Ÿ ™ Ô "¡h¨t¯y©yÔ&9Ø$+ˆDÔ !Ü×/Ñ/°Ô9Ø'‘ à&� ᘟ ™ Ô"Ø’à �Ø!’Ù �t—y‘yÔ !¡U¨4¯9©9Ô%5Ø$(ˆDÔ !؈LÙ�T—Y‘YÔØ’à �Ø!’Ù ˜Ÿ ™ Ô "¡g¨d¯i©iÔ&8Ø$)ˆDÔ !Ø!ˆLÙ�t—y‘yÔ!Ø’à �Ø$’Ø �Y‰Y× Ñ  Ô 'Ø$)ˆDÔ !Ø#ˆL؉DÙ ˜Ÿ ™ Ô "¡f¨T¯Y©YÔ&7Ø$)ˆDÔ !Ø ˆLÙ�d—i‘iÔ Ø‘à �Ø$‘Ù ˜Ÿ ™ Ô "¡f¨T¯Y©YÔ&7Ø$)ˆDÔ !Ø!ˆLÙ�d—i‘iÔ Ø‘à �Ø%‘à—;’;ÜŸH™H T§\¡\°"Ñ%5×%<Ñ%<Ó%>Ó?×GÑG�” Ø à �uÒ ð �JÑ ˆDô×/Ñ/° Ô=Ýâ1=¸t¿y»yðJóð ñ œK×<Ñ<¸XÔFÝâ+3°T·Y³Yð@óð ñ ؘc‘> DÑ(‰Dà #Ñ%¨Ñ,ˆDà �;Š;Ü$Ÿ/™/‰KàŸ,™, rÑ*×1Ñ1Ó3ˆKä"×(Ñ(Ø ØØØÜ—?‘?ô  ˆ ð œ*Ÿ/™/Ò )ð— ‘ ˜RÑ Ø×#Ñ#ðˆDô&×,Ñ,°D×4EÑ4EÈDÔQˆDŒMØ#'ˆD�M‰MÔ Ø �M‰M× Ñ Ô !àˆŒØ � ‰ ×јM×0Ñ0Ô1Ø ×Ñ×$Ñ$ ]Õ3r!c óz—|j}|j}|j}|j}|r|dz|z}t j d«s t d«‚|r.dd|zddddd d |g }t j d«st d «‚ddddd d d|g}tj|dgz«}|j«|j}|dk7rt|«} t d|| |fz«‚d|zdz|z} tj|| gzd¬«}|j«|jdk7rt d|›d|›d�«‚tj|d|zgztj¬«}|jj|j«|j j|«d|_d|_y)zÒ This function opens a file on a remote host using SSH. The URL has to have this format: "ssh://username@hostname:path". Currently we only support password-based authentication. Ú@Ússhz[the "ssh" program is not available but it is required for downloading over the ssh protocolÚsshpassz-pz-o StrictHostKeyChecking=noz-o ClearAllForwardings=yesz-o ForwardX11=noz-o PubkeyAuthentication=noz-o PasswordAuthentication=yesz_the "sshpass" program is not available but it is required for password-based SSH authenticationz-o PubkeyAuthentication=yesz-o PasswordAuthentication=noz-o BatchMode=yesÚtruerz*cannot connect to "%s": %s (error code %d)ztest -f z && test -r r)r’r�z" on "zW" cannot be read: make sure it exists, is a regular file, and you have read permissionszcat )r“TN)ÚusernameÚpasswordÚpathÚhostnamerr–rršrœrYÚ returncoder2r›rBrEr“r?r>rC) rOÚ parsed_urlrªr«r¬r­Ú popen_argsr¤ÚretcodeÚdecodedÚcommands rÚ _open_url_sshzTransRead._open_url_sshÛs÷€ð×&Ñ&ˆØ×&Ñ&ˆØ�‰ˆØ×&Ñ&ˆÙ Ø #‘~¨Ñ0ˆHô×/Ñ/°Ô6ÜðAóð ñ ðØ�x‘ØØ-Ø,Ø"Ø,Ø/Øð ˆJô×3Ñ3°EÔ:ÜðHóðð Ø-Ø,Ø"Ø-Ø.Ø"Øð ˆJô#×(Ñ(¨°v°hÑ)>Ó?ˆ Ø×ÑÔØ×*Ñ*ˆØ �aŠ<Ü/°Ó8ˆGÜØ<ؘW gÐ.ñ/óð ð˜tÑ# nÑ4°tÑ;ˆÜ"×(Ñ(¨°w°iÑ)?ÈÔUˆ Ø×ÑÔØ × #Ñ # qÒ (Ýò"&¢xð1óð ô#×(Ñ(Ø ˜& 4™-˜Ñ (´·±ô ˆ ð � ‰ ×јM×0Ñ0Ô1à ×Ñ×$Ñ$ ]Ô3؈Œ ؈�r!c óì—d„}ddl}ddlm}ddlm}ddlm}tj|«}|jdk(r|j|«y|j}|j} |sL| sJ|jdvr< tj«} | j|j«} | r | d}| d } |r£| r¡t/|«} |j0r|j›d |j0›�| d<n|j| d<tj2| «}|j5«}|j7d||| «|j9|«}|j;|«}n|j;«}dg|_|j?|«dD]} |jA||¬«}Œd|_)|jTjW«y#t$rY�Œt j"$rG} t$j'd | j(›d | j*›d | j,›�«Yd} ~ �Œld} ~ wwxYw#|jB$r&}|� ||«ntEd|›d|›�«‚Yd}~ŒÔd}~w|$rG}|�)tG|jH|jB«r ||«ntEd|›d|›�«‚Yd}~�Œd}~wtJtL|jNf$r}tEd|›d|›�«‚d}~w|jP$rtEd|z«‚wxYw)zV Open an URL 'url' and return the file-like object of the opened URL. có4—tjd|z«y)z… This is a small helper function for printing a warning if we cannot open the URL for some time. z^failed to open the URL with %d sec timeout, is the proxy configured correctly? Keep trying ...N)Ú_logÚwarning©Útimeouts rÚ_print_warningz+TransRead._open_url.._print_warning;s€ô �L‰Lð>Ø@GñHõ r!rN)Ú http_client)Úrequest)ÚURLErrorr§)ÚhttpÚhttpsr)zError parsing line z of z: Ú:r)z User-Agentz Mozilla/5.0)é Nr¹zcannot open URL 'r9zWcannot open URL '%s': server responds with an HTTP status code that we don't understandT),ÚsocketÚ six.movesr¼Úsix.moves.urllibr½Úsix.moves.urllib.errorr¾ÚurlparseÚschemer´rªr«ÚnetrcÚauthenticatorsr­ÚFileNotFoundErrorÚnetcÚNetrcParseErrorr·ÚerrorÚlinenoÚfilenameÚmsgÚlistÚportÚ urlunparseÚHTTPPasswordMgrWithDefaultRealmÚ add_passwordÚHTTPBasicAuthHandlerÚ build_openerÚ addheadersÚinstall_openerrIrºrÚ isinstanceÚreasonrJÚ ValueErrorÚ InvalidURLÚ BadStatusLiner>rBrE)rOÚurlr»rÃÚhttplibÚurllibr¾r¯rªr«ÚnÚauthÚeÚnew_urlÚpassword_managerÚ auth_handlerÚopenerrºÚf_objrQs rrMzTransRead._open_url6sÇ€ò  ó å4Ý6Ý3ä×&Ñ& sÓ+ˆ à × Ñ  Ò %à × Ñ ˜zÔ *Ø à×&Ñ&ˆØ×&Ñ&ˆá¡¨Z×->Ñ->ÐBSÑ-Sð VÜ—K‘K“M�Ø×'Ñ'¨ ×(;Ñ(;Ó<�ÙØ# A™w�HØ# A™w�Hñ ™ô˜:Ó&ˆGØ�ŠØ(2×(;Ó(;¸Z¿_º_ÐM�˜’ à'×0Ñ0�˜‘ Ü×%Ñ% gÓ.ˆCð &×EÑEÓGÐ Ø × )Ñ )¨$°°X¸xÔ HØ!×6Ñ6Ð7GÓHˆLØ×(Ñ(¨Ó6‰Fà×(Ñ(Ó*ˆFà:Ð;ˆÔØ×јfÔ%ó"ˆGð ØŸ ™  C°˜ Ó9‘ð"ð.ˆŒ Ø � ‰ ×јEÕ"øôw%ò ÚÜ×'Ñ'ò VÜ— ‘ Ð0°·±° ¸$¸q¿z¹z¸lÈ"ÈQÏUÉUÈGÐT×UÒUûð VûðJ—>‘>ò IØÐ&Ù" 7Õ+åºcÁ3Ð GÓHÐHô,ûðò IàÐ&¬:°c·j±jÀ&Ç.Á.Ô+QÙ" 7Õ+åºcÁ3Ð GÓHÐHõ,ûôœZ¨×);Ñ);Ð<ò Eݺ#¹sÐCÓDÐDûØ×(Ñ(ò Üð@ØBEñFóðð úsNÁ;;GÆ H*Ç H'ÇH'Ç rTrBÚAttributeError)rOr:s rÚ __getattr__zTransRead.__getattr__¾s4€ð × Ñ  FÒ *°4·;²;ܘ4Ÿ<™<¨Ñ+¨TÓ2Ð 2ä Ð r!N)rŽ)r#r$r%r&rRr[r`rNr´rMrrrríròrUr÷r'r!rr4r4—sN„ñò 0%òd'ò(ò*a4òFYòva#óF ð#%§+¡+ó ò+òó !r!r4)r&rrïrKrFÚloggingr�ršrÉrÅrrÇrŒrÚ getLoggerr#r·ÚSUPPORTED_COMPRESSION_TYPESrr Ú Exceptionrr2Úobjectr4r'r!rÚrýsrðñ" ó Û Û Û ÛÛÛÛ Ý.Ýà€w×јÓ"€ð"Ðð":<¿¹ó#ôL ˆIô òô