Чтение и хеширование файла из SMB с помощью PythonPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Чтение и хеширование файла из SMB с помощью Python

Сообщение Anonymous »

Я хочу написать надежную программу копирования на Python для копирования из корзины GCP (с использованием Pub/Sub) в NFS SMB.
Мне удалось использовать библиотеку Python smbclient, в частности методы stat, makedirs и open_file. Я использую режимы open_file wb и rb, потому что я использую файлы csv, и у них нет EOF.
Но у меня есть проблема: open_file в read() в hashlib. md5() приводит к тому, что read() застревает в моем докере.
У меня были большие проблемы с написанием моего первого smbclient, и я знаю, что эта библиотека/протокол отвратительны, если не сказать больше. р>
Я также где-то читал, что время между серверами может играть роль, у меня NFS — PST, а докер — GMT, одно и то же время (разница в одну минуту).
Я этого не сделал. найти хорошие примеры в Интернете, документация https://pypi.org/project/smbprotocol/ плохая.
Здесь подробный код:

Код: Выделить всё

def sign_md5_base64_from_file(content):

md5_hash = hashlib.md5()

chunk_size = 4096
for i in range(0, len(content), chunk_size):
md5_hash.update(content[i:i + chunk_size])

return base64.b64encode(md5_hash.digest()).decode('utf-8')

Код: Выделить всё

def send_file(chemin_samba):

[variables initializations]
try:
smbclient.stat(fullname_csv)
fichier_existe = True
except smbprotocol.exceptions.SMBOSError as e:
if e.ntstatus == "0xc0000034":
fichier_existe = False
else:
print(f"An error occurred: {e}")

smbclient.makedirs(dossier_destination, exist_ok=True)

if fichier_existe:
time.sleep(1)
with smbclient.open_file(fullname_csv, mode="rb", share_access="r") as remote_file:
remote_content = remote_file.read()
samba_md5 = utils.sign_md5_base64_from_file(remote_content)

local_md5 = utils.sign_md5_base64_from_file_path(variables.CHEMIN_CSV_LOCAL)

if local_md5 == samba_md5:
return
else:

else:
logger.info(f"Ecriture du fichier CSV dans le répertoire distant - fullname : {fullname_csv} - nom du csv : {nom_csv}")
with open(variables.CHEMIN_CSV_LOCAL, "rb") as local_file:
with smbclient.open_file(fullname_csv, mode="wb") as remote_file:
remote_file.write(local_file.read())
logger.info(f"Fichier {nom_csv} envoyé avec succès à {chemin_samba}.")

А вот мой журнал:

Код: Выделить всё

INFO:file_sender: makedirs OK
INFO:smbprotocol.open:Session: nfs_smb OK, Tree Connect:
DEBUG:smbprotocol.transport:Socket recv() returned 4 bytes (total 4)
DEBUG:smbprotocol.transport:Socket recv(160) (total 160)
DEBUG:smbprotocol.transport:Socket recv() returned 160 bytes (total 160)
DEBUG:smbprotocol.transport:Socket recv(4) (total 4)
INFO:smbprotocol.open:Session: nfs_smb_truenas, Tree Connect:  - receiving SMB2 Close Response
INFO:file_sender: download file
INFO:smbprotocol.open:Session: , Tree Connect: nfs_smb - receiving SMB2 Create Response
DEBUG:smbprotocol.transport:Socket recv() returned 4 bytes (total 4)
DEBUG:smbprotocol.transport:Socket recv(152) (total 152)
DEBUG:smbprotocol.transport:Socket recv() returned 152 bytes (total 152)
DEBUG:smbprotocol.transport:Socket recv(4) (total 4)
DEBUG:smbprotocol.open:SMB2CreateResponse:
structure_size = 89
oplock_level = (0) SMB2_OPLOCK_LEVEL_NONE
flag = 0
create_action = (1) FILE_OPENED
creation_time = 2024-12-12 10:23:27.226642+00:00
last_access_time = 2024-12-12 10:23:27.226642+00:00
last_write_time = 2024-12-12 10:23:27.234844+00:00
change_time = 2024-12-12 10:23:27.234844+00:00
allocation_size = 45568
end_of_file = 44909
file_attributes = (32) FILE_ATTRIBUTE_ARCHIVE
reserved2 = 0
file_id = 3D D2 B6 EF 00 00 00 00 13 DF 5B 6B 00 00 00 00
create_contexts_offset = 0
create_contexts_length = 0
buffer = []

Raw Hex:

INFO:file_sender:Open SMB RB OK
DEBUG:smbclient._io:Read 0 -65536.
INFO:smbprotocol.open:Session: nfs_smb_truenas, Tree Connect ID:  NAS SMB
DEBUG:smbprotocol.transport:Socket recv() returned 4 bytes (total 4)
DEBUG:smbprotocol.transport:Socket recv(44989) (total 44989)
DEBUG:smbprotocol.transport:Socket recv() returned 13028 bytes (total 44989)
DEBUG:smbprotocol.transport:Socket recv(31961) (total 44989)

[logs gets stuck here until timeout or if i docker stop my_docker]

В SMB NFS есть блокировка моего CSV, которая не исчезает (кажется логичным, поскольку .read() застрял):

Код: Выделить всё

[~] smbstatus -L
Locked files:
Pid          User(ID)   DenyMode   Access      R/W        Oplock           SharePath   Name   Time
---------------------------------------------------------------------------
58763        1000       DENY_WRITE 0x89        RDONLY     NONE             /mnt/pool1/nfs_smb   path_to_file/test.csv    date PST
Судя по тому, что я анализирую в своих журналах, код застревает в части remote_file.read()
Я хотелось бы иметь возможность прочитать удаленный файл SMB, если он существует, затем хешировать его и сравнить мои локальные и удаленные файлы MD5.
Если он не существует, я создаю каталоги и затем запишите файл.

Подробнее здесь: https://stackoverflow.com/questions/792 ... ith-python
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как установить библиотеку SMB на Raspberry Pi 5 с помощью Python 3.11
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Как получить доступ к файлу на удаленном диске SMB с помощью Jupyter Notebook?
    Гость » » в форуме Python
    0 Ответы
    30 Просмотры
    Последнее сообщение Гость
  • Как использовать хеширование паролей с помощью bcrypt в Android Java?
    Anonymous » » в форуме JAVA
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Как использовать хеширование паролей с помощью bcrypt в Android Java?
    Anonymous » » в форуме JAVA
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Как использовать хеширование паролей с помощью bcrypt в Android Java?
    Anonymous » » в форуме Android
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»