v1.9.0: S3 server type — bucket/object browser, drag-and-drop upload, resilient transfers

New server type: S3 (MinIO, AWS, any S3-compatible storage)
- core/s3_client.py: boto3 client with auto-reconnect, 10 retries, exponential backoff, multipart upload/download, tcp_keepalive
- gui/tabs/s3_tab.py: object browser (Treeview), bucket selector, folder navigation, drag-and-drop upload from Explorer (windnd), progress bar with %, multi-file upload
- CLI: --s3-buckets, --s3-ls, --s3-upload, --s3-download, --s3-delete with retry
- ServerDialog: access_key, secret_key, bucket fields
- Registration: server_store, connection_factory, status_checker, icons, app, i18n (EN/RU/ZH)
- Fix: build.py cleanup_old_releases now sorts by semver (was lexicographic, broke v1.8.100+)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
chrome-storm-c442
2026-03-03 06:32:03 -05:00
parent f2dc978c57
commit 9b0e4c76a3
19 changed files with 1277 additions and 8 deletions

View File

@@ -19,6 +19,7 @@ _SSH_TYPE = {"ssh"}
_SQL_TYPES = {"mariadb", "mssql", "postgresql"}
_REDIS_TYPE = {"redis"}
_HTTP_TYPES = {"grafana", "prometheus", "winrm"}
_S3_TYPE = {"s3"}
_TCP_TYPES = {"telnet", "rdp", "vnc"}
@@ -60,6 +61,8 @@ class StatusChecker:
return self._check_http(server, "/-/healthy")
if server_type == "winrm":
return self._check_http(server, "/wsman")
if server_type in _S3_TYPE:
return self._check_s3(server)
if server_type in _TCP_TYPES:
return self._check_tcp(server)
@@ -106,6 +109,17 @@ class StatusChecker:
except Exception:
return False
def _check_s3(self, server: dict) -> bool:
"""Check S3 via list_buckets."""
try:
from core.s3_client import S3Client
client = S3Client(server)
result = client.connect()
client.disconnect()
return result
except Exception:
return False
def _check_http(self, server: dict, path: str) -> bool:
"""Check HTTP(S) endpoint."""
try: