Add verbose mode for detailed error messages
Added --verbose flag that enables detailed logging: - log_error(): Always shown, critical errors - log_warn(): Shown in verbose mode, potential issues - log_info(): Shown in verbose mode, informational messages Now provides helpful feedback for: - SMART query failures with specific error messages - Missing drive mappings for the current host - Empty bays (no device at configured PCI path) - Ceph command availability and query status - Drive mapping statistics (mapped vs empty) Color-coded output when using --color with --verbose. Fixes: #14 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -28,6 +28,7 @@ OPTIONS:
|
|||||||
-d, --debug Enable debug output (show drive mappings)
|
-d, --debug Enable debug output (show drive mappings)
|
||||||
-s, --skip-smart Skip SMART data collection (faster)
|
-s, --skip-smart Skip SMART data collection (faster)
|
||||||
-c, --color Enable colored output
|
-c, --color Enable colored output
|
||||||
|
--verbose Show detailed error messages and warnings
|
||||||
--no-ceph Skip Ceph OSD information
|
--no-ceph Skip Ceph OSD information
|
||||||
--show-pci Show PCI paths in output
|
--show-pci Show PCI paths in output
|
||||||
|
|
||||||
@@ -35,6 +36,7 @@ EXAMPLES:
|
|||||||
$(basename "$0") # Normal run with all features
|
$(basename "$0") # Normal run with all features
|
||||||
$(basename "$0") --skip-smart # Fast run without SMART data
|
$(basename "$0") --skip-smart # Fast run without SMART data
|
||||||
$(basename "$0") --color # Run with colored output
|
$(basename "$0") --color # Run with colored output
|
||||||
|
$(basename "$0") --verbose # Show all errors and warnings
|
||||||
$(basename "$0") --debug # Show mapping debug info
|
$(basename "$0") --debug # Show mapping debug info
|
||||||
|
|
||||||
ENVIRONMENT VARIABLES:
|
ENVIRONMENT VARIABLES:
|
||||||
@@ -51,6 +53,7 @@ SKIP_SMART=false
|
|||||||
SKIP_CEPH=false
|
SKIP_CEPH=false
|
||||||
SHOW_PCI=false
|
SHOW_PCI=false
|
||||||
USE_COLOR=false
|
USE_COLOR=false
|
||||||
|
VERBOSE=false
|
||||||
|
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
@@ -82,6 +85,10 @@ while [[ $# -gt 0 ]]; do
|
|||||||
USE_COLOR=true
|
USE_COLOR=true
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
--verbose)
|
||||||
|
VERBOSE=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Unknown option: $1" >&2
|
echo "Unknown option: $1" >&2
|
||||||
echo "Use --help for usage information." >&2
|
echo "Use --help for usage information." >&2
|
||||||
@@ -175,6 +182,52 @@ colorize_header() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# log_error
|
||||||
|
#
|
||||||
|
# Logs an error message to stderr. Always shown regardless of verbose mode.
|
||||||
|
# Args: $1 - error message
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
log_error() {
|
||||||
|
if [[ "$USE_COLOR" == true ]]; then
|
||||||
|
echo -e "${COLOR_RED}ERROR:${COLOR_RESET} $1" >&2
|
||||||
|
else
|
||||||
|
echo "ERROR: $1" >&2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# log_warn
|
||||||
|
#
|
||||||
|
# Logs a warning message to stderr. Only shown in verbose mode.
|
||||||
|
# Args: $1 - warning message
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
log_warn() {
|
||||||
|
if [[ "$VERBOSE" == true ]]; then
|
||||||
|
if [[ "$USE_COLOR" == true ]]; then
|
||||||
|
echo -e "${COLOR_YELLOW}WARN:${COLOR_RESET} $1" >&2
|
||||||
|
else
|
||||||
|
echo "WARN: $1" >&2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# log_info
|
||||||
|
#
|
||||||
|
# Logs an informational message to stderr. Only shown in verbose mode.
|
||||||
|
# Args: $1 - info message
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
log_info() {
|
||||||
|
if [[ "$VERBOSE" == true ]]; then
|
||||||
|
if [[ "$USE_COLOR" == true ]]; then
|
||||||
|
echo -e "${COLOR_CYAN}INFO:${COLOR_RESET} $1" >&2
|
||||||
|
else
|
||||||
|
echo "INFO: $1" >&2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
# Dependency Checks
|
# Dependency Checks
|
||||||
# Verifies required commands are available before running
|
# Verifies required commands are available before running
|
||||||
@@ -499,7 +552,13 @@ build_drive_map() {
|
|||||||
declare -g -A DRIVE_MAP=()
|
declare -g -A DRIVE_MAP=()
|
||||||
declare -g -A BAY_TO_PCI_PATH=()
|
declare -g -A BAY_TO_PCI_PATH=()
|
||||||
|
|
||||||
if [[ -n "$mapping" ]]; then
|
if [[ -z "$mapping" ]]; then
|
||||||
|
log_warn "No drive mapping found for host '$host'. Run diagnose-drives.sh to create one."
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local mapped_count=0
|
||||||
|
local empty_count=0
|
||||||
while read -r path slot; do
|
while read -r path slot; do
|
||||||
[[ -z "$path" || -z "$slot" ]] && continue
|
[[ -z "$path" || -z "$slot" ]] && continue
|
||||||
|
|
||||||
@@ -507,9 +566,14 @@ build_drive_map() {
|
|||||||
if [[ -L "/dev/disk/by-path/$path" ]]; then
|
if [[ -L "/dev/disk/by-path/$path" ]]; then
|
||||||
local drive="$(readlink -f "/dev/disk/by-path/$path" | sed 's/.*\///')"
|
local drive="$(readlink -f "/dev/disk/by-path/$path" | sed 's/.*\///')"
|
||||||
DRIVE_MAP[$slot]="$drive"
|
DRIVE_MAP[$slot]="$drive"
|
||||||
|
((mapped_count++))
|
||||||
|
else
|
||||||
|
log_info "Bay $slot: No device at PCI path $path"
|
||||||
|
((empty_count++))
|
||||||
fi
|
fi
|
||||||
done <<< "$mapping"
|
done <<< "$mapping"
|
||||||
fi
|
|
||||||
|
log_info "Mapped $mapped_count drives, $empty_count empty bays"
|
||||||
}
|
}
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
@@ -530,9 +594,12 @@ build_ceph_cache() {
|
|||||||
|
|
||||||
# Skip if ceph-volume is not available
|
# Skip if ceph-volume is not available
|
||||||
if ! command -v ceph-volume &>/dev/null; then
|
if ! command -v ceph-volume &>/dev/null; then
|
||||||
|
log_info "ceph-volume not found, skipping Ceph OSD detection"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
log_info "Querying Ceph OSD information..."
|
||||||
|
|
||||||
# Parse ceph-volume lvm list output
|
# Parse ceph-volume lvm list output
|
||||||
# Format: blocks starting with "====== osd.X =======" followed by device info
|
# Format: blocks starting with "====== osd.X =======" followed by device info
|
||||||
local current_osd=""
|
local current_osd=""
|
||||||
@@ -549,9 +616,12 @@ build_ceph_cache() {
|
|||||||
|
|
||||||
# Skip if ceph command is not available
|
# Skip if ceph command is not available
|
||||||
if ! command -v ceph &>/dev/null; then
|
if ! command -v ceph &>/dev/null; then
|
||||||
|
log_info "ceph CLI not found, skipping OSD status detection"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
log_info "Querying Ceph OSD status..."
|
||||||
|
|
||||||
# Parse ceph osd tree for status
|
# Parse ceph osd tree for status
|
||||||
# Format: ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT
|
# Format: ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT
|
||||||
while IFS= read -r line; do
|
while IFS= read -r line; do
|
||||||
@@ -607,7 +677,22 @@ get_drive_smart_info() {
|
|||||||
local serial="-"
|
local serial="-"
|
||||||
local warnings=""
|
local warnings=""
|
||||||
|
|
||||||
smart_info="$(sudo smartctl -A -i -H "/dev/$device" 2>/dev/null)"
|
# Capture both stdout and stderr for better error reporting
|
||||||
|
local smart_stderr
|
||||||
|
smart_stderr="$(mktemp)"
|
||||||
|
smart_info="$(sudo smartctl -A -i -H "/dev/$device" 2>"$smart_stderr")"
|
||||||
|
local smart_exit=$?
|
||||||
|
|
||||||
|
if [[ $smart_exit -ne 0 && -s "$smart_stderr" ]]; then
|
||||||
|
log_warn "SMART query failed for $device: $(head -1 "$smart_stderr")"
|
||||||
|
fi
|
||||||
|
rm -f "$smart_stderr"
|
||||||
|
|
||||||
|
if [[ -z "$smart_info" ]]; then
|
||||||
|
log_info "No SMART data available for $device"
|
||||||
|
echo "HDD|-|✗|-|-|"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
# Temperature parsing - handles multiple formats:
|
# Temperature parsing - handles multiple formats:
|
||||||
# - SATA: "194 Temperature_Celsius ... 35" (value at end of line)
|
# - SATA: "194 Temperature_Celsius ... 35" (value at end of line)
|
||||||
|
|||||||
Reference in New Issue
Block a user