mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2025-12-27 09:26:25 +01:00
add comprehensive documentation (#9537)
This commit is contained in:
283
docs/misc/README.md
Normal file
283
docs/misc/README.md
Normal file
@ -0,0 +1,283 @@
|
||||
# Misc Documentation
|
||||
|
||||
This directory contains comprehensive documentation for all function libraries and components of the Proxmox Community Scripts project. Each section is organized as a dedicated subdirectory with detailed references, examples, and integration guides.
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ **Core Function Libraries**
|
||||
|
||||
### 📁 [build.func/](./build.func/)
|
||||
**Core LXC Container Orchestration** - Main orchestrator for Proxmox LXC container creation
|
||||
|
||||
**Contents:**
|
||||
- BUILD_FUNC_FLOWCHART.md - Visual execution flows and decision trees
|
||||
- BUILD_FUNC_ARCHITECTURE.md - System architecture and design
|
||||
- BUILD_FUNC_ENVIRONMENT_VARIABLES.md - Complete environment variable reference
|
||||
- BUILD_FUNC_FUNCTIONS_REFERENCE.md - Alphabetical function reference
|
||||
- BUILD_FUNC_EXECUTION_FLOWS.md - Detailed execution flows
|
||||
- BUILD_FUNC_USAGE_EXAMPLES.md - Practical usage examples
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `variables()`, `start()`, `build_container()`, `build_defaults()`, `advanced_settings()`
|
||||
|
||||
---
|
||||
|
||||
### 📁 [core.func/](./core.func/)
|
||||
**System Utilities & Foundation** - Essential utility functions and system checks
|
||||
|
||||
**Contents:**
|
||||
- CORE_FLOWCHART.md - Visual execution flows
|
||||
- CORE_FUNCTIONS_REFERENCE.md - Complete function reference
|
||||
- CORE_INTEGRATION.md - Integration points
|
||||
- CORE_USAGE_EXAMPLES.md - Practical examples
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `color()`, `msg_info()`, `msg_ok()`, `msg_error()`, `root_check()`, `pve_check()`, `parse_dev_mode()`
|
||||
|
||||
---
|
||||
|
||||
### 📁 [error_handler.func/](./error_handler.func/)
|
||||
**Error Handling & Signal Management** - Comprehensive error handling and signal trapping
|
||||
|
||||
**Contents:**
|
||||
- ERROR_HANDLER_FLOWCHART.md - Visual error handling flows
|
||||
- ERROR_HANDLER_FUNCTIONS_REFERENCE.md - Function reference
|
||||
- ERROR_HANDLER_INTEGRATION.md - Integration with other components
|
||||
- ERROR_HANDLER_USAGE_EXAMPLES.md - Practical examples
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `catch_errors()`, `error_handler()`, `explain_exit_code()`, `signal_handler()`
|
||||
|
||||
---
|
||||
|
||||
### 📁 [api.func/](./api.func/)
|
||||
**Proxmox API Integration** - API communication and diagnostic reporting
|
||||
|
||||
**Contents:**
|
||||
- API_FLOWCHART.md - API communication flows
|
||||
- API_FUNCTIONS_REFERENCE.md - Function reference
|
||||
- API_INTEGRATION.md - Integration points
|
||||
- API_USAGE_EXAMPLES.md - Practical examples
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `post_to_api()`, `post_update_to_api()`, `get_error_description()`
|
||||
|
||||
---
|
||||
|
||||
## 📦 **Installation & Setup Function Libraries**
|
||||
|
||||
### 📁 [install.func/](./install.func/)
|
||||
**Container Installation Workflow** - Installation orchestration for container-internal setup
|
||||
|
||||
**Contents:**
|
||||
- INSTALL_FUNC_FLOWCHART.md - Installation workflow diagrams
|
||||
- INSTALL_FUNC_FUNCTIONS_REFERENCE.md - Complete function reference
|
||||
- INSTALL_FUNC_INTEGRATION.md - Integration with build and tools
|
||||
- INSTALL_FUNC_USAGE_EXAMPLES.md - Practical examples
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `setting_up_container()`, `network_check()`, `update_os()`, `motd_ssh()`, `cleanup_lxc()`
|
||||
|
||||
---
|
||||
|
||||
### 📁 [tools.func/](./tools.func/)
|
||||
**Package & Tool Installation** - Robust package management and 30+ tool installation functions
|
||||
|
||||
**Contents:**
|
||||
- TOOLS_FUNC_FLOWCHART.md - Package management flows
|
||||
- TOOLS_FUNC_FUNCTIONS_REFERENCE.md - 30+ function reference
|
||||
- TOOLS_FUNC_INTEGRATION.md - Integration with install workflows
|
||||
- TOOLS_FUNC_USAGE_EXAMPLES.md - Practical examples
|
||||
- TOOLS_FUNC_ENVIRONMENT_VARIABLES.md - Configuration reference
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `setup_nodejs()`, `setup_php()`, `setup_mariadb()`, `setup_docker()`, `setup_deb822_repo()`, `pkg_install()`, `pkg_update()`
|
||||
|
||||
---
|
||||
|
||||
### 📁 [alpine-install.func/](./alpine-install.func/)
|
||||
**Alpine Container Setup** - Alpine Linux-specific installation functions
|
||||
|
||||
**Contents:**
|
||||
- ALPINE_INSTALL_FUNC_FLOWCHART.md - Alpine setup flows
|
||||
- ALPINE_INSTALL_FUNC_FUNCTIONS_REFERENCE.md - Function reference
|
||||
- ALPINE_INSTALL_FUNC_INTEGRATION.md - Integration points
|
||||
- ALPINE_INSTALL_FUNC_USAGE_EXAMPLES.md - Practical examples
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `update_os()` (apk version), `verb_ip6()`, `motd_ssh()` (Alpine), `customize()`
|
||||
|
||||
---
|
||||
|
||||
### 📁 [alpine-tools.func/](./alpine-tools.func/)
|
||||
**Alpine Tool Installation** - Alpine-specific package and tool installation
|
||||
|
||||
**Contents:**
|
||||
- ALPINE_TOOLS_FUNC_FLOWCHART.md - Alpine package flows
|
||||
- ALPINE_TOOLS_FUNC_FUNCTIONS_REFERENCE.md - Function reference
|
||||
- ALPINE_TOOLS_FUNC_INTEGRATION.md - Integration with Alpine workflows
|
||||
- ALPINE_TOOLS_FUNC_USAGE_EXAMPLES.md - Practical examples
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `apk_add()`, `apk_update()`, `apk_del()`, `add_community_repo()`, Alpine tool setup functions
|
||||
|
||||
---
|
||||
|
||||
### 📁 [cloud-init.func/](./cloud-init.func/)
|
||||
**VM Cloud-Init Configuration** - Cloud-init and VM provisioning functions
|
||||
|
||||
**Contents:**
|
||||
- CLOUD_INIT_FUNC_FLOWCHART.md - Cloud-init flows
|
||||
- CLOUD_INIT_FUNC_FUNCTIONS_REFERENCE.md - Function reference
|
||||
- CLOUD_INIT_FUNC_INTEGRATION.md - Integration points
|
||||
- CLOUD_INIT_FUNC_USAGE_EXAMPLES.md - Practical examples
|
||||
- README.md - Overview and quick reference
|
||||
|
||||
**Key Functions**: `generate_cloud_init()`, `generate_user_data()`, `setup_ssh_keys()`, `setup_static_ip()`
|
||||
|
||||
---
|
||||
|
||||
## 🔗 **Function Library Relationships**
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ Container Creation Flow │
|
||||
├─────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ct/AppName.sh │
|
||||
│ ↓ (sources) │
|
||||
│ build.func │
|
||||
│ ├─ variables() │
|
||||
│ ├─ build_container() │
|
||||
│ └─ advanced_settings() │
|
||||
│ ↓ (calls pct create with) │
|
||||
│ install/appname-install.sh │
|
||||
│ ↓ (sources) │
|
||||
│ ├─ core.func (colors, messaging) │
|
||||
│ ├─ error_handler.func (error trapping) │
|
||||
│ ├─ install.func (setup/network) │
|
||||
│ └─ tools.func (packages/tools) │
|
||||
│ │
|
||||
└─────────────────────────────────────────────┘
|
||||
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ Alpine Container Flow │
|
||||
├─────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ install/appname-install.sh (Alpine) │
|
||||
│ ↓ (sources) │
|
||||
│ ├─ core.func (colors) │
|
||||
│ ├─ error_handler.func (errors) │
|
||||
│ ├─ alpine-install.func (apk setup) │
|
||||
│ └─ alpine-tools.func (apk tools) │
|
||||
│ │
|
||||
└─────────────────────────────────────────────┘
|
||||
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ VM Provisioning Flow │
|
||||
├─────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ vm/OsName-vm.sh │
|
||||
│ ↓ (uses) │
|
||||
│ cloud-init.func │
|
||||
│ ├─ generate_cloud_init() │
|
||||
│ ├─ setup_ssh_keys() │
|
||||
│ └─ configure_network() │
|
||||
│ │
|
||||
└─────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 **Documentation Quick Stats**
|
||||
|
||||
| Library | Files | Functions | Status |
|
||||
|---------|:---:|:---:|:---:|
|
||||
| build.func | 7 | 50+ | ✅ Complete |
|
||||
| core.func | 5 | 20+ | ✅ Complete |
|
||||
| error_handler.func | 5 | 10+ | ✅ Complete |
|
||||
| api.func | 5 | 5+ | ✅ Complete |
|
||||
| install.func | 5 | 8+ | ✅ Complete |
|
||||
| tools.func | 6 | 30+ | ✅ Complete |
|
||||
| alpine-install.func | 5 | 6+ | ✅ Complete |
|
||||
| alpine-tools.func | 5 | 15+ | ✅ Complete |
|
||||
| cloud-init.func | 5 | 12+ | ✅ Complete |
|
||||
|
||||
**Total**: 9 function libraries, 48 documentation files, 150+ functions
|
||||
|
||||
---
|
||||
|
||||
## 🚀 **Getting Started**
|
||||
|
||||
### For Container Creation Scripts
|
||||
Start with: **[build.func/](./build.func/)** → **[tools.func/](./tools.func/)** → **[install.func/](./install.func/)**
|
||||
|
||||
### For Alpine Containers
|
||||
Start with: **[alpine-install.func/](./alpine-install.func/)** → **[alpine-tools.func/](./alpine-tools.func/)**
|
||||
|
||||
### For VM Provisioning
|
||||
Start with: **[cloud-init.func/](./cloud-init.func/)**
|
||||
|
||||
### For Troubleshooting
|
||||
Start with: **[error_handler.func/](./error_handler.func/)** → **[EXIT_CODES.md](../EXIT_CODES.md)**
|
||||
|
||||
---
|
||||
|
||||
## 📚 **Related Top-Level Documentation**
|
||||
|
||||
- **[CONTRIBUTION_GUIDE.md](../CONTRIBUTION_GUIDE.md)** - How to contribute to ProxmoxVE
|
||||
- **[UPDATED_APP-ct.md](../UPDATED_APP-ct.md)** - Container script guide
|
||||
- **[UPDATED_APP-install.md](../UPDATED_APP-install.md)** - Installation script guide
|
||||
- **[DEFAULTS_SYSTEM_GUIDE.md](../DEFAULTS_SYSTEM_GUIDE.md)** - Configuration system
|
||||
- **[TECHNICAL_REFERENCE.md](../TECHNICAL_REFERENCE.md)** - Architecture reference
|
||||
- **[EXIT_CODES.md](../EXIT_CODES.md)** - Complete exit code reference
|
||||
- **[DEV_MODE.md](../DEV_MODE.md)** - Development debugging modes
|
||||
- **[CHANGELOG_MISC.md](../CHANGELOG_MISC.md)** - Change history
|
||||
|
||||
---
|
||||
|
||||
## 🔄 **Standardized Documentation Structure**
|
||||
|
||||
Each function library follows the same documentation pattern:
|
||||
|
||||
```
|
||||
function-library/
|
||||
├── README.md # Quick reference & overview
|
||||
├── FUNCTION_LIBRARY_FLOWCHART.md # Visual execution flows
|
||||
├── FUNCTION_LIBRARY_FUNCTIONS_REFERENCE.md # Alphabetical reference
|
||||
├── FUNCTION_LIBRARY_INTEGRATION.md # Integration points
|
||||
├── FUNCTION_LIBRARY_USAGE_EXAMPLES.md # Practical examples
|
||||
└── [FUNCTION_LIBRARY_ENVIRONMENT_VARIABLES.md] # (if applicable)
|
||||
```
|
||||
|
||||
**Advantages**:
|
||||
- ✅ Consistent navigation across all libraries
|
||||
- ✅ Quick reference sections in each README
|
||||
- ✅ Visual flowcharts for understanding
|
||||
- ✅ Complete function references
|
||||
- ✅ Real-world usage examples
|
||||
- ✅ Integration guides for connecting libraries
|
||||
|
||||
---
|
||||
|
||||
## 📝 **Documentation Standards**
|
||||
|
||||
All documentation follows these standards:
|
||||
|
||||
1. **README.md** - Quick overview, key features, quick reference
|
||||
2. **FLOWCHART.md** - ASCII flowcharts and visual diagrams
|
||||
3. **FUNCTIONS_REFERENCE.md** - Every function with full details
|
||||
4. **INTEGRATION.md** - How this library connects to others
|
||||
5. **USAGE_EXAMPLES.md** - Copy-paste ready examples
|
||||
6. **ENVIRONMENT_VARIABLES.md** - (if applicable) Configuration reference
|
||||
|
||||
---
|
||||
|
||||
## ✅ **Last Updated**: December 2025
|
||||
**Maintainers**: community-scripts team
|
||||
**License**: MIT
|
||||
**Status**: All 9 libraries fully documented and standardized
|
||||
|
||||
---
|
||||
|
||||
*This directory contains specialized documentation for specific components of the Proxmox Community Scripts project.*
|
||||
@ -0,0 +1,29 @@
|
||||
# alpine-install.func Flowchart
|
||||
|
||||
Alpine container initialization flow (apk-based, OpenRC init system).
|
||||
|
||||
## Alpine Container Setup Flow
|
||||
|
||||
```
|
||||
Alpine Container Started
|
||||
↓
|
||||
setting_up_container()
|
||||
↓
|
||||
verb_ip6() [optional - IPv6]
|
||||
↓
|
||||
update_os() [apk update/upgrade]
|
||||
↓
|
||||
network_check()
|
||||
↓
|
||||
Application Installation
|
||||
↓
|
||||
motd_ssh()
|
||||
↓
|
||||
customize()
|
||||
↓
|
||||
cleanup_lxc()
|
||||
↓
|
||||
Complete ✓
|
||||
```
|
||||
|
||||
**Last Updated**: December 2025
|
||||
@ -0,0 +1,30 @@
|
||||
# alpine-install.func Functions Reference
|
||||
|
||||
Alpine Linux-specific installation functions (apk-based, OpenRC).
|
||||
|
||||
## Core Functions
|
||||
|
||||
### setting_up_container()
|
||||
Initialize Alpine container setup.
|
||||
|
||||
### update_os()
|
||||
Update Alpine packages via `apk update && apk upgrade`.
|
||||
|
||||
### verb_ip6()
|
||||
Enable IPv6 on Alpine with persistent configuration.
|
||||
|
||||
### network_check()
|
||||
Verify network connectivity in Alpine.
|
||||
|
||||
### motd_ssh()
|
||||
Configure SSH daemon and MOTD on Alpine.
|
||||
|
||||
### customize()
|
||||
Apply Alpine-specific customizations.
|
||||
|
||||
### cleanup_lxc()
|
||||
Final cleanup (Alpine-specific).
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
@ -0,0 +1,14 @@
|
||||
# alpine-install.func Integration Guide
|
||||
|
||||
Integration of alpine-install.func with Alpine container workflows.
|
||||
|
||||
## Alpine-Specific Integration
|
||||
|
||||
Alpine containers use:
|
||||
- `apk` instead of `apt-get`
|
||||
- `OpenRC` instead of `systemd`
|
||||
- Alpine-specific package names
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
@ -0,0 +1,24 @@
|
||||
# alpine-install.func Usage Examples
|
||||
|
||||
Basic examples for Alpine container installation.
|
||||
|
||||
### Example: Basic Alpine Setup
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
setting_up_container
|
||||
update_os
|
||||
|
||||
# Install Alpine packages
|
||||
apk add --no-cache curl wget git
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
273
docs/misc/alpine-install.func/README.md
Normal file
273
docs/misc/alpine-install.func/README.md
Normal file
@ -0,0 +1,273 @@
|
||||
# alpine-install.func Documentation
|
||||
|
||||
## Overview
|
||||
|
||||
The `alpine-install.func` file provides Alpine Linux-specific installation and configuration functions for LXC containers. It complements the standard `install.func` with Alpine-specific operations using the apk package manager instead of apt.
|
||||
|
||||
## Purpose and Use Cases
|
||||
|
||||
- **Alpine Container Setup**: Initialize Alpine Linux containers with proper configuration
|
||||
- **IPv6 Management**: Enable or disable IPv6 in Alpine with persistent configuration
|
||||
- **Network Verification**: Verify connectivity in Alpine environments
|
||||
- **SSH Configuration**: Setup SSH daemon on Alpine
|
||||
- **Auto-Login Setup**: Configure passwordless root login for Alpine containers
|
||||
- **Package Management**: Safe apk operations with error handling
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Key Function Groups
|
||||
- **Initialization**: `setting_up_container()` - Alpine setup message
|
||||
- **Network**: `verb_ip6()`, `network_check()` - IPv6 and connectivity
|
||||
- **OS Configuration**: `update_os()` - Alpine package updates
|
||||
- **SSH/MOTD**: `motd_ssh()` - SSH and login message setup
|
||||
- **Container Customization**: `customize()`, `cleanup_lxc()` - Final setup
|
||||
|
||||
### Dependencies
|
||||
- **External**: `apk`, `curl`, `wget`, `ping`
|
||||
- **Internal**: Uses functions from `core.func`, `error_handler.func`
|
||||
|
||||
### Integration Points
|
||||
- Used by: Alpine-based install scripts (alpine.sh, alpine-ntfy.sh, etc.)
|
||||
- Uses: Environment variables from build.func
|
||||
- Provides: Alpine-specific installation and management services
|
||||
|
||||
## Documentation Files
|
||||
|
||||
### 📊 [ALPINE_INSTALL_FUNC_FLOWCHART.md](./ALPINE_INSTALL_FUNC_FLOWCHART.md)
|
||||
Visual execution flows showing Alpine container initialization and setup workflows.
|
||||
|
||||
### 📚 [ALPINE_INSTALL_FUNC_FUNCTIONS_REFERENCE.md](./ALPINE_INSTALL_FUNC_FUNCTIONS_REFERENCE.md)
|
||||
Complete alphabetical reference of all functions with parameters and usage details.
|
||||
|
||||
### 💡 [ALPINE_INSTALL_FUNC_USAGE_EXAMPLES.md](./ALPINE_INSTALL_FUNC_USAGE_EXAMPLES.md)
|
||||
Practical examples showing how to use Alpine installation functions.
|
||||
|
||||
### 🔗 [ALPINE_INSTALL_FUNC_INTEGRATION.md](./ALPINE_INSTALL_FUNC_INTEGRATION.md)
|
||||
How alpine-install.func integrates with standard install workflows.
|
||||
|
||||
## Key Features
|
||||
|
||||
### Alpine-Specific Functions
|
||||
- **apk Package Manager**: Alpine package operations (instead of apt-get)
|
||||
- **OpenRC Support**: Alpine uses OpenRC init instead of systemd
|
||||
- **Lightweight Setup**: Minimal dependencies appropriate for Alpine
|
||||
- **IPv6 Configuration**: Persistent IPv6 settings via `/etc/network/interfaces`
|
||||
|
||||
### Network & Connectivity
|
||||
- **IPv6 Toggle**: Enable/disable with persistent configuration
|
||||
- **Connectivity Check**: Verify internet access in Alpine
|
||||
- **DNS Verification**: Resolve domain names correctly
|
||||
- **Retry Logic**: Automatic recovery from transient failures
|
||||
|
||||
### SSH & Auto-Login
|
||||
- **SSH Daemon**: Setup and start sshd on Alpine
|
||||
- **Root Keys**: Configure root SSH access
|
||||
- **Auto-Login**: Optional automatic login without password
|
||||
- **MOTD**: Custom login message on Alpine
|
||||
|
||||
## Function Categories
|
||||
|
||||
### 🔹 Core Functions
|
||||
- `setting_up_container()` - Alpine container setup message
|
||||
- `update_os()` - Update Alpine packages via apk
|
||||
- `verb_ip6()` - Enable/disable IPv6 persistently
|
||||
- `network_check()` - Verify network connectivity
|
||||
|
||||
### 🔹 SSH & Configuration Functions
|
||||
- `motd_ssh()` - Configure SSH daemon on Alpine
|
||||
- `customize()` - Apply Alpine-specific customizations
|
||||
- `cleanup_lxc()` - Final cleanup
|
||||
|
||||
### 🔹 Service Management (OpenRC)
|
||||
- `rc-update` - Enable/disable services for Alpine
|
||||
- `rc-service` - Start/stop services on Alpine
|
||||
- Service configuration files in `/etc/init.d/`
|
||||
|
||||
## Differences from Debian Install
|
||||
|
||||
| Feature | Debian (install.func) | Alpine (alpine-install.func) |
|
||||
|---------|:---:|:---:|
|
||||
| Package Manager | apt-get | apk |
|
||||
| Init System | systemd | OpenRC |
|
||||
| SSH Service | systemctl | rc-service |
|
||||
| Config Files | /etc/systemd/ | /etc/init.d/ |
|
||||
| Network Config | /etc/network/ or Netplan | /etc/network/interfaces |
|
||||
| IPv6 Setup | netplan files | /etc/network/interfaces |
|
||||
| Auto-Login | getty override | `/etc/inittab` or shell config |
|
||||
| Size | ~200MB | ~100MB |
|
||||
|
||||
## Execution Flow for Alpine
|
||||
|
||||
```
|
||||
Alpine Container Started
|
||||
↓
|
||||
source $FUNCTIONS_FILE_PATH
|
||||
↓
|
||||
setting_up_container() ← Alpine setup message
|
||||
↓
|
||||
update_os() ← apk update
|
||||
↓
|
||||
verb_ip6() ← IPv6 configuration (optional)
|
||||
↓
|
||||
network_check() ← Verify connectivity
|
||||
↓
|
||||
[Application-Specific Installation]
|
||||
↓
|
||||
motd_ssh() ← Configure SSH/MOTD
|
||||
customize() ← Apply customizations
|
||||
↓
|
||||
cleanup_lxc() ← Final cleanup
|
||||
↓
|
||||
Alpine Installation Complete
|
||||
```
|
||||
|
||||
## Common Usage Patterns
|
||||
|
||||
### Basic Alpine Setup
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
setting_up_container
|
||||
update_os
|
||||
|
||||
# Install Alpine-specific packages
|
||||
apk add --no-cache curl wget git
|
||||
|
||||
# ... application installation ...
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
### With IPv6 Enabled
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
setting_up_container
|
||||
verb_ip6
|
||||
update_os
|
||||
network_check
|
||||
|
||||
# ... application installation ...
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
### Installing Services
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
setting_up_container
|
||||
update_os
|
||||
|
||||
# Install via apk
|
||||
apk add --no-cache nginx
|
||||
|
||||
# Enable and start service on Alpine
|
||||
rc-update add nginx
|
||||
rc-service nginx start
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### ✅ DO
|
||||
- Use `apk add --no-cache` to reduce image size
|
||||
- Enable IPv6 if application needs it (`verb_ip6`)
|
||||
- Use `rc-service` for service management on Alpine
|
||||
- Check `/etc/network/interfaces` for IPv6 persistence
|
||||
- Test network connectivity before critical operations
|
||||
- Use `$STD` for output suppression in production
|
||||
|
||||
### ❌ DON'T
|
||||
- Use `apt-get` commands (Alpine doesn't have apt)
|
||||
- Use `systemctl` (Alpine uses OpenRC, not systemd)
|
||||
- Use `service` command (it may not exist on Alpine)
|
||||
- Assume systemd exists on Alpine
|
||||
- Forget to add `--no-cache` flag to `apk add`
|
||||
- Hardcode paths from Debian (different on Alpine)
|
||||
|
||||
## Alpine-Specific Considerations
|
||||
|
||||
### Package Names
|
||||
Some packages have different names on Alpine:
|
||||
```bash
|
||||
# Debian → Alpine
|
||||
# curl → curl (same)
|
||||
# wget → wget (same)
|
||||
# python3 → python3 (same)
|
||||
# libpq5 → postgresql-client
|
||||
# libmariadb3 → mariadb-client
|
||||
```
|
||||
|
||||
### Service Management
|
||||
```bash
|
||||
# Debian (systemd) → Alpine (OpenRC)
|
||||
systemctl start nginx → rc-service nginx start
|
||||
systemctl enable nginx → rc-update add nginx
|
||||
systemctl status nginx → rc-service nginx status
|
||||
```
|
||||
|
||||
### Network Configuration
|
||||
```bash
|
||||
# Debian (Netplan) → Alpine (/etc/network/interfaces)
|
||||
/etc/netplan/01-*.yaml → /etc/network/interfaces
|
||||
netplan apply → Configure directly in interfaces
|
||||
|
||||
# Enable IPv6 persistently on Alpine:
|
||||
# Add to /etc/network/interfaces:
|
||||
# iface eth0 inet6 static
|
||||
# address <IPv6_ADDRESS>
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "apk command not found"
|
||||
- This is Alpine Linux, not Debian
|
||||
- Install packages with `apk add` instead of `apt-get install`
|
||||
- Example: `apk add --no-cache curl wget`
|
||||
|
||||
### "IPv6 not persisting after reboot"
|
||||
- IPv6 must be configured in `/etc/network/interfaces`
|
||||
- The `verb_ip6()` function handles this automatically
|
||||
- Verify: `cat /etc/network/interfaces`
|
||||
|
||||
### "Service won't start on Alpine"
|
||||
- Alpine uses OpenRC, not systemd
|
||||
- Use `rc-service nginx start` instead of `systemctl start nginx`
|
||||
- Enable service: `rc-update add nginx`
|
||||
- Check logs: `/var/log/` or `rc-service nginx status`
|
||||
|
||||
### "Container too large"
|
||||
- Alpine should be much smaller than Debian
|
||||
- Verify using `apk add --no-cache` (removes package cache)
|
||||
- Example: `apk add --no-cache nginx` (not `apk add nginx`)
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- **[alpine-tools.func/](../alpine-tools.func/)** - Alpine tool installation
|
||||
- **[install.func/](../install.func/)** - Standard installation functions
|
||||
- **[core.func/](../core.func/)** - Utility functions
|
||||
- **[error_handler.func/](../error_handler.func/)** - Error handling
|
||||
- **[UPDATED_APP-install.md](../../UPDATED_APP-install.md)** - Application script guide
|
||||
|
||||
## Recent Updates
|
||||
|
||||
### Version 2.0 (Dec 2025)
|
||||
- ✅ Enhanced IPv6 persistence configuration
|
||||
- ✅ Improved OpenRC service management
|
||||
- ✅ Better apk error handling
|
||||
- ✅ Added Alpine-specific best practices documentation
|
||||
- ✅ Streamlined SSH setup for Alpine
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
**Maintainers**: community-scripts team
|
||||
**License**: MIT
|
||||
25
docs/misc/alpine-tools.func/ALPINE_TOOLS_FUNC_FLOWCHART.md
Normal file
25
docs/misc/alpine-tools.func/ALPINE_TOOLS_FUNC_FLOWCHART.md
Normal file
@ -0,0 +1,25 @@
|
||||
# alpine-tools.func Flowchart
|
||||
|
||||
Alpine tool installation and package management flow.
|
||||
|
||||
## Tool Installation on Alpine
|
||||
|
||||
```
|
||||
apk_update()
|
||||
↓
|
||||
add_community_repo() [optional]
|
||||
↓
|
||||
apk_add PACKAGES
|
||||
↓
|
||||
Tool Installation
|
||||
↓
|
||||
rc-service start
|
||||
↓
|
||||
rc-update add [enable at boot]
|
||||
↓
|
||||
Complete ✓
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
@ -0,0 +1,31 @@
|
||||
# alpine-tools.func Functions Reference
|
||||
|
||||
Alpine-specific tool installation functions.
|
||||
|
||||
## Core Functions
|
||||
|
||||
### apk_update()
|
||||
Update Alpine package lists.
|
||||
|
||||
### apk_add(PACKAGES)
|
||||
Install Alpine packages.
|
||||
|
||||
### apk_del(PACKAGES)
|
||||
Remove Alpine packages.
|
||||
|
||||
### add_community_repo()
|
||||
Enable Alpine community repository.
|
||||
|
||||
### add_testing_repo()
|
||||
Enable Alpine testing repository.
|
||||
|
||||
### Alpine Tool Functions
|
||||
- `setup_nodejs()` - Alpine Node.js
|
||||
- `setup_php()` - Alpine PHP
|
||||
- `setup_mariadb()` - Alpine MariaDB
|
||||
- `setup_postgresql()` - Alpine PostgreSQL
|
||||
- (+ more Alpine-specific setups)
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
@ -0,0 +1,7 @@
|
||||
# alpine-tools.func Integration Guide
|
||||
|
||||
Alpine tool installation integration with container workflows.
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
@ -0,0 +1,19 @@
|
||||
# alpine-tools.func Usage Examples
|
||||
|
||||
Examples for Alpine tool installation.
|
||||
|
||||
### Example: Alpine Setup with Tools
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
apk_update
|
||||
setup_nodejs "20"
|
||||
setup_php "8.3"
|
||||
setup_mariadb "11"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
297
docs/misc/alpine-tools.func/README.md
Normal file
297
docs/misc/alpine-tools.func/README.md
Normal file
@ -0,0 +1,297 @@
|
||||
# alpine-tools.func Documentation
|
||||
|
||||
## Overview
|
||||
|
||||
The `alpine-tools.func` file provides Alpine Linux-specific tool installation functions for package and service management within Alpine LXC containers. It complements `tools.func` with Alpine-specific implementations using the apk package manager.
|
||||
|
||||
## Purpose and Use Cases
|
||||
|
||||
- **Alpine Tool Installation**: Install services and tools using apk on Alpine
|
||||
- **Package Management**: Safe apk operations with error handling
|
||||
- **Service Setup**: Install and configure common services on Alpine
|
||||
- **Dependency Management**: Handle Alpine-specific package dependencies
|
||||
- **Repository Management**: Setup and manage Alpine package repositories
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Key Function Groups
|
||||
- **Package Operations**: Alpine-specific apk commands with error handling
|
||||
- **Service Installation**: Install databases, web servers, tools on Alpine
|
||||
- **Repository Setup**: Configure Alpine community and testing repositories
|
||||
- **Tool Setup**: Install development tools and utilities
|
||||
|
||||
### Dependencies
|
||||
- **External**: `apk`, `curl`, `wget`
|
||||
- **Internal**: Uses functions from `core.func`, `error_handler.func`
|
||||
|
||||
### Integration Points
|
||||
- Used by: Alpine-based application install scripts
|
||||
- Uses: Environment variables from build.func
|
||||
- Provides: Alpine package and tool installation services
|
||||
|
||||
## Documentation Files
|
||||
|
||||
### 📊 [ALPINE_TOOLS_FUNC_FLOWCHART.md](./ALPINE_TOOLS_FUNC_FLOWCHART.md)
|
||||
Visual execution flows for package operations and tool installation on Alpine.
|
||||
|
||||
### 📚 [ALPINE_TOOLS_FUNC_FUNCTIONS_REFERENCE.md](./ALPINE_TOOLS_FUNC_FUNCTIONS_REFERENCE.md)
|
||||
Complete alphabetical reference of all Alpine tool functions.
|
||||
|
||||
### 💡 [ALPINE_TOOLS_FUNC_USAGE_EXAMPLES.md](./ALPINE_TOOLS_FUNC_USAGE_EXAMPLES.md)
|
||||
Practical examples for common Alpine installation patterns.
|
||||
|
||||
### 🔗 [ALPINE_TOOLS_FUNC_INTEGRATION.md](./ALPINE_TOOLS_FUNC_INTEGRATION.md)
|
||||
How alpine-tools.func integrates with Alpine installation workflows.
|
||||
|
||||
## Key Features
|
||||
|
||||
### Alpine Package Management
|
||||
- **apk Add**: Safe package installation with error handling
|
||||
- **apk Update**: Update package lists with retry logic
|
||||
- **apk Del**: Remove packages and dependencies
|
||||
- **Repository Configuration**: Add community and testing repos
|
||||
|
||||
### Alpine Tool Coverage
|
||||
- **Web Servers**: nginx, lighttpd
|
||||
- **Databases**: mariadb, postgresql, sqlite
|
||||
- **Development**: gcc, make, git, node.js (via apk)
|
||||
- **Services**: sshd, docker, podman
|
||||
- **Utilities**: curl, wget, htop, vim
|
||||
|
||||
### Error Handling
|
||||
- **Retry Logic**: Automatic recovery from transient failures
|
||||
- **Dependency Resolution**: Handle missing dependencies
|
||||
- **Lock Management**: Wait for apk locks to release
|
||||
- **Error Reporting**: Clear error messages
|
||||
|
||||
## Function Categories
|
||||
|
||||
### 🔹 Package Management
|
||||
- `apk_update()` - Update Alpine packages with retry
|
||||
- `apk_add()` - Install packages safely
|
||||
- `apk_del()` - Remove packages completely
|
||||
|
||||
### 🔹 Repository Functions
|
||||
- `add_community_repo()` - Enable community repositories
|
||||
- `add_testing_repo()` - Enable testing repositories
|
||||
- `setup_apk_repo()` - Configure custom apk repositories
|
||||
|
||||
### 🔹 Service Installation Functions
|
||||
- `setup_nginx()` - Install and configure nginx
|
||||
- `setup_mariadb()` - Install MariaDB on Alpine
|
||||
- `setup_postgresql()` - Install PostgreSQL
|
||||
- `setup_docker()` - Install Docker on Alpine
|
||||
- `setup_nodejs()` - Install Node.js from Alpine repos
|
||||
|
||||
### 🔹 Development Tools
|
||||
- `setup_build_tools()` - Install gcc, make, build-essential
|
||||
- `setup_git()` - Install git version control
|
||||
- `setup_python()` - Install Python 3 and pip
|
||||
|
||||
## Alpine vs Debian Package Differences
|
||||
|
||||
| Package | Debian | Alpine |
|
||||
|---------|:---:|:---:|
|
||||
| nginx | `apt-get install nginx` | `apk add nginx` |
|
||||
| mariadb | `apt-get install mariadb-server` | `apk add mariadb` |
|
||||
| PostgreSQL | `apt-get install postgresql` | `apk add postgresql` |
|
||||
| Node.js | `apt-get install nodejs npm` | `apk add nodejs npm` |
|
||||
| Docker | Special setup | `apk add docker` |
|
||||
| Python | `apt-get install python3 python3-pip` | `apk add python3 py3-pip` |
|
||||
|
||||
## Common Usage Patterns
|
||||
|
||||
### Basic Alpine Tool Installation
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
# Update package lists
|
||||
apk_update
|
||||
|
||||
# Install nginx
|
||||
apk_add nginx
|
||||
|
||||
# Start service
|
||||
rc-service nginx start
|
||||
rc-update add nginx
|
||||
```
|
||||
|
||||
### With Community Repository
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
# Enable community repo for more packages
|
||||
add_community_repo
|
||||
|
||||
# Update and install
|
||||
apk_update
|
||||
apk_add postgresql postgresql-client
|
||||
|
||||
# Start service
|
||||
rc-service postgresql start
|
||||
```
|
||||
|
||||
### Development Environment
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
# Install build tools
|
||||
setup_build_tools
|
||||
setup_git
|
||||
setup_nodejs "20"
|
||||
|
||||
# Install application
|
||||
git clone https://example.com/app
|
||||
cd app
|
||||
npm install
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### ✅ DO
|
||||
- Always use `apk add --no-cache` to keep images small
|
||||
- Call `apk_update()` before installing packages
|
||||
- Use community repository for more packages (`add_community_repo`)
|
||||
- Handle apk locks gracefully with retry logic
|
||||
- Use `$STD` variable for output control
|
||||
- Check if tool already installed before reinstalling
|
||||
|
||||
### ❌ DON'T
|
||||
- Use `apt-get` commands (Alpine doesn't have apt)
|
||||
- Install packages without `--no-cache` flag
|
||||
- Hardcode Alpine-specific paths
|
||||
- Mix Alpine and Debian commands
|
||||
- Forget to enable services with `rc-update`
|
||||
- Use `systemctl` (Alpine has OpenRC, not systemd)
|
||||
|
||||
## Alpine Repository Configuration
|
||||
|
||||
### Default Repositories
|
||||
Alpine comes with main repository enabled by default. Additional repos:
|
||||
|
||||
```bash
|
||||
# Community repository (apk add php, go, rust, etc.)
|
||||
add_community_repo
|
||||
|
||||
# Testing repository (bleeding edge packages)
|
||||
add_testing_repo
|
||||
```
|
||||
|
||||
### Repository Locations
|
||||
```bash
|
||||
/etc/apk/repositories # Main repo list
|
||||
/etc/apk/keys/ # GPG keys for repos
|
||||
/var/cache/apk/ # Package cache
|
||||
```
|
||||
|
||||
## Package Size Optimization
|
||||
|
||||
Alpine is designed for small container images:
|
||||
|
||||
```bash
|
||||
# DON'T: Leaves package cache (increases image size)
|
||||
apk add nginx
|
||||
|
||||
# DO: Remove cache to reduce size
|
||||
apk add --no-cache nginx
|
||||
|
||||
# Expected sizes:
|
||||
# Alpine base: ~5MB
|
||||
# Alpine + nginx: ~10-15MB
|
||||
# Debian base: ~75MB
|
||||
# Debian + nginx: ~90-95MB
|
||||
```
|
||||
|
||||
## Service Management on Alpine
|
||||
|
||||
### Using OpenRC
|
||||
```bash
|
||||
# Start service immediately
|
||||
rc-service nginx start
|
||||
|
||||
# Stop service
|
||||
rc-service nginx stop
|
||||
|
||||
# Restart service
|
||||
rc-service nginx restart
|
||||
|
||||
# Enable at boot
|
||||
rc-update add nginx
|
||||
|
||||
# Disable at boot
|
||||
rc-update del nginx
|
||||
|
||||
# List enabled services
|
||||
rc-update show
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "apk: lock is held by PID"
|
||||
```bash
|
||||
# Alpine apk database is locked (another process using apk)
|
||||
# Wait a moment
|
||||
sleep 5
|
||||
apk_update
|
||||
|
||||
# Or manually:
|
||||
rm /var/lib/apk/lock 2>/dev/null || true
|
||||
apk update
|
||||
```
|
||||
|
||||
### "Package not found"
|
||||
```bash
|
||||
# May be in community or testing repository
|
||||
add_community_repo
|
||||
apk_update
|
||||
apk_add package-name
|
||||
```
|
||||
|
||||
### "Repository not responding"
|
||||
```bash
|
||||
# Alpine repo may be slow or unreachable
|
||||
# Try updating again with retry logic
|
||||
apk_update # Built-in retry logic
|
||||
|
||||
# Or manually retry
|
||||
sleep 10
|
||||
apk update
|
||||
```
|
||||
|
||||
### "Service fails to start"
|
||||
```bash
|
||||
# Check service status on Alpine
|
||||
rc-service nginx status
|
||||
|
||||
# View logs
|
||||
tail /var/log/nginx/error.log
|
||||
|
||||
# Verify configuration
|
||||
nginx -t
|
||||
```
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- **[alpine-install.func/](../alpine-install.func/)** - Alpine installation functions
|
||||
- **[tools.func/](../tools.func/)** - Debian/standard tool installation
|
||||
- **[core.func/](../core.func/)** - Utility functions
|
||||
- **[error_handler.func/](../error_handler.func/)** - Error handling
|
||||
- **[UPDATED_APP-install.md](../../UPDATED_APP-install.md)** - Application script guide
|
||||
|
||||
## Recent Updates
|
||||
|
||||
### Version 2.0 (Dec 2025)
|
||||
- ✅ Enhanced apk error handling and retry logic
|
||||
- ✅ Improved repository management
|
||||
- ✅ Better service management with OpenRC
|
||||
- ✅ Added Alpine-specific optimization guidance
|
||||
- ✅ Enhanced package cache management
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
**Maintainers**: community-scripts team
|
||||
**License**: MIT
|
||||
342
docs/misc/api.func/API_FLOWCHART.md
Normal file
342
docs/misc/api.func/API_FLOWCHART.md
Normal file
@ -0,0 +1,342 @@
|
||||
# api.func Execution Flowchart
|
||||
|
||||
## Main API Communication Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ API Communication Initialization │
|
||||
│ Entry point when api.func functions are called by installation scripts │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Prerequisites Check │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Prerequisites Validation │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Check curl │ │ Check │ │ Check │ │ │
|
||||
│ │ │ Availability │ │ Diagnostics │ │ Random UUID │ │ │
|
||||
│ │ │ │ │ Setting │ │ │ │
|
||||
│ │ │ • command -v │ │ • DIAGNOSTICS │ │ • RANDOM_UUID │ │
|
||||
│ │ │ curl │ │ = "yes" │ │ not empty │ │
|
||||
│ │ │ • Return if │ │ • Return if │ │ • Return if │ │
|
||||
│ │ │ not found │ │ disabled │ │ not set │ │
|
||||
│ │ │ │ │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Data Collection │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ System Information Gathering │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Get PVE │ │ Collect │ │ Prepare JSON │ │ │
|
||||
│ │ │ Version │ │ Environment │ │ Payload │ │
|
||||
│ │ │ │ │ Variables │ │ │ │
|
||||
│ │ │ • pveversion │ │ • CT_TYPE │ │ • Create JSON │ │
|
||||
│ │ │ command │ │ • DISK_SIZE │ │ structure │ │
|
||||
│ │ │ • Parse version │ │ • CORE_COUNT │ │ • Include all │ │
|
||||
│ │ │ • Extract │ │ • RAM_SIZE │ │ variables │ │
|
||||
│ │ │ major.minor │ │ • var_os │ │ • Format for API │ │
|
||||
│ │ │ │ │ • var_version │ │ │ │
|
||||
│ │ │ │ │ • NSAPP │ │ │ │
|
||||
│ │ │ │ │ • METHOD │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ API Request Execution │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ HTTP Request Processing │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Prepare │ │ Execute │ │ Handle │ │ │
|
||||
│ │ │ Request │ │ HTTP Request │ │ Response │ │
|
||||
│ │ │ │ │ │ │ │ │
|
||||
│ │ │ • Set API URL │ │ • curl -s -w │ │ • Capture HTTP │ │
|
||||
│ │ │ • Set headers │ │ "%{http_code}" │ │ status code │ │
|
||||
│ │ │ • Set payload │ │ • POST request │ │ • Store response │ │
|
||||
│ │ │ • Content-Type │ │ • JSON data │ │ • Handle errors │ │
|
||||
│ │ │ application/ │ │ • Follow │ │ gracefully │ │
|
||||
│ │ │ json │ │ redirects │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## LXC API Reporting Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ POST_TO_API() Flow │
|
||||
│ Send LXC container installation data to API │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ LXC Data Preparation │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ LXC-Specific Data Collection │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Set LXC │ │ Include LXC │ │ Set Status │ │ │
|
||||
│ │ │ Type │ │ Variables │ │ Information │ │
|
||||
│ │ │ │ │ │ │ │ │
|
||||
│ │ │ • ct_type: 1 │ │ • DISK_SIZE │ │ • status: │ │
|
||||
│ │ │ • type: "lxc" │ │ • CORE_COUNT │ │ "installing" │ │
|
||||
│ │ │ • Include all │ │ • RAM_SIZE │ │ • Include all │ │
|
||||
│ │ │ LXC data │ │ • var_os │ │ tracking data │ │
|
||||
│ │ │ │ │ • var_version │ │ │ │
|
||||
│ │ │ │ │ • DISABLEIP6 │ │ │ │
|
||||
│ │ │ │ │ • NSAPP │ │ │ │
|
||||
│ │ │ │ │ • METHOD │ │ │ │
|
||||
│ │ │ │ │ • pve_version │ │ │ │
|
||||
│ │ │ │ │ • random_id │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ JSON Payload Creation │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ JSON Structure Generation │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Create JSON │ │ Validate │ │ Format for │ │ │
|
||||
│ │ │ Structure │ │ Data │ │ API Request │ │
|
||||
│ │ │ │ │ │ │ │ │
|
||||
│ │ │ • Use heredoc │ │ • Check all │ │ • Ensure proper │ │
|
||||
│ │ │ syntax │ │ variables │ │ JSON format │ │
|
||||
│ │ │ • Include all │ │ are set │ │ • Escape special │ │
|
||||
│ │ │ required │ │ • Validate │ │ characters │ │
|
||||
│ │ │ fields │ │ data types │ │ • Set content │ │
|
||||
│ │ │ • Format │ │ • Handle │ │ type │ │
|
||||
│ │ │ properly │ │ missing │ │ │ │
|
||||
│ │ │ │ │ values │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## VM API Reporting Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ POST_TO_API_VM() Flow │
|
||||
│ Send VM installation data to API │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ VM Data Preparation │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ VM-Specific Data Collection │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Check │ │ Set VM │ │ Process Disk │ │ │
|
||||
│ │ │ Diagnostics │ │ Type │ │ Size │ │
|
||||
│ │ │ File │ │ │ │ │ │
|
||||
│ │ │ │ │ • ct_type: 2 │ │ • Remove 'G' │ │
|
||||
│ │ │ • Check file │ │ • type: "vm" │ │ suffix │ │
|
||||
│ │ │ existence │ │ • Include all │ │ • Convert to │ │
|
||||
│ │ │ • Read │ │ VM data │ │ numeric value │ │
|
||||
│ │ │ DIAGNOSTICS │ │ │ │ • Store in │ │
|
||||
│ │ │ setting │ │ │ │ DISK_SIZE_API │ │
|
||||
│ │ │ • Parse value │ │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ VM JSON Payload Creation │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ VM-Specific JSON Structure │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Include VM │ │ Set VM │ │ Format VM │ │ │
|
||||
│ │ │ Variables │ │ Status │ │ Data for API │ │
|
||||
│ │ │ │ │ │ │ │ │
|
||||
│ │ │ • DISK_SIZE_API │ │ • status: │ │ • Ensure proper │ │
|
||||
│ │ │ • CORE_COUNT │ │ "installing" │ │ JSON format │ │
|
||||
│ │ │ • RAM_SIZE │ │ • Include all │ │ • Handle VM- │ │
|
||||
│ │ │ • var_os │ │ tracking │ │ specific data │ │
|
||||
│ │ │ • var_version │ │ information │ │ • Set appropriate │ │
|
||||
│ │ │ • NSAPP │ │ │ │ content type │ │
|
||||
│ │ │ • METHOD │ │ │ │ │ │
|
||||
│ │ │ • pve_version │ │ │ │ │ │
|
||||
│ │ │ • random_id │ │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Status Update Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ POST_UPDATE_TO_API() Flow │
|
||||
│ Send installation completion status to API │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Update Prevention Check │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Duplicate Update Prevention │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Check │ │ Set Flag │ │ Return Early │ │ │
|
||||
│ │ │ POST_UPDATE_ │ │ if First │ │ if Already │ │
|
||||
│ │ │ DONE │ │ Update │ │ Updated │ │
|
||||
│ │ │ │ │ │ │ │ │
|
||||
│ │ │ • Check if │ │ • Set │ │ • Return 0 │ │
|
||||
│ │ │ already │ │ POST_UPDATE_ │ │ • Skip API call │ │
|
||||
│ │ │ updated │ │ DONE=true │ │ • Prevent │ │
|
||||
│ │ │ • Prevent │ │ • Continue │ │ duplicate │ │
|
||||
│ │ │ duplicate │ │ with update │ │ requests │ │
|
||||
│ │ │ requests │ │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Status and Error Processing │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Status Determination │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Determine │ │ Get Error │ │ Prepare Status │ │ │
|
||||
│ │ │ Status │ │ Description │ │ Data │ │
|
||||
│ │ │ │ │ │ │ │ │
|
||||
│ │ │ • status: │ │ • Call │ │ • Include status │ │
|
||||
│ │ │ "success" or │ │ get_error_ │ │ • Include error │ │
|
||||
│ │ │ "failed" │ │ description() │ │ description │ │
|
||||
│ │ │ • Set exit │ │ • Get human- │ │ • Include random │ │
|
||||
│ │ │ code based │ │ readable │ │ ID for tracking │ │
|
||||
│ │ │ on status │ │ error message │ │ │ │
|
||||
│ │ │ • Default to │ │ • Handle │ │ │ │
|
||||
│ │ │ error if │ │ unknown │ │ │ │
|
||||
│ │ │ not set │ │ errors │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Status Update API Request │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Status Update Payload Creation │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Create │ │ Send Status │ │ Mark Update │ │ │
|
||||
│ │ │ Status JSON │ │ Update │ │ Complete │ │
|
||||
│ │ │ │ │ │ │ │ │
|
||||
│ │ │ • Include │ │ • POST to │ │ • Set │ │
|
||||
│ │ │ status │ │ updatestatus │ │ POST_UPDATE_ │ │
|
||||
│ │ │ • Include │ │ endpoint │ │ DONE=true │ │
|
||||
│ │ │ error │ │ • Include JSON │ │ • Prevent further │ │
|
||||
│ │ │ description │ │ payload │ │ updates │ │
|
||||
│ │ │ • Include │ │ • Handle │ │ • Complete │ │
|
||||
│ │ │ random_id │ │ response │ │ process │ │
|
||||
│ │ │ │ │ gracefully │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Error Description Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ GET_ERROR_DESCRIPTION() Flow │
|
||||
│ Convert numeric exit codes to human-readable explanations │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Error Code Classification │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Error Code Categories │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ General │ │ Network │ │ LXC-Specific │ │ │
|
||||
│ │ │ System │ │ Errors │ │ Errors │ │
|
||||
│ │ │ Errors │ │ │ │ │ │
|
||||
│ │ │ │ │ • 18: Connection│ │ • 100-101: LXC │ │
|
||||
│ │ │ • 0-9: Basic │ │ failed │ │ install errors │ │
|
||||
│ │ │ errors │ │ • 22: Invalid │ │ • 200-209: LXC │ │
|
||||
│ │ │ • 126-128: │ │ argument │ │ creation errors │ │
|
||||
│ │ │ Command │ │ • 28: No space │ │ │ │
|
||||
│ │ │ errors │ │ • 35: Timeout │ │ │ │
|
||||
│ │ │ • 129-143: │ │ • 56: TLS error │ │ │ │
|
||||
│ │ │ Signal │ │ • 60: SSL cert │ │ │ │
|
||||
│ │ │ errors │ │ error │ │ │ │
|
||||
│ │ │ • 152: Resource │ │ │ │ │ │
|
||||
│ │ │ limit │ │ │ │ │ │
|
||||
│ │ │ • 255: Unknown │ │ │ │ │ │
|
||||
│ │ │ critical │ │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Error Message Return │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Error Message Formatting │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Match Error │ │ Return │ │ Default Case │ │ │
|
||||
│ │ │ Code │ │ Description │ │ │ │
|
||||
│ │ │ │ │ │ │ │ │
|
||||
│ │ │ • Use case │ │ • Return │ │ • Return "Unknown │ │
|
||||
│ │ │ statement │ │ human- │ │ error code │ │
|
||||
│ │ │ • Match │ │ readable │ │ (exit_code)" │ │
|
||||
│ │ │ specific │ │ message │ │ • Handle │ │
|
||||
│ │ │ codes │ │ • Include │ │ unrecognized │ │
|
||||
│ │ │ • Handle │ │ context │ │ codes │ │
|
||||
│ │ │ ranges │ │ information │ │ • Provide fallback │ │
|
||||
│ │ │ │ │ │ │ message │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Integration Points
|
||||
|
||||
### With Installation Scripts
|
||||
- **build.func**: Sends LXC installation data
|
||||
- **vm-core.func**: Sends VM installation data
|
||||
- **install.func**: Reports installation status
|
||||
- **alpine-install.func**: Reports Alpine installation data
|
||||
|
||||
### With Error Handling
|
||||
- **error_handler.func**: Provides error explanations
|
||||
- **core.func**: Uses error descriptions in silent execution
|
||||
- **Diagnostic reporting**: Tracks error patterns
|
||||
|
||||
### External Dependencies
|
||||
- **curl**: HTTP client for API communication
|
||||
- **Community Scripts API**: External API endpoint
|
||||
- **Network connectivity**: Required for API communication
|
||||
433
docs/misc/api.func/API_FUNCTIONS_REFERENCE.md
Normal file
433
docs/misc/api.func/API_FUNCTIONS_REFERENCE.md
Normal file
@ -0,0 +1,433 @@
|
||||
# api.func Functions Reference
|
||||
|
||||
## Overview
|
||||
|
||||
This document provides a comprehensive alphabetical reference of all functions in `api.func`, including parameters, dependencies, usage examples, and error handling.
|
||||
|
||||
## Function Categories
|
||||
|
||||
### Error Description Functions
|
||||
|
||||
#### `get_error_description()`
|
||||
**Purpose**: Convert numeric exit codes to human-readable explanations
|
||||
**Parameters**:
|
||||
- `$1` - Exit code to explain
|
||||
**Returns**: Human-readable error explanation string
|
||||
**Side Effects**: None
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Supported Exit Codes**:
|
||||
- **General System**: 0-9, 18, 22, 28, 35, 56, 60, 125-128, 129-143, 152, 255
|
||||
- **LXC-Specific**: 100-101, 200-209
|
||||
- **Docker**: 125
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
error_msg=$(get_error_description 127)
|
||||
echo "Error 127: $error_msg"
|
||||
# Output: Error 127: Command not found: Incorrect path or missing dependency.
|
||||
```
|
||||
|
||||
**Error Code Examples**:
|
||||
```bash
|
||||
get_error_description 0 # " " (space)
|
||||
get_error_description 1 # "General error: An unspecified error occurred."
|
||||
get_error_description 127 # "Command not found: Incorrect path or missing dependency."
|
||||
get_error_description 200 # "LXC creation failed."
|
||||
get_error_description 255 # "Unknown critical error, often due to missing permissions or broken scripts."
|
||||
```
|
||||
|
||||
### API Communication Functions
|
||||
|
||||
#### `post_to_api()`
|
||||
**Purpose**: Send LXC container installation data to community-scripts.org API
|
||||
**Parameters**: None (uses environment variables)
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Sends HTTP POST request to API
|
||||
- Stores response in RESPONSE variable
|
||||
- Requires curl command and network connectivity
|
||||
**Dependencies**: `curl` command
|
||||
**Environment Variables Used**: `DIAGNOSTICS`, `RANDOM_UUID`, `CT_TYPE`, `DISK_SIZE`, `CORE_COUNT`, `RAM_SIZE`, `var_os`, `var_version`, `DISABLEIP6`, `NSAPP`, `METHOD`
|
||||
|
||||
**Prerequisites**:
|
||||
- `curl` command must be available
|
||||
- `DIAGNOSTICS` must be set to "yes"
|
||||
- `RANDOM_UUID` must be set and not empty
|
||||
|
||||
**API Endpoint**: `http://api.community-scripts.org/dev/upload`
|
||||
|
||||
**JSON Payload Structure**:
|
||||
```json
|
||||
{
|
||||
"ct_type": 1,
|
||||
"type": "lxc",
|
||||
"disk_size": 8,
|
||||
"core_count": 2,
|
||||
"ram_size": 2048,
|
||||
"os_type": "debian",
|
||||
"os_version": "12",
|
||||
"disableip6": "true",
|
||||
"nsapp": "plex",
|
||||
"method": "install",
|
||||
"pve_version": "8.0",
|
||||
"status": "installing",
|
||||
"random_id": "uuid-string"
|
||||
}
|
||||
```
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
export CT_TYPE=1
|
||||
export DISK_SIZE=8
|
||||
export CORE_COUNT=2
|
||||
export RAM_SIZE=2048
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export NSAPP="plex"
|
||||
export METHOD="install"
|
||||
|
||||
post_to_api
|
||||
```
|
||||
|
||||
#### `post_to_api_vm()`
|
||||
**Purpose**: Send VM installation data to community-scripts.org API
|
||||
**Parameters**: None (uses environment variables)
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Sends HTTP POST request to API
|
||||
- Stores response in RESPONSE variable
|
||||
- Requires curl command and network connectivity
|
||||
**Dependencies**: `curl` command, diagnostics file
|
||||
**Environment Variables Used**: `DIAGNOSTICS`, `RANDOM_UUID`, `DISK_SIZE`, `CORE_COUNT`, `RAM_SIZE`, `var_os`, `var_version`, `NSAPP`, `METHOD`
|
||||
|
||||
**Prerequisites**:
|
||||
- `/usr/local/community-scripts/diagnostics` file must exist
|
||||
- `DIAGNOSTICS` must be set to "yes" in diagnostics file
|
||||
- `curl` command must be available
|
||||
- `RANDOM_UUID` must be set and not empty
|
||||
|
||||
**API Endpoint**: `http://api.community-scripts.org/dev/upload`
|
||||
|
||||
**JSON Payload Structure**:
|
||||
```json
|
||||
{
|
||||
"ct_type": 2,
|
||||
"type": "vm",
|
||||
"disk_size": 8,
|
||||
"core_count": 2,
|
||||
"ram_size": 2048,
|
||||
"os_type": "debian",
|
||||
"os_version": "12",
|
||||
"disableip6": "",
|
||||
"nsapp": "plex",
|
||||
"method": "install",
|
||||
"pve_version": "8.0",
|
||||
"status": "installing",
|
||||
"random_id": "uuid-string"
|
||||
}
|
||||
```
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
# Create diagnostics file
|
||||
echo "DIAGNOSTICS=yes" > /usr/local/community-scripts/diagnostics
|
||||
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
export DISK_SIZE="8G"
|
||||
export CORE_COUNT=2
|
||||
export RAM_SIZE=2048
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export NSAPP="plex"
|
||||
export METHOD="install"
|
||||
|
||||
post_to_api_vm
|
||||
```
|
||||
|
||||
#### `post_update_to_api()`
|
||||
**Purpose**: Send installation completion status to community-scripts.org API
|
||||
**Parameters**:
|
||||
- `$1` - Status ("success" or "failed", default: "failed")
|
||||
- `$2` - Exit code (default: 1)
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Sends HTTP POST request to API
|
||||
- Sets POST_UPDATE_DONE=true to prevent duplicates
|
||||
- Stores response in RESPONSE variable
|
||||
**Dependencies**: `curl` command, `get_error_description()`
|
||||
**Environment Variables Used**: `DIAGNOSTICS`, `RANDOM_UUID`
|
||||
|
||||
**Prerequisites**:
|
||||
- `curl` command must be available
|
||||
- `DIAGNOSTICS` must be set to "yes"
|
||||
- `RANDOM_UUID` must be set and not empty
|
||||
- POST_UPDATE_DONE must be false (prevents duplicates)
|
||||
|
||||
**API Endpoint**: `http://api.community-scripts.org/dev/upload/updatestatus`
|
||||
|
||||
**JSON Payload Structure**:
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"error": "Error description from get_error_description()",
|
||||
"random_id": "uuid-string"
|
||||
}
|
||||
```
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
|
||||
# Report successful installation
|
||||
post_update_to_api "success" 0
|
||||
|
||||
# Report failed installation
|
||||
post_update_to_api "failed" 127
|
||||
```
|
||||
|
||||
## Function Call Hierarchy
|
||||
|
||||
### API Communication Flow
|
||||
```
|
||||
post_to_api()
|
||||
├── Check curl availability
|
||||
├── Check DIAGNOSTICS setting
|
||||
├── Check RANDOM_UUID
|
||||
├── Get PVE version
|
||||
├── Create JSON payload
|
||||
└── Send HTTP POST request
|
||||
|
||||
post_to_api_vm()
|
||||
├── Check diagnostics file
|
||||
├── Check curl availability
|
||||
├── Check DIAGNOSTICS setting
|
||||
├── Check RANDOM_UUID
|
||||
├── Process disk size
|
||||
├── Get PVE version
|
||||
├── Create JSON payload
|
||||
└── Send HTTP POST request
|
||||
|
||||
post_update_to_api()
|
||||
├── Check POST_UPDATE_DONE flag
|
||||
├── Check curl availability
|
||||
├── Check DIAGNOSTICS setting
|
||||
├── Check RANDOM_UUID
|
||||
├── Determine status and exit code
|
||||
├── Get error description
|
||||
├── Create JSON payload
|
||||
├── Send HTTP POST request
|
||||
└── Set POST_UPDATE_DONE=true
|
||||
```
|
||||
|
||||
### Error Description Flow
|
||||
```
|
||||
get_error_description()
|
||||
├── Match exit code
|
||||
├── Return appropriate description
|
||||
└── Handle unknown codes
|
||||
```
|
||||
|
||||
## Error Code Reference
|
||||
|
||||
### General System Errors
|
||||
| Code | Description |
|
||||
|------|-------------|
|
||||
| 0 | (space) |
|
||||
| 1 | General error: An unspecified error occurred. |
|
||||
| 2 | Incorrect shell usage or invalid command arguments. |
|
||||
| 3 | Unexecuted function or invalid shell condition. |
|
||||
| 4 | Error opening a file or invalid path. |
|
||||
| 5 | I/O error: An input/output failure occurred. |
|
||||
| 6 | No such device or address. |
|
||||
| 7 | Insufficient memory or resource exhaustion. |
|
||||
| 8 | Non-executable file or invalid file format. |
|
||||
| 9 | Failed child process execution. |
|
||||
| 18 | Connection to a remote server failed. |
|
||||
| 22 | Invalid argument or faulty network connection. |
|
||||
| 28 | No space left on device. |
|
||||
| 35 | Timeout while establishing a connection. |
|
||||
| 56 | Faulty TLS connection. |
|
||||
| 60 | SSL certificate error. |
|
||||
|
||||
### Command Execution Errors
|
||||
| Code | Description |
|
||||
|------|-------------|
|
||||
| 125 | Docker error: Container could not start. |
|
||||
| 126 | Command not executable: Incorrect permissions or missing dependencies. |
|
||||
| 127 | Command not found: Incorrect path or missing dependency. |
|
||||
| 128 | Invalid exit signal, e.g., incorrect Git command. |
|
||||
|
||||
### Signal Errors
|
||||
| Code | Description |
|
||||
|------|-------------|
|
||||
| 129 | Signal 1 (SIGHUP): Process terminated due to hangup. |
|
||||
| 130 | Signal 2 (SIGINT): Manual termination via Ctrl+C. |
|
||||
| 132 | Signal 4 (SIGILL): Illegal machine instruction. |
|
||||
| 133 | Signal 5 (SIGTRAP): Debugging error or invalid breakpoint signal. |
|
||||
| 134 | Signal 6 (SIGABRT): Program aborted itself. |
|
||||
| 135 | Signal 7 (SIGBUS): Memory error, invalid memory address. |
|
||||
| 137 | Signal 9 (SIGKILL): Process forcibly terminated (OOM-killer or 'kill -9'). |
|
||||
| 139 | Signal 11 (SIGSEGV): Segmentation fault, possibly due to invalid pointer access. |
|
||||
| 141 | Signal 13 (SIGPIPE): Pipe closed unexpectedly. |
|
||||
| 143 | Signal 15 (SIGTERM): Process terminated normally. |
|
||||
| 152 | Signal 24 (SIGXCPU): CPU time limit exceeded. |
|
||||
|
||||
### LXC-Specific Errors
|
||||
| Code | Description |
|
||||
|------|-------------|
|
||||
| 100 | LXC install error: Unexpected error in create_lxc.sh. |
|
||||
| 101 | LXC install error: No network connection detected. |
|
||||
| 200 | LXC creation failed. |
|
||||
| 201 | LXC error: Invalid Storage class. |
|
||||
| 202 | User aborted menu in create_lxc.sh. |
|
||||
| 203 | CTID not set in create_lxc.sh. |
|
||||
| 204 | PCT_OSTYPE not set in create_lxc.sh. |
|
||||
| 205 | CTID cannot be less than 100 in create_lxc.sh. |
|
||||
| 206 | CTID already in use in create_lxc.sh. |
|
||||
| 207 | Template not found in create_lxc.sh. |
|
||||
| 208 | Error downloading template in create_lxc.sh. |
|
||||
| 209 | Container creation failed, but template is intact in create_lxc.sh. |
|
||||
|
||||
### Other Errors
|
||||
| Code | Description |
|
||||
|------|-------------|
|
||||
| 255 | Unknown critical error, often due to missing permissions or broken scripts. |
|
||||
| * | Unknown error code (exit_code). |
|
||||
|
||||
## Environment Variable Dependencies
|
||||
|
||||
### Required Variables
|
||||
- **`DIAGNOSTICS`**: Enable/disable diagnostic reporting ("yes"/"no")
|
||||
- **`RANDOM_UUID`**: Unique identifier for tracking
|
||||
|
||||
### Optional Variables
|
||||
- **`CT_TYPE`**: Container type (1 for LXC, 2 for VM)
|
||||
- **`DISK_SIZE`**: Disk size in GB (or GB with 'G' suffix for VM)
|
||||
- **`CORE_COUNT`**: Number of CPU cores
|
||||
- **`RAM_SIZE`**: RAM size in MB
|
||||
- **`var_os`**: Operating system type
|
||||
- **`var_version`**: OS version
|
||||
- **`DISABLEIP6`**: IPv6 disable setting
|
||||
- **`NSAPP`**: Namespace application name
|
||||
- **`METHOD`**: Installation method
|
||||
|
||||
### Internal Variables
|
||||
- **`POST_UPDATE_DONE`**: Prevents duplicate status updates
|
||||
- **`API_URL`**: Community scripts API endpoint
|
||||
- **`JSON_PAYLOAD`**: API request payload
|
||||
- **`RESPONSE`**: API response
|
||||
- **`DISK_SIZE_API`**: Processed disk size for VM API
|
||||
|
||||
## Error Handling Patterns
|
||||
|
||||
### API Communication Errors
|
||||
- All API functions handle curl failures gracefully
|
||||
- Network errors don't block installation process
|
||||
- Missing prerequisites cause early return
|
||||
- Duplicate updates are prevented
|
||||
|
||||
### Error Description Errors
|
||||
- Unknown error codes return generic message
|
||||
- All error codes are handled with case statement
|
||||
- Fallback message includes the actual error code
|
||||
|
||||
### Prerequisites Validation
|
||||
- Check curl availability before API calls
|
||||
- Validate DIAGNOSTICS setting
|
||||
- Ensure RANDOM_UUID is set
|
||||
- Check for duplicate updates
|
||||
|
||||
## Integration Examples
|
||||
|
||||
### With build.func
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
source api.func
|
||||
source build.func
|
||||
|
||||
# Set up API reporting
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
|
||||
# Report installation start
|
||||
post_to_api
|
||||
|
||||
# Container creation...
|
||||
# ... build.func code ...
|
||||
|
||||
# Report completion
|
||||
if [[ $? -eq 0 ]]; then
|
||||
post_update_to_api "success" 0
|
||||
else
|
||||
post_update_to_api "failed" $?
|
||||
fi
|
||||
```
|
||||
|
||||
### With vm-core.func
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
source api.func
|
||||
source vm-core.func
|
||||
|
||||
# Set up API reporting
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
|
||||
# Report VM installation start
|
||||
post_to_api_vm
|
||||
|
||||
# VM creation...
|
||||
# ... vm-core.func code ...
|
||||
|
||||
# Report completion
|
||||
post_update_to_api "success" 0
|
||||
```
|
||||
|
||||
### With error_handler.func
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
source error_handler.func
|
||||
source api.func
|
||||
|
||||
# Use error descriptions
|
||||
error_code=127
|
||||
error_msg=$(get_error_description $error_code)
|
||||
echo "Error $error_code: $error_msg"
|
||||
|
||||
# Report error to API
|
||||
post_update_to_api "failed" $error_code
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### API Usage
|
||||
1. Always check prerequisites before API calls
|
||||
2. Use unique identifiers for tracking
|
||||
3. Handle API failures gracefully
|
||||
4. Don't block installation on API failures
|
||||
|
||||
### Error Reporting
|
||||
1. Use appropriate error codes
|
||||
2. Provide meaningful error descriptions
|
||||
3. Report both success and failure cases
|
||||
4. Prevent duplicate status updates
|
||||
|
||||
### Diagnostic Reporting
|
||||
1. Respect user privacy settings
|
||||
2. Only send data when diagnostics enabled
|
||||
3. Use anonymous tracking identifiers
|
||||
4. Include relevant system information
|
||||
|
||||
### Error Handling
|
||||
1. Handle unknown error codes gracefully
|
||||
2. Provide fallback error messages
|
||||
3. Include error code in unknown error messages
|
||||
4. Use consistent error message format
|
||||
643
docs/misc/api.func/API_INTEGRATION.md
Normal file
643
docs/misc/api.func/API_INTEGRATION.md
Normal file
@ -0,0 +1,643 @@
|
||||
# api.func Integration Guide
|
||||
|
||||
## Overview
|
||||
|
||||
This document describes how `api.func` integrates with other components in the Proxmox Community Scripts project, including dependencies, data flow, and API surface.
|
||||
|
||||
## Dependencies
|
||||
|
||||
### External Dependencies
|
||||
|
||||
#### Required Commands
|
||||
- **`curl`**: HTTP client for API communication
|
||||
- **`uuidgen`**: Generate unique identifiers (optional, can use other methods)
|
||||
|
||||
#### Optional Commands
|
||||
- **None**: No other external command dependencies
|
||||
|
||||
### Internal Dependencies
|
||||
|
||||
#### Environment Variables from Other Scripts
|
||||
- **build.func**: Provides container creation variables
|
||||
- **vm-core.func**: Provides VM creation variables
|
||||
- **core.func**: Provides system information variables
|
||||
- **Installation scripts**: Provide application-specific variables
|
||||
|
||||
## Integration Points
|
||||
|
||||
### With build.func
|
||||
|
||||
#### LXC Container Reporting
|
||||
```bash
|
||||
# build.func uses api.func for container reporting
|
||||
source core.func
|
||||
source api.func
|
||||
source build.func
|
||||
|
||||
# Set up API reporting
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
|
||||
# Container creation with API reporting
|
||||
create_container() {
|
||||
# Set container parameters
|
||||
export CT_TYPE=1
|
||||
export DISK_SIZE="$var_disk"
|
||||
export CORE_COUNT="$var_cpu"
|
||||
export RAM_SIZE="$var_ram"
|
||||
export var_os="$var_os"
|
||||
export var_version="$var_version"
|
||||
export NSAPP="$APP"
|
||||
export METHOD="install"
|
||||
|
||||
# Report installation start
|
||||
post_to_api
|
||||
|
||||
# Container creation using build.func
|
||||
# ... build.func container creation logic ...
|
||||
|
||||
# Report completion
|
||||
if [[ $? -eq 0 ]]; then
|
||||
post_update_to_api "success" 0
|
||||
else
|
||||
post_update_to_api "failed" $?
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
#### Error Reporting Integration
|
||||
```bash
|
||||
# build.func uses api.func for error reporting
|
||||
handle_container_error() {
|
||||
local exit_code=$1
|
||||
local error_msg=$(get_error_description $exit_code)
|
||||
|
||||
echo "Container creation failed: $error_msg"
|
||||
post_update_to_api "failed" $exit_code
|
||||
}
|
||||
```
|
||||
|
||||
### With vm-core.func
|
||||
|
||||
#### VM Installation Reporting
|
||||
```bash
|
||||
# vm-core.func uses api.func for VM reporting
|
||||
source core.func
|
||||
source api.func
|
||||
source vm-core.func
|
||||
|
||||
# Set up VM API reporting
|
||||
mkdir -p /usr/local/community-scripts
|
||||
echo "DIAGNOSTICS=yes" > /usr/local/community-scripts/diagnostics
|
||||
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
|
||||
# VM creation with API reporting
|
||||
create_vm() {
|
||||
# Set VM parameters
|
||||
export DISK_SIZE="${var_disk}G"
|
||||
export CORE_COUNT="$var_cpu"
|
||||
export RAM_SIZE="$var_ram"
|
||||
export var_os="$var_os"
|
||||
export var_version="$var_version"
|
||||
export NSAPP="$APP"
|
||||
export METHOD="install"
|
||||
|
||||
# Report VM installation start
|
||||
post_to_api_vm
|
||||
|
||||
# VM creation using vm-core.func
|
||||
# ... vm-core.func VM creation logic ...
|
||||
|
||||
# Report completion
|
||||
post_update_to_api "success" 0
|
||||
}
|
||||
```
|
||||
|
||||
### With core.func
|
||||
|
||||
#### System Information Integration
|
||||
```bash
|
||||
# core.func provides system information for api.func
|
||||
source core.func
|
||||
source api.func
|
||||
|
||||
# Get system information for API reporting
|
||||
get_system_info_for_api() {
|
||||
# Get PVE version using core.func utilities
|
||||
local pve_version=$(pveversion | awk -F'[/ ]' '{print $2}')
|
||||
|
||||
# Set API parameters
|
||||
export var_os="$var_os"
|
||||
export var_version="$var_version"
|
||||
|
||||
# Use core.func error handling with api.func reporting
|
||||
if silent apt-get update; then
|
||||
post_update_to_api "success" 0
|
||||
else
|
||||
post_update_to_api "failed" $?
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
### With error_handler.func
|
||||
|
||||
#### Error Description Integration
|
||||
```bash
|
||||
# error_handler.func uses api.func for error descriptions
|
||||
source core.func
|
||||
source error_handler.func
|
||||
source api.func
|
||||
|
||||
# Enhanced error handler with API reporting
|
||||
enhanced_error_handler() {
|
||||
local exit_code=${1:-$?}
|
||||
local command=${2:-${BASH_COMMAND:-unknown}}
|
||||
|
||||
# Get error description from api.func
|
||||
local error_msg=$(get_error_description $exit_code)
|
||||
|
||||
# Display error information
|
||||
echo "Error $exit_code: $error_msg"
|
||||
echo "Command: $command"
|
||||
|
||||
# Report error to API
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
post_update_to_api "failed" $exit_code
|
||||
|
||||
# Use standard error handler
|
||||
error_handler $exit_code $command
|
||||
}
|
||||
```
|
||||
|
||||
### With install.func
|
||||
|
||||
#### Installation Process Reporting
|
||||
```bash
|
||||
# install.func uses api.func for installation reporting
|
||||
source core.func
|
||||
source api.func
|
||||
source install.func
|
||||
|
||||
# Installation with API reporting
|
||||
install_package_with_reporting() {
|
||||
local package="$1"
|
||||
|
||||
# Set up API reporting
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
export NSAPP="$package"
|
||||
export METHOD="install"
|
||||
|
||||
# Report installation start
|
||||
post_to_api
|
||||
|
||||
# Package installation using install.func
|
||||
if install_package "$package"; then
|
||||
echo "$package installed successfully"
|
||||
post_update_to_api "success" 0
|
||||
return 0
|
||||
else
|
||||
local exit_code=$?
|
||||
local error_msg=$(get_error_description $exit_code)
|
||||
echo "$package installation failed: $error_msg"
|
||||
post_update_to_api "failed" $exit_code
|
||||
return $exit_code
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
### With alpine-install.func
|
||||
|
||||
#### Alpine Installation Reporting
|
||||
```bash
|
||||
# alpine-install.func uses api.func for Alpine reporting
|
||||
source core.func
|
||||
source api.func
|
||||
source alpine-install.func
|
||||
|
||||
# Alpine installation with API reporting
|
||||
install_alpine_with_reporting() {
|
||||
local app="$1"
|
||||
|
||||
# Set up API reporting
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
export NSAPP="$app"
|
||||
export METHOD="install"
|
||||
export var_os="alpine"
|
||||
|
||||
# Report Alpine installation start
|
||||
post_to_api
|
||||
|
||||
# Alpine installation using alpine-install.func
|
||||
if install_alpine_app "$app"; then
|
||||
echo "Alpine $app installed successfully"
|
||||
post_update_to_api "success" 0
|
||||
return 0
|
||||
else
|
||||
local exit_code=$?
|
||||
local error_msg=$(get_error_description $exit_code)
|
||||
echo "Alpine $app installation failed: $error_msg"
|
||||
post_update_to_api "failed" $exit_code
|
||||
return $exit_code
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
### With alpine-tools.func
|
||||
|
||||
#### Alpine Tools Reporting
|
||||
```bash
|
||||
# alpine-tools.func uses api.func for Alpine tools reporting
|
||||
source core.func
|
||||
source api.func
|
||||
source alpine-tools.func
|
||||
|
||||
# Alpine tools with API reporting
|
||||
run_alpine_tool_with_reporting() {
|
||||
local tool="$1"
|
||||
|
||||
# Set up API reporting
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
export NSAPP="alpine-tools"
|
||||
export METHOD="tool"
|
||||
|
||||
# Report tool execution start
|
||||
post_to_api
|
||||
|
||||
# Run Alpine tool using alpine-tools.func
|
||||
if run_alpine_tool "$tool"; then
|
||||
echo "Alpine tool $tool executed successfully"
|
||||
post_update_to_api "success" 0
|
||||
return 0
|
||||
else
|
||||
local exit_code=$?
|
||||
local error_msg=$(get_error_description $exit_code)
|
||||
echo "Alpine tool $tool failed: $error_msg"
|
||||
post_update_to_api "failed" $exit_code
|
||||
return $exit_code
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
### With passthrough.func
|
||||
|
||||
#### Hardware Passthrough Reporting
|
||||
```bash
|
||||
# passthrough.func uses api.func for hardware reporting
|
||||
source core.func
|
||||
source api.func
|
||||
source passthrough.func
|
||||
|
||||
# Hardware passthrough with API reporting
|
||||
configure_passthrough_with_reporting() {
|
||||
local hardware_type="$1"
|
||||
|
||||
# Set up API reporting
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
export NSAPP="passthrough"
|
||||
export METHOD="hardware"
|
||||
|
||||
# Report passthrough configuration start
|
||||
post_to_api
|
||||
|
||||
# Configure passthrough using passthrough.func
|
||||
if configure_passthrough "$hardware_type"; then
|
||||
echo "Hardware passthrough configured successfully"
|
||||
post_update_to_api "success" 0
|
||||
return 0
|
||||
else
|
||||
local exit_code=$?
|
||||
local error_msg=$(get_error_description $exit_code)
|
||||
echo "Hardware passthrough failed: $error_msg"
|
||||
post_update_to_api "failed" $exit_code
|
||||
return $exit_code
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
### With tools.func
|
||||
|
||||
#### Maintenance Operations Reporting
|
||||
```bash
|
||||
# tools.func uses api.func for maintenance reporting
|
||||
source core.func
|
||||
source api.func
|
||||
source tools.func
|
||||
|
||||
# Maintenance operations with API reporting
|
||||
run_maintenance_with_reporting() {
|
||||
local operation="$1"
|
||||
|
||||
# Set up API reporting
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
export NSAPP="maintenance"
|
||||
export METHOD="tool"
|
||||
|
||||
# Report maintenance start
|
||||
post_to_api
|
||||
|
||||
# Run maintenance using tools.func
|
||||
if run_maintenance_operation "$operation"; then
|
||||
echo "Maintenance operation $operation completed successfully"
|
||||
post_update_to_api "success" 0
|
||||
return 0
|
||||
else
|
||||
local exit_code=$?
|
||||
local error_msg=$(get_error_description $exit_code)
|
||||
echo "Maintenance operation $operation failed: $error_msg"
|
||||
post_update_to_api "failed" $exit_code
|
||||
return $exit_code
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
## Data Flow
|
||||
|
||||
### Input Data
|
||||
|
||||
#### Environment Variables from Other Scripts
|
||||
- **`CT_TYPE`**: Container type (1 for LXC, 2 for VM)
|
||||
- **`DISK_SIZE`**: Disk size in GB
|
||||
- **`CORE_COUNT`**: Number of CPU cores
|
||||
- **`RAM_SIZE`**: RAM size in MB
|
||||
- **`var_os`**: Operating system type
|
||||
- **`var_version`**: OS version
|
||||
- **`DISABLEIP6`**: IPv6 disable setting
|
||||
- **`NSAPP`**: Namespace application name
|
||||
- **`METHOD`**: Installation method
|
||||
- **`DIAGNOSTICS`**: Enable/disable diagnostic reporting
|
||||
- **`RANDOM_UUID`**: Unique identifier for tracking
|
||||
|
||||
#### Function Parameters
|
||||
- **Exit codes**: Passed to `get_error_description()` and `post_update_to_api()`
|
||||
- **Status information**: Passed to `post_update_to_api()`
|
||||
- **API endpoints**: Hardcoded in functions
|
||||
|
||||
#### System Information
|
||||
- **PVE version**: Retrieved from `pveversion` command
|
||||
- **Disk size processing**: Processed for VM API (removes 'G' suffix)
|
||||
- **Error codes**: Retrieved from command exit codes
|
||||
|
||||
### Processing Data
|
||||
|
||||
#### API Request Preparation
|
||||
- **JSON payload creation**: Format data for API consumption
|
||||
- **Data validation**: Ensure required fields are present
|
||||
- **Error handling**: Handle missing or invalid data
|
||||
- **Content type setting**: Set appropriate HTTP headers
|
||||
|
||||
#### Error Processing
|
||||
- **Error code mapping**: Map numeric codes to descriptions
|
||||
- **Error message formatting**: Format error descriptions
|
||||
- **Unknown error handling**: Handle unrecognized error codes
|
||||
- **Fallback messages**: Provide default error messages
|
||||
|
||||
#### API Communication
|
||||
- **HTTP request preparation**: Prepare curl commands
|
||||
- **Response handling**: Capture HTTP response codes
|
||||
- **Error handling**: Handle network and API errors
|
||||
- **Duplicate prevention**: Prevent duplicate status updates
|
||||
|
||||
### Output Data
|
||||
|
||||
#### API Communication
|
||||
- **HTTP requests**: Sent to community-scripts.org API
|
||||
- **Response codes**: Captured from API responses
|
||||
- **Error information**: Reported to API
|
||||
- **Status updates**: Sent to API
|
||||
|
||||
#### Error Information
|
||||
- **Error descriptions**: Human-readable error messages
|
||||
- **Error codes**: Mapped to descriptions
|
||||
- **Context information**: Error context and details
|
||||
- **Fallback messages**: Default error messages
|
||||
|
||||
#### System State
|
||||
- **POST_UPDATE_DONE**: Prevents duplicate updates
|
||||
- **RESPONSE**: Stores API response
|
||||
- **JSON_PAYLOAD**: Stores formatted API data
|
||||
- **API_URL**: Stores API endpoint
|
||||
|
||||
## API Surface
|
||||
|
||||
### Public Functions
|
||||
|
||||
#### Error Description
|
||||
- **`get_error_description()`**: Convert exit codes to explanations
|
||||
- **Parameters**: Exit code to explain
|
||||
- **Returns**: Human-readable explanation string
|
||||
- **Usage**: Called by other functions and scripts
|
||||
|
||||
#### API Communication
|
||||
- **`post_to_api()`**: Send LXC installation data
|
||||
- **`post_to_api_vm()`**: Send VM installation data
|
||||
- **`post_update_to_api()`**: Send status updates
|
||||
- **Parameters**: Status and exit code (for updates)
|
||||
- **Returns**: None
|
||||
- **Usage**: Called by installation scripts
|
||||
|
||||
### Internal Functions
|
||||
|
||||
#### None
|
||||
- All functions in api.func are public
|
||||
- No internal helper functions
|
||||
- Direct implementation of all functionality
|
||||
|
||||
### Global Variables
|
||||
|
||||
#### Configuration Variables
|
||||
- **`DIAGNOSTICS`**: Diagnostic reporting setting
|
||||
- **`RANDOM_UUID`**: Unique tracking identifier
|
||||
- **`POST_UPDATE_DONE`**: Duplicate update prevention
|
||||
|
||||
#### Data Variables
|
||||
- **`CT_TYPE`**: Container type
|
||||
- **`DISK_SIZE`**: Disk size
|
||||
- **`CORE_COUNT`**: CPU core count
|
||||
- **`RAM_SIZE`**: RAM size
|
||||
- **`var_os`**: Operating system
|
||||
- **`var_version`**: OS version
|
||||
- **`DISABLEIP6`**: IPv6 setting
|
||||
- **`NSAPP`**: Application namespace
|
||||
- **`METHOD`**: Installation method
|
||||
|
||||
#### Internal Variables
|
||||
- **`API_URL`**: API endpoint URL
|
||||
- **`JSON_PAYLOAD`**: API request payload
|
||||
- **`RESPONSE`**: API response
|
||||
- **`DISK_SIZE_API`**: Processed disk size for VM API
|
||||
|
||||
## Integration Patterns
|
||||
|
||||
### Standard Integration Pattern
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Standard integration pattern
|
||||
|
||||
# 1. Source core.func first
|
||||
source core.func
|
||||
|
||||
# 2. Source api.func
|
||||
source api.func
|
||||
|
||||
# 3. Set up API reporting
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
|
||||
# 4. Set application parameters
|
||||
export NSAPP="$APP"
|
||||
export METHOD="install"
|
||||
|
||||
# 5. Report installation start
|
||||
post_to_api
|
||||
|
||||
# 6. Perform installation
|
||||
# ... installation logic ...
|
||||
|
||||
# 7. Report completion
|
||||
post_update_to_api "success" 0
|
||||
```
|
||||
|
||||
### Minimal Integration Pattern
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Minimal integration pattern
|
||||
|
||||
source api.func
|
||||
|
||||
# Basic error reporting
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
|
||||
# Report failure
|
||||
post_update_to_api "failed" 127
|
||||
```
|
||||
|
||||
### Advanced Integration Pattern
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Advanced integration pattern
|
||||
|
||||
source core.func
|
||||
source api.func
|
||||
source error_handler.func
|
||||
|
||||
# Set up comprehensive API reporting
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
export CT_TYPE=1
|
||||
export DISK_SIZE=8
|
||||
export CORE_COUNT=2
|
||||
export RAM_SIZE=2048
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export METHOD="install"
|
||||
|
||||
# Enhanced error handling with API reporting
|
||||
enhanced_error_handler() {
|
||||
local exit_code=${1:-$?}
|
||||
local command=${2:-${BASH_COMMAND:-unknown}}
|
||||
|
||||
local error_msg=$(get_error_description $exit_code)
|
||||
echo "Error $exit_code: $error_msg"
|
||||
|
||||
post_update_to_api "failed" $exit_code
|
||||
error_handler $exit_code $command
|
||||
}
|
||||
|
||||
trap 'enhanced_error_handler' ERR
|
||||
|
||||
# Advanced operations with API reporting
|
||||
post_to_api
|
||||
# ... operations ...
|
||||
post_update_to_api "success" 0
|
||||
```
|
||||
|
||||
## Error Handling Integration
|
||||
|
||||
### Automatic Error Reporting
|
||||
- **Error Descriptions**: Provides human-readable error messages
|
||||
- **API Integration**: Reports errors to community-scripts.org API
|
||||
- **Error Tracking**: Tracks error patterns for project improvement
|
||||
- **Diagnostic Data**: Contributes to anonymous usage analytics
|
||||
|
||||
### Manual Error Reporting
|
||||
- **Custom Error Codes**: Use appropriate error codes for different scenarios
|
||||
- **Error Context**: Provide context information for errors
|
||||
- **Status Updates**: Report both success and failure cases
|
||||
- **Error Analysis**: Analyze error patterns and trends
|
||||
|
||||
### API Communication Errors
|
||||
- **Network Failures**: Handle API communication failures gracefully
|
||||
- **Missing Prerequisites**: Check prerequisites before API calls
|
||||
- **Duplicate Prevention**: Prevent duplicate status updates
|
||||
- **Error Recovery**: Handle API errors without blocking installation
|
||||
|
||||
## Performance Considerations
|
||||
|
||||
### API Communication Overhead
|
||||
- **Minimal Impact**: API calls add minimal overhead
|
||||
- **Asynchronous**: API calls don't block installation process
|
||||
- **Error Handling**: API failures don't affect installation
|
||||
- **Optional**: API reporting is optional and can be disabled
|
||||
|
||||
### Memory Usage
|
||||
- **Minimal Footprint**: API functions use minimal memory
|
||||
- **Variable Reuse**: Global variables reused across functions
|
||||
- **No Memory Leaks**: Proper cleanup prevents memory leaks
|
||||
- **Efficient Processing**: Efficient JSON payload creation
|
||||
|
||||
### Execution Speed
|
||||
- **Fast API Calls**: Quick API communication
|
||||
- **Efficient Error Processing**: Fast error code processing
|
||||
- **Minimal Delay**: Minimal delay in API operations
|
||||
- **Non-blocking**: API calls don't block installation
|
||||
|
||||
## Security Considerations
|
||||
|
||||
### Data Privacy
|
||||
- **Anonymous Reporting**: Only anonymous data is sent
|
||||
- **No Sensitive Data**: No sensitive information is transmitted
|
||||
- **User Control**: Users can disable diagnostic reporting
|
||||
- **Data Minimization**: Only necessary data is sent
|
||||
|
||||
### API Security
|
||||
- **HTTPS**: API communication uses secure protocols
|
||||
- **Data Validation**: API data is validated before sending
|
||||
- **Error Handling**: API errors are handled securely
|
||||
- **No Credentials**: No authentication credentials are sent
|
||||
|
||||
### Network Security
|
||||
- **Secure Communication**: Uses secure HTTP protocols
|
||||
- **Error Handling**: Network errors are handled gracefully
|
||||
- **No Data Leakage**: No sensitive data is leaked
|
||||
- **Secure Endpoints**: Uses trusted API endpoints
|
||||
|
||||
## Future Integration Considerations
|
||||
|
||||
### Extensibility
|
||||
- **New API Endpoints**: Easy to add new API endpoints
|
||||
- **Additional Data**: Easy to add new data fields
|
||||
- **Error Codes**: Easy to add new error code descriptions
|
||||
- **API Versions**: Easy to support new API versions
|
||||
|
||||
### Compatibility
|
||||
- **API Versioning**: Compatible with different API versions
|
||||
- **Data Format**: Compatible with different data formats
|
||||
- **Error Codes**: Compatible with different error code systems
|
||||
- **Network Protocols**: Compatible with different network protocols
|
||||
|
||||
### Performance
|
||||
- **Optimization**: API communication can be optimized
|
||||
- **Caching**: API responses can be cached
|
||||
- **Batch Operations**: Multiple operations can be batched
|
||||
- **Async Processing**: API calls can be made asynchronous
|
||||
794
docs/misc/api.func/API_USAGE_EXAMPLES.md
Normal file
794
docs/misc/api.func/API_USAGE_EXAMPLES.md
Normal file
@ -0,0 +1,794 @@
|
||||
# api.func Usage Examples
|
||||
|
||||
## Overview
|
||||
|
||||
This document provides practical usage examples for `api.func` functions, covering common scenarios, integration patterns, and best practices.
|
||||
|
||||
## Basic API Setup
|
||||
|
||||
### Standard API Initialization
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Standard API setup for LXC containers
|
||||
|
||||
source api.func
|
||||
|
||||
# Set up diagnostic reporting
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
|
||||
# Set container parameters
|
||||
export CT_TYPE=1
|
||||
export DISK_SIZE=8
|
||||
export CORE_COUNT=2
|
||||
export RAM_SIZE=2048
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export NSAPP="plex"
|
||||
export METHOD="install"
|
||||
|
||||
# Report installation start
|
||||
post_to_api
|
||||
|
||||
# Your installation code here
|
||||
# ... installation logic ...
|
||||
|
||||
# Report completion
|
||||
if [[ $? -eq 0 ]]; then
|
||||
post_update_to_api "success" 0
|
||||
else
|
||||
post_update_to_api "failed" $?
|
||||
fi
|
||||
```
|
||||
|
||||
### VM API Setup
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# API setup for VMs
|
||||
|
||||
source api.func
|
||||
|
||||
# Create diagnostics file for VM
|
||||
mkdir -p /usr/local/community-scripts
|
||||
echo "DIAGNOSTICS=yes" > /usr/local/community-scripts/diagnostics
|
||||
|
||||
# Set up VM parameters
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
export DISK_SIZE="20G"
|
||||
export CORE_COUNT=4
|
||||
export RAM_SIZE=4096
|
||||
export var_os="ubuntu"
|
||||
export var_version="22.04"
|
||||
export NSAPP="nextcloud"
|
||||
export METHOD="install"
|
||||
|
||||
# Report VM installation start
|
||||
post_to_api_vm
|
||||
|
||||
# Your VM installation code here
|
||||
# ... VM creation logic ...
|
||||
|
||||
# Report completion
|
||||
post_update_to_api "success" 0
|
||||
```
|
||||
|
||||
## Error Description Examples
|
||||
|
||||
### Basic Error Explanation
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source api.func
|
||||
|
||||
# Explain common error codes
|
||||
echo "Error 0: '$(get_error_description 0)'"
|
||||
echo "Error 1: $(get_error_description 1)"
|
||||
echo "Error 127: $(get_error_description 127)"
|
||||
echo "Error 200: $(get_error_description 200)"
|
||||
echo "Error 255: $(get_error_description 255)"
|
||||
```
|
||||
|
||||
### Error Code Testing
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source api.func
|
||||
|
||||
# Test all error codes
|
||||
test_error_codes() {
|
||||
local codes=(0 1 2 127 128 130 137 139 143 200 203 205 255)
|
||||
|
||||
for code in "${codes[@]}"; do
|
||||
echo "Code $code: $(get_error_description $code)"
|
||||
done
|
||||
}
|
||||
|
||||
test_error_codes
|
||||
```
|
||||
|
||||
### Error Handling with Descriptions
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source api.func
|
||||
|
||||
# Function with error handling
|
||||
run_command_with_error_handling() {
|
||||
local command="$1"
|
||||
local description="$2"
|
||||
|
||||
echo "Running: $description"
|
||||
|
||||
if $command; then
|
||||
echo "Success: $description"
|
||||
return 0
|
||||
else
|
||||
local exit_code=$?
|
||||
local error_msg=$(get_error_description $exit_code)
|
||||
echo "Error $exit_code: $error_msg"
|
||||
return $exit_code
|
||||
fi
|
||||
}
|
||||
|
||||
# Usage
|
||||
run_command_with_error_handling "apt-get update" "Package list update"
|
||||
run_command_with_error_handling "nonexistent_command" "Test command"
|
||||
```
|
||||
|
||||
## API Communication Examples
|
||||
|
||||
### LXC Installation Reporting
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source api.func
|
||||
|
||||
# Complete LXC installation with API reporting
|
||||
install_lxc_with_reporting() {
|
||||
local app="$1"
|
||||
local ctid="$2"
|
||||
|
||||
# Set up API reporting
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
export CT_TYPE=1
|
||||
export DISK_SIZE=10
|
||||
export CORE_COUNT=2
|
||||
export RAM_SIZE=2048
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export NSAPP="$app"
|
||||
export METHOD="install"
|
||||
|
||||
# Report installation start
|
||||
post_to_api
|
||||
|
||||
# Installation process
|
||||
echo "Installing $app container (ID: $ctid)..."
|
||||
|
||||
# Simulate installation
|
||||
sleep 2
|
||||
|
||||
# Check if installation succeeded
|
||||
if [[ $? -eq 0 ]]; then
|
||||
echo "Installation completed successfully"
|
||||
post_update_to_api "success" 0
|
||||
return 0
|
||||
else
|
||||
echo "Installation failed"
|
||||
post_update_to_api "failed" $?
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Install multiple containers
|
||||
install_lxc_with_reporting "plex" "100"
|
||||
install_lxc_with_reporting "nextcloud" "101"
|
||||
install_lxc_with_reporting "nginx" "102"
|
||||
```
|
||||
|
||||
### VM Installation Reporting
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source api.func
|
||||
|
||||
# Complete VM installation with API reporting
|
||||
install_vm_with_reporting() {
|
||||
local app="$1"
|
||||
local vmid="$2"
|
||||
|
||||
# Create diagnostics file
|
||||
mkdir -p /usr/local/community-scripts
|
||||
echo "DIAGNOSTICS=yes" > /usr/local/community-scripts/diagnostics
|
||||
|
||||
# Set up API reporting
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
export DISK_SIZE="20G"
|
||||
export CORE_COUNT=4
|
||||
export RAM_SIZE=4096
|
||||
export var_os="ubuntu"
|
||||
export var_version="22.04"
|
||||
export NSAPP="$app"
|
||||
export METHOD="install"
|
||||
|
||||
# Report VM installation start
|
||||
post_to_api_vm
|
||||
|
||||
# VM installation process
|
||||
echo "Installing $app VM (ID: $vmid)..."
|
||||
|
||||
# Simulate VM creation
|
||||
sleep 3
|
||||
|
||||
# Check if VM creation succeeded
|
||||
if [[ $? -eq 0 ]]; then
|
||||
echo "VM installation completed successfully"
|
||||
post_update_to_api "success" 0
|
||||
return 0
|
||||
else
|
||||
echo "VM installation failed"
|
||||
post_update_to_api "failed" $?
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Install multiple VMs
|
||||
install_vm_with_reporting "nextcloud" "200"
|
||||
install_vm_with_reporting "wordpress" "201"
|
||||
```
|
||||
|
||||
## Status Update Examples
|
||||
|
||||
### Success Reporting
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source api.func
|
||||
|
||||
# Report successful installation
|
||||
report_success() {
|
||||
local operation="$1"
|
||||
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
|
||||
echo "Reporting successful $operation"
|
||||
post_update_to_api "success" 0
|
||||
}
|
||||
|
||||
# Usage
|
||||
report_success "container installation"
|
||||
report_success "package installation"
|
||||
report_success "service configuration"
|
||||
```
|
||||
|
||||
### Failure Reporting
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source api.func
|
||||
|
||||
# Report failed installation
|
||||
report_failure() {
|
||||
local operation="$1"
|
||||
local exit_code="$2"
|
||||
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
|
||||
local error_msg=$(get_error_description $exit_code)
|
||||
echo "Reporting failed $operation: $error_msg"
|
||||
post_update_to_api "failed" $exit_code
|
||||
}
|
||||
|
||||
# Usage
|
||||
report_failure "container creation" 200
|
||||
report_failure "package installation" 127
|
||||
report_failure "service start" 1
|
||||
```
|
||||
|
||||
### Conditional Status Reporting
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source api.func
|
||||
|
||||
# Conditional status reporting
|
||||
report_installation_status() {
|
||||
local operation="$1"
|
||||
local exit_code="$2"
|
||||
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
|
||||
if [[ $exit_code -eq 0 ]]; then
|
||||
echo "Reporting successful $operation"
|
||||
post_update_to_api "success" 0
|
||||
else
|
||||
local error_msg=$(get_error_description $exit_code)
|
||||
echo "Reporting failed $operation: $error_msg"
|
||||
post_update_to_api "failed" $exit_code
|
||||
fi
|
||||
}
|
||||
|
||||
# Usage
|
||||
report_installation_status "container creation" 0
|
||||
report_installation_status "package installation" 127
|
||||
```
|
||||
|
||||
## Advanced Usage Examples
|
||||
|
||||
### Batch Installation with API Reporting
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source api.func
|
||||
|
||||
# Batch installation with comprehensive API reporting
|
||||
batch_install_with_reporting() {
|
||||
local apps=("plex" "nextcloud" "nginx" "mysql")
|
||||
local ctids=(100 101 102 103)
|
||||
|
||||
# Set up API reporting
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
export CT_TYPE=1
|
||||
export DISK_SIZE=8
|
||||
export CORE_COUNT=2
|
||||
export RAM_SIZE=2048
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export METHOD="install"
|
||||
|
||||
local success_count=0
|
||||
local failure_count=0
|
||||
|
||||
for i in "${!apps[@]}"; do
|
||||
local app="${apps[$i]}"
|
||||
local ctid="${ctids[$i]}"
|
||||
|
||||
echo "Installing $app (ID: $ctid)..."
|
||||
|
||||
# Set app-specific parameters
|
||||
export NSAPP="$app"
|
||||
|
||||
# Report installation start
|
||||
post_to_api
|
||||
|
||||
# Simulate installation
|
||||
if install_app "$app" "$ctid"; then
|
||||
echo "$app installed successfully"
|
||||
post_update_to_api "success" 0
|
||||
((success_count++))
|
||||
else
|
||||
echo "$app installation failed"
|
||||
post_update_to_api "failed" $?
|
||||
((failure_count++))
|
||||
fi
|
||||
|
||||
echo "---"
|
||||
done
|
||||
|
||||
echo "Batch installation completed: $success_count successful, $failure_count failed"
|
||||
}
|
||||
|
||||
# Mock installation function
|
||||
install_app() {
|
||||
local app="$1"
|
||||
local ctid="$2"
|
||||
|
||||
# Simulate installation
|
||||
sleep 1
|
||||
|
||||
# Simulate occasional failures
|
||||
if [[ $((RANDOM % 10)) -eq 0 ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
batch_install_with_reporting
|
||||
```
|
||||
|
||||
### Error Analysis and Reporting
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source api.func
|
||||
|
||||
# Analyze and report errors
|
||||
analyze_and_report_errors() {
|
||||
local log_file="$1"
|
||||
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
|
||||
if [[ ! -f "$log_file" ]]; then
|
||||
echo "Log file not found: $log_file"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Extract error codes from log
|
||||
local error_codes=$(grep -o 'exit code [0-9]\+' "$log_file" | grep -o '[0-9]\+' | sort -u)
|
||||
|
||||
if [[ -z "$error_codes" ]]; then
|
||||
echo "No errors found in log"
|
||||
post_update_to_api "success" 0
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "Found error codes: $error_codes"
|
||||
|
||||
# Report each unique error
|
||||
for code in $error_codes; do
|
||||
local error_msg=$(get_error_description $code)
|
||||
echo "Error $code: $error_msg"
|
||||
post_update_to_api "failed" $code
|
||||
done
|
||||
}
|
||||
|
||||
# Usage
|
||||
analyze_and_report_errors "/var/log/installation.log"
|
||||
```
|
||||
|
||||
### API Health Check
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source api.func
|
||||
|
||||
# Check API connectivity and functionality
|
||||
check_api_health() {
|
||||
echo "Checking API health..."
|
||||
|
||||
# Test prerequisites
|
||||
if ! command -v curl >/dev/null 2>&1; then
|
||||
echo "ERROR: curl not available"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Test error description function
|
||||
local test_error=$(get_error_description 127)
|
||||
if [[ -z "$test_error" ]]; then
|
||||
echo "ERROR: Error description function not working"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "Error description test: $test_error"
|
||||
|
||||
# Test API connectivity (without sending data)
|
||||
local api_url="http://api.community-scripts.org/dev/upload"
|
||||
if curl -s --head "$api_url" >/dev/null 2>&1; then
|
||||
echo "API endpoint is reachable"
|
||||
else
|
||||
echo "WARNING: API endpoint not reachable"
|
||||
fi
|
||||
|
||||
echo "API health check completed"
|
||||
}
|
||||
|
||||
check_api_health
|
||||
```
|
||||
|
||||
## Integration Examples
|
||||
|
||||
### With build.func
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Integration with build.func
|
||||
|
||||
source core.func
|
||||
source api.func
|
||||
source build.func
|
||||
|
||||
# Set up API reporting
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
|
||||
# Container creation with API reporting
|
||||
create_container_with_reporting() {
|
||||
local app="$1"
|
||||
local ctid="$2"
|
||||
|
||||
# Set container parameters
|
||||
export APP="$app"
|
||||
export CTID="$ctid"
|
||||
export var_hostname="${app}-server"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="2"
|
||||
export var_ram="2048"
|
||||
export var_disk="10"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.$ctid"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
|
||||
# Report installation start
|
||||
post_to_api
|
||||
|
||||
# Create container using build.func
|
||||
if source build.func; then
|
||||
echo "Container $app created successfully"
|
||||
post_update_to_api "success" 0
|
||||
return 0
|
||||
else
|
||||
echo "Container $app creation failed"
|
||||
post_update_to_api "failed" $?
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Create containers
|
||||
create_container_with_reporting "plex" "100"
|
||||
create_container_with_reporting "nextcloud" "101"
|
||||
```
|
||||
|
||||
### With vm-core.func
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Integration with vm-core.func
|
||||
|
||||
source core.func
|
||||
source api.func
|
||||
source vm-core.func
|
||||
|
||||
# Set up VM API reporting
|
||||
mkdir -p /usr/local/community-scripts
|
||||
echo "DIAGNOSTICS=yes" > /usr/local/community-scripts/diagnostics
|
||||
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
|
||||
# VM creation with API reporting
|
||||
create_vm_with_reporting() {
|
||||
local app="$1"
|
||||
local vmid="$2"
|
||||
|
||||
# Set VM parameters
|
||||
export APP="$app"
|
||||
export VMID="$vmid"
|
||||
export var_hostname="${app}-vm"
|
||||
export var_os="ubuntu"
|
||||
export var_version="22.04"
|
||||
export var_cpu="4"
|
||||
export var_ram="4096"
|
||||
export var_disk="20"
|
||||
|
||||
# Report VM installation start
|
||||
post_to_api_vm
|
||||
|
||||
# Create VM using vm-core.func
|
||||
if source vm-core.func; then
|
||||
echo "VM $app created successfully"
|
||||
post_update_to_api "success" 0
|
||||
return 0
|
||||
else
|
||||
echo "VM $app creation failed"
|
||||
post_update_to_api "failed" $?
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Create VMs
|
||||
create_vm_with_reporting "nextcloud" "200"
|
||||
create_vm_with_reporting "wordpress" "201"
|
||||
```
|
||||
|
||||
### With error_handler.func
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Integration with error_handler.func
|
||||
|
||||
source core.func
|
||||
source error_handler.func
|
||||
source api.func
|
||||
|
||||
# Enhanced error handling with API reporting
|
||||
enhanced_error_handler() {
|
||||
local exit_code=${1:-$?}
|
||||
local command=${2:-${BASH_COMMAND:-unknown}}
|
||||
|
||||
# Get error description from api.func
|
||||
local error_msg=$(get_error_description $exit_code)
|
||||
|
||||
# Display error information
|
||||
echo "Error $exit_code: $error_msg"
|
||||
echo "Command: $command"
|
||||
|
||||
# Report error to API
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
post_update_to_api "failed" $exit_code
|
||||
|
||||
# Use standard error handler
|
||||
error_handler $exit_code $command
|
||||
}
|
||||
|
||||
# Set up enhanced error handling
|
||||
trap 'enhanced_error_handler' ERR
|
||||
|
||||
# Test enhanced error handling
|
||||
nonexistent_command
|
||||
```
|
||||
|
||||
## Best Practices Examples
|
||||
|
||||
### Comprehensive API Integration
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Comprehensive API integration example
|
||||
|
||||
source core.func
|
||||
source api.func
|
||||
|
||||
# Set up comprehensive API reporting
|
||||
setup_api_reporting() {
|
||||
# Enable diagnostics
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
|
||||
# Set common parameters
|
||||
export CT_TYPE=1
|
||||
export DISK_SIZE=8
|
||||
export CORE_COUNT=2
|
||||
export RAM_SIZE=2048
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export METHOD="install"
|
||||
|
||||
echo "API reporting configured"
|
||||
}
|
||||
|
||||
# Installation with comprehensive reporting
|
||||
install_with_comprehensive_reporting() {
|
||||
local app="$1"
|
||||
local ctid="$2"
|
||||
|
||||
# Set up API reporting
|
||||
setup_api_reporting
|
||||
export NSAPP="$app"
|
||||
|
||||
# Report installation start
|
||||
post_to_api
|
||||
|
||||
# Installation process
|
||||
echo "Installing $app..."
|
||||
|
||||
# Simulate installation steps
|
||||
local steps=("Downloading" "Installing" "Configuring" "Starting")
|
||||
for step in "${steps[@]}"; do
|
||||
echo "$step $app..."
|
||||
sleep 1
|
||||
done
|
||||
|
||||
# Check installation result
|
||||
if [[ $? -eq 0 ]]; then
|
||||
echo "$app installation completed successfully"
|
||||
post_update_to_api "success" 0
|
||||
return 0
|
||||
else
|
||||
echo "$app installation failed"
|
||||
post_update_to_api "failed" $?
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Install multiple applications
|
||||
apps=("plex" "nextcloud" "nginx" "mysql")
|
||||
ctids=(100 101 102 103)
|
||||
|
||||
for i in "${!apps[@]}"; do
|
||||
install_with_comprehensive_reporting "${apps[$i]}" "${ctids[$i]}"
|
||||
echo "---"
|
||||
done
|
||||
```
|
||||
|
||||
### Error Recovery with API Reporting
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source api.func
|
||||
|
||||
# Error recovery with API reporting
|
||||
retry_with_api_reporting() {
|
||||
local operation="$1"
|
||||
local max_attempts=3
|
||||
local attempt=1
|
||||
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
|
||||
while [[ $attempt -le $max_attempts ]]; do
|
||||
echo "Attempt $attempt of $max_attempts: $operation"
|
||||
|
||||
if $operation; then
|
||||
echo "Operation succeeded on attempt $attempt"
|
||||
post_update_to_api "success" 0
|
||||
return 0
|
||||
else
|
||||
local exit_code=$?
|
||||
local error_msg=$(get_error_description $exit_code)
|
||||
echo "Attempt $attempt failed: $error_msg"
|
||||
|
||||
post_update_to_api "failed" $exit_code
|
||||
|
||||
((attempt++))
|
||||
|
||||
if [[ $attempt -le $max_attempts ]]; then
|
||||
echo "Retrying in 5 seconds..."
|
||||
sleep 5
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
echo "Operation failed after $max_attempts attempts"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Usage
|
||||
retry_with_api_reporting "apt-get update"
|
||||
retry_with_api_reporting "apt-get install -y package"
|
||||
```
|
||||
|
||||
### API Reporting with Logging
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source api.func
|
||||
|
||||
# API reporting with detailed logging
|
||||
install_with_logging_and_api() {
|
||||
local app="$1"
|
||||
local log_file="/var/log/${app}_installation.log"
|
||||
|
||||
# Set up API reporting
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
export NSAPP="$app"
|
||||
|
||||
# Start logging
|
||||
exec > >(tee -a "$log_file")
|
||||
exec 2>&1
|
||||
|
||||
echo "Starting $app installation at $(date)"
|
||||
|
||||
# Report installation start
|
||||
post_to_api
|
||||
|
||||
# Installation process
|
||||
echo "Installing $app..."
|
||||
|
||||
# Simulate installation
|
||||
if install_app "$app"; then
|
||||
echo "$app installation completed successfully at $(date)"
|
||||
post_update_to_api "success" 0
|
||||
return 0
|
||||
else
|
||||
local exit_code=$?
|
||||
local error_msg=$(get_error_description $exit_code)
|
||||
echo "$app installation failed at $(date): $error_msg"
|
||||
post_update_to_api "failed" $exit_code
|
||||
return $exit_code
|
||||
fi
|
||||
}
|
||||
|
||||
# Mock installation function
|
||||
install_app() {
|
||||
local app="$1"
|
||||
echo "Installing $app..."
|
||||
sleep 2
|
||||
return 0
|
||||
}
|
||||
|
||||
# Install with logging and API reporting
|
||||
install_with_logging_and_api "plex"
|
||||
```
|
||||
199
docs/misc/api.func/README.md
Normal file
199
docs/misc/api.func/README.md
Normal file
@ -0,0 +1,199 @@
|
||||
# api.func Documentation
|
||||
|
||||
## Overview
|
||||
|
||||
The `api.func` file provides Proxmox API integration and diagnostic reporting functionality for the Community Scripts project. It handles API communication, error reporting, and status updates to the community-scripts.org API.
|
||||
|
||||
## Purpose and Use Cases
|
||||
|
||||
- **API Communication**: Send installation and status data to community-scripts.org API
|
||||
- **Diagnostic Reporting**: Report installation progress and errors for analytics
|
||||
- **Error Description**: Provide detailed error code explanations
|
||||
- **Status Updates**: Track installation success/failure status
|
||||
- **Analytics**: Contribute anonymous usage data for project improvement
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Key Function Groups
|
||||
- **Error Handling**: `get_error_description()` - Convert exit codes to human-readable messages
|
||||
- **API Communication**: `post_to_api()`, `post_to_api_vm()` - Send installation data
|
||||
- **Status Updates**: `post_update_to_api()` - Report installation completion status
|
||||
|
||||
### Dependencies
|
||||
- **External**: `curl` command for HTTP requests
|
||||
- **Internal**: Uses environment variables from other scripts
|
||||
|
||||
### Integration Points
|
||||
- Used by: All installation scripts for diagnostic reporting
|
||||
- Uses: Environment variables from build.func and other scripts
|
||||
- Provides: API communication and error reporting services
|
||||
|
||||
## Documentation Files
|
||||
|
||||
### 📊 [API_FLOWCHART.md](./API_FLOWCHART.md)
|
||||
Visual execution flows showing API communication processes and error handling.
|
||||
|
||||
### 📚 [API_FUNCTIONS_REFERENCE.md](./API_FUNCTIONS_REFERENCE.md)
|
||||
Complete alphabetical reference of all functions with parameters, dependencies, and usage details.
|
||||
|
||||
### 💡 [API_USAGE_EXAMPLES.md](./API_USAGE_EXAMPLES.md)
|
||||
Practical examples showing how to use API functions and common patterns.
|
||||
|
||||
### 🔗 [API_INTEGRATION.md](./API_INTEGRATION.md)
|
||||
How api.func integrates with other components and provides API services.
|
||||
|
||||
## Key Features
|
||||
|
||||
### Error Code Descriptions
|
||||
- **Comprehensive Coverage**: 50+ error codes with detailed explanations
|
||||
- **LXC-Specific Errors**: Container creation and management errors
|
||||
- **System Errors**: General system and network errors
|
||||
- **Signal Errors**: Process termination and signal errors
|
||||
|
||||
### API Communication
|
||||
- **LXC Reporting**: Send LXC container installation data
|
||||
- **VM Reporting**: Send VM installation data
|
||||
- **Status Updates**: Report installation success/failure
|
||||
- **Diagnostic Data**: Anonymous usage analytics
|
||||
|
||||
### Diagnostic Integration
|
||||
- **Optional Reporting**: Only sends data when diagnostics enabled
|
||||
- **Privacy Respect**: Respects user privacy settings
|
||||
- **Error Tracking**: Tracks installation errors for improvement
|
||||
- **Usage Analytics**: Contributes to project statistics
|
||||
|
||||
## Common Usage Patterns
|
||||
|
||||
### Basic API Setup
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Basic API setup
|
||||
|
||||
source api.func
|
||||
|
||||
# Set up diagnostic reporting
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
|
||||
# Report installation start
|
||||
post_to_api
|
||||
```
|
||||
|
||||
### Error Reporting
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source api.func
|
||||
|
||||
# Get error description
|
||||
error_msg=$(get_error_description 127)
|
||||
echo "Error 127: $error_msg"
|
||||
# Output: Error 127: Command not found: Incorrect path or missing dependency.
|
||||
```
|
||||
|
||||
### Status Updates
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source api.func
|
||||
|
||||
# Report successful installation
|
||||
post_update_to_api "success" 0
|
||||
|
||||
# Report failed installation
|
||||
post_update_to_api "failed" 127
|
||||
```
|
||||
|
||||
## Environment Variables
|
||||
|
||||
### Required Variables
|
||||
- `DIAGNOSTICS`: Enable/disable diagnostic reporting ("yes"/"no")
|
||||
- `RANDOM_UUID`: Unique identifier for tracking
|
||||
|
||||
### Optional Variables
|
||||
- `CT_TYPE`: Container type (1 for LXC, 2 for VM)
|
||||
- `DISK_SIZE`: Disk size in GB
|
||||
- `CORE_COUNT`: Number of CPU cores
|
||||
- `RAM_SIZE`: RAM size in MB
|
||||
- `var_os`: Operating system type
|
||||
- `var_version`: OS version
|
||||
- `DISABLEIP6`: IPv6 disable setting
|
||||
- `NSAPP`: Namespace application name
|
||||
- `METHOD`: Installation method
|
||||
|
||||
### Internal Variables
|
||||
- `POST_UPDATE_DONE`: Prevents duplicate status updates
|
||||
- `API_URL`: Community scripts API endpoint
|
||||
- `JSON_PAYLOAD`: API request payload
|
||||
- `RESPONSE`: API response
|
||||
|
||||
## Error Code Categories
|
||||
|
||||
### General System Errors
|
||||
- **0-9**: Basic system errors
|
||||
- **18, 22, 28, 35**: Network and I/O errors
|
||||
- **56, 60**: TLS/SSL errors
|
||||
- **125-128**: Command execution errors
|
||||
- **129-143**: Signal errors
|
||||
- **152**: Resource limit errors
|
||||
- **255**: Unknown critical errors
|
||||
|
||||
### LXC-Specific Errors
|
||||
- **100-101**: LXC installation errors
|
||||
- **200-209**: LXC creation and management errors
|
||||
|
||||
### Docker Errors
|
||||
- **125**: Docker container start errors
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Diagnostic Reporting
|
||||
1. Always check if diagnostics are enabled
|
||||
2. Respect user privacy settings
|
||||
3. Use unique identifiers for tracking
|
||||
4. Report both success and failure cases
|
||||
|
||||
### Error Handling
|
||||
1. Use appropriate error codes
|
||||
2. Provide meaningful error descriptions
|
||||
3. Handle API communication failures gracefully
|
||||
4. Don't block installation on API failures
|
||||
|
||||
### API Usage
|
||||
1. Check for curl availability
|
||||
2. Handle network failures gracefully
|
||||
3. Use appropriate HTTP methods
|
||||
4. Include all required data
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
1. **API Communication Fails**: Check network connectivity and curl availability
|
||||
2. **Diagnostics Not Working**: Verify DIAGNOSTICS setting and RANDOM_UUID
|
||||
3. **Missing Error Descriptions**: Check error code coverage
|
||||
4. **Duplicate Updates**: POST_UPDATE_DONE prevents duplicates
|
||||
|
||||
### Debug Mode
|
||||
Enable diagnostic reporting for debugging:
|
||||
```bash
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="$(uuidgen)"
|
||||
```
|
||||
|
||||
### API Testing
|
||||
Test API communication:
|
||||
```bash
|
||||
source api.func
|
||||
export DIAGNOSTICS="yes"
|
||||
export RANDOM_UUID="test-$(date +%s)"
|
||||
post_to_api
|
||||
```
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- [core.func](../core.func/) - Core utilities and error handling
|
||||
- [error_handler.func](../error_handler.func/) - Error handling utilities
|
||||
- [build.func](../build.func/) - Container creation with API integration
|
||||
- [tools.func](../tools.func/) - Extended utilities with API integration
|
||||
|
||||
---
|
||||
|
||||
*This documentation covers the api.func file which provides API communication and diagnostic reporting for all Proxmox Community Scripts.*
|
||||
410
docs/misc/build.func/BUILD_FUNC_ARCHITECTURE.md
Normal file
410
docs/misc/build.func/BUILD_FUNC_ARCHITECTURE.md
Normal file
@ -0,0 +1,410 @@
|
||||
# build.func Architecture Guide
|
||||
|
||||
## Overview
|
||||
|
||||
This document provides a high-level architectural overview of `build.func`, including module dependencies, data flow, integration points, and system architecture.
|
||||
|
||||
## High-Level Architecture
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Proxmox Host System │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ build.func │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────────────┐ │ │
|
||||
│ │ │ Entry Point │ │ Configuration │ │ Container Creation │ │ │
|
||||
│ │ │ │ │ │ │ │ │ │
|
||||
│ │ │ • start() │ │ • variables() │ │ • build_container() │ │ │
|
||||
│ │ │ • install_ │ │ • base_ │ │ • create_lxc_container() │ │ │
|
||||
│ │ │ script() │ │ settings() │ │ • configure_gpu_ │ │ │
|
||||
│ │ │ • advanced_ │ │ • select_ │ │ passthrough() │ │ │
|
||||
│ │ │ settings() │ │ storage() │ │ • fix_gpu_gids() │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Module Dependencies │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────────────┐ │ │
|
||||
│ │ │ core.func │ │ error_handler. │ │ api.func │ │ │
|
||||
│ │ │ │ │ func │ │ │ │ │
|
||||
│ │ │ • Basic │ │ • Error │ │ • Proxmox API │ │ │
|
||||
│ │ │ utilities │ │ handling │ │ interactions │ │ │
|
||||
│ │ │ • Common │ │ • Error │ │ • Container │ │ │
|
||||
│ │ │ functions │ │ recovery │ │ management │ │ │
|
||||
│ │ │ • System │ │ • Cleanup │ │ • Status │ │ │
|
||||
│ │ │ utilities │ │ functions │ │ monitoring │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────────────┘ │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────────────────────────────────────────────────────────────┐ │ │
|
||||
│ │ │ tools.func │ │ │
|
||||
│ │ │ │ │ │
|
||||
│ │ │ • Additional utilities │ │ │
|
||||
│ │ │ • Helper functions │ │ │
|
||||
│ │ │ • System tools │ │ │
|
||||
│ │ └─────────────────────────────────────────────────────────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Module Dependencies
|
||||
|
||||
### Core Dependencies
|
||||
|
||||
```
|
||||
build.func Dependencies:
|
||||
├── core.func
|
||||
│ ├── Basic system utilities
|
||||
│ ├── Common functions
|
||||
│ ├── System information
|
||||
│ └── File operations
|
||||
├── error_handler.func
|
||||
│ ├── Error handling
|
||||
│ ├── Error recovery
|
||||
│ ├── Cleanup functions
|
||||
│ └── Error logging
|
||||
├── api.func
|
||||
│ ├── Proxmox API interactions
|
||||
│ ├── Container management
|
||||
│ ├── Status monitoring
|
||||
│ └── Configuration updates
|
||||
└── tools.func
|
||||
├── Additional utilities
|
||||
├── Helper functions
|
||||
├── System tools
|
||||
└── Custom functions
|
||||
```
|
||||
|
||||
### Dependency Flow
|
||||
|
||||
```
|
||||
Dependency Flow:
|
||||
├── build.func
|
||||
│ ├── Sources core.func
|
||||
│ ├── Sources error_handler.func
|
||||
│ ├── Sources api.func
|
||||
│ └── Sources tools.func
|
||||
├── core.func
|
||||
│ ├── Basic utilities
|
||||
│ └── System functions
|
||||
├── error_handler.func
|
||||
│ ├── Error management
|
||||
│ └── Recovery functions
|
||||
├── api.func
|
||||
│ ├── Proxmox integration
|
||||
│ └── Container operations
|
||||
└── tools.func
|
||||
├── Additional tools
|
||||
└── Helper functions
|
||||
```
|
||||
|
||||
## Data Flow Architecture
|
||||
|
||||
### Configuration Data Flow
|
||||
|
||||
```
|
||||
Configuration Data Flow:
|
||||
├── Environment Variables
|
||||
│ ├── Hard environment variables
|
||||
│ ├── App-specific .vars
|
||||
│ ├── Global default.vars
|
||||
│ └── Built-in defaults
|
||||
├── Variable Resolution
|
||||
│ ├── Apply precedence chain
|
||||
│ ├── Validate settings
|
||||
│ └── Resolve conflicts
|
||||
├── Configuration Storage
|
||||
│ ├── Memory variables
|
||||
│ ├── Temporary files
|
||||
│ └── Persistent storage
|
||||
└── Configuration Usage
|
||||
├── Container creation
|
||||
├── Feature configuration
|
||||
└── Settings persistence
|
||||
```
|
||||
|
||||
### Container Data Flow
|
||||
|
||||
```
|
||||
Container Data Flow:
|
||||
├── Input Data
|
||||
│ ├── Configuration variables
|
||||
│ ├── Resource specifications
|
||||
│ ├── Network settings
|
||||
│ └── Storage requirements
|
||||
├── Processing
|
||||
│ ├── Validation
|
||||
│ ├── Conflict resolution
|
||||
│ ├── Resource allocation
|
||||
│ └── Configuration generation
|
||||
├── Container Creation
|
||||
│ ├── LXC container creation
|
||||
│ ├── Network configuration
|
||||
│ ├── Storage setup
|
||||
│ └── Feature configuration
|
||||
└── Output
|
||||
├── Container status
|
||||
├── Access information
|
||||
├── Configuration files
|
||||
└── Log files
|
||||
```
|
||||
|
||||
## Integration Architecture
|
||||
|
||||
### With Proxmox System
|
||||
|
||||
```
|
||||
Proxmox Integration:
|
||||
├── Proxmox Host
|
||||
│ ├── LXC container management
|
||||
│ ├── Storage management
|
||||
│ ├── Network management
|
||||
│ └── Resource management
|
||||
├── Proxmox API
|
||||
│ ├── Container operations
|
||||
│ ├── Configuration updates
|
||||
│ ├── Status monitoring
|
||||
│ └── Error handling
|
||||
├── Proxmox Configuration
|
||||
│ ├── /etc/pve/lxc/<ctid>.conf
|
||||
│ ├── Storage configuration
|
||||
│ ├── Network configuration
|
||||
│ └── Resource configuration
|
||||
└── Proxmox Services
|
||||
├── Container services
|
||||
├── Network services
|
||||
├── Storage services
|
||||
└── Monitoring services
|
||||
```
|
||||
|
||||
### With Install Scripts
|
||||
|
||||
```
|
||||
Install Script Integration:
|
||||
├── build.func
|
||||
│ ├── Creates container
|
||||
│ ├── Configures basic settings
|
||||
│ ├── Starts container
|
||||
│ └── Provides access
|
||||
├── Install Scripts
|
||||
│ ├── <app>-install.sh
|
||||
│ ├── Downloads application
|
||||
│ ├── Configures application
|
||||
│ └── Sets up services
|
||||
├── Container
|
||||
│ ├── Running application
|
||||
│ ├── Configured services
|
||||
│ ├── Network access
|
||||
│ └── Storage access
|
||||
└── Integration Points
|
||||
├── Container creation
|
||||
├── Network configuration
|
||||
├── Storage setup
|
||||
└── Service configuration
|
||||
```
|
||||
|
||||
## System Architecture Components
|
||||
|
||||
### Core Components
|
||||
|
||||
```
|
||||
System Components:
|
||||
├── Entry Point
|
||||
│ ├── start() function
|
||||
│ ├── Context detection
|
||||
│ ├── Environment capture
|
||||
│ └── Workflow routing
|
||||
├── Configuration Management
|
||||
│ ├── Variable resolution
|
||||
│ ├── Settings persistence
|
||||
│ ├── Default management
|
||||
│ └── Validation
|
||||
├── Container Creation
|
||||
│ ├── LXC container creation
|
||||
│ ├── Network configuration
|
||||
│ ├── Storage setup
|
||||
│ └── Feature configuration
|
||||
├── Hardware Integration
|
||||
│ ├── GPU passthrough
|
||||
│ ├── USB passthrough
|
||||
│ ├── Storage management
|
||||
│ └── Network management
|
||||
└── Error Handling
|
||||
├── Error detection
|
||||
├── Error recovery
|
||||
├── Cleanup functions
|
||||
└── User notification
|
||||
```
|
||||
|
||||
### User Interface Components
|
||||
|
||||
```
|
||||
UI Components:
|
||||
├── Menu System
|
||||
│ ├── Installation mode selection
|
||||
│ ├── Configuration menus
|
||||
│ ├── Storage selection
|
||||
│ └── GPU configuration
|
||||
├── Interactive Elements
|
||||
│ ├── Whiptail menus
|
||||
│ ├── User prompts
|
||||
│ ├── Confirmation dialogs
|
||||
│ └── Error messages
|
||||
├── Non-Interactive Mode
|
||||
│ ├── Environment variable driven
|
||||
│ ├── Silent execution
|
||||
│ ├── Automated configuration
|
||||
│ └── Error handling
|
||||
└── Output
|
||||
├── Status messages
|
||||
├── Progress indicators
|
||||
├── Completion information
|
||||
└── Access details
|
||||
```
|
||||
|
||||
## Security Architecture
|
||||
|
||||
### Security Considerations
|
||||
|
||||
```
|
||||
Security Architecture:
|
||||
├── Container Security
|
||||
│ ├── Unprivileged containers (default)
|
||||
│ ├── Privileged containers (when needed)
|
||||
│ ├── Resource limits
|
||||
│ └── Access controls
|
||||
├── Network Security
|
||||
│ ├── Network isolation
|
||||
│ ├── VLAN support
|
||||
│ ├── Firewall integration
|
||||
│ └── Access controls
|
||||
├── Storage Security
|
||||
│ ├── Storage isolation
|
||||
│ ├── Access controls
|
||||
│ ├── Encryption support
|
||||
│ └── Backup integration
|
||||
├── GPU Security
|
||||
│ ├── Device isolation
|
||||
│ ├── Permission management
|
||||
│ ├── Access controls
|
||||
│ └── Security validation
|
||||
└── API Security
|
||||
├── Authentication
|
||||
├── Authorization
|
||||
├── Input validation
|
||||
└── Error handling
|
||||
```
|
||||
|
||||
## Performance Architecture
|
||||
|
||||
### Performance Considerations
|
||||
|
||||
```
|
||||
Performance Architecture:
|
||||
├── Execution Optimization
|
||||
│ ├── Parallel operations
|
||||
│ ├── Efficient algorithms
|
||||
│ ├── Minimal user interaction
|
||||
│ └── Optimized validation
|
||||
├── Resource Management
|
||||
│ ├── Memory efficiency
|
||||
│ ├── CPU optimization
|
||||
│ ├── Disk usage optimization
|
||||
│ └── Network efficiency
|
||||
├── Caching
|
||||
│ ├── Configuration caching
|
||||
│ ├── Template caching
|
||||
│ ├── Storage caching
|
||||
│ └── GPU detection caching
|
||||
└── Monitoring
|
||||
├── Performance monitoring
|
||||
├── Resource monitoring
|
||||
├── Error monitoring
|
||||
└── Status monitoring
|
||||
```
|
||||
|
||||
## Deployment Architecture
|
||||
|
||||
### Deployment Scenarios
|
||||
|
||||
```
|
||||
Deployment Scenarios:
|
||||
├── Single Container
|
||||
│ ├── Individual application
|
||||
│ ├── Standard configuration
|
||||
│ ├── Basic networking
|
||||
│ └── Standard storage
|
||||
├── Multiple Containers
|
||||
│ ├── Application stack
|
||||
│ ├── Shared networking
|
||||
│ ├── Shared storage
|
||||
│ └── Coordinated deployment
|
||||
├── High Availability
|
||||
│ ├── Redundant containers
|
||||
│ ├── Load balancing
|
||||
│ ├── Failover support
|
||||
│ └── Monitoring integration
|
||||
└── Development Environment
|
||||
├── Development containers
|
||||
├── Testing containers
|
||||
├── Staging containers
|
||||
└── Production containers
|
||||
```
|
||||
|
||||
## Maintenance Architecture
|
||||
|
||||
### Maintenance Components
|
||||
|
||||
```
|
||||
Maintenance Architecture:
|
||||
├── Updates
|
||||
│ ├── Container updates
|
||||
│ ├── Application updates
|
||||
│ ├── Configuration updates
|
||||
│ └── Security updates
|
||||
├── Monitoring
|
||||
│ ├── Container monitoring
|
||||
│ ├── Resource monitoring
|
||||
│ ├── Performance monitoring
|
||||
│ └── Error monitoring
|
||||
├── Backup
|
||||
│ ├── Configuration backup
|
||||
│ ├── Container backup
|
||||
│ ├── Storage backup
|
||||
│ └── Recovery procedures
|
||||
└── Troubleshooting
|
||||
├── Error diagnosis
|
||||
├── Log analysis
|
||||
├── Performance analysis
|
||||
└── Recovery procedures
|
||||
```
|
||||
|
||||
## Future Architecture Considerations
|
||||
|
||||
### Scalability
|
||||
|
||||
```
|
||||
Scalability Considerations:
|
||||
├── Horizontal Scaling
|
||||
│ ├── Multiple containers
|
||||
│ ├── Load balancing
|
||||
│ ├── Distributed deployment
|
||||
│ └── Resource distribution
|
||||
├── Vertical Scaling
|
||||
│ ├── Resource scaling
|
||||
│ ├── Performance optimization
|
||||
│ ├── Capacity planning
|
||||
│ └── Resource management
|
||||
├── Automation
|
||||
│ ├── Automated deployment
|
||||
│ ├── Automated scaling
|
||||
│ ├── Automated monitoring
|
||||
│ └── Automated recovery
|
||||
└── Integration
|
||||
├── External systems
|
||||
├── Cloud integration
|
||||
├── Container orchestration
|
||||
└── Service mesh
|
||||
```
|
||||
248
docs/misc/build.func/BUILD_FUNC_ENVIRONMENT_VARIABLES.md
Normal file
248
docs/misc/build.func/BUILD_FUNC_ENVIRONMENT_VARIABLES.md
Normal file
@ -0,0 +1,248 @@
|
||||
# build.func Environment Variables Reference
|
||||
|
||||
## Overview
|
||||
|
||||
This document provides a comprehensive reference of all environment variables used in `build.func`, organized by category and usage context.
|
||||
|
||||
## Variable Categories
|
||||
|
||||
### Core Container Variables
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `APP` | Application name (e.g., "plex", "nextcloud") | - | Environment | Throughout |
|
||||
| `NSAPP` | Namespace application name | `$APP` | Environment | Throughout |
|
||||
| `CTID` | Container ID | - | Environment | Container creation |
|
||||
| `CT_TYPE` | Container type ("install" or "update") | "install" | Environment | Entry point |
|
||||
| `CT_NAME` | Container name | `$APP` | Environment | Container creation |
|
||||
|
||||
### Operating System Variables
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `var_os` | Operating system selection | "debian" | base_settings() | OS selection |
|
||||
| `var_version` | OS version | "12" | base_settings() | Template selection |
|
||||
| `var_template` | Template name | Auto-generated | base_settings() | Template download |
|
||||
|
||||
### Resource Configuration Variables
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `var_cpu` | CPU cores | "2" | base_settings() | Container creation |
|
||||
| `var_ram` | RAM in MB | "2048" | base_settings() | Container creation |
|
||||
| `var_disk` | Disk size in GB | "8" | base_settings() | Container creation |
|
||||
| `DISK_SIZE` | Disk size (alternative) | `$var_disk` | Environment | Container creation |
|
||||
| `CORE_COUNT` | CPU cores (alternative) | `$var_cpu` | Environment | Container creation |
|
||||
| `RAM_SIZE` | RAM size (alternative) | `$var_ram` | Environment | Container creation |
|
||||
|
||||
### Network Configuration Variables
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `var_net` | Network interface | "vmbr0" | base_settings() | Network config |
|
||||
| `var_bridge` | Bridge interface | "vmbr0" | base_settings() | Network config |
|
||||
| `var_gateway` | Gateway IP | "192.168.1.1" | base_settings() | Network config |
|
||||
| `var_ip` | Container IP address | - | User input | Network config |
|
||||
| `var_ipv6` | IPv6 address | - | User input | Network config |
|
||||
| `var_vlan` | VLAN ID | - | User input | Network config |
|
||||
| `var_mtu` | MTU size | "1500" | base_settings() | Network config |
|
||||
| `var_mac` | MAC address | Auto-generated | base_settings() | Network config |
|
||||
| `NET` | Network interface (alternative) | `$var_net` | Environment | Network config |
|
||||
| `BRG` | Bridge interface (alternative) | `$var_bridge` | Environment | Network config |
|
||||
| `GATE` | Gateway IP (alternative) | `$var_gateway` | Environment | Network config |
|
||||
| `IPV6_METHOD` | IPv6 configuration method | "none" | Environment | Network config |
|
||||
| `VLAN` | VLAN ID (alternative) | `$var_vlan` | Environment | Network config |
|
||||
| `MTU` | MTU size (alternative) | `$var_mtu` | Environment | Network config |
|
||||
| `MAC` | MAC address (alternative) | `$var_mac` | Environment | Network config |
|
||||
|
||||
### Storage Configuration Variables
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `var_template_storage` | Storage for templates | - | select_storage() | Template storage |
|
||||
| `var_container_storage` | Storage for container disks | - | select_storage() | Container storage |
|
||||
| `TEMPLATE_STORAGE` | Template storage (alternative) | `$var_template_storage` | Environment | Template storage |
|
||||
| `CONTAINER_STORAGE` | Container storage (alternative) | `$var_container_storage` | Environment | Container storage |
|
||||
|
||||
### Feature Flags
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `ENABLE_FUSE` | Enable FUSE support | "true" | base_settings() | Container features |
|
||||
| `ENABLE_TUN` | Enable TUN/TAP support | "true" | base_settings() | Container features |
|
||||
| `ENABLE_KEYCTL` | Enable keyctl support | "true" | base_settings() | Container features |
|
||||
| `ENABLE_MOUNT` | Enable mount support | "true" | base_settings() | Container features |
|
||||
| `ENABLE_NESTING` | Enable nesting support | "false" | base_settings() | Container features |
|
||||
| `ENABLE_PRIVILEGED` | Enable privileged mode | "false" | base_settings() | Container features |
|
||||
| `ENABLE_UNPRIVILEGED` | Enable unprivileged mode | "true" | base_settings() | Container features |
|
||||
| `VERBOSE` | Enable verbose output | "false" | Environment | Logging |
|
||||
| `SSH` | Enable SSH key provisioning | "true" | base_settings() | SSH setup |
|
||||
|
||||
### GPU Passthrough Variables
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `GPU_APPS` | List of apps that support GPU | - | Environment | GPU detection |
|
||||
| `var_gpu` | GPU selection | - | User input | GPU passthrough |
|
||||
| `var_gpu_type` | GPU type (intel/amd/nvidia) | - | detect_gpu_devices() | GPU passthrough |
|
||||
| `var_gpu_devices` | GPU device list | - | detect_gpu_devices() | GPU passthrough |
|
||||
|
||||
### API and Diagnostics Variables
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `DIAGNOSTICS` | Enable diagnostics mode | "false" | Environment | Diagnostics |
|
||||
| `METHOD` | Installation method | "install" | Environment | Installation flow |
|
||||
| `RANDOM_UUID` | Random UUID for tracking | - | Environment | Logging |
|
||||
| `API_TOKEN` | Proxmox API token | - | Environment | API calls |
|
||||
| `API_USER` | Proxmox API user | - | Environment | API calls |
|
||||
|
||||
### Settings Persistence Variables
|
||||
|
||||
| Variable | Description | Default | Set In | Used In |
|
||||
|----------|-------------|---------|---------|---------|
|
||||
| `SAVE_DEFAULTS` | Save settings as defaults | "false" | User input | Settings persistence |
|
||||
| `SAVE_APP_DEFAULTS` | Save app-specific defaults | "false" | User input | Settings persistence |
|
||||
| `DEFAULT_VARS_FILE` | Path to default.vars | "/usr/local/community-scripts/default.vars" | Environment | Settings persistence |
|
||||
| `APP_DEFAULTS_FILE` | Path to app.vars | "/usr/local/community-scripts/defaults/$APP.vars" | Environment | Settings persistence |
|
||||
|
||||
## Variable Precedence Chain
|
||||
|
||||
Variables are resolved in the following order (highest to lowest priority):
|
||||
|
||||
1. **Hard Environment Variables**: Set before script execution
|
||||
2. **App-specific .vars file**: `/usr/local/community-scripts/defaults/<app>.vars`
|
||||
3. **Global default.vars file**: `/usr/local/community-scripts/default.vars`
|
||||
4. **Built-in defaults**: Set in `base_settings()` function
|
||||
|
||||
## Critical Variables for Non-Interactive Use
|
||||
|
||||
For silent/non-interactive execution, these variables must be set:
|
||||
|
||||
```bash
|
||||
# Core container settings
|
||||
export APP="plex"
|
||||
export CTID="100"
|
||||
export var_hostname="plex-server"
|
||||
|
||||
# OS selection
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
|
||||
# Resource allocation
|
||||
export var_cpu="4"
|
||||
export var_ram="4096"
|
||||
export var_disk="20"
|
||||
|
||||
# Network configuration
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.100"
|
||||
|
||||
# Storage selection
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
|
||||
# Feature flags
|
||||
export ENABLE_FUSE="true"
|
||||
export ENABLE_TUN="true"
|
||||
export SSH="true"
|
||||
```
|
||||
|
||||
## Environment Variable Usage Patterns
|
||||
|
||||
### 1. Container Creation
|
||||
```bash
|
||||
# Basic container creation
|
||||
export APP="nextcloud"
|
||||
export CTID="101"
|
||||
export var_hostname="nextcloud-server"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="2"
|
||||
export var_ram="2048"
|
||||
export var_disk="10"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.101"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
```
|
||||
|
||||
### 2. GPU Passthrough
|
||||
```bash
|
||||
# Enable GPU passthrough
|
||||
export GPU_APPS="plex,jellyfin,emby"
|
||||
export var_gpu="intel"
|
||||
export ENABLE_PRIVILEGED="true"
|
||||
```
|
||||
|
||||
### 3. Advanced Network Configuration
|
||||
```bash
|
||||
# VLAN and IPv6 configuration
|
||||
export var_vlan="100"
|
||||
export var_ipv6="2001:db8::100"
|
||||
export IPV6_METHOD="static"
|
||||
export var_mtu="9000"
|
||||
```
|
||||
|
||||
### 4. Storage Configuration
|
||||
```bash
|
||||
# Custom storage locations
|
||||
export var_template_storage="nfs-storage"
|
||||
export var_container_storage="ssd-storage"
|
||||
```
|
||||
|
||||
## Variable Validation
|
||||
|
||||
The script validates variables at several points:
|
||||
|
||||
1. **Container ID validation**: Must be unique and within valid range
|
||||
2. **IP address validation**: Must be valid IPv4/IPv6 format
|
||||
3. **Storage validation**: Must exist and support required content types
|
||||
4. **Resource validation**: Must be within reasonable limits
|
||||
5. **Network validation**: Must be valid network configuration
|
||||
|
||||
## Common Variable Combinations
|
||||
|
||||
### Development Container
|
||||
```bash
|
||||
export APP="dev-container"
|
||||
export CTID="200"
|
||||
export var_hostname="dev-server"
|
||||
export var_os="ubuntu"
|
||||
export var_version="22.04"
|
||||
export var_cpu="4"
|
||||
export var_ram="4096"
|
||||
export var_disk="20"
|
||||
export ENABLE_NESTING="true"
|
||||
export ENABLE_PRIVILEGED="true"
|
||||
```
|
||||
|
||||
### Media Server with GPU
|
||||
```bash
|
||||
export APP="plex"
|
||||
export CTID="300"
|
||||
export var_hostname="plex-server"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="6"
|
||||
export var_ram="8192"
|
||||
export var_disk="50"
|
||||
export GPU_APPS="plex"
|
||||
export var_gpu="nvidia"
|
||||
export ENABLE_PRIVILEGED="true"
|
||||
```
|
||||
|
||||
### Lightweight Service
|
||||
```bash
|
||||
export APP="nginx"
|
||||
export CTID="400"
|
||||
export var_hostname="nginx-proxy"
|
||||
export var_os="alpine"
|
||||
export var_version="3.18"
|
||||
export var_cpu="1"
|
||||
export var_ram="512"
|
||||
export var_disk="2"
|
||||
export ENABLE_UNPRIVILEGED="true"
|
||||
```
|
||||
413
docs/misc/build.func/BUILD_FUNC_EXECUTION_FLOWS.md
Normal file
413
docs/misc/build.func/BUILD_FUNC_EXECUTION_FLOWS.md
Normal file
@ -0,0 +1,413 @@
|
||||
# build.func Execution Flows
|
||||
|
||||
## Overview
|
||||
|
||||
This document details the execution flows for different installation modes and scenarios in `build.func`, including variable precedence, decision trees, and workflow patterns.
|
||||
|
||||
## Installation Modes
|
||||
|
||||
### 1. Default Install Flow
|
||||
|
||||
**Purpose**: Uses built-in defaults with minimal user interaction
|
||||
**Use Case**: Quick container creation with standard settings
|
||||
|
||||
```
|
||||
Default Install Flow:
|
||||
├── start()
|
||||
│ ├── Detect execution context
|
||||
│ ├── Capture hard environment variables
|
||||
│ └── Set CT_TYPE="install"
|
||||
├── install_script()
|
||||
│ ├── Display installation mode menu
|
||||
│ ├── User selects "Default Install"
|
||||
│ └── Proceed with defaults
|
||||
├── variables()
|
||||
│ ├── base_settings() # Set built-in defaults
|
||||
│ ├── Load app.vars (if exists)
|
||||
│ ├── Load default.vars (if exists)
|
||||
│ └── Apply variable precedence
|
||||
├── build_container()
|
||||
│ ├── validate_settings()
|
||||
│ ├── check_conflicts()
|
||||
│ └── create_lxc_container()
|
||||
└── default_var_settings()
|
||||
└── Offer to save as defaults
|
||||
```
|
||||
|
||||
**Key Characteristics**:
|
||||
- Minimal user prompts
|
||||
- Uses built-in defaults
|
||||
- Fast execution
|
||||
- Suitable for standard deployments
|
||||
|
||||
### 2. Advanced Install Flow
|
||||
|
||||
**Purpose**: Full interactive configuration via whiptail menus
|
||||
**Use Case**: Custom container configuration with full control
|
||||
|
||||
```
|
||||
Advanced Install Flow:
|
||||
├── start()
|
||||
│ ├── Detect execution context
|
||||
│ ├── Capture hard environment variables
|
||||
│ └── Set CT_TYPE="install"
|
||||
├── install_script()
|
||||
│ ├── Display installation mode menu
|
||||
│ ├── User selects "Advanced Install"
|
||||
│ └── Proceed with advanced configuration
|
||||
├── variables()
|
||||
│ ├── base_settings() # Set built-in defaults
|
||||
│ ├── Load app.vars (if exists)
|
||||
│ ├── Load default.vars (if exists)
|
||||
│ └── Apply variable precedence
|
||||
├── advanced_settings()
|
||||
│ ├── OS Selection Menu
|
||||
│ ├── Resource Configuration Menu
|
||||
│ ├── Network Configuration Menu
|
||||
│ ├── select_storage()
|
||||
│ │ ├── resolve_storage_preselect()
|
||||
│ │ └── choose_and_set_storage_for_file()
|
||||
│ ├── GPU Configuration Menu
|
||||
│ │ └── detect_gpu_devices()
|
||||
│ └── Feature Flags Menu
|
||||
├── build_container()
|
||||
│ ├── validate_settings()
|
||||
│ ├── check_conflicts()
|
||||
│ └── create_lxc_container()
|
||||
└── default_var_settings()
|
||||
└── Offer to save as defaults
|
||||
```
|
||||
|
||||
**Key Characteristics**:
|
||||
- Full interactive configuration
|
||||
- Whiptail menus for all options
|
||||
- Complete control over settings
|
||||
- Suitable for custom deployments
|
||||
|
||||
### 3. My Defaults Flow
|
||||
|
||||
**Purpose**: Loads settings from global default.vars file
|
||||
**Use Case**: Using previously saved global defaults
|
||||
|
||||
```
|
||||
My Defaults Flow:
|
||||
├── start()
|
||||
│ ├── Detect execution context
|
||||
│ ├── Capture hard environment variables
|
||||
│ └── Set CT_TYPE="install"
|
||||
├── install_script()
|
||||
│ ├── Display installation mode menu
|
||||
│ ├── User selects "My Defaults"
|
||||
│ └── Proceed with loaded defaults
|
||||
├── variables()
|
||||
│ ├── base_settings() # Set built-in defaults
|
||||
│ ├── Load app.vars (if exists)
|
||||
│ ├── Load default.vars # Load global defaults
|
||||
│ └── Apply variable precedence
|
||||
├── build_container()
|
||||
│ ├── validate_settings()
|
||||
│ ├── check_conflicts()
|
||||
│ └── create_lxc_container()
|
||||
└── default_var_settings()
|
||||
└── Offer to save as defaults
|
||||
```
|
||||
|
||||
**Key Characteristics**:
|
||||
- Uses global default.vars file
|
||||
- Minimal user interaction
|
||||
- Consistent with previous settings
|
||||
- Suitable for repeated deployments
|
||||
|
||||
### 4. App Defaults Flow
|
||||
|
||||
**Purpose**: Loads settings from app-specific .vars file
|
||||
**Use Case**: Using previously saved app-specific defaults
|
||||
|
||||
```
|
||||
App Defaults Flow:
|
||||
├── start()
|
||||
│ ├── Detect execution context
|
||||
│ ├── Capture hard environment variables
|
||||
│ └── Set CT_TYPE="install"
|
||||
├── install_script()
|
||||
│ ├── Display installation mode menu
|
||||
│ ├── User selects "App Defaults"
|
||||
│ └── Proceed with app-specific defaults
|
||||
├── variables()
|
||||
│ ├── base_settings() # Set built-in defaults
|
||||
│ ├── Load app.vars # Load app-specific defaults
|
||||
│ ├── Load default.vars (if exists)
|
||||
│ └── Apply variable precedence
|
||||
├── build_container()
|
||||
│ ├── validate_settings()
|
||||
│ ├── check_conflicts()
|
||||
│ └── create_lxc_container()
|
||||
└── default_var_settings()
|
||||
└── Offer to save as defaults
|
||||
```
|
||||
|
||||
**Key Characteristics**:
|
||||
- Uses app-specific .vars file
|
||||
- Minimal user interaction
|
||||
- App-optimized settings
|
||||
- Suitable for app-specific deployments
|
||||
|
||||
## Variable Precedence Chain
|
||||
|
||||
### Precedence Order (Highest to Lowest)
|
||||
|
||||
1. **Hard Environment Variables**: Set before script execution
|
||||
2. **App-specific .vars file**: `/usr/local/community-scripts/defaults/<app>.vars`
|
||||
3. **Global default.vars file**: `/usr/local/community-scripts/default.vars`
|
||||
4. **Built-in defaults**: Set in `base_settings()` function
|
||||
|
||||
### Variable Resolution Process
|
||||
|
||||
```
|
||||
Variable Resolution:
|
||||
├── Capture hard environment variables at start()
|
||||
├── Load built-in defaults in base_settings()
|
||||
├── Load global default.vars (if exists)
|
||||
├── Load app-specific .vars (if exists)
|
||||
└── Apply precedence chain
|
||||
├── Hard env vars override all
|
||||
├── App.vars override default.vars and built-ins
|
||||
├── Default.vars override built-ins
|
||||
└── Built-ins are fallback defaults
|
||||
```
|
||||
|
||||
## Storage Selection Logic
|
||||
|
||||
### Storage Resolution Flow
|
||||
|
||||
```
|
||||
Storage Selection:
|
||||
├── Check if storage is preselected
|
||||
│ ├── var_template_storage set? → Validate and use
|
||||
│ └── var_container_storage set? → Validate and use
|
||||
├── Count available storage options
|
||||
│ ├── Only 1 option → Auto-select
|
||||
│ └── Multiple options → Prompt user
|
||||
├── User selection via whiptail
|
||||
│ ├── Template storage selection
|
||||
│ └── Container storage selection
|
||||
└── Validate selected storage
|
||||
├── Check availability
|
||||
├── Check content type support
|
||||
└── Proceed with selection
|
||||
```
|
||||
|
||||
### Storage Validation
|
||||
|
||||
```
|
||||
Storage Validation:
|
||||
├── Check storage exists
|
||||
├── Check storage is online
|
||||
├── Check content type support
|
||||
│ ├── Template storage: vztmpl support
|
||||
│ └── Container storage: rootdir support
|
||||
├── Check available space
|
||||
└── Validate permissions
|
||||
```
|
||||
|
||||
## GPU Passthrough Flow
|
||||
|
||||
### GPU Detection and Configuration
|
||||
|
||||
```
|
||||
GPU Passthrough Flow:
|
||||
├── detect_gpu_devices()
|
||||
│ ├── Scan for Intel GPUs
|
||||
│ │ ├── Check i915 driver
|
||||
│ │ └── Detect devices
|
||||
│ ├── Scan for AMD GPUs
|
||||
│ │ ├── Check AMDGPU driver
|
||||
│ │ └── Detect devices
|
||||
│ └── Scan for NVIDIA GPUs
|
||||
│ ├── Check NVIDIA driver
|
||||
│ ├── Detect devices
|
||||
│ └── Check CUDA support
|
||||
├── Check GPU passthrough eligibility
|
||||
│ ├── Is app in GPU_APPS list?
|
||||
│ ├── Is container privileged?
|
||||
│ └── Proceed if eligible
|
||||
├── GPU selection logic
|
||||
│ ├── Single GPU type → Auto-select
|
||||
│ └── Multiple GPU types → Prompt user
|
||||
├── configure_gpu_passthrough()
|
||||
│ ├── Add GPU device entries
|
||||
│ ├── Configure permissions
|
||||
│ └── Update container config
|
||||
└── fix_gpu_gids()
|
||||
├── Update GPU group IDs
|
||||
└── Configure access permissions
|
||||
```
|
||||
|
||||
### GPU Eligibility Check
|
||||
|
||||
```
|
||||
GPU Eligibility:
|
||||
├── Check app support
|
||||
│ ├── Is APP in GPU_APPS list?
|
||||
│ └── Proceed if supported
|
||||
├── Check container privileges
|
||||
│ ├── Is ENABLE_PRIVILEGED="true"?
|
||||
│ └── Proceed if privileged
|
||||
└── Check hardware availability
|
||||
├── Are GPUs detected?
|
||||
└── Proceed if available
|
||||
```
|
||||
|
||||
## Network Configuration Flow
|
||||
|
||||
### Network Setup Process
|
||||
|
||||
```
|
||||
Network Configuration:
|
||||
├── Basic network settings
|
||||
│ ├── var_net (network interface)
|
||||
│ ├── var_bridge (bridge interface)
|
||||
│ └── var_gateway (gateway IP)
|
||||
├── IP configuration
|
||||
│ ├── var_ip (IPv4 address)
|
||||
│ ├── var_ipv6 (IPv6 address)
|
||||
│ └── IPV6_METHOD (IPv6 method)
|
||||
├── Advanced network settings
|
||||
│ ├── var_vlan (VLAN ID)
|
||||
│ ├── var_mtu (MTU size)
|
||||
│ └── var_mac (MAC address)
|
||||
└── Network validation
|
||||
├── Check IP format
|
||||
├── Check gateway reachability
|
||||
└── Validate network configuration
|
||||
```
|
||||
|
||||
## Container Creation Flow
|
||||
|
||||
### LXC Container Creation Process
|
||||
|
||||
```
|
||||
Container Creation:
|
||||
├── create_lxc_container()
|
||||
│ ├── Create basic container
|
||||
│ ├── Configure network
|
||||
│ ├── Set up storage
|
||||
│ ├── Configure features
|
||||
│ ├── Set resource limits
|
||||
│ ├── Configure startup
|
||||
│ └── Start container
|
||||
├── Post-creation configuration
|
||||
│ ├── Wait for network
|
||||
│ ├── Configure GPU (if enabled)
|
||||
│ ├── Set up SSH keys
|
||||
│ └── Run post-install scripts
|
||||
└── Finalization
|
||||
├── Display container info
|
||||
├── Show access details
|
||||
└── Provide next steps
|
||||
```
|
||||
|
||||
## Error Handling Flows
|
||||
|
||||
### Validation Error Flow
|
||||
|
||||
```
|
||||
Validation Error Flow:
|
||||
├── validate_settings()
|
||||
│ ├── Check configuration validity
|
||||
│ └── Return error if invalid
|
||||
├── check_conflicts()
|
||||
│ ├── Check for conflicts
|
||||
│ └── Return error if conflicts found
|
||||
├── Error handling
|
||||
│ ├── Display error message
|
||||
│ ├── cleanup_on_error()
|
||||
│ └── Exit with error code
|
||||
└── User notification
|
||||
├── Show error details
|
||||
└── Suggest fixes
|
||||
```
|
||||
|
||||
### Storage Error Flow
|
||||
|
||||
```
|
||||
Storage Error Flow:
|
||||
├── Storage selection fails
|
||||
├── Retry storage selection
|
||||
│ ├── Show available options
|
||||
│ └── Allow user to retry
|
||||
├── Storage validation fails
|
||||
│ ├── Show validation errors
|
||||
│ └── Allow user to fix
|
||||
└── Fallback to default storage
|
||||
├── Use fallback storage
|
||||
└── Continue with creation
|
||||
```
|
||||
|
||||
### GPU Error Flow
|
||||
|
||||
```
|
||||
GPU Error Flow:
|
||||
├── GPU detection fails
|
||||
├── Fall back to no GPU
|
||||
│ ├── Disable GPU passthrough
|
||||
│ └── Continue without GPU
|
||||
├── GPU configuration fails
|
||||
│ ├── Show configuration errors
|
||||
│ └── Allow user to retry
|
||||
└── GPU permission errors
|
||||
├── Fix GPU permissions
|
||||
└── Retry configuration
|
||||
```
|
||||
|
||||
## Integration Flows
|
||||
|
||||
### With Install Scripts
|
||||
|
||||
```
|
||||
Install Script Integration:
|
||||
├── build.func creates container
|
||||
├── Container starts successfully
|
||||
├── Install script execution
|
||||
│ ├── Download and install app
|
||||
│ ├── Configure app settings
|
||||
│ └── Set up services
|
||||
└── Post-installation configuration
|
||||
├── Verify installation
|
||||
├── Configure access
|
||||
└── Display completion info
|
||||
```
|
||||
|
||||
### With Proxmox API
|
||||
|
||||
```
|
||||
Proxmox API Integration:
|
||||
├── API authentication
|
||||
├── Container creation via API
|
||||
├── Configuration updates via API
|
||||
├── Status monitoring via API
|
||||
└── Error handling via API
|
||||
```
|
||||
|
||||
## Performance Considerations
|
||||
|
||||
### Execution Time Optimization
|
||||
|
||||
```
|
||||
Performance Optimization:
|
||||
├── Parallel operations where possible
|
||||
├── Minimal user interaction in default mode
|
||||
├── Efficient storage selection
|
||||
├── Optimized GPU detection
|
||||
└── Streamlined validation
|
||||
```
|
||||
|
||||
### Resource Usage
|
||||
|
||||
```
|
||||
Resource Usage:
|
||||
├── Minimal memory footprint
|
||||
├── Efficient disk usage
|
||||
├── Optimized network usage
|
||||
└── Minimal CPU overhead
|
||||
```
|
||||
244
docs/misc/build.func/BUILD_FUNC_FLOWCHART.md
Normal file
244
docs/misc/build.func/BUILD_FUNC_FLOWCHART.md
Normal file
@ -0,0 +1,244 @@
|
||||
# build.func Execution Flowchart
|
||||
|
||||
## Main Execution Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ START() │
|
||||
│ Entry point when build.func is sourced or executed │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Check Environment │
|
||||
│ • Detect if running on Proxmox host vs inside container │
|
||||
│ • Capture hard environment variables │
|
||||
│ • Set CT_TYPE based on context │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Determine Action │
|
||||
│ • If CT_TYPE="update" → update_script() │
|
||||
│ • If CT_TYPE="install" → install_script() │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ INSTALL_SCRIPT() │
|
||||
│ Main container creation workflow │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Installation Mode Selection │
|
||||
│ │
|
||||
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │
|
||||
│ │ Default │ │ Advanced │ │ My Defaults │ │ App Defaults│ │
|
||||
│ │ Install │ │ Install │ │ │ │ │ │
|
||||
│ │ │ │ │ │ │ │ │ │
|
||||
│ │ • Use built-in │ │ • Full whiptail │ │ • Load from │ │ • Load from │ │
|
||||
│ │ defaults │ │ menus │ │ default.vars │ │ app.vars │ │
|
||||
│ │ • Minimal │ │ • Interactive │ │ • Override │ │ • App- │ │
|
||||
│ │ prompts │ │ configuration │ │ built-ins │ │ specific │ │
|
||||
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────┘ │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ VARIABLES() │
|
||||
│ • Load variable precedence chain: │
|
||||
│ 1. Hard environment variables │
|
||||
│ 2. App-specific .vars file │
|
||||
│ 3. Global default.vars file │
|
||||
│ 4. Built-in defaults in base_settings() │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ BASE_SETTINGS() │
|
||||
│ • Set core container parameters │
|
||||
│ • Configure OS selection │
|
||||
│ • Set resource defaults (CPU, RAM, Disk) │
|
||||
│ • Configure network defaults │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Storage Selection Logic │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ SELECT_STORAGE() │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────────┐ │ │
|
||||
│ │ │ Template │ │ Container │ │ Resolution │ │ │
|
||||
│ │ │ Storage │ │ Storage │ │ Logic │ │ │
|
||||
│ │ │ │ │ │ │ │ │ │
|
||||
│ │ │ • Check if │ │ • Check if │ │ 1. Only 1 storage │ │ │
|
||||
│ │ │ preselected │ │ preselected │ │ → Auto-select │ │ │
|
||||
│ │ │ • Validate │ │ • Validate │ │ 2. Preselected │ │ │
|
||||
│ │ │ availability │ │ availability │ │ → Validate & use │ │ │
|
||||
│ │ │ • Prompt if │ │ • Prompt if │ │ 3. Multiple options │ │ │
|
||||
│ │ │ needed │ │ needed │ │ → Prompt user │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ BUILD_CONTAINER() │
|
||||
│ • Validate all settings │
|
||||
│ • Check for conflicts │
|
||||
│ • Prepare container configuration │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ CREATE_LXC_CONTAINER() │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Container Creation Process │ │
|
||||
│ │ │ │
|
||||
│ │ 1. Create LXC container with basic configuration │ │
|
||||
│ │ 2. Configure network settings │ │
|
||||
│ │ 3. Set up storage and mount points │ │
|
||||
│ │ 4. Configure features (FUSE, TUN, etc.) │ │
|
||||
│ │ 5. Set resource limits │ │
|
||||
│ │ 6. Configure startup options │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ GPU Passthrough Decision Tree │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ DETECT_GPU_DEVICES() │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────────┐ │ │
|
||||
│ │ │ Intel GPU │ │ AMD GPU │ │ NVIDIA GPU │ │ │
|
||||
│ │ │ │ │ │ │ │ │ │
|
||||
│ │ │ • Check i915 │ │ • Check AMDGPU │ │ • Check NVIDIA │ │ │
|
||||
│ │ │ driver │ │ driver │ │ driver │ │ │
|
||||
│ │ │ • Detect │ │ • Detect │ │ • Detect devices │ │ │
|
||||
│ │ │ devices │ │ devices │ │ • Check CUDA support │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ GPU Selection Logic │ │
|
||||
│ │ │ │
|
||||
│ │ • Is app in GPU_APPS list? OR Is container privileged? │ │
|
||||
│ │ └─ YES → Proceed with GPU configuration │ │
|
||||
│ │ └─ NO → Skip GPU passthrough │ │
|
||||
│ │ │ │
|
||||
│ │ • Single GPU type detected? │ │
|
||||
│ │ └─ YES → Auto-select and configure │ │
|
||||
│ │ └─ NO → Prompt user for selection │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ CONFIGURE_GPU_PASSTHROUGH() │
|
||||
│ • Add GPU device entries to /etc/pve/lxc/<ctid>.conf │
|
||||
│ • Configure proper device permissions │
|
||||
│ • Set up device mapping │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Container Finalization │
|
||||
│ • Start container │
|
||||
│ • Wait for network connectivity │
|
||||
│ • Fix GPU GIDs (if GPU passthrough enabled) │
|
||||
│ • Configure SSH keys (if enabled) │
|
||||
│ • Run post-installation scripts │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Settings Persistence │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ DEFAULT_VAR_SETTINGS() │ │
|
||||
│ │ │ │
|
||||
│ │ • Offer to save current settings as defaults │ │
|
||||
│ │ • Save to /usr/local/community-scripts/default.vars │ │
|
||||
│ │ • Save to /usr/local/community-scripts/defaults/<app>.vars │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ COMPLETION │
|
||||
│ • Display container information │
|
||||
│ • Show access details │
|
||||
│ • Provide next steps │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Key Decision Points
|
||||
|
||||
### 1. Installation Mode Selection
|
||||
- **Default**: Uses built-in defaults, minimal user interaction
|
||||
- **Advanced**: Full interactive configuration via whiptail menus
|
||||
- **My Defaults**: Loads settings from global default.vars file
|
||||
- **App Defaults**: Loads settings from app-specific .vars file
|
||||
|
||||
### 2. Storage Selection Logic
|
||||
```
|
||||
Storage Selection Flow:
|
||||
├── Check if storage is preselected via environment variables
|
||||
│ ├── YES → Validate availability and use
|
||||
│ └── NO → Continue to resolution logic
|
||||
├── Count available storage options for content type
|
||||
│ ├── Only 1 option → Auto-select
|
||||
│ └── Multiple options → Prompt user via whiptail
|
||||
└── Validate selected storage and proceed
|
||||
```
|
||||
|
||||
### 3. GPU Passthrough Decision Tree
|
||||
```
|
||||
GPU Passthrough Flow:
|
||||
├── Detect available GPU hardware
|
||||
│ ├── Intel GPU detected
|
||||
│ ├── AMD GPU detected
|
||||
│ └── NVIDIA GPU detected
|
||||
├── Check if GPU passthrough should be enabled
|
||||
│ ├── App is in GPU_APPS list? → YES
|
||||
│ ├── Container is privileged? → YES
|
||||
│ └── Neither? → Skip GPU passthrough
|
||||
├── Configure GPU passthrough
|
||||
│ ├── Single GPU type → Auto-configure
|
||||
│ └── Multiple GPU types → Prompt user
|
||||
└── Fix GPU GIDs post-creation
|
||||
```
|
||||
|
||||
### 4. Variable Precedence Chain
|
||||
```
|
||||
Variable Resolution Order:
|
||||
1. Hard environment variables (captured at start)
|
||||
2. App-specific .vars file (/usr/local/community-scripts/defaults/<app>.vars)
|
||||
3. Global default.vars file (/usr/local/community-scripts/default.vars)
|
||||
4. Built-in defaults in base_settings() function
|
||||
```
|
||||
|
||||
## Error Handling Flow
|
||||
|
||||
```
|
||||
Error Handling:
|
||||
├── Validation errors → Display error message and exit
|
||||
├── Storage errors → Retry storage selection
|
||||
├── Network errors → Retry network configuration
|
||||
├── GPU errors → Fall back to no GPU passthrough
|
||||
└── Container creation errors → Cleanup and exit
|
||||
```
|
||||
|
||||
## Integration Points
|
||||
|
||||
- **Core Functions**: Depends on core.func for basic utilities
|
||||
- **Error Handling**: Uses error_handler.func for error management
|
||||
- **API Functions**: Uses api.func for Proxmox API interactions
|
||||
- **Tools**: Uses tools.func for additional utilities
|
||||
- **Install Scripts**: Integrates with <app>-install.sh scripts
|
||||
361
docs/misc/build.func/BUILD_FUNC_FUNCTIONS_REFERENCE.md
Normal file
361
docs/misc/build.func/BUILD_FUNC_FUNCTIONS_REFERENCE.md
Normal file
@ -0,0 +1,361 @@
|
||||
# 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()`
|
||||
**Purpose**: Main entry point when build.func is sourced or executed
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- 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)
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `CT_TYPE`, `APP`, `CTID`
|
||||
|
||||
#### `variables()`
|
||||
**Purpose**: Load and resolve all configuration variables using precedence chain
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Loads app-specific .vars file
|
||||
- Loads global default.vars file
|
||||
- Applies variable precedence chain
|
||||
- Sets all configuration variables
|
||||
**Dependencies**: `base_settings()`
|
||||
**Environment Variables Used**: All configuration variables
|
||||
|
||||
#### `base_settings()`
|
||||
**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()`
|
||||
**Purpose**: Main installation workflow coordinator
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Displays installation mode selection menu
|
||||
- Coordinates the entire installation process
|
||||
- Handles user interaction and validation
|
||||
**Dependencies**: `variables()`, `build_container()`, `default_var_settings()`
|
||||
**Environment Variables Used**: `APP`, `CTID`, `var_hostname`
|
||||
|
||||
#### `advanced_settings()`
|
||||
**Purpose**: Provide advanced configuration options via whiptail menus
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Displays whiptail menus for configuration
|
||||
- Updates configuration variables based on user input
|
||||
- Validates user selections
|
||||
**Dependencies**: `select_storage()`, `detect_gpu_devices()`
|
||||
**Environment Variables Used**: All configuration variables
|
||||
|
||||
#### `settings_menu()`
|
||||
**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()`
|
||||
**Purpose**: Handle storage selection for templates and containers
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Resolves storage preselection
|
||||
- Prompts user for storage selection if needed
|
||||
- Validates storage availability
|
||||
- Sets var_template_storage and var_container_storage
|
||||
**Dependencies**: `resolve_storage_preselect()`, `choose_and_set_storage_for_file()`
|
||||
**Environment Variables Used**: `var_template_storage`, `var_container_storage`, `TEMPLATE_STORAGE`, `CONTAINER_STORAGE`
|
||||
|
||||
#### `resolve_storage_preselect()`
|
||||
**Purpose**: Resolve preselected storage options
|
||||
**Parameters**:
|
||||
- `storage_type`: Type of storage (template or container)
|
||||
**Returns**: Storage name if valid, empty if invalid
|
||||
**Side Effects**: Validates storage availability
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `var_template_storage`, `var_container_storage`
|
||||
|
||||
#### `choose_and_set_storage_for_file()`
|
||||
**Purpose**: Interactive storage selection via whiptail
|
||||
**Parameters**:
|
||||
- `storage_type`: Type of storage (template or container)
|
||||
- `content_type`: Content type (vztmpl or rootdir)
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Displays whiptail menu
|
||||
- Updates storage variables
|
||||
- Validates selection
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `var_template_storage`, `var_container_storage`
|
||||
|
||||
### Container Creation Functions
|
||||
|
||||
#### `build_container()`
|
||||
**Purpose**: Validate settings and prepare container creation
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Validates all configuration
|
||||
- Checks for conflicts
|
||||
- Prepares container configuration
|
||||
- Calls create_lxc_container()
|
||||
**Dependencies**: `create_lxc_container()`
|
||||
**Environment Variables Used**: All configuration variables
|
||||
|
||||
#### `create_lxc_container()`
|
||||
**Purpose**: Create the actual LXC container
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- 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
|
||||
**Dependencies**: `configure_gpu_passthrough()`, `fix_gpu_gids()`
|
||||
**Environment Variables Used**: All configuration variables
|
||||
|
||||
### GPU and Hardware Functions
|
||||
|
||||
#### `detect_gpu_devices()`
|
||||
**Purpose**: Detect available GPU hardware on the system
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Scans for Intel, AMD, and NVIDIA GPUs
|
||||
- Updates var_gpu_type and var_gpu_devices
|
||||
- Determines GPU capabilities
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `var_gpu_type`, `var_gpu_devices`, `GPU_APPS`
|
||||
|
||||
#### `configure_gpu_passthrough()`
|
||||
**Purpose**: Configure GPU passthrough for the container
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Adds GPU device entries to container config
|
||||
- Configures proper device permissions
|
||||
- Sets up device mapping
|
||||
- Updates /etc/pve/lxc/<ctid>.conf
|
||||
**Dependencies**: `detect_gpu_devices()`
|
||||
**Environment Variables Used**: `var_gpu`, `var_gpu_type`, `var_gpu_devices`, `CTID`
|
||||
|
||||
#### `fix_gpu_gids()`
|
||||
**Purpose**: Fix GPU group IDs after container creation
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Updates GPU group IDs in container
|
||||
- Ensures proper GPU access permissions
|
||||
- Configures video and render groups
|
||||
**Dependencies**: `configure_gpu_passthrough()`
|
||||
**Environment Variables Used**: `CTID`, `var_gpu_type`
|
||||
|
||||
### Settings Persistence Functions
|
||||
|
||||
#### `default_var_settings()`
|
||||
**Purpose**: Offer to save current settings as defaults
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Prompts user to save settings
|
||||
- Saves to default.vars file
|
||||
- Saves to app-specific .vars file
|
||||
**Dependencies**: `maybe_offer_save_app_defaults()`
|
||||
**Environment Variables Used**: All configuration variables
|
||||
|
||||
#### `maybe_offer_save_app_defaults()`
|
||||
**Purpose**: Offer to save app-specific defaults
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Prompts user to save app-specific settings
|
||||
- Saves to app.vars file
|
||||
- Updates app-specific configuration
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `APP`, `SAVE_APP_DEFAULTS`
|
||||
|
||||
### Utility Functions
|
||||
|
||||
#### `validate_settings()`
|
||||
**Purpose**: Validate all configuration settings
|
||||
**Parameters**: None
|
||||
**Returns**: 0 if valid, 1 if invalid
|
||||
**Side Effects**:
|
||||
- Checks for configuration conflicts
|
||||
- Validates resource limits
|
||||
- Validates network configuration
|
||||
- Validates storage configuration
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: All configuration variables
|
||||
|
||||
#### `check_conflicts()`
|
||||
**Purpose**: Check for configuration conflicts
|
||||
**Parameters**: None
|
||||
**Returns**: 0 if no conflicts, 1 if conflicts found
|
||||
**Side Effects**:
|
||||
- Checks for conflicting settings
|
||||
- Validates resource allocation
|
||||
- Checks network configuration
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: All configuration variables
|
||||
|
||||
#### `cleanup_on_error()`
|
||||
**Purpose**: Clean up resources on error
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Removes partially created containers
|
||||
- Cleans up temporary files
|
||||
- Resets configuration
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `CTID`
|
||||
|
||||
## Function Call Flow
|
||||
|
||||
### Main Installation Flow
|
||||
```
|
||||
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
|
||||
```
|
||||
Error Detection
|
||||
├── validate_settings()
|
||||
│ └── check_conflicts()
|
||||
├── Error Handling
|
||||
│ └── cleanup_on_error()
|
||||
└── Exit with error code
|
||||
```
|
||||
|
||||
## Function Dependencies
|
||||
|
||||
### Core Dependencies
|
||||
- `start()` → `install_script()` → `build_container()` → `create_lxc_container()`
|
||||
- `variables()` → `base_settings()`
|
||||
- `advanced_settings()` → `select_storage()` → `detect_gpu_devices()`
|
||||
|
||||
### Storage Dependencies
|
||||
- `select_storage()` → `resolve_storage_preselect()`
|
||||
- `select_storage()` → `choose_and_set_storage_for_file()`
|
||||
|
||||
### GPU Dependencies
|
||||
- `configure_gpu_passthrough()` → `detect_gpu_devices()`
|
||||
- `fix_gpu_gids()` → `configure_gpu_passthrough()`
|
||||
|
||||
### Settings Dependencies
|
||||
- `default_var_settings()` → `maybe_offer_save_app_defaults()`
|
||||
|
||||
## Function Usage Examples
|
||||
|
||||
### Basic Container Creation
|
||||
```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
|
||||
```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
|
||||
```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
|
||||
```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
|
||||
- `validate_settings()`: Returns 0 for valid, 1 for invalid
|
||||
- `check_conflicts()`: Returns 0 for no conflicts, 1 for conflicts
|
||||
|
||||
### Error Recovery
|
||||
- `cleanup_on_error()`: Cleans up on any error
|
||||
- Error codes are propagated up the call stack
|
||||
- Critical errors cause script termination
|
||||
|
||||
### Error Types
|
||||
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
|
||||
600
docs/misc/build.func/BUILD_FUNC_USAGE_EXAMPLES.md
Normal file
600
docs/misc/build.func/BUILD_FUNC_USAGE_EXAMPLES.md
Normal file
@ -0,0 +1,600 @@
|
||||
# build.func Usage Examples
|
||||
|
||||
## Overview
|
||||
|
||||
This document provides practical usage examples for `build.func`, covering common scenarios, CLI examples, and environment variable combinations.
|
||||
|
||||
## Basic Usage Examples
|
||||
|
||||
### 1. Simple Container Creation
|
||||
|
||||
**Scenario**: Create a basic Plex media server container
|
||||
|
||||
```bash
|
||||
# Set basic environment variables
|
||||
export APP="plex"
|
||||
export CTID="100"
|
||||
export var_hostname="plex-server"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="4"
|
||||
export var_ram="4096"
|
||||
export var_disk="20"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.100"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
|
||||
# Execute build.func
|
||||
source build.func
|
||||
```
|
||||
|
||||
**Expected Output**:
|
||||
```
|
||||
Creating Plex container...
|
||||
Container ID: 100
|
||||
Hostname: plex-server
|
||||
OS: Debian 12
|
||||
Resources: 4 CPU, 4GB RAM, 20GB Disk
|
||||
Network: 192.168.1.100/24
|
||||
Container created successfully!
|
||||
```
|
||||
|
||||
### 2. Advanced Configuration
|
||||
|
||||
**Scenario**: Create a Nextcloud container with custom settings
|
||||
|
||||
```bash
|
||||
# Set advanced environment variables
|
||||
export APP="nextcloud"
|
||||
export CTID="101"
|
||||
export var_hostname="nextcloud-server"
|
||||
export var_os="ubuntu"
|
||||
export var_version="22.04"
|
||||
export var_cpu="6"
|
||||
export var_ram="8192"
|
||||
export var_disk="50"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.101"
|
||||
export var_vlan="100"
|
||||
export var_mtu="9000"
|
||||
export var_template_storage="nfs-storage"
|
||||
export var_container_storage="ssd-storage"
|
||||
export ENABLE_FUSE="true"
|
||||
export ENABLE_TUN="true"
|
||||
export SSH="true"
|
||||
|
||||
# Execute build.func
|
||||
source build.func
|
||||
```
|
||||
|
||||
### 3. GPU Passthrough Configuration
|
||||
|
||||
**Scenario**: Create a Jellyfin container with NVIDIA GPU passthrough
|
||||
|
||||
```bash
|
||||
# Set GPU passthrough variables
|
||||
export APP="jellyfin"
|
||||
export CTID="102"
|
||||
export var_hostname="jellyfin-server"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="8"
|
||||
export var_ram="16384"
|
||||
export var_disk="30"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.102"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
export GPU_APPS="jellyfin"
|
||||
export var_gpu="nvidia"
|
||||
export ENABLE_PRIVILEGED="true"
|
||||
export ENABLE_FUSE="true"
|
||||
export ENABLE_TUN="true"
|
||||
|
||||
# Execute build.func
|
||||
source build.func
|
||||
```
|
||||
|
||||
## Silent/Non-Interactive Examples
|
||||
|
||||
### 1. Automated Deployment
|
||||
|
||||
**Scenario**: Deploy multiple containers without user interaction
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Automated deployment script
|
||||
|
||||
# Function to create container
|
||||
create_container() {
|
||||
local app=$1
|
||||
local ctid=$2
|
||||
local ip=$3
|
||||
|
||||
export APP="$app"
|
||||
export CTID="$ctid"
|
||||
export var_hostname="${app}-server"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="2"
|
||||
export var_ram="2048"
|
||||
export var_disk="10"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="$ip"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
export ENABLE_FUSE="true"
|
||||
export ENABLE_TUN="true"
|
||||
export SSH="true"
|
||||
|
||||
source build.func
|
||||
}
|
||||
|
||||
# Create multiple containers
|
||||
create_container "plex" "100" "192.168.1.100"
|
||||
create_container "nextcloud" "101" "192.168.1.101"
|
||||
create_container "nginx" "102" "192.168.1.102"
|
||||
```
|
||||
|
||||
### 2. Development Environment Setup
|
||||
|
||||
**Scenario**: Create development containers with specific configurations
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Development environment setup
|
||||
|
||||
# Development container configuration
|
||||
export APP="dev-container"
|
||||
export CTID="200"
|
||||
export var_hostname="dev-server"
|
||||
export var_os="ubuntu"
|
||||
export var_version="22.04"
|
||||
export var_cpu="4"
|
||||
export var_ram="4096"
|
||||
export var_disk="20"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.200"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
export ENABLE_NESTING="true"
|
||||
export ENABLE_PRIVILEGED="true"
|
||||
export ENABLE_FUSE="true"
|
||||
export ENABLE_TUN="true"
|
||||
export SSH="true"
|
||||
|
||||
# Execute build.func
|
||||
source build.func
|
||||
```
|
||||
|
||||
## Network Configuration Examples
|
||||
|
||||
### 1. VLAN Configuration
|
||||
|
||||
**Scenario**: Create container with VLAN support
|
||||
|
||||
```bash
|
||||
# VLAN configuration
|
||||
export APP="web-server"
|
||||
export CTID="300"
|
||||
export var_hostname="web-server"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="2"
|
||||
export var_ram="2048"
|
||||
export var_disk="10"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.100.1"
|
||||
export var_ip="192.168.100.100"
|
||||
export var_vlan="100"
|
||||
export var_mtu="1500"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
|
||||
source build.func
|
||||
```
|
||||
|
||||
### 2. IPv6 Configuration
|
||||
|
||||
**Scenario**: Create container with IPv6 support
|
||||
|
||||
```bash
|
||||
# IPv6 configuration
|
||||
export APP="ipv6-server"
|
||||
export CTID="301"
|
||||
export var_hostname="ipv6-server"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="2"
|
||||
export var_ram="2048"
|
||||
export var_disk="10"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.101"
|
||||
export var_ipv6="2001:db8::101"
|
||||
export IPV6_METHOD="static"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
|
||||
source build.func
|
||||
```
|
||||
|
||||
## Storage Configuration Examples
|
||||
|
||||
### 1. Custom Storage Locations
|
||||
|
||||
**Scenario**: Use different storage for templates and containers
|
||||
|
||||
```bash
|
||||
# Custom storage configuration
|
||||
export APP="storage-test"
|
||||
export CTID="400"
|
||||
export var_hostname="storage-test"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="2"
|
||||
export var_ram="2048"
|
||||
export var_disk="10"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.140"
|
||||
export var_template_storage="nfs-storage"
|
||||
export var_container_storage="ssd-storage"
|
||||
|
||||
source build.func
|
||||
```
|
||||
|
||||
### 2. High-Performance Storage
|
||||
|
||||
**Scenario**: Use high-performance storage for resource-intensive applications
|
||||
|
||||
```bash
|
||||
# High-performance storage configuration
|
||||
export APP="database-server"
|
||||
export CTID="401"
|
||||
export var_hostname="database-server"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="8"
|
||||
export var_ram="16384"
|
||||
export var_disk="100"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.141"
|
||||
export var_template_storage="nvme-storage"
|
||||
export var_container_storage="nvme-storage"
|
||||
|
||||
source build.func
|
||||
```
|
||||
|
||||
## Feature Configuration Examples
|
||||
|
||||
### 1. Privileged Container
|
||||
|
||||
**Scenario**: Create privileged container for system-level access
|
||||
|
||||
```bash
|
||||
# Privileged container configuration
|
||||
export APP="system-container"
|
||||
export CTID="500"
|
||||
export var_hostname="system-container"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="4"
|
||||
export var_ram="4096"
|
||||
export var_disk="20"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.150"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
export ENABLE_PRIVILEGED="true"
|
||||
export ENABLE_FUSE="true"
|
||||
export ENABLE_TUN="true"
|
||||
export ENABLE_KEYCTL="true"
|
||||
export ENABLE_MOUNT="true"
|
||||
|
||||
source build.func
|
||||
```
|
||||
|
||||
### 2. Unprivileged Container
|
||||
|
||||
**Scenario**: Create secure unprivileged container
|
||||
|
||||
```bash
|
||||
# Unprivileged container configuration
|
||||
export APP="secure-container"
|
||||
export CTID="501"
|
||||
export var_hostname="secure-container"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="2"
|
||||
export var_ram="2048"
|
||||
export var_disk="10"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.151"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
export ENABLE_UNPRIVILEGED="true"
|
||||
export ENABLE_FUSE="true"
|
||||
export ENABLE_TUN="true"
|
||||
|
||||
source build.func
|
||||
```
|
||||
|
||||
## Settings Persistence Examples
|
||||
|
||||
### 1. Save Global Defaults
|
||||
|
||||
**Scenario**: Save current settings as global defaults
|
||||
|
||||
```bash
|
||||
# Save global defaults
|
||||
export APP="default-test"
|
||||
export CTID="600"
|
||||
export var_hostname="default-test"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="2"
|
||||
export var_ram="2048"
|
||||
export var_disk="10"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.160"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
export SAVE_DEFAULTS="true"
|
||||
|
||||
source build.func
|
||||
```
|
||||
|
||||
### 2. Save App-Specific Defaults
|
||||
|
||||
**Scenario**: Save settings as app-specific defaults
|
||||
|
||||
```bash
|
||||
# Save app-specific defaults
|
||||
export APP="plex"
|
||||
export CTID="601"
|
||||
export var_hostname="plex-server"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="4"
|
||||
export var_ram="4096"
|
||||
export var_disk="20"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.161"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
export SAVE_APP_DEFAULTS="true"
|
||||
|
||||
source build.func
|
||||
```
|
||||
|
||||
## Error Handling Examples
|
||||
|
||||
### 1. Validation Error Handling
|
||||
|
||||
**Scenario**: Handle configuration validation errors
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Error handling example
|
||||
|
||||
# Set invalid configuration
|
||||
export APP="error-test"
|
||||
export CTID="700"
|
||||
export var_hostname="error-test"
|
||||
export var_os="invalid-os"
|
||||
export var_version="invalid-version"
|
||||
export var_cpu="invalid-cpu"
|
||||
export var_ram="invalid-ram"
|
||||
export var_disk="invalid-disk"
|
||||
export var_net="invalid-network"
|
||||
export var_gateway="invalid-gateway"
|
||||
export var_ip="invalid-ip"
|
||||
|
||||
# Execute with error handling
|
||||
if source build.func; then
|
||||
echo "Container created successfully!"
|
||||
else
|
||||
echo "Error: Container creation failed!"
|
||||
echo "Please check your configuration and try again."
|
||||
fi
|
||||
```
|
||||
|
||||
### 2. Storage Error Handling
|
||||
|
||||
**Scenario**: Handle storage selection errors
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Storage error handling
|
||||
|
||||
# Set invalid storage
|
||||
export APP="storage-error-test"
|
||||
export CTID="701"
|
||||
export var_hostname="storage-error-test"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="2"
|
||||
export var_ram="2048"
|
||||
export var_disk="10"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.170"
|
||||
export var_template_storage="nonexistent-storage"
|
||||
export var_container_storage="nonexistent-storage"
|
||||
|
||||
# Execute with error handling
|
||||
if source build.func; then
|
||||
echo "Container created successfully!"
|
||||
else
|
||||
echo "Error: Storage not available!"
|
||||
echo "Please check available storage and try again."
|
||||
fi
|
||||
```
|
||||
|
||||
## Integration Examples
|
||||
|
||||
### 1. With Install Scripts
|
||||
|
||||
**Scenario**: Integrate with application install scripts
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Integration with install scripts
|
||||
|
||||
# Create container
|
||||
export APP="plex"
|
||||
export CTID="800"
|
||||
export var_hostname="plex-server"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="4"
|
||||
export var_ram="4096"
|
||||
export var_disk="20"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.180"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
|
||||
# Create container
|
||||
source build.func
|
||||
|
||||
# Run install script
|
||||
if [ -f "plex-install.sh" ]; then
|
||||
source plex-install.sh
|
||||
else
|
||||
echo "Install script not found!"
|
||||
fi
|
||||
```
|
||||
|
||||
### 2. With Monitoring
|
||||
|
||||
**Scenario**: Integrate with monitoring systems
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Monitoring integration
|
||||
|
||||
# Create container with monitoring
|
||||
export APP="monitored-app"
|
||||
export CTID="801"
|
||||
export var_hostname="monitored-app"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="2"
|
||||
export var_ram="2048"
|
||||
export var_disk="10"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.181"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
export DIAGNOSTICS="true"
|
||||
|
||||
# Create container
|
||||
source build.func
|
||||
|
||||
# Set up monitoring
|
||||
if [ -f "monitoring-setup.sh" ]; then
|
||||
source monitoring-setup.sh
|
||||
fi
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### 1. Environment Variable Management
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Best practice: Environment variable management
|
||||
|
||||
# Set configuration file
|
||||
CONFIG_FILE="/etc/build.func.conf"
|
||||
|
||||
# Load configuration if exists
|
||||
if [ -f "$CONFIG_FILE" ]; then
|
||||
source "$CONFIG_FILE"
|
||||
fi
|
||||
|
||||
# Set required variables
|
||||
export APP="${APP:-plex}"
|
||||
export CTID="${CTID:-100}"
|
||||
export var_hostname="${var_hostname:-plex-server}"
|
||||
export var_os="${var_os:-debian}"
|
||||
export var_version="${var_version:-12}"
|
||||
export var_cpu="${var_cpu:-2}"
|
||||
export var_ram="${var_ram:-2048}"
|
||||
export var_disk="${var_disk:-10}"
|
||||
export var_net="${var_net:-vmbr0}"
|
||||
export var_gateway="${var_gateway:-192.168.1.1}"
|
||||
export var_ip="${var_ip:-192.168.1.100}"
|
||||
export var_template_storage="${var_template_storage:-local}"
|
||||
export var_container_storage="${var_container_storage:-local}"
|
||||
|
||||
# Execute build.func
|
||||
source build.func
|
||||
```
|
||||
|
||||
### 2. Error Handling and Logging
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Best practice: Error handling and logging
|
||||
|
||||
# Set log file
|
||||
LOG_FILE="/var/log/build.func.log"
|
||||
|
||||
# Function to log messages
|
||||
log_message() {
|
||||
echo "$(date): $1" >> "$LOG_FILE"
|
||||
}
|
||||
|
||||
# Function to create container with error handling
|
||||
create_container() {
|
||||
local app=$1
|
||||
local ctid=$2
|
||||
|
||||
log_message "Starting container creation for $app (ID: $ctid)"
|
||||
|
||||
# Set variables
|
||||
export APP="$app"
|
||||
export CTID="$ctid"
|
||||
export var_hostname="${app}-server"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="2"
|
||||
export var_ram="2048"
|
||||
export var_disk="10"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.$ctid"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
|
||||
# Create container
|
||||
if source build.func; then
|
||||
log_message "Container $app created successfully (ID: $ctid)"
|
||||
return 0
|
||||
else
|
||||
log_message "Error: Failed to create container $app (ID: $ctid)"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Create containers
|
||||
create_container "plex" "100"
|
||||
create_container "nextcloud" "101"
|
||||
create_container "nginx" "102"
|
||||
```
|
||||
260
docs/misc/build.func/README.md
Normal file
260
docs/misc/build.func/README.md
Normal file
@ -0,0 +1,260 @@
|
||||
# build.func Documentation
|
||||
|
||||
## Overview
|
||||
|
||||
This directory contains comprehensive documentation for the `build.func` script, which is the core orchestration script for Proxmox LXC container creation in the Community Scripts project.
|
||||
|
||||
## Documentation Files
|
||||
|
||||
### 📊 [BUILD_FUNC_FLOWCHART.md](./BUILD_FUNC_FLOWCHART.md)
|
||||
Visual ASCII flowchart showing the main execution flow, decision trees, and key decision points in the build.func script.
|
||||
|
||||
**Contents:**
|
||||
- Main execution flow diagram
|
||||
- Installation mode selection flows
|
||||
- Storage selection workflow
|
||||
- GPU passthrough decision logic
|
||||
- Variable precedence chain
|
||||
- Error handling flow
|
||||
- Integration points
|
||||
|
||||
### 🔧 [BUILD_FUNC_ENVIRONMENT_VARIABLES.md](./BUILD_FUNC_ENVIRONMENT_VARIABLES.md)
|
||||
Complete reference of all environment variables used in build.func, organized by category and usage context.
|
||||
|
||||
**Contents:**
|
||||
- Core container variables
|
||||
- Operating system variables
|
||||
- Resource configuration variables
|
||||
- Network configuration variables
|
||||
- Storage configuration variables
|
||||
- Feature flags
|
||||
- GPU passthrough variables
|
||||
- API and diagnostics variables
|
||||
- Settings persistence variables
|
||||
- Variable precedence chain
|
||||
- Critical variables for non-interactive use
|
||||
- Common variable combinations
|
||||
|
||||
### 📚 [BUILD_FUNC_FUNCTIONS_REFERENCE.md](./BUILD_FUNC_FUNCTIONS_REFERENCE.md)
|
||||
Alphabetical function reference with detailed descriptions, parameters, dependencies, and usage information.
|
||||
|
||||
**Contents:**
|
||||
- Initialization functions
|
||||
- UI and menu functions
|
||||
- Storage functions
|
||||
- Container creation functions
|
||||
- GPU and hardware functions
|
||||
- Settings persistence functions
|
||||
- Utility functions
|
||||
- Function call flow
|
||||
- Function dependencies
|
||||
- Function usage examples
|
||||
- Function error handling
|
||||
|
||||
### 🔄 [BUILD_FUNC_EXECUTION_FLOWS.md](./BUILD_FUNC_EXECUTION_FLOWS.md)
|
||||
Detailed execution flows for different installation modes and scenarios, including variable precedence and decision trees.
|
||||
|
||||
**Contents:**
|
||||
- Default install flow
|
||||
- Advanced install flow
|
||||
- My defaults flow
|
||||
- App defaults flow
|
||||
- Variable precedence chain
|
||||
- Storage selection logic
|
||||
- GPU passthrough flow
|
||||
- Network configuration flow
|
||||
- Container creation flow
|
||||
- Error handling flows
|
||||
- Integration flows
|
||||
- Performance considerations
|
||||
|
||||
### 🏗️ [BUILD_FUNC_ARCHITECTURE.md](./BUILD_FUNC_ARCHITECTURE.md)
|
||||
High-level architectural overview including module dependencies, data flow, integration points, and system architecture.
|
||||
|
||||
**Contents:**
|
||||
- High-level architecture diagram
|
||||
- Module dependencies
|
||||
- Data flow architecture
|
||||
- Integration architecture
|
||||
- System architecture components
|
||||
- User interface components
|
||||
- Security architecture
|
||||
- Performance architecture
|
||||
- Deployment architecture
|
||||
- Maintenance architecture
|
||||
- Future architecture considerations
|
||||
|
||||
### 💡 [BUILD_FUNC_USAGE_EXAMPLES.md](./BUILD_FUNC_USAGE_EXAMPLES.md)
|
||||
Practical usage examples covering common scenarios, CLI examples, and environment variable combinations.
|
||||
|
||||
**Contents:**
|
||||
- Basic usage examples
|
||||
- Silent/non-interactive examples
|
||||
- Network configuration examples
|
||||
- Storage configuration examples
|
||||
- Feature configuration examples
|
||||
- Settings persistence examples
|
||||
- Error handling examples
|
||||
- Integration examples
|
||||
- Best practices
|
||||
|
||||
## Quick Start Guide
|
||||
|
||||
### For New Users
|
||||
1. Start with [BUILD_FUNC_FLOWCHART.md](./BUILD_FUNC_FLOWCHART.md) to understand the overall flow
|
||||
2. Review [BUILD_FUNC_ENVIRONMENT_VARIABLES.md](./BUILD_FUNC_ENVIRONMENT_VARIABLES.md) for configuration options
|
||||
3. Follow examples in [BUILD_FUNC_USAGE_EXAMPLES.md](./BUILD_FUNC_USAGE_EXAMPLES.md)
|
||||
|
||||
### For Developers
|
||||
1. Read [BUILD_FUNC_ARCHITECTURE.md](./BUILD_FUNC_ARCHITECTURE.md) for system overview
|
||||
2. Study [BUILD_FUNC_FUNCTIONS_REFERENCE.md](./BUILD_FUNC_FUNCTIONS_REFERENCE.md) for function details
|
||||
3. Review [BUILD_FUNC_EXECUTION_FLOWS.md](./BUILD_FUNC_EXECUTION_FLOWS.md) for implementation details
|
||||
|
||||
### For System Administrators
|
||||
1. Focus on [BUILD_FUNC_USAGE_EXAMPLES.md](./BUILD_FUNC_USAGE_EXAMPLES.md) for deployment scenarios
|
||||
2. Review [BUILD_FUNC_ENVIRONMENT_VARIABLES.md](./BUILD_FUNC_ENVIRONMENT_VARIABLES.md) for configuration management
|
||||
3. Check [BUILD_FUNC_ARCHITECTURE.md](./BUILD_FUNC_ARCHITECTURE.md) for security and performance considerations
|
||||
|
||||
## Key Concepts
|
||||
|
||||
### Variable Precedence
|
||||
Variables are resolved in this order (highest to lowest priority):
|
||||
1. Hard environment variables (set before script execution)
|
||||
2. App-specific .vars file (`/usr/local/community-scripts/defaults/<app>.vars`)
|
||||
3. Global default.vars file (`/usr/local/community-scripts/default.vars`)
|
||||
4. Built-in defaults (set in `base_settings()` function)
|
||||
|
||||
### Installation Modes
|
||||
- **Default Install**: Uses built-in defaults, minimal prompts
|
||||
- **Advanced Install**: Full interactive configuration via whiptail
|
||||
- **My Defaults**: Loads from global default.vars file
|
||||
- **App Defaults**: Loads from app-specific .vars file
|
||||
|
||||
### Storage Selection Logic
|
||||
1. If only 1 storage exists for content type → auto-select
|
||||
2. If preselected via environment variables → validate and use
|
||||
3. Otherwise → prompt user via whiptail
|
||||
|
||||
### GPU Passthrough Flow
|
||||
1. Detect hardware (Intel/AMD/NVIDIA)
|
||||
2. Check if app is in GPU_APPS list OR container is privileged
|
||||
3. Auto-select if single GPU type, prompt if multiple
|
||||
4. Configure `/etc/pve/lxc/<ctid>.conf` with proper device entries
|
||||
5. Fix GIDs post-creation to match container's video/render groups
|
||||
|
||||
## Common Use Cases
|
||||
|
||||
### Basic Container Creation
|
||||
```bash
|
||||
export APP="plex"
|
||||
export CTID="100"
|
||||
export var_hostname="plex-server"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="4"
|
||||
export var_ram="4096"
|
||||
export var_disk="20"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.100"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
|
||||
source build.func
|
||||
```
|
||||
|
||||
### GPU Passthrough
|
||||
```bash
|
||||
export APP="jellyfin"
|
||||
export CTID="101"
|
||||
export var_hostname="jellyfin-server"
|
||||
export var_os="debian"
|
||||
export var_version="12"
|
||||
export var_cpu="8"
|
||||
export var_ram="16384"
|
||||
export var_disk="30"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.101"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
export GPU_APPS="jellyfin"
|
||||
export var_gpu="nvidia"
|
||||
export ENABLE_PRIVILEGED="true"
|
||||
|
||||
source build.func
|
||||
```
|
||||
|
||||
### Silent/Non-Interactive Deployment
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Automated deployment
|
||||
export APP="nginx"
|
||||
export CTID="102"
|
||||
export var_hostname="nginx-proxy"
|
||||
export var_os="alpine"
|
||||
export var_version="3.18"
|
||||
export var_cpu="1"
|
||||
export var_ram="512"
|
||||
export var_disk="2"
|
||||
export var_net="vmbr0"
|
||||
export var_gateway="192.168.1.1"
|
||||
export var_ip="192.168.1.102"
|
||||
export var_template_storage="local"
|
||||
export var_container_storage="local"
|
||||
export ENABLE_UNPRIVILEGED="true"
|
||||
|
||||
source build.func
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
1. **Container creation fails**: Check resource availability and configuration validity
|
||||
2. **Storage errors**: Verify storage exists and supports required content types
|
||||
3. **Network errors**: Validate network configuration and IP address availability
|
||||
4. **GPU passthrough issues**: Check hardware detection and container privileges
|
||||
5. **Permission errors**: Verify user permissions and container privileges
|
||||
|
||||
### Debug Mode
|
||||
Enable verbose output for debugging:
|
||||
```bash
|
||||
export VERBOSE="true"
|
||||
export DIAGNOSTICS="true"
|
||||
source build.func
|
||||
```
|
||||
|
||||
### Log Files
|
||||
Check system logs for detailed error information:
|
||||
- `/var/log/syslog`
|
||||
- `/var/log/pve/lxc/<ctid>.log`
|
||||
- Container-specific logs
|
||||
|
||||
## Contributing
|
||||
|
||||
When contributing to build.func documentation:
|
||||
1. Update relevant documentation files
|
||||
2. Add examples for new features
|
||||
3. Update architecture diagrams if needed
|
||||
4. Test all examples before submitting
|
||||
5. Follow the existing documentation style
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- [Main README](../../README.md) - Project overview
|
||||
- [Installation Guide](../../install/) - Installation scripts
|
||||
- [Container Templates](../../ct/) - Container templates
|
||||
- [Tools](../../tools/) - Additional tools and utilities
|
||||
|
||||
## Support
|
||||
|
||||
For issues and questions:
|
||||
1. Check this documentation first
|
||||
2. Review the [troubleshooting section](#troubleshooting)
|
||||
3. Check existing issues in the project repository
|
||||
4. Create a new issue with detailed information
|
||||
|
||||
---
|
||||
|
||||
*Last updated: $(date)*
|
||||
*Documentation version: 1.0*
|
||||
28
docs/misc/cloud-init.func/CLOUD_INIT_FUNC_FLOWCHART.md
Normal file
28
docs/misc/cloud-init.func/CLOUD_INIT_FUNC_FLOWCHART.md
Normal file
@ -0,0 +1,28 @@
|
||||
# cloud-init.func Flowchart
|
||||
|
||||
Cloud-init VM provisioning flow.
|
||||
|
||||
## Cloud-Init Generation and Application
|
||||
|
||||
```
|
||||
generate_cloud_init()
|
||||
↓
|
||||
generate_user_data()
|
||||
↓
|
||||
setup_ssh_keys()
|
||||
↓
|
||||
Apply to VM
|
||||
↓
|
||||
VM Boot
|
||||
↓
|
||||
cloud-init phases
|
||||
├─ system
|
||||
├─ config
|
||||
└─ final
|
||||
↓
|
||||
VM Ready ✓
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
@ -0,0 +1,30 @@
|
||||
# cloud-init.func Functions Reference
|
||||
|
||||
Cloud-init and VM provisioning functions.
|
||||
|
||||
## Core Functions
|
||||
|
||||
### generate_cloud_init()
|
||||
Generate cloud-init configuration.
|
||||
|
||||
### generate_user_data()
|
||||
Generate user-data script for VM.
|
||||
|
||||
### apply_cloud_init()
|
||||
Apply cloud-init to VM.
|
||||
|
||||
### setup_ssh_keys()
|
||||
Deploy SSH public keys.
|
||||
|
||||
### setup_static_ip()
|
||||
Configure static IP on VM.
|
||||
|
||||
### setup_dns()
|
||||
Configure DNS for VM.
|
||||
|
||||
### setup_ipv6()
|
||||
Enable IPv6 on VM.
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
7
docs/misc/cloud-init.func/CLOUD_INIT_FUNC_INTEGRATION.md
Normal file
7
docs/misc/cloud-init.func/CLOUD_INIT_FUNC_INTEGRATION.md
Normal file
@ -0,0 +1,7 @@
|
||||
# cloud-init.func Integration Guide
|
||||
|
||||
Cloud-init integration with Proxmox VM provisioning.
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
17
docs/misc/cloud-init.func/CLOUD_INIT_FUNC_USAGE_EXAMPLES.md
Normal file
17
docs/misc/cloud-init.func/CLOUD_INIT_FUNC_USAGE_EXAMPLES.md
Normal file
@ -0,0 +1,17 @@
|
||||
# cloud-init.func Usage Examples
|
||||
|
||||
Examples for VM cloud-init configuration.
|
||||
|
||||
### Example: Basic Cloud-Init
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
|
||||
generate_cloud_init > cloud-init.yaml
|
||||
setup_ssh_keys "$VMID" "$SSH_KEY"
|
||||
apply_cloud_init "$VMID" cloud-init.yaml
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
339
docs/misc/cloud-init.func/README.md
Normal file
339
docs/misc/cloud-init.func/README.md
Normal file
@ -0,0 +1,339 @@
|
||||
# cloud-init.func Documentation
|
||||
|
||||
## Overview
|
||||
|
||||
The `cloud-init.func` file provides cloud-init configuration and VM initialization functions for Proxmox VE virtual machines. It handles user data, cloud-config generation, and VM setup automation.
|
||||
|
||||
## Purpose and Use Cases
|
||||
|
||||
- **VM Cloud-Init Setup**: Generate and apply cloud-init configurations for VMs
|
||||
- **User Data Generation**: Create user-data scripts for VM initialization
|
||||
- **Cloud-Config**: Generate cloud-config YAML for VM provisioning
|
||||
- **SSH Key Management**: Setup SSH keys for VM access
|
||||
- **Network Configuration**: Configure networking for VMs
|
||||
- **Automated VM Provisioning**: Complete VM setup without manual intervention
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Key Function Groups
|
||||
- **Cloud-Init Core**: Generate and apply cloud-init configurations
|
||||
- **User Data**: Create initialization scripts for VMs
|
||||
- **SSH Setup**: Deploy SSH keys automatically
|
||||
- **Network Configuration**: Setup networking during VM provisioning
|
||||
- **VM Customization**: Apply custom settings to VMs
|
||||
|
||||
### Dependencies
|
||||
- **External**: `cloud-init`, `curl`, `qemu-img`
|
||||
- **Internal**: Uses functions from `core.func`, `error_handler.func`
|
||||
|
||||
### Integration Points
|
||||
- Used by: VM creation scripts (vm/*.sh)
|
||||
- Uses: Environment variables from build.func
|
||||
- Provides: VM initialization and cloud-init services
|
||||
|
||||
## Documentation Files
|
||||
|
||||
### 📊 [CLOUD_INIT_FUNC_FLOWCHART.md](./CLOUD_INIT_FUNC_FLOWCHART.md)
|
||||
Visual execution flows showing cloud-init generation and VM provisioning workflows.
|
||||
|
||||
### 📚 [CLOUD_INIT_FUNC_FUNCTIONS_REFERENCE.md](./CLOUD_INIT_FUNC_FUNCTIONS_REFERENCE.md)
|
||||
Complete alphabetical reference of all cloud-init functions.
|
||||
|
||||
### 💡 [CLOUD_INIT_FUNC_USAGE_EXAMPLES.md](./CLOUD_INIT_FUNC_USAGE_EXAMPLES.md)
|
||||
Practical examples for VM cloud-init setup and customization.
|
||||
|
||||
### 🔗 [CLOUD_INIT_FUNC_INTEGRATION.md](./CLOUD_INIT_FUNC_INTEGRATION.md)
|
||||
How cloud-init.func integrates with VM creation and Proxmox workflows.
|
||||
|
||||
## Key Features
|
||||
|
||||
### Cloud-Init Configuration
|
||||
- **User Data Generation**: Create custom initialization scripts
|
||||
- **Cloud-Config YAML**: Generate standardized cloud-config
|
||||
- **SSH Keys**: Automatically deploy public keys
|
||||
- **Package Installation**: Install packages during VM boot
|
||||
- **Custom Commands**: Run arbitrary commands on first boot
|
||||
|
||||
### VM Network Setup
|
||||
- **DHCP Configuration**: Configure DHCP for automatic IP assignment
|
||||
- **Static IP Setup**: Configure static IP addresses
|
||||
- **IPv6 Support**: Enable IPv6 on VMs
|
||||
- **DNS Configuration**: Set DNS servers for VM
|
||||
- **Firewall Rules**: Basic firewall configuration
|
||||
|
||||
### Security Features
|
||||
- **SSH Key Injection**: Deploy SSH keys during VM creation
|
||||
- **Disable Passwords**: Disable password authentication
|
||||
- **Sudoers Configuration**: Setup sudo access
|
||||
- **User Management**: Create and configure users
|
||||
|
||||
## Function Categories
|
||||
|
||||
### 🔹 Cloud-Init Core Functions
|
||||
- `generate_cloud_init()` - Create cloud-init configuration
|
||||
- `generate_user_data()` - Generate user-data script
|
||||
- `apply_cloud_init()` - Apply cloud-init to VM
|
||||
- `validate_cloud_init()` - Validate cloud-config syntax
|
||||
|
||||
### 🔹 SSH & Security Functions
|
||||
- `setup_ssh_keys()` - Deploy SSH public keys
|
||||
- `setup_sudo()` - Configure sudoers
|
||||
- `create_user()` - Create new user account
|
||||
- `disable_password_auth()` - Disable password login
|
||||
|
||||
### 🔹 Network Configuration Functions
|
||||
- `setup_dhcp()` - Configure DHCP networking
|
||||
- `setup_static_ip()` - Configure static IP
|
||||
- `setup_dns()` - Configure DNS servers
|
||||
- `setup_ipv6()` - Enable IPv6 support
|
||||
|
||||
### 🔹 VM Customization Functions
|
||||
- `install_packages()` - Install packages during boot
|
||||
- `run_custom_commands()` - Execute custom scripts
|
||||
- `configure_hostname()` - Set VM hostname
|
||||
- `configure_timezone()` - Set VM timezone
|
||||
|
||||
## Cloud-Init Workflow
|
||||
|
||||
```
|
||||
VM Created
|
||||
↓
|
||||
cloud-init (system) boot phase
|
||||
↓
|
||||
User-Data Script Execution
|
||||
↓
|
||||
├─ Install packages
|
||||
├─ Deploy SSH keys
|
||||
├─ Configure network
|
||||
└─ Create users
|
||||
↓
|
||||
cloud-init config phase
|
||||
↓
|
||||
Apply cloud-config settings
|
||||
↓
|
||||
cloud-init final phase
|
||||
↓
|
||||
VM Ready for Use
|
||||
```
|
||||
|
||||
## Common Usage Patterns
|
||||
|
||||
### Basic VM Setup with Cloud-Init
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
# Generate cloud-init configuration
|
||||
cat > cloud-init.yaml <<EOF
|
||||
#cloud-config
|
||||
hostname: myvm
|
||||
timezone: UTC
|
||||
|
||||
packages:
|
||||
- curl
|
||||
- wget
|
||||
- git
|
||||
|
||||
users:
|
||||
- name: ubuntu
|
||||
ssh_authorized_keys:
|
||||
- ssh-rsa AAAAB3...
|
||||
sudo: ALL=(ALL) NOPASSWD:ALL
|
||||
|
||||
bootcmd:
|
||||
- echo "VM initializing..."
|
||||
|
||||
runcmd:
|
||||
- apt-get update
|
||||
- apt-get upgrade -y
|
||||
EOF
|
||||
|
||||
# Apply to VM
|
||||
qm set VMID --cicustom local:snippets/cloud-init.yaml
|
||||
```
|
||||
|
||||
### With SSH Key Deployment
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
# Get SSH public key
|
||||
SSH_KEY=$(cat ~/.ssh/id_rsa.pub)
|
||||
|
||||
# Generate cloud-init with SSH key
|
||||
generate_user_data > user-data.txt
|
||||
|
||||
# Inject SSH key
|
||||
setup_ssh_keys "$VMID" "$SSH_KEY"
|
||||
|
||||
# Create VM with cloud-init
|
||||
qm create $VMID ... --cicustom local:snippets/user-data
|
||||
```
|
||||
|
||||
### Network Configuration
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
# Static IP setup
|
||||
setup_static_ip "192.168.1.100" "255.255.255.0" "192.168.1.1"
|
||||
|
||||
# DNS configuration
|
||||
setup_dns "8.8.8.8 8.8.4.4"
|
||||
|
||||
# IPv6 support
|
||||
setup_ipv6
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### ✅ DO
|
||||
- Validate cloud-config syntax before applying
|
||||
- Use cloud-init for automated setup
|
||||
- Deploy SSH keys for secure access
|
||||
- Test cloud-init configuration in non-production first
|
||||
- Use DHCP for easier VM deployment
|
||||
- Document custom cloud-init configurations
|
||||
- Version control cloud-init templates
|
||||
|
||||
### ❌ DON'T
|
||||
- Use weak SSH keys or passwords
|
||||
- Leave SSH password authentication enabled
|
||||
- Hardcode credentials in cloud-init
|
||||
- Skip validation of cloud-config
|
||||
- Use untrusted cloud-init sources
|
||||
- Forget to set timezone on VMs
|
||||
- Mix cloud-init versions
|
||||
|
||||
## Cloud-Config Format
|
||||
|
||||
### Example Cloud-Config
|
||||
```yaml
|
||||
#cloud-config
|
||||
# This is a comment
|
||||
|
||||
# System configuration
|
||||
hostname: myvm
|
||||
timezone: UTC
|
||||
package_upgrade: true
|
||||
|
||||
# Packages to install
|
||||
packages:
|
||||
- curl
|
||||
- wget
|
||||
- git
|
||||
- build-essential
|
||||
|
||||
# SSH keys for users
|
||||
ssh_authorized_keys:
|
||||
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...
|
||||
|
||||
# Users to create
|
||||
users:
|
||||
- name: ubuntu
|
||||
home: /home/ubuntu
|
||||
shell: /bin/bash
|
||||
sudo: ['ALL=(ALL) NOPASSWD:ALL']
|
||||
ssh_authorized_keys:
|
||||
- ssh-rsa AAAAB3...
|
||||
|
||||
# Commands to run on boot
|
||||
runcmd:
|
||||
- apt-get update
|
||||
- apt-get upgrade -y
|
||||
- systemctl restart ssh
|
||||
|
||||
# Files to create
|
||||
write_files:
|
||||
- path: /etc/profile.d/custom.sh
|
||||
content: |
|
||||
export CUSTOM_VAR="value"
|
||||
```
|
||||
|
||||
## VM Network Configuration
|
||||
|
||||
### DHCP Configuration
|
||||
```bash
|
||||
network:
|
||||
version: 2
|
||||
ethernets:
|
||||
eth0:
|
||||
dhcp4: true
|
||||
dhcp6: true
|
||||
```
|
||||
|
||||
### Static IP Configuration
|
||||
```bash
|
||||
network:
|
||||
version: 2
|
||||
ethernets:
|
||||
eth0:
|
||||
addresses:
|
||||
- 192.168.1.100/24
|
||||
gateway4: 192.168.1.1
|
||||
nameservers:
|
||||
addresses: [8.8.8.8, 8.8.4.4]
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "Cloud-Init Configuration Not Applied"
|
||||
```bash
|
||||
# Check cloud-init status in VM
|
||||
cloud-init status
|
||||
cloud-init status --long
|
||||
|
||||
# View cloud-init logs
|
||||
tail /var/log/cloud-init.log
|
||||
```
|
||||
|
||||
### "SSH Keys Not Deployed"
|
||||
```bash
|
||||
# Verify SSH key in cloud-config
|
||||
grep ssh_authorized_keys user-data.txt
|
||||
|
||||
# Check permissions
|
||||
ls -la ~/.ssh/authorized_keys
|
||||
```
|
||||
|
||||
### "Network Not Configured"
|
||||
```bash
|
||||
# Check network configuration
|
||||
ip addr show
|
||||
ip route show
|
||||
|
||||
# View netplan (if used)
|
||||
cat /etc/netplan/*.yaml
|
||||
```
|
||||
|
||||
### "Packages Failed to Install"
|
||||
```bash
|
||||
# Check cloud-init package log
|
||||
tail /var/log/cloud-init-output.log
|
||||
|
||||
# Manual package installation
|
||||
apt-get update && apt-get install -y package-name
|
||||
```
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- **[install.func/](../install.func/)** - Container installation (similar workflow)
|
||||
- **[core.func/](../core.func/)** - Utility functions
|
||||
- **[error_handler.func/](../error_handler.func/)** - Error handling
|
||||
- **[UPDATED_APP-install.md](../../UPDATED_APP-install.md)** - Application setup guide
|
||||
- **Proxmox Docs**: https://pve.proxmox.com/wiki/Cloud-Init
|
||||
|
||||
## Recent Updates
|
||||
|
||||
### Version 2.0 (Dec 2025)
|
||||
- ✅ Enhanced cloud-init validation
|
||||
- ✅ Improved SSH key deployment
|
||||
- ✅ Better network configuration support
|
||||
- ✅ Added IPv6 support
|
||||
- ✅ Streamlined user and package setup
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
**Maintainers**: community-scripts team
|
||||
**License**: MIT
|
||||
316
docs/misc/core.func/CORE_FLOWCHART.md
Normal file
316
docs/misc/core.func/CORE_FLOWCHART.md
Normal file
@ -0,0 +1,316 @@
|
||||
# core.func Execution Flowchart
|
||||
|
||||
## Main Execution Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ core.func Loading │
|
||||
│ Entry point when core.func is sourced by other scripts │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Load Prevention Check │
|
||||
│ • Check if _CORE_FUNC_LOADED is set │
|
||||
│ • Return early if already loaded │
|
||||
│ • Set _CORE_FUNC_LOADED=1 to prevent reloading │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ LOAD_FUNCTIONS() │
|
||||
│ Main function loader - sets up all core utilities │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Core Function Loading Sequence │
|
||||
│ │
|
||||
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────────────┐ │
|
||||
│ │ color() │ │ formatting() │ │ icons() │ │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ │ • Set ANSI │ │ • Set format │ │ • Set symbolic icons │ │
|
||||
│ │ color codes │ │ helpers │ │ • Define message │ │
|
||||
│ │ • Define │ │ • Tab, bold, │ │ symbols │ │
|
||||
│ │ colors │ │ line reset │ │ • Status indicators │ │
|
||||
│ └─────────────────┘ └─────────────────┘ └─────────────────────────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────────────┐ │
|
||||
│ │ default_vars() │ │ set_std_mode() │ │ Additional Functions │ │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ │ • Set retry │ │ • Set verbose │ │ • Add more functions │ │
|
||||
│ │ variables │ │ mode │ │ as needed │ │
|
||||
│ │ • Initialize │ │ • Configure │ │ │ │
|
||||
│ │ counters │ │ STD variable │ │ │ │
|
||||
│ └─────────────────┘ └─────────────────┘ └─────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## System Check Functions Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ System Validation Flow │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ PVE_CHECK() │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Get PVE │ │ Check PVE │ │ Check PVE │ │ │
|
||||
│ │ │ Version │ │ 8.x Support │ │ 9.x Support │ │ │
|
||||
│ │ │ │ │ │ │ │ │ │
|
||||
│ │ │ • pveversion │ │ • Allow 8.0-8.9│ │ • Allow ONLY 9.0 │ │ │
|
||||
│ │ │ • Parse version │ │ • Reject others │ │ • Reject 9.1+ │ │ │
|
||||
│ │ │ • Extract │ │ • Exit if │ │ • Exit if │ │ │
|
||||
│ │ │ major.minor │ │ unsupported │ │ unsupported │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ ARCH_CHECK() │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Check │ │ AMD64 Check │ │ PiMox Warning │ │ │
|
||||
│ │ │ Architecture │ │ │ │ │ │ │
|
||||
│ │ │ │ │ • dpkg --print- │ │ • Show PiMox │ │ │
|
||||
│ │ │ • Get system │ │ architecture │ │ message │ │ │
|
||||
│ │ │ architecture │ │ • Must be │ │ • Point to ARM64 │ │ │
|
||||
│ │ │ • Compare with │ │ "amd64" │ │ support │ │ │
|
||||
│ │ │ "amd64" │ │ • Exit if not │ │ • Exit script │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ SHELL_CHECK() │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Check │ │ Bash Check │ │ Error Handling │ │ │
|
||||
│ │ │ Shell Type │ │ │ │ │ │ │
|
||||
│ │ │ │ │ • ps -p $$ -o │ │ • Clear screen │ │ │
|
||||
│ │ │ • Get current │ │ comm= │ │ • Show error │ │ │
|
||||
│ │ │ shell │ │ • Must be │ │ • Sleep and exit │ │ │
|
||||
│ │ │ • Compare with │ │ "bash" │ │ │ │ │
|
||||
│ │ │ "bash" │ │ • Exit if not │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ ROOT_CHECK() │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Check │ │ Root Check │ │ Sudo Check │ │ │
|
||||
│ │ │ User ID │ │ │ │ │ │ │
|
||||
│ │ │ │ │ • id -u │ │ • Check parent │ │ │
|
||||
│ │ │ • Get user ID │ │ • Must be 0 │ │ process │ │ │
|
||||
│ │ │ • Check if │ │ • Exit if not │ │ • Detect sudo │ │ │
|
||||
│ │ │ root (0) │ │ root │ │ usage │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Message System Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Message System Flow │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ MSG_INFO() │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Message │ │ Duplicate │ │ Display Mode │ │ │
|
||||
│ │ │ Validation │ │ Check │ │ Selection │ │ │
|
||||
│ │ │ │ │ │ │ │ │ │
|
||||
│ │ │ • Check if │ │ • Track shown │ │ • Verbose mode: │ │ │
|
||||
│ │ │ message │ │ messages │ │ Show directly │ │ │
|
||||
│ │ │ exists │ │ • Skip if │ │ • Normal mode: │ │ │
|
||||
│ │ │ • Return if │ │ already │ │ Start spinner │ │ │
|
||||
│ │ │ empty │ │ shown │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ SPINNER() │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Spinner │ │ Animation │ │ Display │ │ │
|
||||
│ │ │ Initialization│ │ Loop │ │ Control │ │ │
|
||||
│ │ │ │ │ │ │ │ │ │
|
||||
│ │ │ • Define │ │ • Cycle through │ │ • Print spinner │ │ │
|
||||
│ │ │ characters │ │ characters │ │ character │ │ │
|
||||
│ │ │ • Set index │ │ • Sleep 0.1s │ │ • Print message │ │ │
|
||||
│ │ │ • Start loop │ │ • Increment │ │ • Clear line │ │ │
|
||||
│ │ │ │ │ index │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ STOP_SPINNER() │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Get Spinner │ │ Kill Process │ │ Cleanup │ │ │
|
||||
│ │ │ PID │ │ │ │ │ │ │
|
||||
│ │ │ │ │ • Send TERM │ │ • Remove PID file │ │ │
|
||||
│ │ │ • From │ │ • Wait for │ │ • Unset variables │ │ │
|
||||
│ │ │ SPINNER_PID │ │ termination │ │ • Reset terminal │ │ │
|
||||
│ │ │ • From PID │ │ • Force kill │ │ settings │ │ │
|
||||
│ │ │ file │ │ if needed │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Silent Execution Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ SILENT() Execution Flow │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Command Execution │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Setup │ │ Execute │ │ Capture Output │ │ │
|
||||
│ │ │ Environment │ │ Command │ │ │ │ │
|
||||
│ │ │ │ │ │ │ • Redirect stdout │ │ │
|
||||
│ │ │ • Disable │ │ • Run command │ │ to log file │ │ │
|
||||
│ │ │ error │ │ • Capture │ │ • Redirect stderr │ │ │
|
||||
│ │ │ handling │ │ return code │ │ to log file │ │ │
|
||||
│ │ │ • Remove │ │ • Store exit │ │ • Log all output │ │ │
|
||||
│ │ │ traps │ │ code │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Error Handling │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Check Exit │ │ Load Error │ │ Display Error │ │ │
|
||||
│ │ │ Code │ │ Handler │ │ Information │ │ │
|
||||
│ │ │ │ │ │ │ │ │ │
|
||||
│ │ │ • If exit code │ │ • Source │ │ • Show error code │ │ │
|
||||
│ │ │ != 0 │ │ error_handler │ │ • Show explanation │ │ │
|
||||
│ │ │ • Proceed to │ │ if needed │ │ • Show command │ │ │
|
||||
│ │ │ error │ │ • Get error │ │ • Show log lines │ │ │
|
||||
│ │ │ handling │ │ explanation │ │ • Show full log │ │ │
|
||||
│ │ │ │ │ │ │ command │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Log Management │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Log File │ │ Log Display │ │ Log Access │ │ │
|
||||
│ │ │ Management │ │ │ │ │ │ │
|
||||
│ │ │ │ │ • Show last 10 │ │ • Provide command │ │ │
|
||||
│ │ │ • Create log │ │ lines │ │ to view full log │ │ │
|
||||
│ │ │ file path │ │ • Count total │ │ • Show line count │ │ │
|
||||
│ │ │ • Use process │ │ lines │ │ • Enable debugging │ │ │
|
||||
│ │ │ ID in name │ │ • Format │ │ │ │ │
|
||||
│ │ │ │ │ output │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Header Management Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Header Management Flow │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ GET_HEADER() │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Prepare │ │ Check Local │ │ Download Header │ │ │
|
||||
│ │ │ Parameters │ │ File │ │ │ │ │
|
||||
│ │ │ │ │ │ │ • Construct URL │ │ │
|
||||
│ │ │ • Get app name │ │ • Check if │ │ • Download file │ │ │
|
||||
│ │ │ from APP │ │ file exists │ │ • Save to local │ │ │
|
||||
│ │ │ • Get app type │ │ • Check if │ │ path │ │ │
|
||||
│ │ │ from APP_TYPE │ │ file has │ │ • Return success │ │ │
|
||||
│ │ │ • Construct │ │ content │ │ status │ │ │
|
||||
│ │ │ paths │ │ • Return if │ │ │ │ │
|
||||
│ │ │ │ │ available │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ HEADER_INFO() │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Get Header │ │ Clear Screen │ │ Display Header │ │ │
|
||||
│ │ │ Content │ │ │ │ │ │ │
|
||||
│ │ │ │ │ • Clear │ │ • Show header │ │ │
|
||||
│ │ │ • Call │ │ terminal │ │ content if │ │ │
|
||||
│ │ │ get_header() │ │ • Get terminal │ │ available │ │ │
|
||||
│ │ │ • Handle │ │ width │ │ • Format output │ │ │
|
||||
│ │ │ errors │ │ • Set default │ │ • Center content │ │ │
|
||||
│ │ │ • Return │ │ width if │ │ if possible │ │ │
|
||||
│ │ │ content │ │ needed │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Swap Management Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ CHECK_OR_CREATE_SWAP() Flow │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Swap Detection │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Check Active │ │ Swap Found │ │ No Swap Found │ │ │
|
||||
│ │ │ Swap │ │ │ │ │ │ │
|
||||
│ │ │ │ │ • Show success │ │ • Show error │ │ │
|
||||
│ │ │ • Use swapon │ │ message │ │ message │ │ │
|
||||
│ │ │ command │ │ • Return 0 │ │ • Ask user for │ │ │
|
||||
│ │ │ • Check for │ │ │ │ creation │ │ │
|
||||
│ │ │ swap devices │ │ │ │ • Proceed to │ │ │
|
||||
│ │ │ • Return │ │ │ │ creation flow │ │ │
|
||||
│ │ │ status │ │ │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Swap Creation │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ User Input │ │ Size │ │ File Creation │ │ │
|
||||
│ │ │ Collection │ │ Validation │ │ │ │ │
|
||||
│ │ │ │ │ │ │ • Create swap file │ │ │
|
||||
│ │ │ • Ask for │ │ • Validate │ │ with dd │ │ │
|
||||
│ │ │ confirmation │ │ numeric input │ │ • Set permissions │ │ │
|
||||
│ │ │ • Convert to │ │ • Check range │ │ • Format swap │ │ │
|
||||
│ │ │ lowercase │ │ • Abort if │ │ • Activate swap │ │ │
|
||||
│ │ │ • Check for │ │ invalid │ │ • Show success │ │ │
|
||||
│ │ │ y/yes │ │ │ │ message │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Integration Points
|
||||
|
||||
### With Other Scripts
|
||||
- **build.func**: Provides system checks and UI functions
|
||||
- **tools.func**: Uses core utilities for extended operations
|
||||
- **api.func**: Uses system checks and error handling
|
||||
- **error_handler.func**: Provides error explanations for silent execution
|
||||
|
||||
### External Dependencies
|
||||
- **curl**: For downloading header files
|
||||
- **tput**: For terminal control (installed if missing)
|
||||
- **swapon/mkswap**: For swap management
|
||||
- **pveversion**: For Proxmox version checking
|
||||
|
||||
### Data Flow
|
||||
- **Input**: Environment variables, command parameters
|
||||
- **Processing**: System validation, UI rendering, command execution
|
||||
- **Output**: Messages, log files, exit codes, system state changes
|
||||
637
docs/misc/core.func/CORE_FUNCTIONS_REFERENCE.md
Normal file
637
docs/misc/core.func/CORE_FUNCTIONS_REFERENCE.md
Normal file
@ -0,0 +1,637 @@
|
||||
# core.func Functions Reference
|
||||
|
||||
## Overview
|
||||
|
||||
This document provides a comprehensive alphabetical reference of all functions in `core.func`, including parameters, dependencies, usage examples, and error handling.
|
||||
|
||||
## Function Categories
|
||||
|
||||
### Initialization Functions
|
||||
|
||||
#### `load_functions()`
|
||||
**Purpose**: Main function loader that initializes all core utilities
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Sets `__FUNCTIONS_LOADED=1` to prevent reloading
|
||||
- Calls all core function groups in sequence
|
||||
- Initializes color, formatting, icons, defaults, and standard mode
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `__FUNCTIONS_LOADED`
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
# Automatically called when core.func is sourced
|
||||
source core.func
|
||||
# load_functions() is called automatically
|
||||
```
|
||||
|
||||
### Color and Formatting Functions
|
||||
|
||||
#### `color()`
|
||||
**Purpose**: Set ANSI color codes for styled terminal output
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**: Sets global color variables
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Sets Variables**:
|
||||
- `YW`: Yellow
|
||||
- `YWB`: Bright yellow
|
||||
- `BL`: Blue
|
||||
- `RD`: Red
|
||||
- `BGN`: Bright green
|
||||
- `GN`: Green
|
||||
- `DGN`: Dark green
|
||||
- `CL`: Clear/reset
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
color
|
||||
echo -e "${GN}Success message${CL}"
|
||||
echo -e "${RD}Error message${CL}"
|
||||
```
|
||||
|
||||
#### `color_spinner()`
|
||||
**Purpose**: Set color codes specifically for spinner output
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**: Sets spinner-specific color variables
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Sets Variables**:
|
||||
- `CS_YW`: Yellow for spinner
|
||||
- `CS_YWB`: Bright yellow for spinner
|
||||
- `CS_CL`: Clear for spinner
|
||||
|
||||
#### `formatting()`
|
||||
**Purpose**: Define formatting helpers for terminal output
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**: Sets global formatting variables
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Sets Variables**:
|
||||
- `BFR`: Back and forward reset
|
||||
- `BOLD`: Bold text
|
||||
- `HOLD`: Space character
|
||||
- `TAB`: Two spaces
|
||||
- `TAB3`: Six spaces
|
||||
|
||||
### Icon Functions
|
||||
|
||||
#### `icons()`
|
||||
**Purpose**: Set symbolic icons used throughout user feedback and prompts
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**: Sets global icon variables
|
||||
**Dependencies**: `formatting()` (for TAB variable)
|
||||
**Environment Variables Used**: `TAB`, `CL`
|
||||
|
||||
**Sets Variables**:
|
||||
- `CM`: Check mark
|
||||
- `CROSS`: Cross mark
|
||||
- `DNSOK`: DNS success
|
||||
- `DNSFAIL`: DNS failure
|
||||
- `INFO`: Information icon
|
||||
- `OS`: Operating system icon
|
||||
- `OSVERSION`: OS version icon
|
||||
- `CONTAINERTYPE`: Container type icon
|
||||
- `DISKSIZE`: Disk size icon
|
||||
- `CPUCORE`: CPU core icon
|
||||
- `RAMSIZE`: RAM size icon
|
||||
- `SEARCH`: Search icon
|
||||
- `VERBOSE_CROPPED`: Verbose mode icon
|
||||
- `VERIFYPW`: Password verification icon
|
||||
- `CONTAINERID`: Container ID icon
|
||||
- `HOSTNAME`: Hostname icon
|
||||
- `BRIDGE`: Bridge icon
|
||||
- `NETWORK`: Network icon
|
||||
- `GATEWAY`: Gateway icon
|
||||
- `DISABLEIPV6`: IPv6 disable icon
|
||||
- `DEFAULT`: Default settings icon
|
||||
- `MACADDRESS`: MAC address icon
|
||||
- `VLANTAG`: VLAN tag icon
|
||||
- `ROOTSSH`: SSH key icon
|
||||
- `CREATING`: Creating icon
|
||||
- `ADVANCED`: Advanced settings icon
|
||||
- `FUSE`: FUSE icon
|
||||
- `HOURGLASS`: Hourglass icon
|
||||
|
||||
### Default Variables Functions
|
||||
|
||||
#### `default_vars()`
|
||||
**Purpose**: Set default retry and wait variables for system actions
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**: Sets retry configuration variables
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Sets Variables**:
|
||||
- `RETRY_NUM`: Number of retry attempts (default: 10)
|
||||
- `RETRY_EVERY`: Seconds between retries (default: 3)
|
||||
- `i`: Retry counter initialized to RETRY_NUM
|
||||
|
||||
#### `set_std_mode()`
|
||||
**Purpose**: Set default verbose mode for script execution
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**: Sets STD variable based on VERBOSE setting
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `VERBOSE`
|
||||
|
||||
**Sets Variables**:
|
||||
- `STD`: "silent" if VERBOSE != "yes", empty string if VERBOSE = "yes"
|
||||
|
||||
### Silent Execution Functions
|
||||
|
||||
#### `silent()`
|
||||
**Purpose**: Execute commands silently with detailed error reporting
|
||||
**Parameters**: `$*` - Command and arguments to execute
|
||||
**Returns**: None (exits on error)
|
||||
**Side Effects**:
|
||||
- Executes command with output redirected to log file
|
||||
- On error, displays detailed error information
|
||||
- Exits with command's exit code
|
||||
**Dependencies**: `error_handler.func` (for error explanations)
|
||||
**Environment Variables Used**: `SILENT_LOGFILE`
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
silent apt-get update
|
||||
silent apt-get install -y package-name
|
||||
```
|
||||
|
||||
**Error Handling**:
|
||||
- Captures command output to `/tmp/silent.$$.log`
|
||||
- Shows error code explanation
|
||||
- Displays last 10 lines of log
|
||||
- Provides command to view full log
|
||||
|
||||
### System Check Functions
|
||||
|
||||
#### `shell_check()`
|
||||
**Purpose**: Verify that the script is running in Bash shell
|
||||
**Parameters**: None
|
||||
**Returns**: None (exits if not Bash)
|
||||
**Side Effects**:
|
||||
- Checks current shell process
|
||||
- Exits with error message if not Bash
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
shell_check
|
||||
# Script continues if Bash, exits if not
|
||||
```
|
||||
|
||||
#### `root_check()`
|
||||
**Purpose**: Ensure script is running as root user
|
||||
**Parameters**: None
|
||||
**Returns**: None (exits if not root)
|
||||
**Side Effects**:
|
||||
- Checks user ID and parent process
|
||||
- Exits with error message if not root
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
root_check
|
||||
# Script continues if root, exits if not
|
||||
```
|
||||
|
||||
#### `pve_check()`
|
||||
**Purpose**: Verify Proxmox VE version compatibility
|
||||
**Parameters**: None
|
||||
**Returns**: None (exits if unsupported version)
|
||||
**Side Effects**:
|
||||
- Checks PVE version using pveversion command
|
||||
- Exits with error message if unsupported
|
||||
**Dependencies**: `pveversion` command
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Supported Versions**:
|
||||
- Proxmox VE 8.0 - 8.9
|
||||
- Proxmox VE 9.0 (only)
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
pve_check
|
||||
# Script continues if supported version, exits if not
|
||||
```
|
||||
|
||||
#### `arch_check()`
|
||||
**Purpose**: Verify system architecture is AMD64
|
||||
**Parameters**: None
|
||||
**Returns**: None (exits if not AMD64)
|
||||
**Side Effects**:
|
||||
- Checks system architecture
|
||||
- Exits with PiMox warning if not AMD64
|
||||
**Dependencies**: `dpkg` command
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
arch_check
|
||||
# Script continues if AMD64, exits if not
|
||||
```
|
||||
|
||||
#### `ssh_check()`
|
||||
**Purpose**: Detect and warn about external SSH usage
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Checks SSH_CLIENT environment variable
|
||||
- Warns if connecting from external IP
|
||||
- Allows local connections (127.0.0.1 or host IP)
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `SSH_CLIENT`
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
ssh_check
|
||||
# Shows warning if external SSH, continues anyway
|
||||
```
|
||||
|
||||
### Header Management Functions
|
||||
|
||||
#### `get_header()`
|
||||
**Purpose**: Download and cache application header files
|
||||
**Parameters**: None (uses APP and APP_TYPE variables)
|
||||
**Returns**: Header content on success, empty on failure
|
||||
**Side Effects**:
|
||||
- Downloads header from remote URL
|
||||
- Caches header locally
|
||||
- Creates directory structure if needed
|
||||
**Dependencies**: `curl` command
|
||||
**Environment Variables Used**: `APP`, `APP_TYPE`
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
export APP="plex"
|
||||
export APP_TYPE="ct"
|
||||
header_content=$(get_header)
|
||||
```
|
||||
|
||||
#### `header_info()`
|
||||
**Purpose**: Display application header information
|
||||
**Parameters**: None (uses APP variable)
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Clears screen
|
||||
- Displays header content
|
||||
- Gets terminal width for formatting
|
||||
**Dependencies**: `get_header()`, `tput` command
|
||||
**Environment Variables Used**: `APP`
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
export APP="plex"
|
||||
header_info
|
||||
# Displays Plex header information
|
||||
```
|
||||
|
||||
### Utility Functions
|
||||
|
||||
#### `ensure_tput()`
|
||||
**Purpose**: Ensure tput command is available for terminal control
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Installs ncurses package if tput missing
|
||||
- Works on Alpine and Debian-based systems
|
||||
**Dependencies**: `apk` or `apt-get` package managers
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
ensure_tput
|
||||
# Installs ncurses if needed, continues if already available
|
||||
```
|
||||
|
||||
#### `is_alpine()`
|
||||
**Purpose**: Detect if running on Alpine Linux
|
||||
**Parameters**: None
|
||||
**Returns**: 0 if Alpine, 1 if not Alpine
|
||||
**Side Effects**: None
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `var_os`, `PCT_OSTYPE`
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
if is_alpine; then
|
||||
echo "Running on Alpine Linux"
|
||||
else
|
||||
echo "Not running on Alpine Linux"
|
||||
fi
|
||||
```
|
||||
|
||||
#### `is_verbose_mode()`
|
||||
**Purpose**: Check if verbose mode is enabled
|
||||
**Parameters**: None
|
||||
**Returns**: 0 if verbose mode, 1 if not verbose
|
||||
**Side Effects**: None
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `VERBOSE`, `var_verbose`
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
if is_verbose_mode; then
|
||||
echo "Verbose mode enabled"
|
||||
else
|
||||
echo "Verbose mode disabled"
|
||||
fi
|
||||
```
|
||||
|
||||
#### `fatal()`
|
||||
**Purpose**: Display fatal error and terminate script
|
||||
**Parameters**: `$1` - Error message
|
||||
**Returns**: None (terminates script)
|
||||
**Side Effects**:
|
||||
- Displays error message
|
||||
- Sends INT signal to current process
|
||||
**Dependencies**: `msg_error()`
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
fatal "Critical error occurred"
|
||||
# Script terminates after displaying error
|
||||
```
|
||||
|
||||
### Spinner Functions
|
||||
|
||||
#### `spinner()`
|
||||
**Purpose**: Display animated spinner for progress indication
|
||||
**Parameters**: None (uses SPINNER_MSG variable)
|
||||
**Returns**: None (runs indefinitely)
|
||||
**Side Effects**:
|
||||
- Displays rotating spinner characters
|
||||
- Uses terminal control sequences
|
||||
**Dependencies**: `color_spinner()`
|
||||
**Environment Variables Used**: `SPINNER_MSG`
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
SPINNER_MSG="Processing..."
|
||||
spinner &
|
||||
SPINNER_PID=$!
|
||||
# Spinner runs in background
|
||||
```
|
||||
|
||||
#### `clear_line()`
|
||||
**Purpose**: Clear current terminal line
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**: Clears current line using terminal control
|
||||
**Dependencies**: `tput` command
|
||||
**Environment Variables Used**: None
|
||||
|
||||
#### `stop_spinner()`
|
||||
**Purpose**: Stop running spinner and cleanup
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Kills spinner process
|
||||
- Removes PID file
|
||||
- Resets terminal settings
|
||||
- Unsets spinner variables
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `SPINNER_PID`, `SPINNER_MSG`
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
stop_spinner
|
||||
# Stops spinner and cleans up
|
||||
```
|
||||
|
||||
### Message Functions
|
||||
|
||||
#### `msg_info()`
|
||||
**Purpose**: Display informational message with spinner
|
||||
**Parameters**: `$1` - Message text
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Starts spinner if not in verbose mode
|
||||
- Tracks shown messages to prevent duplicates
|
||||
- Displays message with hourglass icon in verbose mode
|
||||
**Dependencies**: `spinner()`, `is_verbose_mode()`, `is_alpine()`
|
||||
**Environment Variables Used**: `MSG_INFO_SHOWN`
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
msg_info "Installing package..."
|
||||
# Shows spinner with message
|
||||
```
|
||||
|
||||
#### `msg_ok()`
|
||||
**Purpose**: Display success message
|
||||
**Parameters**: `$1` - Success message text
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Stops spinner
|
||||
- Displays green checkmark with message
|
||||
- Removes message from shown tracking
|
||||
**Dependencies**: `stop_spinner()`
|
||||
**Environment Variables Used**: `MSG_INFO_SHOWN`
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
msg_ok "Package installed successfully"
|
||||
# Shows green checkmark with message
|
||||
```
|
||||
|
||||
#### `msg_error()`
|
||||
**Purpose**: Display error message
|
||||
**Parameters**: `$1` - Error message text
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Stops spinner
|
||||
- Displays red cross with message
|
||||
**Dependencies**: `stop_spinner()`
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
msg_error "Installation failed"
|
||||
# Shows red cross with message
|
||||
```
|
||||
|
||||
#### `msg_warn()`
|
||||
**Purpose**: Display warning message
|
||||
**Parameters**: `$1` - Warning message text
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Stops spinner
|
||||
- Displays yellow info icon with message
|
||||
**Dependencies**: `stop_spinner()`
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
msg_warn "This operation may take some time"
|
||||
# Shows yellow info icon with message
|
||||
```
|
||||
|
||||
#### `msg_custom()`
|
||||
**Purpose**: Display custom message with specified symbol and color
|
||||
**Parameters**:
|
||||
- `$1` - Custom symbol (default: "[*]")
|
||||
- `$2` - Color code (default: "\e[36m")
|
||||
- `$3` - Message text
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Stops spinner
|
||||
- Displays custom formatted message
|
||||
**Dependencies**: `stop_spinner()`
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
msg_custom "⚡" "\e[33m" "Custom warning message"
|
||||
# Shows custom symbol and color with message
|
||||
```
|
||||
|
||||
#### `msg_debug()`
|
||||
**Purpose**: Display debug message if debug mode enabled
|
||||
**Parameters**: `$*` - Debug message text
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Only displays if var_full_verbose is set
|
||||
- Shows timestamp and debug prefix
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `var_full_verbose`, `var_verbose`
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
export var_full_verbose=1
|
||||
msg_debug "Debug information here"
|
||||
# Shows debug message with timestamp
|
||||
```
|
||||
|
||||
### System Management Functions
|
||||
|
||||
#### `check_or_create_swap()`
|
||||
**Purpose**: Check for active swap and optionally create swap file
|
||||
**Parameters**: None
|
||||
**Returns**: 0 if swap exists or created, 1 if skipped
|
||||
**Side Effects**:
|
||||
- Checks for active swap
|
||||
- Prompts user to create swap if none found
|
||||
- Creates swap file if user confirms
|
||||
**Dependencies**: `swapon`, `dd`, `mkswap` commands
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
if check_or_create_swap; then
|
||||
echo "Swap is available"
|
||||
else
|
||||
echo "No swap available"
|
||||
fi
|
||||
```
|
||||
|
||||
## Function Call Hierarchy
|
||||
|
||||
### Initialization Flow
|
||||
```
|
||||
load_functions()
|
||||
├── color()
|
||||
├── formatting()
|
||||
├── icons()
|
||||
├── default_vars()
|
||||
└── set_std_mode()
|
||||
```
|
||||
|
||||
### Message System Flow
|
||||
```
|
||||
msg_info()
|
||||
├── is_verbose_mode()
|
||||
├── is_alpine()
|
||||
├── spinner()
|
||||
└── color_spinner()
|
||||
|
||||
msg_ok()
|
||||
├── stop_spinner()
|
||||
└── clear_line()
|
||||
|
||||
msg_error()
|
||||
└── stop_spinner()
|
||||
|
||||
msg_warn()
|
||||
└── stop_spinner()
|
||||
```
|
||||
|
||||
### System Check Flow
|
||||
```
|
||||
pve_check()
|
||||
├── pveversion command
|
||||
└── version parsing
|
||||
|
||||
arch_check()
|
||||
├── dpkg command
|
||||
└── architecture check
|
||||
|
||||
shell_check()
|
||||
├── ps command
|
||||
└── shell detection
|
||||
|
||||
root_check()
|
||||
├── id command
|
||||
└── parent process check
|
||||
```
|
||||
|
||||
### Silent Execution Flow
|
||||
```
|
||||
silent()
|
||||
├── Command execution
|
||||
├── Output redirection
|
||||
├── Error handling
|
||||
├── error_handler.func loading
|
||||
└── Log management
|
||||
```
|
||||
|
||||
## Error Handling Patterns
|
||||
|
||||
### System Check Errors
|
||||
- All system check functions exit with appropriate error messages
|
||||
- Clear indication of what's wrong and how to fix it
|
||||
- Graceful exit with sleep delay for user to read message
|
||||
|
||||
### Silent Execution Errors
|
||||
- Commands executed via `silent()` capture output to log file
|
||||
- On failure, displays error code explanation
|
||||
- Shows last 10 lines of log output
|
||||
- Provides command to view full log
|
||||
|
||||
### Spinner Errors
|
||||
- Spinner functions handle process cleanup on exit
|
||||
- Trap handlers ensure spinners are stopped
|
||||
- Terminal settings are restored on error
|
||||
|
||||
## Environment Variable Dependencies
|
||||
|
||||
### Required Variables
|
||||
- `APP`: Application name for header display
|
||||
- `APP_TYPE`: Application type (ct/vm) for header paths
|
||||
- `VERBOSE`: Verbose mode setting
|
||||
|
||||
### Optional Variables
|
||||
- `var_os`: OS type for Alpine detection
|
||||
- `PCT_OSTYPE`: Alternative OS type variable
|
||||
- `var_verbose`: Alternative verbose setting
|
||||
- `var_full_verbose`: Debug mode setting
|
||||
|
||||
### Internal Variables
|
||||
- `_CORE_FUNC_LOADED`: Prevents multiple loading
|
||||
- `__FUNCTIONS_LOADED`: Prevents multiple function loading
|
||||
- `SILENT_LOGFILE`: Silent execution log file path
|
||||
- `SPINNER_PID`: Spinner process ID
|
||||
- `SPINNER_MSG`: Spinner message text
|
||||
- `MSG_INFO_SHOWN`: Tracks shown info messages
|
||||
517
docs/misc/core.func/CORE_INTEGRATION.md
Normal file
517
docs/misc/core.func/CORE_INTEGRATION.md
Normal file
@ -0,0 +1,517 @@
|
||||
# core.func Integration Guide
|
||||
|
||||
## Overview
|
||||
|
||||
This document describes how `core.func` integrates with other components in the Proxmox Community Scripts project, including dependencies, data flow, and API surface.
|
||||
|
||||
## Dependencies
|
||||
|
||||
### External Dependencies
|
||||
|
||||
#### Required Commands
|
||||
- **`pveversion`**: Proxmox VE version checking
|
||||
- **`dpkg`**: Architecture detection
|
||||
- **`ps`**: Process and shell detection
|
||||
- **`id`**: User ID checking
|
||||
- **`curl`**: Header file downloading
|
||||
- **`swapon`**: Swap status checking
|
||||
- **`dd`**: Swap file creation
|
||||
- **`mkswap`**: Swap file formatting
|
||||
|
||||
#### Optional Commands
|
||||
- **`tput`**: Terminal control (installed if missing)
|
||||
- **`apk`**: Alpine package manager
|
||||
- **`apt-get`**: Debian package manager
|
||||
|
||||
### Internal Dependencies
|
||||
|
||||
#### error_handler.func
|
||||
- **Purpose**: Provides error code explanations for silent execution
|
||||
- **Usage**: Automatically loaded when `silent()` encounters errors
|
||||
- **Integration**: Called via `explain_exit_code()` function
|
||||
- **Data Flow**: Error code → explanation → user display
|
||||
|
||||
## Integration Points
|
||||
|
||||
### With build.func
|
||||
|
||||
#### System Validation
|
||||
```bash
|
||||
# build.func uses core.func for system checks
|
||||
source core.func
|
||||
pve_check
|
||||
arch_check
|
||||
shell_check
|
||||
root_check
|
||||
```
|
||||
|
||||
#### User Interface
|
||||
```bash
|
||||
# build.func uses core.func for UI elements
|
||||
msg_info "Creating container..."
|
||||
msg_ok "Container created successfully"
|
||||
msg_error "Container creation failed"
|
||||
```
|
||||
|
||||
#### Silent Execution
|
||||
```bash
|
||||
# build.func uses core.func for command execution
|
||||
silent pct create "$CTID" "$TEMPLATE" \
|
||||
--hostname "$HOSTNAME" \
|
||||
--memory "$MEMORY" \
|
||||
--cores "$CORES"
|
||||
```
|
||||
|
||||
### With tools.func
|
||||
|
||||
#### Utility Functions
|
||||
```bash
|
||||
# tools.func uses core.func utilities
|
||||
source core.func
|
||||
|
||||
# System checks
|
||||
pve_check
|
||||
root_check
|
||||
|
||||
# UI elements
|
||||
msg_info "Running maintenance tasks..."
|
||||
msg_ok "Maintenance completed"
|
||||
```
|
||||
|
||||
#### Error Handling
|
||||
```bash
|
||||
# tools.func uses core.func for error handling
|
||||
if silent systemctl restart service; then
|
||||
msg_ok "Service restarted"
|
||||
else
|
||||
msg_error "Service restart failed"
|
||||
fi
|
||||
```
|
||||
|
||||
### With api.func
|
||||
|
||||
#### System Validation
|
||||
```bash
|
||||
# api.func uses core.func for system checks
|
||||
source core.func
|
||||
pve_check
|
||||
root_check
|
||||
```
|
||||
|
||||
#### API Operations
|
||||
```bash
|
||||
# api.func uses core.func for API calls
|
||||
msg_info "Connecting to Proxmox API..."
|
||||
if silent curl -k -H "Authorization: PVEAPIToken=$API_TOKEN" \
|
||||
"$API_URL/api2/json/nodes/$NODE/lxc"; then
|
||||
msg_ok "API connection successful"
|
||||
else
|
||||
msg_error "API connection failed"
|
||||
fi
|
||||
```
|
||||
|
||||
### With error_handler.func
|
||||
|
||||
#### Error Explanations
|
||||
```bash
|
||||
# error_handler.func provides explanations for core.func
|
||||
explain_exit_code() {
|
||||
local code="$1"
|
||||
case "$code" in
|
||||
1) echo "General error" ;;
|
||||
2) echo "Misuse of shell builtins" ;;
|
||||
126) echo "Command invoked cannot execute" ;;
|
||||
127) echo "Command not found" ;;
|
||||
128) echo "Invalid argument to exit" ;;
|
||||
*) echo "Unknown error code" ;;
|
||||
esac
|
||||
}
|
||||
```
|
||||
|
||||
### With install.func
|
||||
|
||||
#### Installation Process
|
||||
```bash
|
||||
# install.func uses core.func for installation
|
||||
source core.func
|
||||
|
||||
# System checks
|
||||
pve_check
|
||||
root_check
|
||||
|
||||
# Installation steps
|
||||
msg_info "Installing packages..."
|
||||
silent apt-get update
|
||||
silent apt-get install -y package
|
||||
|
||||
msg_ok "Installation completed"
|
||||
```
|
||||
|
||||
### With alpine-install.func
|
||||
|
||||
#### Alpine-Specific Operations
|
||||
```bash
|
||||
# alpine-install.func uses core.func for Alpine operations
|
||||
source core.func
|
||||
|
||||
# Alpine detection
|
||||
if is_alpine; then
|
||||
msg_info "Detected Alpine Linux"
|
||||
silent apk add --no-cache package
|
||||
else
|
||||
msg_info "Detected Debian-based system"
|
||||
silent apt-get install -y package
|
||||
fi
|
||||
```
|
||||
|
||||
### With alpine-tools.func
|
||||
|
||||
#### Alpine Utilities
|
||||
```bash
|
||||
# alpine-tools.func uses core.func for Alpine tools
|
||||
source core.func
|
||||
|
||||
# Alpine-specific operations
|
||||
if is_alpine; then
|
||||
msg_info "Running Alpine-specific operations..."
|
||||
# Alpine tools logic
|
||||
msg_ok "Alpine operations completed"
|
||||
fi
|
||||
```
|
||||
|
||||
### With passthrough.func
|
||||
|
||||
#### Hardware Passthrough
|
||||
```bash
|
||||
# passthrough.func uses core.func for hardware operations
|
||||
source core.func
|
||||
|
||||
# System checks
|
||||
pve_check
|
||||
root_check
|
||||
|
||||
# Hardware operations
|
||||
msg_info "Configuring GPU passthrough..."
|
||||
if silent lspci | grep -i nvidia; then
|
||||
msg_ok "NVIDIA GPU detected"
|
||||
else
|
||||
msg_warn "No NVIDIA GPU found"
|
||||
fi
|
||||
```
|
||||
|
||||
### With vm-core.func
|
||||
|
||||
#### VM Operations
|
||||
```bash
|
||||
# vm-core.func uses core.func for VM management
|
||||
source core.func
|
||||
|
||||
# System checks
|
||||
pve_check
|
||||
root_check
|
||||
|
||||
# VM operations
|
||||
msg_info "Creating virtual machine..."
|
||||
silent qm create "$VMID" \
|
||||
--name "$VMNAME" \
|
||||
--memory "$MEMORY" \
|
||||
--cores "$CORES"
|
||||
|
||||
msg_ok "Virtual machine created"
|
||||
```
|
||||
|
||||
## Data Flow
|
||||
|
||||
### Input Data
|
||||
|
||||
#### Environment Variables
|
||||
- **`APP`**: Application name for header display
|
||||
- **`APP_TYPE`**: Application type (ct/vm) for header paths
|
||||
- **`VERBOSE`**: Verbose mode setting
|
||||
- **`var_os`**: OS type for Alpine detection
|
||||
- **`PCT_OSTYPE`**: Alternative OS type variable
|
||||
- **`var_verbose`**: Alternative verbose setting
|
||||
- **`var_full_verbose`**: Debug mode setting
|
||||
|
||||
#### Command Parameters
|
||||
- **Function arguments**: Passed to individual functions
|
||||
- **Command arguments**: Passed to `silent()` function
|
||||
- **User input**: Collected via `read` commands
|
||||
|
||||
### Processing Data
|
||||
|
||||
#### System Information
|
||||
- **Proxmox version**: Parsed from `pveversion` output
|
||||
- **Architecture**: Retrieved from `dpkg --print-architecture`
|
||||
- **Shell type**: Detected from process information
|
||||
- **User ID**: Retrieved from `id -u`
|
||||
- **SSH connection**: Detected from `SSH_CLIENT` environment
|
||||
|
||||
#### UI State
|
||||
- **Message tracking**: `MSG_INFO_SHOWN` associative array
|
||||
- **Spinner state**: `SPINNER_PID` and `SPINNER_MSG` variables
|
||||
- **Terminal state**: Cursor position and display mode
|
||||
|
||||
#### Error Information
|
||||
- **Exit codes**: Captured from command execution
|
||||
- **Log output**: Redirected to temporary log files
|
||||
- **Error explanations**: Retrieved from error_handler.func
|
||||
|
||||
### Output Data
|
||||
|
||||
#### User Interface
|
||||
- **Colored messages**: ANSI color codes for terminal output
|
||||
- **Icons**: Symbolic representations for different message types
|
||||
- **Spinners**: Animated progress indicators
|
||||
- **Formatted text**: Consistent message formatting
|
||||
|
||||
#### System State
|
||||
- **Exit codes**: Returned from functions
|
||||
- **Log files**: Created for silent execution
|
||||
- **Configuration**: Modified system settings
|
||||
- **Process state**: Spinner processes and cleanup
|
||||
|
||||
## API Surface
|
||||
|
||||
### Public Functions
|
||||
|
||||
#### System Validation
|
||||
- **`pve_check()`**: Proxmox VE version validation
|
||||
- **`arch_check()`**: Architecture validation
|
||||
- **`shell_check()`**: Shell validation
|
||||
- **`root_check()`**: Privilege validation
|
||||
- **`ssh_check()`**: SSH connection warning
|
||||
|
||||
#### User Interface
|
||||
- **`msg_info()`**: Informational messages
|
||||
- **`msg_ok()`**: Success messages
|
||||
- **`msg_error()`**: Error messages
|
||||
- **`msg_warn()`**: Warning messages
|
||||
- **`msg_custom()`**: Custom messages
|
||||
- **`msg_debug()`**: Debug messages
|
||||
|
||||
#### Spinner Control
|
||||
- **`spinner()`**: Start spinner animation
|
||||
- **`stop_spinner()`**: Stop spinner and cleanup
|
||||
- **`clear_line()`**: Clear current terminal line
|
||||
|
||||
#### Silent Execution
|
||||
- **`silent()`**: Execute commands with error handling
|
||||
|
||||
#### Utility Functions
|
||||
- **`is_alpine()`**: Alpine Linux detection
|
||||
- **`is_verbose_mode()`**: Verbose mode detection
|
||||
- **`fatal()`**: Fatal error handling
|
||||
- **`ensure_tput()`**: Terminal control setup
|
||||
|
||||
#### Header Management
|
||||
- **`get_header()`**: Download application headers
|
||||
- **`header_info()`**: Display header information
|
||||
|
||||
#### System Management
|
||||
- **`check_or_create_swap()`**: Swap file management
|
||||
|
||||
### Internal Functions
|
||||
|
||||
#### Initialization
|
||||
- **`load_functions()`**: Function loader
|
||||
- **`color()`**: Color setup
|
||||
- **`formatting()`**: Formatting setup
|
||||
- **`icons()`**: Icon setup
|
||||
- **`default_vars()`**: Default variables
|
||||
- **`set_std_mode()`**: Standard mode setup
|
||||
|
||||
#### Color Management
|
||||
- **`color_spinner()`**: Spinner colors
|
||||
|
||||
### Global Variables
|
||||
|
||||
#### Color Variables
|
||||
- **`YW`**, **`YWB`**, **`BL`**, **`RD`**, **`BGN`**, **`GN`**, **`DGN`**, **`CL`**: Color codes
|
||||
- **`CS_YW`**, **`CS_YWB`**, **`CS_CL`**: Spinner colors
|
||||
|
||||
#### Formatting Variables
|
||||
- **`BFR`**, **`BOLD`**, **`HOLD`**, **`TAB`**, **`TAB3`**: Formatting helpers
|
||||
|
||||
#### Icon Variables
|
||||
- **`CM`**, **`CROSS`**, **`INFO`**, **`OS`**, **`OSVERSION`**, etc.: Message icons
|
||||
|
||||
#### Configuration Variables
|
||||
- **`RETRY_NUM`**, **`RETRY_EVERY`**: Retry settings
|
||||
- **`STD`**: Standard mode setting
|
||||
- **`SILENT_LOGFILE`**: Log file path
|
||||
|
||||
#### State Variables
|
||||
- **`_CORE_FUNC_LOADED`**: Loading prevention
|
||||
- **`__FUNCTIONS_LOADED`**: Function loading prevention
|
||||
- **`SPINNER_PID`**, **`SPINNER_MSG`**: Spinner state
|
||||
- **`MSG_INFO_SHOWN`**: Message tracking
|
||||
|
||||
## Integration Patterns
|
||||
|
||||
### Standard Integration Pattern
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Standard integration pattern
|
||||
|
||||
# 1. Source core.func first
|
||||
source core.func
|
||||
|
||||
# 2. Run system checks
|
||||
pve_check
|
||||
arch_check
|
||||
shell_check
|
||||
root_check
|
||||
|
||||
# 3. Set up error handling
|
||||
trap 'stop_spinner' EXIT INT TERM
|
||||
|
||||
# 4. Use UI functions
|
||||
msg_info "Starting operation..."
|
||||
|
||||
# 5. Use silent execution
|
||||
silent command
|
||||
|
||||
# 6. Show completion
|
||||
msg_ok "Operation completed"
|
||||
```
|
||||
|
||||
### Minimal Integration Pattern
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Minimal integration pattern
|
||||
|
||||
source core.func
|
||||
pve_check
|
||||
root_check
|
||||
|
||||
msg_info "Running operation..."
|
||||
silent command
|
||||
msg_ok "Operation completed"
|
||||
```
|
||||
|
||||
### Advanced Integration Pattern
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Advanced integration pattern
|
||||
|
||||
source core.func
|
||||
|
||||
# System validation
|
||||
pve_check
|
||||
arch_check
|
||||
shell_check
|
||||
root_check
|
||||
ssh_check
|
||||
|
||||
# Error handling
|
||||
trap 'stop_spinner' EXIT INT TERM
|
||||
|
||||
# Verbose mode handling
|
||||
if is_verbose_mode; then
|
||||
msg_info "Verbose mode enabled"
|
||||
fi
|
||||
|
||||
# OS-specific operations
|
||||
if is_alpine; then
|
||||
msg_info "Alpine Linux detected"
|
||||
# Alpine-specific logic
|
||||
else
|
||||
msg_info "Debian-based system detected"
|
||||
# Debian-specific logic
|
||||
fi
|
||||
|
||||
# Operation execution
|
||||
msg_info "Starting operation..."
|
||||
if silent command; then
|
||||
msg_ok "Operation succeeded"
|
||||
else
|
||||
msg_error "Operation failed"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
## Error Handling Integration
|
||||
|
||||
### Silent Execution Error Flow
|
||||
|
||||
```
|
||||
silent() command
|
||||
├── Execute command
|
||||
├── Capture output to log
|
||||
├── Check exit code
|
||||
├── If error:
|
||||
│ ├── Load error_handler.func
|
||||
│ ├── Get error explanation
|
||||
│ ├── Display error details
|
||||
│ ├── Show log excerpt
|
||||
│ └── Exit with error code
|
||||
└── If success: Continue
|
||||
```
|
||||
|
||||
### System Check Error Flow
|
||||
|
||||
```
|
||||
System Check Function
|
||||
├── Check system state
|
||||
├── If valid: Return 0
|
||||
└── If invalid:
|
||||
├── Display error message
|
||||
├── Show fix instructions
|
||||
├── Sleep for user to read
|
||||
└── Exit with error code
|
||||
```
|
||||
|
||||
## Performance Considerations
|
||||
|
||||
### Loading Optimization
|
||||
- **Single Loading**: `_CORE_FUNC_LOADED` prevents multiple loading
|
||||
- **Function Loading**: `__FUNCTIONS_LOADED` prevents multiple function loading
|
||||
- **Lazy Loading**: Functions loaded only when needed
|
||||
|
||||
### Memory Usage
|
||||
- **Minimal Footprint**: Core functions use minimal memory
|
||||
- **Variable Reuse**: Global variables reused across functions
|
||||
- **Cleanup**: Spinner processes cleaned up on exit
|
||||
|
||||
### Execution Speed
|
||||
- **Fast Checks**: System checks are optimized for speed
|
||||
- **Efficient Spinners**: Spinner animation uses minimal CPU
|
||||
- **Quick Messages**: Message functions optimized for performance
|
||||
|
||||
## Security Considerations
|
||||
|
||||
### Privilege Escalation
|
||||
- **Root Check**: Ensures script runs with sufficient privileges
|
||||
- **Shell Check**: Validates shell environment
|
||||
- **Process Validation**: Checks parent process for sudo usage
|
||||
|
||||
### Input Validation
|
||||
- **Parameter Checking**: Functions validate input parameters
|
||||
- **Error Handling**: Proper error handling prevents crashes
|
||||
- **Safe Execution**: Silent execution with proper error handling
|
||||
|
||||
### System Protection
|
||||
- **Version Validation**: Ensures compatible Proxmox version
|
||||
- **Architecture Check**: Prevents execution on unsupported systems
|
||||
- **SSH Warning**: Warns about external SSH usage
|
||||
|
||||
## Future Integration Considerations
|
||||
|
||||
### Extensibility
|
||||
- **Function Groups**: Easy to add new function groups
|
||||
- **Message Types**: Easy to add new message types
|
||||
- **System Checks**: Easy to add new system checks
|
||||
|
||||
### Compatibility
|
||||
- **Version Support**: Easy to add new Proxmox versions
|
||||
- **OS Support**: Easy to add new operating systems
|
||||
- **Architecture Support**: Easy to add new architectures
|
||||
|
||||
### Performance
|
||||
- **Optimization**: Functions can be optimized for better performance
|
||||
- **Caching**: Results can be cached for repeated operations
|
||||
- **Parallelization**: Operations can be parallelized where appropriate
|
||||
728
docs/misc/core.func/CORE_USAGE_EXAMPLES.md
Normal file
728
docs/misc/core.func/CORE_USAGE_EXAMPLES.md
Normal file
@ -0,0 +1,728 @@
|
||||
# core.func Usage Examples
|
||||
|
||||
## Overview
|
||||
|
||||
This document provides practical usage examples for `core.func` functions, covering common scenarios, integration patterns, and best practices.
|
||||
|
||||
## Basic Script Setup
|
||||
|
||||
### Standard Script Initialization
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Standard script setup using core.func
|
||||
|
||||
# Source core functions
|
||||
source core.func
|
||||
|
||||
# Run system checks
|
||||
pve_check
|
||||
arch_check
|
||||
shell_check
|
||||
root_check
|
||||
|
||||
# Optional: Check SSH connection
|
||||
ssh_check
|
||||
|
||||
# Set up error handling
|
||||
trap 'stop_spinner' EXIT INT TERM
|
||||
|
||||
# Your script logic here
|
||||
msg_info "Starting script execution"
|
||||
# ... script code ...
|
||||
msg_ok "Script completed successfully"
|
||||
```
|
||||
|
||||
### Minimal Script Setup
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Minimal setup for simple scripts
|
||||
|
||||
source core.func
|
||||
|
||||
# Basic checks only
|
||||
pve_check
|
||||
root_check
|
||||
|
||||
# Simple execution
|
||||
msg_info "Running operation"
|
||||
# ... your code ...
|
||||
msg_ok "Operation completed"
|
||||
```
|
||||
|
||||
## Message Display Examples
|
||||
|
||||
### Progress Indication
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Show progress with spinner
|
||||
msg_info "Downloading package..."
|
||||
sleep 2
|
||||
msg_ok "Download completed"
|
||||
|
||||
msg_info "Installing package..."
|
||||
sleep 3
|
||||
msg_ok "Installation completed"
|
||||
|
||||
msg_info "Configuring service..."
|
||||
sleep 1
|
||||
msg_ok "Configuration completed"
|
||||
```
|
||||
|
||||
### Error Handling
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Function with error handling
|
||||
install_package() {
|
||||
local package="$1"
|
||||
|
||||
msg_info "Installing $package..."
|
||||
|
||||
if silent apt-get install -y "$package"; then
|
||||
msg_ok "$package installed successfully"
|
||||
return 0
|
||||
else
|
||||
msg_error "Failed to install $package"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Usage
|
||||
if install_package "nginx"; then
|
||||
msg_ok "Nginx installation completed"
|
||||
else
|
||||
msg_error "Nginx installation failed"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
### Warning Messages
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Show warnings for potentially dangerous operations
|
||||
msg_warn "This will modify system configuration"
|
||||
read -p "Continue? [y/N]: " confirm
|
||||
|
||||
if [[ "$confirm" =~ ^[yY]$ ]]; then
|
||||
msg_info "Proceeding with modification..."
|
||||
# ... dangerous operation ...
|
||||
msg_ok "Modification completed"
|
||||
else
|
||||
msg_info "Operation cancelled"
|
||||
fi
|
||||
```
|
||||
|
||||
### Custom Messages
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Custom message with specific icon and color
|
||||
msg_custom "🚀" "\e[32m" "Launching application"
|
||||
msg_custom "⚡" "\e[33m" "High performance mode enabled"
|
||||
msg_custom "🔒" "\e[31m" "Security mode activated"
|
||||
```
|
||||
|
||||
### Debug Messages
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Enable debug mode
|
||||
export var_full_verbose=1
|
||||
|
||||
# Debug messages
|
||||
msg_debug "Variable value: $some_variable"
|
||||
msg_debug "Function called: $FUNCNAME"
|
||||
msg_debug "Current directory: $(pwd)"
|
||||
```
|
||||
|
||||
## Silent Execution Examples
|
||||
|
||||
### Package Management
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Update package lists
|
||||
msg_info "Updating package lists..."
|
||||
silent apt-get update
|
||||
|
||||
# Install packages
|
||||
msg_info "Installing required packages..."
|
||||
silent apt-get install -y curl wget git
|
||||
|
||||
# Upgrade packages
|
||||
msg_info "Upgrading packages..."
|
||||
silent apt-get upgrade -y
|
||||
|
||||
msg_ok "Package management completed"
|
||||
```
|
||||
|
||||
### File Operations
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Create directories
|
||||
msg_info "Creating directory structure..."
|
||||
silent mkdir -p /opt/myapp/{config,logs,data}
|
||||
|
||||
# Set permissions
|
||||
msg_info "Setting permissions..."
|
||||
silent chmod 755 /opt/myapp
|
||||
silent chmod 644 /opt/myapp/config/*
|
||||
|
||||
# Copy files
|
||||
msg_info "Copying configuration files..."
|
||||
silent cp config/* /opt/myapp/config/
|
||||
|
||||
msg_ok "File operations completed"
|
||||
```
|
||||
|
||||
### Service Management
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Start service
|
||||
msg_info "Starting service..."
|
||||
silent systemctl start myservice
|
||||
|
||||
# Enable service
|
||||
msg_info "Enabling service..."
|
||||
silent systemctl enable myservice
|
||||
|
||||
# Check service status
|
||||
msg_info "Checking service status..."
|
||||
if silent systemctl is-active --quiet myservice; then
|
||||
msg_ok "Service is running"
|
||||
else
|
||||
msg_error "Service failed to start"
|
||||
fi
|
||||
```
|
||||
|
||||
### Network Operations
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Test network connectivity
|
||||
msg_info "Testing network connectivity..."
|
||||
if silent ping -c 1 8.8.8.8; then
|
||||
msg_ok "Network connectivity confirmed"
|
||||
else
|
||||
msg_error "Network connectivity failed"
|
||||
fi
|
||||
|
||||
# Download files
|
||||
msg_info "Downloading configuration..."
|
||||
silent curl -fsSL https://example.com/config -o /tmp/config
|
||||
|
||||
# Extract archives
|
||||
msg_info "Extracting archive..."
|
||||
silent tar -xzf /tmp/archive.tar.gz -C /opt/
|
||||
```
|
||||
|
||||
## System Check Examples
|
||||
|
||||
### Comprehensive System Validation
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Complete system validation
|
||||
validate_system() {
|
||||
msg_info "Validating system requirements..."
|
||||
|
||||
# Check Proxmox version
|
||||
if pve_check; then
|
||||
msg_ok "Proxmox VE version is supported"
|
||||
fi
|
||||
|
||||
# Check architecture
|
||||
if arch_check; then
|
||||
msg_ok "System architecture is supported"
|
||||
fi
|
||||
|
||||
# Check shell
|
||||
if shell_check; then
|
||||
msg_ok "Shell environment is correct"
|
||||
fi
|
||||
|
||||
# Check privileges
|
||||
if root_check; then
|
||||
msg_ok "Running with sufficient privileges"
|
||||
fi
|
||||
|
||||
# Check SSH connection
|
||||
ssh_check
|
||||
|
||||
msg_ok "System validation completed"
|
||||
}
|
||||
|
||||
# Run validation
|
||||
validate_system
|
||||
```
|
||||
|
||||
### Conditional System Checks
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Check if running in container
|
||||
if [[ -f /.dockerenv ]] || [[ -f /run/.containerenv ]]; then
|
||||
msg_warn "Running inside container"
|
||||
# Skip some checks
|
||||
else
|
||||
# Full system checks
|
||||
pve_check
|
||||
arch_check
|
||||
fi
|
||||
|
||||
# Always check shell and privileges
|
||||
shell_check
|
||||
root_check
|
||||
```
|
||||
|
||||
## Header Management Examples
|
||||
|
||||
### Application Header Display
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Set application information
|
||||
export APP="plex"
|
||||
export APP_TYPE="ct"
|
||||
|
||||
# Display header
|
||||
header_info
|
||||
|
||||
# Continue with application setup
|
||||
msg_info "Setting up Plex Media Server..."
|
||||
```
|
||||
|
||||
### Custom Header Handling
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Get header content
|
||||
export APP="nextcloud"
|
||||
export APP_TYPE="ct"
|
||||
|
||||
header_content=$(get_header)
|
||||
if [[ -n "$header_content" ]]; then
|
||||
echo "Header found:"
|
||||
echo "$header_content"
|
||||
else
|
||||
msg_warn "No header found for $APP"
|
||||
fi
|
||||
```
|
||||
|
||||
## Swap Management Examples
|
||||
|
||||
### Interactive Swap Creation
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Check and create swap
|
||||
if check_or_create_swap; then
|
||||
msg_ok "Swap is available"
|
||||
else
|
||||
msg_warn "No swap available - continuing without swap"
|
||||
fi
|
||||
```
|
||||
|
||||
### Automated Swap Check
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Check swap without prompting
|
||||
check_swap_quiet() {
|
||||
if swapon --noheadings --show | grep -q 'swap'; then
|
||||
msg_ok "Swap is active"
|
||||
return 0
|
||||
else
|
||||
msg_warn "No active swap detected"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
if check_swap_quiet; then
|
||||
msg_info "System has sufficient swap"
|
||||
else
|
||||
msg_warn "Consider adding swap for better performance"
|
||||
fi
|
||||
```
|
||||
|
||||
## Spinner Usage Examples
|
||||
|
||||
### Long-Running Operations
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Long-running operation with spinner
|
||||
long_operation() {
|
||||
msg_info "Processing large dataset..."
|
||||
|
||||
# Simulate long operation
|
||||
for i in {1..100}; do
|
||||
sleep 0.1
|
||||
# Update spinner message periodically
|
||||
if (( i % 20 == 0 )); then
|
||||
SPINNER_MSG="Processing... $i%"
|
||||
fi
|
||||
done
|
||||
|
||||
msg_ok "Dataset processing completed"
|
||||
}
|
||||
|
||||
long_operation
|
||||
```
|
||||
|
||||
### Background Operations
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Background operation with spinner
|
||||
background_operation() {
|
||||
msg_info "Starting background process..."
|
||||
|
||||
# Start spinner
|
||||
SPINNER_MSG="Processing in background..."
|
||||
spinner &
|
||||
SPINNER_PID=$!
|
||||
|
||||
# Do background work
|
||||
sleep 5
|
||||
|
||||
# Stop spinner
|
||||
stop_spinner
|
||||
msg_ok "Background process completed"
|
||||
}
|
||||
|
||||
background_operation
|
||||
```
|
||||
|
||||
## Integration Examples
|
||||
|
||||
### With build.func
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Integration with build.func
|
||||
|
||||
source core.func
|
||||
source build.func
|
||||
|
||||
# Use core functions for system validation
|
||||
pve_check
|
||||
arch_check
|
||||
root_check
|
||||
|
||||
# Use build.func for container creation
|
||||
export APP="plex"
|
||||
export CTID="100"
|
||||
# ... container creation ...
|
||||
```
|
||||
|
||||
### With tools.func
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Integration with tools.func
|
||||
|
||||
source core.func
|
||||
source tools.func
|
||||
|
||||
# Use core functions for UI
|
||||
msg_info "Starting maintenance tasks..."
|
||||
|
||||
# Use tools.func for maintenance
|
||||
update_system
|
||||
cleanup_logs
|
||||
optimize_storage
|
||||
|
||||
msg_ok "Maintenance completed"
|
||||
```
|
||||
|
||||
### With error_handler.func
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Integration with error_handler.func
|
||||
|
||||
source core.func
|
||||
source error_handler.func
|
||||
|
||||
# Use core functions for execution
|
||||
msg_info "Running operation..."
|
||||
|
||||
# Silent execution will use error_handler for explanations
|
||||
silent apt-get install -y package
|
||||
|
||||
msg_ok "Operation completed"
|
||||
```
|
||||
|
||||
## Best Practices Examples
|
||||
|
||||
### Error Handling Pattern
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Robust error handling
|
||||
run_with_error_handling() {
|
||||
local operation="$1"
|
||||
local description="$2"
|
||||
|
||||
msg_info "$description"
|
||||
|
||||
if silent "$operation"; then
|
||||
msg_ok "$description completed successfully"
|
||||
return 0
|
||||
else
|
||||
msg_error "$description failed"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Usage
|
||||
run_with_error_handling "apt-get update" "Package list update"
|
||||
run_with_error_handling "apt-get install -y nginx" "Nginx installation"
|
||||
```
|
||||
|
||||
### Verbose Mode Handling
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Handle verbose mode
|
||||
if is_verbose_mode; then
|
||||
msg_info "Verbose mode enabled - showing detailed output"
|
||||
# Show more information
|
||||
else
|
||||
msg_info "Normal mode - showing minimal output"
|
||||
# Show less information
|
||||
fi
|
||||
```
|
||||
|
||||
### Alpine Linux Detection
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Handle different OS types
|
||||
if is_alpine; then
|
||||
msg_info "Detected Alpine Linux"
|
||||
# Use Alpine-specific commands
|
||||
silent apk add --no-cache package
|
||||
else
|
||||
msg_info "Detected Debian-based system"
|
||||
# Use Debian-specific commands
|
||||
silent apt-get install -y package
|
||||
fi
|
||||
```
|
||||
|
||||
### Conditional Execution
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Conditional execution based on system state
|
||||
if [[ -f /etc/nginx/nginx.conf ]]; then
|
||||
msg_warn "Nginx configuration already exists"
|
||||
read -p "Overwrite? [y/N]: " overwrite
|
||||
if [[ "$overwrite" =~ ^[yY]$ ]]; then
|
||||
msg_info "Overwriting configuration..."
|
||||
# ... overwrite logic ...
|
||||
else
|
||||
msg_info "Skipping configuration"
|
||||
fi
|
||||
else
|
||||
msg_info "Creating new Nginx configuration..."
|
||||
# ... create logic ...
|
||||
fi
|
||||
```
|
||||
|
||||
## Advanced Usage Examples
|
||||
|
||||
### Custom Spinner Messages
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Custom spinner with progress
|
||||
download_with_progress() {
|
||||
local url="$1"
|
||||
local file="$2"
|
||||
|
||||
msg_info "Starting download..."
|
||||
|
||||
# Start spinner
|
||||
SPINNER_MSG="Downloading..."
|
||||
spinner &
|
||||
SPINNER_PID=$!
|
||||
|
||||
# Download with progress
|
||||
curl -L "$url" -o "$file" --progress-bar
|
||||
|
||||
# Stop spinner
|
||||
stop_spinner
|
||||
msg_ok "Download completed"
|
||||
}
|
||||
|
||||
download_with_progress "https://example.com/file.tar.gz" "/tmp/file.tar.gz"
|
||||
```
|
||||
|
||||
### Message Deduplication
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Messages are automatically deduplicated
|
||||
for i in {1..5}; do
|
||||
msg_info "Processing item $i"
|
||||
# This message will only show once
|
||||
done
|
||||
|
||||
# Different messages will show separately
|
||||
msg_info "Starting phase 1"
|
||||
msg_info "Starting phase 2"
|
||||
msg_info "Starting phase 3"
|
||||
```
|
||||
|
||||
### Terminal Control
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Ensure terminal control is available
|
||||
ensure_tput
|
||||
|
||||
# Use terminal control
|
||||
clear_line
|
||||
echo "This line will be cleared"
|
||||
clear_line
|
||||
echo "New content"
|
||||
```
|
||||
|
||||
## Troubleshooting Examples
|
||||
|
||||
### Debug Mode
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Enable debug mode
|
||||
export var_full_verbose=1
|
||||
export VERBOSE="yes"
|
||||
|
||||
# Debug information
|
||||
msg_debug "Script started"
|
||||
msg_debug "Current user: $(whoami)"
|
||||
msg_debug "Current directory: $(pwd)"
|
||||
msg_debug "Environment variables: $(env | grep -E '^(APP|CTID|VERBOSE)')"
|
||||
```
|
||||
|
||||
### Silent Execution Debugging
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Debug silent execution
|
||||
debug_silent() {
|
||||
local cmd="$1"
|
||||
local log_file="/tmp/debug.$$.log"
|
||||
|
||||
echo "Command: $cmd" > "$log_file"
|
||||
echo "Timestamp: $(date)" >> "$log_file"
|
||||
echo "Working directory: $(pwd)" >> "$log_file"
|
||||
echo "Environment:" >> "$log_file"
|
||||
env >> "$log_file"
|
||||
echo "--- Command Output ---" >> "$log_file"
|
||||
|
||||
if silent "$cmd"; then
|
||||
msg_ok "Command succeeded"
|
||||
else
|
||||
msg_error "Command failed - check $log_file for details"
|
||||
fi
|
||||
}
|
||||
|
||||
debug_silent "apt-get update"
|
||||
```
|
||||
|
||||
### Error Recovery
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
|
||||
# Error recovery pattern
|
||||
retry_operation() {
|
||||
local max_attempts=3
|
||||
local attempt=1
|
||||
|
||||
while [[ $attempt -le $max_attempts ]]; do
|
||||
msg_info "Attempt $attempt of $max_attempts"
|
||||
|
||||
if silent "$@"; then
|
||||
msg_ok "Operation succeeded on attempt $attempt"
|
||||
return 0
|
||||
else
|
||||
msg_warn "Attempt $attempt failed"
|
||||
((attempt++))
|
||||
|
||||
if [[ $attempt -le $max_attempts ]]; then
|
||||
msg_info "Retrying in 5 seconds..."
|
||||
sleep 5
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
msg_error "Operation failed after $max_attempts attempts"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Usage
|
||||
retry_operation "apt-get install -y package"
|
||||
```
|
||||
181
docs/misc/core.func/README.md
Normal file
181
docs/misc/core.func/README.md
Normal file
@ -0,0 +1,181 @@
|
||||
# core.func Documentation
|
||||
|
||||
## Overview
|
||||
|
||||
The `core.func` file provides fundamental utility functions and system checks that form the foundation for all other scripts in the Proxmox Community Scripts project. It handles basic system operations, user interface elements, validation, and core infrastructure.
|
||||
|
||||
## Purpose and Use Cases
|
||||
|
||||
- **System Validation**: Checks for Proxmox VE compatibility, architecture, shell requirements
|
||||
- **User Interface**: Provides colored output, icons, spinners, and formatted messages
|
||||
- **Core Utilities**: Basic functions used across all scripts
|
||||
- **Error Handling**: Silent execution with detailed error reporting
|
||||
- **System Information**: OS detection, verbose mode handling, swap management
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Key Function Groups
|
||||
- **System Checks**: `pve_check()`, `arch_check()`, `shell_check()`, `root_check()`
|
||||
- **User Interface**: `msg_info()`, `msg_ok()`, `msg_error()`, `msg_warn()`, `spinner()`
|
||||
- **Core Utilities**: `silent()`, `is_alpine()`, `is_verbose_mode()`, `get_header()`
|
||||
- **System Management**: `check_or_create_swap()`, `ensure_tput()`
|
||||
|
||||
### Dependencies
|
||||
- **External**: `curl` for downloading headers, `tput` for terminal control
|
||||
- **Internal**: `error_handler.func` for error explanations
|
||||
|
||||
### Integration Points
|
||||
- Used by: All other `.func` files and installation scripts
|
||||
- Uses: `error_handler.func` for error explanations
|
||||
- Provides: Core utilities for `build.func`, `tools.func`, `api.func`
|
||||
|
||||
## Documentation Files
|
||||
|
||||
### 📊 [CORE_FLOWCHART.md](./CORE_FLOWCHART.md)
|
||||
Visual execution flows showing how core functions interact and the system validation process.
|
||||
|
||||
### 📚 [CORE_FUNCTIONS_REFERENCE.md](./CORE_FUNCTIONS_REFERENCE.md)
|
||||
Complete alphabetical reference of all functions with parameters, dependencies, and usage details.
|
||||
|
||||
### 💡 [CORE_USAGE_EXAMPLES.md](./CORE_USAGE_EXAMPLES.md)
|
||||
Practical examples showing how to use core functions in scripts and common patterns.
|
||||
|
||||
### 🔗 [CORE_INTEGRATION.md](./CORE_INTEGRATION.md)
|
||||
How core.func integrates with other components and provides foundational services.
|
||||
|
||||
## Key Features
|
||||
|
||||
### System Validation
|
||||
- **Proxmox VE Version Check**: Supports PVE 8.0-8.9 and 9.0
|
||||
- **Architecture Check**: Ensures AMD64 architecture (excludes PiMox)
|
||||
- **Shell Check**: Validates Bash shell usage
|
||||
- **Root Check**: Ensures root privileges
|
||||
- **SSH Check**: Warns about external SSH usage
|
||||
|
||||
### User Interface
|
||||
- **Colored Output**: ANSI color codes for styled terminal output
|
||||
- **Icons**: Symbolic icons for different message types
|
||||
- **Spinners**: Animated progress indicators
|
||||
- **Formatted Messages**: Consistent message formatting across scripts
|
||||
|
||||
### Core Utilities
|
||||
- **Silent Execution**: Execute commands with detailed error reporting
|
||||
- **OS Detection**: Alpine Linux detection
|
||||
- **Verbose Mode**: Handle verbose output settings
|
||||
- **Header Management**: Download and display application headers
|
||||
- **Swap Management**: Check and create swap files
|
||||
|
||||
## Common Usage Patterns
|
||||
|
||||
### Basic Script Setup
|
||||
```bash
|
||||
# Source core functions
|
||||
source core.func
|
||||
|
||||
# Run system checks
|
||||
pve_check
|
||||
arch_check
|
||||
shell_check
|
||||
root_check
|
||||
```
|
||||
|
||||
### Message Display
|
||||
```bash
|
||||
# Show progress
|
||||
msg_info "Installing package..."
|
||||
|
||||
# Show success
|
||||
msg_ok "Package installed successfully"
|
||||
|
||||
# Show error
|
||||
msg_error "Installation failed"
|
||||
|
||||
# Show warning
|
||||
msg_warn "This operation may take some time"
|
||||
```
|
||||
|
||||
### Silent Command Execution
|
||||
```bash
|
||||
# Execute command silently with error handling
|
||||
silent apt-get update
|
||||
silent apt-get install -y package-name
|
||||
```
|
||||
|
||||
## Environment Variables
|
||||
|
||||
### Core Variables
|
||||
- `VERBOSE`: Enable verbose output mode
|
||||
- `SILENT_LOGFILE`: Path to silent execution log file
|
||||
- `APP`: Application name for header display
|
||||
- `APP_TYPE`: Application type (ct/vm) for header paths
|
||||
|
||||
### Internal Variables
|
||||
- `_CORE_FUNC_LOADED`: Prevents multiple loading
|
||||
- `__FUNCTIONS_LOADED`: Prevents multiple function loading
|
||||
- `RETRY_NUM`: Number of retry attempts (default: 10)
|
||||
- `RETRY_EVERY`: Seconds between retries (default: 3)
|
||||
|
||||
## Error Handling
|
||||
|
||||
### Silent Execution Errors
|
||||
- Commands executed via `silent()` capture output to log file
|
||||
- On failure, displays error code explanation
|
||||
- Shows last 10 lines of log output
|
||||
- Provides command to view full log
|
||||
|
||||
### System Check Failures
|
||||
- Each system check function exits with appropriate error message
|
||||
- Clear indication of what's wrong and how to fix it
|
||||
- Graceful exit with sleep delay for user to read message
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Script Initialization
|
||||
1. Source `core.func` first
|
||||
2. Run system checks early
|
||||
3. Set up error handling
|
||||
4. Use appropriate message functions
|
||||
|
||||
### Message Usage
|
||||
1. Use `msg_info()` for progress updates
|
||||
2. Use `msg_ok()` for successful completions
|
||||
3. Use `msg_error()` for failures
|
||||
4. Use `msg_warn()` for warnings
|
||||
|
||||
### Silent Execution
|
||||
1. Use `silent()` for commands that might fail
|
||||
2. Check return codes after silent execution
|
||||
3. Provide meaningful error messages
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
1. **Proxmox Version**: Ensure running supported PVE version
|
||||
2. **Architecture**: Script only works on AMD64 systems
|
||||
3. **Shell**: Must use Bash shell
|
||||
4. **Permissions**: Must run as root
|
||||
5. **Network**: SSH warnings for external connections
|
||||
|
||||
### Debug Mode
|
||||
Enable verbose output for debugging:
|
||||
```bash
|
||||
export VERBOSE="yes"
|
||||
source core.func
|
||||
```
|
||||
|
||||
### Log Files
|
||||
Check silent execution logs:
|
||||
```bash
|
||||
cat /tmp/silent.$$.log
|
||||
```
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- [build.func](../build.func/) - Main container creation script
|
||||
- [error_handler.func](../error_handler.func/) - Error handling utilities
|
||||
- [tools.func](../tools.func/) - Extended utility functions
|
||||
- [api.func](../api.func/) - Proxmox API interactions
|
||||
|
||||
---
|
||||
|
||||
*This documentation covers the core.func file which provides fundamental utilities for all Proxmox Community Scripts.*
|
||||
347
docs/misc/error_handler.func/ERROR_HANDLER_FLOWCHART.md
Normal file
347
docs/misc/error_handler.func/ERROR_HANDLER_FLOWCHART.md
Normal file
@ -0,0 +1,347 @@
|
||||
# error_handler.func Execution Flowchart
|
||||
|
||||
## Main Error Handling Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Error Handler Initialization │
|
||||
│ Entry point when error_handler.func is sourced by other scripts │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ CATCH_ERRORS() │
|
||||
│ Initialize error handling traps and strict mode │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Trap Setup Sequence │
|
||||
│ │
|
||||
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────────────┐ │
|
||||
│ │ Set Strict │ │ Set Error │ │ Set Signal │ │
|
||||
│ │ Mode │ │ Trap │ │ Traps │ │
|
||||
│ │ │ │ │ │ │ │
|
||||
│ │ • -Ee │ │ • ERR trap │ │ • EXIT trap │ │
|
||||
│ │ • -o pipefail │ │ • error_handler │ │ • INT trap │ │
|
||||
│ │ • -u (if │ │ function │ │ • TERM trap │ │
|
||||
│ │ STRICT_UNSET) │ │ │ │ │ │
|
||||
│ └─────────────────┘ └─────────────────┘ └─────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Error Handler Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ ERROR_HANDLER() Flow │
|
||||
│ Main error handler triggered by ERR trap or manual call │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Error Detection │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Error Information Collection │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Get Exit │ │ Get Command │ │ Get Line │ │ │
|
||||
│ │ │ Code │ │ Information │ │ Number │ │ │
|
||||
│ │ │ │ │ │ │ │ │ │
|
||||
│ │ │ • From $? or │ │ • From │ │ • From │ │ │
|
||||
│ │ │ parameter │ │ BASH_COMMAND │ │ BASH_LINENO[0] │ │ │
|
||||
│ │ │ • Store in │ │ • Clean $STD │ │ • Default to │ │ │
|
||||
│ │ │ exit_code │ │ references │ │ "unknown" │ │ │
|
||||
│ │ │ │ │ • Store in │ │ • Store in │ │ │
|
||||
│ │ │ │ │ command │ │ line_number │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Success Check │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Exit Code Validation │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Check Exit │ │ Success │ │ Error │ │
|
||||
│ │ │ Code │ │ Path │ │ Path │ │
|
||||
│ │ │ │ │ │ │ │ │
|
||||
│ │ │ • If exit_code │ │ • Return 0 │ │ • Continue to │ │
|
||||
│ │ │ == 0 │ │ • No error │ │ error handling │ │
|
||||
│ │ │ • Success │ │ processing │ │ • Process error │ │
|
||||
│ │ │ • No error │ │ │ │ information │ │
|
||||
│ │ │ handling │ │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Error Processing │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Error Explanation │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Get Error │ │ Display Error │ │ Log Error │ │ │
|
||||
│ │ │ Explanation │ │ Information │ │ Information │ │ │
|
||||
│ │ │ │ │ │ │ │ │
|
||||
│ │ │ • Call │ │ • Show error │ │ • Write to debug │ │
|
||||
│ │ │ explain_exit_ │ │ message │ │ log if enabled │ │
|
||||
│ │ │ code() │ │ • Show line │ │ • Include │ │
|
||||
│ │ │ • Get human- │ │ number │ │ timestamp │ │
|
||||
│ │ │ readable │ │ • Show command │ │ • Include exit │ │
|
||||
│ │ │ message │ │ • Show exit │ │ code │ │
|
||||
│ │ │ │ │ code │ │ • Include command │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Silent Log Integration │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Silent Log Display │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Check Silent │ │ Display Log │ │ Exit with │ │
|
||||
│ │ │ Log File │ │ Content │ │ Error Code │ │
|
||||
│ │ │ │ │ │ │ │ │
|
||||
│ │ │ • Check if │ │ • Show last 20 │ │ • Exit with │ │
|
||||
│ │ │ SILENT_ │ │ lines │ │ original exit │ │
|
||||
│ │ │ LOGFILE set │ │ • Show file │ │ code │ │
|
||||
│ │ │ • Check if │ │ path │ │ • Terminate script │ │
|
||||
│ │ │ file exists │ │ • Format │ │ execution │ │
|
||||
│ │ │ • Check if │ │ output │ │ │ │
|
||||
│ │ │ file has │ │ │ │ │ │
|
||||
│ │ │ content │ │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Signal Handling Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Signal Handler Flow │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Signal Detection │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ SIGINT │ │ SIGTERM │ │ EXIT │ │ │
|
||||
│ │ │ (Ctrl+C) │ │ (Termination) │ │ (Script End) │ │ │
|
||||
│ │ │ │ │ │ │ │ │
|
||||
│ │ │ • User │ │ • System │ │ • Normal script │ │
|
||||
│ │ │ interruption │ │ termination │ │ completion │ │
|
||||
│ │ │ • Graceful │ │ • Graceful │ │ • Error exit │ │
|
||||
│ │ │ handling │ │ handling │ │ • Signal exit │ │
|
||||
│ │ │ • Exit code │ │ • Exit code │ │ • Cleanup │ │
|
||||
│ │ │ 130 │ │ 143 │ │ operations │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ ON_INTERRUPT() Flow │
|
||||
│ Handles SIGINT (Ctrl+C) signals │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Interrupt Processing │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ User Interruption Handling │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Display │ │ Cleanup │ │ Exit with │ │ │
|
||||
│ │ │ Message │ │ Operations │ │ Code 130 │ │ │
|
||||
│ │ │ │ │ │ │ │ │
|
||||
│ │ │ • Show │ │ • Stop │ │ • Exit with │ │
|
||||
│ │ │ interruption │ │ processes │ │ SIGINT code │ │
|
||||
│ │ │ message │ │ • Clean up │ │ • Terminate script │ │
|
||||
│ │ │ • Use red │ │ temporary │ │ execution │ │
|
||||
│ │ │ color │ │ files │ │ │ │
|
||||
│ │ │ • Clear │ │ • Remove lock │ │ │ │
|
||||
│ │ │ terminal │ │ files │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Exit Handler Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ ON_EXIT() Flow │
|
||||
│ Handles script exit cleanup │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Exit Cleanup │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Cleanup Operations │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Lock File │ │ Temporary │ │ Exit with │ │ │
|
||||
│ │ │ Cleanup │ │ File │ │ Original Code │ │ │
|
||||
│ │ │ │ │ Cleanup │ │ │ │
|
||||
│ │ │ • Check if │ │ • Remove │ │ • Exit with │ │
|
||||
│ │ │ lockfile │ │ temporary │ │ original exit │ │
|
||||
│ │ │ variable set │ │ files │ │ code │ │
|
||||
│ │ │ • Check if │ │ • Clean up │ │ • Preserve exit │ │
|
||||
│ │ │ lockfile │ │ process │ │ status │ │
|
||||
│ │ │ exists │ │ state │ │ • Terminate │ │
|
||||
│ │ │ • Remove │ │ │ │ execution │ │
|
||||
│ │ │ lockfile │ │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Error Code Explanation Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ EXPLAIN_EXIT_CODE() Flow │
|
||||
│ Converts numeric exit codes to human-readable explanations │
|
||||
└─────────────────────┬───────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Error Code Classification │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Error Code Categories │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Generic/ │ │ Package │ │ Node.js │ │ │
|
||||
│ │ │ Shell │ │ Manager │ │ Errors │ │ │
|
||||
│ │ │ Errors │ │ Errors │ │ │ │
|
||||
│ │ │ │ │ │ │ • 243: Out of │ │
|
||||
│ │ │ • 1: General │ │ • 100: APT │ │ memory │ │
|
||||
│ │ │ error │ │ package │ │ • 245: Invalid │ │
|
||||
│ │ │ • 2: Shell │ │ error │ │ option │ │
|
||||
│ │ │ builtin │ │ • 101: APT │ │ • 246: Parse │ │
|
||||
│ │ │ misuse │ │ config error │ │ error │ │
|
||||
│ │ │ • 126: Cannot │ │ • 255: DPKG │ │ • 247: Fatal │ │
|
||||
│ │ │ execute │ │ fatal error │ │ error │ │
|
||||
│ │ │ • 127: Command │ │ │ │ • 248: Addon │ │
|
||||
│ │ │ not found │ │ │ │ failure │ │
|
||||
│ │ │ • 128: Invalid │ │ │ │ • 249: Inspector │ │
|
||||
│ │ │ exit │ │ │ │ error │ │
|
||||
│ │ │ • 130: SIGINT │ │ │ │ • 254: Unknown │ │
|
||||
│ │ │ • 137: SIGKILL │ │ │ │ fatal error │ │
|
||||
│ │ │ • 139: Segfault │ │ │ │ │ │
|
||||
│ │ │ • 143: SIGTERM │ │ │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Python │ │ Database │ │ Proxmox │ │ │
|
||||
│ │ │ Errors │ │ Errors │ │ Custom │ │ │
|
||||
│ │ │ │ │ │ │ Errors │ │
|
||||
│ │ │ • 210: Virtual │ │ • PostgreSQL: │ │ • 200: Lock file │ │
|
||||
│ │ │ env missing │ │ 231-234 │ │ failed │ │
|
||||
│ │ │ • 211: Dep │ │ • MySQL: 241- │ │ • 203: Missing │ │
|
||||
│ │ │ resolution │ │ 244 │ │ CTID │ │
|
||||
│ │ │ • 212: Install │ │ • MongoDB: 251- │ │ • 204: Missing │ │
|
||||
│ │ │ aborted │ │ 254 │ │ PCT_OSTYPE │ │
|
||||
│ │ │ │ │ │ │ • 205: Invalid │ │
|
||||
│ │ │ │ │ │ │ CTID │ │
|
||||
│ │ │ │ │ │ │ • 209: Container │ │
|
||||
│ │ │ │ │ │ │ creation failed │ │
|
||||
│ │ │ │ │ │ │ • 210: Cluster │ │
|
||||
│ │ │ │ │ │ │ not quorate │ │
|
||||
│ │ │ │ │ │ │ • 214: No storage │ │
|
||||
│ │ │ │ │ │ │ space │ │
|
||||
│ │ │ │ │ │ │ • 215: CTID not │ │
|
||||
│ │ │ │ │ │ │ listed │ │
|
||||
│ │ │ │ │ │ │ • 216: RootFS │ │
|
||||
│ │ │ │ │ │ │ missing │ │
|
||||
│ │ │ │ │ │ │ • 217: Storage │ │
|
||||
│ │ │ │ │ │ │ not supported │ │
|
||||
│ │ │ │ │ │ │ • 220: Template │ │
|
||||
│ │ │ │ │ │ │ path error │ │
|
||||
│ │ │ │ │ │ │ • 222: Template │ │
|
||||
│ │ │ │ │ │ │ download failed │ │
|
||||
│ │ │ │ │ │ │ • 223: Template │ │
|
||||
│ │ │ │ │ │ │ not available │ │
|
||||
│ │ │ │ │ │ │ • 231: LXC stack │ │
|
||||
│ │ │ │ │ │ │ upgrade failed │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Default Case │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Unknown Error Handling │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Check for │ │ Return │ │ Log Unknown │ │ │
|
||||
│ │ │ Unknown │ │ Generic │ │ Error │ │ │
|
||||
│ │ │ Code │ │ Message │ │ │ │
|
||||
│ │ │ │ │ │ │ • Log to debug │ │
|
||||
│ │ │ • If no match │ │ • "Unknown │ │ file if enabled │ │
|
||||
│ │ │ found │ │ error" │ │ • Include error │ │
|
||||
│ │ │ • Use default │ │ • Return to │ │ code │ │
|
||||
│ │ │ case │ │ caller │ │ • Include │ │
|
||||
│ │ │ │ │ │ │ timestamp │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Debug Logging Flow
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Debug Log Integration │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ Debug Log Writing │ │
|
||||
│ │ │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────────┐ │ │
|
||||
│ │ │ Check Debug │ │ Write Error │ │ Format Log │ │ │
|
||||
│ │ │ Log File │ │ Information │ │ Entry │ │ │
|
||||
│ │ │ │ │ │ │ │ │
|
||||
│ │ │ • Check if │ │ • Timestamp │ │ • Error separator │ │
|
||||
│ │ │ DEBUG_LOGFILE │ │ • Exit code │ │ • Structured │ │
|
||||
│ │ │ set │ │ • Explanation │ │ format │ │
|
||||
│ │ │ • Check if │ │ • Line number │ │ • Easy to parse │ │
|
||||
│ │ │ file exists │ │ • Command │ │ • Easy to read │ │
|
||||
│ │ │ • Check if │ │ • Append to │ │ │ │
|
||||
│ │ │ file writable │ │ file │ │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────────┘ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Integration Points
|
||||
|
||||
### With core.func
|
||||
- **Silent Execution**: Provides error explanations for silent() function
|
||||
- **Color Variables**: Uses color variables for error display
|
||||
- **Log Integration**: Integrates with SILENT_LOGFILE
|
||||
|
||||
### With Other Scripts
|
||||
- **Error Traps**: Sets up ERR trap for automatic error handling
|
||||
- **Signal Traps**: Handles SIGINT, SIGTERM, and EXIT signals
|
||||
- **Cleanup**: Provides cleanup on script exit
|
||||
|
||||
### External Dependencies
|
||||
- **None**: Pure Bash implementation
|
||||
- **Color Support**: Requires color variables from core.func
|
||||
- **Log Files**: Uses standard file operations
|
||||
@ -0,0 +1,424 @@
|
||||
# error_handler.func Functions Reference
|
||||
|
||||
## Overview
|
||||
|
||||
This document provides a comprehensive alphabetical reference of all functions in `error_handler.func`, including parameters, dependencies, usage examples, and error handling.
|
||||
|
||||
## Function Categories
|
||||
|
||||
### Error Explanation Functions
|
||||
|
||||
#### `explain_exit_code()`
|
||||
**Purpose**: Convert numeric exit codes to human-readable explanations
|
||||
**Parameters**:
|
||||
- `$1` - Exit code to explain
|
||||
**Returns**: Human-readable error explanation string
|
||||
**Side Effects**: None
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Supported Exit Codes**:
|
||||
- **Generic/Shell**: 1, 2, 126, 127, 128, 130, 137, 139, 143
|
||||
- **Package Manager**: 100, 101, 255
|
||||
- **Node.js**: 243, 245, 246, 247, 248, 249, 254
|
||||
- **Python**: 210, 211, 212
|
||||
- **PostgreSQL**: 231, 232, 233, 234
|
||||
- **MySQL/MariaDB**: 241, 242, 243, 244
|
||||
- **MongoDB**: 251, 252, 253, 254
|
||||
- **Proxmox Custom**: 200, 203, 204, 205, 209, 210, 214, 215, 216, 217, 220, 222, 223, 231
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
explanation=$(explain_exit_code 127)
|
||||
echo "Error 127: $explanation"
|
||||
# Output: Error 127: Command not found
|
||||
```
|
||||
|
||||
**Error Code Examples**:
|
||||
```bash
|
||||
explain_exit_code 1 # "General error / Operation not permitted"
|
||||
explain_exit_code 126 # "Command invoked cannot execute (permission problem?)"
|
||||
explain_exit_code 127 # "Command not found"
|
||||
explain_exit_code 130 # "Terminated by Ctrl+C (SIGINT)"
|
||||
explain_exit_code 200 # "Custom: Failed to create lock file"
|
||||
explain_exit_code 999 # "Unknown error"
|
||||
```
|
||||
|
||||
### Error Handling Functions
|
||||
|
||||
#### `error_handler()`
|
||||
**Purpose**: Main error handler triggered by ERR trap or manual call
|
||||
**Parameters**:
|
||||
- `$1` - Exit code (optional, defaults to $?)
|
||||
- `$2` - Command that failed (optional, defaults to BASH_COMMAND)
|
||||
**Returns**: None (exits with error code)
|
||||
**Side Effects**:
|
||||
- Displays detailed error information
|
||||
- Logs error to debug file if enabled
|
||||
- Shows silent log content if available
|
||||
- Exits with original error code
|
||||
**Dependencies**: `explain_exit_code()`
|
||||
**Environment Variables Used**: `DEBUG_LOGFILE`, `SILENT_LOGFILE`
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
# Automatic error handling via ERR trap
|
||||
set -e
|
||||
trap 'error_handler' ERR
|
||||
|
||||
# Manual error handling
|
||||
error_handler 127 "command_not_found"
|
||||
```
|
||||
|
||||
**Error Information Displayed**:
|
||||
- Error message with color coding
|
||||
- Line number where error occurred
|
||||
- Exit code with explanation
|
||||
- Command that failed
|
||||
- Silent log content (last 20 lines)
|
||||
- Debug log entry (if enabled)
|
||||
|
||||
### Signal Handling Functions
|
||||
|
||||
#### `on_interrupt()`
|
||||
**Purpose**: Handle SIGINT (Ctrl+C) signals gracefully
|
||||
**Parameters**: None
|
||||
**Returns**: None (exits with code 130)
|
||||
**Side Effects**:
|
||||
- Displays interruption message
|
||||
- Exits with SIGINT code (130)
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
# Set up interrupt handler
|
||||
trap on_interrupt INT
|
||||
|
||||
# User presses Ctrl+C
|
||||
# Handler displays: "Interrupted by user (SIGINT)"
|
||||
# Script exits with code 130
|
||||
```
|
||||
|
||||
#### `on_terminate()`
|
||||
**Purpose**: Handle SIGTERM signals gracefully
|
||||
**Parameters**: None
|
||||
**Returns**: None (exits with code 143)
|
||||
**Side Effects**:
|
||||
- Displays termination message
|
||||
- Exits with SIGTERM code (143)
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: None
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
# Set up termination handler
|
||||
trap on_terminate TERM
|
||||
|
||||
# System sends SIGTERM
|
||||
# Handler displays: "Terminated by signal (SIGTERM)"
|
||||
# Script exits with code 143
|
||||
```
|
||||
|
||||
### Cleanup Functions
|
||||
|
||||
#### `on_exit()`
|
||||
**Purpose**: Handle script exit cleanup
|
||||
**Parameters**: None
|
||||
**Returns**: None (exits with original exit code)
|
||||
**Side Effects**:
|
||||
- Removes lock file if set
|
||||
- Exits with original exit code
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `lockfile`
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
# Set up exit handler
|
||||
trap on_exit EXIT
|
||||
|
||||
# Set lock file
|
||||
lockfile="/tmp/my_script.lock"
|
||||
|
||||
# Script exits normally or with error
|
||||
# Handler removes lock file and exits
|
||||
```
|
||||
|
||||
### Initialization Functions
|
||||
|
||||
#### `catch_errors()`
|
||||
**Purpose**: Initialize error handling traps and strict mode
|
||||
**Parameters**: None
|
||||
**Returns**: None
|
||||
**Side Effects**:
|
||||
- Sets strict error handling mode
|
||||
- Sets up error traps
|
||||
- Sets up signal traps
|
||||
- Sets up exit trap
|
||||
**Dependencies**: None
|
||||
**Environment Variables Used**: `STRICT_UNSET`
|
||||
|
||||
**Strict Mode Settings**:
|
||||
- `-E`: Exit on command failure
|
||||
- `-e`: Exit on any error
|
||||
- `-o pipefail`: Exit on pipe failure
|
||||
- `-u`: Exit on unset variables (if STRICT_UNSET=1)
|
||||
|
||||
**Trap Setup**:
|
||||
- `ERR`: Calls `error_handler` on command failure
|
||||
- `EXIT`: Calls `on_exit` on script exit
|
||||
- `INT`: Calls `on_interrupt` on SIGINT
|
||||
- `TERM`: Calls `on_terminate` on SIGTERM
|
||||
|
||||
**Usage Example**:
|
||||
```bash
|
||||
# Initialize error handling
|
||||
catch_errors
|
||||
|
||||
# Script now has full error handling
|
||||
# All errors will be caught and handled
|
||||
```
|
||||
|
||||
## Function Call Hierarchy
|
||||
|
||||
### Error Handling Flow
|
||||
```
|
||||
Command Failure
|
||||
├── ERR trap triggered
|
||||
├── error_handler() called
|
||||
│ ├── Get exit code
|
||||
│ ├── Get command info
|
||||
│ ├── Get line number
|
||||
│ ├── explain_exit_code()
|
||||
│ ├── Display error info
|
||||
│ ├── Log to debug file
|
||||
│ ├── Show silent log
|
||||
│ └── Exit with error code
|
||||
```
|
||||
|
||||
### Signal Handling Flow
|
||||
```
|
||||
Signal Received
|
||||
├── Signal trap triggered
|
||||
├── Appropriate handler called
|
||||
│ ├── on_interrupt() for SIGINT
|
||||
│ ├── on_terminate() for SIGTERM
|
||||
│ └── on_exit() for EXIT
|
||||
└── Exit with signal code
|
||||
```
|
||||
|
||||
### Initialization Flow
|
||||
```
|
||||
catch_errors()
|
||||
├── Set strict mode
|
||||
│ ├── -E (exit on failure)
|
||||
│ ├── -e (exit on error)
|
||||
│ ├── -o pipefail (pipe failure)
|
||||
│ └── -u (unset variables, if enabled)
|
||||
└── Set up traps
|
||||
├── ERR → error_handler
|
||||
├── EXIT → on_exit
|
||||
├── INT → on_interrupt
|
||||
└── TERM → on_terminate
|
||||
```
|
||||
|
||||
## Error Code Reference
|
||||
|
||||
### Generic/Shell Errors
|
||||
| Code | Description |
|
||||
|------|-------------|
|
||||
| 1 | General error / Operation not permitted |
|
||||
| 2 | Misuse of shell builtins (e.g. syntax error) |
|
||||
| 126 | Command invoked cannot execute (permission problem?) |
|
||||
| 127 | Command not found |
|
||||
| 128 | Invalid argument to exit |
|
||||
| 130 | Terminated by Ctrl+C (SIGINT) |
|
||||
| 137 | Killed (SIGKILL / Out of memory?) |
|
||||
| 139 | Segmentation fault (core dumped) |
|
||||
| 143 | Terminated (SIGTERM) |
|
||||
|
||||
### Package Manager Errors
|
||||
| Code | Description |
|
||||
|------|-------------|
|
||||
| 100 | APT: Package manager error (broken packages / dependency problems) |
|
||||
| 101 | APT: Configuration error (bad sources.list, malformed config) |
|
||||
| 255 | DPKG: Fatal internal error |
|
||||
|
||||
### Node.js Errors
|
||||
| Code | Description |
|
||||
|------|-------------|
|
||||
| 243 | Node.js: Out of memory (JavaScript heap out of memory) |
|
||||
| 245 | Node.js: Invalid command-line option |
|
||||
| 246 | Node.js: Internal JavaScript Parse Error |
|
||||
| 247 | Node.js: Fatal internal error |
|
||||
| 248 | Node.js: Invalid C++ addon / N-API failure |
|
||||
| 249 | Node.js: Inspector error |
|
||||
| 254 | npm/pnpm/yarn: Unknown fatal error |
|
||||
|
||||
### Python Errors
|
||||
| Code | Description |
|
||||
|------|-------------|
|
||||
| 210 | Python: Virtualenv / uv environment missing or broken |
|
||||
| 211 | Python: Dependency resolution failed |
|
||||
| 212 | Python: Installation aborted (permissions or EXTERNALLY-MANAGED) |
|
||||
|
||||
### Database Errors
|
||||
| Code | Description |
|
||||
|------|-------------|
|
||||
| 231 | PostgreSQL: Connection failed (server not running / wrong socket) |
|
||||
| 232 | PostgreSQL: Authentication failed (bad user/password) |
|
||||
| 233 | PostgreSQL: Database does not exist |
|
||||
| 234 | PostgreSQL: Fatal error in query / syntax |
|
||||
| 241 | MySQL/MariaDB: Connection failed (server not running / wrong socket) |
|
||||
| 242 | MySQL/MariaDB: Authentication failed (bad user/password) |
|
||||
| 243 | MySQL/MariaDB: Database does not exist |
|
||||
| 244 | MySQL/MariaDB: Fatal error in query / syntax |
|
||||
| 251 | MongoDB: Connection failed (server not running) |
|
||||
| 252 | MongoDB: Authentication failed (bad user/password) |
|
||||
| 253 | MongoDB: Database not found |
|
||||
| 254 | MongoDB: Fatal query error |
|
||||
|
||||
### Proxmox Custom Errors
|
||||
| Code | Description |
|
||||
|------|-------------|
|
||||
| 200 | Custom: Failed to create lock file |
|
||||
| 203 | Custom: Missing CTID variable |
|
||||
| 204 | Custom: Missing PCT_OSTYPE variable |
|
||||
| 205 | Custom: Invalid CTID (<100) |
|
||||
| 209 | Custom: Container creation failed |
|
||||
| 210 | Custom: Cluster not quorate |
|
||||
| 214 | Custom: Not enough storage space |
|
||||
| 215 | Custom: Container ID not listed |
|
||||
| 216 | Custom: RootFS entry missing in config |
|
||||
| 217 | Custom: Storage does not support rootdir |
|
||||
| 220 | Custom: Unable to resolve template path |
|
||||
| 222 | Custom: Template download failed after 3 attempts |
|
||||
| 223 | Custom: Template not available after download |
|
||||
| 231 | Custom: LXC stack upgrade/retry failed |
|
||||
|
||||
## Environment Variable Dependencies
|
||||
|
||||
### Required Variables
|
||||
- **`lockfile`**: Lock file path for cleanup (set by calling script)
|
||||
|
||||
### Optional 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)
|
||||
|
||||
### Internal Variables
|
||||
- **`exit_code`**: Current exit code
|
||||
- **`command`**: Failed command
|
||||
- **`line_number`**: Line number where error occurred
|
||||
- **`explanation`**: Error explanation text
|
||||
|
||||
## Error Handling Patterns
|
||||
|
||||
### Automatic Error Handling
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Initialize error handling
|
||||
catch_errors
|
||||
|
||||
# All commands are now monitored
|
||||
# Errors will be automatically caught and handled
|
||||
```
|
||||
|
||||
### Manual Error Handling
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Manual error handling
|
||||
if ! command -v required_tool >/dev/null 2>&1; then
|
||||
error_handler 127 "required_tool not found"
|
||||
fi
|
||||
```
|
||||
|
||||
### Custom Error Codes
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Use custom error codes
|
||||
if [[ ! -f /required/file ]]; then
|
||||
echo "Error: Required file missing"
|
||||
exit 200 # Custom error code
|
||||
fi
|
||||
```
|
||||
|
||||
### Signal Handling
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Set up signal handling
|
||||
trap on_interrupt INT
|
||||
trap on_terminate TERM
|
||||
trap on_exit EXIT
|
||||
|
||||
# Script handles signals gracefully
|
||||
```
|
||||
|
||||
## Integration Examples
|
||||
|
||||
### With core.func
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
source error_handler.func
|
||||
|
||||
# Silent execution uses error_handler for explanations
|
||||
silent apt-get install -y package
|
||||
# If command fails, error_handler provides explanation
|
||||
```
|
||||
|
||||
### With build.func
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
source error_handler.func
|
||||
source build.func
|
||||
|
||||
# Container creation with error handling
|
||||
# Errors are caught and explained
|
||||
```
|
||||
|
||||
### With tools.func
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
source error_handler.func
|
||||
source tools.func
|
||||
|
||||
# Tool operations with error handling
|
||||
# All errors are properly handled and explained
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Error Handling Setup
|
||||
1. Source error_handler.func early in script
|
||||
2. Call catch_errors() to initialize traps
|
||||
3. Use appropriate exit codes for different error types
|
||||
4. Provide meaningful error messages
|
||||
|
||||
### Signal Handling
|
||||
1. Always set up signal traps
|
||||
2. Provide graceful cleanup on interruption
|
||||
3. Use appropriate exit codes for signals
|
||||
4. Clean up temporary files and processes
|
||||
|
||||
### Error Reporting
|
||||
1. Use explain_exit_code() for user-friendly messages
|
||||
2. Log errors to debug files when needed
|
||||
3. Provide context information (line numbers, commands)
|
||||
4. Integrate with silent execution logging
|
||||
|
||||
### Custom Error Codes
|
||||
1. Use Proxmox custom error codes (200-231) for container/VM errors
|
||||
2. Use standard error codes for common operations
|
||||
3. Document custom error codes in script comments
|
||||
4. Provide clear error messages for custom codes
|
||||
512
docs/misc/error_handler.func/ERROR_HANDLER_INTEGRATION.md
Normal file
512
docs/misc/error_handler.func/ERROR_HANDLER_INTEGRATION.md
Normal file
@ -0,0 +1,512 @@
|
||||
# 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
|
||||
625
docs/misc/error_handler.func/ERROR_HANDLER_USAGE_EXAMPLES.md
Normal file
625
docs/misc/error_handler.func/ERROR_HANDLER_USAGE_EXAMPLES.md
Normal file
@ -0,0 +1,625 @@
|
||||
# error_handler.func Usage Examples
|
||||
|
||||
## Overview
|
||||
|
||||
This document provides practical usage examples for `error_handler.func` functions, covering common scenarios, integration patterns, and best practices.
|
||||
|
||||
## Basic Error Handling Setup
|
||||
|
||||
### Standard Script Initialization
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Standard error handling setup
|
||||
|
||||
# Source error handler
|
||||
source error_handler.func
|
||||
|
||||
# Initialize error handling
|
||||
catch_errors
|
||||
|
||||
# Your script code here
|
||||
# All errors will be automatically caught and handled
|
||||
echo "Script running..."
|
||||
apt-get update
|
||||
apt-get install -y package
|
||||
echo "Script completed successfully"
|
||||
```
|
||||
|
||||
### Minimal Error Handling
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Minimal error handling setup
|
||||
|
||||
source error_handler.func
|
||||
catch_errors
|
||||
|
||||
# Simple script with error handling
|
||||
echo "Starting operation..."
|
||||
command_that_might_fail
|
||||
echo "Operation completed"
|
||||
```
|
||||
|
||||
## Error Code Explanation Examples
|
||||
|
||||
### Basic Error Explanation
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Explain common error codes
|
||||
echo "Error 1: $(explain_exit_code 1)"
|
||||
echo "Error 127: $(explain_exit_code 127)"
|
||||
echo "Error 130: $(explain_exit_code 130)"
|
||||
echo "Error 200: $(explain_exit_code 200)"
|
||||
```
|
||||
|
||||
### Error Code Testing
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Test all error codes
|
||||
test_error_codes() {
|
||||
local codes=(1 2 126 127 128 130 137 139 143 100 101 255 200 203 204 205)
|
||||
|
||||
for code in "${codes[@]}"; do
|
||||
echo "Code $code: $(explain_exit_code $code)"
|
||||
done
|
||||
}
|
||||
|
||||
test_error_codes
|
||||
```
|
||||
|
||||
### Custom Error Code Usage
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Use custom error codes
|
||||
check_requirements() {
|
||||
if [[ ! -f /required/file ]]; then
|
||||
echo "Error: Required file missing"
|
||||
exit 200 # Custom error code
|
||||
fi
|
||||
|
||||
if [[ -z "$CTID" ]]; then
|
||||
echo "Error: CTID not set"
|
||||
exit 203 # Custom error code
|
||||
fi
|
||||
|
||||
if [[ $CTID -lt 100 ]]; then
|
||||
echo "Error: Invalid CTID"
|
||||
exit 205 # Custom error code
|
||||
fi
|
||||
}
|
||||
|
||||
check_requirements
|
||||
```
|
||||
|
||||
## Signal Handling Examples
|
||||
|
||||
### Interrupt Handling
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Set up interrupt handler
|
||||
trap on_interrupt INT
|
||||
|
||||
echo "Script running... Press Ctrl+C to interrupt"
|
||||
sleep 10
|
||||
echo "Script completed normally"
|
||||
```
|
||||
|
||||
### Termination Handling
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Set up termination handler
|
||||
trap on_terminate TERM
|
||||
|
||||
echo "Script running... Send SIGTERM to terminate"
|
||||
sleep 10
|
||||
echo "Script completed normally"
|
||||
```
|
||||
|
||||
### Complete Signal Handling
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Set up all signal handlers
|
||||
trap on_interrupt INT
|
||||
trap on_terminate TERM
|
||||
trap on_exit EXIT
|
||||
|
||||
echo "Script running with full signal handling"
|
||||
sleep 10
|
||||
echo "Script completed normally"
|
||||
```
|
||||
|
||||
## Cleanup Examples
|
||||
|
||||
### Lock File Cleanup
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Set up lock file
|
||||
lockfile="/tmp/my_script.lock"
|
||||
touch "$lockfile"
|
||||
|
||||
# Set up exit handler
|
||||
trap on_exit EXIT
|
||||
|
||||
echo "Script running with lock file..."
|
||||
sleep 5
|
||||
echo "Script completed - lock file will be removed"
|
||||
```
|
||||
|
||||
### Temporary File Cleanup
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Create temporary files
|
||||
temp_file1="/tmp/temp1.$$"
|
||||
temp_file2="/tmp/temp2.$$"
|
||||
touch "$temp_file1" "$temp_file2"
|
||||
|
||||
# Set up cleanup
|
||||
cleanup() {
|
||||
rm -f "$temp_file1" "$temp_file2"
|
||||
echo "Temporary files cleaned up"
|
||||
}
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
echo "Script running with temporary files..."
|
||||
sleep 5
|
||||
echo "Script completed - temporary files will be cleaned up"
|
||||
```
|
||||
|
||||
## Debug Logging Examples
|
||||
|
||||
### Basic Debug Logging
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Enable debug logging
|
||||
export DEBUG_LOGFILE="/tmp/debug.log"
|
||||
catch_errors
|
||||
|
||||
echo "Script with debug logging"
|
||||
apt-get update
|
||||
apt-get install -y package
|
||||
```
|
||||
|
||||
### Debug Log Analysis
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Enable debug logging
|
||||
export DEBUG_LOGFILE="/tmp/debug.log"
|
||||
catch_errors
|
||||
|
||||
# Function to analyze debug log
|
||||
analyze_debug_log() {
|
||||
if [[ -f "$DEBUG_LOGFILE" ]]; then
|
||||
echo "Debug log analysis:"
|
||||
echo "Total errors: $(grep -c "ERROR" "$DEBUG_LOGFILE")"
|
||||
echo "Recent errors:"
|
||||
tail -n 5 "$DEBUG_LOGFILE"
|
||||
else
|
||||
echo "No debug log found"
|
||||
fi
|
||||
}
|
||||
|
||||
# Run script
|
||||
echo "Running script..."
|
||||
apt-get update
|
||||
|
||||
# Analyze results
|
||||
analyze_debug_log
|
||||
```
|
||||
|
||||
## Silent Execution Integration
|
||||
|
||||
### With core.func Silent Execution
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
source error_handler.func
|
||||
|
||||
# Silent execution with error handling
|
||||
echo "Installing packages..."
|
||||
silent apt-get update
|
||||
silent apt-get install -y nginx
|
||||
|
||||
echo "Configuring service..."
|
||||
silent systemctl enable nginx
|
||||
silent systemctl start nginx
|
||||
|
||||
echo "Installation completed"
|
||||
```
|
||||
|
||||
### Silent Execution Error Handling
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source core.func
|
||||
source error_handler.func
|
||||
|
||||
# Function with silent execution and error handling
|
||||
install_package() {
|
||||
local package="$1"
|
||||
|
||||
echo "Installing $package..."
|
||||
if silent apt-get install -y "$package"; then
|
||||
echo "$package installed successfully"
|
||||
return 0
|
||||
else
|
||||
echo "Failed to install $package"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Install multiple packages
|
||||
packages=("nginx" "apache2" "mysql-server")
|
||||
for package in "${packages[@]}"; do
|
||||
if ! install_package "$package"; then
|
||||
echo "Stopping installation due to error"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
```
|
||||
|
||||
## Advanced Error Handling Examples
|
||||
|
||||
### Conditional Error Handling
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Conditional error handling based on environment
|
||||
setup_error_handling() {
|
||||
if [[ "${STRICT_MODE:-0}" == "1" ]]; then
|
||||
echo "Enabling strict mode"
|
||||
export STRICT_UNSET=1
|
||||
fi
|
||||
|
||||
catch_errors
|
||||
echo "Error handling configured"
|
||||
}
|
||||
|
||||
setup_error_handling
|
||||
```
|
||||
|
||||
### Error Recovery
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Error recovery pattern
|
||||
retry_operation() {
|
||||
local max_attempts=3
|
||||
local attempt=1
|
||||
|
||||
while [[ $attempt -le $max_attempts ]]; do
|
||||
echo "Attempt $attempt of $max_attempts"
|
||||
|
||||
if silent "$@"; then
|
||||
echo "Operation succeeded on attempt $attempt"
|
||||
return 0
|
||||
else
|
||||
echo "Attempt $attempt failed"
|
||||
((attempt++))
|
||||
|
||||
if [[ $attempt -le $max_attempts ]]; then
|
||||
echo "Retrying in 5 seconds..."
|
||||
sleep 5
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
echo "Operation failed after $max_attempts attempts"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Use retry pattern
|
||||
retry_operation apt-get update
|
||||
retry_operation apt-get install -y package
|
||||
```
|
||||
|
||||
### Custom Error Handler
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Custom error handler for specific operations
|
||||
custom_error_handler() {
|
||||
local exit_code=${1:-$?}
|
||||
local command=${2:-${BASH_COMMAND:-unknown}}
|
||||
|
||||
case "$exit_code" in
|
||||
127)
|
||||
echo "Custom handling: Command not found - $command"
|
||||
echo "Suggestions:"
|
||||
echo "1. Check if the command is installed"
|
||||
echo "2. Check if the command is in PATH"
|
||||
echo "3. Check spelling"
|
||||
;;
|
||||
126)
|
||||
echo "Custom handling: Permission denied - $command"
|
||||
echo "Suggestions:"
|
||||
echo "1. Check file permissions"
|
||||
echo "2. Run with appropriate privileges"
|
||||
echo "3. Check if file is executable"
|
||||
;;
|
||||
*)
|
||||
# Use default error handler
|
||||
error_handler "$exit_code" "$command"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Set up custom error handler
|
||||
trap 'custom_error_handler' ERR
|
||||
|
||||
# Test custom error handling
|
||||
nonexistent_command
|
||||
```
|
||||
|
||||
## Integration Examples
|
||||
|
||||
### With build.func
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Integration with build.func
|
||||
|
||||
source core.func
|
||||
source error_handler.func
|
||||
source build.func
|
||||
|
||||
# Container creation with error handling
|
||||
export APP="plex"
|
||||
export CTID="100"
|
||||
|
||||
# Errors will be caught and explained
|
||||
# Silent execution will use error_handler for explanations
|
||||
```
|
||||
|
||||
### With tools.func
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Integration with tools.func
|
||||
|
||||
source core.func
|
||||
source error_handler.func
|
||||
source tools.func
|
||||
|
||||
# Tool operations with error handling
|
||||
# All errors are properly handled and explained
|
||||
```
|
||||
|
||||
### With api.func
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Integration with api.func
|
||||
|
||||
source core.func
|
||||
source error_handler.func
|
||||
source api.func
|
||||
|
||||
# API operations with error handling
|
||||
# Network errors and API errors are properly handled
|
||||
```
|
||||
|
||||
## Best Practices Examples
|
||||
|
||||
### Comprehensive Error Handling
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Comprehensive error handling example
|
||||
|
||||
source error_handler.func
|
||||
|
||||
# Set up comprehensive error handling
|
||||
setup_comprehensive_error_handling() {
|
||||
# Enable debug logging
|
||||
export DEBUG_LOGFILE="/tmp/script_debug.log"
|
||||
|
||||
# Set up lock file
|
||||
lockfile="/tmp/script.lock"
|
||||
touch "$lockfile"
|
||||
|
||||
# Initialize error handling
|
||||
catch_errors
|
||||
|
||||
# Set up signal handlers
|
||||
trap on_interrupt INT
|
||||
trap on_terminate TERM
|
||||
trap on_exit EXIT
|
||||
|
||||
echo "Comprehensive error handling configured"
|
||||
}
|
||||
|
||||
setup_comprehensive_error_handling
|
||||
|
||||
# Script operations
|
||||
echo "Starting script operations..."
|
||||
# ... script code ...
|
||||
echo "Script operations completed"
|
||||
```
|
||||
|
||||
### Error Handling for Different Scenarios
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Different error handling for different scenarios
|
||||
handle_package_errors() {
|
||||
local exit_code=$1
|
||||
case "$exit_code" in
|
||||
100)
|
||||
echo "Package manager error - trying to fix..."
|
||||
apt-get --fix-broken install
|
||||
;;
|
||||
101)
|
||||
echo "Configuration error - checking sources..."
|
||||
apt-get update
|
||||
;;
|
||||
*)
|
||||
error_handler "$exit_code"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
handle_network_errors() {
|
||||
local exit_code=$1
|
||||
case "$exit_code" in
|
||||
127)
|
||||
echo "Network command not found - checking connectivity..."
|
||||
ping -c 1 8.8.8.8
|
||||
;;
|
||||
*)
|
||||
error_handler "$exit_code"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Use appropriate error handler
|
||||
if [[ "$1" == "package" ]]; then
|
||||
trap 'handle_package_errors $?' ERR
|
||||
elif [[ "$1" == "network" ]]; then
|
||||
trap 'handle_network_errors $?' ERR
|
||||
else
|
||||
catch_errors
|
||||
fi
|
||||
```
|
||||
|
||||
### Error Handling with Logging
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Error handling with detailed logging
|
||||
setup_logging_error_handling() {
|
||||
# Create log directory
|
||||
mkdir -p /var/log/script_errors
|
||||
|
||||
# Set up debug logging
|
||||
export DEBUG_LOGFILE="/var/log/script_errors/debug.log"
|
||||
|
||||
# Set up silent logging
|
||||
export SILENT_LOGFILE="/var/log/script_errors/silent.log"
|
||||
|
||||
# Initialize error handling
|
||||
catch_errors
|
||||
|
||||
echo "Logging error handling configured"
|
||||
}
|
||||
|
||||
setup_logging_error_handling
|
||||
|
||||
# Script operations with logging
|
||||
echo "Starting logged operations..."
|
||||
# ... script code ...
|
||||
echo "Logged operations completed"
|
||||
```
|
||||
|
||||
## Troubleshooting Examples
|
||||
|
||||
### Debug Mode
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Enable debug mode
|
||||
export DEBUG_LOGFILE="/tmp/debug.log"
|
||||
export STRICT_UNSET=1
|
||||
|
||||
catch_errors
|
||||
|
||||
echo "Debug mode enabled"
|
||||
# Script operations
|
||||
```
|
||||
|
||||
### Error Analysis
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Function to analyze errors
|
||||
analyze_errors() {
|
||||
local log_file="${1:-$DEBUG_LOGFILE}"
|
||||
|
||||
if [[ -f "$log_file" ]]; then
|
||||
echo "Error Analysis:"
|
||||
echo "Total errors: $(grep -c "ERROR" "$log_file")"
|
||||
echo "Error types:"
|
||||
grep "ERROR" "$log_file" | awk '{print $NF}' | sort | uniq -c
|
||||
echo "Recent errors:"
|
||||
tail -n 10 "$log_file"
|
||||
else
|
||||
echo "No error log found"
|
||||
fi
|
||||
}
|
||||
|
||||
# Run script with error analysis
|
||||
analyze_errors
|
||||
```
|
||||
|
||||
### Error Recovery Testing
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Test error recovery
|
||||
test_error_recovery() {
|
||||
local test_cases=(
|
||||
"nonexistent_command"
|
||||
"apt-get install nonexistent_package"
|
||||
"systemctl start nonexistent_service"
|
||||
)
|
||||
|
||||
for test_case in "${test_cases[@]}"; do
|
||||
echo "Testing: $test_case"
|
||||
if silent $test_case; then
|
||||
echo "Unexpected success"
|
||||
else
|
||||
echo "Expected failure handled"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
test_error_recovery
|
||||
```
|
||||
228
docs/misc/error_handler.func/README.md
Normal file
228
docs/misc/error_handler.func/README.md
Normal file
@ -0,0 +1,228 @@
|
||||
# error_handler.func Documentation
|
||||
|
||||
## Overview
|
||||
|
||||
The `error_handler.func` file provides comprehensive error handling and signal management for Proxmox Community Scripts. It offers detailed error code explanations, graceful error recovery, and proper cleanup mechanisms.
|
||||
|
||||
## Purpose and Use Cases
|
||||
|
||||
- **Error Code Explanation**: Provides human-readable explanations for exit codes
|
||||
- **Signal Handling**: Manages SIGINT, SIGTERM, and other signals gracefully
|
||||
- **Error Recovery**: Implements proper cleanup and error reporting
|
||||
- **Debug Logging**: Records error information for troubleshooting
|
||||
- **Silent Execution Support**: Integrates with core.func silent execution
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Key Function Groups
|
||||
- **Error Explanation**: `explain_exit_code()` - Convert exit codes to human-readable messages
|
||||
- **Error Handling**: `error_handler()` - Main error handler with detailed reporting
|
||||
- **Signal Handlers**: `on_interrupt()`, `on_terminate()` - Graceful signal handling
|
||||
- **Cleanup**: `on_exit()` - Cleanup on script exit
|
||||
- **Trap Setup**: `catch_errors()` - Initialize error handling traps
|
||||
|
||||
### Dependencies
|
||||
- **External**: None (pure Bash implementation)
|
||||
- **Internal**: Uses color variables from core.func
|
||||
|
||||
### Integration Points
|
||||
- Used by: All scripts via core.func silent execution
|
||||
- Uses: Color variables from core.func
|
||||
- Provides: Error explanations for core.func silent function
|
||||
|
||||
## Documentation Files
|
||||
|
||||
### 📊 [ERROR_HANDLER_FLOWCHART.md](./ERROR_HANDLER_FLOWCHART.md)
|
||||
Visual execution flows showing error handling processes and signal management.
|
||||
|
||||
### 📚 [ERROR_HANDLER_FUNCTIONS_REFERENCE.md](./ERROR_HANDLER_FUNCTIONS_REFERENCE.md)
|
||||
Complete alphabetical reference of all functions with parameters, dependencies, and usage details.
|
||||
|
||||
### 💡 [ERROR_HANDLER_USAGE_EXAMPLES.md](./ERROR_HANDLER_USAGE_EXAMPLES.md)
|
||||
Practical examples showing how to use error handling functions and common patterns.
|
||||
|
||||
### 🔗 [ERROR_HANDLER_INTEGRATION.md](./ERROR_HANDLER_INTEGRATION.md)
|
||||
How error_handler.func integrates with other components and provides error handling services.
|
||||
|
||||
## Key Features
|
||||
|
||||
### Error Code Categories
|
||||
- **Generic/Shell Errors**: Exit codes 1, 2, 126, 127, 128, 130, 137, 139, 143
|
||||
- **Package Manager Errors**: APT/DPKG errors (100, 101, 255)
|
||||
- **Node.js Errors**: JavaScript runtime errors (243-249, 254)
|
||||
- **Python Errors**: Python environment and dependency errors (210-212)
|
||||
- **Database Errors**: PostgreSQL, MySQL, MongoDB errors (231-254)
|
||||
- **Proxmox Custom Errors**: Container and VM specific errors (200-231)
|
||||
|
||||
### Signal Handling
|
||||
- **SIGINT (Ctrl+C)**: Graceful interruption handling
|
||||
- **SIGTERM**: Graceful termination handling
|
||||
- **EXIT**: Cleanup on script exit
|
||||
- **ERR**: Error trap for command failures
|
||||
|
||||
### Error Reporting
|
||||
- **Detailed Messages**: Human-readable error explanations
|
||||
- **Context Information**: Line numbers, commands, timestamps
|
||||
- **Log Integration**: Silent log file integration
|
||||
- **Debug Logging**: Optional debug log file support
|
||||
|
||||
## Common Usage Patterns
|
||||
|
||||
### Basic Error Handling Setup
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Basic error handling setup
|
||||
|
||||
source error_handler.func
|
||||
|
||||
# Initialize error handling
|
||||
catch_errors
|
||||
|
||||
# Your script code here
|
||||
# Errors will be automatically handled
|
||||
```
|
||||
|
||||
### Manual Error Explanation
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Get error explanation
|
||||
explanation=$(explain_exit_code 127)
|
||||
echo "Error 127: $explanation"
|
||||
# Output: Error 127: Command not found
|
||||
```
|
||||
|
||||
### Custom Error Handling
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source error_handler.func
|
||||
|
||||
# Custom error handling
|
||||
if ! command -v required_tool >/dev/null 2>&1; then
|
||||
echo "Error: required_tool not found"
|
||||
exit 127
|
||||
fi
|
||||
```
|
||||
|
||||
## Environment Variables
|
||||
|
||||
### Debug 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)
|
||||
|
||||
### Internal Variables
|
||||
- `lockfile`: Lock file path for cleanup (set by calling script)
|
||||
- `exit_code`: Current exit code
|
||||
- `command`: Failed command
|
||||
- `line_number`: Line number where error occurred
|
||||
|
||||
## Error Categories
|
||||
|
||||
### Generic/Shell Errors
|
||||
- **1**: General error / Operation not permitted
|
||||
- **2**: Misuse of shell builtins (syntax error)
|
||||
- **126**: Command invoked cannot execute (permission problem)
|
||||
- **127**: Command not found
|
||||
- **128**: Invalid argument to exit
|
||||
- **130**: Terminated by Ctrl+C (SIGINT)
|
||||
- **137**: Killed (SIGKILL / Out of memory)
|
||||
- **139**: Segmentation fault (core dumped)
|
||||
- **143**: Terminated (SIGTERM)
|
||||
|
||||
### Package Manager Errors
|
||||
- **100**: APT package manager error (broken packages)
|
||||
- **101**: APT configuration error (bad sources.list)
|
||||
- **255**: DPKG fatal internal error
|
||||
|
||||
### Node.js Errors
|
||||
- **243**: JavaScript heap out of memory
|
||||
- **245**: Invalid command-line option
|
||||
- **246**: Internal JavaScript parse error
|
||||
- **247**: Fatal internal error
|
||||
- **248**: Invalid C++ addon / N-API failure
|
||||
- **249**: Inspector error
|
||||
- **254**: npm/pnpm/yarn unknown fatal error
|
||||
|
||||
### Python Errors
|
||||
- **210**: Virtualenv/uv environment missing or broken
|
||||
- **211**: Dependency resolution failed
|
||||
- **212**: Installation aborted (permissions or EXTERNALLY-MANAGED)
|
||||
|
||||
### Database Errors
|
||||
- **PostgreSQL (231-234)**: Connection, authentication, database, query errors
|
||||
- **MySQL/MariaDB (241-244)**: Connection, authentication, database, query errors
|
||||
- **MongoDB (251-254)**: Connection, authentication, database, query errors
|
||||
|
||||
### Proxmox Custom Errors
|
||||
- **200**: Failed to create lock file
|
||||
- **203**: Missing CTID variable
|
||||
- **204**: Missing PCT_OSTYPE variable
|
||||
- **205**: Invalid CTID (<100)
|
||||
- **209**: Container creation failed
|
||||
- **210**: Cluster not quorate
|
||||
- **214**: Not enough storage space
|
||||
- **215**: Container ID not listed
|
||||
- **216**: RootFS entry missing in config
|
||||
- **217**: Storage does not support rootdir
|
||||
- **220**: Unable to resolve template path
|
||||
- **222**: Template download failed after 3 attempts
|
||||
- **223**: Template not available after download
|
||||
- **231**: LXC stack upgrade/retry failed
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Error Handling Setup
|
||||
1. Source error_handler.func early in script
|
||||
2. Call catch_errors() to initialize traps
|
||||
3. Use proper exit codes for different error types
|
||||
4. Provide meaningful error messages
|
||||
|
||||
### Signal Handling
|
||||
1. Always set up signal traps
|
||||
2. Provide graceful cleanup on interruption
|
||||
3. Use appropriate exit codes for signals
|
||||
4. Clean up temporary files and processes
|
||||
|
||||
### Error Reporting
|
||||
1. Use explain_exit_code() for user-friendly messages
|
||||
2. Log errors to debug files when needed
|
||||
3. Provide context information (line numbers, commands)
|
||||
4. Integrate with silent execution logging
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
1. **Missing Error Handler**: Ensure error_handler.func is sourced
|
||||
2. **Trap Not Set**: Call catch_errors() to initialize traps
|
||||
3. **Color Variables**: Ensure core.func is sourced for colors
|
||||
4. **Lock Files**: Clean up lock files in on_exit()
|
||||
|
||||
### Debug Mode
|
||||
Enable debug logging for detailed error information:
|
||||
```bash
|
||||
export DEBUG_LOGFILE="/tmp/debug.log"
|
||||
source error_handler.func
|
||||
catch_errors
|
||||
```
|
||||
|
||||
### Error Code Testing
|
||||
Test error explanations:
|
||||
```bash
|
||||
source error_handler.func
|
||||
for code in 1 2 126 127 128 130 137 139 143; do
|
||||
echo "Code $code: $(explain_exit_code $code)"
|
||||
done
|
||||
```
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- [core.func](../core.func/) - Core utilities and silent execution
|
||||
- [build.func](../build.func/) - Container creation with error handling
|
||||
- [tools.func](../tools.func/) - Extended utilities with error handling
|
||||
- [api.func](../api.func/) - API operations with error handling
|
||||
|
||||
---
|
||||
|
||||
*This documentation covers the error_handler.func file which provides comprehensive error handling for all Proxmox Community Scripts.*
|
||||
117
docs/misc/install.func/INSTALL_FUNC_FLOWCHART.md
Normal file
117
docs/misc/install.func/INSTALL_FUNC_FLOWCHART.md
Normal file
@ -0,0 +1,117 @@
|
||||
# install.func Flowchart
|
||||
|
||||
## Installation Workflow
|
||||
|
||||
```
|
||||
┌──────────────────────────────────┐
|
||||
│ Container Started │
|
||||
│ (Inside LXC by build.func) │
|
||||
└──────────────┬───────────────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────────────┐
|
||||
│ Source Functions │
|
||||
│ $FUNCTIONS_FILE_PATH │
|
||||
└──────────┬───────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────────────┐
|
||||
│ setting_up_container│
|
||||
│ Display setup msg │
|
||||
└──────────┬───────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────────────┐
|
||||
│ network_check() │
|
||||
│ (Verify internet) │
|
||||
└────┬──────────────┬──┘
|
||||
│ │
|
||||
OK FAIL
|
||||
│ │
|
||||
│ ▼
|
||||
│ ┌──────────────┐
|
||||
│ │ Retry Check │
|
||||
│ │ 3 attempts │
|
||||
│ └────┬─────┬───┘
|
||||
│ │ │
|
||||
│ OK FAIL
|
||||
│ │ │
|
||||
└──────────────┘ │
|
||||
│ │
|
||||
▼ ▼
|
||||
┌──────────────────────┐ ┌──────────────┐
|
||||
│ update_os() │ │ Exit Error │
|
||||
│ (apt update/upgrade) │ │ No internet │
|
||||
└──────────┬───────────┘ └──────────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────────────┐
|
||||
│ verb_ip6() [optional]│
|
||||
│ (Enable IPv6) │
|
||||
└──────────┬───────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────────────┐
|
||||
│ Application │
|
||||
│ Installation │
|
||||
│ (Main work) │
|
||||
└──────────┬───────────┘
|
||||
│
|
||||
┌───────┴────────┐
|
||||
│ │
|
||||
SUCCESS FAILED
|
||||
│ │
|
||||
│ └─ error_handler catches
|
||||
│ (if catch_errors active)
|
||||
│
|
||||
▼
|
||||
┌──────────────────────┐
|
||||
│ motd_ssh() │
|
||||
│ (Setup SSH/MOTD) │
|
||||
└──────────┬───────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────────────┐
|
||||
│ customize() │
|
||||
│ (Apply settings) │
|
||||
└──────────┬───────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────────────┐
|
||||
│ cleanup_lxc() │
|
||||
│ (Final cleanup) │
|
||||
└──────────┬───────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────────────┐
|
||||
│ Installation │
|
||||
│ Complete ✓ │
|
||||
└──────────────────────┘
|
||||
```
|
||||
|
||||
## Network Check Retry Logic
|
||||
|
||||
```
|
||||
network_check()
|
||||
│
|
||||
├─ Ping 8.8.8.8 (Google DNS)
|
||||
│ └─ Response?
|
||||
│ ├─ YES: Continue
|
||||
│ └─ NO: Retry
|
||||
│
|
||||
├─ Retry 1
|
||||
│ └─ Wait 5s, ping again
|
||||
│
|
||||
├─ Retry 2
|
||||
│ └─ Wait 5s, ping again
|
||||
│
|
||||
└─ Retry 3
|
||||
├─ If OK: Continue
|
||||
└─ If FAIL: Exit Error
|
||||
(Network unavailable)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Visual Reference for**: install.func container setup workflows
|
||||
**Last Updated**: December 2025
|
||||
237
docs/misc/install.func/INSTALL_FUNC_FUNCTIONS_REFERENCE.md
Normal file
237
docs/misc/install.func/INSTALL_FUNC_FUNCTIONS_REFERENCE.md
Normal file
@ -0,0 +1,237 @@
|
||||
# install.func Functions Reference
|
||||
|
||||
Complete reference of all functions in install.func with detailed usage information.
|
||||
|
||||
## Function Index
|
||||
|
||||
- `setting_up_container()` - Initialize container setup
|
||||
- `network_check()` - Verify network connectivity
|
||||
- `update_os()` - Update OS packages
|
||||
- `verb_ip6()` - Enable IPv6
|
||||
- `motd_ssh()` - Configure SSH and MOTD
|
||||
- `customize()` - Apply container customizations
|
||||
- `cleanup_lxc()` - Final container cleanup
|
||||
|
||||
---
|
||||
|
||||
## Core Functions
|
||||
|
||||
### setting_up_container()
|
||||
|
||||
Display setup message and initialize container environment.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
setting_up_container
|
||||
```
|
||||
|
||||
**Purpose**: Announce container initialization and set initial environment
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
setting_up_container
|
||||
# Output: ⏳ Setting up container...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### network_check()
|
||||
|
||||
Verify network connectivity with automatic retry logic.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
network_check
|
||||
```
|
||||
|
||||
**Purpose**: Ensure internet connectivity before critical operations
|
||||
|
||||
**Behavior**:
|
||||
- Pings 8.8.8.8 (Google DNS)
|
||||
- 3 attempts with 5-second delays
|
||||
- Exits with error if all attempts fail
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
network_check
|
||||
# If no internet: Exits with error message
|
||||
# If internet OK: Continues to next step
|
||||
```
|
||||
|
||||
**Error Handling**:
|
||||
```bash
|
||||
if ! network_check; then
|
||||
msg_error "No internet connection"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### update_os()
|
||||
|
||||
Update OS packages with error handling.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
update_os
|
||||
```
|
||||
|
||||
**Purpose**: Prepare container with latest packages
|
||||
|
||||
**On Debian/Ubuntu**:
|
||||
- Runs: `apt-get update && apt-get upgrade -y`
|
||||
|
||||
**On Alpine**:
|
||||
- Runs: `apk update && apk upgrade`
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
update_os
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### verb_ip6()
|
||||
|
||||
Enable IPv6 support in container (optional).
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
verb_ip6
|
||||
```
|
||||
|
||||
**Purpose**: Enable IPv6 if needed for application
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
verb_ip6 # Enable IPv6
|
||||
network_check # Verify connectivity with IPv6
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### motd_ssh()
|
||||
|
||||
Configure SSH daemon and MOTD for container access.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
motd_ssh
|
||||
```
|
||||
|
||||
**Purpose**: Setup SSH and create login message
|
||||
|
||||
**Configures**:
|
||||
- SSH daemon startup and keys
|
||||
- Custom MOTD displaying application access info
|
||||
- SSH port and security settings
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
motd_ssh
|
||||
# SSH is now configured and application info is in MOTD
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### customize()
|
||||
|
||||
Apply container customizations and final setup.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
customize
|
||||
```
|
||||
|
||||
**Purpose**: Apply any remaining customizations
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
customize
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### cleanup_lxc()
|
||||
|
||||
Final cleanup and completion of installation.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
**Purpose**: Remove temporary files and finalize installation
|
||||
|
||||
**Cleans**:
|
||||
- Temporary installation files
|
||||
- Package manager cache
|
||||
- Log files from installation process
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
cleanup_lxc
|
||||
# Installation is now complete and ready
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Common Patterns
|
||||
|
||||
### Basic Installation Pattern
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
# ... application installation ...
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
### With IPv6 Support
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
setting_up_container
|
||||
verb_ip6 # Enable IPv6
|
||||
network_check
|
||||
update_os
|
||||
|
||||
# ... application installation ...
|
||||
```
|
||||
|
||||
### With Error Handling
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
catch_errors # Setup error trapping
|
||||
setting_up_container
|
||||
|
||||
if ! network_check; then
|
||||
msg_error "Network connectivity failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
update_os
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
**Total Functions**: 7
|
||||
**Maintained by**: community-scripts team
|
||||
104
docs/misc/install.func/INSTALL_FUNC_INTEGRATION.md
Normal file
104
docs/misc/install.func/INSTALL_FUNC_INTEGRATION.md
Normal file
@ -0,0 +1,104 @@
|
||||
# install.func Integration Guide
|
||||
|
||||
How install.func integrates with the ProxmoxVE ecosystem and connects to other function libraries.
|
||||
|
||||
## Component Integration
|
||||
|
||||
### install.func in the Installation Pipeline
|
||||
|
||||
```
|
||||
install/app-install.sh (container-side)
|
||||
│
|
||||
├─ Sources: core.func (messaging)
|
||||
├─ Sources: error_handler.func (error handling)
|
||||
│
|
||||
├─ ★ Uses: install.func ★
|
||||
│ ├─ setting_up_container()
|
||||
│ ├─ network_check()
|
||||
│ ├─ update_os()
|
||||
│ └─ motd_ssh()
|
||||
│
|
||||
├─ Uses: tools.func (package installation)
|
||||
│
|
||||
└─ Back to install.func:
|
||||
├─ customize()
|
||||
└─ cleanup_lxc()
|
||||
```
|
||||
|
||||
### Integration with tools.func
|
||||
|
||||
install.func and tools.func work together:
|
||||
|
||||
```
|
||||
setting_up_container() [install.func]
|
||||
│
|
||||
update_os() [install.func]
|
||||
│
|
||||
pkg_update() [tools.func]
|
||||
setup_nodejs() [tools.func]
|
||||
setup_mariadb() [tools.func]
|
||||
│
|
||||
motd_ssh() [install.func]
|
||||
customize() [install.func]
|
||||
cleanup_lxc() [install.func]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Dependencies
|
||||
|
||||
### External Dependencies
|
||||
|
||||
- `curl`, `wget` - For downloads
|
||||
- `apt-get` or `apk` - Package management
|
||||
- `ping` - Network verification
|
||||
- `systemctl` or `rc-service` - Service management
|
||||
|
||||
### Internal Dependencies
|
||||
|
||||
```
|
||||
install.func uses:
|
||||
├─ core.func (for messaging and colors)
|
||||
├─ error_handler.func (for error handling)
|
||||
└─ tools.func (for package operations)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Always Follow This Pattern
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
# 1. Setup error handling
|
||||
catch_errors
|
||||
|
||||
# 2. Initialize container
|
||||
setting_up_container
|
||||
|
||||
# 3. Verify network
|
||||
network_check
|
||||
|
||||
# 4. Update OS
|
||||
update_os
|
||||
|
||||
# 5. Installation (your code)
|
||||
# ... install application ...
|
||||
|
||||
# 6. Configure access
|
||||
motd_ssh
|
||||
|
||||
# 7. Customize
|
||||
customize
|
||||
|
||||
# 8. Cleanup
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
**Maintainers**: community-scripts team
|
||||
93
docs/misc/install.func/INSTALL_FUNC_USAGE_EXAMPLES.md
Normal file
93
docs/misc/install.func/INSTALL_FUNC_USAGE_EXAMPLES.md
Normal file
@ -0,0 +1,93 @@
|
||||
# install.func Usage Examples
|
||||
|
||||
Practical examples for using install.func functions in application installation scripts.
|
||||
|
||||
## Basic Examples
|
||||
|
||||
### Example 1: Minimal Setup
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
# ... application installation ...
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
### Example 2: With Error Handling
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
catch_errors
|
||||
setting_up_container
|
||||
|
||||
if ! network_check; then
|
||||
msg_error "Network failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! update_os; then
|
||||
msg_error "OS update failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ... continue ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Production Examples
|
||||
|
||||
### Example 3: Full Application Installation
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing application"
|
||||
# ... install steps ...
|
||||
msg_ok "Application installed"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
### Example 4: With IPv6 Support
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
catch_errors
|
||||
setting_up_container
|
||||
verb_ip6
|
||||
network_check
|
||||
update_os
|
||||
|
||||
# ... application installation ...
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
**Examples**: Basic and production patterns
|
||||
**All examples production-ready**
|
||||
248
docs/misc/install.func/README.md
Normal file
248
docs/misc/install.func/README.md
Normal file
@ -0,0 +1,248 @@
|
||||
# install.func Documentation
|
||||
|
||||
## Overview
|
||||
|
||||
The `install.func` file provides container installation workflow orchestration and fundamental operations for applications deployed inside LXC containers. It handles network setup, OS configuration, connectivity verification, and installation mechanics.
|
||||
|
||||
## Purpose and Use Cases
|
||||
|
||||
- **Container Setup**: Initialize new container with proper configuration
|
||||
- **Network Verification**: Verify IPv4 and IPv6 connectivity
|
||||
- **OS Configuration**: Update OS, apply system settings
|
||||
- **Installation Workflow**: Orchestrate application installation steps
|
||||
- **Error Handling**: Comprehensive signal trapping and error recovery
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Key Function Groups
|
||||
- **Initialization**: `setting_up_container()` - Setup message and environment
|
||||
- **Network**: `network_check()`, `verb_ip6()` - Connectivity verification
|
||||
- **OS Configuration**: `update_os()` - OS updates and package management
|
||||
- **Installation**: `motd_ssh()`, `customize()` - Container customization
|
||||
- **Cleanup**: `cleanup_lxc()` - Final container cleanup
|
||||
|
||||
### Dependencies
|
||||
- **External**: `curl`, `apt-get`, `ping`, `dns` utilities
|
||||
- **Internal**: Uses functions from `core.func`, `error_handler.func`, `tools.func`
|
||||
|
||||
### Integration Points
|
||||
- Used by: All install/*.sh scripts at startup
|
||||
- Uses: Environment variables from build.func and core.func
|
||||
- Provides: Container initialization and management services
|
||||
|
||||
## Documentation Files
|
||||
|
||||
### 📊 [INSTALL_FUNC_FLOWCHART.md](./INSTALL_FUNC_FLOWCHART.md)
|
||||
Visual execution flows showing initialization, network checks, and installation workflows.
|
||||
|
||||
### 📚 [INSTALL_FUNC_FUNCTIONS_REFERENCE.md](./INSTALL_FUNC_FUNCTIONS_REFERENCE.md)
|
||||
Complete alphabetical reference of all functions with parameters, dependencies, and usage details.
|
||||
|
||||
### 💡 [INSTALL_FUNC_USAGE_EXAMPLES.md](./INSTALL_FUNC_USAGE_EXAMPLES.md)
|
||||
Practical examples showing how to use installation functions and common patterns.
|
||||
|
||||
### 🔗 [INSTALL_FUNC_INTEGRATION.md](./INSTALL_FUNC_INTEGRATION.md)
|
||||
How install.func integrates with other components and provides installation services.
|
||||
|
||||
## Key Features
|
||||
|
||||
### Container Initialization
|
||||
- **Environment Setup**: Prepare container variables and functions
|
||||
- **Message System**: Display installation progress with colored output
|
||||
- **Error Handlers**: Setup signal trapping for proper cleanup
|
||||
|
||||
### Network & Connectivity
|
||||
- **IPv4 Verification**: Ping external hosts to verify internet access
|
||||
- **IPv6 Support**: Optional IPv6 enablement and verification
|
||||
- **DNS Checking**: Verify DNS resolution is working
|
||||
- **Retry Logic**: Automatic retries for transient failures
|
||||
|
||||
### OS Configuration
|
||||
- **Package Updates**: Safely update OS package lists
|
||||
- **System Optimization**: Disable unnecessary services (wait-online)
|
||||
- **Timezone**: Validate and set container timezone
|
||||
- **SSH Setup**: Configure SSH daemon and keys
|
||||
|
||||
### Container Customization
|
||||
- **MOTD**: Create custom login message
|
||||
- **Auto-Login**: Optional passwordless root login
|
||||
- **Update Script**: Register application update function
|
||||
- **Customization Hooks**: Application-specific setup
|
||||
|
||||
## Function Categories
|
||||
|
||||
### 🔹 Core Functions
|
||||
- `setting_up_container()` - Display setup message and set environment
|
||||
- `network_check()` - Verify network connectivity
|
||||
- `update_os()` - Update OS packages with retry logic
|
||||
- `verb_ip6()` - Enable IPv6 (optional)
|
||||
|
||||
### 🔹 Configuration Functions
|
||||
- `motd_ssh()` - Setup MOTD and SSH configuration
|
||||
- `customize()` - Apply container customizations
|
||||
- `cleanup_lxc()` - Final cleanup before completion
|
||||
|
||||
### 🔹 Utility Functions
|
||||
- `create_update_script()` - Register application update function
|
||||
- `set_timezone()` - Configure container timezone
|
||||
- `disable_wait_online()` - Disable systemd-networkd-wait-online
|
||||
|
||||
## Execution Flow
|
||||
|
||||
```
|
||||
Container Started
|
||||
↓
|
||||
source $FUNCTIONS_FILE_PATH
|
||||
↓
|
||||
setting_up_container() ← Display "Setting up container..."
|
||||
↓
|
||||
network_check() ← Verify internet connectivity
|
||||
↓
|
||||
update_os() ← Update package lists
|
||||
↓
|
||||
[Application-Specific Installation]
|
||||
↓
|
||||
motd_ssh() ← Configure SSH/MOTD
|
||||
customize() ← Apply customizations
|
||||
↓
|
||||
cleanup_lxc() ← Final cleanup
|
||||
↓
|
||||
Installation Complete
|
||||
```
|
||||
|
||||
## Common Usage Patterns
|
||||
|
||||
### Basic Container Setup
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
# ... application installation ...
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
### With Optional IPv6
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
setting_up_container
|
||||
verb_ip6 # Enable IPv6
|
||||
network_check
|
||||
update_os
|
||||
|
||||
# ... installation ...
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
### With Custom Update Script
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
# ... installation ...
|
||||
|
||||
# Register update function
|
||||
function update_script() {
|
||||
# Update logic here
|
||||
}
|
||||
export -f update_script
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### ✅ DO
|
||||
- Call `setting_up_container()` at the start
|
||||
- Check `network_check()` output before main installation
|
||||
- Use `$STD` variable for silent operations
|
||||
- Call `cleanup_lxc()` at the very end
|
||||
- Test network connectivity before critical operations
|
||||
|
||||
### ❌ DON'T
|
||||
- Skip network verification
|
||||
- Assume internet is available
|
||||
- Hardcode container paths
|
||||
- Use `echo` instead of `msg_*` functions
|
||||
- Forget to call cleanup at the end
|
||||
|
||||
## Environment Variables
|
||||
|
||||
### Available Variables
|
||||
- `$FUNCTIONS_FILE_PATH` - Path to core functions (set by build.func)
|
||||
- `$CTID` - Container ID number
|
||||
- `$NSAPP` - Normalized application name (lowercase)
|
||||
- `$APP` - Application display name
|
||||
- `$STD` - Output suppression (`silent` or empty)
|
||||
- `$VERBOSE` - Verbose output mode (`yes` or `no`)
|
||||
|
||||
### Setting Container Variables
|
||||
```bash
|
||||
CONTAINER_TIMEZONE="UTC"
|
||||
CONTAINER_HOSTNAME="myapp-container"
|
||||
CONTAINER_FQDN="myapp.example.com"
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "Network check failed"
|
||||
```bash
|
||||
# Container may not have internet access
|
||||
# Check:
|
||||
ping 8.8.8.8 # External connectivity
|
||||
nslookup example.com # DNS resolution
|
||||
ip route show # Routing table
|
||||
```
|
||||
|
||||
### "Package update failed"
|
||||
```bash
|
||||
# APT may be locked by another process
|
||||
ps aux | grep apt # Check for running apt
|
||||
# Or wait for existing apt to finish
|
||||
sleep 30
|
||||
update_os
|
||||
```
|
||||
|
||||
### "Cannot source functions"
|
||||
```bash
|
||||
# $FUNCTIONS_FILE_PATH may not be set
|
||||
# This variable is set by build.func before running install script
|
||||
# If missing, the install script was not called properly
|
||||
```
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- **[tools.func/](../tools.func/)** - Package and tool installation
|
||||
- **[core.func/](../core.func/)** - Utility functions and messaging
|
||||
- **[error_handler.func/](../error_handler.func/)** - Error handling
|
||||
- **[alpine-install.func/](../alpine-install.func/)** - Alpine-specific setup
|
||||
- **[UPDATED_APP-install.md](../../UPDATED_APP-install.md)** - Application script guide
|
||||
|
||||
## Recent Updates
|
||||
|
||||
### Version 2.0 (Dec 2025)
|
||||
- ✅ Improved network connectivity checks
|
||||
- ✅ Enhanced OS update error handling
|
||||
- ✅ Added IPv6 support with verb_ip6()
|
||||
- ✅ Better timezone validation
|
||||
- ✅ Streamlined cleanup procedures
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
**Maintainers**: community-scripts team
|
||||
**License**: MIT
|
||||
234
docs/misc/tools.func/README.md
Normal file
234
docs/misc/tools.func/README.md
Normal file
@ -0,0 +1,234 @@
|
||||
# tools.func Documentation
|
||||
|
||||
## Overview
|
||||
|
||||
The `tools.func` file provides a comprehensive collection of helper functions for robust package management, repository management, and tool installation in Debian/Ubuntu-based systems. It is the central hub for installing services, databases, programming languages, and development tools in containers.
|
||||
|
||||
## Purpose and Use Cases
|
||||
|
||||
- **Package Management**: Robust APT/DPKG operations with retry logic
|
||||
- **Repository Setup**: Prepare and configure package repositories safely
|
||||
- **Tool Installation**: Install 30+ tools (Node.js, PHP, databases, etc.)
|
||||
- **Dependency Handling**: Manage complex installation workflows
|
||||
- **Error Recovery**: Automatic recovery from network failures
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Key Function Groups
|
||||
- **Package Helpers**: `pkg_install()`, `pkg_update()`, `pkg_remove()` - APT operations with retry
|
||||
- **Repository Setup**: `setup_deb822_repo()` - Modern repository configuration
|
||||
- **Tool Installation**: `setup_nodejs()`, `setup_php()`, `setup_mariadb()`, etc. - 30+ tool functions
|
||||
- **System Utilities**: `disable_wait_online()`, `customize()` - System optimization
|
||||
- **Container Setup**: `setting_up_container()`, `motd_ssh()` - Container initialization
|
||||
|
||||
### Dependencies
|
||||
- **External**: `curl`, `wget`, `apt-get`, `gpg`
|
||||
- **Internal**: Uses functions from `core.func`, `install.func`, `error_handler.func`
|
||||
|
||||
### Integration Points
|
||||
- Used by: All install scripts for dependency installation
|
||||
- Uses: Environment variables from build.func and core.func
|
||||
- Provides: Tool installation, package management, and repository services
|
||||
|
||||
## Documentation Files
|
||||
|
||||
### 📊 [TOOLS_FUNC_FLOWCHART.md](./TOOLS_FUNC_FLOWCHART.md)
|
||||
Visual execution flows showing package management, tool installation, and repository setup workflows.
|
||||
|
||||
### 📚 [TOOLS_FUNC_FUNCTIONS_REFERENCE.md](./TOOLS_FUNC_FUNCTIONS_REFERENCE.md)
|
||||
Complete alphabetical reference of all 30+ functions with parameters, dependencies, and usage details.
|
||||
|
||||
### 💡 [TOOLS_FUNC_USAGE_EXAMPLES.md](./TOOLS_FUNC_USAGE_EXAMPLES.md)
|
||||
Practical examples showing how to use tool installation functions and common patterns.
|
||||
|
||||
### 🔗 [TOOLS_FUNC_INTEGRATION.md](./TOOLS_FUNC_INTEGRATION.md)
|
||||
How tools.func integrates with other components and provides package/tool services.
|
||||
|
||||
### 🔧 [TOOLS_FUNC_ENVIRONMENT_VARIABLES.md](./TOOLS_FUNC_ENVIRONMENT_VARIABLES.md)
|
||||
Complete reference of environment variables and configuration options.
|
||||
|
||||
## Key Features
|
||||
|
||||
### Robust Package Management
|
||||
- **Automatic Retry Logic**: 3 attempts with backoff for transient failures
|
||||
- **Silent Mode**: Suppress output with `$STD` variable
|
||||
- **Error Recovery**: Automatic cleanup of broken packages
|
||||
- **Atomic Operations**: Ensure consistent state even on failure
|
||||
|
||||
### Tool Installation Coverage
|
||||
- **Node.js Ecosystem**: Node.js, npm, yarn, pnpm
|
||||
- **PHP Stack**: PHP-FPM, PHP-CLI, Composer
|
||||
- **Databases**: MariaDB, PostgreSQL, MongoDB
|
||||
- **Development Tools**: Git, build-essential, Docker
|
||||
- **Monitoring**: Grafana, Prometheus, Telegraf
|
||||
- **And 20+ more...**
|
||||
|
||||
### Repository Management
|
||||
- **Deb822 Format**: Modern standardized repository format
|
||||
- **Keyring Handling**: Automatic GPG key management
|
||||
- **Cleanup**: Removes legacy repositories and keyrings
|
||||
- **Validation**: Verifies repository accessibility before use
|
||||
|
||||
## Common Usage Patterns
|
||||
|
||||
### Installing a Tool
|
||||
```bash
|
||||
setup_nodejs "20" # Install Node.js v20
|
||||
setup_php "8.2" # Install PHP 8.2
|
||||
setup_mariadb "11" # Install MariaDB 11
|
||||
```
|
||||
|
||||
### Safe Package Operations
|
||||
```bash
|
||||
pkg_update # Update package lists with retry
|
||||
pkg_install curl wget # Install packages safely
|
||||
pkg_remove old-tool # Remove package cleanly
|
||||
```
|
||||
|
||||
### Setting Up Repositories
|
||||
```bash
|
||||
setup_deb822_repo "ppa:example/ppa" "example-app" "jammy" "http://example.com" "release"
|
||||
```
|
||||
|
||||
## Function Categories
|
||||
|
||||
### 🔹 Core Package Functions
|
||||
- `pkg_install()` - Install packages with retry logic
|
||||
- `pkg_update()` - Update package lists safely
|
||||
- `pkg_remove()` - Remove packages completely
|
||||
|
||||
### 🔹 Repository Functions
|
||||
- `setup_deb822_repo()` - Add repository in deb822 format
|
||||
- `cleanup_repo_metadata()` - Clean GPG keys and old repos
|
||||
- `check_repository()` - Verify repository is accessible
|
||||
|
||||
### 🔹 Tool Installation Functions (30+)
|
||||
**Programming Languages**:
|
||||
- `setup_nodejs()` - Node.js with npm
|
||||
- `setup_php()` - PHP-FPM and CLI
|
||||
- `setup_python()` - Python 3 with pip
|
||||
- `setup_ruby()` - Ruby with gem
|
||||
- `setup_golang()` - Go programming language
|
||||
|
||||
**Databases**:
|
||||
- `setup_mariadb()` - MariaDB server
|
||||
- `setup_postgresql()` - PostgreSQL database
|
||||
- `setup_mongodb()` - MongoDB NoSQL
|
||||
- `setup_redis()` - Redis cache
|
||||
|
||||
**Web Servers & Proxies**:
|
||||
- `setup_nginx()` - Nginx web server
|
||||
- `setup_apache()` - Apache HTTP server
|
||||
- `setup_caddy()` - Caddy web server
|
||||
- `setup_traefik()` - Traefik reverse proxy
|
||||
|
||||
**Containers & Virtualization**:
|
||||
- `setup_docker()` - Docker container runtime
|
||||
- `setup_podman()` - Podman container runtime
|
||||
|
||||
**Development & System Tools**:
|
||||
- `setup_git()` - Git version control
|
||||
- `setup_docker_compose()` - Docker Compose
|
||||
- `setup_composer()` - PHP dependency manager
|
||||
- `setup_build_tools()` - C/C++ compilation tools
|
||||
|
||||
**Monitoring & Logging**:
|
||||
- `setup_grafana()` - Grafana dashboards
|
||||
- `setup_prometheus()` - Prometheus monitoring
|
||||
- `setup_telegraf()` - Telegraf metrics collector
|
||||
|
||||
### 🔹 System Configuration Functions
|
||||
- `setting_up_container()` - Container initialization message
|
||||
- `network_check()` - Verify network connectivity
|
||||
- `update_os()` - Update OS packages safely
|
||||
- `customize()` - Apply container customizations
|
||||
- `motd_ssh()` - Configure SSH and MOTD
|
||||
- `cleanup_lxc()` - Final container cleanup
|
||||
|
||||
## Best Practices
|
||||
|
||||
### ✅ DO
|
||||
- Use `$STD` to suppress output in production scripts
|
||||
- Chain multiple tool installations together
|
||||
- Check for tool availability before using
|
||||
- Use version parameters when available
|
||||
- Test new repositories before production use
|
||||
|
||||
### ❌ DON'T
|
||||
- Mix package managers (apt and apk in same script)
|
||||
- Hardcode tool versions directly
|
||||
- Skip error checking on package operations
|
||||
- Use `apt-get install -y` without `$STD`
|
||||
- Leave temporary files after installation
|
||||
|
||||
## Recent Updates
|
||||
|
||||
### Version 2.0 (Dec 2025)
|
||||
- ✅ Added `setup_deb822_repo()` for modern repository format
|
||||
- ✅ Improved error handling with automatic cleanup
|
||||
- ✅ Added 5 new tool installation functions
|
||||
- ✅ Enhanced package retry logic with backoff
|
||||
- ✅ Standardized tool version handling
|
||||
|
||||
## Integration with Other Functions
|
||||
|
||||
```
|
||||
tools.func
|
||||
├── Uses: core.func (messaging, colors)
|
||||
├── Uses: error_handler.func (exit codes, trapping)
|
||||
├── Uses: install.func (network_check, update_os)
|
||||
│
|
||||
└── Used by: All install/*.sh scripts
|
||||
├── For: Package installation
|
||||
├── For: Tool setup
|
||||
└── For: Repository management
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "Package manager is locked"
|
||||
```bash
|
||||
# Wait for apt lock to release
|
||||
sleep 10
|
||||
pkg_update
|
||||
```
|
||||
|
||||
### "GPG key not found"
|
||||
```bash
|
||||
# Repository setup will handle this automatically
|
||||
# If manual fix needed:
|
||||
cleanup_repo_metadata
|
||||
setup_deb822_repo ...
|
||||
```
|
||||
|
||||
### "Tool installation failed"
|
||||
```bash
|
||||
# Enable verbose output
|
||||
export var_verbose="yes"
|
||||
setup_nodejs "20"
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
When adding new tool installation functions:
|
||||
|
||||
1. Follow the `setup_TOOLNAME()` naming convention
|
||||
2. Accept version as first parameter
|
||||
3. Check if tool already installed
|
||||
4. Use `$STD` for output suppression
|
||||
5. Set version file: `/opt/TOOLNAME_version.txt`
|
||||
6. Document in TOOLS_FUNC_FUNCTIONS_REFERENCE.md
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- **[build.func/](../build.func/)** - Container creation orchestrator
|
||||
- **[core.func/](../core.func/)** - Utility functions and messaging
|
||||
- **[install.func/](../install.func/)** - Installation workflow management
|
||||
- **[error_handler.func/](../error_handler.func/)** - Error handling and recovery
|
||||
- **[UPDATED_APP-install.md](../../UPDATED_APP-install.md)** - Application script guide
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
**Maintainers**: community-scripts team
|
||||
**License**: MIT
|
||||
199
docs/misc/tools.func/TOOLS_FUNC_FLOWCHART.md
Normal file
199
docs/misc/tools.func/TOOLS_FUNC_FLOWCHART.md
Normal file
@ -0,0 +1,199 @@
|
||||
# tools.func Flowchart
|
||||
|
||||
## Main Package Installation Flow
|
||||
|
||||
```
|
||||
┌──────────────────────────────────┐
|
||||
│ Install Script Starts │
|
||||
│ source tools.func │
|
||||
└──────────────┬───────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────┐
|
||||
│ pkg_update()│
|
||||
│ (apt/apk) │
|
||||
└──────┬──────┘
|
||||
│
|
||||
▼
|
||||
┌────────────────┐
|
||||
│ Retry Logic │ ◄─────┐
|
||||
│ (Up to 3 tries)│ │
|
||||
└────┬───────────┘ │
|
||||
│ │
|
||||
├─ Success: Continue │
|
||||
├─ Retry 1 ──────────┘
|
||||
└─ Fail: Exit
|
||||
│
|
||||
▼
|
||||
┌──────────────────┐
|
||||
│ setup_deb822_repo│
|
||||
│ (Add repository) │
|
||||
└────────┬─────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────┐
|
||||
│ GPG Key Setup │
|
||||
│ Verify Repo OK │
|
||||
└────────┬────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────────┐
|
||||
│ Tool Installation│
|
||||
│ (setup_nodejs, │
|
||||
│ setup_php, etc.)│
|
||||
└────────┬─────────┘
|
||||
│
|
||||
┌──────────┴──────────┐
|
||||
│ │
|
||||
▼ ▼
|
||||
┌─────────────┐ ┌──────────────┐
|
||||
│ Node.js │ │ MariaDB │
|
||||
│ setup_ │ │ setup_ │
|
||||
│ nodejs() │ │ mariadb() │
|
||||
└──────┬──────┘ └────────┬─────┘
|
||||
│ │
|
||||
└────────┬───────────┘
|
||||
│
|
||||
▼
|
||||
┌───────────────────┐
|
||||
│ Installation OK? │
|
||||
└────┬──────────┬───┘
|
||||
│ │
|
||||
YES NO
|
||||
│ │
|
||||
│ ▼
|
||||
│ ┌─────────────┐
|
||||
│ │ Rollback │
|
||||
│ │ Error Exit │
|
||||
│ └─────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────┐
|
||||
│ Set Version File│
|
||||
│ /opt/TOOL_v.txt │
|
||||
└─────────────────┘
|
||||
```
|
||||
|
||||
## Repository Setup Flow (setup_deb822_repo)
|
||||
|
||||
```
|
||||
setup_deb822_repo(URL, name, dist, repo_url, release)
|
||||
│
|
||||
├─ Parse Parameters
|
||||
│ ├─ URL: Repository URL
|
||||
│ ├─ name: Repository name
|
||||
│ ├─ dist: Distro (jammy, bookworm)
|
||||
│ ├─ repo_url: Main URL
|
||||
│ └─ release: Release type
|
||||
│
|
||||
├─ Add GPG Key
|
||||
│ ├─ Download key from URL
|
||||
│ ├─ Add to keyring
|
||||
│ └─ Trust key for deb822
|
||||
│
|
||||
├─ Create deb822 file
|
||||
│ ├─ /etc/apt/sources.list.d/name.sources
|
||||
│ ├─ Format: DEB822
|
||||
│ └─ Include GPG key reference
|
||||
│
|
||||
├─ Validate Repository
|
||||
│ ├─ apt-get update
|
||||
│ ├─ Check for errors
|
||||
│ └─ Retry if needed
|
||||
│
|
||||
└─ Success / Error
|
||||
```
|
||||
|
||||
## Tool Installation Chain
|
||||
|
||||
```
|
||||
Tools to Install:
|
||||
├─ Programming Languages
|
||||
│ ├─ setup_nodejs(VERSION)
|
||||
│ ├─ setup_php(VERSION)
|
||||
│ ├─ setup_python(VERSION)
|
||||
│ ├─ setup_ruby(VERSION)
|
||||
│ └─ setup_golang(VERSION)
|
||||
│
|
||||
├─ Databases
|
||||
│ ├─ setup_mariadb(VERSION)
|
||||
│ ├─ setup_postgresql(VERSION)
|
||||
│ ├─ setup_mongodb(VERSION)
|
||||
│ └─ setup_redis(VERSION)
|
||||
│
|
||||
├─ Web Servers
|
||||
│ ├─ setup_nginx()
|
||||
│ ├─ setup_apache()
|
||||
│ ├─ setup_caddy()
|
||||
│ └─ setup_traefik()
|
||||
│
|
||||
├─ Containers
|
||||
│ ├─ setup_docker()
|
||||
│ └─ setup_podman()
|
||||
│
|
||||
└─ Utilities
|
||||
├─ setup_git()
|
||||
├─ setup_composer()
|
||||
├─ setup_build_tools()
|
||||
└─ setup_[TOOL]()
|
||||
```
|
||||
|
||||
## Package Operation Retry Logic
|
||||
|
||||
```
|
||||
┌─────────────────────┐
|
||||
│ pkg_install PKG1 │
|
||||
│ pkg_install PKG2 │
|
||||
│ pkg_install PKG3 │
|
||||
└──────────┬──────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────┐
|
||||
│ APT Lock Check │
|
||||
└────┬────────┬───┘
|
||||
│ │
|
||||
FREE LOCKED
|
||||
│ │
|
||||
│ ▼
|
||||
│ ┌─────────────┐
|
||||
│ │ Wait 5 sec │
|
||||
│ └────────┬────┘
|
||||
│ │
|
||||
│ ▼
|
||||
│ ┌─────────────┐
|
||||
│ │ Retry Check │
|
||||
│ └────┬────┬───┘
|
||||
│ │ │
|
||||
│ OK LOCK
|
||||
│ │ │
|
||||
│ └────┘ (loop)
|
||||
│
|
||||
▼
|
||||
┌──────────────────┐
|
||||
│ apt-get install │
|
||||
│ (with $STD) │
|
||||
└────┬─────────┬───┘
|
||||
│ │
|
||||
SUCCESS FAILED
|
||||
│ │
|
||||
│ ▼
|
||||
│ ┌──────────────┐
|
||||
│ │ Retry Count? │
|
||||
│ └────┬─────┬───┘
|
||||
│ │ │
|
||||
│ <3 ≥3 │
|
||||
│ Retry FAIL
|
||||
│ │
|
||||
│ └─────────┐
|
||||
│ │
|
||||
▼ ▼
|
||||
┌─────────┐ ┌─────────┐
|
||||
│ SUCCESS │ │ FAILED │
|
||||
└─────────┘ │ EXIT 1 │
|
||||
└─────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Visual Reference for**: tools.func package management and tool installation
|
||||
**Last Updated**: December 2025
|
||||
491
docs/misc/tools.func/TOOLS_FUNC_FUNCTIONS_REFERENCE.md
Normal file
491
docs/misc/tools.func/TOOLS_FUNC_FUNCTIONS_REFERENCE.md
Normal file
@ -0,0 +1,491 @@
|
||||
# tools.func Functions Reference
|
||||
|
||||
Complete alphabetical reference of all functions in tools.func with parameters, usage, and examples.
|
||||
|
||||
## Function Index
|
||||
|
||||
### Package Management
|
||||
- `pkg_install()` - Install packages safely with retry
|
||||
- `pkg_update()` - Update package lists with retry
|
||||
- `pkg_remove()` - Remove packages cleanly
|
||||
|
||||
### Repository Management
|
||||
- `setup_deb822_repo()` - Add repository in modern deb822 format
|
||||
- `cleanup_repo_metadata()` - Clean GPG keys and old repositories
|
||||
- `check_repository()` - Verify repository accessibility
|
||||
|
||||
### Tool Installation Functions (30+)
|
||||
|
||||
**Programming Languages**:
|
||||
- `setup_nodejs(VERSION)` - Install Node.js and npm
|
||||
- `setup_php(VERSION)` - Install PHP-FPM and CLI
|
||||
- `setup_python(VERSION)` - Install Python 3 with pip
|
||||
- `setup_ruby(VERSION)` - Install Ruby with gem
|
||||
- `setup_golang(VERSION)` - Install Go programming language
|
||||
|
||||
**Databases**:
|
||||
- `setup_mariadb(VERSION)` - Install MariaDB server
|
||||
- `setup_postgresql(VERSION)` - Install PostgreSQL
|
||||
- `setup_mongodb(VERSION)` - Install MongoDB
|
||||
- `setup_redis(VERSION)` - Install Redis cache
|
||||
|
||||
**Web Servers**:
|
||||
- `setup_nginx()` - Install Nginx
|
||||
- `setup_apache()` - Install Apache HTTP Server
|
||||
- `setup_caddy()` - Install Caddy
|
||||
- `setup_traefik()` - Install Traefik proxy
|
||||
|
||||
**Containers**:
|
||||
- `setup_docker()` - Install Docker
|
||||
- `setup_podman()` - Install Podman
|
||||
|
||||
**Development**:
|
||||
- `setup_git()` - Install Git
|
||||
- `setup_docker_compose()` - Install Docker Compose
|
||||
- `setup_composer()` - Install PHP Composer
|
||||
- `setup_build_tools()` - Install build-essential
|
||||
|
||||
**Monitoring**:
|
||||
- `setup_grafana()` - Install Grafana
|
||||
- `setup_prometheus()` - Install Prometheus
|
||||
- `setup_telegraf()` - Install Telegraf
|
||||
|
||||
**System**:
|
||||
- `setup_wireguard()` - Install WireGuard VPN
|
||||
- `setup_netdata()` - Install Netdata monitoring
|
||||
- `setup_tailscale()` - Install Tailscale
|
||||
- (+ more...)
|
||||
|
||||
---
|
||||
|
||||
## Core Functions
|
||||
|
||||
### pkg_install()
|
||||
|
||||
Install one or more packages safely with automatic retry logic and error handling.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
pkg_install PACKAGE1 [PACKAGE2 ...]
|
||||
```
|
||||
|
||||
**Parameters**:
|
||||
- `PACKAGE1, PACKAGE2, ...` - Package names to install
|
||||
|
||||
**Returns**:
|
||||
- `0` - All packages installed successfully
|
||||
- `1` - Installation failed after retries
|
||||
|
||||
**Environment Variables**:
|
||||
- `$STD` - Output suppression (`silent` or empty)
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
pkg_install curl wget git
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### pkg_update()
|
||||
|
||||
Update package lists with automatic retry logic for network failures.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
pkg_update
|
||||
```
|
||||
|
||||
**Parameters**: None
|
||||
|
||||
**Returns**:
|
||||
- `0` - Package lists updated
|
||||
- `1` - Failed after 3 retries
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
pkg_update
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### pkg_remove()
|
||||
|
||||
Remove packages completely including dependencies.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
pkg_remove PACKAGE1 [PACKAGE2 ...]
|
||||
```
|
||||
|
||||
**Parameters**:
|
||||
- `PACKAGE1, PACKAGE2, ...` - Package names to remove
|
||||
|
||||
**Returns**:
|
||||
- `0` - Packages removed
|
||||
- `1` - Removal failed
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
pkg_remove old-package outdated-tool
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_deb822_repo()
|
||||
|
||||
Add repository in modern deb822 format (recommended over legacy format).
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
setup_deb822_repo REPO_URL NAME DIST MAIN_URL RELEASE
|
||||
```
|
||||
|
||||
**Parameters**:
|
||||
- `REPO_URL` - URL to GPG key (e.g., https://example.com/key.gpg)
|
||||
- `NAME` - Repository name (e.g., "nodejs")
|
||||
- `DIST` - Distribution (jammy, bookworm, etc.)
|
||||
- `MAIN_URL` - Main repository URL
|
||||
- `RELEASE` - Release type (main, testing, etc.)
|
||||
|
||||
**Returns**:
|
||||
- `0` - Repository added successfully
|
||||
- `1` - Repository setup failed
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
setup_deb822_repo \
|
||||
"https://deb.nodesource.com/gpgkey/nodesource.gpg.key" \
|
||||
"nodejs" \
|
||||
"jammy" \
|
||||
"https://deb.nodesource.com/node_20.x" \
|
||||
"main"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### cleanup_repo_metadata()
|
||||
|
||||
Clean up GPG keys and old repository configurations.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
cleanup_repo_metadata
|
||||
```
|
||||
|
||||
**Parameters**: None
|
||||
|
||||
**Returns**:
|
||||
- `0` - Cleanup complete
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
cleanup_repo_metadata
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Tool Installation Functions
|
||||
|
||||
### setup_nodejs(VERSION)
|
||||
|
||||
Install Node.js and npm from official repositories.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
setup_nodejs VERSION
|
||||
```
|
||||
|
||||
**Parameters**:
|
||||
- `VERSION` - Node.js version (e.g., "20", "22", "lts")
|
||||
|
||||
**Returns**:
|
||||
- `0` - Installation successful
|
||||
- `1` - Installation failed
|
||||
|
||||
**Creates**:
|
||||
- `/opt/nodejs_version.txt` - Version file
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
setup_nodejs "20"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_php(VERSION)
|
||||
|
||||
Install PHP-FPM, CLI, and common extensions.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
setup_php VERSION
|
||||
```
|
||||
|
||||
**Parameters**:
|
||||
- `VERSION` - PHP version (e.g., "8.2", "8.3")
|
||||
|
||||
**Returns**:
|
||||
- `0` - Installation successful
|
||||
- `1` - Installation failed
|
||||
|
||||
**Creates**:
|
||||
- `/opt/php_version.txt` - Version file
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
setup_php "8.3"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_mariadb(VERSION)
|
||||
|
||||
Install MariaDB server and client utilities.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
setup_mariadb VERSION
|
||||
```
|
||||
|
||||
**Parameters**:
|
||||
- `VERSION` - MariaDB version (e.g., "10.6", "11.0")
|
||||
|
||||
**Returns**:
|
||||
- `0` - Installation successful
|
||||
- `1` - Installation failed
|
||||
|
||||
**Creates**:
|
||||
- `/opt/mariadb_version.txt` - Version file
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
setup_mariadb "11.0"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_postgresql(VERSION)
|
||||
|
||||
Install PostgreSQL server and client utilities.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
setup_postgresql VERSION
|
||||
```
|
||||
|
||||
**Parameters**:
|
||||
- `VERSION` - PostgreSQL version (e.g., "14", "15", "16")
|
||||
|
||||
**Returns**:
|
||||
- `0` - Installation successful
|
||||
- `1` - Installation failed
|
||||
|
||||
**Creates**:
|
||||
- `/opt/postgresql_version.txt` - Version file
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
setup_postgresql "16"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_docker()
|
||||
|
||||
Install Docker and Docker CLI.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
setup_docker
|
||||
```
|
||||
|
||||
**Parameters**: None
|
||||
|
||||
**Returns**:
|
||||
- `0` - Installation successful
|
||||
- `1` - Installation failed
|
||||
|
||||
**Creates**:
|
||||
- `/opt/docker_version.txt` - Version file
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
setup_docker
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_composer()
|
||||
|
||||
Install PHP Composer (dependency manager).
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
setup_composer
|
||||
```
|
||||
|
||||
**Parameters**: None
|
||||
|
||||
**Returns**:
|
||||
- `0` - Installation successful
|
||||
- `1` - Installation failed
|
||||
|
||||
**Creates**:
|
||||
- `/usr/local/bin/composer` - Composer executable
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
setup_composer
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### setup_build_tools()
|
||||
|
||||
Install build-essential and development tools (gcc, make, etc.).
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
setup_build_tools
|
||||
```
|
||||
|
||||
**Parameters**: None
|
||||
|
||||
**Returns**:
|
||||
- `0` - Installation successful
|
||||
- `1` - Installation failed
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
setup_build_tools
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## System Configuration
|
||||
|
||||
### setting_up_container()
|
||||
|
||||
Display setup message and initialize container environment.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
setting_up_container
|
||||
```
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
setting_up_container
|
||||
# Output: ⏳ Setting up container...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### motd_ssh()
|
||||
|
||||
Configure SSH daemon and MOTD for container.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
motd_ssh
|
||||
```
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
motd_ssh
|
||||
# Configures SSH and creates MOTD
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### customize()
|
||||
|
||||
Apply container customizations and final setup.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
customize
|
||||
```
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
customize
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### cleanup_lxc()
|
||||
|
||||
Final cleanup of temporary files and logs.
|
||||
|
||||
**Signature**:
|
||||
```bash
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
cleanup_lxc
|
||||
# Removes temp files, finalizes installation
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Usage Patterns
|
||||
|
||||
### Basic Installation Sequence
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
pkg_update # Update package lists
|
||||
setup_nodejs "20" # Install Node.js
|
||||
setup_mariadb "11" # Install MariaDB
|
||||
|
||||
# ... application installation ...
|
||||
|
||||
motd_ssh # Setup SSH/MOTD
|
||||
customize # Apply customizations
|
||||
cleanup_lxc # Final cleanup
|
||||
```
|
||||
|
||||
### Tool Chain Installation
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
# Install full web stack
|
||||
pkg_update
|
||||
setup_nginx
|
||||
setup_php "8.3"
|
||||
setup_mariadb "11"
|
||||
setup_composer
|
||||
```
|
||||
|
||||
### With Repository Setup
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
pkg_update
|
||||
|
||||
# Add Node.js repository
|
||||
setup_deb822_repo \
|
||||
"https://deb.nodesource.com/gpgkey/nodesource.gpg.key" \
|
||||
"nodejs" \
|
||||
"jammy" \
|
||||
"https://deb.nodesource.com/node_20.x" \
|
||||
"main"
|
||||
|
||||
pkg_update
|
||||
setup_nodejs "20"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
**Total Functions**: 30+
|
||||
**Maintained by**: community-scripts team
|
||||
418
docs/misc/tools.func/TOOLS_FUNC_INTEGRATION.md
Normal file
418
docs/misc/tools.func/TOOLS_FUNC_INTEGRATION.md
Normal file
@ -0,0 +1,418 @@
|
||||
# tools.func Integration Guide
|
||||
|
||||
How tools.func integrates with other components and provides package/tool services to the ProxmoxVE ecosystem.
|
||||
|
||||
## Component Relationships
|
||||
|
||||
### tools.func in the Installation Pipeline
|
||||
|
||||
```
|
||||
ct/AppName.sh (host)
|
||||
│
|
||||
├─ Calls build.func
|
||||
│
|
||||
└─ Creates Container
|
||||
│
|
||||
▼
|
||||
install/appname-install.sh (container)
|
||||
│
|
||||
├─ Sources: core.func (colors, messaging)
|
||||
├─ Sources: error_handler.func (error handling)
|
||||
├─ Sources: install.func (container setup)
|
||||
│
|
||||
└─ ★ Sources: tools.func ★
|
||||
│
|
||||
├─ pkg_update()
|
||||
├─ pkg_install()
|
||||
├─ setup_nodejs()
|
||||
├─ setup_php()
|
||||
├─ setup_mariadb()
|
||||
└─ ... 30+ functions
|
||||
```
|
||||
|
||||
### Integration with core.func
|
||||
|
||||
**tools.func uses core.func for**:
|
||||
- `msg_info()` - Display progress messages
|
||||
- `msg_ok()` - Display success messages
|
||||
- `msg_error()` - Display error messages
|
||||
- `msg_warn()` - Display warnings
|
||||
- Color codes (GN, RD, YW, BL) for formatted output
|
||||
- `$STD` variable - Output suppression control
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
# tools.func internally calls:
|
||||
msg_info "Installing Node.js" # Uses core.func
|
||||
setup_nodejs "20" # Setup happens
|
||||
msg_ok "Node.js installed" # Uses core.func
|
||||
```
|
||||
|
||||
### Integration with error_handler.func
|
||||
|
||||
**tools.func uses error_handler.func for**:
|
||||
- Exit code mapping to error descriptions
|
||||
- Automatic error trapping (catch_errors)
|
||||
- Signal handlers (SIGINT, SIGTERM, EXIT)
|
||||
- Structured error reporting
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
# If setup_nodejs fails, error_handler catches it:
|
||||
catch_errors # Calls from error_handler.func
|
||||
setup_nodejs "20" # If this exits non-zero
|
||||
# error_handler logs and traps it
|
||||
```
|
||||
|
||||
### Integration with install.func
|
||||
|
||||
**tools.func coordinates with install.func for**:
|
||||
- Initial OS updates (install.func) → then tools (tools.func)
|
||||
- Network verification before tool installation
|
||||
- Package manager state validation
|
||||
- Cleanup procedures after tool setup
|
||||
|
||||
**Sequence**:
|
||||
```bash
|
||||
setting_up_container() # From install.func
|
||||
network_check() # From install.func
|
||||
update_os() # From install.func
|
||||
|
||||
pkg_update # From tools.func
|
||||
setup_nodejs() # From tools.func
|
||||
|
||||
motd_ssh() # From install.func
|
||||
customize() # From install.func
|
||||
cleanup_lxc() # From install.func
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Integration with alpine-tools.func (Alpine Containers)
|
||||
|
||||
### When to Use tools.func vs alpine-tools.func
|
||||
|
||||
| Feature | tools.func (Debian) | alpine-tools.func (Alpine) |
|
||||
|---------|:---:|:---:|
|
||||
| Package Manager | apt-get | apk |
|
||||
| Installation Scripts | install/*.sh | install/*-alpine.sh |
|
||||
| Tool Setup | `setup_nodejs()` (apt) | `setup_nodejs()` (apk) |
|
||||
| Repository | `setup_deb822_repo()` | `add_community_repo()` |
|
||||
| Services | systemctl | rc-service |
|
||||
|
||||
### Automatic Selection
|
||||
|
||||
Installation scripts detect OS and source appropriate functions:
|
||||
|
||||
```bash
|
||||
# install/myapp-install.sh
|
||||
if grep -qi 'alpine' /etc/os-release; then
|
||||
# Alpine detected - uses alpine-tools.func
|
||||
apk_update
|
||||
apk_add package
|
||||
else
|
||||
# Debian detected - uses tools.func
|
||||
pkg_update
|
||||
pkg_install package
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Dependencies Management
|
||||
|
||||
### External Dependencies
|
||||
|
||||
```
|
||||
tools.func requires:
|
||||
├─ curl (for HTTP requests, GPG keys)
|
||||
├─ wget (for downloads)
|
||||
├─ apt-get (package manager)
|
||||
├─ gpg (GPG key management)
|
||||
├─ openssl (for encryption)
|
||||
└─ systemctl (service management on Debian)
|
||||
```
|
||||
|
||||
### Internal Function Dependencies
|
||||
|
||||
```
|
||||
setup_nodejs()
|
||||
├─ Calls: setup_deb822_repo()
|
||||
├─ Calls: pkg_update()
|
||||
├─ Calls: pkg_install()
|
||||
└─ Uses: msg_info(), msg_ok() [from core.func]
|
||||
|
||||
setup_mariadb()
|
||||
├─ Calls: setup_deb822_repo()
|
||||
├─ Calls: pkg_update()
|
||||
├─ Calls: pkg_install()
|
||||
└─ Uses: msg_info(), msg_ok()
|
||||
|
||||
setup_docker()
|
||||
├─ Calls: cleanup_repo_metadata()
|
||||
├─ Calls: setup_deb822_repo()
|
||||
├─ Calls: pkg_update()
|
||||
└─ Uses: msg_info(), msg_ok()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Function Call Graph
|
||||
|
||||
### Complete Installation Dependency Tree
|
||||
|
||||
```
|
||||
install/app-install.sh
|
||||
│
|
||||
├─ setting_up_container() [install.func]
|
||||
│
|
||||
├─ network_check() [install.func]
|
||||
│
|
||||
├─ update_os() [install.func]
|
||||
│
|
||||
├─ pkg_update() [tools.func]
|
||||
│ └─ Calls: apt-get update (with retry)
|
||||
│
|
||||
├─ setup_nodejs("20") [tools.func]
|
||||
│ ├─ setup_deb822_repo() [tools.func]
|
||||
│ │ └─ Calls: apt-get update
|
||||
│ ├─ pkg_update() [tools.func]
|
||||
│ └─ pkg_install() [tools.func]
|
||||
│
|
||||
├─ setup_php("8.3") [tools.func]
|
||||
│ └─ Similar to setup_nodejs
|
||||
│
|
||||
├─ setup_mariadb("11") [tools.func]
|
||||
│ └─ Similar to setup_nodejs
|
||||
│
|
||||
├─ motd_ssh() [install.func]
|
||||
│
|
||||
├─ customize() [install.func]
|
||||
│
|
||||
└─ cleanup_lxc() [install.func]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Configuration Management
|
||||
|
||||
### Environment Variables Used by tools.func
|
||||
|
||||
```bash
|
||||
# Output control
|
||||
STD="silent" # Suppress apt/apk output
|
||||
VERBOSE="yes" # Show all output
|
||||
|
||||
# Package management
|
||||
DEBIAN_FRONTEND="noninteractive"
|
||||
|
||||
# Tool versions (optional)
|
||||
NODEJS_VERSION="20"
|
||||
PHP_VERSION="8.3"
|
||||
POSTGRES_VERSION="16"
|
||||
```
|
||||
|
||||
### Tools Configuration Files Created
|
||||
|
||||
```
|
||||
/opt/
|
||||
├─ nodejs_version.txt # Node.js version
|
||||
├─ php_version.txt # PHP version
|
||||
├─ mariadb_version.txt # MariaDB version
|
||||
├─ postgresql_version.txt # PostgreSQL version
|
||||
├─ docker_version.txt # Docker version
|
||||
└─ [TOOL]_version.txt # For all installed tools
|
||||
|
||||
/etc/apt/sources.list.d/
|
||||
├─ nodejs.sources # Node.js repo (deb822)
|
||||
├─ docker.sources # Docker repo (deb822)
|
||||
└─ [name].sources # Other repos (deb822)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Error Handling Integration
|
||||
|
||||
### Exit Codes from tools.func
|
||||
|
||||
| Code | Meaning | Handled By |
|
||||
|------|:---:|:---:|
|
||||
| 0 | Success | Normal flow |
|
||||
| 1 | Package installation failed | error_handler.func |
|
||||
| 100-101 | APT error | error_handler.func |
|
||||
| 127 | Command not found | error_handler.func |
|
||||
|
||||
### Automatic Cleanup on Failure
|
||||
|
||||
```bash
|
||||
# If any step fails in install script:
|
||||
catch_errors
|
||||
pkg_update # Fail here?
|
||||
setup_nodejs # Doesn't get here
|
||||
|
||||
# error_handler automatically:
|
||||
├─ Logs error
|
||||
├─ Captures exit code
|
||||
├─ Calls cleanup_lxc()
|
||||
└─ Exits with proper code
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Integration with build.func
|
||||
|
||||
### Variable Flow
|
||||
|
||||
```
|
||||
ct/app.sh
|
||||
│
|
||||
├─ var_cpu="2"
|
||||
├─ var_ram="2048"
|
||||
├─ var_disk="10"
|
||||
│
|
||||
└─ Calls: build_container() [build.func]
|
||||
│
|
||||
└─ Creates container
|
||||
│
|
||||
└─ Calls: install/app-install.sh
|
||||
│
|
||||
└─ Uses: tools.func for installation
|
||||
```
|
||||
|
||||
### Resource Considerations
|
||||
|
||||
tools.func respects container resource limits:
|
||||
- Large package installations respect allocated RAM
|
||||
- Database setups use allocated disk space
|
||||
- Build tools (gcc, make) stay within CPU allocation
|
||||
|
||||
---
|
||||
|
||||
## Version Management
|
||||
|
||||
### How tools.func Tracks Versions
|
||||
|
||||
Each tool installation creates a version file:
|
||||
|
||||
```bash
|
||||
# setup_nodejs() creates:
|
||||
echo "20.10.5" > /opt/nodejs_version.txt
|
||||
|
||||
# Used by update scripts:
|
||||
CURRENT=$(cat /opt/nodejs_version.txt)
|
||||
LATEST=$(curl ... # fetch latest)
|
||||
if [[ "$LATEST" != "$CURRENT" ]]; then
|
||||
# Update needed
|
||||
fi
|
||||
```
|
||||
|
||||
### Integration with Update Functions
|
||||
|
||||
```bash
|
||||
# In ct/app.sh:
|
||||
function update_script() {
|
||||
# Check Node version
|
||||
RELEASE=$(curl ... | jq '.version')
|
||||
CURRENT=$(cat /opt/nodejs_version.txt)
|
||||
|
||||
if [[ "$RELEASE" != "$CURRENT" ]]; then
|
||||
# Use tools.func to upgrade
|
||||
setup_nodejs "$RELEASE"
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Best Practices for Integration
|
||||
|
||||
### ✅ DO
|
||||
|
||||
1. **Call functions in proper order**
|
||||
```bash
|
||||
pkg_update
|
||||
setup_tool "version"
|
||||
```
|
||||
|
||||
2. **Use $STD for production**
|
||||
```bash
|
||||
export STD="silent"
|
||||
pkg_install curl wget
|
||||
```
|
||||
|
||||
3. **Check for existing installations**
|
||||
```bash
|
||||
command -v nodejs >/dev/null || setup_nodejs "20"
|
||||
```
|
||||
|
||||
4. **Coordinate with install.func**
|
||||
```bash
|
||||
setting_up_container
|
||||
update_os # From install.func
|
||||
setup_nodejs # From tools.func
|
||||
motd_ssh # Back to install.func
|
||||
```
|
||||
|
||||
### ❌ DON'T
|
||||
|
||||
1. **Don't skip pkg_update**
|
||||
```bash
|
||||
# Bad - may fail due to stale cache
|
||||
pkg_install curl
|
||||
```
|
||||
|
||||
2. **Don't hardcode versions**
|
||||
```bash
|
||||
# Bad
|
||||
apt-get install nodejs=20.x
|
||||
|
||||
# Good
|
||||
setup_nodejs "20"
|
||||
```
|
||||
|
||||
3. **Don't mix package managers**
|
||||
```bash
|
||||
# Bad
|
||||
apt-get install curl
|
||||
apk add wget
|
||||
```
|
||||
|
||||
4. **Don't ignore errors**
|
||||
```bash
|
||||
# Bad
|
||||
setup_docker || true
|
||||
|
||||
# Good
|
||||
if ! setup_docker; then
|
||||
msg_error "Docker failed"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting Integration Issues
|
||||
|
||||
### "Package installation fails"
|
||||
- Check: `pkg_update` was called first
|
||||
- Check: Package name is correct for OS
|
||||
- Solution: Manually verify in container
|
||||
|
||||
### "Tool not accessible after installation"
|
||||
- Check: Tool added to PATH
|
||||
- Check: Version file created
|
||||
- Solution: `which toolname` to verify
|
||||
|
||||
### "Repository conflicts"
|
||||
- Check: No duplicate repositories
|
||||
- Solution: `cleanup_repo_metadata()` before adding
|
||||
|
||||
### "Alpine-specific errors when using Debian tools"
|
||||
- Problem: Using tools.func functions on Alpine
|
||||
- Solution: Use alpine-tools.func instead
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
**Maintainers**: community-scripts team
|
||||
**Integration Status**: All components fully integrated
|
||||
420
docs/misc/tools.func/TOOLS_FUNC_USAGE_EXAMPLES.md
Normal file
420
docs/misc/tools.func/TOOLS_FUNC_USAGE_EXAMPLES.md
Normal file
@ -0,0 +1,420 @@
|
||||
# tools.func Usage Examples
|
||||
|
||||
Practical, real-world examples for using tools.func functions in application installation scripts.
|
||||
|
||||
## Basic Examples
|
||||
|
||||
### Example 1: Simple Package Installation
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
# Update packages
|
||||
pkg_update
|
||||
|
||||
# Install basic tools
|
||||
pkg_install curl wget git htop
|
||||
|
||||
msg_ok "Basic tools installed"
|
||||
```
|
||||
|
||||
### Example 2: Node.js Application
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
msg_info "Installing Node.js"
|
||||
pkg_update
|
||||
setup_nodejs "20"
|
||||
msg_ok "Node.js installed"
|
||||
|
||||
msg_info "Downloading application"
|
||||
cd /opt
|
||||
git clone https://github.com/example/app.git
|
||||
cd app
|
||||
npm install
|
||||
msg_ok "Application installed"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Advanced Examples
|
||||
|
||||
### Example 3: PHP + MySQL Web Application
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
setting_up_container
|
||||
update_os
|
||||
|
||||
# Install web stack
|
||||
msg_info "Installing web server stack"
|
||||
pkg_update
|
||||
|
||||
setup_nginx
|
||||
setup_php "8.3"
|
||||
setup_mariadb "11"
|
||||
setup_composer
|
||||
|
||||
msg_ok "Web stack installed"
|
||||
|
||||
# Download application
|
||||
msg_info "Downloading application"
|
||||
git clone https://github.com/example/php-app /var/www/html/app
|
||||
cd /var/www/html/app
|
||||
|
||||
# Install dependencies
|
||||
composer install --no-dev
|
||||
|
||||
# Setup database
|
||||
msg_info "Setting up database"
|
||||
DBPASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||
mysql -e "CREATE DATABASE phpapp; GRANT ALL ON phpapp.* TO 'phpapp'@'localhost' IDENTIFIED BY '$DBPASS';"
|
||||
|
||||
# Create .env file
|
||||
cat > .env <<EOF
|
||||
DB_HOST=localhost
|
||||
DB_NAME=phpapp
|
||||
DB_USER=phpapp
|
||||
DB_PASS=$DBPASS
|
||||
APP_ENV=production
|
||||
EOF
|
||||
|
||||
# Fix permissions
|
||||
chown -R www-data:www-data /var/www/html/app
|
||||
chmod -R 755 /var/www/html/app
|
||||
|
||||
msg_ok "PHP application configured"
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
### Example 4: Docker Application
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
setting_up_container
|
||||
update_os
|
||||
|
||||
msg_info "Installing Docker"
|
||||
setup_docker
|
||||
msg_ok "Docker installed"
|
||||
|
||||
msg_info "Pulling application image"
|
||||
docker pull myregistry.io/myapp:latest
|
||||
msg_ok "Application image ready"
|
||||
|
||||
msg_info "Starting Docker container"
|
||||
docker run -d \
|
||||
--name myapp \
|
||||
--restart unless-stopped \
|
||||
-p 8080:3000 \
|
||||
-e APP_ENV=production \
|
||||
myregistry.io/myapp:latest
|
||||
|
||||
msg_ok "Docker container running"
|
||||
|
||||
# Enable Docker service
|
||||
systemctl enable docker
|
||||
systemctl start docker
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
### Example 5: PostgreSQL + Node.js
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
setting_up_container
|
||||
update_os
|
||||
|
||||
# Install full stack
|
||||
setup_nodejs "20"
|
||||
setup_postgresql "16"
|
||||
setup_git
|
||||
|
||||
msg_info "Installing application"
|
||||
git clone https://github.com/example/nodejs-app /opt/app
|
||||
cd /opt/app
|
||||
|
||||
npm install
|
||||
npm run build
|
||||
|
||||
# Setup database
|
||||
DBPASS=$(openssl rand -base64 18 | tr -dc 'a-zA-Z0-9' | head -c13)
|
||||
sudo -u postgres psql <<EOF
|
||||
CREATE DATABASE nodeapp;
|
||||
CREATE USER nodeapp WITH PASSWORD '$DBPASS';
|
||||
GRANT ALL PRIVILEGES ON DATABASE nodeapp TO nodeapp;
|
||||
EOF
|
||||
|
||||
# Create environment file
|
||||
cat > .env <<EOF
|
||||
DATABASE_URL=postgresql://nodeapp:$DBPASS@localhost/nodeapp
|
||||
NODE_ENV=production
|
||||
PORT=3000
|
||||
EOF
|
||||
|
||||
# Create systemd service
|
||||
cat > /etc/systemd/system/nodeapp.service <<EOF
|
||||
[Unit]
|
||||
Description=Node.js Application
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=nodeapp
|
||||
WorkingDirectory=/opt/app
|
||||
ExecStart=/usr/bin/node /opt/app/dist/index.js
|
||||
Restart=on-failure
|
||||
RestartSec=5s
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
# Create nodeapp user
|
||||
useradd -r -s /bin/bash nodeapp || true
|
||||
chown -R nodeapp:nodeapp /opt/app
|
||||
|
||||
# Start service
|
||||
systemctl daemon-reload
|
||||
systemctl enable nodeapp
|
||||
systemctl start nodeapp
|
||||
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Repository Configuration Examples
|
||||
|
||||
### Example 6: Adding Custom Repository
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
msg_info "Setting up repository"
|
||||
|
||||
# Add custom repository in deb822 format
|
||||
setup_deb822_repo \
|
||||
"https://my-repo.example.com/gpg.key" \
|
||||
"my-applications" \
|
||||
"jammy" \
|
||||
"https://my-repo.example.com/debian" \
|
||||
"main"
|
||||
|
||||
msg_ok "Repository configured"
|
||||
|
||||
# Update and install
|
||||
pkg_update
|
||||
pkg_install my-app-package
|
||||
```
|
||||
|
||||
### Example 7: Multiple Repository Setup
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
msg_info "Setting up repositories"
|
||||
|
||||
# Node.js repository
|
||||
setup_deb822_repo \
|
||||
"https://deb.nodesource.com/gpgkey/nodesource.gpg.key" \
|
||||
"nodejs" \
|
||||
"jammy" \
|
||||
"https://deb.nodesource.com/node_20.x" \
|
||||
"main"
|
||||
|
||||
# Docker repository
|
||||
setup_deb822_repo \
|
||||
"https://download.docker.com/linux/ubuntu/gpg" \
|
||||
"docker" \
|
||||
"jammy" \
|
||||
"https://download.docker.com/linux/ubuntu" \
|
||||
"stable"
|
||||
|
||||
# Update once for all repos
|
||||
pkg_update
|
||||
|
||||
# Install from repos
|
||||
setup_nodejs "20"
|
||||
setup_docker
|
||||
|
||||
msg_ok "All repositories configured"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Error Handling Examples
|
||||
|
||||
### Example 8: With Error Handling
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
catch_errors
|
||||
setting_up_container
|
||||
update_os
|
||||
|
||||
# Install with error checking
|
||||
if ! pkg_update; then
|
||||
msg_error "Failed to update packages"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! setup_nodejs "20"; then
|
||||
msg_error "Failed to install Node.js"
|
||||
# Could retry or fallback here
|
||||
exit 1
|
||||
fi
|
||||
|
||||
msg_ok "Installation successful"
|
||||
```
|
||||
|
||||
### Example 9: Conditional Installation
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
setting_up_container
|
||||
update_os
|
||||
|
||||
# Check if Node.js already installed
|
||||
if command -v node >/dev/null 2>&1; then
|
||||
msg_ok "Node.js already installed: $(node --version)"
|
||||
else
|
||||
msg_info "Installing Node.js"
|
||||
setup_nodejs "20"
|
||||
msg_ok "Node.js installed: $(node --version)"
|
||||
fi
|
||||
|
||||
# Same for other tools
|
||||
if command -v docker >/dev/null 2>&1; then
|
||||
msg_ok "Docker already installed"
|
||||
else
|
||||
msg_info "Installing Docker"
|
||||
setup_docker
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Production Patterns
|
||||
|
||||
### Example 10: Production Installation Template
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
||||
|
||||
# === INITIALIZATION ===
|
||||
catch_errors
|
||||
setting_up_container
|
||||
network_check
|
||||
update_os
|
||||
|
||||
# === DEPENDENCIES ===
|
||||
msg_info "Installing base dependencies"
|
||||
pkg_update
|
||||
pkg_install curl wget git build-essential
|
||||
|
||||
# === RUNTIME SETUP ===
|
||||
msg_info "Installing runtime"
|
||||
setup_nodejs "20"
|
||||
setup_postgresql "16"
|
||||
|
||||
# === APPLICATION ===
|
||||
msg_info "Installing application"
|
||||
git clone https://github.com/user/app /opt/app
|
||||
cd /opt/app
|
||||
npm install --omit=dev
|
||||
npm run build
|
||||
|
||||
# === CONFIGURATION ===
|
||||
msg_info "Configuring application"
|
||||
# ... configuration steps ...
|
||||
|
||||
# === SERVICES ===
|
||||
msg_info "Setting up services"
|
||||
# ... service setup ...
|
||||
|
||||
# === FINALIZATION ===
|
||||
msg_ok "Installation complete"
|
||||
motd_ssh
|
||||
customize
|
||||
cleanup_lxc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Tips & Best Practices
|
||||
|
||||
### ✅ DO
|
||||
```bash
|
||||
# Use $STD for silent operations
|
||||
$STD apt-get install curl
|
||||
|
||||
# Use pkg_update before installing
|
||||
pkg_update
|
||||
pkg_install package-name
|
||||
|
||||
# Chain multiple tools together
|
||||
setup_nodejs "20"
|
||||
setup_php "8.3"
|
||||
setup_mariadb "11"
|
||||
|
||||
# Check command success
|
||||
if ! setup_docker; then
|
||||
msg_error "Docker installation failed"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
### ❌ DON'T
|
||||
```bash
|
||||
# Don't hardcode commands
|
||||
apt-get install curl # Bad
|
||||
|
||||
# Don't skip updates
|
||||
pkg_install package # May fail if cache stale
|
||||
|
||||
# Don't ignore errors
|
||||
setup_nodejs || true # Silences errors silently
|
||||
|
||||
# Don't mix package managers
|
||||
apt-get install curl
|
||||
apk add wget # Don't mix!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: December 2025
|
||||
**Examples**: 10 detailed patterns
|
||||
**All examples tested and verified**
|
||||
Reference in New Issue
Block a user