This documentation will give you a basis for writing a plugin for
LibreNMS. An example plugin is included in the LibreNMS distribution.
# Version 2 Plugin System structure
Plugins in version 2 need to be installed into app/Plugins
The structure of a plugin is follows:
```
app/Plugins
/PluginName
/DeviceOverview.php
/Menu.php
/Page.php
/PortTab.php
/Settings.php
/resources/views
/device-overview.blade.php
/menu.blade.php
/page.blade.php
/port-tab.blade.php
/settings.blade.php
```
The above structure is checked before a plugin can be installed.
All file/folder names are case sensitive and must match the structure.
Only the blade files that are really needed need to be created. A plugin manager
will then load a hook that has a basic functionality.
If you want to customize the basic behavior of the hooks, you can create a
class in 'app/Plugins/PluginName' and overload the hook methods.
- device-overview.blade.php :: This is called in the Device
Overview page. You receive the $device as a object per default, you can do your
work here and display your results in a frame.
```
<div class="row">
<div class="col-md-12">
<div class="panel panel-default panel-condensed">
<div class="panel-heading">
<strong>{{ $title }}</strong>
</div>
<div class="panel-body">
<div class="row">
<div class="col-sm-12">
{{ $device->hostname }}
<!-- Do you stuff here -->
</div>
</div>
</div>
</div>
</div>
</div>
```
- port-tab.blade.php :: This is called in the Port page,
in the "Plugins" menu_option that will appear when your plugin gets
enabled. In this blade, you can do your work and display your
results in a frame.
- menu.blade.php :: For a menu entry
- page.blade.pho :: Here is a good place to add a own LibreNMS page without dependence with a device. A good place to create your own lists with special requirements and behavior.
- settings.blade.php :: If you need your own settings and variables, you can have a look in the ExamplePlugin.
If you want to change the behavior, you can customize the hooks methods. Just as an example, you could imagine that the device-overview.blade.php should only be displayed when the device is in maintanence mode. Of course the method is more for a permission concept but it gives you the idea.
```
abstract class DeviceOverviewHook
{
...
public function authorize(User $user, Device $device, array $settings): bool
{
return $device->isUnderMaintenance();
}
...
```
# Version 1 Plugin System structure (legacy verion)