#!/bin/bash # BQAS Scheduler Installation Script # Installiert launchd Job fuer taegliche BQAS Tests um 7:00 Uhr set -e # Konfiguration VOICE_SERVICE_DIR="/Users/benjaminadmin/Projekte/breakpilot-pwa/voice-service" PLIST_NAME="com.breakpilot.bqas" PLIST_PATH="${HOME}/Library/LaunchAgents/${PLIST_NAME}.plist" LOG_DIR="/var/log/bqas" GIT_HOOKS_DIR="/Users/benjaminadmin/Projekte/breakpilot-pwa/.git/hooks" # Farben RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' NC='\033[0m' log() { local level=$1 local message=$2 case $level in INFO) echo -e "${BLUE}[INFO]${NC} ${message}" ;; SUCCESS) echo -e "${GREEN}[SUCCESS]${NC} ${message}" ;; WARNING) echo -e "${YELLOW}[WARNING]${NC} ${message}" ;; ERROR) echo -e "${RED}[ERROR]${NC} ${message}" ;; esac } # Argumente ACTION=${1:-install} show_usage() { echo "Usage: $0 [install|uninstall|status|test]" echo "" echo "Commands:" echo " install Installiert launchd Job und Git Hook" echo " uninstall Entfernt launchd Job und Git Hook" echo " status Zeigt aktuellen Status" echo " test Fuehrt BQAS Tests manuell aus" } create_log_directory() { log "INFO" "Erstelle Log-Verzeichnis..." if [ ! -d "$LOG_DIR" ]; then sudo mkdir -p "$LOG_DIR" sudo chown "$USER" "$LOG_DIR" log "SUCCESS" "Log-Verzeichnis erstellt: $LOG_DIR" else log "INFO" "Log-Verzeichnis existiert bereits" fi } create_plist() { log "INFO" "Erstelle launchd plist..." cat > "$PLIST_PATH" << EOF Label ${PLIST_NAME} ProgramArguments ${VOICE_SERVICE_DIR}/scripts/run_bqas.sh StartCalendarInterval Hour 7 Minute 0 StandardOutPath ${LOG_DIR}/stdout.log StandardErrorPath ${LOG_DIR}/stderr.log RunAtLoad EnvironmentVariables PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin HOME ${HOME} WorkingDirectory ${VOICE_SERVICE_DIR} EOF log "SUCCESS" "plist erstellt: $PLIST_PATH" } load_plist() { log "INFO" "Lade launchd Job..." # Entlade falls bereits geladen launchctl unload "$PLIST_PATH" 2>/dev/null || true # Lade den Job launchctl load "$PLIST_PATH" log "SUCCESS" "launchd Job geladen" } unload_plist() { log "INFO" "Entlade launchd Job..." if [ -f "$PLIST_PATH" ]; then launchctl unload "$PLIST_PATH" 2>/dev/null || true rm -f "$PLIST_PATH" log "SUCCESS" "launchd Job entfernt" else log "INFO" "Kein launchd Job gefunden" fi } create_git_hook() { log "INFO" "Erstelle Git post-commit Hook..." # Prüfe ob .git/hooks existiert if [ ! -d "$GIT_HOOKS_DIR" ]; then log "WARNING" "Git hooks Verzeichnis nicht gefunden: $GIT_HOOKS_DIR" return 1 fi local hook_path="${GIT_HOOKS_DIR}/post-commit" # Backup falls vorhanden if [ -f "$hook_path" ]; then cp "$hook_path" "${hook_path}.backup" log "INFO" "Bestehender Hook gesichert" fi cat > "$hook_path" << 'EOF' #!/bin/bash # BQAS Post-Commit Hook # Fuehrt schnelle Tests aus wenn voice-service geaendert wurde # Nur ausfuehren wenn voice-service geaendert wurde if git diff --name-only HEAD~1 2>/dev/null | grep -q "^voice-service/"; then echo "" echo "voice-service geaendert - starte BQAS Quick Check..." echo "" # Async ausfuehren (im Hintergrund) VOICE_SERVICE_DIR="/Users/benjaminadmin/Projekte/breakpilot-pwa/voice-service" if [ -f "${VOICE_SERVICE_DIR}/scripts/run_bqas.sh" ]; then nohup "${VOICE_SERVICE_DIR}/scripts/run_bqas.sh" --quick > /dev/null 2>&1 & echo "BQAS Quick Check gestartet (PID: $!)" echo "Logs: /var/log/bqas/bqas.log" fi fi EOF chmod +x "$hook_path" log "SUCCESS" "Git Hook erstellt: $hook_path" } remove_git_hook() { log "INFO" "Entferne Git post-commit Hook..." local hook_path="${GIT_HOOKS_DIR}/post-commit" if [ -f "$hook_path" ]; then # Prüfe ob es unser Hook ist if grep -q "BQAS" "$hook_path" 2>/dev/null; then rm -f "$hook_path" # Restore backup falls vorhanden if [ -f "${hook_path}.backup" ]; then mv "${hook_path}.backup" "$hook_path" log "INFO" "Vorheriger Hook wiederhergestellt" fi log "SUCCESS" "Git Hook entfernt" else log "WARNING" "Hook gehoert nicht zu BQAS, uebersprungen" fi else log "INFO" "Kein Git Hook gefunden" fi } show_status() { echo "" echo "==========================================" echo "BQAS Scheduler Status" echo "==========================================" echo "" # launchd Status echo "launchd Job:" if launchctl list | grep -q "$PLIST_NAME"; then echo -e " ${GREEN}✓${NC} Geladen" launchctl list "$PLIST_NAME" 2>/dev/null || true else echo -e " ${RED}✗${NC} Nicht geladen" fi echo "" # plist Status echo "plist Datei:" if [ -f "$PLIST_PATH" ]; then echo -e " ${GREEN}✓${NC} Vorhanden: $PLIST_PATH" else echo -e " ${RED}✗${NC} Nicht vorhanden" fi echo "" # Git Hook Status echo "Git Hook:" local hook_path="${GIT_HOOKS_DIR}/post-commit" if [ -f "$hook_path" ] && grep -q "BQAS" "$hook_path" 2>/dev/null; then echo -e " ${GREEN}✓${NC} Installiert: $hook_path" else echo -e " ${RED}✗${NC} Nicht installiert" fi echo "" # Log-Verzeichnis echo "Log-Verzeichnis:" if [ -d "$LOG_DIR" ]; then echo -e " ${GREEN}✓${NC} Vorhanden: $LOG_DIR" if [ -f "${LOG_DIR}/bqas.log" ]; then echo " Letzter Eintrag:" tail -1 "${LOG_DIR}/bqas.log" 2>/dev/null || echo " (leer)" fi else echo -e " ${RED}✗${NC} Nicht vorhanden" fi echo "" # Naechste Ausfuehrung echo "Zeitplan: Taeglich um 07:00 Uhr" echo "" } do_install() { log "INFO" "==========================================" log "INFO" "BQAS Scheduler Installation" log "INFO" "==========================================" create_log_directory create_plist load_plist create_git_hook echo "" log "SUCCESS" "Installation abgeschlossen!" echo "" echo "Naechste Schritte:" echo " 1. Manueller Test: $0 test" echo " 2. Status pruefen: $0 status" echo " 3. Logs anschauen: tail -f ${LOG_DIR}/bqas.log" echo "" } do_uninstall() { log "INFO" "==========================================" log "INFO" "BQAS Scheduler Deinstallation" log "INFO" "==========================================" unload_plist remove_git_hook echo "" log "SUCCESS" "Deinstallation abgeschlossen!" echo "" echo "Log-Verzeichnis wurde nicht entfernt: $LOG_DIR" echo "Zum Entfernen: sudo rm -rf $LOG_DIR" echo "" } do_test() { log "INFO" "Starte BQAS Tests manuell..." echo "" if [ -f "${VOICE_SERVICE_DIR}/scripts/run_bqas.sh" ]; then "${VOICE_SERVICE_DIR}/scripts/run_bqas.sh" else log "ERROR" "run_bqas.sh nicht gefunden!" exit 1 fi } # Hauptlogik case $ACTION in install) do_install ;; uninstall) do_uninstall ;; status) show_status ;; test) do_test ;; *) show_usage exit 1 ;; esac