#!/usr/bin/env python3 """ Development-Setup für MYP Druckerverwaltungssystem Startet das System im Development-Modus ohne /opt/myp-Deployment Verwendung: python setup_development.py python setup_development.py --port 5000 python setup_development.py --debug """ import os import sys import subprocess import argparse from pathlib import Path def print_development_banner(): """Zeigt den Development-Banner""" banner = f""" {'='*70} 🔧 MYP DEVELOPMENT SETUP {'='*70} 🚀 Environment: Development (Local) 🔒 Security: Relaxed (für Development) 🌐 Network: HTTP (localhost) ⚡ Performance: Debug-optimiert 📊 Monitoring: Development-Logging 🎯 Modus: Development + Debug 📁 Arbeitsverzeichnis: {os.getcwd()} {'='*70} """ print(banner) def check_development_requirements(): """Prüft Development-Voraussetzungen""" print("🔍 Prüfe Development-Voraussetzungen...") requirements = [] # Python-Version prüfen if sys.version_info < (3, 8): requirements.append("❌ Python 3.8+ erforderlich") return False else: requirements.append("✅ Python-Version OK") # Erforderliche Dateien prüfen required_files = [ 'app.py', 'models.py', 'utils/settings.py', 'requirements.txt' ] missing_files = [] for file in required_files: if os.path.exists(file): requirements.append(f"✅ {file}") else: requirements.append(f"❌ {file} fehlt") missing_files.append(file) # Node.js und npm prüfen try: subprocess.run(['node', '--version'], capture_output=True, check=True) requirements.append("✅ Node.js verfügbar") except (subprocess.CalledProcessError, FileNotFoundError): requirements.append("❌ Node.js nicht gefunden") missing_files.append("Node.js") try: subprocess.run(['npm', '--version'], capture_output=True, check=True) requirements.append("✅ npm verfügbar") except (subprocess.CalledProcessError, FileNotFoundError): requirements.append("❌ npm nicht gefunden") missing_files.append("npm") # CSS-Build prüfen if os.path.exists('static/css/tailwind.min.css'): requirements.append("✅ CSS bereits gebaut") else: requirements.append("⚠️ CSS muss gebaut werden") # Python-Dependencies prüfen try: import flask requirements.append("✅ Flask verfügbar") except ImportError: requirements.append("❌ Flask nicht installiert") missing_files.append("Flask") # Datenbank-Verzeichnis prüfen if os.path.exists('instance'): requirements.append("✅ Datenbank-Verzeichnis") else: requirements.append("⚠️ Instance-Verzeichnis wird erstellt") os.makedirs('instance', exist_ok=True) requirements.append("✅ Instance-Verzeichnis erstellt") for req in requirements: print(f" {req}") if missing_files: print(f"\n❌ FEHLENDE ABHÄNGIGKEITEN: {', '.join(missing_files)}") return False print("✅ Alle Voraussetzungen erfüllt\n") return True def install_python_dependencies(): """Installiert Python-Dependencies""" print("📦 Installiere Python-Dependencies...") try: subprocess.run([ sys.executable, '-m', 'pip', 'install', '-r', 'requirements.txt' ], check=True) print("✅ Python-Dependencies installiert\n") return True except subprocess.CalledProcessError as e: print(f"❌ Fehler bei Python-Installation: {e}") return False def build_css(): """Baut das CSS mit Tailwind""" print("🎨 Baue CSS mit Tailwind...") try: # Prüfe ob node_modules existiert if not os.path.exists('node_modules'): print(" Installiere npm-Dependencies...") subprocess.run(['npm', 'install'], check=True) # Baue CSS subprocess.run(['npm', 'run', 'build'], check=True) print("✅ CSS erfolgreich gebaut\n") return True except subprocess.CalledProcessError as e: print(f"❌ Fehler beim CSS-Build: {e}") return False def set_development_environment(): """Setzt Development-Umgebungsvariablen""" print("🔧 Konfiguriere Development-Environment...") # Development-Environment setzen os.environ['FLASK_ENV'] = 'development' os.environ['FLASK_DEBUG'] = '1' os.environ['USE_PRODUCTION_CONFIG'] = 'false' os.environ['DEVELOPMENT_MODE'] = 'true' # Logging os.environ['LOG_LEVEL'] = 'DEBUG' # Performance (relaxed für Development) os.environ['USE_MINIFIED_ASSETS'] = 'false' os.environ['DISABLE_ANIMATIONS'] = 'false' os.environ['LIMIT_GLASSMORPHISM'] = 'false' # Sicherheit (relaxed für Development) os.environ['FLASK_SSL_REQUIRED'] = 'false' os.environ['SESSION_SECURE'] = 'false' print(" ✅ Development-Environment konfiguriert") print(" ✅ Debug-Modus aktiviert") print(" ✅ Sicherheit für Development angepasst") print() def start_development_server(port=5000, debug=True): """Startet den Development-Server""" print(f"🚀 Starte Development-Server auf Port {port}...") print(f"🌐 URL: http://localhost:{port}") print("🛑 Stoppen mit Strg+C\n") try: # Setze Port os.environ['FLASK_PORT'] = str(port) os.environ['FLASK_HOST'] = '127.0.0.1' # Nur localhost für Development # Importiere und starte die App from app import main main() except KeyboardInterrupt: print("\n🛑 Development-Server gestoppt") except Exception as e: print(f"\n❌ FEHLER: {str(e)}") sys.exit(1) def main(): """Haupt-Development-Setup-Funktion""" parser = argparse.ArgumentParser(description='MYP Development Setup') parser.add_argument('--port', type=int, default=5000, help='Server-Port (Standard: 5000)') parser.add_argument('--debug', action='store_true', default=True, help='Debug-Modus aktivieren') parser.add_argument('--skip-deps', action='store_true', help='Überspringe Dependency-Installation') parser.add_argument('--skip-css', action='store_true', help='Überspringe CSS-Build') args = parser.parse_args() # Banner anzeigen print_development_banner() # Voraussetzungen prüfen if not check_development_requirements(): print("🛑 Setup abgebrochen - behebe die Fehler und versuche es erneut") sys.exit(1) # Dependencies installieren (falls nicht übersprungen) if not args.skip_deps: if not install_python_dependencies(): print("🛑 Setup abgebrochen - Python-Dependencies konnten nicht installiert werden") sys.exit(1) # CSS bauen (falls nicht übersprungen) if not args.skip_css: if not build_css(): print("🛑 Setup abgebrochen - CSS konnte nicht gebaut werden") sys.exit(1) # Development-Environment setzen set_development_environment() # Development-Server starten start_development_server(port=args.port, debug=args.debug) if __name__ == "__main__": main()