fix: always show SSH access dialog in advanced settings (#9765)
- SSH access dialog is now always displayed regardless of password or SSH keys - Added step indicator to SSH settings dialogs for consistency - configure_ssh_settings() now accepts optional step_info parameter - Updated documentation for SSH configuration functions Fixes #9753
This commit is contained in:
parent
a748be9a1f
commit
3fb9d02f36
@ -9,10 +9,12 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
### Initialization Functions
|
### Initialization Functions
|
||||||
|
|
||||||
#### `start()`
|
#### `start()`
|
||||||
|
|
||||||
**Purpose**: Main entry point when build.func is sourced or executed
|
**Purpose**: Main entry point when build.func is sourced or executed
|
||||||
**Parameters**: None
|
**Parameters**: None
|
||||||
**Returns**: None
|
**Returns**: None
|
||||||
**Side Effects**:
|
**Side Effects**:
|
||||||
|
|
||||||
- Detects execution context (Proxmox host vs container)
|
- Detects execution context (Proxmox host vs container)
|
||||||
- Captures hard environment variables
|
- Captures hard environment variables
|
||||||
- Sets CT_TYPE based on context
|
- Sets CT_TYPE based on context
|
||||||
@ -21,10 +23,12 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
**Environment Variables Used**: `CT_TYPE`, `APP`, `CTID`
|
**Environment Variables Used**: `CT_TYPE`, `APP`, `CTID`
|
||||||
|
|
||||||
#### `variables()`
|
#### `variables()`
|
||||||
|
|
||||||
**Purpose**: Load and resolve all configuration variables using precedence chain
|
**Purpose**: Load and resolve all configuration variables using precedence chain
|
||||||
**Parameters**: None
|
**Parameters**: None
|
||||||
**Returns**: None
|
**Returns**: None
|
||||||
**Side Effects**:
|
**Side Effects**:
|
||||||
|
|
||||||
- Loads app-specific .vars file
|
- Loads app-specific .vars file
|
||||||
- Loads global default.vars file
|
- Loads global default.vars file
|
||||||
- Applies variable precedence chain
|
- Applies variable precedence chain
|
||||||
@ -33,6 +37,7 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
**Environment Variables Used**: All configuration variables
|
**Environment Variables Used**: All configuration variables
|
||||||
|
|
||||||
#### `base_settings()`
|
#### `base_settings()`
|
||||||
|
|
||||||
**Purpose**: Set built-in default values for all configuration variables
|
**Purpose**: Set built-in default values for all configuration variables
|
||||||
**Parameters**: None
|
**Parameters**: None
|
||||||
**Returns**: None
|
**Returns**: None
|
||||||
@ -43,10 +48,12 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
### UI and Menu Functions
|
### UI and Menu Functions
|
||||||
|
|
||||||
#### `install_script()`
|
#### `install_script()`
|
||||||
|
|
||||||
**Purpose**: Main installation workflow coordinator
|
**Purpose**: Main installation workflow coordinator
|
||||||
**Parameters**: None
|
**Parameters**: None
|
||||||
**Returns**: None
|
**Returns**: None
|
||||||
**Side Effects**:
|
**Side Effects**:
|
||||||
|
|
||||||
- Displays installation mode selection menu
|
- Displays installation mode selection menu
|
||||||
- Coordinates the entire installation process
|
- Coordinates the entire installation process
|
||||||
- Handles user interaction and validation
|
- Handles user interaction and validation
|
||||||
@ -54,10 +61,12 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
**Environment Variables Used**: `APP`, `CTID`, `var_hostname`
|
**Environment Variables Used**: `APP`, `CTID`, `var_hostname`
|
||||||
|
|
||||||
#### `advanced_settings()`
|
#### `advanced_settings()`
|
||||||
|
|
||||||
**Purpose**: Provide advanced configuration options via whiptail menus
|
**Purpose**: Provide advanced configuration options via whiptail menus
|
||||||
**Parameters**: None
|
**Parameters**: None
|
||||||
**Returns**: None
|
**Returns**: None
|
||||||
**Side Effects**:
|
**Side Effects**:
|
||||||
|
|
||||||
- Displays whiptail menus for configuration
|
- Displays whiptail menus for configuration
|
||||||
- Updates configuration variables based on user input
|
- Updates configuration variables based on user input
|
||||||
- Validates user selections
|
- Validates user selections
|
||||||
@ -65,6 +74,7 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
**Environment Variables Used**: All configuration variables
|
**Environment Variables Used**: All configuration variables
|
||||||
|
|
||||||
#### `settings_menu()`
|
#### `settings_menu()`
|
||||||
|
|
||||||
**Purpose**: Display and handle settings configuration menu
|
**Purpose**: Display and handle settings configuration menu
|
||||||
**Parameters**: None
|
**Parameters**: None
|
||||||
**Returns**: None
|
**Returns**: None
|
||||||
@ -75,10 +85,12 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
### Storage Functions
|
### Storage Functions
|
||||||
|
|
||||||
#### `select_storage()`
|
#### `select_storage()`
|
||||||
|
|
||||||
**Purpose**: Handle storage selection for templates and containers
|
**Purpose**: Handle storage selection for templates and containers
|
||||||
**Parameters**: None
|
**Parameters**: None
|
||||||
**Returns**: None
|
**Returns**: None
|
||||||
**Side Effects**:
|
**Side Effects**:
|
||||||
|
|
||||||
- Resolves storage preselection
|
- Resolves storage preselection
|
||||||
- Prompts user for storage selection if needed
|
- Prompts user for storage selection if needed
|
||||||
- Validates storage availability
|
- Validates storage availability
|
||||||
@ -87,8 +99,10 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
**Environment Variables Used**: `var_template_storage`, `var_container_storage`, `TEMPLATE_STORAGE`, `CONTAINER_STORAGE`
|
**Environment Variables Used**: `var_template_storage`, `var_container_storage`, `TEMPLATE_STORAGE`, `CONTAINER_STORAGE`
|
||||||
|
|
||||||
#### `resolve_storage_preselect()`
|
#### `resolve_storage_preselect()`
|
||||||
|
|
||||||
**Purpose**: Resolve preselected storage options
|
**Purpose**: Resolve preselected storage options
|
||||||
**Parameters**:
|
**Parameters**:
|
||||||
|
|
||||||
- `storage_type`: Type of storage (template or container)
|
- `storage_type`: Type of storage (template or container)
|
||||||
**Returns**: Storage name if valid, empty if invalid
|
**Returns**: Storage name if valid, empty if invalid
|
||||||
**Side Effects**: Validates storage availability
|
**Side Effects**: Validates storage availability
|
||||||
@ -96,8 +110,10 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
**Environment Variables Used**: `var_template_storage`, `var_container_storage`
|
**Environment Variables Used**: `var_template_storage`, `var_container_storage`
|
||||||
|
|
||||||
#### `choose_and_set_storage_for_file()`
|
#### `choose_and_set_storage_for_file()`
|
||||||
|
|
||||||
**Purpose**: Interactive storage selection via whiptail
|
**Purpose**: Interactive storage selection via whiptail
|
||||||
**Parameters**:
|
**Parameters**:
|
||||||
|
|
||||||
- `storage_type`: Type of storage (template or container)
|
- `storage_type`: Type of storage (template or container)
|
||||||
- `content_type`: Content type (vztmpl or rootdir)
|
- `content_type`: Content type (vztmpl or rootdir)
|
||||||
**Returns**: None
|
**Returns**: None
|
||||||
@ -111,10 +127,12 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
### Container Creation Functions
|
### Container Creation Functions
|
||||||
|
|
||||||
#### `build_container()`
|
#### `build_container()`
|
||||||
|
|
||||||
**Purpose**: Validate settings and prepare container creation
|
**Purpose**: Validate settings and prepare container creation
|
||||||
**Parameters**: None
|
**Parameters**: None
|
||||||
**Returns**: None
|
**Returns**: None
|
||||||
**Side Effects**:
|
**Side Effects**:
|
||||||
|
|
||||||
- Validates all configuration
|
- Validates all configuration
|
||||||
- Checks for conflicts
|
- Checks for conflicts
|
||||||
- Prepares container configuration
|
- Prepares container configuration
|
||||||
@ -123,10 +141,12 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
**Environment Variables Used**: All configuration variables
|
**Environment Variables Used**: All configuration variables
|
||||||
|
|
||||||
#### `create_lxc_container()`
|
#### `create_lxc_container()`
|
||||||
|
|
||||||
**Purpose**: Create the actual LXC container
|
**Purpose**: Create the actual LXC container
|
||||||
**Parameters**: None
|
**Parameters**: None
|
||||||
**Returns**: None
|
**Returns**: None
|
||||||
**Side Effects**:
|
**Side Effects**:
|
||||||
|
|
||||||
- Creates LXC container with basic configuration
|
- Creates LXC container with basic configuration
|
||||||
- Configures network settings
|
- Configures network settings
|
||||||
- Sets up storage and mount points
|
- Sets up storage and mount points
|
||||||
@ -140,10 +160,12 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
### GPU and Hardware Functions
|
### GPU and Hardware Functions
|
||||||
|
|
||||||
#### `detect_gpu_devices()`
|
#### `detect_gpu_devices()`
|
||||||
|
|
||||||
**Purpose**: Detect available GPU hardware on the system
|
**Purpose**: Detect available GPU hardware on the system
|
||||||
**Parameters**: None
|
**Parameters**: None
|
||||||
**Returns**: None
|
**Returns**: None
|
||||||
**Side Effects**:
|
**Side Effects**:
|
||||||
|
|
||||||
- Scans for Intel, AMD, and NVIDIA GPUs
|
- Scans for Intel, AMD, and NVIDIA GPUs
|
||||||
- Updates var_gpu_type and var_gpu_devices
|
- Updates var_gpu_type and var_gpu_devices
|
||||||
- Determines GPU capabilities
|
- Determines GPU capabilities
|
||||||
@ -151,10 +173,12 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
**Environment Variables Used**: `var_gpu_type`, `var_gpu_devices`, `GPU_APPS`
|
**Environment Variables Used**: `var_gpu_type`, `var_gpu_devices`, `GPU_APPS`
|
||||||
|
|
||||||
#### `configure_gpu_passthrough()`
|
#### `configure_gpu_passthrough()`
|
||||||
|
|
||||||
**Purpose**: Configure GPU passthrough for the container
|
**Purpose**: Configure GPU passthrough for the container
|
||||||
**Parameters**: None
|
**Parameters**: None
|
||||||
**Returns**: None
|
**Returns**: None
|
||||||
**Side Effects**:
|
**Side Effects**:
|
||||||
|
|
||||||
- Adds GPU device entries to container config
|
- Adds GPU device entries to container config
|
||||||
- Configures proper device permissions
|
- Configures proper device permissions
|
||||||
- Sets up device mapping
|
- Sets up device mapping
|
||||||
@ -163,23 +187,78 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
**Environment Variables Used**: `var_gpu`, `var_gpu_type`, `var_gpu_devices`, `CTID`
|
**Environment Variables Used**: `var_gpu`, `var_gpu_type`, `var_gpu_devices`, `CTID`
|
||||||
|
|
||||||
#### `fix_gpu_gids()`
|
#### `fix_gpu_gids()`
|
||||||
|
|
||||||
**Purpose**: Fix GPU group IDs after container creation
|
**Purpose**: Fix GPU group IDs after container creation
|
||||||
**Parameters**: None
|
**Parameters**: None
|
||||||
**Returns**: None
|
**Returns**: None
|
||||||
**Side Effects**:
|
**Side Effects**:
|
||||||
|
|
||||||
- Updates GPU group IDs in container
|
- Updates GPU group IDs in container
|
||||||
- Ensures proper GPU access permissions
|
- Ensures proper GPU access permissions
|
||||||
- Configures video and render groups
|
- Configures video and render groups
|
||||||
**Dependencies**: `configure_gpu_passthrough()`
|
**Dependencies**: `configure_gpu_passthrough()`
|
||||||
**Environment Variables Used**: `CTID`, `var_gpu_type`
|
**Environment Variables Used**: `CTID`, `var_gpu_type`
|
||||||
|
|
||||||
|
### SSH Configuration Functions
|
||||||
|
|
||||||
|
#### `configure_ssh_settings()`
|
||||||
|
|
||||||
|
**Purpose**: Interactive SSH key and access configuration wizard
|
||||||
|
**Parameters**:
|
||||||
|
|
||||||
|
- `step_info` (optional): Step indicator string (e.g., "Step 17/19") for consistent dialog headers
|
||||||
|
**Returns**: None
|
||||||
|
**Side Effects**:
|
||||||
|
- Creates temporary file for SSH keys
|
||||||
|
- Discovers and presents available SSH keys from host
|
||||||
|
- Allows manual key entry or folder/glob scanning
|
||||||
|
- Sets `SSH` variable to "yes" or "no" based on user selection
|
||||||
|
- Sets `SSH_AUTHORIZED_KEY` if manual key provided
|
||||||
|
- Populates `SSH_KEYS_FILE` with selected keys
|
||||||
|
**Dependencies**: `ssh_discover_default_files()`, `ssh_build_choices_from_files()`
|
||||||
|
**Environment Variables Used**: `SSH`, `SSH_AUTHORIZED_KEY`, `SSH_KEYS_FILE`
|
||||||
|
|
||||||
|
**SSH Key Source Options**:
|
||||||
|
|
||||||
|
1. `found` - Select from auto-detected host keys
|
||||||
|
2. `manual` - Paste a single public key
|
||||||
|
3. `folder` - Scan custom folder or glob pattern
|
||||||
|
4. `none` - No SSH keys
|
||||||
|
|
||||||
|
**Note**: The "Enable root SSH access?" dialog is always shown, regardless of whether SSH keys or password are configured. This ensures users can always enable SSH access even with automatic login.
|
||||||
|
|
||||||
|
#### `ssh_discover_default_files()`
|
||||||
|
|
||||||
|
**Purpose**: Discover SSH public key files on the host system
|
||||||
|
**Parameters**: None
|
||||||
|
**Returns**: Array of discovered key file paths
|
||||||
|
**Side Effects**: Scans common SSH key locations
|
||||||
|
**Dependencies**: None
|
||||||
|
**Environment Variables Used**: `var_ssh_import_glob`
|
||||||
|
|
||||||
|
#### `ssh_build_choices_from_files()`
|
||||||
|
|
||||||
|
**Purpose**: Build whiptail checklist choices from SSH key files
|
||||||
|
**Parameters**:
|
||||||
|
|
||||||
|
- Array of file paths to process
|
||||||
|
**Returns**: None
|
||||||
|
**Side Effects**:
|
||||||
|
- Sets `CHOICES` array for whiptail checklist
|
||||||
|
- Sets `COUNT` variable with number of keys found
|
||||||
|
- Creates `MAPFILE` for key tag to content mapping
|
||||||
|
**Dependencies**: None
|
||||||
|
**Environment Variables Used**: `CHOICES`, `COUNT`, `MAPFILE`
|
||||||
|
|
||||||
### Settings Persistence Functions
|
### Settings Persistence Functions
|
||||||
|
|
||||||
#### `default_var_settings()`
|
#### `default_var_settings()`
|
||||||
|
|
||||||
**Purpose**: Offer to save current settings as defaults
|
**Purpose**: Offer to save current settings as defaults
|
||||||
**Parameters**: None
|
**Parameters**: None
|
||||||
**Returns**: None
|
**Returns**: None
|
||||||
**Side Effects**:
|
**Side Effects**:
|
||||||
|
|
||||||
- Prompts user to save settings
|
- Prompts user to save settings
|
||||||
- Saves to default.vars file
|
- Saves to default.vars file
|
||||||
- Saves to app-specific .vars file
|
- Saves to app-specific .vars file
|
||||||
@ -187,10 +266,12 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
**Environment Variables Used**: All configuration variables
|
**Environment Variables Used**: All configuration variables
|
||||||
|
|
||||||
#### `maybe_offer_save_app_defaults()`
|
#### `maybe_offer_save_app_defaults()`
|
||||||
|
|
||||||
**Purpose**: Offer to save app-specific defaults
|
**Purpose**: Offer to save app-specific defaults
|
||||||
**Parameters**: None
|
**Parameters**: None
|
||||||
**Returns**: None
|
**Returns**: None
|
||||||
**Side Effects**:
|
**Side Effects**:
|
||||||
|
|
||||||
- Prompts user to save app-specific settings
|
- Prompts user to save app-specific settings
|
||||||
- Saves to app.vars file
|
- Saves to app.vars file
|
||||||
- Updates app-specific configuration
|
- Updates app-specific configuration
|
||||||
@ -200,10 +281,12 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
### Utility Functions
|
### Utility Functions
|
||||||
|
|
||||||
#### `validate_settings()`
|
#### `validate_settings()`
|
||||||
|
|
||||||
**Purpose**: Validate all configuration settings
|
**Purpose**: Validate all configuration settings
|
||||||
**Parameters**: None
|
**Parameters**: None
|
||||||
**Returns**: 0 if valid, 1 if invalid
|
**Returns**: 0 if valid, 1 if invalid
|
||||||
**Side Effects**:
|
**Side Effects**:
|
||||||
|
|
||||||
- Checks for configuration conflicts
|
- Checks for configuration conflicts
|
||||||
- Validates resource limits
|
- Validates resource limits
|
||||||
- Validates network configuration
|
- Validates network configuration
|
||||||
@ -212,10 +295,12 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
**Environment Variables Used**: All configuration variables
|
**Environment Variables Used**: All configuration variables
|
||||||
|
|
||||||
#### `check_conflicts()`
|
#### `check_conflicts()`
|
||||||
|
|
||||||
**Purpose**: Check for configuration conflicts
|
**Purpose**: Check for configuration conflicts
|
||||||
**Parameters**: None
|
**Parameters**: None
|
||||||
**Returns**: 0 if no conflicts, 1 if conflicts found
|
**Returns**: 0 if no conflicts, 1 if conflicts found
|
||||||
**Side Effects**:
|
**Side Effects**:
|
||||||
|
|
||||||
- Checks for conflicting settings
|
- Checks for conflicting settings
|
||||||
- Validates resource allocation
|
- Validates resource allocation
|
||||||
- Checks network configuration
|
- Checks network configuration
|
||||||
@ -223,10 +308,12 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
**Environment Variables Used**: All configuration variables
|
**Environment Variables Used**: All configuration variables
|
||||||
|
|
||||||
#### `cleanup_on_error()`
|
#### `cleanup_on_error()`
|
||||||
|
|
||||||
**Purpose**: Clean up resources on error
|
**Purpose**: Clean up resources on error
|
||||||
**Parameters**: None
|
**Parameters**: None
|
||||||
**Returns**: None
|
**Returns**: None
|
||||||
**Side Effects**:
|
**Side Effects**:
|
||||||
|
|
||||||
- Removes partially created containers
|
- Removes partially created containers
|
||||||
- Cleans up temporary files
|
- Cleans up temporary files
|
||||||
- Resets configuration
|
- Resets configuration
|
||||||
@ -236,6 +323,7 @@ This document provides a comprehensive reference of all functions in `build.func
|
|||||||
## Function Call Flow
|
## Function Call Flow
|
||||||
|
|
||||||
### Main Installation Flow
|
### Main Installation Flow
|
||||||
|
|
||||||
```
|
```
|
||||||
start()
|
start()
|
||||||
├── variables()
|
├── variables()
|
||||||
@ -259,6 +347,7 @@ start()
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Error Handling Flow
|
### Error Handling Flow
|
||||||
|
|
||||||
```
|
```
|
||||||
Error Detection
|
Error Detection
|
||||||
├── validate_settings()
|
├── validate_settings()
|
||||||
@ -271,24 +360,29 @@ Error Detection
|
|||||||
## Function Dependencies
|
## Function Dependencies
|
||||||
|
|
||||||
### Core Dependencies
|
### Core Dependencies
|
||||||
|
|
||||||
- `start()` → `install_script()` → `build_container()` → `create_lxc_container()`
|
- `start()` → `install_script()` → `build_container()` → `create_lxc_container()`
|
||||||
- `variables()` → `base_settings()`
|
- `variables()` → `base_settings()`
|
||||||
- `advanced_settings()` → `select_storage()` → `detect_gpu_devices()`
|
- `advanced_settings()` → `select_storage()` → `detect_gpu_devices()`
|
||||||
|
|
||||||
### Storage Dependencies
|
### Storage Dependencies
|
||||||
|
|
||||||
- `select_storage()` → `resolve_storage_preselect()`
|
- `select_storage()` → `resolve_storage_preselect()`
|
||||||
- `select_storage()` → `choose_and_set_storage_for_file()`
|
- `select_storage()` → `choose_and_set_storage_for_file()`
|
||||||
|
|
||||||
### GPU Dependencies
|
### GPU Dependencies
|
||||||
|
|
||||||
- `configure_gpu_passthrough()` → `detect_gpu_devices()`
|
- `configure_gpu_passthrough()` → `detect_gpu_devices()`
|
||||||
- `fix_gpu_gids()` → `configure_gpu_passthrough()`
|
- `fix_gpu_gids()` → `configure_gpu_passthrough()`
|
||||||
|
|
||||||
### Settings Dependencies
|
### Settings Dependencies
|
||||||
|
|
||||||
- `default_var_settings()` → `maybe_offer_save_app_defaults()`
|
- `default_var_settings()` → `maybe_offer_save_app_defaults()`
|
||||||
|
|
||||||
## Function Usage Examples
|
## Function Usage Examples
|
||||||
|
|
||||||
### Basic Container Creation
|
### Basic Container Creation
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Set required variables
|
# Set required variables
|
||||||
export APP="plex"
|
export APP="plex"
|
||||||
@ -304,6 +398,7 @@ start() # Entry point
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Advanced Configuration
|
### Advanced Configuration
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Set advanced variables
|
# Set advanced variables
|
||||||
export var_os="debian"
|
export var_os="debian"
|
||||||
@ -319,6 +414,7 @@ advanced_settings() # Interactive configuration
|
|||||||
```
|
```
|
||||||
|
|
||||||
### GPU Passthrough
|
### GPU Passthrough
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Enable GPU passthrough
|
# Enable GPU passthrough
|
||||||
export GPU_APPS="plex"
|
export GPU_APPS="plex"
|
||||||
@ -331,6 +427,7 @@ fix_gpu_gids() # Fix permissions
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Settings Persistence
|
### Settings Persistence
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Save settings as defaults
|
# Save settings as defaults
|
||||||
export SAVE_DEFAULTS="true"
|
export SAVE_DEFAULTS="true"
|
||||||
@ -344,15 +441,18 @@ maybe_offer_save_app_defaults() # Save app defaults
|
|||||||
## Function Error Handling
|
## Function Error Handling
|
||||||
|
|
||||||
### Validation Functions
|
### Validation Functions
|
||||||
|
|
||||||
- `validate_settings()`: Returns 0 for valid, 1 for invalid
|
- `validate_settings()`: Returns 0 for valid, 1 for invalid
|
||||||
- `check_conflicts()`: Returns 0 for no conflicts, 1 for conflicts
|
- `check_conflicts()`: Returns 0 for no conflicts, 1 for conflicts
|
||||||
|
|
||||||
### Error Recovery
|
### Error Recovery
|
||||||
|
|
||||||
- `cleanup_on_error()`: Cleans up on any error
|
- `cleanup_on_error()`: Cleans up on any error
|
||||||
- Error codes are propagated up the call stack
|
- Error codes are propagated up the call stack
|
||||||
- Critical errors cause script termination
|
- Critical errors cause script termination
|
||||||
|
|
||||||
### Error Types
|
### Error Types
|
||||||
|
|
||||||
1. **Configuration Errors**: Invalid settings or conflicts
|
1. **Configuration Errors**: Invalid settings or conflicts
|
||||||
2. **Resource Errors**: Insufficient resources or conflicts
|
2. **Resource Errors**: Insufficient resources or conflicts
|
||||||
3. **Network Errors**: Invalid network configuration
|
3. **Network Errors**: Invalid network configuration
|
||||||
|
|||||||
@ -1492,7 +1492,7 @@ advanced_settings() {
|
|||||||
# STEP 17: SSH Settings
|
# STEP 17: SSH Settings
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════
|
||||||
17)
|
17)
|
||||||
configure_ssh_settings
|
configure_ssh_settings "Step $STEP/$MAX_STEP"
|
||||||
# configure_ssh_settings handles its own flow, always advance
|
# configure_ssh_settings handles its own flow, always advance
|
||||||
((STEP++))
|
((STEP++))
|
||||||
;;
|
;;
|
||||||
@ -2114,6 +2114,10 @@ ssh_discover_default_files() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
configure_ssh_settings() {
|
configure_ssh_settings() {
|
||||||
|
local step_info="${1:-}"
|
||||||
|
local backtitle="Proxmox VE Helper Scripts"
|
||||||
|
[[ -n "$step_info" ]] && backtitle="Proxmox VE Helper Scripts [${step_info}]"
|
||||||
|
|
||||||
SSH_KEYS_FILE="$(mktemp)"
|
SSH_KEYS_FILE="$(mktemp)"
|
||||||
: >"$SSH_KEYS_FILE"
|
: >"$SSH_KEYS_FILE"
|
||||||
|
|
||||||
@ -2123,14 +2127,14 @@ configure_ssh_settings() {
|
|||||||
|
|
||||||
local ssh_key_mode
|
local ssh_key_mode
|
||||||
if [[ "$default_key_count" -gt 0 ]]; then
|
if [[ "$default_key_count" -gt 0 ]]; then
|
||||||
ssh_key_mode=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SSH KEY SOURCE" --menu \
|
ssh_key_mode=$(whiptail --backtitle "$backtitle" --title "SSH KEY SOURCE" --menu \
|
||||||
"Provision SSH keys for root:" 14 72 4 \
|
"Provision SSH keys for root:" 14 72 4 \
|
||||||
"found" "Select from detected keys (${default_key_count})" \
|
"found" "Select from detected keys (${default_key_count})" \
|
||||||
"manual" "Paste a single public key" \
|
"manual" "Paste a single public key" \
|
||||||
"folder" "Scan another folder (path or glob)" \
|
"folder" "Scan another folder (path or glob)" \
|
||||||
"none" "No keys" 3>&1 1>&2 2>&3) || exit_script
|
"none" "No keys" 3>&1 1>&2 2>&3) || exit_script
|
||||||
else
|
else
|
||||||
ssh_key_mode=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SSH KEY SOURCE" --menu \
|
ssh_key_mode=$(whiptail --backtitle "$backtitle" --title "SSH KEY SOURCE" --menu \
|
||||||
"No host keys detected; choose manual/none:" 12 72 2 \
|
"No host keys detected; choose manual/none:" 12 72 2 \
|
||||||
"manual" "Paste a single public key" \
|
"manual" "Paste a single public key" \
|
||||||
"none" "No keys" 3>&1 1>&2 2>&3) || exit_script
|
"none" "No keys" 3>&1 1>&2 2>&3) || exit_script
|
||||||
@ -2139,7 +2143,7 @@ configure_ssh_settings() {
|
|||||||
case "$ssh_key_mode" in
|
case "$ssh_key_mode" in
|
||||||
found)
|
found)
|
||||||
local selection
|
local selection
|
||||||
selection=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SELECT HOST KEYS" \
|
selection=$(whiptail --backtitle "$backtitle" --title "SELECT HOST KEYS" \
|
||||||
--checklist "Select one or more keys to import:" 20 140 10 "${CHOICES[@]}" 3>&1 1>&2 2>&3) || exit_script
|
--checklist "Select one or more keys to import:" 20 140 10 "${CHOICES[@]}" 3>&1 1>&2 2>&3) || exit_script
|
||||||
for tag in $selection; do
|
for tag in $selection; do
|
||||||
tag="${tag%\"}"
|
tag="${tag%\"}"
|
||||||
@ -2150,13 +2154,13 @@ configure_ssh_settings() {
|
|||||||
done
|
done
|
||||||
;;
|
;;
|
||||||
manual)
|
manual)
|
||||||
SSH_AUTHORIZED_KEY="$(whiptail --backtitle "Proxmox VE Helper Scripts" \
|
SSH_AUTHORIZED_KEY="$(whiptail --backtitle "$backtitle" \
|
||||||
--inputbox "Paste one SSH public key line (ssh-ed25519/ssh-rsa/...)" 10 72 --title "SSH Public Key" 3>&1 1>&2 2>&3)"
|
--inputbox "Paste one SSH public key line (ssh-ed25519/ssh-rsa/...)" 10 72 --title "SSH Public Key" 3>&1 1>&2 2>&3)"
|
||||||
[[ -n "$SSH_AUTHORIZED_KEY" ]] && printf '%s\n' "$SSH_AUTHORIZED_KEY" >>"$SSH_KEYS_FILE"
|
[[ -n "$SSH_AUTHORIZED_KEY" ]] && printf '%s\n' "$SSH_AUTHORIZED_KEY" >>"$SSH_KEYS_FILE"
|
||||||
;;
|
;;
|
||||||
folder)
|
folder)
|
||||||
local glob_path
|
local glob_path
|
||||||
glob_path=$(whiptail --backtitle "Proxmox VE Helper Scripts" \
|
glob_path=$(whiptail --backtitle "$backtitle" \
|
||||||
--inputbox "Enter a folder or glob to scan (e.g. /root/.ssh/*.pub)" 10 72 --title "Scan Folder/Glob" 3>&1 1>&2 2>&3)
|
--inputbox "Enter a folder or glob to scan (e.g. /root/.ssh/*.pub)" 10 72 --title "Scan Folder/Glob" 3>&1 1>&2 2>&3)
|
||||||
if [[ -n "$glob_path" ]]; then
|
if [[ -n "$glob_path" ]]; then
|
||||||
shopt -s nullglob
|
shopt -s nullglob
|
||||||
@ -2166,7 +2170,7 @@ configure_ssh_settings() {
|
|||||||
ssh_build_choices_from_files "${_scan_files[@]}"
|
ssh_build_choices_from_files "${_scan_files[@]}"
|
||||||
if [[ "$COUNT" -gt 0 ]]; then
|
if [[ "$COUNT" -gt 0 ]]; then
|
||||||
local folder_selection
|
local folder_selection
|
||||||
folder_selection=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SELECT FOLDER KEYS" \
|
folder_selection=$(whiptail --backtitle "$backtitle" --title "SELECT FOLDER KEYS" \
|
||||||
--checklist "Select key(s) to import:" 20 78 10 "${CHOICES[@]}" 3>&1 1>&2 2>&3) || exit_script
|
--checklist "Select key(s) to import:" 20 78 10 "${CHOICES[@]}" 3>&1 1>&2 2>&3) || exit_script
|
||||||
for tag in $folder_selection; do
|
for tag in $folder_selection; do
|
||||||
tag="${tag%\"}"
|
tag="${tag%\"}"
|
||||||
@ -2176,10 +2180,10 @@ configure_ssh_settings() {
|
|||||||
[[ -n "$line" ]] && printf '%s\n' "$line" >>"$SSH_KEYS_FILE"
|
[[ -n "$line" ]] && printf '%s\n' "$line" >>"$SSH_KEYS_FILE"
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox "No keys found in: $glob_path" 8 60
|
whiptail --backtitle "$backtitle" --msgbox "No keys found in: $glob_path" 8 60
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox "Path/glob returned no files." 8 60
|
whiptail --backtitle "$backtitle" --msgbox "Path/glob returned no files." 8 60
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
@ -2193,15 +2197,12 @@ configure_ssh_settings() {
|
|||||||
printf '\n' >>"$SSH_KEYS_FILE"
|
printf '\n' >>"$SSH_KEYS_FILE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -s "$SSH_KEYS_FILE" || "$PW" == -password* ]]; then
|
# Always show SSH access dialog - user should be able to enable SSH even without keys
|
||||||
if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH ACCESS" --yesno "Enable root SSH access?" 10 58); then
|
if (whiptail --backtitle "$backtitle" --defaultno --title "SSH ACCESS" --yesno "Enable root SSH access?" 10 58); then
|
||||||
SSH="yes"
|
SSH="yes"
|
||||||
else
|
else
|
||||||
SSH="no"
|
SSH="no"
|
||||||
fi
|
fi
|
||||||
else
|
|
||||||
SSH="no"
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user