513 lines
14 KiB
Markdown
513 lines
14 KiB
Markdown
|
|
# error_handler.func Integration Guide
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
This document describes how `error_handler.func` integrates with other components in the Proxmox Community Scripts project, including dependencies, data flow, and API surface.
|
||
|
|
|
||
|
|
## Dependencies
|
||
|
|
|
||
|
|
### External Dependencies
|
||
|
|
|
||
|
|
#### Required Commands
|
||
|
|
- **None**: Pure Bash implementation
|
||
|
|
|
||
|
|
#### Optional Commands
|
||
|
|
- **None**: No external command dependencies
|
||
|
|
|
||
|
|
### Internal Dependencies
|
||
|
|
|
||
|
|
#### core.func
|
||
|
|
- **Purpose**: Provides color variables for error display
|
||
|
|
- **Usage**: Uses `RD`, `CL`, `YWB` color variables
|
||
|
|
- **Integration**: Called automatically when core.func is sourced
|
||
|
|
- **Data Flow**: Color variables → error display formatting
|
||
|
|
|
||
|
|
## Integration Points
|
||
|
|
|
||
|
|
### With core.func
|
||
|
|
|
||
|
|
#### Silent Execution Integration
|
||
|
|
```bash
|
||
|
|
# core.func silent() function uses error_handler.func
|
||
|
|
silent() {
|
||
|
|
local cmd="$*"
|
||
|
|
local caller_line="${BASH_LINENO[0]:-unknown}"
|
||
|
|
|
||
|
|
# Execute command
|
||
|
|
"$@" >>"$SILENT_LOGFILE" 2>&1
|
||
|
|
local rc=$?
|
||
|
|
|
||
|
|
if [[ $rc -ne 0 ]]; then
|
||
|
|
# Load error_handler.func if needed
|
||
|
|
if ! declare -f explain_exit_code >/dev/null 2>&1; then
|
||
|
|
source error_handler.func
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Get error explanation
|
||
|
|
local explanation
|
||
|
|
explanation="$(explain_exit_code "$rc")"
|
||
|
|
|
||
|
|
# Display error with explanation
|
||
|
|
printf "\e[?25h"
|
||
|
|
echo -e "\n${RD}[ERROR]${CL} in line ${RD}${caller_line}${CL}: exit code ${RD}${rc}${CL} (${explanation})"
|
||
|
|
echo -e "${RD}Command:${CL} ${YWB}${cmd}${CL}\n"
|
||
|
|
|
||
|
|
exit "$rc"
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Color Variable Usage
|
||
|
|
```bash
|
||
|
|
# error_handler.func uses color variables from core.func
|
||
|
|
error_handler() {
|
||
|
|
# ... error handling logic ...
|
||
|
|
|
||
|
|
# Use color variables for error display
|
||
|
|
echo -e "\n${RD}[ERROR]${CL} in line ${RD}${line_number}${CL}: exit code ${RD}${exit_code}${CL} (${explanation}): while executing command ${YWB}${command}${CL}\n"
|
||
|
|
}
|
||
|
|
|
||
|
|
on_interrupt() {
|
||
|
|
echo -e "\n${RD}Interrupted by user (SIGINT)${CL}"
|
||
|
|
exit 130
|
||
|
|
}
|
||
|
|
|
||
|
|
on_terminate() {
|
||
|
|
echo -e "\n${RD}Terminated by signal (SIGTERM)${CL}"
|
||
|
|
exit 143
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### With build.func
|
||
|
|
|
||
|
|
#### Container Creation Error Handling
|
||
|
|
```bash
|
||
|
|
# build.func uses error_handler.func for container operations
|
||
|
|
source core.func
|
||
|
|
source error_handler.func
|
||
|
|
|
||
|
|
# Container creation with error handling
|
||
|
|
create_container() {
|
||
|
|
# Set up error handling
|
||
|
|
catch_errors
|
||
|
|
|
||
|
|
# Container creation operations
|
||
|
|
silent pct create "$CTID" "$TEMPLATE" \
|
||
|
|
--hostname "$HOSTNAME" \
|
||
|
|
--memory "$MEMORY" \
|
||
|
|
--cores "$CORES"
|
||
|
|
|
||
|
|
# If creation fails, error_handler provides explanation
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
#### Template Download Error Handling
|
||
|
|
```bash
|
||
|
|
# build.func uses error_handler.func for template operations
|
||
|
|
download_template() {
|
||
|
|
# Template download with error handling
|
||
|
|
if ! silent curl -fsSL "$TEMPLATE_URL" -o "$TEMPLATE_FILE"; then
|
||
|
|
# error_handler provides detailed explanation
|
||
|
|
exit 222 # Template download failed
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### With tools.func
|
||
|
|
|
||
|
|
#### Maintenance Operations Error Handling
|
||
|
|
```bash
|
||
|
|
# tools.func uses error_handler.func for maintenance operations
|
||
|
|
source core.func
|
||
|
|
source error_handler.func
|
||
|
|
|
||
|
|
# Maintenance operations with error handling
|
||
|
|
update_system() {
|
||
|
|
catch_errors
|
||
|
|
|
||
|
|
# System update operations
|
||
|
|
silent apt-get update
|
||
|
|
silent apt-get upgrade -y
|
||
|
|
|
||
|
|
# Error handling provides explanations for failures
|
||
|
|
}
|
||
|
|
|
||
|
|
cleanup_logs() {
|
||
|
|
catch_errors
|
||
|
|
|
||
|
|
# Log cleanup operations
|
||
|
|
silent find /var/log -name "*.log" -mtime +30 -delete
|
||
|
|
|
||
|
|
# Error handling provides explanations for permission issues
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### With api.func
|
||
|
|
|
||
|
|
#### API Operations Error Handling
|
||
|
|
```bash
|
||
|
|
# api.func uses error_handler.func for API operations
|
||
|
|
source core.func
|
||
|
|
source error_handler.func
|
||
|
|
|
||
|
|
# API operations with error handling
|
||
|
|
api_call() {
|
||
|
|
catch_errors
|
||
|
|
|
||
|
|
# API call with error handling
|
||
|
|
if ! silent curl -k -H "Authorization: PVEAPIToken=$API_TOKEN" \
|
||
|
|
"$API_URL/api2/json/nodes/$NODE/lxc"; then
|
||
|
|
# error_handler provides explanation for API failures
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### With install.func
|
||
|
|
|
||
|
|
#### Installation Process Error Handling
|
||
|
|
```bash
|
||
|
|
# install.func uses error_handler.func for installation operations
|
||
|
|
source core.func
|
||
|
|
source error_handler.func
|
||
|
|
|
||
|
|
# Installation with error handling
|
||
|
|
install_package() {
|
||
|
|
local package="$1"
|
||
|
|
|
||
|
|
catch_errors
|
||
|
|
|
||
|
|
# Package installation
|
||
|
|
silent apt-get install -y "$package"
|
||
|
|
|
||
|
|
# Error handling provides explanations for installation failures
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### With alpine-install.func
|
||
|
|
|
||
|
|
#### Alpine Installation Error Handling
|
||
|
|
```bash
|
||
|
|
# alpine-install.func uses error_handler.func for Alpine operations
|
||
|
|
source core.func
|
||
|
|
source error_handler.func
|
||
|
|
|
||
|
|
# Alpine installation with error handling
|
||
|
|
install_alpine_package() {
|
||
|
|
local package="$1"
|
||
|
|
|
||
|
|
catch_errors
|
||
|
|
|
||
|
|
# Alpine package installation
|
||
|
|
silent apk add --no-cache "$package"
|
||
|
|
|
||
|
|
# Error handling provides explanations for Alpine-specific failures
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### With alpine-tools.func
|
||
|
|
|
||
|
|
#### Alpine Tools Error Handling
|
||
|
|
```bash
|
||
|
|
# alpine-tools.func uses error_handler.func for Alpine tools
|
||
|
|
source core.func
|
||
|
|
source error_handler.func
|
||
|
|
|
||
|
|
# Alpine tools with error handling
|
||
|
|
alpine_tool_operation() {
|
||
|
|
catch_errors
|
||
|
|
|
||
|
|
# Alpine-specific tool operations
|
||
|
|
silent alpine_command
|
||
|
|
|
||
|
|
# Error handling provides explanations for Alpine tool failures
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### With passthrough.func
|
||
|
|
|
||
|
|
#### Hardware Passthrough Error Handling
|
||
|
|
```bash
|
||
|
|
# passthrough.func uses error_handler.func for hardware operations
|
||
|
|
source core.func
|
||
|
|
source error_handler.func
|
||
|
|
|
||
|
|
# Hardware passthrough with error handling
|
||
|
|
configure_gpu_passthrough() {
|
||
|
|
catch_errors
|
||
|
|
|
||
|
|
# GPU passthrough operations
|
||
|
|
silent lspci | grep -i nvidia
|
||
|
|
|
||
|
|
# Error handling provides explanations for hardware failures
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### With vm-core.func
|
||
|
|
|
||
|
|
#### VM Operations Error Handling
|
||
|
|
```bash
|
||
|
|
# vm-core.func uses error_handler.func for VM operations
|
||
|
|
source core.func
|
||
|
|
source error_handler.func
|
||
|
|
|
||
|
|
# VM operations with error handling
|
||
|
|
create_vm() {
|
||
|
|
catch_errors
|
||
|
|
|
||
|
|
# VM creation operations
|
||
|
|
silent qm create "$VMID" \
|
||
|
|
--name "$VMNAME" \
|
||
|
|
--memory "$MEMORY" \
|
||
|
|
--cores "$CORES"
|
||
|
|
|
||
|
|
# Error handling provides explanations for VM creation failures
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Data Flow
|
||
|
|
|
||
|
|
### Input Data
|
||
|
|
|
||
|
|
#### Environment Variables
|
||
|
|
- **`DEBUG_LOGFILE`**: Path to debug log file for error logging
|
||
|
|
- **`SILENT_LOGFILE`**: Path to silent execution log file
|
||
|
|
- **`STRICT_UNSET`**: Enable strict unset variable checking (0/1)
|
||
|
|
- **`lockfile`**: Lock file path for cleanup (set by calling script)
|
||
|
|
|
||
|
|
#### Function Parameters
|
||
|
|
- **Exit codes**: Passed to `explain_exit_code()` and `error_handler()`
|
||
|
|
- **Command information**: Passed to `error_handler()` for context
|
||
|
|
- **Signal information**: Passed to signal handlers
|
||
|
|
|
||
|
|
#### System Information
|
||
|
|
- **Exit codes**: Retrieved from `$?` variable
|
||
|
|
- **Command information**: Retrieved from `BASH_COMMAND` variable
|
||
|
|
- **Line numbers**: Retrieved from `BASH_LINENO[0]` variable
|
||
|
|
- **Process information**: Retrieved from system calls
|
||
|
|
|
||
|
|
### Processing Data
|
||
|
|
|
||
|
|
#### Error Code Processing
|
||
|
|
- **Code classification**: Categorize exit codes by type
|
||
|
|
- **Explanation lookup**: Map codes to human-readable messages
|
||
|
|
- **Context collection**: Gather command and line information
|
||
|
|
- **Log preparation**: Format error information for logging
|
||
|
|
|
||
|
|
#### Signal Processing
|
||
|
|
- **Signal detection**: Identify received signals
|
||
|
|
- **Handler selection**: Choose appropriate signal handler
|
||
|
|
- **Cleanup operations**: Perform necessary cleanup
|
||
|
|
- **Exit code setting**: Set appropriate exit codes
|
||
|
|
|
||
|
|
#### Log Processing
|
||
|
|
- **Debug logging**: Write error information to debug log
|
||
|
|
- **Silent log integration**: Display silent log content
|
||
|
|
- **Log formatting**: Format log entries for readability
|
||
|
|
- **Log analysis**: Provide log analysis capabilities
|
||
|
|
|
||
|
|
### Output Data
|
||
|
|
|
||
|
|
#### Error Information
|
||
|
|
- **Error messages**: Human-readable error explanations
|
||
|
|
- **Context information**: Line numbers, commands, timestamps
|
||
|
|
- **Color formatting**: ANSI color codes for terminal display
|
||
|
|
- **Log content**: Silent log excerpts and debug information
|
||
|
|
|
||
|
|
#### System State
|
||
|
|
- **Exit codes**: Returned from functions
|
||
|
|
- **Log files**: Created and updated for error tracking
|
||
|
|
- **Cleanup status**: Lock file removal and process cleanup
|
||
|
|
- **Signal handling**: Graceful signal processing
|
||
|
|
|
||
|
|
## API Surface
|
||
|
|
|
||
|
|
### Public Functions
|
||
|
|
|
||
|
|
#### Error Explanation
|
||
|
|
- **`explain_exit_code()`**: Convert exit codes to explanations
|
||
|
|
- **Parameters**: Exit code to explain
|
||
|
|
- **Returns**: Human-readable explanation string
|
||
|
|
- **Usage**: Called by error_handler() and other functions
|
||
|
|
|
||
|
|
#### Error Handling
|
||
|
|
- **`error_handler()`**: Main error handler function
|
||
|
|
- **Parameters**: Exit code (optional), command (optional)
|
||
|
|
- **Returns**: None (exits with error code)
|
||
|
|
- **Usage**: Called by ERR trap or manually
|
||
|
|
|
||
|
|
#### Signal Handling
|
||
|
|
- **`on_interrupt()`**: Handle SIGINT signals
|
||
|
|
- **`on_terminate()`**: Handle SIGTERM signals
|
||
|
|
- **`on_exit()`**: Handle script exit cleanup
|
||
|
|
- **Parameters**: None
|
||
|
|
- **Returns**: None (exits with signal code)
|
||
|
|
- **Usage**: Called by signal traps
|
||
|
|
|
||
|
|
#### Initialization
|
||
|
|
- **`catch_errors()`**: Initialize error handling
|
||
|
|
- **Parameters**: None
|
||
|
|
- **Returns**: None
|
||
|
|
- **Usage**: Called to set up error handling traps
|
||
|
|
|
||
|
|
### Internal Functions
|
||
|
|
|
||
|
|
#### None
|
||
|
|
- All functions in error_handler.func are public
|
||
|
|
- No internal helper functions
|
||
|
|
- Direct implementation of all functionality
|
||
|
|
|
||
|
|
### Global Variables
|
||
|
|
|
||
|
|
#### Configuration Variables
|
||
|
|
- **`DEBUG_LOGFILE`**: Debug log file path
|
||
|
|
- **`SILENT_LOGFILE`**: Silent log file path
|
||
|
|
- **`STRICT_UNSET`**: Strict mode setting
|
||
|
|
- **`lockfile`**: Lock file path
|
||
|
|
|
||
|
|
#### State Variables
|
||
|
|
- **`exit_code`**: Current exit code
|
||
|
|
- **`command`**: Failed command
|
||
|
|
- **`line_number`**: Line number where error occurred
|
||
|
|
- **`explanation`**: Error explanation text
|
||
|
|
|
||
|
|
## Integration Patterns
|
||
|
|
|
||
|
|
### Standard Integration Pattern
|
||
|
|
|
||
|
|
```bash
|
||
|
|
#!/usr/bin/env bash
|
||
|
|
# Standard integration pattern
|
||
|
|
|
||
|
|
# 1. Source core.func first
|
||
|
|
source core.func
|
||
|
|
|
||
|
|
# 2. Source error_handler.func
|
||
|
|
source error_handler.func
|
||
|
|
|
||
|
|
# 3. Initialize error handling
|
||
|
|
catch_errors
|
||
|
|
|
||
|
|
# 4. Use silent execution
|
||
|
|
silent command
|
||
|
|
|
||
|
|
# 5. Errors are automatically handled
|
||
|
|
```
|
||
|
|
|
||
|
|
### Minimal Integration Pattern
|
||
|
|
|
||
|
|
```bash
|
||
|
|
#!/usr/bin/env bash
|
||
|
|
# Minimal integration pattern
|
||
|
|
|
||
|
|
source error_handler.func
|
||
|
|
catch_errors
|
||
|
|
|
||
|
|
# Basic error handling
|
||
|
|
command
|
||
|
|
```
|
||
|
|
|
||
|
|
### Advanced Integration Pattern
|
||
|
|
|
||
|
|
```bash
|
||
|
|
#!/usr/bin/env bash
|
||
|
|
# Advanced integration pattern
|
||
|
|
|
||
|
|
source core.func
|
||
|
|
source error_handler.func
|
||
|
|
|
||
|
|
# Set up comprehensive error handling
|
||
|
|
export DEBUG_LOGFILE="/tmp/debug.log"
|
||
|
|
export SILENT_LOGFILE="/tmp/silent.log"
|
||
|
|
lockfile="/tmp/script.lock"
|
||
|
|
touch "$lockfile"
|
||
|
|
|
||
|
|
catch_errors
|
||
|
|
trap on_interrupt INT
|
||
|
|
trap on_terminate TERM
|
||
|
|
trap on_exit EXIT
|
||
|
|
|
||
|
|
# Advanced error handling
|
||
|
|
silent command
|
||
|
|
```
|
||
|
|
|
||
|
|
## Error Handling Integration
|
||
|
|
|
||
|
|
### Automatic Error Handling
|
||
|
|
- **ERR Trap**: Automatically catches command failures
|
||
|
|
- **Error Explanation**: Provides human-readable error messages
|
||
|
|
- **Context Information**: Shows line numbers and commands
|
||
|
|
- **Log Integration**: Displays silent log content
|
||
|
|
|
||
|
|
### Manual Error Handling
|
||
|
|
- **Custom Error Codes**: Use Proxmox custom error codes
|
||
|
|
- **Error Recovery**: Implement retry logic with error handling
|
||
|
|
- **Conditional Handling**: Different handling for different error types
|
||
|
|
- **Error Analysis**: Analyze error patterns and trends
|
||
|
|
|
||
|
|
### Signal Handling Integration
|
||
|
|
- **Graceful Interruption**: Handle Ctrl+C gracefully
|
||
|
|
- **Clean Termination**: Handle SIGTERM signals
|
||
|
|
- **Exit Cleanup**: Clean up resources on script exit
|
||
|
|
- **Lock File Management**: Remove lock files on exit
|
||
|
|
|
||
|
|
## Performance Considerations
|
||
|
|
|
||
|
|
### Error Handling Overhead
|
||
|
|
- **Minimal Impact**: Error handling adds minimal overhead
|
||
|
|
- **Trap Setup**: Trap setup is done once during initialization
|
||
|
|
- **Error Processing**: Error processing is only done on failures
|
||
|
|
- **Log Writing**: Log writing is only done when enabled
|
||
|
|
|
||
|
|
### Memory Usage
|
||
|
|
- **Minimal Footprint**: Error handler uses minimal memory
|
||
|
|
- **Variable Reuse**: Global variables reused across functions
|
||
|
|
- **No Memory Leaks**: Proper cleanup prevents memory leaks
|
||
|
|
- **Efficient Processing**: Efficient error code processing
|
||
|
|
|
||
|
|
### Execution Speed
|
||
|
|
- **Fast Error Detection**: Quick error detection and handling
|
||
|
|
- **Efficient Explanation**: Fast error code explanation lookup
|
||
|
|
- **Minimal Delay**: Minimal delay in error handling
|
||
|
|
- **Quick Exit**: Fast exit on error conditions
|
||
|
|
|
||
|
|
## Security Considerations
|
||
|
|
|
||
|
|
### Error Information Disclosure
|
||
|
|
- **Controlled Disclosure**: Only necessary error information is shown
|
||
|
|
- **Log Security**: Log files have appropriate permissions
|
||
|
|
- **Sensitive Data**: Sensitive data is not logged
|
||
|
|
- **Error Sanitization**: Error messages are sanitized
|
||
|
|
|
||
|
|
### Signal Handling Security
|
||
|
|
- **Signal Validation**: Only expected signals are handled
|
||
|
|
- **Cleanup Security**: Secure cleanup of temporary files
|
||
|
|
- **Lock File Security**: Secure lock file management
|
||
|
|
- **Process Security**: Secure process termination
|
||
|
|
|
||
|
|
### Log File Security
|
||
|
|
- **File Permissions**: Log files have appropriate permissions
|
||
|
|
- **Log Rotation**: Log files are rotated to prevent disk filling
|
||
|
|
- **Log Cleanup**: Old log files are cleaned up
|
||
|
|
- **Log Access**: Log access is controlled
|
||
|
|
|
||
|
|
## Future Integration Considerations
|
||
|
|
|
||
|
|
### Extensibility
|
||
|
|
- **New Error Codes**: Easy to add new error code explanations
|
||
|
|
- **Custom Handlers**: Easy to add custom error handlers
|
||
|
|
- **Signal Extensions**: Easy to add new signal handlers
|
||
|
|
- **Log Formats**: Easy to add new log formats
|
||
|
|
|
||
|
|
### Compatibility
|
||
|
|
- **Bash Version**: Compatible with different Bash versions
|
||
|
|
- **System Compatibility**: Compatible with different systems
|
||
|
|
- **Script Compatibility**: Compatible with different script types
|
||
|
|
- **Error Code Compatibility**: Compatible with different error codes
|
||
|
|
|
||
|
|
### Performance
|
||
|
|
- **Optimization**: Error handling can be optimized for better performance
|
||
|
|
- **Caching**: Error explanations can be cached for faster lookup
|
||
|
|
- **Parallel Processing**: Error handling can be parallelized
|
||
|
|
- **Resource Management**: Better resource management for error handling
|