diff --git a/bin/log.sh b/bin/log.sh index 8619853..ba6e803 100755 --- a/bin/log.sh +++ b/bin/log.sh @@ -13,7 +13,7 @@ source "$LIB_DIR/core/base.sh" source "$LIB_DIR/core/log.sh" show_help() { - cat </dev/null || true) + results=$(grep -iF -- "$term" "$OPERATIONS_LOG_FILE" 2> /dev/null || true) if [[ -z "$results" ]]; then echo -e "${YELLOW}No matches found.${NC}" @@ -91,24 +91,24 @@ show_stats() { echo "────────────────────────────────────────────────────────────────" local total_lines - total_lines=$(grep -c '^\[' "$OPERATIONS_LOG_FILE" 2>/dev/null || echo 0) + total_lines=$(grep -c '^\[' "$OPERATIONS_LOG_FILE" 2> /dev/null || echo 0) echo -e "${GREEN}Total operations:${NC} $total_lines" echo "" echo -e "${GREEN}By command:${NC}" - grep -o '\[clean\]\|\[uninstall\]\|\[optimize\]\|\[purge\]' "$OPERATIONS_LOG_FILE" 2>/dev/null | + grep -o '\[clean\]\|\[uninstall\]\|\[optimize\]\|\[purge\]' "$OPERATIONS_LOG_FILE" 2> /dev/null | sort | uniq -c | sort -rn | sed 's/\[//g; s/\]//g' | awk '{printf " %-15s %s\n", $2":", $1}' || echo " No command data" echo "" echo -e "${GREEN}By action:${NC}" - grep -o 'REMOVED\|SKIPPED\|FAILED\|REBUILT' "$OPERATIONS_LOG_FILE" 2>/dev/null | + grep -o 'REMOVED\|SKIPPED\|FAILED\|REBUILT' "$OPERATIONS_LOG_FILE" 2> /dev/null | sort | uniq -c | sort -rn | awk '{printf " %-15s %s\n", $2":", $1}' || echo " No action data" echo "" echo -e "${GREEN}Recent sessions:${NC}" - grep 'session started' "$OPERATIONS_LOG_FILE" 2>/dev/null | tail -n 5 || echo " No session data" + grep 'session started' "$OPERATIONS_LOG_FILE" 2> /dev/null | tail -n 5 || echo " No session data" } show_today() { @@ -124,7 +124,7 @@ show_today() { echo "────────────────────────────────────────────────────────────────" local results - results=$(grep "^\[$today" "$OPERATIONS_LOG_FILE" 2>/dev/null || true) + results=$(grep "^\[$today" "$OPERATIONS_LOG_FILE" 2> /dev/null || true) if [[ -z "$results" ]]; then echo -e "${YELLOW}No operations today.${NC}" @@ -152,7 +152,7 @@ filter_by_command() { echo "────────────────────────────────────────────────────────────────" local results - results=$(grep -F -- "[$cmd]" "$OPERATIONS_LOG_FILE" 2>/dev/null || true) + results=$(grep -F -- "[$cmd]" "$OPERATIONS_LOG_FILE" 2> /dev/null || true) if [[ -z "$results" ]]; then echo -e "${YELLOW}No operations found for ${cmd}.${NC}" @@ -175,46 +175,46 @@ main() { while [[ $# -gt 0 ]]; do case "$1" in - --tail) - shift - show_tail "${1:-50}" - exit 0 - ;; - --search) - shift - if [[ -z "${1:-}" ]]; then - echo -e "${RED}Error: --search requires an argument${NC}" + --tail) + shift + show_tail "${1:-50}" + exit 0 + ;; + --search) + shift + if [[ -z "${1:-}" ]]; then + echo -e "${RED}Error: --search requires an argument${NC}" + exit 1 + fi + search_log "$1" + exit 0 + ;; + --stats) + show_stats + exit 0 + ;; + --today) + show_today + exit 0 + ;; + --command) + shift + if [[ -z "${1:-}" ]]; then + echo -e "${RED}Error: --command requires an argument${NC}" + exit 1 + fi + filter_by_command "$1" + exit 0 + ;; + --help | -h) + show_help + exit 0 + ;; + *) + echo -e "${RED}Unknown option: $1${NC}" + echo "Use 'mo log --help' for usage information." exit 1 - fi - search_log "$1" - exit 0 - ;; - --stats) - show_stats - exit 0 - ;; - --today) - show_today - exit 0 - ;; - --command) - shift - if [[ -z "${1:-}" ]]; then - echo -e "${RED}Error: --command requires an argument${NC}" - exit 1 - fi - filter_by_command "$1" - exit 0 - ;; - --help | -h) - show_help - exit 0 - ;; - *) - echo -e "${RED}Unknown option: $1${NC}" - echo "Use 'mo log --help' for usage information." - exit 1 - ;; + ;; esac # shellcheck disable=SC2317 shift diff --git a/lib/core/log.sh b/lib/core/log.sh index 769edb5..797b92f 100644 --- a/lib/core/log.sh +++ b/lib/core/log.sh @@ -48,7 +48,7 @@ rotate_log_once() { local size size=$(get_file_size "$LOG_FILE") if [[ "$size" -gt "$max_size" ]]; then - mv "$LOG_FILE" "${LOG_FILE}.old" 2>/dev/null || true + mv "$LOG_FILE" "${LOG_FILE}.old" 2> /dev/null || true ensure_user_file "$LOG_FILE" fi fi @@ -60,7 +60,7 @@ rotate_log_once() { local size size=$(get_file_size "$OPERATIONS_LOG_FILE") if [[ "$size" -gt "$oplog_max_size" ]]; then - mv "$OPERATIONS_LOG_FILE" "${OPERATIONS_LOG_FILE}.old" 2>/dev/null || true + mv "$OPERATIONS_LOG_FILE" "${OPERATIONS_LOG_FILE}.old" 2> /dev/null || true ensure_user_file "$OPERATIONS_LOG_FILE" fi fi @@ -81,9 +81,9 @@ log_info() { echo -e "${BLUE}$1${NC}" local timestamp timestamp=$(get_timestamp) - echo "[$timestamp] INFO: $1" >>"$LOG_FILE" 2>/dev/null || true + echo "[$timestamp] INFO: $1" >> "$LOG_FILE" 2> /dev/null || true if [[ "${MO_DEBUG:-}" == "1" ]]; then - echo "[$timestamp] INFO: $1" >>"$DEBUG_LOG_FILE" 2>/dev/null || true + echo "[$timestamp] INFO: $1" >> "$DEBUG_LOG_FILE" 2> /dev/null || true fi } @@ -92,9 +92,9 @@ log_success() { echo -e " ${GREEN}${ICON_SUCCESS}${NC} $1" local timestamp timestamp=$(get_timestamp) - echo "[$timestamp] SUCCESS: $1" >>"$LOG_FILE" 2>/dev/null || true + echo "[$timestamp] SUCCESS: $1" >> "$LOG_FILE" 2> /dev/null || true if [[ "${MO_DEBUG:-}" == "1" ]]; then - echo "[$timestamp] SUCCESS: $1" >>"$DEBUG_LOG_FILE" 2>/dev/null || true + echo "[$timestamp] SUCCESS: $1" >> "$DEBUG_LOG_FILE" 2> /dev/null || true fi } @@ -103,9 +103,9 @@ log_warning() { echo -e "${YELLOW}$1${NC}" local timestamp timestamp=$(get_timestamp) - echo "[$timestamp] WARNING: $1" >>"$LOG_FILE" 2>/dev/null || true + echo "[$timestamp] WARNING: $1" >> "$LOG_FILE" 2> /dev/null || true if [[ "${MO_DEBUG:-}" == "1" ]]; then - echo "[$timestamp] WARNING: $1" >>"$DEBUG_LOG_FILE" 2>/dev/null || true + echo "[$timestamp] WARNING: $1" >> "$DEBUG_LOG_FILE" 2> /dev/null || true fi } @@ -114,9 +114,9 @@ log_error() { echo -e "${YELLOW}${ICON_ERROR}${NC} $1" >&2 local timestamp timestamp=$(get_timestamp) - echo "[$timestamp] ERROR: $1" >>"$LOG_FILE" 2>/dev/null || true + echo "[$timestamp] ERROR: $1" >> "$LOG_FILE" 2> /dev/null || true if [[ "${MO_DEBUG:-}" == "1" ]]; then - echo "[$timestamp] ERROR: $1" >>"$DEBUG_LOG_FILE" 2>/dev/null || true + echo "[$timestamp] ERROR: $1" >> "$DEBUG_LOG_FILE" 2> /dev/null || true fi } @@ -126,7 +126,7 @@ debug_log() { echo -e "${GRAY}[DEBUG]${NC} $*" >&2 local timestamp timestamp=$(get_timestamp) - echo "[$timestamp] DEBUG: $*" >>"$DEBUG_LOG_FILE" 2>/dev/null || true + echo "[$timestamp] DEBUG: $*" >> "$DEBUG_LOG_FILE" 2> /dev/null || true fi } @@ -163,7 +163,7 @@ log_operation() { local log_line="[$timestamp] [$command] $action $path" [[ -n "$detail" ]] && log_line+=" ($detail)" - echo "$log_line" >>"$OPERATIONS_LOG_FILE" 2>/dev/null || true + echo "$log_line" >> "$OPERATIONS_LOG_FILE" 2> /dev/null || true } # Log session start marker @@ -178,7 +178,7 @@ log_operation_session_start() { { echo "" echo "# ========== $command session started at $timestamp ==========" - } >>"$OPERATIONS_LOG_FILE" 2>/dev/null || true + } >> "$OPERATIONS_LOG_FILE" 2> /dev/null || true } # shellcheck disable=SC2329 @@ -193,14 +193,14 @@ log_operation_session_end() { local size_human="" if [[ "$size" =~ ^[0-9]+$ ]] && [[ "$size" -gt 0 ]]; then - size_human=$(bytes_to_human "$((size * 1024))" 2>/dev/null || echo "${size}KB") + size_human=$(bytes_to_human "$((size * 1024))" 2> /dev/null || echo "${size}KB") else size_human="0B" fi { echo "# ========== $command session ended at $timestamp, $items items, $size_human ==========" - } >>"$OPERATIONS_LOG_FILE" 2>/dev/null || true + } >> "$OPERATIONS_LOG_FILE" 2> /dev/null || true } # Enhanced debug logging for operations @@ -218,7 +218,7 @@ debug_operation_start() { echo "" echo "=== $operation_name ===" [[ -n "$operation_desc" ]] && echo "Description: $operation_desc" - } >>"$DEBUG_LOG_FILE" 2>/dev/null || true + } >> "$DEBUG_LOG_FILE" 2> /dev/null || true fi } @@ -232,7 +232,7 @@ debug_operation_detail() { echo -e "${GRAY}[DEBUG] $detail_type: $detail_value${NC}" >&2 # Also log to file - echo "$detail_type: $detail_value" >>"$DEBUG_LOG_FILE" 2>/dev/null || true + echo "$detail_type: $detail_value" >> "$DEBUG_LOG_FILE" 2> /dev/null || true fi } @@ -252,7 +252,7 @@ debug_file_action() { echo -e "${GRAY}[DEBUG] $action: $msg${NC}" >&2 # Also log to file - echo "$action: $msg" >>"$DEBUG_LOG_FILE" 2>/dev/null || true + echo "$action: $msg" >> "$DEBUG_LOG_FILE" 2> /dev/null || true fi } @@ -264,16 +264,16 @@ debug_risk_level() { if [[ "${MO_DEBUG:-}" == "1" ]]; then local color="$GRAY" case "$risk_level" in - LOW) color="$GREEN" ;; - MEDIUM) color="$YELLOW" ;; - HIGH) color="$RED" ;; + LOW) color="$GREEN" ;; + MEDIUM) color="$YELLOW" ;; + HIGH) color="$RED" ;; esac # Output to stderr with color echo -e "${GRAY}[DEBUG] Risk Level: ${color}${risk_level}${GRAY}, $reason${NC}" >&2 # Also log to file - echo "Risk Level: $risk_level, $reason" >>"$DEBUG_LOG_FILE" 2>/dev/null || true + echo "Risk Level: $risk_level, $reason" >> "$DEBUG_LOG_FILE" 2> /dev/null || true fi } @@ -285,7 +285,7 @@ log_system_info() { # Reset debug log file for this new session ensure_user_file "$DEBUG_LOG_FILE" - if ! : >"$DEBUG_LOG_FILE" 2>/dev/null; then + if ! : > "$DEBUG_LOG_FILE" 2> /dev/null; then echo -e "${YELLOW}${ICON_WARNING}${NC} Debug log not writable: $DEBUG_LOG_FILE" >&2 fi @@ -298,19 +298,19 @@ log_system_info() { echo "Hostname: $(hostname)" echo "Architecture: $(uname -m)" echo "Kernel: $(uname -r)" - if command -v sw_vers >/dev/null; then + if command -v sw_vers > /dev/null; then echo "macOS: $(sw_vers -productVersion), $(sw_vers -buildVersion)" fi echo "Shell: ${SHELL:-unknown}, ${TERM:-unknown}" # Check sudo status non-interactively - if sudo -n true 2>/dev/null; then + if sudo -n true 2> /dev/null; then echo "Sudo Access: Active" else echo "Sudo Access: Required" fi echo "----------------------------------------------------------------------" - } >>"$DEBUG_LOG_FILE" 2>/dev/null || true + } >> "$DEBUG_LOG_FILE" 2> /dev/null || true # Notification to stderr echo -e "${GRAY}[DEBUG] Debug logging enabled. Session log: $DEBUG_LOG_FILE${NC}" >&2 @@ -322,7 +322,7 @@ log_system_info() { # Run command silently (ignore errors) run_silent() { - "$@" >/dev/null 2>&1 || true + "$@" > /dev/null 2>&1 || true } # Run command with error logging @@ -330,12 +330,12 @@ run_logged() { local cmd="$1" # Log to main file, and also to debug file if enabled if [[ "${MO_DEBUG:-}" == "1" ]]; then - if ! "$@" 2>&1 | tee -a "$LOG_FILE" | tee -a "$DEBUG_LOG_FILE" >/dev/null; then + if ! "$@" 2>&1 | tee -a "$LOG_FILE" | tee -a "$DEBUG_LOG_FILE" > /dev/null; then log_warning "Command failed: $cmd" return 1 fi else - if ! "$@" 2>&1 | tee -a "$LOG_FILE" >/dev/null; then + if ! "$@" 2>&1 | tee -a "$LOG_FILE" > /dev/null; then log_warning "Command failed: $cmd" return 1 fi