# Plugin Development Quick Start Get a working plugin up and running in 5 minutes. ## Prerequisites - Read [Development Environment Setup Guide](./DEV_ENV_SETUP.md) to set up your local environment - Understand [Plugin Architecture Overview](PLUGINS_DEV.md) ## Quick Start Steps ### 1. Create Your Plugin Folder Start from the template to get the basic structure: ```bash cd /workspaces/NetAlertX/front/plugins cp -r __template my_plugin cd my_plugin ``` ### 2. Update `config.json` Identifiers Edit `my_plugin/config.json` and update these critical fields: ```json { "code_name": "my_plugin", "unique_prefix": "MYPLN", "display_name": [{"language_code": "en_us", "string": "My Plugin"}], "description": [{"language_code": "en_us", "string": "My custom plugin"}] } ``` **Important:** - `code_name` must match the folder name - `unique_prefix` must be unique and uppercase (check existing plugins to avoid conflicts) - `unique_prefix` is used as a prefix for all generated settings (e.g., `MYPLN_RUN`, `MYPLN_CMD`) ### 3. Implement Your Script Edit `my_plugin/script.py` and implement your data collection logic: ```python #!/usr/bin/env python3 import sys import os sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../server')) sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../plugins')) from plugin_helper import Plugin_Objects, mylog from helper import get_setting_value from const import logPath pluginName = "MYPLN" LOG_PATH = logPath + "/plugins" LOG_FILE = os.path.join(LOG_PATH, f"script.{pluginName}.log") RESULT_FILE = os.path.join(LOG_PATH, f"last_result.{pluginName}.log") # Initialize plugin_objects = Plugin_Objects(RESULT_FILE) try: # Your data collection logic here # For example, scan something and collect results # Add an object to results plugin_objects.add_object( Object_PrimaryID="example_id", Object_SecondaryID=None, DateTime="2023-01-02 15:56:30", Watched_Value1="value1", Watched_Value2=None, Watched_Value3=None, Watched_Value4=None, Extra="additional_data", ForeignKey=None ) # Write results to the log file plugin_objects.write_result_file() except Exception as e: mylog("none", f"Error: {e}") sys.exit(1) ``` ### 4. Configure Execution Edit the `RUN` and `CMD` settings in `config.json`: ```json { "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 plugin execution"}] }, { "function": "CMD", "type": {"dataType":"string", "elements": [{"elementType": "input", "elementOptions": [], "transformers": []}]}, "default_value": "python3 /app/front/plugins/my_plugin/script.py", "localized": ["name", "description"], "name": [{"language_code":"en_us", "string": "Command"}], "description": [{"language_code":"en_us", "string": "Command to execute"}] } ``` ### 5. Test Your Plugin #### In Dev Container ```bash # Test the script directly python3 /workspaces/NetAlertX/front/plugins/my_plugin/script.py # Check the results cat /tmp/log/plugins/last_result.MYPLN.log ``` #### Via UI 1. Restart backend: Run task `[Dev Container] Start Backend (Python)` 2. Open Settings → Plugin Settings → My Plugin 3. Set `My Plugin - When to run` to `once` 4. Click Save 5. Check `/tmp/log/plugins/last_result.MYPLN.log` for output ### 6. Check Results Verify your plugin is working: ```bash # Check if result file was generated ls -la /tmp/log/plugins/last_result.MYPLN.log # View contents cat /tmp/log/plugins/last_result.MYPLN.log # Check backend logs for errors tail -f /tmp/log/stdout.log | grep "my_plugin\|MYPLN" ``` ## Next Steps Now that you have a working basic plugin: 1. **Add Settings**: Customize behavior via user-configurable settings (see [PLUGINS_DEV_SETTINGS.md](PLUGINS_DEV_SETTINGS.md)) 2. **Implement Data Contract**: Structure your output correctly (see [PLUGINS_DEV_DATA_CONTRACT.md](PLUGINS_DEV_DATA_CONTRACT.md)) 3. **Configure UI**: Display plugin results in the web interface (see [PLUGINS_DEV_UI_COMPONENTS.md](PLUGINS_DEV_UI_COMPONENTS.md)) 4. **Map to Database**: Import data into NetAlertX tables like `CurrentScan` or `Devices` 5. **Set Schedules**: Run your plugin on a schedule (see [PLUGINS_DEV_CONFIG.md](PLUGINS_DEV_CONFIG.md)) ## Common Issues | Issue | Solution | |-------|----------| | "Module not found" errors | Ensure `sys.path` includes `/app/server` and `/app/front/plugins` | | Settings not appearing | Restart backend and clear browser cache | | Results not showing up | Check `/tmp/log/plugins/*.log` and `/tmp/log/stdout.log` for errors | | Permission denied | Plugin runs in container, use absolute paths like `/app/front/plugins/...` | ## Resources - [Full Plugin Development Guide](PLUGINS_DEV.md) - [Plugin Data Contract](PLUGINS_DEV_DATA_CONTRACT.md) - [Plugin Settings System](PLUGINS_DEV_SETTINGS.md) - [Data Sources](PLUGINS_DEV_DATASOURCES.md) - [UI Components](PLUGINS_DEV_UI_COMPONENTS.md) - [Debugging Plugins](DEBUG_PLUGINS.md)