feat: uploader.py の追加(ローカル→リモートの rsync 送信)

概要

fetcher.py(remote → local)、backuper.py(local → local/external)に続く3つ目の転送方向として、uploader.py(local → remote)を追加する提案です。ローカルの指定したファイル/ディレクトリを rsync でリモートサーバーへ送信できるようにします。

背景

現在の RsyncTaskConfighost を常に source側 のリモート指定として扱う設計になっており(rsync_source プロパティが host:source を組み立てる一方、rsync_target は常にローカルパスとしてそのまま返す)、backuper.pysource/target の両方をローカルパスとして verify_directory() で検証しています。

そのため、「ローカル→リモート」方向の転送(例: ローカルのビルド成果物やログをリモートサーバーへ push する)を現状の設定ファイル・コードでは表現できません。

提案内容

設定モデル(config.py)

  • FnbConfigupload: dict[str, RsyncTaskConfig] = {} を追加
  • get_enabled_tasks/get_task_by_label の型を Literal["fetch", "backup"]Literal["fetch", "backup", "upload"] に拡張
  • RsyncTaskConfig 自体(rsync_source/rsync_target プロパティ)には変更を加えない — host付与のロジックは uploader.py 側にローカルなヘルパーとして持たせ、fetch/backup の既存動作への影響を避ける

src/fnb/uploader.py (新規)

fetcher.py の鏡写しの実装:

  • gear.run_rsync() を使用
  • ローカル側である source のみ verify_directory() で検証(target はリモートの可能性があるため検証しない — fetcher.py が逆に target のみ検証するのと対称)
  • SSH パスワード自動化(get_ssh_password/get_timeout)も fetcher.py と同様に必要

cli.py

  • fnb upload LABEL コマンドを新設(fetch/backup と同じオプション体系: --dry-run, --create-dirs, --ssh-password, --config, ログ系オプション)

reader.py / generator.py

  • fnb status に upload タスクのテーブル表示を追加
  • fnb init のテンプレート(assets/config.toml)に [upload.SECTION_NAME] の例を追加

該当箇所

  • src/fnb/config.py
  • src/fnb/uploader.py(新規)
  • src/fnb/cli.py
  • src/fnb/reader.py
  • src/fnb/generator.py
  • src/fnb/assets/config.toml