← back to Kravet Sheet Sync 2026 04 20

__pycache__/kravet_ftp_mirror.cpython-314.pyc

53 lines

+
p��i����Rt^RIt^RIt^RIt^RIt^RIt^RIt^RIt^RIt^RI	H
t
Ht^RIH
t
^RItRt!RR4tRtRtR	t]R
8Xd]!4R#R# ]d(]P,!4]P.!^4R#i;i)a@
Mirror Kravet SFTP (ftp.kravet.com:22) to local disk.

Strategy:
- 8 worker threads, each with its own paramiko Transport (SFTP needs 1 session per thread)
- Atomic writes: download to <path>.tmp, rename on success
- Resume: skip files where local size == remote size
- Progress: JSONL log line per completed file + periodic summary
- Crash-safe: re-running continues from where it left off

Run:
  source /root/.kravet-sftp.env && \
  python3 kravet_ftp_mirror.py --dest /root/kravet-ftp-mirror \
                               --threads 8 --log /root/kravet-ftp-mirror.log
N)�ThreadPoolExecutor�as_completed)�Queuec��/p\V4;_uu_4pVFLpVP4pV'dVPR4'dK4VPR4wrEpWaV&KN	RRR4V# +'giT#;i)�#�=N)�open�strip�
startswith�	partition)�path�env�f�line�k�_�vs&      �kravet_ftp_mirror.py�load_envrsn��
�C�	
�d���q��D��:�:�<�D��4�?�?�3�/�/���N�N�3�'�E�A����F�	�
��J�

���J�s�4A3�A3�3B	c�0a�]tRt^"toRtRtRtRtVtR#)�SftpPoolz?One paramiko Transport + SFTPClient per thread, lazily created.c�t�WW43wVnVnVnVn\P
!4VnR#�N)�host�port�user�password�	threading�local�_local)�selfrrrrs&&&&&r�__init__�SftpPool.__init__$s+��9=�T�9S�6��	�4�9�d�i����o�o�'���c�<a�\SPRR4pVeV#\P!SPSP
34pVP
^4VPSPSPR7VSPn
\PPV4SPnSPP # \PPd$TPSPT3Rl4L�i;i)�sftpN)�usernamerc�F<�VUu.uFpSPNK	up#uupir)r)�a�b�prr s&&& �r�<lambda>�SftpPool.get.<locals>.<lambda>1s���PQ�8R�PQ�1����PQ�8R��8Rs�)�getattrr�paramiko�	Transportrr�
set_keepalive�connectrr�
ssh_exception�BadAuthenticationType�auth_interactive�	transport�
SFTPClient�from_transportr%)r �c�tsf  r�get�SftpPool.get(s�����D�K�K���.���=��H�����	�	�4�9�9�5�6��	�����	T�
�I�I�t�y�y�4�=�=�I�A�!"�����#�.�.�=�=�a�@������{�{�����	�%�%�;�;�	T�
���t�y�y�*R�S�	T�s�'C�?D�D)rrrrrN)	�__name__�
__module__�__qualname__�__firstlineno__�__doc__r!r:�__static_attributes__�__classdictcell__)�
__classdict__s@rrr"s����I�(� � r#rc��VPV4pTF�pTPR4R,TP,p\
P!TP;'g^4'd\YT4KjTPYeP;'g^34K�	R# \dp\RTRT2RR7Rp?R#Rp?ii;i)z:Recursive walk; appends (remote_path, size) tuples to out.z[walk-err] �: T��flushN�/)�listdir_attr�	Exception�print�rstrip�filename�stat�S_ISDIR�st_mode�walk_remote�append�st_size)r%�root�out�entries�er(r*s&&&    rrQrQ8s�����#�#�D�)�����K�K���s�"�Q�Z�Z�/���<�<��	�	���Q�'�'����%��J�J��9�9�>�>��*�+�����
��D�6��A�3�'�t�4����s�B+�+C�6C�Cc�b�\PPW1PR44p\PP	V4'd)\PPV4V8XdRV3#\P!\PPV4RR7VR,pVP4pVPW4\PPV4V8wd\P!V4R#\P!WT4RV3#)z6Download one file atomically. Returns (status, bytes).rH�skipT��exist_okz.tmp�ok)�
size_mismatch�)�osr�join�lstrip�exists�getsize�makedirs�dirnamer:�remove�replace)�pool�remote�size�destr�tmpr%s&&&&   r�download_onermGs����G�G�L�L��}�}�S�1�2�E�	�w�w�~�~�e���������!7�4�!?��t�|���K�K�������&��6�
�&�.�C��8�8�:�D��H�H�V��	�w�w���s��t�#�
�	�	�#��!�!��J�J�s����:�r#c�	aa�\P!4pVPRRR7VPR\^R7VPRRR7VPRRR7VPR	R
.R8OR7VP	4o\SP4p\VR,\VR
,4VR,VR,4o\RSPR2RR7\P!4p.pSP4pSPFp\VRV,V4K	\R\V4R
R\RV44R,R,R,R
R\P!4V,
R
R2RR7\P !SP"RR7^p^p^p^p	\P!4p\$P&!4p
\)SP*R^R7pVV3R lp\-SP.R!7;_uu_4p
VUUu.uFwr�V
P1W�V4NK	ppp\3V4EFWpVP54wppppT
;_uu_4VR"8XdV^,
qiV,
p	MVR#8XdV^,
pM	V^,
pVP7\8P:!R$\\P!44R%VR&VR'VR(V/4R),4Wg,V,pVR*,^8Xd�\P!4V,
pV	\=^V4,R,R,p\R+VR
R\V4R
R,VR
R-VR
R.VR
R/V	R,R,R,R
R0VR1
R2VR
R2RR7R3R3R34EKZ	R3R3R34\P!4V,
pV	\=^V4,R,R,p\R4VR
R-VR
R.VR
R/V	R,R,R,R
R5VR
R6VR1
R72
RR7VP?4R3#uuppi +'giEK;i +'giL�;i)9z--destT)�requiredz	--threads)�type�defaultz--logz--envz/root/.kravet-sftp.env)rqz	--subdirs�*)�nargsrq�KRAVET_SFTP_HOST�KRAVET_SFTP_PORT�KRAVET_SFTP_USER�KRAVET_SFTP_PASSz[walk] listing z ...rFrHz[walk] �,z files  c3�*"�TF	wrVx�K	R#5ir�)�.0r�ss&  r�	<genexpr>�main.<locals>.<genexpr>ms���$�e�s�q��e�s�iz.2fz GB  z.0fr|rZr()�	bufferingc�<�\SWSP4wr#WVR3# \d)pTR^\T4PRT23uRp?#Rp?ii;i)N�errrE)rmrkrJrpr<)rirj�status�nbrW�argsrhs&&   ��r�worker�main.<locals>.workerzsa���	B�%�d�F�$�)�)�D�J�F��B��-�-���	B��E�1��a��)9�)9�(:�"�Q�C�&@�A�A��	B�s�!�A�A�	A�A)�max_workersr\rYr9rir��bytes�error�
i��[z] ok=z skip=z fail=z  zGB  z.1fz MB/s  Nz
[DONE] ok=z GB in zs  avg z MB/s)�BF�KF�LJ) �argparse�ArgumentParser�add_argument�int�
parse_argsrr
rrK�subdirs�timer:rQ�len�sumr_rdrkr�Lockr�logr�threads�submitr�result�write�json�dumps�max�close)�apr
�t0�filesr%�sub�done�skipped�failed�bytes_dl�lock�log_fr��ex�rr|�futsrrir�r�r��
total_done�el�rate_mbr�rhs                         @@r�mainr�Xs����	�	 �	 �	"�B��O�O�H�t�O�,��O�O�K�c�1�O�5��O�O�G�d�O�+��O�O�G�%=�O�>��O�O�K�s�4D�O�E�
�=�=�?�D�
�4�8�8�
�C��C�*�+�S��5G�1H�-I��*�+�S�1C�-D�F�D�
�O�D�L�L�>��
.�d�;�	
����B��E��8�8�:�D��|�|���D�#��)�U�+��	�G�C��J�q�>��
�$�e�$�
$�T�
)�$�
.�t�
3�C�8��
�Y�Y�[��^�C� ��#�*.�0�
�K�K��	�	�D�)��D��G�
�F��H�	
����B��>�>��D�����3�!�,�E�B�
����	5�	5��38�9�5�C�A��	�	�&�Q�'�5��9��d�#�A�&'�h�h�j�#�F�F�B�����T�>�$�!�)�$��^�X��v�%�'�Q�,�'�*0�A�+�&����D�J�J���T�Y�Y�[�)��f��f��R��S�(���
��"�^�f�4�
���#�q�(�����r�)�B�&��Q���3�d�:�T�A�G��A�j��^�1�S��Z��N�; � $�Q�x�v�g�a�[��v�a�j��%�d�]�4�/��4�S�9��$�S�M����H�A�	'�/3�	4���$�
6�2
����r�	�B���Q���#�d�*�T�1�G�	�L��a���w�q�k���q�z��
�d�]�4�
��
$�S�)���C��9���
�U�$�+/�1�
�K�K�M��;:�����	
6�	5�s7�3Q-�9Q
�1Q-�D,Q�3
Q-�Q-�Q*�#
Q-�-Q=	�__main__)r@r�r�r_rN�sysrr��	traceback�concurrent.futuresrr�queuerr.rrrQrmr�r<rJ�	print_exc�exitrzr#r�<module>r�s����A�@�@�@�?���� � �,,�
�"G�T�z�������������������s�A�*B�B