AI Newsletter Digest improvements: fixed QP soft line break decoding, URL extraction, and content cleaning
This commit is contained in:
161
skills/openclaw-self-healing/scripts/config-validator.sh
Normal file
161
skills/openclaw-self-healing/scripts/config-validator.sh
Normal file
@@ -0,0 +1,161 @@
|
||||
#!/bin/bash
|
||||
# Config Validator - Gateway 시작 전 Config 검증 및 자동 수정
|
||||
# Level 0: Config Guardian (Self-Healing System의 최전방)
|
||||
#
|
||||
# v1.0 - 2026-02-08
|
||||
# - openclaw doctor 자동 실행
|
||||
# - Invalid config key 자동 제거
|
||||
# - Schema validation
|
||||
# - Config 변경 시 자동 backup
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# ============================================================================
|
||||
# Configuration
|
||||
# ============================================================================
|
||||
CONFIG_FILE="${OPENCLAW_CONFIG:-$HOME/.openclaw/openclaw.json}"
|
||||
BACKUP_DIR="$HOME/.openclaw/config-backups"
|
||||
LOG_DIR="${OPENCLAW_LOG_DIR:-$HOME/.openclaw/logs}"
|
||||
LOG_FILE="$LOG_DIR/config-validator.log"
|
||||
ALERT_SCRIPT="$HOME/.openclaw/scripts/alert.sh"
|
||||
|
||||
# Create directories
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
mkdir -p "$LOG_DIR"
|
||||
|
||||
# ============================================================================
|
||||
# Functions
|
||||
# ============================================================================
|
||||
|
||||
log() {
|
||||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
|
||||
}
|
||||
|
||||
backup_config() {
|
||||
if [[ ! -f "$CONFIG_FILE" ]]; then
|
||||
log "ERROR: Config file not found: $CONFIG_FILE"
|
||||
return 1
|
||||
fi
|
||||
|
||||
local timestamp=$(date +%Y%m%d-%H%M%S)
|
||||
local backup_file="$BACKUP_DIR/openclaw-${timestamp}.json"
|
||||
|
||||
cp "$CONFIG_FILE" "$backup_file"
|
||||
log "INFO: Config backed up to: $backup_file"
|
||||
|
||||
# Keep only last 10 backups
|
||||
local backup_count=$(ls -1 "$BACKUP_DIR"/openclaw-*.json 2>/dev/null | wc -l)
|
||||
if [[ $backup_count -gt 10 ]]; then
|
||||
ls -1t "$BACKUP_DIR"/openclaw-*.json | tail -n +11 | xargs rm -f
|
||||
log "INFO: Cleaned old backups (kept last 10)"
|
||||
fi
|
||||
}
|
||||
|
||||
validate_config() {
|
||||
log "INFO: Running openclaw doctor..."
|
||||
|
||||
local doctor_output
|
||||
if doctor_output=$(openclaw doctor 2>&1); then
|
||||
log "INFO: Config validation passed"
|
||||
return 0
|
||||
else
|
||||
log "WARN: Config validation found issues"
|
||||
echo "$doctor_output" >> "$LOG_FILE"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
auto_fix_config() {
|
||||
log "INFO: Running openclaw doctor --fix..."
|
||||
|
||||
# Backup before fix
|
||||
backup_config
|
||||
|
||||
local fix_output
|
||||
if fix_output=$(openclaw doctor --fix 2>&1); then
|
||||
log "INFO: Config auto-fix completed"
|
||||
echo "$fix_output" >> "$LOG_FILE"
|
||||
|
||||
# Send success alert
|
||||
if [[ -x "$ALERT_SCRIPT" ]]; then
|
||||
"$ALERT_SCRIPT" "info" "Config 자동 수정" \
|
||||
"Invalid config keys 자동 제거됨\nBackup: $BACKUP_DIR" \
|
||||
"" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
return 0
|
||||
else
|
||||
log "ERROR: Config auto-fix failed"
|
||||
echo "$fix_output" >> "$LOG_FILE"
|
||||
|
||||
# Send error alert
|
||||
if [[ -x "$ALERT_SCRIPT" ]]; then
|
||||
"$ALERT_SCRIPT" "error" "Config 수정 실패" \
|
||||
"openclaw doctor --fix 실패\n수동 확인 필요" \
|
||||
"" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_config_syntax() {
|
||||
if ! jq empty "$CONFIG_FILE" 2>/dev/null; then
|
||||
log "ERROR: Config is not valid JSON"
|
||||
|
||||
if [[ -x "$ALERT_SCRIPT" ]]; then
|
||||
"$ALERT_SCRIPT" "critical" "Config JSON 문법 오류" \
|
||||
"Config 파일이 유효한 JSON이 아닙니다\n수동 확인 필요" \
|
||||
"" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
return 1
|
||||
fi
|
||||
|
||||
log "INFO: Config JSON syntax valid"
|
||||
return 0
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
# Main Logic
|
||||
# ============================================================================
|
||||
|
||||
log "========== Config Validator Started =========="
|
||||
|
||||
# 1. Check if config file exists
|
||||
if [[ ! -f "$CONFIG_FILE" ]]; then
|
||||
log "ERROR: Config file not found: $CONFIG_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 2. Check JSON syntax
|
||||
if ! check_config_syntax; then
|
||||
log "ERROR: Config validation failed (JSON syntax)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 3. Run openclaw doctor
|
||||
if ! validate_config; then
|
||||
log "WARN: Config validation failed - attempting auto-fix"
|
||||
|
||||
# 4. Auto-fix if validation failed
|
||||
if auto_fix_config; then
|
||||
log "INFO: Config auto-fix successful"
|
||||
|
||||
# 5. Re-validate after fix
|
||||
if validate_config; then
|
||||
log "INFO: Config validation passed after fix"
|
||||
else
|
||||
log "ERROR: Config validation still failing after fix"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
log "ERROR: Config auto-fix failed"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
log "INFO: Config validation passed"
|
||||
fi
|
||||
|
||||
log "========== Config Validator Completed =========="
|
||||
exit 0
|
||||
Reference in New Issue
Block a user