2025-12-01 13:50:11 +01:00
# build.func Functions Reference
## Overview
This document provides a comprehensive reference of all functions in `build.func` , organized alphabetically with detailed descriptions, parameters, and usage information.
## Function Categories
### Initialization Functions
#### `start()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Main entry point when build.func is sourced or executed
**Parameters**: None
**Returns**: None
**Side Effects**:
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- Detects execution context (Proxmox host vs container)
- Captures hard environment variables
- Sets CT_TYPE based on context
- Routes to appropriate workflow (install_script or update_script)
2025-12-08 14:20:05 +01:00
**Dependencies ** : None
**Environment Variables Used ** : `CT_TYPE` , `APP` , `CTID`
2025-12-01 13:50:11 +01:00
#### `variables()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Load and resolve all configuration variables using precedence chain
**Parameters**: None
**Returns**: None
**Side Effects**:
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- Loads app-specific .vars file
- Loads global default.vars file
- Applies variable precedence chain
- Sets all configuration variables
2025-12-08 14:20:05 +01:00
**Dependencies ** : `base_settings()`
**Environment Variables Used ** : All configuration variables
2025-12-01 13:50:11 +01:00
#### `base_settings()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Set built-in default values for all configuration variables
**Parameters**: None
**Returns**: None
**Side Effects**: Sets default values for all variables
**Dependencies**: None
**Environment Variables Used**: All configuration variables
### UI and Menu Functions
#### `install_script()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Main installation workflow coordinator
**Parameters**: None
**Returns**: None
**Side Effects**:
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- Displays installation mode selection menu
- Coordinates the entire installation process
- Handles user interaction and validation
2025-12-08 14:20:05 +01:00
**Dependencies ** : `variables()` , `build_container()` , `default_var_settings()`
**Environment Variables Used ** : `APP` , `CTID` , `var_hostname`
2025-12-01 13:50:11 +01:00
#### `advanced_settings()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Provide advanced configuration options via whiptail menus
**Parameters**: None
**Returns**: None
**Side Effects**:
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- Displays whiptail menus for configuration
- Updates configuration variables based on user input
- Validates user selections
2025-12-08 14:20:05 +01:00
**Dependencies ** : `select_storage()` , `detect_gpu_devices()`
**Environment Variables Used ** : All configuration variables
2025-12-01 13:50:11 +01:00
#### `settings_menu()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Display and handle settings configuration menu
**Parameters**: None
**Returns**: None
**Side Effects**: Updates configuration variables
**Dependencies**: `advanced_settings()`
**Environment Variables Used**: All configuration variables
### Storage Functions
#### `select_storage()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Handle storage selection for templates and containers
**Parameters**: None
**Returns**: None
**Side Effects**:
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- Resolves storage preselection
- Prompts user for storage selection if needed
- Validates storage availability
- Sets var_template_storage and var_container_storage
2025-12-08 14:20:05 +01:00
**Dependencies ** : `resolve_storage_preselect()` , `choose_and_set_storage_for_file()`
**Environment Variables Used ** : `var_template_storage` , `var_container_storage` , `TEMPLATE_STORAGE` , `CONTAINER_STORAGE`
2025-12-01 13:50:11 +01:00
#### `resolve_storage_preselect()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Resolve preselected storage options
**Parameters**:
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- `storage_type` : Type of storage (template or container)
2025-12-08 14:20:05 +01:00
**Returns ** : Storage name if valid, empty if invalid
**Side Effects ** : Validates storage availability
**Dependencies ** : None
**Environment Variables Used ** : `var_template_storage` , `var_container_storage`
2025-12-01 13:50:11 +01:00
#### `choose_and_set_storage_for_file()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Interactive storage selection via whiptail
**Parameters**:
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- `storage_type` : Type of storage (template or container)
- `content_type` : Content type (vztmpl or rootdir)
2025-12-08 14:20:05 +01:00
**Returns ** : None
**Side Effects ** :
2025-12-01 13:50:11 +01:00
- Displays whiptail menu
- Updates storage variables
- Validates selection
2025-12-08 14:20:05 +01:00
**Dependencies ** : None
**Environment Variables Used ** : `var_template_storage` , `var_container_storage`
2025-12-01 13:50:11 +01:00
### Container Creation Functions
#### `build_container()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Validate settings and prepare container creation
**Parameters**: None
**Returns**: None
**Side Effects**:
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- Validates all configuration
- Checks for conflicts
- Prepares container configuration
- Calls create_lxc_container()
2025-12-08 14:20:05 +01:00
**Dependencies ** : `create_lxc_container()`
**Environment Variables Used ** : All configuration variables
2025-12-01 13:50:11 +01:00
#### `create_lxc_container()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Create the actual LXC container
**Parameters**: None
**Returns**: None
**Side Effects**:
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- Creates LXC container with basic configuration
- Configures network settings
- Sets up storage and mount points
- Configures features (FUSE, TUN, etc.)
- Sets resource limits
- Configures startup options
- Starts container
2025-12-08 14:20:05 +01:00
**Dependencies ** : `configure_gpu_passthrough()` , `fix_gpu_gids()`
**Environment Variables Used ** : All configuration variables
2025-12-01 13:50:11 +01:00
### GPU and Hardware Functions
#### `detect_gpu_devices()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Detect available GPU hardware on the system
**Parameters**: None
**Returns**: None
**Side Effects**:
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- Scans for Intel, AMD, and NVIDIA GPUs
- Updates var_gpu_type and var_gpu_devices
- Determines GPU capabilities
2025-12-08 14:20:05 +01:00
**Dependencies ** : None
**Environment Variables Used ** : `var_gpu_type` , `var_gpu_devices` , `GPU_APPS`
2025-12-01 13:50:11 +01:00
#### `configure_gpu_passthrough()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Configure GPU passthrough for the container
**Parameters**: None
**Returns**: None
**Side Effects**:
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- Adds GPU device entries to container config
- Configures proper device permissions
- Sets up device mapping
- Updates /etc/pve/lxc/<ctid>.conf
2025-12-08 14:20:05 +01:00
**Dependencies ** : `detect_gpu_devices()`
**Environment Variables Used ** : `var_gpu` , `var_gpu_type` , `var_gpu_devices` , `CTID`
2025-12-01 13:50:11 +01:00
#### `fix_gpu_gids()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Fix GPU group IDs after container creation
**Parameters**: None
**Returns**: None
**Side Effects**:
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- Updates GPU group IDs in container
- Ensures proper GPU access permissions
- Configures video and render groups
2025-12-08 14:20:05 +01:00
**Dependencies ** : `configure_gpu_passthrough()`
**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`
2025-12-01 13:50:11 +01:00
### Settings Persistence Functions
#### `default_var_settings()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Offer to save current settings as defaults
**Parameters**: None
**Returns**: None
**Side Effects**:
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- Prompts user to save settings
- Saves to default.vars file
- Saves to app-specific .vars file
2025-12-08 14:20:05 +01:00
**Dependencies ** : `maybe_offer_save_app_defaults()`
**Environment Variables Used ** : All configuration variables
2025-12-01 13:50:11 +01:00
#### `maybe_offer_save_app_defaults()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Offer to save app-specific defaults
**Parameters**: None
**Returns**: None
**Side Effects**:
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- Prompts user to save app-specific settings
- Saves to app.vars file
- Updates app-specific configuration
2025-12-08 14:20:05 +01:00
**Dependencies ** : None
**Environment Variables Used ** : `APP` , `SAVE_APP_DEFAULTS`
2025-12-01 13:50:11 +01:00
### Utility Functions
#### `validate_settings()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Validate all configuration settings
**Parameters**: None
**Returns**: 0 if valid, 1 if invalid
**Side Effects**:
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- Checks for configuration conflicts
- Validates resource limits
- Validates network configuration
- Validates storage configuration
2025-12-08 14:20:05 +01:00
**Dependencies ** : None
**Environment Variables Used ** : All configuration variables
2025-12-01 13:50:11 +01:00
#### `check_conflicts()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Check for configuration conflicts
**Parameters**: None
**Returns**: 0 if no conflicts, 1 if conflicts found
**Side Effects**:
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- Checks for conflicting settings
- Validates resource allocation
- Checks network configuration
2025-12-08 14:20:05 +01:00
**Dependencies ** : None
**Environment Variables Used ** : All configuration variables
2025-12-01 13:50:11 +01:00
#### `cleanup_on_error()`
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
**Purpose**: Clean up resources on error
**Parameters**: None
**Returns**: None
**Side Effects**:
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- Removes partially created containers
- Cleans up temporary files
- Resets configuration
2025-12-08 14:20:05 +01:00
**Dependencies ** : None
**Environment Variables Used ** : `CTID`
2025-12-01 13:50:11 +01:00
## Function Call Flow
### Main Installation Flow
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
```
start()
├── variables()
│ ├── base_settings()
│ ├── Load app.vars
│ └── Load default.vars
├── install_script()
│ ├── advanced_settings()
│ │ ├── select_storage()
│ │ │ ├── resolve_storage_preselect()
│ │ │ └── choose_and_set_storage_for_file()
│ │ └── detect_gpu_devices()
│ ├── build_container()
│ │ ├── validate_settings()
│ │ ├── check_conflicts()
│ │ └── create_lxc_container()
│ │ ├── configure_gpu_passthrough()
│ │ └── fix_gpu_gids()
│ └── default_var_settings()
│ └── maybe_offer_save_app_defaults()
```
### Error Handling Flow
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
```
Error Detection
├── validate_settings()
│ └── check_conflicts()
├── Error Handling
│ └── cleanup_on_error()
└── Exit with error code
```
## Function Dependencies
### Core Dependencies
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- `start()` → `install_script()` → `build_container()` → `create_lxc_container()`
- `variables()` → `base_settings()`
- `advanced_settings()` → `select_storage()` → `detect_gpu_devices()`
### Storage Dependencies
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- `select_storage()` → `resolve_storage_preselect()`
- `select_storage()` → `choose_and_set_storage_for_file()`
### GPU Dependencies
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- `configure_gpu_passthrough()` → `detect_gpu_devices()`
- `fix_gpu_gids()` → `configure_gpu_passthrough()`
### Settings Dependencies
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- `default_var_settings()` → `maybe_offer_save_app_defaults()`
## Function Usage Examples
### Basic Container Creation
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
```bash
# Set required variables
export APP="plex"
export CTID="100"
export var_hostname="plex-server"
# Call main functions
start() # Entry point
# → variables() # Load configuration
# → install_script() # Main workflow
# → build_container() # Create container
# → create_lxc_container() # Actual creation
```
### Advanced Configuration
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
```bash
# Set advanced variables
export var_os="debian"
export var_version="12"
export var_cpu="4"
export var_ram="4096"
export var_disk="20"
# Call advanced functions
advanced_settings() # Interactive configuration
# → select_storage() # Storage selection
# → detect_gpu_devices() # GPU detection
```
### GPU Passthrough
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
```bash
# Enable GPU passthrough
export GPU_APPS="plex"
export var_gpu="nvidia"
# Call GPU functions
detect_gpu_devices() # Detect hardware
configure_gpu_passthrough() # Configure passthrough
fix_gpu_gids() # Fix permissions
```
### Settings Persistence
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
```bash
# Save settings as defaults
export SAVE_DEFAULTS="true"
export SAVE_APP_DEFAULTS="true"
# Call persistence functions
default_var_settings() # Save global defaults
maybe_offer_save_app_defaults() # Save app defaults
```
## Function Error Handling
### Validation Functions
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- `validate_settings()` : Returns 0 for valid, 1 for invalid
- `check_conflicts()` : Returns 0 for no conflicts, 1 for conflicts
### Error Recovery
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
- `cleanup_on_error()` : Cleans up on any error
- Error codes are propagated up the call stack
- Critical errors cause script termination
### Error Types
2025-12-08 14:20:05 +01:00
2025-12-01 13:50:11 +01:00
1. **Configuration Errors ** : Invalid settings or conflicts
2. **Resource Errors ** : Insufficient resources or conflicts
3. **Network Errors ** : Invalid network configuration
4. **Storage Errors ** : Storage not available or invalid
5. **GPU Errors ** : GPU configuration failures
6. **Container Creation Errors ** : LXC creation failures