#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Upload GUI installer to KS3 object storage - Target directory: installers/ - Set proper HTTP headers for browser download """ import os import sys import logging from pathlib import Path from ks3.connection import Connection # Configure logging logging.basicConfig( level=logging.INFO, format='%(asctime)s [%(levelname)s] %(message)s' ) logger = logging.getLogger(__name__) # KS3 Configuration (using actual project config) KS3_ACCESS_KEY = 'AKLT0Ey7Nq7ZSXykki0X0RGG' KS3_SECRET_KEY = 'OONxkt9wwJa1FIco21vCbirs1HB6AGzDWdRyV0k2' KS3_ENDPOINT = 'ks3-cn-guangzhou.ksyuncs.com' # Guangzhou region KS3_BUCKET = 'shuidrop-chat-server' KS3_IS_SECURE = True # Use HTTPS KS3_PREFIX = 'installers/' def get_ks3_connection(): """Get KS3 connection""" try: connection = Connection( KS3_ACCESS_KEY, KS3_SECRET_KEY, host=KS3_ENDPOINT, is_secure=KS3_IS_SECURE, timeout=300, ) logger.info(f"KS3 connection established: {KS3_ENDPOINT}") return connection except Exception as e: logger.error(f"KS3 connection failed: {e}") return None def find_latest_installer(): """Find the latest generated installer""" project_root = Path(__file__).parent.parent.parent installer_dir = project_root / 'installer' / 'output' if not installer_dir.exists(): logger.error(f"Installer directory not found: {installer_dir}") return None installers = list(installer_dir.glob('*.exe')) if not installers: logger.error(f"No installer files found in: {installer_dir}") return None latest_installer = max(installers, key=lambda p: p.stat().st_mtime) file_size_mb = latest_installer.stat().st_size / 1024 / 1024 logger.info(f"Found installer: {latest_installer.name}") logger.info(f"File size: {file_size_mb:.2f} MB") return latest_installer def upload_installer(connection, installer_path): """Upload installer to KS3""" try: bucket = connection.get_bucket(KS3_BUCKET) ks3_key = f"{KS3_PREFIX}{installer_path.name}" logger.info(f"Starting upload to KS3...") logger.info(f"Target path: {ks3_key}") key = bucket.new_key(ks3_key) with open(installer_path, 'rb') as f: key.set_contents_from_file( f, headers={ 'Content-Type': 'application/octet-stream', 'Content-Disposition': f'attachment; filename="{installer_path.name}"', 'Cache-Control': 'public, max-age=3600', 'x-kss-storage-class': 'STANDARD' } ) key.set_acl('public-read') # Generate download URL (using HTTPS) protocol = 'https' if KS3_IS_SECURE else 'http' download_url = f"{protocol}://{KS3_ENDPOINT}/{KS3_BUCKET}/{ks3_key}" logger.info(f"Upload successful!") logger.info(f"Download URL: {download_url}") return download_url except Exception as e: logger.error(f"Upload failed: {e}") import traceback logger.error(traceback.format_exc()) return None def main(): """Main function""" logger.info("=" * 70) logger.info("Starting GUI installer upload to KS3") logger.info(f"KS3 Endpoint: {KS3_ENDPOINT}") logger.info(f"Bucket: {KS3_BUCKET}") logger.info(f"Target directory: {KS3_PREFIX}") logger.info("=" * 70) installer_path = find_latest_installer() if not installer_path: return 1 connection = get_ks3_connection() if not connection: return 1 download_url = upload_installer(connection, installer_path) if not download_url: return 1 logger.info("=" * 70) logger.info("Task completed successfully!") logger.info(f"Installer: {installer_path.name}") logger.info(f"Download URL: {download_url}") logger.info("=" * 70) return 0 if __name__ == '__main__': sys.exit(main())