141 Zeilen
4.8 KiB
Python
141 Zeilen
4.8 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
SkillMate - Windows-optimierter Haupteinstiegspunkt
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import subprocess
|
|
import time
|
|
import webbrowser
|
|
import signal
|
|
import atexit
|
|
from pathlib import Path
|
|
|
|
class SkillMateStarter:
|
|
def __init__(self):
|
|
self.processes = []
|
|
self.base_dir = Path(__file__).parent.absolute()
|
|
|
|
# Registriere Cleanup-Handler
|
|
atexit.register(self.cleanup)
|
|
if sys.platform != 'win32':
|
|
signal.signal(signal.SIGINT, self.signal_handler)
|
|
signal.signal(signal.SIGTERM, self.signal_handler)
|
|
|
|
def signal_handler(self, signum, frame):
|
|
"""Handle Strg+C und andere Signale"""
|
|
print("\n\n🛑 SkillMate wird beendet...")
|
|
self.cleanup()
|
|
sys.exit(0)
|
|
|
|
def cleanup(self):
|
|
"""Beende alle gestarteten Prozesse"""
|
|
for process in self.processes:
|
|
try:
|
|
if process.poll() is None: # Prozess läuft noch
|
|
if sys.platform == 'win32':
|
|
subprocess.call(['taskkill', '/F', '/T', '/PID', str(process.pid)],
|
|
stdout=subprocess.DEVNULL,
|
|
stderr=subprocess.DEVNULL)
|
|
else:
|
|
process.terminate()
|
|
process.wait(timeout=5)
|
|
except:
|
|
pass
|
|
|
|
def check_node_npm(self):
|
|
"""Prüfe ob Node.js und npm installiert sind"""
|
|
try:
|
|
# Windows-spezifische Prüfung
|
|
if sys.platform == 'win32':
|
|
subprocess.run(["node", "--version"],
|
|
capture_output=True,
|
|
check=True,
|
|
shell=True)
|
|
subprocess.run(["npm", "--version"],
|
|
capture_output=True,
|
|
check=True,
|
|
shell=True)
|
|
else:
|
|
subprocess.run(["node", "--version"], capture_output=True, check=True)
|
|
subprocess.run(["npm", "--version"], capture_output=True, check=True)
|
|
return True
|
|
except (subprocess.CalledProcessError, FileNotFoundError):
|
|
print("❌ Node.js und npm müssen installiert sein!")
|
|
print(" Bitte installieren Sie Node.js von: https://nodejs.org/")
|
|
return False
|
|
|
|
def start_services_windows(self):
|
|
"""Starte alle Services in Windows mit separaten CMD-Fenstern"""
|
|
print("🚀 Starte SkillMate Services...")
|
|
|
|
# Backend
|
|
backend_cmd = f'cd /d "{self.base_dir}\\backend" && npm run dev'
|
|
subprocess.Popen(['cmd', '/c', f'start "SkillMate Backend" cmd /k {backend_cmd}'])
|
|
|
|
# Warte bis Backend bereit ist
|
|
print(" Warte auf Backend...")
|
|
time.sleep(5)
|
|
|
|
# Frontend
|
|
frontend_cmd = f'cd /d "{self.base_dir}\\frontend" && npm run dev'
|
|
subprocess.Popen(['cmd', '/c', f'start "SkillMate Frontend" cmd /k {frontend_cmd}'])
|
|
|
|
# Admin Panel (optional)
|
|
admin_dir = self.base_dir / "admin-panel"
|
|
if admin_dir.exists():
|
|
admin_cmd = f'cd /d "{admin_dir}" && npm run dev -- --port 5174'
|
|
subprocess.Popen(['cmd', '/c', f'start "SkillMate Admin" cmd /k {admin_cmd}'])
|
|
|
|
print("\n✨ SkillMate läuft!")
|
|
print("\n📍 Zugriff:")
|
|
print(" - Frontend: http://localhost:5173")
|
|
print(" - Backend: http://localhost:3001")
|
|
print(" - Admin: http://localhost:5174")
|
|
|
|
# Öffne Frontend im Browser
|
|
time.sleep(3)
|
|
webbrowser.open("http://localhost:5173")
|
|
|
|
print("\n⚡ Schließen Sie dieses Fenster, um SkillMate zu beenden")
|
|
|
|
|
|
def run(self):
|
|
"""Hauptausführungsmethode"""
|
|
print("🎯 SkillMate wird gestartet...\n")
|
|
|
|
# Prüfe Voraussetzungen
|
|
if not self.check_node_npm():
|
|
return False
|
|
|
|
# Windows-spezifischer Start
|
|
if sys.platform == 'win32':
|
|
self.start_services_windows()
|
|
# Halte das Hauptfenster offen
|
|
try:
|
|
input("\nDrücken Sie Enter zum Beenden...")
|
|
except KeyboardInterrupt:
|
|
pass
|
|
else:
|
|
print("❌ Dieses Skript ist für Windows optimiert.")
|
|
print(" Nutzen Sie 'python main.py' für andere Systeme.")
|
|
return False
|
|
|
|
return True
|
|
|
|
def main():
|
|
"""Haupteinstiegspunkt"""
|
|
starter = SkillMateStarter()
|
|
|
|
try:
|
|
success = starter.run()
|
|
if not success:
|
|
sys.exit(1)
|
|
except Exception as e:
|
|
print(f"\n❌ Unerwarteter Fehler: {e}")
|
|
starter.cleanup()
|
|
sys.exit(1)
|
|
|
|
if __name__ == "__main__":
|
|
main() |