mirror of
https://github.com/dredx/prole.git
synced 2026-09-23 12:03:59 +00:00
Major feature additions and infrastructure improvements for the Prole Database Installer, enabling command-line operation and packaged binary distribution. ## Ncurses Terminal Interface - Add installer/ncurses_ui.py: UI primitives (CursesWindow, TerminalConsole, NavFooter, InputField, Checkbox) - Add installer/ncurses_installer.py: Complete terminal UI with all 11 screens - Implement same screen flow as GUI (welcome, deps, network scan, env setup, kerberos, password, build, cluster, scripts, deploy, installer creation) - Add keyboard navigation (arrows, hjkl, vim-style) - Support both GUI and ncurses modes in single binary ## Automatic Display Detection - Add has_display() function to detect GUI availability - Auto-select GUI if display available, ncurses otherwise - Add --gui and --no-gui command-line flags - Fallback to ncurses on GUI failure ## Build System and Packaging - Add Makefile with targets: build, package, clean, test, install - Add scripts/generate_spec.py: PyInstaller spec generator - Add installer.spec: PyInstaller configuration - Automatic PNG to ICNS icon conversion - Create self-contained macOS .app bundle with embedded icon - Support both Intel (x86_64) and Apple Silicon (arm64) ## Embedded Resources - Add get_resource_path() helper for PyInstaller compatibility - Embed all images (proleIcon.png, proleLogo.png, proleLogoSepia.png) - Embed prole-net/prole-scan binary (6.8 MB universal binary) - Embed prole-app/dist/Prole Tools.app (12 MB app bundle) - Embed prole-db/ Docker build context ## Writable Directory Fixes - Create ~/.prole/build/prole-db/ for Docker builds (fixes read-only _MEIPASS) - Create ~/.prole/scan/ for network scan output (fixes API call failures) - Copy build context to writable location before Docker operations - Run prole-scan from writable working directory ## Documentation - docs/build-system.md: Complete build system guide - docs/ncurses-installer.md: Ncurses interface documentation - docs/RELEASE-NOTES.md: Feature overview and release notes - docs/IMAGE-RESOURCES.md: Image resource management - docs/EMBEDDED-RESOURCES.md: Binary and app bundle embedding - docs/DOCKER-BUILD-FIX.md: Docker build hang solution - docs/PROLE-HOME-DIRECTORY.md: ~/.prole directory structure - BUILD.md: Quick build reference ## Key Changes install.py: - Add get_resource_path() for embedded resource resolution - Update image paths to use get_resource_path() - Update Docker build to use ~/.prole/build/prole-db/ - Update network scan to use ~/.prole/scan/ - Add display detection and mode selection - Add --gui and --no-gui argument parsing ## Testing All features tested and verified: - Ncurses interface navigation - Display auto-detection - Resource path resolution - Docker build from package - Network scan from package - Icon conversion and embedding Package size: ~50-100 MB (includes Python runtime, all resources) Disk usage: ~/.prole/ uses ~2-6 MB 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
108 lines
2.3 KiB
Python
Executable File
108 lines
2.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Generate PyInstaller spec file for Prole Database Installer.
|
|
"""
|
|
|
|
SPEC_CONTENT = """# -*- mode: python ; coding: utf-8 -*-
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
block_cipher = None
|
|
|
|
# Get project root
|
|
project_root = Path('.').absolute()
|
|
|
|
# Data files to include
|
|
datas = [
|
|
('installer', 'installer'),
|
|
('conf', 'conf'),
|
|
('etc', 'etc'),
|
|
('img', 'img'),
|
|
('docs', 'docs'),
|
|
('prole-db', 'prole-db'),
|
|
('prole-app/dist/Prole Tools.app', 'prole-app/dist/Prole Tools.app'),
|
|
]
|
|
|
|
# Binaries to include (with execute permissions)
|
|
binaries = [
|
|
('prole-net/prole-scan', 'prole-net'),
|
|
]
|
|
|
|
# Hidden imports
|
|
hiddenimports = [
|
|
'installer',
|
|
'installer.config',
|
|
'installer.build',
|
|
'installer.deploy',
|
|
'installer.screen',
|
|
'installer.main',
|
|
'installer.workstation',
|
|
'installer.ncurses_ui',
|
|
'installer.ncurses_installer',
|
|
'curses',
|
|
'_curses',
|
|
]
|
|
|
|
a = Analysis(
|
|
['install.py'],
|
|
pathex=[],
|
|
binaries=binaries,
|
|
datas=datas,
|
|
hiddenimports=hiddenimports,
|
|
hookspath=[],
|
|
hooksconfig={},
|
|
runtime_hooks=[],
|
|
excludes=[],
|
|
win_no_prefer_redirects=False,
|
|
win_private_assemblies=False,
|
|
cipher=block_cipher,
|
|
noarchive=False,
|
|
)
|
|
|
|
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
|
|
|
|
exe = EXE(
|
|
pyz,
|
|
a.scripts,
|
|
a.binaries,
|
|
a.zipfiles,
|
|
a.datas,
|
|
[],
|
|
name='prole-installer',
|
|
debug=False,
|
|
bootloader_ignore_signals=False,
|
|
strip=False,
|
|
upx=True,
|
|
upx_exclude=[],
|
|
runtime_tmpdir=None,
|
|
console=True, # Enable console for --no-gui mode
|
|
disable_windowed_traceback=False,
|
|
target_arch=None,
|
|
codesign_identity=None,
|
|
entitlements_file=None,
|
|
icon='build/prole.icns',
|
|
)
|
|
|
|
# Create macOS app bundle
|
|
app = BUNDLE(
|
|
exe,
|
|
name='Prole Installer.app',
|
|
icon='build/prole.icns',
|
|
bundle_identifier='com.prole.installer',
|
|
info_plist={
|
|
'CFBundleName': 'Prole Installer',
|
|
'CFBundleDisplayName': 'Prole Database Installer',
|
|
'CFBundleVersion': '1.0.0',
|
|
'CFBundleShortVersionString': '1.0.0',
|
|
'NSHighResolutionCapable': 'True',
|
|
'LSMinimumSystemVersion': '10.13.0',
|
|
},
|
|
)
|
|
"""
|
|
|
|
if __name__ == '__main__':
|
|
with open('installer.spec', 'w') as f:
|
|
f.write(SPEC_CONTENT)
|
|
print("Generated installer.spec")
|