Files
NetAlertX/docs/PLUGINS_DEV_SETTINGS.md
jokob-sk f2d5e3254f DOCS: cleanup
Signed-off-by: jokob-sk <jokob.sk@gmail.com>
2026-01-15 11:00:28 +11:00

519 lines
15 KiB
Markdown

# Plugin Settings System
Learn how to let users configure your plugin via the NetAlertX UI Settings page.
> [!TIP]
> For the higher-level settings flow and lifecycle, see [Settings System Documentation](./SETTINGS_SYSTEM.md).
## Overview
Plugin settings allow users to configure:
- **Execution schedule** (when the plugin runs)
- **Runtime parameters** (API keys, URLs, thresholds)
- **Behavior options** (which features to enable/disable)
- **Command overrides** (customize the executed script)
All settings are defined in your plugin's `config.json` file under the `"settings"` array.
## Setting Definition Structure
Each setting is a JSON object with required and optional properties:
```json
{
"function": "UNIQUE_CODE",
"type": {
"dataType": "string",
"elements": [
{
"elementType": "input",
"elementOptions": [],
"transformers": []
}
]
},
"default_value": "default_value_here",
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Display Name"
}
],
"description": [
{
"language_code": "en_us",
"string": "Help text describing the setting"
}
]
}
```
## Required Properties
| Property | Type | Description | Example |
|----------|------|-------------|---------|
| `function` | string | Unique identifier for the setting. Used in manifest and when reading values. See [Reserved Function Names](#reserved-function-names) for special values | `"MY_CUSTOM_SETTING"` |
| `type` | object | Defines the UI component and data type | See [Component Types](#component-types) |
| `default_value` | varies | Initial value shown in UI | `"https://example.com"` |
| `localized` | array | Which properties have translations | `["name", "description"]` |
| `name` | array | Display name in Settings UI (localized) | See [Localized Strings](#localized-strings) |
| `description` | array | Help text in Settings UI (localized) | See [Localized Strings](#localized-strings) |
## Optional Properties
| Property | Type | Description | Example |
|----------|------|-------------|---------|
| `options` | array | Valid values for select/checkbox controls | `["option1", "option2"]` |
| `events` | string | Trigger action button: `"test"` or `"run"` | `"test"` for notifications |
| `maxLength` | number | Character limit for input fields | `100` |
| `readonly` | boolean | Make field read-only | `true` |
| `override_value` | object | Template-based value override (WIP) | Work in Progress |
## Reserved Function Names
These function names have special meaning and control core plugin behavior:
### Core Execution Settings
| Function | Purpose | Type | Required | Options |
|----------|---------|------|----------|---------|
| `RUN` | **When to execute the plugin** | select | **YES** | `"disabled"`, `"once"`, `"schedule"`, `"always_after_scan"`, `"before_name_updates"`, `"on_new_device"`, `"before_config_save"` |
| `RUN_SCHD` | **Cron schedule** | input | If `RUN="schedule"` | Cron format: `"0 * * * *"` (hourly) |
| `CMD` | **Command/script to execute** | input | **YES** | Linux command or path to script |
| `RUN_TIMEOUT` | **Maximum execution time in seconds** | input | optional | Numeric: `"60"`, `"120"`, etc. |
### Data & Filtering Settings
| Function | Purpose | Type | Required | Options |
|----------|---------|------|----------|---------|
| `WATCH` | **Which columns to monitor for changes** | multi-select | optional | Column names from data contract |
| `REPORT_ON` | **When to send notifications** | select | optional | `"new"`, `"watched-changed"`, `"watched-not-changed"`, `"missing-in-last-scan"` |
| `DB_PATH` | **External database path** | input | If using SQLite plugin | File path: `"/etc/pihole/pihole-FTL.db"` |
### API & Data Settings
| Function | Purpose | Type | Required | Options |
|----------|---------|------|----------|---------|
| `API_SQL` | **Generate API JSON file** | (reserved) | Not implemented | — |
## Component Types
### Text Input
Simple text field for API keys, URLs, thresholds, etc.
```json
{
"function": "URL",
"type": {
"dataType": "string",
"elements": [
{
"elementType": "input",
"elementOptions": [],
"transformers": []
}
]
},
"default_value": "https://api.example.com",
"localized": ["name", "description"],
"name": [{"language_code": "en_us", "string": "API URL"}],
"description": [{"language_code": "en_us", "string": "The API endpoint to query"}]
}
```
### Password Input
Secure field with SHA256 hashing transformer.
```json
{
"function": "API_KEY",
"type": {
"dataType": "string",
"elements": [
{
"elementType": "input",
"elementOptions": [{"type": "password"}],
"transformers": ["sha256"]
}
]
},
"default_value": "",
"localized": ["name", "description"],
"name": [{"language_code": "en_us", "string": "API Key"}],
"description": [{"language_code": "en_us", "string": "Stored securely with SHA256 hashing"}]
}
```
### Dropdown/Select
Choose from predefined options.
```json
{
"function": "RUN",
"type": {
"dataType": "string",
"elements": [
{
"elementType": "select",
"elementOptions": [],
"transformers": []
}
]
},
"default_value": "disabled",
"options": ["disabled", "once", "schedule", "always_after_scan"],
"localized": ["name", "description"],
"name": [{"language_code": "en_us", "string": "When to run"}],
"description": [{"language_code": "en_us", "string": "Select execution trigger"}]
}
```
### Multi-Select
Select multiple values (returns array).
```json
{
"function": "WATCH",
"type": {
"dataType": "array",
"elements": [
{
"elementType": "select",
"elementOptions": [{"isMultiSelect": true}],
"transformers": []
}
]
},
"default_value": [],
"options": ["Status", "IP_Address", "Response_Time"],
"localized": ["name", "description"],
"name": [{"language_code": "en_us", "string": "Watch columns"}],
"description": [{"language_code": "en_us", "string": "Which columns trigger notifications on change"}]
}
```
### Checkbox
Boolean toggle.
```json
{
"function": "ENABLED",
"type": {
"dataType": "boolean",
"elements": [
{
"elementType": "input",
"elementOptions": [{"type": "checkbox"}],
"transformers": []
}
]
},
"default_value": false,
"localized": ["name", "description"],
"name": [{"language_code": "en_us", "string": "Enable feature"}],
"description": [{"language_code": "en_us", "string": "Toggle this feature on/off"}]
}
```
### Textarea
Multi-line text input.
```json
{
"function": "CUSTOM_CONFIG",
"type": {
"dataType": "string",
"elements": [
{
"elementType": "textarea",
"elementOptions": [],
"transformers": []
}
]
},
"default_value": "",
"localized": ["name", "description"],
"name": [{"language_code": "en_us", "string": "Custom Configuration"}],
"description": [{"language_code": "en_us", "string": "Enter configuration (one per line)"}]
}
```
### Read-Only Label
Display information without user input.
```json
{
"function": "STATUS_DISPLAY",
"type": {
"dataType": "string",
"elements": [
{
"elementType": "input",
"elementOptions": [{"readonly": true}],
"transformers": []
}
]
},
"default_value": "Ready",
"localized": ["name"],
"name": [{"language_code": "en_us", "string": "Status"}]
}
```
## Using Settings in Your Script
### Method 1: Via `get_setting_value()` Helper
**Recommended approach** — clean and simple:
```python
from helper import get_setting_value
# Read the setting by function name with plugin prefix
api_url = get_setting_value('MYPLN_API_URL')
api_key = get_setting_value('MYPLN_API_KEY')
watch_columns = get_setting_value('MYPLN_WATCH') # Returns list if multi-select
# Use in your script
mylog("none", f"Connecting to {api_url} with key {api_key}")
```
### Method 2: Via Command Parameters
For more complex scenarios where you need to **pass settings as command-line arguments**:
Define `params` in your `config.json`:
```json
{
"params": [
{
"name": "api_url",
"type": "setting",
"value": "MYPLN_API_URL"
},
{
"name": "timeout",
"type": "setting",
"value": "MYPLN_RUN_TIMEOUT"
}
]
}
```
Update your `CMD` setting:
```json
{
"function": "CMD",
"default_value": "python3 /app/front/plugins/my_plugin/script.py --url={api_url} --timeout={timeout}"
}
```
The framework will replace `{api_url}` and `{timeout}` with actual values before execution.
### Method 3: Via Environment Variables (check with maintainer)
Settings are also available as environment variables:
```bash
# Environment variable format: <PREFIX>_<FUNCTION>
MY_PLUGIN_API_URL
MY_PLUGIN_API_KEY
MY_PLUGIN_RUN
```
In Python:
```python
import os
api_url = os.environ.get('MYPLN_API_URL', 'default_value')
```
## Localized Strings
Settings and UI text support multiple languages. Define translations in the `name` and `description` arrays:
```json
{
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "API URL"
},
{
"language_code": "es_es",
"string": "URL de API"
},
{
"language_code": "de_de",
"string": "API-URL"
}
],
"description": [
{
"language_code": "en_us",
"string": "Enter the API endpoint URL"
},
{
"language_code": "es_es",
"string": "Ingrese la URL del endpoint de API"
},
{
"language_code": "de_de",
"string": "Geben Sie die API-Endpunkt-URL ein"
}
]
}
```
- `en_us` - English (required)
## Examples
### Example 1: Website Monitor Plugin
```json
{
"settings": [
{
"function": "RUN",
"type": {"dataType": "string", "elements": [{"elementType": "select", "elementOptions": [], "transformers": []}]},
"default_value": "disabled",
"options": ["disabled", "once", "schedule"],
"localized": ["name", "description"],
"name": [{"language_code": "en_us", "string": "When to run"}],
"description": [{"language_code": "en_us", "string": "Enable website monitoring"}]
},
{
"function": "RUN_SCHD",
"type": {"dataType": "string", "elements": [{"elementType": "input", "elementOptions": [], "transformers": []}]},
"default_value": "*/5 * * * *",
"localized": ["name", "description"],
"name": [{"language_code": "en_us", "string": "Schedule"}],
"description": [{"language_code": "en_us", "string": "Cron format (default: every 5 minutes)"}]
},
{
"function": "CMD",
"type": {"dataType": "string", "elements": [{"elementType": "input", "elementOptions": [], "transformers": []}]},
"default_value": "python3 /app/front/plugins/website_monitor/script.py urls={urls}",
"localized": ["name", "description"],
"name": [{"language_code": "en_us", "string": "Command"}],
"description": [{"language_code": "en_us", "string": "Command to execute"}]
},
{
"function": "RUN_TIMEOUT",
"type": {"dataType": "string", "elements": [{"elementType": "input", "elementOptions": [], "transformers": []}]},
"default_value": "60",
"localized": ["name", "description"],
"name": [{"language_code": "en_us", "string": "Timeout"}],
"description": [{"language_code": "en_us", "string": "Maximum execution time in seconds"}]
},
{
"function": "URLS",
"type": {"dataType": "array", "elements": [{"elementType": "input", "elementOptions": [], "transformers": []}]},
"default_value": ["https://example.com"],
"maxLength": 200,
"localized": ["name", "description"],
"name": [{"language_code": "en_us", "string": "URLs to monitor"}],
"description": [{"language_code": "en_us", "string": "One URL per line"}]
},
{
"function": "WATCH",
"type": {"dataType": "array", "elements": [{"elementType": "select", "elementOptions": [{"isMultiSelect": true}], "transformers": []}]},
"default_value": ["Status_Code"],
"options": ["Status_Code", "Response_Time", "Certificate_Expiry"],
"localized": ["name", "description"],
"name": [{"language_code": "en_us", "string": "Watch columns"}],
"description": [{"language_code": "en_us", "string": "Which changes trigger notifications"}]
}
]
}
```
### Example 2: PiHole Integration Plugin
```json
{
"settings": [
{
"function": "RUN",
"type": {"dataType": "string", "elements": [{"elementType": "select", "elementOptions": [], "transformers": []}]},
"default_value": "disabled",
"options": ["disabled", "schedule"],
"localized": ["name", "description"],
"name": [{"language_code": "en_us", "string": "When to run"}],
"description": [{"language_code": "en_us", "string": "Enable PiHole integration"}]
},
{
"function": "DB_PATH",
"type": {"dataType": "string", "elements": [{"elementType": "input", "elementOptions": [], "transformers": []}]},
"default_value": "/etc/pihole/pihole-FTL.db",
"localized": ["name", "description"],
"name": [{"language_code": "en_us", "string": "Database path"}],
"description": [{"language_code": "en_us", "string": "Path to pihole-FTL.db inside container"}]
},
{
"function": "API_KEY",
"type": {"dataType": "string", "elements": [{"elementType": "input", "elementOptions": [{"type": "password"}], "transformers": ["sha256"]}]},
"default_value": "",
"localized": ["name", "description"],
"name": [{"language_code": "en_us", "string": "API Key"}],
"description": [{"language_code": "en_us", "string": "PiHole API key (optional, stored securely)"}]
}
]
}
```
## Validation & Testing
### Check Settings Are Recognized
After saving your `config.json`:
1. Restart the backend: Run task `[Dev Container] Start Backend (Python)`
2. Open Settings page in UI
3. Navigate to Plugin Settings
4. Look for your plugin's settings
### Read Setting Values in Script
Test that values are accessible:
```python
from helper import get_setting_value
# Try to read a setting
value = get_setting_value('MYPLN_API_URL')
mylog('none', f"Setting value: {value}")
# Should print the user-configured value or default
```
### Debug Settings
Check backend logs:
```bash
tail -f /tmp/log/stdout.log | grep -i "setting\|MYPLN"
```
## See Also
- [Settings System Documentation](./SETTINGS_SYSTEM.md) - Full settings flow and lifecycle
- [Quick Start Guide](PLUGINS_DEV_QUICK_START.md) - Get a working plugin quickly
- [Plugin Data Contract](PLUGINS_DEV_DATA_CONTRACT.md) - Output data format
- [UI Components](PLUGINS_DEV_UI_COMPONENTS.md) - Display plugin results