sync errors
This commit is contained in:
@@ -1,12 +1,15 @@
|
|||||||
import io
|
import io
|
||||||
import logging
|
import logging
|
||||||
import posixpath
|
import posixpath
|
||||||
|
import socket
|
||||||
import stat
|
import stat
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import paramiko
|
import paramiko
|
||||||
|
|
||||||
|
CONNECT_TIMEOUT = 30 # seconds for TCP + SSH handshake
|
||||||
|
|
||||||
import db
|
import db
|
||||||
from config import SFTPConfig
|
from config import SFTPConfig
|
||||||
|
|
||||||
@@ -46,12 +49,18 @@ def get_key_fingerprint(pem: str) -> str | None:
|
|||||||
|
|
||||||
|
|
||||||
def _make_transport(cfg: SFTPConfig) -> paramiko.Transport:
|
def _make_transport(cfg: SFTPConfig) -> paramiko.Transport:
|
||||||
transport = paramiko.Transport((cfg.host, cfg.port))
|
log.debug("Opening TCP connection to %s:%s", cfg.host, cfg.port)
|
||||||
|
sock = socket.create_connection((cfg.host, cfg.port), timeout=CONNECT_TIMEOUT)
|
||||||
|
transport = paramiko.Transport(sock)
|
||||||
|
transport.banner_timeout = CONNECT_TIMEOUT
|
||||||
|
transport.handshake_timeout = CONNECT_TIMEOUT
|
||||||
|
log.debug("Starting SSH handshake")
|
||||||
if cfg.auth_method == "key" and cfg.key:
|
if cfg.auth_method == "key" and cfg.key:
|
||||||
key = _load_private_key(cfg.key)
|
key = _load_private_key(cfg.key)
|
||||||
transport.connect(username=cfg.user, pkey=key)
|
transport.connect(username=cfg.user, pkey=key)
|
||||||
else:
|
else:
|
||||||
transport.connect(username=cfg.user, password=cfg.password)
|
transport.connect(username=cfg.user, password=cfg.password)
|
||||||
|
log.debug("SSH authenticated")
|
||||||
return transport
|
return transport
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -35,13 +35,16 @@ def run_sync(limit: int | None = None) -> None:
|
|||||||
counters = dict(zips_found=0, zips_new=0, books_uploaded=0, books_skipped=0, books_errored=0)
|
counters = dict(zips_found=0, zips_new=0, books_uploaded=0, books_skipped=0, books_errored=0)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
log.info("Sync started (limit=%s)", limit)
|
||||||
cfg = config.load()
|
cfg = config.load()
|
||||||
_validate_config(cfg)
|
_validate_config(cfg)
|
||||||
|
log.info("Config OK — work dir: %s", cfg.local_work_dir)
|
||||||
|
|
||||||
work_dir = Path(cfg.local_work_dir)
|
work_dir = Path(cfg.local_work_dir)
|
||||||
work_dir.mkdir(parents=True, exist_ok=True)
|
work_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
log.info("Work dir ready: %s", work_dir)
|
||||||
|
|
||||||
log.info("Listing remote zips at %s@%s:%s", cfg.sftp.user, cfg.sftp.host, cfg.sftp.remote_path)
|
log.info("Connecting to SFTP %s@%s:%s ...", cfg.sftp.user, cfg.sftp.host, cfg.sftp.port)
|
||||||
new_zips = sftp_module.list_new_zips(cfg.sftp)
|
new_zips = sftp_module.list_new_zips(cfg.sftp)
|
||||||
counters["zips_found"] = len(new_zips)
|
counters["zips_found"] = len(new_zips)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user