328 lines
11 KiB
Bash
Executable File
328 lines
11 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Drama Ling 專案例行作業管理器
|
||
# 用途:統一管理和執行各種例行檢查和維護作業
|
||
# 作者:Claude Code Assistant
|
||
# 版本:1.0
|
||
|
||
# 設定
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
||
REPORTS_DIR="$SCRIPT_DIR/reports"
|
||
LOGS_DIR="$SCRIPT_DIR/logs"
|
||
CONFIG_DIR="$SCRIPT_DIR/config"
|
||
|
||
# 確保目錄存在
|
||
mkdir -p "$REPORTS_DIR" "$LOGS_DIR"
|
||
|
||
# 顏色定義
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
PURPLE='\033[0;35m'
|
||
CYAN='\033[0;36m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 時間戳
|
||
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
|
||
DATE_SIMPLE=$(date +"%Y-%m-%d")
|
||
|
||
# 顯示標題
|
||
show_header() {
|
||
echo -e "${CYAN}=================================================${NC}"
|
||
echo -e "${CYAN} Drama Ling 專案例行作業管理器${NC}"
|
||
echo -e "${CYAN} 執行時間: $(date)${NC}"
|
||
echo -e "${CYAN}=================================================${NC}"
|
||
echo ""
|
||
}
|
||
|
||
# 顯示使用說明
|
||
show_help() {
|
||
echo -e "${BLUE}使用方法:${NC}"
|
||
echo " $0 [選項]"
|
||
echo ""
|
||
echo -e "${BLUE}選項:${NC}"
|
||
echo " all 執行所有例行作業"
|
||
echo " consistency 執行文檔一致性檢查"
|
||
echo " quality 執行文檔品質檢查"
|
||
echo " security 執行安全性檢查"
|
||
echo " dependencies 執行相依性檢查"
|
||
echo " structure 執行專案結構檢查"
|
||
echo " issues 檢查問題追蹤狀態"
|
||
echo " report 生成綜合報告"
|
||
echo " schedule 設置定期執行排程"
|
||
echo " history 查看執行歷史"
|
||
echo " clean 清理舊的報告和日誌"
|
||
echo " help 顯示此幫助訊息"
|
||
echo ""
|
||
echo -e "${BLUE}範例:${NC}"
|
||
echo " $0 all # 執行所有檢查"
|
||
echo " $0 consistency quality # 只執行指定的檢查"
|
||
echo " $0 report # 只生成報告"
|
||
}
|
||
|
||
# 記錄日誌
|
||
log_message() {
|
||
local level=$1
|
||
local message=$2
|
||
echo "[$(date +'%Y-%m-%d %H:%M:%S')] [$level] $message" >> "$LOGS_DIR/maintenance_${DATE_SIMPLE}.log"
|
||
}
|
||
|
||
# 執行檢查並記錄結果
|
||
run_check() {
|
||
local check_name=$1
|
||
local script_path=$2
|
||
local description=$3
|
||
|
||
echo -e "${YELLOW}📋 執行: $description${NC}"
|
||
log_message "INFO" "開始執行: $check_name"
|
||
|
||
if [ -f "$script_path" ]; then
|
||
# 執行檢查並捕獲輸出
|
||
local output_file="$REPORTS_DIR/${check_name}_${TIMESTAMP}.txt"
|
||
local start_time=$(date +%s)
|
||
|
||
if bash "$script_path" > "$output_file" 2>&1; then
|
||
local end_time=$(date +%s)
|
||
local duration=$((end_time - start_time))
|
||
echo -e "${GREEN}✅ 完成: $description (耗時: ${duration}s)${NC}"
|
||
log_message "SUCCESS" "$check_name 執行成功,耗時: ${duration}s"
|
||
return 0
|
||
else
|
||
echo -e "${RED}❌ 失敗: $description${NC}"
|
||
log_message "ERROR" "$check_name 執行失敗"
|
||
return 1
|
||
fi
|
||
else
|
||
echo -e "${RED}❌ 腳本不存在: $script_path${NC}"
|
||
log_message "ERROR" "腳本不存在: $script_path"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# 執行文檔一致性檢查
|
||
check_consistency() {
|
||
echo -e "${PURPLE}🔍 === 文檔一致性檢查 ===${NC}"
|
||
run_check "consistency" "$SCRIPT_DIR/maintenance/check_consistency.sh" "文檔一致性檢查"
|
||
}
|
||
|
||
# 執行文檔品質檢查
|
||
check_quality() {
|
||
echo -e "${PURPLE}📚 === 文檔品質檢查 ===${NC}"
|
||
run_check "quality" "$SCRIPT_DIR/maintenance/check_doc_quality.sh" "文檔品質檢查"
|
||
}
|
||
|
||
# 執行安全性檢查
|
||
check_security() {
|
||
echo -e "${PURPLE}🔒 === 安全性檢查 ===${NC}"
|
||
run_check "security" "$SCRIPT_DIR/maintenance/check_security.sh" "安全性檢查"
|
||
}
|
||
|
||
# 執行相依性檢查
|
||
check_dependencies() {
|
||
echo -e "${PURPLE}📦 === 相依性檢查 ===${NC}"
|
||
run_check "dependencies" "$SCRIPT_DIR/maintenance/check_dependencies.sh" "相依性檢查"
|
||
}
|
||
|
||
# 執行專案結構檢查
|
||
check_structure() {
|
||
echo -e "${PURPLE}🏗️ === 專案結構檢查 ===${NC}"
|
||
run_check "structure" "$SCRIPT_DIR/maintenance/check_project_structure.sh" "專案結構檢查"
|
||
}
|
||
|
||
# 執行問題追蹤檢查
|
||
check_issues() {
|
||
echo -e "${PURPLE}🔍 === 問題追蹤檢查 ===${NC}"
|
||
run_check "issues" "$SCRIPT_DIR/maintenance/check_issues.sh" "問題追蹤檢查"
|
||
}
|
||
|
||
# 生成綜合報告
|
||
generate_report() {
|
||
echo -e "${PURPLE}📊 === 生成綜合報告 ===${NC}"
|
||
local report_file="$REPORTS_DIR/comprehensive_report_${TIMESTAMP}.html"
|
||
|
||
# 這裡會呼叫報告生成腳本
|
||
if [ -f "$SCRIPT_DIR/maintenance/generate_report.sh" ]; then
|
||
bash "$SCRIPT_DIR/maintenance/generate_report.sh" "$REPORTS_DIR" "$report_file"
|
||
echo -e "${GREEN}✅ 綜合報告已生成: $report_file${NC}"
|
||
else
|
||
echo -e "${YELLOW}⚠️ 報告生成腳本不存在,跳過${NC}"
|
||
fi
|
||
}
|
||
|
||
# 設置定期執行排程
|
||
setup_schedule() {
|
||
echo -e "${PURPLE}⏰ === 設置定期執行排程 ===${NC}"
|
||
echo "選擇排程頻率:"
|
||
echo "1) 每日執行 (09:00)"
|
||
echo "2) 每週執行 (週一 09:00)"
|
||
echo "3) 每月執行 (1號 09:00)"
|
||
echo "4) 自定義"
|
||
echo "5) 移除現有排程"
|
||
|
||
read -p "請選擇 (1-5): " choice
|
||
|
||
case $choice in
|
||
1)
|
||
(crontab -l 2>/dev/null; echo "0 9 * * * cd $PROJECT_ROOT && $SCRIPT_DIR/maintenance_manager.sh all") | crontab -
|
||
echo -e "${GREEN}✅ 已設置每日執行排程${NC}"
|
||
;;
|
||
2)
|
||
(crontab -l 2>/dev/null; echo "0 9 * * 1 cd $PROJECT_ROOT && $SCRIPT_DIR/maintenance_manager.sh all") | crontab -
|
||
echo -e "${GREEN}✅ 已設置每週執行排程${NC}"
|
||
;;
|
||
3)
|
||
(crontab -l 2>/dev/null; echo "0 9 1 * * cd $PROJECT_ROOT && $SCRIPT_DIR/maintenance_manager.sh all") | crontab -
|
||
echo -e "${GREEN}✅ 已設置每月執行排程${NC}"
|
||
;;
|
||
4)
|
||
echo "請參考 crontab 格式設置自定義排程"
|
||
echo "範例: 0 9 * * 1-5 表示工作日上午9點執行"
|
||
;;
|
||
5)
|
||
crontab -l 2>/dev/null | grep -v "maintenance_manager.sh" | crontab -
|
||
echo -e "${GREEN}✅ 已移除相關排程${NC}"
|
||
;;
|
||
*)
|
||
echo -e "${RED}❌ 無效選擇${NC}"
|
||
;;
|
||
esac
|
||
}
|
||
|
||
# 查看執行歷史
|
||
show_history() {
|
||
echo -e "${PURPLE}📜 === 執行歷史 ===${NC}"
|
||
if [ -d "$LOGS_DIR" ] && [ "$(ls -A $LOGS_DIR)" ]; then
|
||
echo "最近的日誌檔案:"
|
||
ls -lt "$LOGS_DIR"/*.log 2>/dev/null | head -5
|
||
echo ""
|
||
echo "最新的執行記錄:"
|
||
tail -20 "$LOGS_DIR"/maintenance_*.log 2>/dev/null || echo "無執行記錄"
|
||
else
|
||
echo "無執行歷史記錄"
|
||
fi
|
||
|
||
echo ""
|
||
echo "最近的報告:"
|
||
if [ -d "$REPORTS_DIR" ] && [ "$(ls -A $REPORTS_DIR)" ]; then
|
||
ls -lt "$REPORTS_DIR"/* 2>/dev/null | head -5
|
||
else
|
||
echo "無報告記錄"
|
||
fi
|
||
}
|
||
|
||
# 清理舊檔案
|
||
clean_old_files() {
|
||
echo -e "${PURPLE}🧹 === 清理舊檔案 ===${NC}"
|
||
read -p "刪除幾天前的檔案? (預設: 30): " days
|
||
days=${days:-30}
|
||
|
||
if [ "$days" -gt 0 ]; then
|
||
echo "刪除 $days 天前的日誌和報告..."
|
||
find "$LOGS_DIR" -name "*.log" -mtime +$days -delete 2>/dev/null
|
||
find "$REPORTS_DIR" -name "*" -mtime +$days -delete 2>/dev/null
|
||
echo -e "${GREEN}✅ 清理完成${NC}"
|
||
else
|
||
echo -e "${RED}❌ 無效的天數${NC}"
|
||
fi
|
||
}
|
||
|
||
# 主要邏輯
|
||
main() {
|
||
show_header
|
||
|
||
if [ $# -eq 0 ]; then
|
||
show_help
|
||
exit 1
|
||
fi
|
||
|
||
# 記錄開始執行
|
||
log_message "START" "開始執行例行作業: $*"
|
||
|
||
local total_checks=0
|
||
local successful_checks=0
|
||
|
||
# 處理參數
|
||
while [ $# -gt 0 ]; do
|
||
case $1 in
|
||
all)
|
||
total_checks=$((total_checks + 6))
|
||
check_consistency && successful_checks=$((successful_checks + 1))
|
||
check_quality && successful_checks=$((successful_checks + 1))
|
||
check_security && successful_checks=$((successful_checks + 1))
|
||
check_dependencies && successful_checks=$((successful_checks + 1))
|
||
check_structure && successful_checks=$((successful_checks + 1))
|
||
check_issues && successful_checks=$((successful_checks + 1))
|
||
generate_report
|
||
;;
|
||
consistency)
|
||
total_checks=$((total_checks + 1))
|
||
check_consistency && successful_checks=$((successful_checks + 1))
|
||
;;
|
||
quality)
|
||
total_checks=$((total_checks + 1))
|
||
check_quality && successful_checks=$((successful_checks + 1))
|
||
;;
|
||
security)
|
||
total_checks=$((total_checks + 1))
|
||
check_security && successful_checks=$((successful_checks + 1))
|
||
;;
|
||
dependencies)
|
||
total_checks=$((total_checks + 1))
|
||
check_dependencies && successful_checks=$((successful_checks + 1))
|
||
;;
|
||
structure)
|
||
total_checks=$((total_checks + 1))
|
||
check_structure && successful_checks=$((successful_checks + 1))
|
||
;;
|
||
issues)
|
||
total_checks=$((total_checks + 1))
|
||
check_issues && successful_checks=$((successful_checks + 1))
|
||
;;
|
||
report)
|
||
generate_report
|
||
;;
|
||
schedule)
|
||
setup_schedule
|
||
;;
|
||
history)
|
||
show_history
|
||
;;
|
||
clean)
|
||
clean_old_files
|
||
;;
|
||
help)
|
||
show_help
|
||
;;
|
||
*)
|
||
echo -e "${RED}❌ 未知選項: $1${NC}"
|
||
show_help
|
||
exit 1
|
||
;;
|
||
esac
|
||
shift
|
||
done
|
||
|
||
# 顯示執行總結
|
||
if [ $total_checks -gt 0 ]; then
|
||
echo ""
|
||
echo -e "${CYAN}=================================================${NC}"
|
||
echo -e "${CYAN}執行總結:${NC}"
|
||
echo -e "總檢查項目: $total_checks"
|
||
echo -e "成功執行: ${GREEN}$successful_checks${NC}"
|
||
echo -e "失敗項目: ${RED}$((total_checks - successful_checks))${NC}"
|
||
|
||
if [ $successful_checks -eq $total_checks ]; then
|
||
echo -e "${GREEN}🎉 所有檢查都執行成功!${NC}"
|
||
log_message "SUCCESS" "所有例行作業執行成功"
|
||
else
|
||
echo -e "${YELLOW}⚠️ 部分檢查執行失敗,請查看詳細報告${NC}"
|
||
log_message "WARNING" "部分例行作業執行失敗"
|
||
fi
|
||
echo -e "${CYAN}=================================================${NC}"
|
||
fi
|
||
}
|
||
|
||
# 執行主程式
|
||
main "$@" |