AI Newsletter Digest improvements: fixed QP soft line break decoding, URL extraction, and content cleaning
This commit is contained in:
108
skills/openclaw-self-healing/scripts/daily-backup.sh
Normal file
108
skills/openclaw-self-healing/scripts/daily-backup.sh
Normal file
@@ -0,0 +1,108 @@
|
||||
#!/bin/bash
|
||||
# OpenClaw Daily Backup Script
|
||||
# 매일 새벽 3시에 실행
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Load self-review library (V5.0.1 AOP)
|
||||
# shellcheck source=/dev/null
|
||||
source "$(dirname "$0")/../lib/self-review-lib.sh"
|
||||
|
||||
# Self-review metrics
|
||||
START_TIME=$(date +%s)
|
||||
|
||||
BACKUP_DIR=~/openclaw/backups
|
||||
DATE=$(date +%Y%m%d-%H%M)
|
||||
BACKUP_NAME="backup-${DATE}-DAILY"
|
||||
LOG_FILE=~/.openclaw/logs/backup.log
|
||||
|
||||
log() {
|
||||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
|
||||
}
|
||||
|
||||
# Main backup logic
|
||||
main() {
|
||||
|
||||
log "=== Backup Started ==="
|
||||
|
||||
# 백업 대상 디렉토리
|
||||
TARGETS=(
|
||||
"$HOME/openclaw"
|
||||
"$HOME/.openclaw/openclaw.json"
|
||||
"$HOME/.openclaw/agents"
|
||||
"$HOME/clawd/scripts"
|
||||
)
|
||||
|
||||
# 임시 디렉토리 생성
|
||||
TEMP_DIR=$(mktemp -d)
|
||||
trap "rm -rf $TEMP_DIR" EXIT
|
||||
|
||||
# 파일 복사
|
||||
for target in "${TARGETS[@]}"; do
|
||||
if [ -e "$target" ]; then
|
||||
cp -r "$target" "$TEMP_DIR/" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
|
||||
# 압축
|
||||
cd "$TEMP_DIR"
|
||||
tar -czf "${BACKUP_DIR}/${BACKUP_NAME}.tgz" . 2>/dev/null
|
||||
|
||||
# GPG 암호화 (암호 파일이 있는 경우)
|
||||
if [ -f ~/.openclaw/.backup-passphrase ]; then
|
||||
gpg --batch --yes --symmetric --cipher-algo AES256 \
|
||||
--passphrase-file ~/.openclaw/.backup-passphrase \
|
||||
"${BACKUP_DIR}/${BACKUP_NAME}.tgz"
|
||||
rm "${BACKUP_DIR}/${BACKUP_NAME}.tgz"
|
||||
log "Backup encrypted: ${BACKUP_NAME}.tgz.gpg"
|
||||
else
|
||||
log "Backup created (unencrypted): ${BACKUP_NAME}.tgz"
|
||||
fi
|
||||
|
||||
# 7일 이상 된 백업 삭제
|
||||
find "$BACKUP_DIR" -name "backup-*.tgz*" -mtime +7 -delete 2>/dev/null || true
|
||||
|
||||
log "=== Backup Complete ==="
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Run main function
|
||||
main
|
||||
MAIN_EXIT_CODE=$?
|
||||
|
||||
# ============================================
|
||||
# Self-Review (V5.0.1)
|
||||
# ============================================
|
||||
END_TIME=$(date +%s)
|
||||
DURATION=$((END_TIME - START_TIME))
|
||||
|
||||
# Non-AI cron (no OpenClaw API calls) → tokens=0
|
||||
INPUT_TOKENS=0
|
||||
OUTPUT_TOKENS=0
|
||||
|
||||
# Determine status
|
||||
if [ $MAIN_EXIT_CODE -eq 0 ]; then
|
||||
STATUS="ok"
|
||||
WHAT_WENT_WRONG="없음"
|
||||
WHY="백업 성공"
|
||||
NEXT_ACTION="없음"
|
||||
else
|
||||
STATUS="fail"
|
||||
WHAT_WENT_WRONG="백업 실패 (exit code: $MAIN_EXIT_CODE)"
|
||||
WHY="스크립트 에러"
|
||||
NEXT_ACTION="로그 확인: $LOG_FILE"
|
||||
fi
|
||||
|
||||
# Log self-review
|
||||
sr_log_review \
|
||||
"Daily Backup" \
|
||||
"$DURATION" \
|
||||
"$INPUT_TOKENS" \
|
||||
"$OUTPUT_TOKENS" \
|
||||
"$STATUS" \
|
||||
"$WHAT_WENT_WRONG" \
|
||||
"$WHY" \
|
||||
"$NEXT_ACTION"
|
||||
|
||||
exit $MAIN_EXIT_CODE
|
||||
Reference in New Issue
Block a user