Skip to content

FUSE: Implement rclone integration #13

@efimsky

Description

@efimsky

Parent Issue

Part of #118 (FUSE-based Archive & Remote Browsing Feature)

Summary

Add rclone support for browsing FTP, S3, GCS, Azure, Dropbox and 40+ other cloud providers.

Dependencies

Requires #122 (SFTP remote connections)

Tasks

MountManager

  • Implement list_rclone_remotes() -> list[str]

    • Run rclone listremotes
    • Parse output (one remote per line, with trailing colon)
    • Return list of remote names
  • Implement mount_rclone(remote_spec: str) -> Path | None

    • Parse remote spec (e.g., "myremote:", "myremote:bucket/path")
    • Generate mount point using hash
    • Execute rclone mount remote_spec /mount/point --daemon
    • Wait briefly for mount to establish
    • Track in active_mounts with mount_type='rclone'
    • Return mount point or None on failure
  • Implement setup_rclone_remote(name: str, type: str, config: dict) -> bool

    • Create new rclone remote via rclone config create
    • Return success boolean
  • Implement can_mount_rclone() -> bool

    • Return self.tools.rclone

Menu Integration

  • Add new Action enum values:

    RCLONE_REMOTES = auto()
    RCLONE_S3 = auto()
    RCLONE_GCS = auto()
    RCLONE_AZURE = auto()
    RCLONE_FTP = auto()
  • Expand Connect menu:

    Menu('Connect', [
        MenuItem('SFTP...', 'connect_sftp'),
        MenuItem('─────────────', '', enabled=False),  # Separator
        MenuItem('Saved remotes...', 'rclone_remotes'),
        MenuItem('New S3...', 'rclone_s3'),
        MenuItem('New GCS...', 'rclone_gcs'),
        MenuItem('New Azure...', 'rclone_azure'),
        MenuItem('New FTP...', 'rclone_ftp'),
        MenuItem('─────────────', '', enabled=False),  # Separator
        MenuItem('Unmount current', 'unmount'),  # For Phase 6
    ])
  • Add action mappings to MENU_ACTION_MAP

App Methods

  • Handle Action.RCLONE_REMOTES - show list of configured remotes

  • Handle Action.RCLONE_S3 - prompt for S3 credentials

  • Handle Action.RCLONE_GCS - prompt for GCS credentials

  • Handle Action.RCLONE_AZURE - prompt for Azure credentials

  • Handle Action.RCLONE_FTP - prompt for FTP host/credentials

  • Implement App._show_rclone_remotes():

    • Get list from mount_manager.list_rclone_remotes()
    • Show selection dialog
    • Mount selected remote
    • Navigate to mount point
  • Implement App._prompt_rclone_setup(type: str):

    • Show guided prompts for remote type
    • Collect required credentials
    • Call mount_manager.setup_rclone_remote()

Dynamic Menu State

  • Disable rclone menu items when rclone not available
  • Show remote count in "Saved remotes..." item if remotes exist

Testing

  • Test list_rclone_remotes() parses output correctly
  • Test mount_rclone() calls rclone with correct arguments
  • Test mount_rclone() tracks mount with mount_type='rclone'
  • Test setup_rclone_remote() creates remote config
  • Test rclone menu items exist in Connect menu
  • Test menu items disabled when rclone unavailable

Files

  • Modify: tnc/mount.py
  • Modify: tnc/app.py
  • Modify: tnc/menu.py
  • Modify: tests/test_mount.py

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions