## Python Plugins
### Linux and Windows WSL
#### Configuration
> [!ATTENTION] Warning
> - To install the plugin, you need the [[1. Cellframe Node Installation|Cellframe Node to be installed]]
Enable plugin subsystem in cellframe-node [[2. Cellframe Node Configuration|Cellframe Node Configuration|configuration]]
```
[plugins]
py_path=/opt/cellframe-node/var/lib/plugins
enabled=true
py_load=true
```
#### Plugin structure
To use plugins with Cellframe Node, follow these steps:
1. **Create Plugin Directory:**
- Navigate to `/opt/cellframe-node/var/lib` directory.
- Create a folder named `plugins`.
2. **Organize Plugin Files by following:**
```
plugins
├── plugin_1
│ ├── plugin_1.py
│ └── manifest.json
└── plugin_2
├── plugin_2.py
└── manifest.json
```
> [!ERROR] Important
> - Each plugin directory should contain at least two files: [[Manifest file|manifest.json]] and the Python script implementing the plugin's functionality.
> - The name of each entrypoint should match the name of the corresponding plugin and the name in manifest file.
#### Python script
The plugin folder can contain several python scripts. Each plugin must contain ***init*** and possibly ***deinit*** functions. The init and deinit functions must return integer value and should not accept any arguments.
The ***init*** function is called by the plugin sybsystem after downloading the chain files, but before the Cellframe Node goes online.
The ***deinit*** function is called when the Cellframe Node shut down. Finalize all work with open resourse here, if there where any.
> [!HINT] Note
> In Cellframe Node, each plugin is treated as a separate Python module, herewith, they all work in a common scope.
```python
# testplugin.py
from DAP.Core import logIT
def init():
"""
Initialization function for the plugin.
This function is called when the plugin is loaded.
It should perform any necessary setup.
Returns:
int: A status code indicating the success of initialization. Zero indicates success,
while non-zero values indicate errors.
"""
logIt.notice('Hello world!')
return 0
def deinit():
"""
Deinitialization function for the plugin.
This function is called when the plugin is unloaded.
It should perform any necessary cleanup.
Returns:
int: A status code indicating the success of deinitialization. Zero indicates success,
while non-zero values indicate errors.
"""
# Perform cleanup here
return 0
```
#### Launchig the plugin
- To run plugins, restart the Cellframe Node.
- To check the plugin has started and is working properly, view the log by following:
```bash
tail -f /opt/cellframe-node/var/log/cellframe-node.log
```
it is also possible to restart your plugins without restarting the node
> [!HINT] Note
>It is also possible to restart your plugins without restart the node. To do this, use the restart or reload [[5. CLI Node Commands|CLI (Command Line Interface)]] commands:
> To restart **all plugins** in `/opt/cellframe-node/var/lib/plugins` directory:
>```
>cellframe-node-cli plugin restart
>```
>To reload a spesific plugin:
>```
>cellframe-node-cli plugin reload <plugin-name>
#### Installing third-party modules
To install third-party modules, you need to contact the pip utility directly:
```bash
sudo /opt/cellframe-node/python/bin/pip3 install <name-of-the-package>
```
Afterward, the downloaded files will be stored in the following directory: `/opt/cellframe-node/python/lib/python3.10.`