Plugins move back

This commit is contained in:
Jokob-sk
2023-07-22 11:06:01 +10:00
parent 0446f6302e
commit 6e8bb4c2ea
38 changed files with 1183 additions and 545 deletions

View File

@@ -45,6 +45,7 @@ services:
- ${DEV_LOCATION}/front/network.php:/home/pi/pialert/front/network.php - ${DEV_LOCATION}/front/network.php:/home/pi/pialert/front/network.php
- ${DEV_LOCATION}/front/presence.php:/home/pi/pialert/front/presence.php - ${DEV_LOCATION}/front/presence.php:/home/pi/pialert/front/presence.php
- ${DEV_LOCATION}/front/settings.php:/home/pi/pialert/front/settings.php - ${DEV_LOCATION}/front/settings.php:/home/pi/pialert/front/settings.php
- ${DEV_LOCATION}/front/plugins:/home/pi/pialert/front/plugins
# DELETE END anyone trying to use this file: comment out / delete ABOVE lines, they are only for development purposes # DELETE END anyone trying to use this file: comment out / delete ABOVE lines, they are only for development purposes
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
environment: environment:

View File

@@ -22,7 +22,7 @@ There is also an in-app Help / FAQ section that should be answering frequently a
#### 🔝 Popular/Suggested #### 🔝 Popular/Suggested
- [API endpoints details](/docs/API.md) - [API endpoints details](/docs/API.md)
- [Plugin system details and how to develop your own](/pialert/plugins/README.md) - [Plugin system details and how to develop your own](/front/plugins/README.md)
- [Network treemap configuration](/docs/NETWORK_TREE.md) - [Network treemap configuration](/docs/NETWORK_TREE.md)
- [Gmail as SMTP server for sending emails](/docs/SMTP_GMAIL.md) - [Gmail as SMTP server for sending emails](/docs/SMTP_GMAIL.md)
- [Subnets and VLANs configuration for arp-scan](/docs/SUBNETS.md) - [Subnets and VLANs configuration for arp-scan](/docs/SUBNETS.md)

View File

@@ -1 +1,529 @@
Content moved to: https://github.com/jokob-sk/Pi.Alert/tree/main/pialert/plugins ## 📚 Docs for individual plugins
### Script based plugins
- [website_monitor (WEBMON)](https://github.com/jokob-sk/Pi.Alert/blob/main/front/plugins/website_monitor/)
- [dhcp_servers (DHCPSRVS)](https://github.com/jokob-sk/Pi.Alert/blob/main/front/plugins/dhcp_servers/)
- [dhcp_leases (DHCPLSS)](https://github.com/jokob-sk/Pi.Alert/blob/main/front/plugins/dhcp_leases/)
- [unifi_import (UNFIMP)](https://github.com/jokob-sk/Pi.Alert/blob/main/front/plugins/unifi_import/)
- [snmp_discovery (SNMPDSC)](https://github.com/jokob-sk/Pi.Alert/blob/main/front/plugins/snmp_discovery/)
- [undiscoverables (UNDIS)](https://github.com/jokob-sk/Pi.Alert/blob/main/front/plugins/undiscoverables/)
### SQL query based plugins
- [nmap_services (NMAPSERV)](https://github.com/jokob-sk/Pi.Alert/blob/main/front/plugins/nmap_services/)
### template based plugins
- [newdev_template (NEWDEV)](https://github.com/jokob-sk/Pi.Alert/blob/main/front/plugins/newdev_template/)
## 🌟 Create a custom plugin: Overview
| ![Screen 1][screen1] | ![Screen 2][screen2] | ![Screen 3][screen3] |
|----------------------|----------------------| ----------------------|
| ![Screen 4][screen4] | ![Screen 5][screen5] |
PiAlert comes with a plugin system to feed events from third-party scripts into the UI and then send notifications, if desired. The highlighted core functionality this plugin system supports, is:
* dynamic creation of a simple UI to interact with the discovered objects,
* filtering of displayed values in the Devices UI
* surface settings of plugins in the UI,
* different column types for reported values to e.g. link back to a device
* import objects into existing PiAlert database tables
> (Currently, update/overwriting of existing objects is not supported.)
Example use cases for plugins could be:
* Monitor a web service and alert me if it's down
* Import devices from dhcp.leases files instead/complementary to using PiHole or arp-scans
* Creating ad-hoc UI tables from existing data in the PiAlert database, e.g. to show all open ports on devices, to list devices that disconnected in the last hour, etc.
* Using other device discovery methods on the network and importing the data as new devices
* Creating a script to create FAKE devices based on user input via custom settings
* ...at this point the limitation is mostly the creativity than the capability (there might be edge cases and a need to support more form controls for user input off custom settings, but you probably get the idea)
If you wish to develop a plugin, please check the existing plugin structure. Once the settings are saved by the user they need to be removed from the `pialert.conf` file manually if you want to re-initialize them from the `config.json` of the plugin.
Again, please read the below carefully if you'd like to contribute with a plugin yourself. This documentation file might be outdated, so double-check the sample plugins as well.
## ⚠ Disclaimer
Follow the below very carefully and check example plugin(s) if you'd like to write one yourself. Plugin UI is not my priority right now, happy to approve PRs if you are interested in extending/improving the UI experience. Example improvements for the taking:
* Making the tables sortable/filterable
* Using the same approach to display table data as in the Devices section (solves above)
* Adding form controls supported to display the data (Currently supported ones are listed in the section "UI settings in database_column_definitions" below)
* ...
## ❗ Known issues:
These issues will be hopefully fixed with time, so please don't report them. Instead, if you know how, feel free to investigate and submit a PR to fix the below. Keep the PRs small as it's easier to approve them:
* Existing plugin objects sometimes not interpreted correctly and a new object is created instead, resulting in duplicate entries.
* Occasional (experienced twice) hanging of processing plugin script file.
UI displays outdated values until the API endpoints get refreshed.
## Plugin file structure overview
> Folder name must be the same as the code name value in: `"code_name": "<value>"`
> Unique prefix needs to be unique compared to the other settings prefixes, e.g.: the prefix `APPRISE` is already in use.
| File | Required (plugin type) | Description |
|----------------------|----------------------|----------------------|
| `config.json` | yes | Contains the plugin configuration (manifest) including the settings available to the user. |
| `script.py` | yes (script) | The Python script itself |
| `last_result.log` | yes (script) | The file used to interface between PiAlert and the plugin (script). |
| `script.log` | no | Logging output (recommended) |
| `README.md` | no | Any setup considerations or overview (recommended) |
More on specifics below.
### Column order and values
| Order | Represented Column | Required | Description |
|----------------------|----------------------|----------------------|----------------------|
| 0 | `Object_PrimaryID` | yes | The primary ID used to group Events under. |
| 1 | `Object_SecondaryID` | no | Optional secondary ID to create a relationship beween other entities, such as a MAC address |
| 2 | `DateTime` | yes | When the event occured in the format `2023-01-02 15:56:30` |
| 3 | `Watched_Value1` | yes | A value that is watched and users can receive notifications if it changed compared to the previously saved entry. For example IP address |
| 4 | `Watched_Value2` | no | As above |
| 5 | `Watched_Value3` | no | As above |
| 6 | `Watched_Value4` | no | As above |
| 7 | `Extra` | no | Any other data you want to pass and display in PiAlert and the notifications |
| 8 | `ForeignKey` | no | A foreign key that can be used to link to the parent object (usually a MAC address) |
# config.json structure
## Supported data sources
Currently, only 3 data sources are supported (valid `data_source` value).
- Script (`python-script`)
- SQL query on the PiAlert database (`pialert-db-query`)
- Template (`template`)
> 🔎Example
>```json
>"data_source": "pialert-db-query"
>```
Any of the above data sources have to return a "table" of the exact structure as outlined above.
### "data_source": "python-script"
If the `data_source` is set to `python-script` the `CMD` setting (that you specify in the `settings` array section in the `config.json`) needs to contain an executable Linux command, that generates a `last_result.log` file. This file needs to be stored in the same folder as the plugin.
The content of the `last_result.log` file needs to contain the columns as defined in the "Column order and values" section above. The order of columns can't be changed. After every scan it should contain only the results from the latest scan/execution.
- The format of the `last_result.log` is a `csv`-like file with the pipe `|` as a separator.
- 9 (nine) values need to be supplied, so every line needs to contain 8 pipe separators. Empty values are represented by `null`.
- Don't render "headers" for these "columns".
- Every scan result / event entry needs to be on a new line.
- You can find which "columns" need to be present, and if the value is required or optional, in the "Column order and values" section.
- The order of these "columns" can't be changed.
### 👍 Python script.py tips
The [Undicoverables plugins `script.py` file](https://github.com/jokob-sk/Pi.Alert/blob/main/front/plugins/undiscoverables/script.py) is a good and simple example to start with if you are considering creating a custom plugin. It uses the [`plugin_helper.py` library](https://github.com/jokob-sk/Pi.Alert/blob/main/front/plugins/plugin_helper.py) that significantly simplifies the creation of your custom script.
#### 🔎 last_result.log examples
Valid CSV:
```csv
https://www.google.com|null|2023-01-02 15:56:30|200|0.7898|null|null|null|null
https://www.duckduckgo.com|192.168.0.1|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine|ff:ee:ff:11:ff:11
```
Invalid CSV with different errors on each line:
```csv
https://www.google.com|null|2023-01-02 15:56:30|200|0.7898||null|null|null
https://www.duckduckgo.com|null|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine|
|https://www.duckduckgo.com|null|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine|null
null|192.168.1.1|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine
https://www.duckduckgo.com|192.168.1.1|2023-01-02 15:56:30|null|0.9898|null|null|Best search engine
https://www.google.com|null|2023-01-02 15:56:30|200|0.7898|||
https://www.google.com|null|2023-01-02 15:56:30|200|0.7898|
```
### "data_source": "pialert-db-query"
If the `data_source` is set to `pialert-db-query` the `CMD` setting needs to contain a SQL query rendering the columns as defined in the "Column order and values" section above. The order of columns is important.
This SQL query is executed on the `pialert.db` SQLite database file.
> 🔎Example
>
> SQL query example:
>
> ```SQL
> SELECT dv.dev_Name as Object_PrimaryID,
> cast(dv.dev_LastIP as VARCHAR(100)) || ':' || cast( SUBSTR(ns.Port ,0, INSTR(ns.Port , '/')) as VARCHAR(100)) as Object_SecondaryID,
> datetime() as DateTime,
> ns.Service as Watched_Value1,
> ns.State as Watched_Value2,
> 'null' as Watched_Value3,
> 'null' as Watched_Value4,
> ns.Extra as Extra,
> dv.dev_MAC as ForeignKey
> FROM
> (SELECT * FROM Nmap_Scan) ns
> LEFT JOIN
> (SELECT dev_Name, dev_MAC, dev_LastIP FROM Devices) dv
> ON ns.MAC = dv.dev_MAC
> ```
>
> Required `CMD` setting example with above query (you can set `"type": "label"` if you want it to make uneditable in the UI):
>
> ```json
> {
> "function": "CMD",
> "type": "text",
> "default_value":"SELECT dv.dev_Name as Object_PrimaryID, cast(dv.dev_LastIP as VARCHAR(100)) || ':' || cast( SUBSTR(ns.Port ,0, INSTR(ns.Port , '/')) as VARCHAR(100)) as Object_SecondaryID, datetime() as DateTime, ns.Service as Watched_Value1, ns.State as Watched_Value2, 'null' as Watched_Value3, 'null' as Watched_Value4, ns.Extra as Extra FROM (SELECT * FROM Nmap_Scan) ns LEFT JOIN (SELECT dev_Name, dev_MAC, dev_LastIP FROM Devices) dv ON ns.MAC = dv.dev_MAC",
> "options": [],
> "localized": ["name", "description"],
> "name" : [{
> "language_code":"en_us",
> "string" : "SQL to run"
> }],
> "description": [{
> "language_code":"en_us",
> "string" : "This SQL query is used to populate the coresponding UI tables under the Plugins section."
> }]
> }
> ```
### "data_source": "template"
Used to initialize internal settings. Check the `newdev_template` plugin for details.
## Filters
Plugin entries can be filtered based on values entered into filter fields. The `txtMacFilter` textbox/field contains the Mac address of the currently viewed device or simply a Mac address that's available in the `mac` query string.
| Property | Required | Description |
|----------------------|----------------------|----------------------|
| `compare_column` | yes | Plugin column name that's value is used for comparison (**Left** side of the equation) |
| `compare_operator` | yes | JavaScript comparison operator |
| `compare_field_id` | yes | The `id` of a input text field containing a value is used for comparison (**Right** side of the equation)|
| `compare_js_template` | yes | JavaScript code used to convert left and right side of the equation. `{value}` is replaced with input values. |
| `compare_use_quotes` | yes | If `true` then the end result of the `compare_js_template` i swrapped in `"` quotes. Use to compare strings. |
> 🔎Example:
>
> ```json
> "data_filters": [
> {
> "compare_column" : "Object_PrimaryID",
> "compare_operator" : "==",
> "compare_field_id": "txtMacFilter",
> "compare_js_template": "'{value}'.toString()",
> "compare_use_quotes": true
> }
> ],
> ```
1. On the `pluginsCore.php` page is an input field with the `txtMacFilter` id:
```html
<input class="form-control" id="txtMacFilter" type="text" value="--">
```
2. This input field is initialized via the `&mac=` query string.
3. The app then proceeds to use this Mac value from this field and compares it to the value of the `Object_PrimaryID` database field. The `compare_operator` is `==`.
4. Both values, from the database field `Object_PrimaryID` and from the `txtMacFilter` are wrapped and evaluated with the `compare_js_template`, that is `'{value}.toString()'`.
5. `compare_use_quotes` is set to `true` so `'{value}'.toString()` is wrappe dinto `"` quotes.
6. This results in for example this code:
```javascript
// left part of teh expression coming from compare_column and right from the input field
// notice the added quotes ()") around the left and right part of teh expression
"eval('ac:82:ac:82:ac:82".toString()')" == "eval('ac:82:ac:82:ac:82".toString()')"
```
7. Filters are only applied if a filter is specified and the `txtMacFilter` is not `undefined` or empty (`--`).
### Mapping the plugin results into a database table
PiAlert will take the results of the plugin execution and insert these results into a database table, if a plugin contains the property `"mapped_to_table"` in the `config.json` root. The mapping of the columns is defined in the `database_column_definitions` array.
This approach is used to implement the `DHCPLSS` plugin. The script parses all supplied "dhcp.leases" files, get's the results in the generic table format outlined in the "Column order and values" section above and takes individual values and inserts them into the `"DHCP_Leases"` database table in the PiAlert database. All this is achieved by:
1) Specifying the database table into which the results are inserted by defining `"mapped_to_table": "DHCP_Leases"` in the root of the `config.json` file as shown below:
```json
{
"code_name": "dhcp_leases",
"unique_prefix": "DHCPLSS",
...
"data_source": "python-script",
"localized": ["display_name", "description", "icon"],
"mapped_to_table": "DHCP_Leases",
...
}
```
2) Defining the target column with the `mapped_to_column` property for individual columns in the `database_column_definitions` array of the `config.json` file. For example in the `DHCPLSS` plugin, I needed to map the value of the `Object_PrimaryID` column returned by the plugin, to the `DHCP_MAC` column in the PiAlert database `DHCP_Leases` table. Notice the `"mapped_to_column": "DHCP_MAC"` key-value pair in the sample below.
```json
{
"column": "Object_PrimaryID",
"mapped_to_column": "DHCP_MAC",
"css_classes": "col-sm-2",
"show": true,
"type": "devicemac",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "MAC address"
}]
}
```
3) That's it. PiAlert takes care of the rest. It loops thru the objects discovered by the plugin, takes the results line, by line and inserts them into the database table specified in `"mapped_to_table"`. The columns are translated from the generic plugin columns to the target table via the `"mapped_to_column"` property in the column definitions.
#### params
The `params` array in the `config.json` is used to enable the user to change the parameters of the executed script. For example, the user wants to monitor a specific URL.
> 🔎 Example:
> Passing user-defined settings to a command. Let's say, you want to have a script, that is called with a user-defined parameter called `urls`:
>
> ```bash
> root@server# python3 /home/pi/pialert/front/plugins/website_monitor/script.py urls=https://google.com,https://duck.com
> ```
* You can allow the user to add URLs to a setting with the `function` property set to a custom name, such as `urls_to_check` (this is not a reserved name from the section "Supported settings `function` values" below).
* You specify the parameter `urls` in the `params` section of the `config.json` the following way (`WEBMON_` is the plugin prefix automatically added to all the settings):
```json
{
"params" : [
{
"name" : "urls",
"type" : "setting",
"value" : "WEBMON_urls_to_check"
}]
}
```
* Then you use this setting as an input parameter for your command in the `CMD` setting. Notice `urls={urls}` in the below json:
```json
{
"function": "CMD",
"type": "text",
"default_value":"python3 /home/pi/pialert/front/plugins/website_monitor/script.py urls={urls}",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code":"en_us",
"string" : "Command"
}],
"description": [{
"language_code":"en_us",
"string" : "Command to run"
}]
}
```
During script execution, the app will take the command `"python3 /home/pi/pialert/front/plugins/website_monitor/script.py urls={urls}"`, take the `{urls}` wildcard and replace it by with the value from the `WEBMON_urls_to_check` setting. This is because:
1) The app checks the `params` entries
2) It finds `"name" : "urls"`
3) Checks the type of the `urls` params and finds `"type" : "setting"`
4) Gets the setting name from `"value" : "WEBMON_urls_to_check"`
- IMPORTANT: in the `config.json` this setting is identified by `"function":"urls_to_check"`, not `"function":"WEBMON_urls_to_check"`
- You can also use a global setting, or a setting from a different plugin
5) The app gets the user defined value from the setting with the code name `WEBMON_urls_to_check`
- let's say the setting with the code name `WEBMON_urls_to_check` contains 2 values entered by the user:
- `WEBMON_urls_to_check=['https://google.com','https://duck.com']`
6) The app takes the value from `WEBMON_urls_to_check` and replaces the `{urls}` wildcard in the setting where `"function":"CMD"`, so you go from:
- `python3 /home/pi/pialert/front/plugins/website_monitor/script.py urls={urls}`
- to
- `python3 /home/pi/pialert/front/plugins/website_monitor/script.py urls=https://google.com,https://duck.com`
Below are some general additional notes, when defining `params`:
- `"name":"name_value"` - is used as a wildcard replacement in the `CMD` setting value by using curly brackets `{name_value}`. The wildcard is replaced by the result of the `"value" : "param_value"` and `"type":"type_value"` combo configuration below.
- `"type":"<sql|setting>"` - is used to specify the type of the params, currently only 2 supported (`sql`,`setting`).
- `"type":"sql"` - will execute the SQL query specified in the `value` property. The sql query needs to return only one column. The column is flattened and separated by commas (`,`), e.g: `SELECT dev_MAC from DEVICES` -> `Internet,74:ac:74:ac:74:ac,44:44:74:ac:74:ac`. This is then used to replace the wildcards in the `CMD` setting.
- `"type":"setting"` - The setting code name. A combination of the value from `unique_prefix` + `_` + `function` value, or otherwise the code name you can find in the Settings page under the Setting display name, e.g. `SCAN_CYCLE_MINUTES`.
- `"value" : "param_value"` - Needs to contain a setting code name or SQL query without wildcards.
> 🔎Example:
>
> ```json
> {
> "params" : [{
> "name" : "macs",
> "type" : "sql",
> "value" : "SELECT dev_MAC from DEVICES"
> },
> {
> "name" : "urls",
> "type" : "setting",
> "value" : "WEBMON_urls_to_check"
> },
> {
> "name" : "internet_ip",
> "type" : "setting",
> "value" : "WEBMON_SQL_internet_ip"
> }]
> }
> ```
#### Setting object structure
- `"function": "<see Supported settings function values>"` - What function the setting drives or a simple unique code name
- `"type": "<text|integer|boolean|password|readonly|integer.select|text.select|text.multiselect|list|integer.checkbox>"` - The form control used for the setting displayed in the Settings page and what values are accepted.
- `"localized"` - a list of properties on the current JSON level which need to be localized
- `"name"` and `"description"` - Displayed in the Settings page. An array of localized strings. (see Localized strings below).
##### Supported settings `function` values
You can have any `"function": "my_custom_name"` custom name, however, the ones listed below have a specific functionality attached to them. If you use a custom name, then the setting is mostly used as an input parameter for the `params` section.
- `RUN` - (required) Specifies when the service is executed
- Supported Options: "disabled", "once", "schedule" (if included then a `RUN_SCHD` setting needs to be specified), "always_after_scan", "on_new_device"
- `RUN_SCHD` - (required if you include the above `RUN` function) Cron-like scheduling used if the `RUN` setting set to `schedule`
- `CMD` - (required) What command should be executed.
- `API_SQL` - (optional) Generates a `table_` + code_name + `.json` file as per [API docs](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/API.md).
- `RUN_TIMEOUT` - (optional) Max execution time of the script. If not specified a default value of 10 seconds is used to prevent hanging.
- `WATCH` - (optional) Which database columns are watched for changes for this particular plugin. If not specified no notifications are sent.
- `REPORT_ON` - (optional) Send a notification only on these statuses. Supported options are:
- `new` means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered.
- `watched-changed` - means that selected `Watched_ValueN` columns changed
- `watched-not-changed` - reports even on events where selected `Watched_ValueN` did not change
> 🔎 Example:
>
> ```json
> {
> "function": "RUN",
> "type": "text.select",
> "default_value":"disabled",
> "options": ["disabled", "once", "schedule", "always_after_scan", "on_new_device"],
> "localized": ["name", "description"],
> "name" :[{
> "language_code":"en_us",
> "string" : "When to run"
> }],
> "description": [{
> "language_code":"en_us",
> "string" : "Enable a regular scan of your services. If you select <code>schedule</code> the scheduling settings from below are applied. If you select <code>once</code> the scan is run only once on start of the application (container) for the time specified in <a href=\"#WEBMON_RUN_TIMEOUT\"><code>WEBMON_RUN_TIMEOUT</code> setting</a>."
> }]
> }
> ```
##### Localized strings
- `"language_code":"<en_us|es_es|de_de>"` - code name of the language string. Only these three are currently supported. At least the `"language_code":"en_us"` variant has to be defined.
- `"string"` - The string to be displayed in the given language.
> 🔎 Example:
>
> ```json
>
> {
> "language_code":"en_us",
> "string" : "When to run"
> }
>
> ```
##### UI settings in database_column_definitions
The UI will adjust how columns are displayed in the UI based on the definition of the `database_column_definitions` object. These are the supported form controls and related functionality:
- Only columns with `"show": true` and also with at least an English translation will be shown in the UI.
- Supported types: `label`, `text`, `threshold`, `replace`, `deviceip`, `devicemac`, `url`. Check for details below, how columns behave based on the type.
- `label` makes a column display only
- `text` makes a column editable and a save icon is displayed next to it.
- See below for information on `threshold`, `replace`
- The `options` property is used in conjunction with these types:
- `threshold` - The `options` array contains objects from lowest `maximum` to highest with corresponding `hexColor` used for the value background color if it's less than the specified `maximum`, but more than the previous one in the `options` array
- `replace` - The `options` array contains objects with an `equals` property, that is compared to the "value" and if the values are the same, the string in `replacement` is displayed in the UI instead of the actual "value"
- `devicemac` - The value is considered to be a Mac address and a link pointing to the device with the given Mac address is generated.
- `deviceip` - The value is considered to be an IP address and a link pointing to the device with the given IP is generated. The IP is checked against the last detected IP addresses and translated into a Mac address that is then used for the link itself.
- `url` - The value is considered to be a URL so a link is generated.
```json
{
"column": "Watched_Value1",
"css_classes": "col-sm-2",
"show": true,
"type": "threshold",
"default_value":"",
"options": [
{
"maximum": 199,
"hexColor": "#792D86"
},
{
"maximum": 299,
"hexColor": "#5B862D"
},
{
"maximum": 399,
"hexColor": "#7D862D"
},
{
"maximum": 499,
"hexColor": "#BF6440"
},
{
"maximum": 599,
"hexColor": "#D33115"
}
],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Status code"
}]
},
{
"column": "Status",
"show": true,
"type": "replace",
"default_value":"",
"options": [
{
"equals": "watched-not-changed",
"replacement": "<i class='fa-solid fa-square-check'></i>"
},
{
"equals": "watched-changed",
"replacement": "<i class='fa-solid fa-triangle-exclamation'></i>"
},
{
"equals": "new",
"replacement": "<i class='fa-solid fa-circle-plus'></i>"
}
],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Status"
}]
}
```
[screen1]: https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/docs/img/plugins.png "Screen 1"
[screen2]: https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/docs/img/plugins_settings.png "Screen 2"
[screen3]: https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/docs/img/plugins_json_settings.png "Screen 3"
[screen4]: https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/docs/img/plugins_json_ui.png "Screen 4"

View File

@@ -240,7 +240,7 @@
{ {
"function": "CMD", "function": "CMD",
"type": "text", "type": "text",
"default_value":"python3 /home/pi/pialert/pialert/plugins/dhcp_leases/script.py paths={paths}", "default_value":"python3 /home/pi/pialert/front/plugins/dhcp_leases/script.py paths={paths}",
"options": [], "options": [],
"localized": ["name", "description"], "localized": ["name", "description"],
"name" : [{ "name" : [{

View File

@@ -0,0 +1,96 @@
00:11:22:33:44:55|10.0.1.1|2023-04-12 19:32:57|False|host1|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|10.0.1.2|2023-04-12 19:32:57|False|host2|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-04-12 19:32:57|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-04-12 19:32:57|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|20.0.1.1|2023-04-12 19:32:57|False|b-host1|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:57|20.0.1.2|2023-04-12 19:32:57|False|b-host2|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:58|20.0.1.3|2023-04-12 19:32:57|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:59|20.0.1.3|2023-04-12 19:32:57|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:55|10.0.1.1|2023-04-12 19:43:21|False|host1|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|10.0.1.2|2023-04-12 19:43:21|False|host2|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-04-12 19:43:21|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-04-12 19:43:21|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|20.0.1.1|2023-04-12 19:43:21|False|b-host1|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:57|20.0.1.2|2023-04-12 19:43:21|False|b-host2|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:58|20.0.1.3|2023-04-12 19:43:21|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:59|20.0.1.3|2023-04-12 19:43:21|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:55|10.0.1.1|2023-04-12 19:50:43|False|host1|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|10.0.1.2|2023-04-12 19:50:43|False|host2|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-04-12 19:50:43|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-04-12 19:50:43|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|20.0.1.1|2023-04-12 19:50:43|False|b-host1|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:57|20.0.1.2|2023-04-12 19:50:43|False|b-host2|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:58|20.0.1.3|2023-04-12 19:50:43|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:59|20.0.1.3|2023-04-12 19:50:43|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:55|10.0.1.1|2023-04-12 19:58:19|False|host1|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|10.0.1.2|2023-04-12 19:58:19|False|host2|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-04-12 19:58:19|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-04-12 19:58:19|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|20.0.1.1|2023-04-12 19:58:19|False|b-host1|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:57|20.0.1.2|2023-04-12 19:58:19|False|b-host2|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:58|20.0.1.3|2023-04-12 19:58:19|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:59|20.0.1.3|2023-04-12 19:58:19|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:55|10.0.1.1|2023-05-05 21:54:53|False|host1|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|10.0.1.2|2023-05-05 21:54:53|False|host2|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-05-05 21:54:53|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-05-05 21:54:53|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|20.0.1.1|2023-05-05 21:54:53|False|b-host1|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:57|20.0.1.2|2023-05-05 21:54:53|False|b-host2|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:58|20.0.1.3|2023-05-05 21:54:53|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:59|20.0.1.3|2023-05-05 21:54:53|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:55|10.0.1.1|2023-05-05 21:57:39|False|host1|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|10.0.1.2|2023-05-05 21:57:39|False|host2|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-05-05 21:57:39|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-05-05 21:57:39|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|20.0.1.1|2023-05-05 21:57:39|False|b-host1|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:57|20.0.1.2|2023-05-05 21:57:39|False|b-host2|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:58|20.0.1.3|2023-05-05 21:57:39|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:59|20.0.1.3|2023-05-05 21:57:39|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:55|10.0.1.1|2023-05-05 22:32:47|False|host1|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|10.0.1.2|2023-05-05 22:32:47|False|host2|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-05-05 22:32:47|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-05-05 22:32:47|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|20.0.1.1|2023-05-05 22:32:47|False|b-host1|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:57|20.0.1.2|2023-05-05 22:32:47|False|b-host2|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:58|20.0.1.3|2023-05-05 22:32:47|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:59|20.0.1.3|2023-05-05 22:32:47|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:55|10.0.1.1|2023-05-07 10:46:31|False|host1|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|10.0.1.2|2023-05-07 10:46:31|False|host2|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-05-07 10:46:31|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-05-07 10:46:31|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|20.0.1.1|2023-05-07 10:46:31|False|b-host1|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:57|20.0.1.2|2023-05-07 10:46:31|False|b-host2|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:58|20.0.1.3|2023-05-07 10:46:31|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:59|20.0.1.3|2023-05-07 10:46:31|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:55|10.0.1.1|2023-05-14 14:03:19|False|host1|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|10.0.1.2|2023-05-14 14:03:19|False|host2|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-05-14 14:03:19|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-05-14 14:03:19|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|20.0.1.1|2023-05-14 14:03:19|False|b-host1|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:57|20.0.1.2|2023-05-14 14:03:19|False|b-host2|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:58|20.0.1.3|2023-05-14 14:03:19|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:59|20.0.1.3|2023-05-14 14:03:19|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:55|10.0.1.1|2023-05-14 14:07:44|False|host1|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|10.0.1.2|2023-05-14 14:07:44|False|host2|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-05-14 14:07:44|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-05-14 14:07:44|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|20.0.1.1|2023-05-14 14:07:44|False|b-host1|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:57|20.0.1.2|2023-05-14 14:07:44|False|b-host2|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:58|20.0.1.3|2023-05-14 14:07:44|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:59|20.0.1.3|2023-05-14 14:07:44|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:55|10.0.1.1|2023-06-10 08:26:10|False|host1|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|10.0.1.2|2023-06-10 08:26:10|False|host2|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-06-10 08:26:10|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-06-10 08:26:10|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|20.0.1.1|2023-06-10 08:26:10|False|b-host1|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:57|20.0.1.2|2023-06-10 08:26:10|False|b-host2|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:58|20.0.1.3|2023-06-10 08:26:10|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:59|20.0.1.3|2023-06-10 08:26:10|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:55|10.0.1.1|2023-06-10 08:31:48|False|host1|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|10.0.1.2|2023-06-10 08:31:48|False|host2|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-06-10 08:31:48|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:57|10.0.1.3|2023-06-10 08:31:48|False|host3|ethernet|free|/mnt/dhcp1.leases|
00:11:22:33:44:56|20.0.1.1|2023-06-10 08:31:48|False|b-host1|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:57|20.0.1.2|2023-06-10 08:31:48|False|b-host2|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:58|20.0.1.3|2023-06-10 08:31:48|False|b-host3|ethernet|free|/mnt/dhcp2.leases|
00:11:22:33:44:59|20.0.1.3|2023-06-10 08:31:48|False|b-host3|ethernet|free|/mnt/dhcp2.leases|

View File

@@ -221,7 +221,7 @@
{ {
"function": "CMD", "function": "CMD",
"type": "text", "type": "text",
"default_value":"python3 /home/pi/pialert/pialert/plugins/dhcp_servers/script.py", "default_value":"python3 /home/pi/pialert/front/plugins/dhcp_servers/script.py",
"options": [], "options": [],
"localized": ["name", "description"], "localized": ["name", "description"],
"name" : [{ "name" : [{

View File

@@ -0,0 +1,34 @@
192.168.1.1|localdomain|2023-04-12 19:33:01|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-04-12 19:43:28|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-04-12 19:50:52|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-04-12 19:58:31|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-05-05 21:55:02|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-05-05 21:57:48|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-05-05 22:33:13|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-05-07 10:46:39|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-05-14 14:03:51|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-05-14 14:07:54|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-05 18:24:45|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-05 19:50:54|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-05 19:51:49|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-06 18:22:08|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-06 18:22:50|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-06 18:23:33|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-06 18:24:15|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-06 18:24:57|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-06 18:25:40|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-06 18:26:22|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-06 18:27:30|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-06 18:28:10|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-06 18:28:53|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-06 18:29:35|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-08 02:01:13|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-08 06:49:30|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-09 16:40:29|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-10 08:04:41|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-10 08:05:43|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-10 08:20:02|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-10 08:26:21|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-10 08:32:03|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-10 11:03:18|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1
192.168.1.1|localdomain|2023-06-11 16:40:30|null|192.168.1.168|null|192.168.1.1|5m00s,255.255.255.0|192.168.1.1

View File

@@ -241,7 +241,7 @@
{ {
"function": "CMD", "function": "CMD",
"type": "text", "type": "text",
"default_value":"python3 /home/pi/pialert/pialert/plugins/snmp_discovery/script.py routers={s-quote}{routers}{s-quote}", "default_value":"python3 /home/pi/pialert/front/plugins/snmp_discovery/script.py routers={s-quote}{routers}{s-quote}",
"options": [], "options": [],
"localized": ["name", "description"], "localized": ["name", "description"],
"name" : [{ "name" : [{
@@ -265,7 +265,7 @@
}], }],
"description": [{ "description": [{
"language_code":"en_us", "language_code":"en_us",
"string" : "A list of <code>snmpwalk</code> commands to execute against IP addresses of roputers/switches with SNMP turned on. <br/> <br/> Example with the router on the IP <code>192.168.1.1</code>: <br/> <code>snmpwalk -v 2c -c public -OXsq 192.168.1.1 .1.3.6.1.2.1.3.1.1.2</code> <br/><br/> Only IPv4 supported. Authentication is not supported. More info on the plugin <a href='https://github.com/jokob-sk/Pi.Alert/tree/main/pialert/plugins/snmp_discovery' target='_blank'>here</a>." "string" : "A list of <code>snmpwalk</code> commands to execute against IP addresses of roputers/switches with SNMP turned on. <br/> <br/> Example with the router on the IP <code>192.168.1.1</code>: <br/> <code>snmpwalk -v 2c -c public -OXsq 192.168.1.1 .1.3.6.1.2.1.3.1.1.2</code> <br/><br/> Only IPv4 supported. Authentication is not supported. More info on the plugin <a href='https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins/snmp_discovery' target='_blank'>here</a>."
}] }]
}, },
{ {

View File

@@ -0,0 +1,21 @@
DC:A6:32:73:8A:B1|192.168.1.9 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.9 "DC A6 32 73 8A B1 "|null
00:F6:20:82:88:F1|192.168.1.16 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.16 "00 F6 20 82 88 F1 "|null
3C:8D:20:F1:9F:04|192.168.1.17 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.17 "3C 8D 20 F1 9F 04 "|null
B8:27:EB:EC:F6:66|192.168.1.19 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.19 "B8 27 EB EC F6 66 "|null
74:AC:B9:AD:C3:30|192.168.1.21 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.21 "74 AC B9 AD C3 30 "|null
B0:A4:60:1E:BF:A4|192.168.1.45 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.45 "B0 A4 60 1E BF A4 "|null
F4:92:BF:A3:F3:56|192.168.1.57 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.57 "F4 92 BF A3 F3 56 "|null
1C:69:7A:A2:34:7B|192.168.1.58 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.58 "1C 69 7A A2 34 7B "|null
C0:06:C3:09:E4:46|192.168.1.66 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.66 "C0 06 C3 09 E4 46 "|null
00:11:32:EF:A5:6C|192.168.1.82 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.82 "00 11 32 EF A5 6C "|null
3A:9D:69:E0:29:28|192.168.1.92 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.92 "3A 9D 69 E0 29 28 "|null
14:C1:4E:2E:A3:3F|192.168.1.94 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.94 "14 C1 4E 2E A3 3F "|null
48:B0:2D:5C:79:0D|192.168.1.105 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.105 "48 B0 2D 5C 79 0D "|null
C0:06:C3:09:DE:E2|192.168.1.119 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.119 "C0 06 C3 09 DE E2 "|null
2C:F0:5D:9E:73:2C|192.168.1.121 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.121 "2C F0 5D 9E 73 2C "|null
D0:21:F9:B4:CA:0B|192.168.1.138 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.138 "D0 21 F9 B4 CA 0B "|null
D0:21:F9:8C:59:F9|192.168.1.139 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.139 "D0 21 F9 8C 59 F9 "|null
28:87:BA:76:ED:03|192.168.1.163 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.163 "28 87 BA 76 ED 03 "|null
6C:97:6D:7B:4A:43|192.168.1.167 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.167 "6C 97 6D 7B 4A 43 "|null
58:B6:23:70:D6:B4|192.168.1.169 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.169 "58 B6 23 70 D6 B4 "|null
3E:33:4E:7C:E1:C3|192.168.1.170 |2023-06-24 06:54:16|(unknown)|192.168.1.1|null|null|iso.3.6.1.2.1.3.1.1.2.3.1.192.168.1.170 "3E 33 4E 7C E1 C3 "|null

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
# Example call # Example call
# python3 /home/pi/pialert/pialert/plugins/snmp_discovery/script.py routers='snmpwalk -v 2c -c public -OXsq 192.168.1.1 .1.3.6.1.2.1.3.1.1.2' # python3 /home/pi/pialert/front/plugins/snmp_discovery/script.py routers='snmpwalk -v 2c -c public -OXsq 192.168.1.1 .1.3.6.1.2.1.3.1.1.2'
from __future__ import unicode_literals from __future__ import unicode_literals
from time import sleep, time, strftime from time import sleep, time, strftime

View File

@@ -50,8 +50,8 @@
}, },
{ {
"function": "CMD", "function": "CMD",
"type": "readonly", "type": "text",
"default_value": "python3 /home/pi/pialert/pialert/plugins/undiscoverables/script.py devices={devices}", "default_value": "python3 /home/pi/pialert/front/plugins/undiscoverables/script.py devices={devices}",
"options": [], "options": [],
"localized": ["name", "description"], "localized": ["name", "description"],
"name": [ "name": [

View File

@@ -0,0 +1,2 @@
dummy_router|0.0.0.0|2023-06-10 08:31:47|dummy_router|||||
split_test|0.0.0.0|2023-06-10 08:31:47|split_test|||||

View File

@@ -6,7 +6,7 @@ import pathlib
import argparse import argparse
import sys import sys
sys.path.append("/home/pi/pialert/pialert/plugins") sys.path.append("/home/pi/pialert/front/plugins")
from plugin_helper import Plugin_Objects from plugin_helper import Plugin_Objects

View File

@@ -271,7 +271,7 @@
{ {
"function": "CMD", "function": "CMD",
"type": "text", "type": "text",
"default_value":"python3 /home/pi/pialert/pialert/plugins/unifi_import/script.py username={username} password={password} host={host} sites={sites} protocol={protocol} port={port} version={version}", "default_value":"python3 /home/pi/pialert/front/plugins/unifi_import/script.py username={username} password={password} host={host} sites={sites} protocol={protocol} port={port} version={version}",
"options": [], "options": [],
"localized": ["name", "description"], "localized": ["name", "description"],
"name" : [{ "name" : [{

View File

@@ -0,0 +1,469 @@
74:ac:b9:ad:c3:30|192.168.1.21|2023-04-08 13:24:42|Study switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
80:2a:a8:13:3e:4e|192.168.1.22|2023-04-08 13:24:42|Access Point|Ubiquiti Networks Inc.|AP|0|null|null
d0:21:f9:8c:59:f9|192.168.1.139|2023-04-08 13:24:42|Access Point WiFi 6|Ubiquiti Networks Inc.|AP|1|LAN|null
f4:92:bf:a3:f3:56|192.168.1.57|2023-04-08 13:24:42|TV table switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
d0:21:f9:b4:ca:0b|192.168.1.138|2023-04-08 13:24:42|FLEX POE Switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
74:ac:b9:54:09:fa|100.65.124.236|2023-04-08 13:24:42|Security Gateway - USG|Ubiquiti Networks Inc.|null|1|LAN|null
14:c1:4e:2e:a3:3f|192.168.1.94|2023-04-08 13:24:42|SmartSpeaker - Google - Black|Google, Inc.|Other|1|null|null
b0:a4:60:1e:bf:a4|192.168.1.45|2023-04-08 13:24:42|PC - NUC WiFi|Intel Corporate|Other|1|null|null
6c:97:6d:7b:4a:43|192.168.1.167|2023-04-08 13:24:42|MOTO 82G|null|Other|1|null|null
48:b0:2d:5c:79:0d|192.168.1.105|2023-04-08 13:24:42|Console - Nvidia Shield TV|NVIDIA Corporation|Other|1|null|null
2c:f4:32:18:61:43|192.168.1.14|2023-04-08 13:24:42|Light - ceiling-light-1 WiFi |Espressif Inc.|Other|1|null|null
3a:9d:69:e0:29:28|192.168.1.92|2023-04-08 13:24:42|Phone - Pixel 6 |null|Other|1|null|null
2c:f4:32:18:b6:1b|192.168.1.11|2023-04-08 13:24:42|Light - ceiling-light-2 WiFi |Espressif Inc.|Other|1|null|null
dc:a6:32:73:8a:b1|192.168.1.9|2023-04-08 13:24:42|Raspberry Pi 4 LAN|Raspberry Pi Trading Ltd|Other|1|null|null
c0:06:c3:09:de:e2|192.168.1.119|2023-04-08 13:24:42|Power plug - Dishwasher|TP-Link Corporation Limited|Other|1|null|null
ec:fa:bc:a7:49:76|192.168.1.6|2023-04-08 13:24:42|Light - Dining light WiFi |Espressif Inc.|Other|1|null|null
b8:27:eb:ec:f6:66|null|2023-04-08 13:24:42|Paspberry Pi B|Raspberry Pi Foundation|Other|1|null|null
bc:dd:c2:32:f9:ee|192.168.1.15|2023-04-08 13:24:42|Light - Study WiFi |Espressif Inc.|Other|1|null|null
84:5c:f3:da:3b:99|192.168.1.87|2023-04-08 13:24:42|PC - Boris WiFi |Intel Corporate|Other|1|null|null
ac:82:47:ca:0f:e4|192.168.1.86|2023-04-08 13:24:42|PC - Seo WiFi |Intel Corporate|Other|1|null|null
00:11:32:ef:a5:6c|192.168.1.82|2023-04-08 13:24:42|NAS - Synology|Synology Incorporated|Other|1|null|null
2c:f4:32:b3:34:9e|192.168.1.30|2023-04-08 13:24:42|Light - Sideboard WiFi |Espressif Inc.|Other|1|null|null
00:f6:20:82:88:f1|192.168.1.16|2023-04-08 13:24:42|SmartSpeaker - Grey|Google, Inc.|Other|1|null|null
1c:69:7a:a2:34:7b|192.168.1.58|2023-04-08 13:24:42|PC - NUC LAN|EliteGroup Computer Systems Co., LTD|Other|1|null|null
84:cc:a8:4a:56:4c|192.168.1.150|2023-04-08 13:24:42|ESP32 - 1n - Laser Toy|Espressif Inc.|Other|1|null|null
28:87:ba:76:ed:03|192.168.1.163|2023-04-08 13:24:42|KP115|null|Other|1|null|null
94:b5:55:c7:cb:e0|192.168.1.151|2023-04-08 13:24:42|ESP32 - display|null|Other|1|null|null
c0:06:c3:09:e4:46|192.168.1.66|2023-04-08 13:24:42|Power plug - Washroom|TP-Link Corporation Limited|Other|1|null|null
3c:8d:20:f1:9f:04|192.168.1.17|2023-04-08 13:24:42|SmartSpeaker - Google Display |Google, Inc.|Other|1|null|null
74:ac:b9:ad:c3:30|192.168.1.21|2023-04-08 13:30:49|Study switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
80:2a:a8:13:3e:4e|192.168.1.22|2023-04-08 13:30:49|Access Point|Ubiquiti Networks Inc.|AP|0|null|null
d0:21:f9:8c:59:f9|192.168.1.139|2023-04-08 13:30:49|Access Point WiFi 6|Ubiquiti Networks Inc.|AP|1|LAN|null
f4:92:bf:a3:f3:56|192.168.1.57|2023-04-08 13:30:49|TV table switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
d0:21:f9:b4:ca:0b|192.168.1.138|2023-04-08 13:30:49|FLEX POE Switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
74:ac:b9:54:09:fa|100.65.124.236|2023-04-08 13:30:49|Security Gateway - USG|Ubiquiti Networks Inc.|null|1|LAN|null
14:c1:4e:2e:a3:3f|192.168.1.94|2023-04-08 13:30:49|SmartSpeaker - Google - Black|Google, Inc.|Other|1|null|null
b0:a4:60:1e:bf:a4|192.168.1.45|2023-04-08 13:30:49|PC - NUC WiFi|Intel Corporate|Other|1|null|null
6c:97:6d:7b:4a:43|192.168.1.167|2023-04-08 13:30:49|MOTO 82G|null|Other|1|null|null
48:b0:2d:5c:79:0d|192.168.1.105|2023-04-08 13:30:49|Console - Nvidia Shield TV|NVIDIA Corporation|Other|1|null|null
2c:f4:32:18:61:43|192.168.1.14|2023-04-08 13:30:49|Light - ceiling-light-1 WiFi |Espressif Inc.|Other|1|null|null
3a:9d:69:e0:29:28|192.168.1.92|2023-04-08 13:30:49|Phone - Pixel 6 |null|Other|1|null|null
2c:f4:32:18:b6:1b|192.168.1.11|2023-04-08 13:30:49|Light - ceiling-light-2 WiFi |Espressif Inc.|Other|1|null|null
dc:a6:32:73:8a:b1|192.168.1.9|2023-04-08 13:30:49|Raspberry Pi 4 LAN|Raspberry Pi Trading Ltd|Other|1|null|null
c0:06:c3:09:de:e2|192.168.1.119|2023-04-08 13:30:49|Power plug - Dishwasher|TP-Link Corporation Limited|Other|1|null|null
ec:fa:bc:a7:49:76|192.168.1.6|2023-04-08 13:30:49|Light - Dining light WiFi |Espressif Inc.|Other|1|null|null
b8:27:eb:ec:f6:66|null|2023-04-08 13:30:49|Paspberry Pi B|Raspberry Pi Foundation|Other|1|null|null
bc:dd:c2:32:f9:ee|192.168.1.15|2023-04-08 13:30:49|Light - Study WiFi |Espressif Inc.|Other|1|null|null
84:5c:f3:da:3b:99|192.168.1.87|2023-04-08 13:30:49|PC - Boris WiFi |Intel Corporate|Other|1|null|null
ac:82:47:ca:0f:e4|192.168.1.86|2023-04-08 13:30:49|PC - Seo WiFi |Intel Corporate|Other|1|null|null
00:11:32:ef:a5:6c|192.168.1.82|2023-04-08 13:30:49|NAS - Synology|Synology Incorporated|Other|1|null|null
2c:f4:32:b3:34:9e|192.168.1.30|2023-04-08 13:30:49|Light - Sideboard WiFi |Espressif Inc.|Other|1|null|null
00:f6:20:82:88:f1|192.168.1.16|2023-04-08 13:30:49|SmartSpeaker - Grey|Google, Inc.|Other|1|null|null
1c:69:7a:a2:34:7b|192.168.1.58|2023-04-08 13:30:49|PC - NUC LAN|EliteGroup Computer Systems Co., LTD|Other|1|null|null
84:cc:a8:4a:56:4c|192.168.1.150|2023-04-08 13:30:49|ESP32 - 1n - Laser Toy|Espressif Inc.|Other|1|null|null
28:87:ba:76:ed:03|192.168.1.163|2023-04-08 13:30:49|KP115|null|Other|1|null|null
94:b5:55:c7:cb:e0|192.168.1.151|2023-04-08 13:30:49|ESP32 - display|null|Other|1|null|null
c0:06:c3:09:e4:46|192.168.1.66|2023-04-08 13:30:49|Power plug - Washroom|TP-Link Corporation Limited|Other|1|null|null
3c:8d:20:f1:9f:04|192.168.1.17|2023-04-08 13:30:49|SmartSpeaker - Google Display |Google, Inc.|Other|1|null|null
74:ac:b9:ad:c3:30|192.168.1.21|2023-04-08 13:39:07|Study switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
80:2a:a8:13:3e:4e|192.168.1.22|2023-04-08 13:39:07|Access Point|Ubiquiti Networks Inc.|AP|0|null|null
d0:21:f9:8c:59:f9|192.168.1.139|2023-04-08 13:39:07|Access Point WiFi 6|Ubiquiti Networks Inc.|AP|1|LAN|null
f4:92:bf:a3:f3:56|192.168.1.57|2023-04-08 13:39:07|TV table switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
d0:21:f9:b4:ca:0b|192.168.1.138|2023-04-08 13:39:07|FLEX POE Switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
74:ac:b9:54:09:fa|100.65.124.236|2023-04-08 13:39:07|Security Gateway - USG|Ubiquiti Networks Inc.|null|1|LAN|null
14:c1:4e:2e:a3:3f|192.168.1.94|2023-04-08 13:39:07|SmartSpeaker - Google - Black|Google, Inc.|Other|1|null|null
b0:a4:60:1e:bf:a4|192.168.1.45|2023-04-08 13:39:07|PC - NUC WiFi|Intel Corporate|Other|1|null|null
6c:97:6d:7b:4a:43|192.168.1.167|2023-04-08 13:39:07|MOTO 82G|null|Other|1|null|null
48:b0:2d:5c:79:0d|192.168.1.105|2023-04-08 13:39:07|Console - Nvidia Shield TV|NVIDIA Corporation|Other|1|null|null
2c:f4:32:18:61:43|192.168.1.14|2023-04-08 13:39:07|Light - ceiling-light-1 WiFi |Espressif Inc.|Other|1|null|null
3a:9d:69:e0:29:28|192.168.1.92|2023-04-08 13:39:07|Phone - Pixel 6 |null|Other|1|null|null
2c:f4:32:18:b6:1b|192.168.1.11|2023-04-08 13:39:07|Light - ceiling-light-2 WiFi |Espressif Inc.|Other|1|null|null
dc:a6:32:73:8a:b1|192.168.1.9|2023-04-08 13:39:07|Raspberry Pi 4 LAN|Raspberry Pi Trading Ltd|Other|1|null|null
c0:06:c3:09:de:e2|192.168.1.119|2023-04-08 13:39:07|Power plug - Dishwasher|TP-Link Corporation Limited|Other|1|null|null
ec:fa:bc:a7:49:76|192.168.1.6|2023-04-08 13:39:07|Light - Dining light WiFi |Espressif Inc.|Other|1|null|null
b8:27:eb:ec:f6:66|null|2023-04-08 13:39:07|Paspberry Pi B|Raspberry Pi Foundation|Other|1|null|null
bc:dd:c2:32:f9:ee|192.168.1.15|2023-04-08 13:39:07|Light - Study WiFi |Espressif Inc.|Other|1|null|null
84:5c:f3:da:3b:99|192.168.1.87|2023-04-08 13:39:07|PC - Boris WiFi |Intel Corporate|Other|1|null|null
ac:82:47:ca:0f:e4|192.168.1.86|2023-04-08 13:39:07|PC - Seo WiFi |Intel Corporate|Other|1|null|null
00:11:32:ef:a5:6c|192.168.1.82|2023-04-08 13:39:07|NAS - Synology|Synology Incorporated|Other|1|null|null
2c:f4:32:b3:34:9e|192.168.1.30|2023-04-08 13:39:07|Light - Sideboard WiFi |Espressif Inc.|Other|1|null|null
00:f6:20:82:88:f1|192.168.1.16|2023-04-08 13:39:07|SmartSpeaker - Grey|Google, Inc.|Other|1|null|null
1c:69:7a:a2:34:7b|192.168.1.58|2023-04-08 13:39:07|PC - NUC LAN|EliteGroup Computer Systems Co., LTD|Other|1|null|null
84:cc:a8:4a:56:4c|192.168.1.150|2023-04-08 13:39:07|ESP32 - 1n - Laser Toy|Espressif Inc.|Other|1|null|null
28:87:ba:76:ed:03|192.168.1.163|2023-04-08 13:39:07|KP115|null|Other|1|null|null
94:b5:55:c7:cb:e0|192.168.1.151|2023-04-08 13:39:07|ESP32 - display|null|Other|1|null|null
c0:06:c3:09:e4:46|192.168.1.66|2023-04-08 13:39:07|Power plug - Washroom|TP-Link Corporation Limited|Other|1|null|null
4c:c9:5e:93:10:ff|192.168.1.27|2023-04-08 13:39:07|TV - Frame WiFi|Samsung Electronics Co.,Ltd|Other|1|null|null
3c:8d:20:f1:9f:04|192.168.1.17|2023-04-08 13:39:07|SmartSpeaker - Google Display |Google, Inc.|Other|1|null|null
74:ac:b9:ad:c3:30|192.168.1.21|2023-04-10 12:19:28|Study switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
80:2a:a8:13:3e:4e|192.168.1.22|2023-04-10 12:19:28|Access Point|Ubiquiti Networks Inc.|AP|0|null|null
d0:21:f9:8c:59:f9|192.168.1.139|2023-04-10 12:19:28|Access Point WiFi 6|Ubiquiti Networks Inc.|AP|1|LAN|null
f4:92:bf:a3:f3:56|192.168.1.57|2023-04-10 12:19:28|TV table switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
d0:21:f9:b4:ca:0b|192.168.1.138|2023-04-10 12:19:28|FLEX POE Switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
74:ac:b9:54:09:fa|100.65.124.236|2023-04-10 12:19:28|Security Gateway - USG|Ubiquiti Networks Inc.|null|1|LAN|null
14:c1:4e:2e:a3:3f|192.168.1.94|2023-04-10 12:19:28|SmartSpeaker - Google - Black|Google, Inc.|Other|1|null|null
b0:a4:60:1e:bf:a4|192.168.1.45|2023-04-10 12:19:28|PC - NUC WiFi|Intel Corporate|Other|1|null|null
6c:97:6d:7b:4a:43|192.168.1.167|2023-04-10 12:19:28|MOTO 82G|null|Other|1|null|null
48:b0:2d:5c:79:0d|192.168.1.105|2023-04-10 12:19:28|Console - Nvidia Shield TV|NVIDIA Corporation|Other|1|null|null
2c:f4:32:18:61:43|192.168.1.14|2023-04-10 12:19:28|Light - ceiling-light-1 WiFi |Espressif Inc.|Other|1|null|null
3a:9d:69:e0:29:28|192.168.1.92|2023-04-10 12:19:28|Phone - Pixel 6 |null|Other|1|null|null
2c:f4:32:18:b6:1b|192.168.1.11|2023-04-10 12:19:28|Light - ceiling-light-2 WiFi |Espressif Inc.|Other|1|null|null
dc:a6:32:73:8a:b1|192.168.1.9|2023-04-10 12:19:28|Raspberry Pi 4 LAN|Raspberry Pi Trading Ltd|Other|1|null|null
c0:06:c3:09:de:e2|192.168.1.119|2023-04-10 12:19:28|Power plug - Dishwasher|TP-Link Corporation Limited|Other|1|null|null
ec:fa:bc:a7:49:76|192.168.1.6|2023-04-10 12:19:28|Light - Dining light WiFi |Espressif Inc.|Other|1|null|null
b8:27:eb:ec:f6:66|null|2023-04-10 12:19:28|Paspberry Pi B|Raspberry Pi Foundation|Other|1|null|null
bc:dd:c2:32:f9:ee|192.168.1.15|2023-04-10 12:19:28|Light - Study WiFi |Espressif Inc.|Other|1|null|null
84:5c:f3:da:3b:99|192.168.1.87|2023-04-10 12:19:28|PC - Boris WiFi |Intel Corporate|Other|1|null|null
ac:82:47:ca:0f:e4|192.168.1.86|2023-04-10 12:19:28|PC - Seo WiFi |Intel Corporate|Other|1|null|null
00:11:32:ef:a5:6c|192.168.1.82|2023-04-10 12:19:28|NAS - Synology|Synology Incorporated|Other|1|null|null
2c:f4:32:b3:34:9e|192.168.1.30|2023-04-10 12:19:28|Light - Sideboard WiFi |Espressif Inc.|Other|1|null|null
00:f6:20:82:88:f1|192.168.1.16|2023-04-10 12:19:28|SmartSpeaker - Grey|Google, Inc.|Other|1|null|null
1c:69:7a:a2:34:7b|192.168.1.58|2023-04-10 12:19:28|PC - NUC LAN|EliteGroup Computer Systems Co., LTD|Other|1|null|null
28:87:ba:76:ed:03|192.168.1.163|2023-04-10 12:19:28|KP115|null|Other|1|null|null
84:cc:a8:4a:56:4c|192.168.1.150|2023-04-10 12:19:28|ESP32 - 1n - Laser Toy|Espressif Inc.|Other|1|null|null
c0:06:c3:09:e4:46|192.168.1.66|2023-04-10 12:19:28|Power plug - Washroom|TP-Link Corporation Limited|Other|1|null|null
4c:c9:5e:93:10:ff|192.168.1.27|2023-04-10 12:19:28|TV - Frame WiFi|Samsung Electronics Co.,Ltd|Other|1|null|null
3c:8d:20:f1:9f:04|192.168.1.17|2023-04-10 12:19:28|SmartSpeaker - Google Display |Google, Inc.|Other|1|null|null
74:ac:b9:ad:c3:30|192.168.1.21|2023-04-10 12:22:32|Study switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
80:2a:a8:13:3e:4e|192.168.1.22|2023-04-10 12:22:32|Access Point|Ubiquiti Networks Inc.|AP|0|null|null
d0:21:f9:8c:59:f9|192.168.1.139|2023-04-10 12:22:32|Access Point WiFi 6|Ubiquiti Networks Inc.|AP|1|LAN|null
f4:92:bf:a3:f3:56|192.168.1.57|2023-04-10 12:22:32|TV table switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
d0:21:f9:b4:ca:0b|192.168.1.138|2023-04-10 12:22:32|FLEX POE Switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
74:ac:b9:54:09:fa|100.65.124.236|2023-04-10 12:22:32|Security Gateway - USG|Ubiquiti Networks Inc.|null|1|LAN|null
14:c1:4e:2e:a3:3f|192.168.1.94|2023-04-10 12:22:32|SmartSpeaker - Google - Black|Google, Inc.|Other|1|null|null
b0:a4:60:1e:bf:a4|192.168.1.45|2023-04-10 12:22:32|PC - NUC WiFi|Intel Corporate|Other|1|null|null
6c:97:6d:7b:4a:43|192.168.1.167|2023-04-10 12:22:32|MOTO 82G|null|Other|1|null|null
48:b0:2d:5c:79:0d|192.168.1.105|2023-04-10 12:22:32|Console - Nvidia Shield TV|NVIDIA Corporation|Other|1|null|null
2c:f4:32:18:61:43|192.168.1.14|2023-04-10 12:22:32|Light - ceiling-light-1 WiFi |Espressif Inc.|Other|1|null|null
3a:9d:69:e0:29:28|192.168.1.92|2023-04-10 12:22:32|Phone - Pixel 6 |null|Other|1|null|null
2c:f4:32:18:b6:1b|192.168.1.11|2023-04-10 12:22:32|Light - ceiling-light-2 WiFi |Espressif Inc.|Other|1|null|null
dc:a6:32:73:8a:b1|192.168.1.9|2023-04-10 12:22:32|Raspberry Pi 4 LAN|Raspberry Pi Trading Ltd|Other|1|null|null
c0:06:c3:09:de:e2|192.168.1.119|2023-04-10 12:22:32|Power plug - Dishwasher|TP-Link Corporation Limited|Other|1|null|null
ec:fa:bc:a7:49:76|192.168.1.6|2023-04-10 12:22:32|Light - Dining light WiFi |Espressif Inc.|Other|1|null|null
b8:27:eb:ec:f6:66|null|2023-04-10 12:22:32|Paspberry Pi B|Raspberry Pi Foundation|Other|1|null|null
bc:dd:c2:32:f9:ee|192.168.1.15|2023-04-10 12:22:32|Light - Study WiFi |Espressif Inc.|Other|1|null|null
84:5c:f3:da:3b:99|192.168.1.87|2023-04-10 12:22:32|PC - Boris WiFi |Intel Corporate|Other|1|null|null
ac:82:47:ca:0f:e4|192.168.1.86|2023-04-10 12:22:32|PC - Seo WiFi |Intel Corporate|Other|1|null|null
00:11:32:ef:a5:6c|192.168.1.82|2023-04-10 12:22:32|NAS - Synology|Synology Incorporated|Other|1|null|null
2c:f4:32:b3:34:9e|192.168.1.30|2023-04-10 12:22:32|Light - Sideboard WiFi |Espressif Inc.|Other|1|null|null
00:f6:20:82:88:f1|192.168.1.16|2023-04-10 12:22:32|SmartSpeaker - Grey|Google, Inc.|Other|1|null|null
1c:69:7a:a2:34:7b|192.168.1.58|2023-04-10 12:22:32|PC - NUC LAN|EliteGroup Computer Systems Co., LTD|Other|1|null|null
28:87:ba:76:ed:03|192.168.1.163|2023-04-10 12:22:32|KP115|null|Other|1|null|null
84:cc:a8:4a:56:4c|192.168.1.150|2023-04-10 12:22:32|ESP32 - 1n - Laser Toy|Espressif Inc.|Other|1|null|null
c0:06:c3:09:e4:46|192.168.1.66|2023-04-10 12:22:32|Power plug - Washroom|TP-Link Corporation Limited|Other|1|null|null
4c:c9:5e:93:10:ff|192.168.1.27|2023-04-10 12:22:32|TV - Frame WiFi|Samsung Electronics Co.,Ltd|Other|1|null|null
3c:8d:20:f1:9f:04|192.168.1.17|2023-04-10 12:22:32|SmartSpeaker - Google Display |Google, Inc.|Other|1|null|null
74:ac:b9:ad:c3:30|192.168.1.21|2023-04-10 12:25:24|Study switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
80:2a:a8:13:3e:4e|192.168.1.22|2023-04-10 12:25:24|Access Point|Ubiquiti Networks Inc.|AP|0|null|null
d0:21:f9:8c:59:f9|192.168.1.139|2023-04-10 12:25:24|Access Point WiFi 6|Ubiquiti Networks Inc.|AP|1|LAN|null
f4:92:bf:a3:f3:56|192.168.1.57|2023-04-10 12:25:24|TV table switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
d0:21:f9:b4:ca:0b|192.168.1.138|2023-04-10 12:25:24|FLEX POE Switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
74:ac:b9:54:09:fa|100.65.124.236|2023-04-10 12:25:24|Security Gateway - USG|Ubiquiti Networks Inc.|null|1|LAN|null
14:c1:4e:2e:a3:3f|192.168.1.94|2023-04-10 12:25:24|SmartSpeaker - Google - Black|Google, Inc.|Other|1|null|null
b0:a4:60:1e:bf:a4|192.168.1.45|2023-04-10 12:25:24|PC - NUC WiFi|Intel Corporate|Other|1|null|null
6c:97:6d:7b:4a:43|192.168.1.167|2023-04-10 12:25:24|MOTO 82G|null|Other|1|null|null
48:b0:2d:5c:79:0d|192.168.1.105|2023-04-10 12:25:24|Console - Nvidia Shield TV|NVIDIA Corporation|Other|1|null|null
2c:f4:32:18:61:43|192.168.1.14|2023-04-10 12:25:24|Light - ceiling-light-1 WiFi |Espressif Inc.|Other|1|null|null
3a:9d:69:e0:29:28|192.168.1.92|2023-04-10 12:25:24|Phone - Pixel 6 |null|Other|1|null|null
2c:f4:32:18:b6:1b|192.168.1.11|2023-04-10 12:25:24|Light - ceiling-light-2 WiFi |Espressif Inc.|Other|1|null|null
dc:a6:32:73:8a:b1|192.168.1.9|2023-04-10 12:25:24|Raspberry Pi 4 LAN|Raspberry Pi Trading Ltd|Other|1|null|null
c0:06:c3:09:de:e2|192.168.1.119|2023-04-10 12:25:24|Power plug - Dishwasher|TP-Link Corporation Limited|Other|1|null|null
ec:fa:bc:a7:49:76|192.168.1.6|2023-04-10 12:25:24|Light - Dining light WiFi |Espressif Inc.|Other|1|null|null
b8:27:eb:ec:f6:66|null|2023-04-10 12:25:24|Paspberry Pi B|Raspberry Pi Foundation|Other|1|null|null
bc:dd:c2:32:f9:ee|192.168.1.15|2023-04-10 12:25:24|Light - Study WiFi |Espressif Inc.|Other|1|null|null
84:5c:f3:da:3b:99|192.168.1.87|2023-04-10 12:25:24|PC - Boris WiFi |Intel Corporate|Other|1|null|null
ac:82:47:ca:0f:e4|192.168.1.86|2023-04-10 12:25:24|PC - Seo WiFi |Intel Corporate|Other|1|null|null
00:11:32:ef:a5:6c|192.168.1.82|2023-04-10 12:25:24|NAS - Synology|Synology Incorporated|Other|1|null|null
2c:f4:32:b3:34:9e|192.168.1.30|2023-04-10 12:25:24|Light - Sideboard WiFi |Espressif Inc.|Other|1|null|null
00:f6:20:82:88:f1|192.168.1.16|2023-04-10 12:25:24|SmartSpeaker - Grey|Google, Inc.|Other|1|null|null
1c:69:7a:a2:34:7b|192.168.1.58|2023-04-10 12:25:24|PC - NUC LAN|EliteGroup Computer Systems Co., LTD|Other|1|null|null
28:87:ba:76:ed:03|192.168.1.163|2023-04-10 12:25:24|KP115|null|Other|1|null|null
84:cc:a8:4a:56:4c|192.168.1.150|2023-04-10 12:25:24|ESP32 - 1n - Laser Toy|Espressif Inc.|Other|1|null|null
c0:06:c3:09:e4:46|192.168.1.66|2023-04-10 12:25:24|Power plug - Washroom|TP-Link Corporation Limited|Other|1|null|null
4c:c9:5e:93:10:ff|192.168.1.27|2023-04-10 12:25:24|TV - Frame WiFi|Samsung Electronics Co.,Ltd|Other|1|null|null
3c:8d:20:f1:9f:04|192.168.1.17|2023-04-10 12:25:24|SmartSpeaker - Google Display |Google, Inc.|Other|1|null|null
74:ac:b9:ad:c3:30|192.168.1.21|2023-04-11 15:15:06|Study switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
80:2a:a8:13:3e:4e|192.168.1.22|2023-04-11 15:15:06|Access Point|Ubiquiti Networks Inc.|AP|0|null|null
d0:21:f9:8c:59:f9|192.168.1.139|2023-04-11 15:15:06|Access Point WiFi 6|Ubiquiti Networks Inc.|AP|1|LAN|null
f4:92:bf:a3:f3:56|192.168.1.57|2023-04-11 15:15:06|TV table switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
d0:21:f9:b4:ca:0b|192.168.1.138|2023-04-11 15:15:06|FLEX POE Switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
74:ac:b9:54:09:fa|100.65.124.236|2023-04-11 15:15:06|Security Gateway - USG|Ubiquiti Networks Inc.|null|1|LAN|null
14:c1:4e:2e:a3:3f|192.168.1.94|2023-04-11 15:15:06|SmartSpeaker - Google - Black|Google, Inc.|Other|1|null|null
b0:a4:60:1e:bf:a4|192.168.1.45|2023-04-11 15:15:06|PC - NUC WiFi|Intel Corporate|Other|1|null|null
48:b0:2d:5c:79:0d|192.168.1.105|2023-04-11 15:15:06|Console - Nvidia Shield TV|NVIDIA Corporation|Other|1|null|null
2c:f4:32:18:61:43|192.168.1.14|2023-04-11 15:15:06|Light - ceiling-light-1 WiFi |Espressif Inc.|Other|1|null|null
3a:9d:69:e0:29:28|192.168.1.92|2023-04-11 15:15:06|Phone - Pixel 6 |null|Other|1|null|null
dc:a6:32:73:8a:b1|192.168.1.9|2023-04-11 15:15:06|Raspberry Pi 4 LAN|Raspberry Pi Trading Ltd|Other|1|null|null
c0:06:c3:09:de:e2|192.168.1.119|2023-04-11 15:15:06|Power plug - Dishwasher|TP-Link Corporation Limited|Other|1|null|null
ec:fa:bc:a7:49:76|192.168.1.6|2023-04-11 15:15:06|Light - Dining light WiFi |Espressif Inc.|Other|1|null|null
b8:27:eb:ec:f6:66|null|2023-04-11 15:15:06|Paspberry Pi B|Raspberry Pi Foundation|Other|1|null|null
bc:dd:c2:32:f9:ee|192.168.1.15|2023-04-11 15:15:06|Light - Study WiFi |Espressif Inc.|Other|1|null|null
ac:82:47:ca:0f:e4|192.168.1.86|2023-04-11 15:15:06|PC - Seo WiFi |Intel Corporate|Other|1|null|null
00:11:32:ef:a5:6c|192.168.1.82|2023-04-11 15:15:06|NAS - Synology|Synology Incorporated|Other|1|null|null
2c:f4:32:b3:34:9e|192.168.1.30|2023-04-11 15:15:06|Light - Sideboard WiFi |Espressif Inc.|Other|1|null|null
00:f6:20:82:88:f1|192.168.1.16|2023-04-11 15:15:06|SmartSpeaker - Grey|Google, Inc.|Other|1|null|null
1c:69:7a:a2:34:7b|192.168.1.58|2023-04-11 15:15:06|PC - NUC LAN|EliteGroup Computer Systems Co., LTD|Other|1|null|null
84:cc:a8:4a:56:4c|192.168.1.150|2023-04-11 15:15:06|ESP32 - 1n - Laser Toy|Espressif Inc.|Other|1|null|null
28:87:ba:76:ed:03|192.168.1.163|2023-04-11 15:15:06|KP115|null|Other|1|null|null
94:b5:55:c7:cb:e0|192.168.1.151|2023-04-11 15:15:06|ESP32 - display|null|Other|1|null|null
c0:06:c3:09:e4:46|192.168.1.66|2023-04-11 15:15:06|Power plug - Washroom|TP-Link Corporation Limited|Other|1|null|null
3c:8d:20:f1:9f:04|192.168.1.17|2023-04-11 15:15:06|SmartSpeaker - Google Display |Google, Inc.|Other|1|null|null
74:ac:b9:ad:c3:30|192.168.1.21|2023-04-11 15:18:29|Study switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
80:2a:a8:13:3e:4e|192.168.1.22|2023-04-11 15:18:29|Access Point|Ubiquiti Networks Inc.|AP|0|null|null
d0:21:f9:8c:59:f9|192.168.1.139|2023-04-11 15:18:29|Access Point WiFi 6|Ubiquiti Networks Inc.|AP|1|LAN|null
f4:92:bf:a3:f3:56|192.168.1.57|2023-04-11 15:18:29|TV table switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
d0:21:f9:b4:ca:0b|192.168.1.138|2023-04-11 15:18:29|FLEX POE Switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
74:ac:b9:54:09:fa|100.65.124.236|2023-04-11 15:18:29|Security Gateway - USG|Ubiquiti Networks Inc.|null|1|LAN|null
14:c1:4e:2e:a3:3f|192.168.1.94|2023-04-11 15:18:29|SmartSpeaker - Google - Black|Google, Inc.|Other|1|null|null
b0:a4:60:1e:bf:a4|192.168.1.45|2023-04-11 15:18:29|PC - NUC WiFi|Intel Corporate|Other|1|null|null
48:b0:2d:5c:79:0d|192.168.1.105|2023-04-11 15:18:29|Console - Nvidia Shield TV|NVIDIA Corporation|Other|1|null|null
2c:f4:32:18:61:43|192.168.1.14|2023-04-11 15:18:29|Light - ceiling-light-1 WiFi |Espressif Inc.|Other|1|null|null
3a:9d:69:e0:29:28|192.168.1.92|2023-04-11 15:18:29|Phone - Pixel 6 |null|Other|1|null|null
dc:a6:32:73:8a:b1|192.168.1.9|2023-04-11 15:18:29|Raspberry Pi 4 LAN|Raspberry Pi Trading Ltd|Other|1|null|null
c0:06:c3:09:de:e2|192.168.1.119|2023-04-11 15:18:29|Power plug - Dishwasher|TP-Link Corporation Limited|Other|1|null|null
ec:fa:bc:a7:49:76|192.168.1.6|2023-04-11 15:18:29|Light - Dining light WiFi |Espressif Inc.|Other|1|null|null
b8:27:eb:ec:f6:66|null|2023-04-11 15:18:29|Paspberry Pi B|Raspberry Pi Foundation|Other|1|null|null
bc:dd:c2:32:f9:ee|192.168.1.15|2023-04-11 15:18:29|Light - Study WiFi |Espressif Inc.|Other|1|null|null
ac:82:47:ca:0f:e4|192.168.1.86|2023-04-11 15:18:29|PC - Seo WiFi |Intel Corporate|Other|1|null|null
00:11:32:ef:a5:6c|192.168.1.82|2023-04-11 15:18:29|NAS - Synology|Synology Incorporated|Other|1|null|null
2c:f4:32:b3:34:9e|192.168.1.30|2023-04-11 15:18:29|Light - Sideboard WiFi |Espressif Inc.|Other|1|null|null
00:f6:20:82:88:f1|192.168.1.16|2023-04-11 15:18:29|SmartSpeaker - Grey|Google, Inc.|Other|1|null|null
1c:69:7a:a2:34:7b|192.168.1.58|2023-04-11 15:18:29|PC - NUC LAN|EliteGroup Computer Systems Co., LTD|Other|1|null|null
84:cc:a8:4a:56:4c|192.168.1.150|2023-04-11 15:18:29|ESP32 - 1n - Laser Toy|Espressif Inc.|Other|1|null|null
28:87:ba:76:ed:03|192.168.1.163|2023-04-11 15:18:29|KP115|null|Other|1|null|null
94:b5:55:c7:cb:e0|192.168.1.151|2023-04-11 15:18:29|ESP32 - display|null|Other|1|null|null
c0:06:c3:09:e4:46|192.168.1.66|2023-04-11 15:18:29|Power plug - Washroom|TP-Link Corporation Limited|Other|1|null|null
3c:8d:20:f1:9f:04|192.168.1.17|2023-04-11 15:18:29|SmartSpeaker - Google Display |Google, Inc.|Other|1|null|null
74:ac:b9:ad:c3:30|192.168.1.21|2023-04-11 15:19:53|Study switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
80:2a:a8:13:3e:4e|192.168.1.22|2023-04-11 15:19:53|Access Point|Ubiquiti Networks Inc.|AP|0|null|null
d0:21:f9:8c:59:f9|192.168.1.139|2023-04-11 15:19:53|Access Point WiFi 6|Ubiquiti Networks Inc.|AP|1|LAN|null
f4:92:bf:a3:f3:56|192.168.1.57|2023-04-11 15:19:53|TV table switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
d0:21:f9:b4:ca:0b|192.168.1.138|2023-04-11 15:19:53|FLEX POE Switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
74:ac:b9:54:09:fa|100.65.124.236|2023-04-11 15:19:53|Security Gateway - USG|Ubiquiti Networks Inc.|null|1|LAN|null
14:c1:4e:2e:a3:3f|192.168.1.94|2023-04-11 15:19:53|SmartSpeaker - Google - Black|Google, Inc.|Other|1|null|null
b0:a4:60:1e:bf:a4|192.168.1.45|2023-04-11 15:19:53|PC - NUC WiFi|Intel Corporate|Other|1|null|null
48:b0:2d:5c:79:0d|192.168.1.105|2023-04-11 15:19:53|Console - Nvidia Shield TV|NVIDIA Corporation|Other|1|null|null
2c:f4:32:18:61:43|192.168.1.14|2023-04-11 15:19:53|Light - ceiling-light-1 WiFi |Espressif Inc.|Other|1|null|null
3a:9d:69:e0:29:28|192.168.1.92|2023-04-11 15:19:53|Phone - Pixel 6 |null|Other|1|null|null
dc:a6:32:73:8a:b1|192.168.1.9|2023-04-11 15:19:53|Raspberry Pi 4 LAN|Raspberry Pi Trading Ltd|Other|1|null|null
c0:06:c3:09:de:e2|192.168.1.119|2023-04-11 15:19:53|Power plug - Dishwasher|TP-Link Corporation Limited|Other|1|null|null
ec:fa:bc:a7:49:76|192.168.1.6|2023-04-11 15:19:53|Light - Dining light WiFi |Espressif Inc.|Other|1|null|null
b8:27:eb:ec:f6:66|null|2023-04-11 15:19:53|Paspberry Pi B|Raspberry Pi Foundation|Other|1|null|null
bc:dd:c2:32:f9:ee|192.168.1.15|2023-04-11 15:19:53|Light - Study WiFi |Espressif Inc.|Other|1|null|null
ac:82:47:ca:0f:e4|192.168.1.86|2023-04-11 15:19:53|PC - Seo WiFi |Intel Corporate|Other|1|null|null
00:11:32:ef:a5:6c|192.168.1.82|2023-04-11 15:19:53|NAS - Synology|Synology Incorporated|Other|1|null|null
2c:f4:32:b3:34:9e|192.168.1.30|2023-04-11 15:19:53|Light - Sideboard WiFi |Espressif Inc.|Other|1|null|null
00:f6:20:82:88:f1|192.168.1.16|2023-04-11 15:19:53|SmartSpeaker - Grey|Google, Inc.|Other|1|null|null
1c:69:7a:a2:34:7b|192.168.1.58|2023-04-11 15:19:53|PC - NUC LAN|EliteGroup Computer Systems Co., LTD|Other|1|null|null
84:cc:a8:4a:56:4c|192.168.1.150|2023-04-11 15:19:53|ESP32 - 1n - Laser Toy|Espressif Inc.|Other|1|null|null
28:87:ba:76:ed:03|192.168.1.163|2023-04-11 15:19:53|KP115|null|Other|1|null|null
94:b5:55:c7:cb:e0|192.168.1.151|2023-04-11 15:19:53|ESP32 - display|null|Other|1|null|null
c0:06:c3:09:e4:46|192.168.1.66|2023-04-11 15:19:53|Power plug - Washroom|TP-Link Corporation Limited|Other|1|null|null
3c:8d:20:f1:9f:04|192.168.1.17|2023-04-11 15:19:53|SmartSpeaker - Google Display |Google, Inc.|Other|1|null|null
74:ac:b9:ad:c3:30|192.168.1.21|2023-04-11 15:26:18|Study switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
80:2a:a8:13:3e:4e|192.168.1.22|2023-04-11 15:26:18|Access Point|Ubiquiti Networks Inc.|AP|0|null|null
d0:21:f9:8c:59:f9|192.168.1.139|2023-04-11 15:26:18|Access Point WiFi 6|Ubiquiti Networks Inc.|AP|1|LAN|null
f4:92:bf:a3:f3:56|192.168.1.57|2023-04-11 15:26:18|TV table switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
d0:21:f9:b4:ca:0b|192.168.1.138|2023-04-11 15:26:18|FLEX POE Switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
74:ac:b9:54:09:fa|100.65.124.236|2023-04-11 15:26:18|Security Gateway - USG|Ubiquiti Networks Inc.|null|1|LAN|null
14:c1:4e:2e:a3:3f|192.168.1.94|2023-04-11 15:26:18|SmartSpeaker - Google - Black|Google, Inc.|Other|1|null|null
b0:a4:60:1e:bf:a4|192.168.1.45|2023-04-11 15:26:18|PC - NUC WiFi|Intel Corporate|Other|1|null|null
48:b0:2d:5c:79:0d|192.168.1.105|2023-04-11 15:26:18|Console - Nvidia Shield TV|NVIDIA Corporation|Other|1|null|null
2c:f4:32:18:61:43|192.168.1.14|2023-04-11 15:26:18|Light - ceiling-light-1 WiFi |Espressif Inc.|Other|1|null|null
3a:9d:69:e0:29:28|192.168.1.92|2023-04-11 15:26:18|Phone - Pixel 6 |null|Other|1|null|null
dc:a6:32:73:8a:b1|192.168.1.9|2023-04-11 15:26:18|Raspberry Pi 4 LAN|Raspberry Pi Trading Ltd|Other|1|null|null
c0:06:c3:09:de:e2|192.168.1.119|2023-04-11 15:26:18|Power plug - Dishwasher|TP-Link Corporation Limited|Other|1|null|null
ec:fa:bc:a7:49:76|192.168.1.6|2023-04-11 15:26:18|Light - Dining light WiFi |Espressif Inc.|Other|1|null|null
b8:27:eb:ec:f6:66|null|2023-04-11 15:26:18|Paspberry Pi B|Raspberry Pi Foundation|Other|1|null|null
bc:dd:c2:32:f9:ee|192.168.1.15|2023-04-11 15:26:18|Light - Study WiFi |Espressif Inc.|Other|1|null|null
ac:82:47:ca:0f:e4|192.168.1.86|2023-04-11 15:26:18|PC - Seo WiFi |Intel Corporate|Other|1|null|null
00:11:32:ef:a5:6c|192.168.1.82|2023-04-11 15:26:18|NAS - Synology|Synology Incorporated|Other|1|null|null
2c:f4:32:b3:34:9e|192.168.1.30|2023-04-11 15:26:18|Light - Sideboard WiFi |Espressif Inc.|Other|1|null|null
00:f6:20:82:88:f1|192.168.1.16|2023-04-11 15:26:18|SmartSpeaker - Grey|Google, Inc.|Other|1|null|null
1c:69:7a:a2:34:7b|192.168.1.58|2023-04-11 15:26:18|PC - NUC LAN|EliteGroup Computer Systems Co., LTD|Other|1|null|null
84:cc:a8:4a:56:4c|192.168.1.150|2023-04-11 15:26:18|ESP32 - 1n - Laser Toy|Espressif Inc.|Other|1|null|null
28:87:ba:76:ed:03|192.168.1.163|2023-04-11 15:26:18|KP115|null|Other|1|null|null
94:b5:55:c7:cb:e0|192.168.1.151|2023-04-11 15:26:18|ESP32 - display|null|Other|1|null|null
c0:06:c3:09:e4:46|192.168.1.66|2023-04-11 15:26:18|Power plug - Washroom|TP-Link Corporation Limited|Other|1|null|null
3c:8d:20:f1:9f:04|192.168.1.17|2023-04-11 15:26:18|SmartSpeaker - Google Display |Google, Inc.|Other|1|null|null
74:ac:b9:ad:c3:30|192.168.1.21|2023-04-11 15:32:30|Study switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
80:2a:a8:13:3e:4e|192.168.1.22|2023-04-11 15:32:30|Access Point|Ubiquiti Networks Inc.|AP|0|null|null
d0:21:f9:8c:59:f9|192.168.1.139|2023-04-11 15:32:30|Access Point WiFi 6|Ubiquiti Networks Inc.|AP|1|LAN|null
f4:92:bf:a3:f3:56|192.168.1.57|2023-04-11 15:32:30|TV table switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
d0:21:f9:b4:ca:0b|192.168.1.138|2023-04-11 15:32:30|FLEX POE Switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
74:ac:b9:54:09:fa|100.65.124.236|2023-04-11 15:32:30|Security Gateway - USG|Ubiquiti Networks Inc.|null|1|LAN|null
14:c1:4e:2e:a3:3f|192.168.1.94|2023-04-11 15:32:30|SmartSpeaker - Google - Black|Google, Inc.|Other|1|null|null
b0:a4:60:1e:bf:a4|192.168.1.45|2023-04-11 15:32:30|PC - NUC WiFi|Intel Corporate|Other|1|null|null
48:b0:2d:5c:79:0d|192.168.1.105|2023-04-11 15:32:30|Console - Nvidia Shield TV|NVIDIA Corporation|Other|1|null|null
2c:f4:32:18:61:43|192.168.1.14|2023-04-11 15:32:30|Light - ceiling-light-1 WiFi |Espressif Inc.|Other|1|null|null
3a:9d:69:e0:29:28|192.168.1.92|2023-04-11 15:32:30|Phone - Pixel 6 |null|Other|1|null|null
dc:a6:32:73:8a:b1|192.168.1.9|2023-04-11 15:32:30|Raspberry Pi 4 LAN|Raspberry Pi Trading Ltd|Other|1|null|null
c0:06:c3:09:de:e2|192.168.1.119|2023-04-11 15:32:30|Power plug - Dishwasher|TP-Link Corporation Limited|Other|1|null|null
ec:fa:bc:a7:49:76|192.168.1.6|2023-04-11 15:32:30|Light - Dining light WiFi |Espressif Inc.|Other|1|null|null
b8:27:eb:ec:f6:66|null|2023-04-11 15:32:30|Paspberry Pi B|Raspberry Pi Foundation|Other|1|null|null
bc:dd:c2:32:f9:ee|192.168.1.15|2023-04-11 15:32:30|Light - Study WiFi |Espressif Inc.|Other|1|null|null
ac:82:47:ca:0f:e4|192.168.1.86|2023-04-11 15:32:30|PC - Seo WiFi |Intel Corporate|Other|1|null|null
00:11:32:ef:a5:6c|192.168.1.82|2023-04-11 15:32:30|NAS - Synology|Synology Incorporated|Other|1|null|null
2c:f4:32:b3:34:9e|192.168.1.30|2023-04-11 15:32:30|Light - Sideboard WiFi |Espressif Inc.|Other|1|null|null
00:f6:20:82:88:f1|192.168.1.16|2023-04-11 15:32:30|SmartSpeaker - Grey|Google, Inc.|Other|1|null|null
1c:69:7a:a2:34:7b|192.168.1.58|2023-04-11 15:32:30|PC - NUC LAN|EliteGroup Computer Systems Co., LTD|Other|1|null|null
84:cc:a8:4a:56:4c|192.168.1.150|2023-04-11 15:32:30|ESP32 - 1n - Laser Toy|Espressif Inc.|Other|1|null|null
28:87:ba:76:ed:03|192.168.1.163|2023-04-11 15:32:30|KP115|null|Other|1|null|null
94:b5:55:c7:cb:e0|192.168.1.151|2023-04-11 15:32:30|ESP32 - display|null|Other|1|null|null
c0:06:c3:09:e4:46|192.168.1.66|2023-04-11 15:32:30|Power plug - Washroom|TP-Link Corporation Limited|Other|1|null|null
4c:c9:5e:93:10:ff|192.168.1.27|2023-04-11 15:32:30|TV - Frame WiFi|Samsung Electronics Co.,Ltd|Other|1|null|null
3c:8d:20:f1:9f:04|192.168.1.17|2023-04-11 15:32:30|SmartSpeaker - Google Display |Google, Inc.|Other|1|null|null
74:ac:b9:ad:c3:30|192.168.1.21|2023-04-11 15:42:21|Study switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
80:2a:a8:13:3e:4e|192.168.1.22|2023-04-11 15:42:21|Access Point|Ubiquiti Networks Inc.|AP|0|null|null
d0:21:f9:8c:59:f9|192.168.1.139|2023-04-11 15:42:21|Access Point WiFi 6|Ubiquiti Networks Inc.|AP|1|LAN|null
f4:92:bf:a3:f3:56|192.168.1.57|2023-04-11 15:42:21|TV table switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
d0:21:f9:b4:ca:0b|192.168.1.138|2023-04-11 15:42:21|FLEX POE Switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
74:ac:b9:54:09:fa|100.65.124.236|2023-04-11 15:42:21|Security Gateway - USG|Ubiquiti Networks Inc.|null|1|LAN|null
14:c1:4e:2e:a3:3f|192.168.1.94|2023-04-11 15:42:21|SmartSpeaker - Google - Black|Google, Inc.|Other|1|null|null
b0:a4:60:1e:bf:a4|192.168.1.45|2023-04-11 15:42:21|PC - NUC WiFi|Intel Corporate|Other|1|null|null
48:b0:2d:5c:79:0d|192.168.1.105|2023-04-11 15:42:21|Console - Nvidia Shield TV|NVIDIA Corporation|Other|1|null|null
2c:f4:32:18:61:43|192.168.1.14|2023-04-11 15:42:21|Light - ceiling-light-1 WiFi |Espressif Inc.|Other|1|null|null
3a:9d:69:e0:29:28|192.168.1.92|2023-04-11 15:42:21|Phone - Pixel 6 |null|Other|1|null|null
dc:a6:32:73:8a:b1|192.168.1.9|2023-04-11 15:42:21|Raspberry Pi 4 LAN|Raspberry Pi Trading Ltd|Other|1|null|null
c0:06:c3:09:de:e2|192.168.1.119|2023-04-11 15:42:21|Power plug - Dishwasher|TP-Link Corporation Limited|Other|1|null|null
ec:fa:bc:a7:49:76|192.168.1.6|2023-04-11 15:42:21|Light - Dining light WiFi |Espressif Inc.|Other|1|null|null
b8:27:eb:ec:f6:66|null|2023-04-11 15:42:21|Paspberry Pi B|Raspberry Pi Foundation|Other|1|null|null
bc:dd:c2:32:f9:ee|192.168.1.15|2023-04-11 15:42:21|Light - Study WiFi |Espressif Inc.|Other|1|null|null
ac:82:47:ca:0f:e4|192.168.1.86|2023-04-11 15:42:21|PC - Seo WiFi |Intel Corporate|Other|1|null|null
00:11:32:ef:a5:6c|192.168.1.82|2023-04-11 15:42:21|NAS - Synology|Synology Incorporated|Other|1|null|null
2c:f4:32:b3:34:9e|192.168.1.30|2023-04-11 15:42:21|Light - Sideboard WiFi |Espressif Inc.|Other|1|null|null
00:f6:20:82:88:f1|192.168.1.16|2023-04-11 15:42:21|SmartSpeaker - Grey|Google, Inc.|Other|1|null|null
1c:69:7a:a2:34:7b|192.168.1.58|2023-04-11 15:42:21|PC - NUC LAN|EliteGroup Computer Systems Co., LTD|Other|1|null|null
84:cc:a8:4a:56:4c|192.168.1.150|2023-04-11 15:42:21|ESP32 - 1n - Laser Toy|Espressif Inc.|Other|1|null|null
28:87:ba:76:ed:03|192.168.1.163|2023-04-11 15:42:21|KP115|null|Other|1|null|null
94:b5:55:c7:cb:e0|192.168.1.151|2023-04-11 15:42:21|ESP32 - display|null|Other|1|null|null
c0:06:c3:09:e4:46|192.168.1.66|2023-04-11 15:42:21|Power plug - Washroom|TP-Link Corporation Limited|Other|1|null|null
4c:c9:5e:93:10:ff|192.168.1.27|2023-04-11 15:42:21|TV - Frame WiFi|Samsung Electronics Co.,Ltd|Other|1|null|null
3c:8d:20:f1:9f:04|192.168.1.17|2023-04-11 15:42:21|SmartSpeaker - Google Display |Google, Inc.|Other|1|null|null
74:ac:b9:ad:c3:30|192.168.1.21|2023-04-11 15:45:42|Study switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
80:2a:a8:13:3e:4e|192.168.1.22|2023-04-11 15:45:42|Access Point|Ubiquiti Networks Inc.|AP|0|null|null
d0:21:f9:8c:59:f9|192.168.1.139|2023-04-11 15:45:42|Access Point WiFi 6|Ubiquiti Networks Inc.|AP|1|LAN|null
f4:92:bf:a3:f3:56|192.168.1.57|2023-04-11 15:45:42|TV table switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
d0:21:f9:b4:ca:0b|192.168.1.138|2023-04-11 15:45:42|FLEX POE Switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
74:ac:b9:54:09:fa|100.65.124.236|2023-04-11 15:45:42|Security Gateway - USG|Ubiquiti Networks Inc.|null|1|LAN|null
14:c1:4e:2e:a3:3f|192.168.1.94|2023-04-11 15:45:42|SmartSpeaker - Google - Black|Google, Inc.|Other|1|null|null
b0:a4:60:1e:bf:a4|192.168.1.45|2023-04-11 15:45:42|PC - NUC WiFi|Intel Corporate|Other|1|null|null
48:b0:2d:5c:79:0d|192.168.1.105|2023-04-11 15:45:42|Console - Nvidia Shield TV|NVIDIA Corporation|Other|1|null|null
2c:f4:32:18:61:43|192.168.1.14|2023-04-11 15:45:42|Light - ceiling-light-1 WiFi |Espressif Inc.|Other|1|null|null
3a:9d:69:e0:29:28|192.168.1.92|2023-04-11 15:45:42|Phone - Pixel 6 |null|Other|1|null|null
dc:a6:32:73:8a:b1|192.168.1.9|2023-04-11 15:45:42|Raspberry Pi 4 LAN|Raspberry Pi Trading Ltd|Other|1|null|null
c0:06:c3:09:de:e2|192.168.1.119|2023-04-11 15:45:42|Power plug - Dishwasher|TP-Link Corporation Limited|Other|1|null|null
ec:fa:bc:a7:49:76|192.168.1.6|2023-04-11 15:45:42|Light - Dining light WiFi |Espressif Inc.|Other|1|null|null
b8:27:eb:ec:f6:66|null|2023-04-11 15:45:42|Paspberry Pi B|Raspberry Pi Foundation|Other|1|null|null
bc:dd:c2:32:f9:ee|192.168.1.15|2023-04-11 15:45:42|Light - Study WiFi |Espressif Inc.|Other|1|null|null
ac:82:47:ca:0f:e4|192.168.1.86|2023-04-11 15:45:42|PC - Seo WiFi |Intel Corporate|Other|1|null|null
00:11:32:ef:a5:6c|192.168.1.82|2023-04-11 15:45:42|NAS - Synology|Synology Incorporated|Other|1|null|null
2c:f4:32:b3:34:9e|192.168.1.30|2023-04-11 15:45:42|Light - Sideboard WiFi |Espressif Inc.|Other|1|null|null
00:f6:20:82:88:f1|192.168.1.16|2023-04-11 15:45:42|SmartSpeaker - Grey|Google, Inc.|Other|1|null|null
1c:69:7a:a2:34:7b|192.168.1.58|2023-04-11 15:45:42|PC - NUC LAN|EliteGroup Computer Systems Co., LTD|Other|1|null|null
84:cc:a8:4a:56:4c|192.168.1.150|2023-04-11 15:45:42|ESP32 - 1n - Laser Toy|Espressif Inc.|Other|1|null|null
28:87:ba:76:ed:03|192.168.1.163|2023-04-11 15:45:42|KP115|null|Other|1|null|null
94:b5:55:c7:cb:e0|192.168.1.151|2023-04-11 15:45:42|ESP32 - display|null|Other|1|null|null
c0:06:c3:09:e4:46|192.168.1.66|2023-04-11 15:45:42|Power plug - Washroom|TP-Link Corporation Limited|Other|1|null|null
4c:c9:5e:93:10:ff|192.168.1.27|2023-04-11 15:45:42|TV - Frame WiFi|Samsung Electronics Co.,Ltd|Other|1|null|null
3c:8d:20:f1:9f:04|192.168.1.17|2023-04-11 15:45:42|SmartSpeaker - Google Display |Google, Inc.|Other|1|null|null
74:ac:b9:ad:c3:30|192.168.1.21|2023-04-11 16:07:03|Study switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
80:2a:a8:13:3e:4e|192.168.1.22|2023-04-11 16:07:03|Access Point|Ubiquiti Networks Inc.|AP|0|null|null
d0:21:f9:8c:59:f9|192.168.1.139|2023-04-11 16:07:03|Access Point WiFi 6|Ubiquiti Networks Inc.|AP|1|LAN|null
f4:92:bf:a3:f3:56|192.168.1.57|2023-04-11 16:07:03|TV table switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
d0:21:f9:b4:ca:0b|192.168.1.138|2023-04-11 16:07:03|FLEX POE Switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
74:ac:b9:54:09:fa|100.65.124.236|2023-04-11 16:07:03|Security Gateway - USG|Ubiquiti Networks Inc.|null|1|LAN|null
14:c1:4e:2e:a3:3f|192.168.1.94|2023-04-11 16:07:03|SmartSpeaker - Google - Black|Google, Inc.|Other|1|null|null
b0:a4:60:1e:bf:a4|192.168.1.45|2023-04-11 16:07:03|PC - NUC WiFi|Intel Corporate|Other|1|null|null
48:b0:2d:5c:79:0d|192.168.1.105|2023-04-11 16:07:03|Console - Nvidia Shield TV|NVIDIA Corporation|Other|1|null|null
2c:f4:32:18:61:43|192.168.1.14|2023-04-11 16:07:03|Light - ceiling-light-1 WiFi |Espressif Inc.|Other|1|null|null
3a:9d:69:e0:29:28|192.168.1.92|2023-04-11 16:07:03|Phone - Pixel 6 |null|Other|1|null|null
dc:a6:32:73:8a:b1|192.168.1.9|2023-04-11 16:07:03|Raspberry Pi 4 LAN|Raspberry Pi Trading Ltd|Other|1|null|null
c0:06:c3:09:de:e2|192.168.1.119|2023-04-11 16:07:03|Power plug - Dishwasher|TP-Link Corporation Limited|Other|1|null|null
ec:fa:bc:a7:49:76|192.168.1.6|2023-04-11 16:07:03|Light - Dining light WiFi |Espressif Inc.|Other|1|null|null
b8:27:eb:ec:f6:66|null|2023-04-11 16:07:03|Paspberry Pi B|Raspberry Pi Foundation|Other|1|null|null
bc:dd:c2:32:f9:ee|192.168.1.15|2023-04-11 16:07:03|Light - Study WiFi |Espressif Inc.|Other|1|null|null
ac:82:47:ca:0f:e4|192.168.1.86|2023-04-11 16:07:03|PC - Seo WiFi |Intel Corporate|Other|1|null|null
00:11:32:ef:a5:6c|192.168.1.82|2023-04-11 16:07:03|NAS - Synology|Synology Incorporated|Other|1|null|null
2c:f4:32:b3:34:9e|192.168.1.30|2023-04-11 16:07:03|Light - Sideboard WiFi |Espressif Inc.|Other|1|null|null
00:f6:20:82:88:f1|192.168.1.16|2023-04-11 16:07:03|SmartSpeaker - Grey|Google, Inc.|Other|1|null|null
1c:69:7a:a2:34:7b|192.168.1.58|2023-04-11 16:07:03|PC - NUC LAN|EliteGroup Computer Systems Co., LTD|Other|1|null|null
84:cc:a8:4a:56:4c|192.168.1.150|2023-04-11 16:07:03|ESP32 - 1n - Laser Toy|Espressif Inc.|Other|1|null|null
28:87:ba:76:ed:03|192.168.1.163|2023-04-11 16:07:03|KP115|null|Other|1|null|null
94:b5:55:c7:cb:e0|192.168.1.151|2023-04-11 16:07:03|ESP32 - display|null|Other|1|null|null
c0:06:c3:09:e4:46|192.168.1.66|2023-04-11 16:07:03|Power plug - Washroom|TP-Link Corporation Limited|Other|1|null|null
4c:c9:5e:93:10:ff|192.168.1.27|2023-04-11 16:07:03|TV - Frame WiFi|Samsung Electronics Co.,Ltd|Other|1|null|null
3c:8d:20:f1:9f:04|192.168.1.17|2023-04-11 16:07:03|SmartSpeaker - Google Display |Google, Inc.|Other|1|null|null
74:ac:b9:ad:c3:30|192.168.1.21|2023-04-11 16:08:54|Study switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
80:2a:a8:13:3e:4e|192.168.1.22|2023-04-11 16:08:54|Access Point|Ubiquiti Networks Inc.|AP|0|null|null
d0:21:f9:8c:59:f9|192.168.1.139|2023-04-11 16:08:54|Access Point WiFi 6|Ubiquiti Networks Inc.|AP|1|LAN|null
f4:92:bf:a3:f3:56|192.168.1.57|2023-04-11 16:08:54|TV table switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
d0:21:f9:b4:ca:0b|192.168.1.138|2023-04-11 16:08:54|FLEX POE Switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
74:ac:b9:54:09:fa|100.65.124.236|2023-04-11 16:08:54|Security Gateway - USG|Ubiquiti Networks Inc.|null|1|LAN|null
14:c1:4e:2e:a3:3f|192.168.1.94|2023-04-11 16:08:54|SmartSpeaker - Google - Black|Google, Inc.|Other|1|null|null
b0:a4:60:1e:bf:a4|192.168.1.45|2023-04-11 16:08:54|PC - NUC WiFi|Intel Corporate|Other|1|null|null
48:b0:2d:5c:79:0d|192.168.1.105|2023-04-11 16:08:54|Console - Nvidia Shield TV|NVIDIA Corporation|Other|1|null|null
2c:f4:32:18:61:43|192.168.1.14|2023-04-11 16:08:54|Light - ceiling-light-1 WiFi |Espressif Inc.|Other|1|null|null
3a:9d:69:e0:29:28|192.168.1.92|2023-04-11 16:08:54|Phone - Pixel 6 |null|Other|1|null|null
dc:a6:32:73:8a:b1|192.168.1.9|2023-04-11 16:08:54|Raspberry Pi 4 LAN|Raspberry Pi Trading Ltd|Other|1|null|null
c0:06:c3:09:de:e2|192.168.1.119|2023-04-11 16:08:54|Power plug - Dishwasher|TP-Link Corporation Limited|Other|1|null|null
ec:fa:bc:a7:49:76|192.168.1.6|2023-04-11 16:08:54|Light - Dining light WiFi |Espressif Inc.|Other|1|null|null
b8:27:eb:ec:f6:66|null|2023-04-11 16:08:54|Paspberry Pi B|Raspberry Pi Foundation|Other|1|null|null
bc:dd:c2:32:f9:ee|192.168.1.15|2023-04-11 16:08:54|Light - Study WiFi |Espressif Inc.|Other|1|null|null
ac:82:47:ca:0f:e4|192.168.1.86|2023-04-11 16:08:54|PC - Seo WiFi |Intel Corporate|Other|1|null|null
00:11:32:ef:a5:6c|192.168.1.82|2023-04-11 16:08:54|NAS - Synology|Synology Incorporated|Other|1|null|null
2c:f4:32:b3:34:9e|192.168.1.30|2023-04-11 16:08:54|Light - Sideboard WiFi |Espressif Inc.|Other|1|null|null
00:f6:20:82:88:f1|192.168.1.16|2023-04-11 16:08:54|SmartSpeaker - Grey|Google, Inc.|Other|1|null|null
1c:69:7a:a2:34:7b|192.168.1.58|2023-04-11 16:08:54|PC - NUC LAN|EliteGroup Computer Systems Co., LTD|Other|1|null|null
84:cc:a8:4a:56:4c|192.168.1.150|2023-04-11 16:08:54|ESP32 - 1n - Laser Toy|Espressif Inc.|Other|1|null|null
28:87:ba:76:ed:03|192.168.1.163|2023-04-11 16:08:54|KP115|null|Other|1|null|null
94:b5:55:c7:cb:e0|192.168.1.151|2023-04-11 16:08:54|ESP32 - display|null|Other|1|null|null
c0:06:c3:09:e4:46|192.168.1.66|2023-04-11 16:08:54|Power plug - Washroom|TP-Link Corporation Limited|Other|1|null|null
3c:8d:20:f1:9f:04|192.168.1.17|2023-04-11 16:08:54|SmartSpeaker - Google Display |Google, Inc.|Other|1|null|null
74:ac:b9:ad:c3:30|192.168.1.21|2023-04-12 19:58:32|Study switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
80:2a:a8:13:3e:4e|192.168.1.22|2023-04-12 19:58:32|Access Point|Ubiquiti Networks Inc.|AP|0|null|null
d0:21:f9:8c:59:f9|192.168.1.139|2023-04-12 19:58:32|Access Point WiFi 6|Ubiquiti Networks Inc.|AP|1|LAN|null
f4:92:bf:a3:f3:56|192.168.1.57|2023-04-12 19:58:32|TV table switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
d0:21:f9:b4:ca:0b|192.168.1.138|2023-04-12 19:58:32|FLEX POE Switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
74:ac:b9:54:09:fa|100.65.124.236|2023-04-12 19:58:32|Security Gateway - USG|Ubiquiti Networks Inc.|null|1|LAN|null
14:c1:4e:2e:a3:3f|192.168.1.94|2023-04-12 19:58:32|SmartSpeaker - Google - Black|Google, Inc.|Other|1|null|null
b0:a4:60:1e:bf:a4|192.168.1.45|2023-04-12 19:58:32|PC - NUC WiFi|Intel Corporate|Other|1|null|null
6c:97:6d:7b:4a:43|192.168.1.167|2023-04-12 19:58:32|MOTO 82G|null|Other|1|null|null
48:b0:2d:5c:79:0d|192.168.1.105|2023-04-12 19:58:32|Console - Nvidia Shield TV|NVIDIA Corporation|Other|1|null|null
2c:f4:32:18:61:43|192.168.1.14|2023-04-12 19:58:32|Light - ceiling-light-1 WiFi |Espressif Inc.|Other|1|null|null
3a:9d:69:e0:29:28|192.168.1.92|2023-04-12 19:58:32|Phone - Pixel 6 |null|Other|1|null|null
dc:a6:32:73:8a:b1|192.168.1.9|2023-04-12 19:58:32|Raspberry Pi 4 LAN|Raspberry Pi Trading Ltd|Other|1|null|null
c0:06:c3:09:de:e2|192.168.1.119|2023-04-12 19:58:32|Power plug - Dishwasher|TP-Link Corporation Limited|Other|1|null|null
ec:fa:bc:a7:49:76|192.168.1.6|2023-04-12 19:58:32|Light - Dining light WiFi |Espressif Inc.|Other|1|null|null
b8:27:eb:ec:f6:66|null|2023-04-12 19:58:32|Paspberry Pi B|Raspberry Pi Foundation|Other|1|null|null
bc:dd:c2:32:f9:ee|192.168.1.15|2023-04-12 19:58:32|Light - Study WiFi |Espressif Inc.|Other|1|null|null
84:5c:f3:da:3b:99|192.168.1.87|2023-04-12 19:58:32|PC - Boris WiFi |Intel Corporate|Other|1|null|null
ac:82:47:ca:0f:e4|192.168.1.86|2023-04-12 19:58:32|PC - Seo WiFi |Intel Corporate|Other|1|null|null
00:11:32:ef:a5:6c|192.168.1.82|2023-04-12 19:58:32|NAS - Synology|Synology Incorporated|Other|1|null|null
2c:f4:32:b3:34:9e|192.168.1.30|2023-04-12 19:58:32|Light - Sideboard WiFi |Espressif Inc.|Other|1|null|null
00:f6:20:82:88:f1|192.168.1.16|2023-04-12 19:58:32|SmartSpeaker - Grey|Google, Inc.|Other|1|null|null
1c:69:7a:a2:34:7b|192.168.1.58|2023-04-12 19:58:32|PC - NUC LAN|EliteGroup Computer Systems Co., LTD|Other|1|null|null
84:cc:a8:4a:56:4c|192.168.1.150|2023-04-12 19:58:32|ESP32 - 1n - Laser Toy|Espressif Inc.|Other|1|null|null
28:87:ba:76:ed:03|192.168.1.163|2023-04-12 19:58:32|KP115|null|Other|1|null|null
94:b5:55:c7:cb:e0|192.168.1.151|2023-04-12 19:58:32|ESP32 - display|null|Other|1|null|null
c0:06:c3:09:e4:46|192.168.1.66|2023-04-12 19:58:32|Power plug - Washroom|TP-Link Corporation Limited|Other|1|null|null
4c:c9:5e:93:10:ff|192.168.1.27|2023-04-12 19:58:32|TV - Frame WiFi|Samsung Electronics Co.,Ltd|Other|1|null|null
3c:8d:20:f1:9f:04|192.168.1.17|2023-04-12 19:58:32|SmartSpeaker - Google Display |Google, Inc.|Other|1|null|null
74:ac:b9:ad:c3:30|192.168.1.21|2023-06-10 08:32:06|Study switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
80:2a:a8:13:3e:4e|192.168.1.22|2023-06-10 08:32:06|Access Point|Ubiquiti Networks Inc.|AP|0|null|null
d0:21:f9:8c:59:f9|192.168.1.139|2023-06-10 08:32:06|Access Point WiFi 6|Ubiquiti Networks Inc.|AP|1|LAN|null
f4:92:bf:a3:f3:56|192.168.1.57|2023-06-10 08:32:06|TV table switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
d0:21:f9:b4:ca:0b|192.168.1.138|2023-06-10 08:32:06|FLEX POE Switch|Ubiquiti Networks Inc.|Switch|1|LAN|null
74:ac:b9:54:09:fa|100.65.124.236|2023-06-10 08:32:06|Security Gateway - USG|Ubiquiti Networks Inc.|null|1|LAN|null
2c:f0:5d:9e:73:2c|null|2023-06-10 08:32:06|PC - Boris LAN|Micro-Star INTL CO., LTD.|Other|1|null|null
14:c1:4e:2e:a3:3f|192.168.1.94|2023-06-10 08:32:06|SmartSpeaker - Google - Black|Google, Inc.|Other|1|null|null
48:b0:2d:5c:79:0d|192.168.1.105|2023-06-10 08:32:06|Console - Nvidia Shield TV|NVIDIA Corporation|Other|1|null|null
b0:a4:60:1e:bf:a4|192.168.1.45|2023-06-10 08:32:06|PC - NUC WiFi|Intel Corporate|Other|1|null|null
2c:f4:32:18:61:43|192.168.1.14|2023-06-10 08:32:06|Light - ceiling-light-1 WiFi |Espressif Inc.|Other|1|null|null
3a:9d:69:e0:29:28|192.168.1.92|2023-06-10 08:32:06|Phone - Pixel 6 |null|Other|1|null|null
1a:e7:41:7c:be:c8|192.168.1.131|2023-06-10 08:32:06|Pixel-3a|null|Other|1|null|null
dc:a6:32:73:8a:b1|192.168.1.9|2023-06-10 08:32:06|Raspberry Pi 4 LAN|Raspberry Pi Trading Ltd|Other|1|null|null
c0:06:c3:09:de:e2|192.168.1.119|2023-06-10 08:32:06|Power plug - Dishwasher|TP-Link Corporation Limited|Other|1|null|null
ec:fa:bc:a7:49:76|192.168.1.6|2023-06-10 08:32:06|Light - Dining light WiFi |Espressif Inc.|Other|1|null|null
b8:27:eb:ec:f6:66|null|2023-06-10 08:32:06|Paspberry Pi B|Raspberry Pi Foundation|Other|1|null|null
bc:dd:c2:32:f9:ee|192.168.1.15|2023-06-10 08:32:06|Light - Study WiFi |Espressif Inc.|Other|1|null|null
00:11:32:ef:a5:6c|192.168.1.82|2023-06-10 08:32:06|NAS - Synology|Synology Incorporated|Other|1|null|null
2c:f4:32:b3:34:9e|192.168.1.30|2023-06-10 08:32:06|Light - Sideboard WiFi |Espressif Inc.|Other|1|null|null
00:f6:20:82:88:f1|192.168.1.16|2023-06-10 08:32:06|SmartSpeaker - Grey|Google, Inc.|Other|1|null|null
1c:69:7a:a2:34:7b|192.168.1.58|2023-06-10 08:32:06|PC - NUC LAN|EliteGroup Computer Systems Co., LTD|Other|1|null|null
84:cc:a8:4a:56:4c|192.168.1.150|2023-06-10 08:32:06|ESP32 - 1n - Laser Toy|Espressif Inc.|Other|1|null|null
28:87:ba:76:ed:03|192.168.1.163|2023-06-10 08:32:06|KP115|null|Other|1|null|null
94:b5:55:c7:cb:e0|192.168.1.151|2023-06-10 08:32:06|ESP32 - display|null|Other|1|null|null
c0:06:c3:09:e4:46|192.168.1.66|2023-06-10 08:32:06|Power plug - Washroom|TP-Link Corporation Limited|Other|1|null|null
3c:8d:20:f1:9f:04|192.168.1.17|2023-06-10 08:32:06|SmartSpeaker - Google Display |Google, Inc.|Other|1|null|null

View File

@@ -2,7 +2,7 @@
# Inspired by https://github.com/stevehoek/Pi.Alert # Inspired by https://github.com/stevehoek/Pi.Alert
# Example call # Example call
# python3 /home/pi/pialert/pialert/plugins/unifi_import/script.py username=pialert password=passw0rd host=192.168.1.1 site=default protocol=https:// port=8443 # python3 /home/pi/pialert/front/plugins/unifi_import/script.py username=pialert password=passw0rd host=192.168.1.1 site=default protocol=https:// port=8443
from __future__ import unicode_literals from __future__ import unicode_literals
from time import sleep, time, strftime from time import sleep, time, strftime

View File

@@ -256,7 +256,7 @@
{ {
"function": "CMD", "function": "CMD",
"type": "text", "type": "text",
"default_value":"python3 /home/pi/pialert/pialert/plugins/website_monitor/script.py urls={urls}", "default_value":"python3 /home/pi/pialert/front/plugins/website_monitor/script.py urls={urls}",
"options": [], "options": [],
"localized": ["name", "description"], "localized": ["name", "description"],
"name" : [{ "name" : [{

View File

@@ -0,0 +1,2 @@
https://google.com|null|2023-06-11 16:40:26|200|0.340850|null|null|null|null
https://duck.com|null|2023-06-11 16:40:26|200|0.051173|null|null|null|null

View File

View File

@@ -0,0 +1,13 @@
Pi.Alert [Prototype]:
---------------------------------------------------------
Current User: root
Monitor Web-Services
Timestamp: 2023-06-11 16:40:25
Start Services Monitoring
| Timestamp | URL | StatusCode | ResponseTime |
-----------------------------------------------
2023-06-11 16:40:26 | https://google.com | 200 | 0.340850
2023-06-11 16:40:26 | https://duck.com | 200 | 0.051173

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python
# Based on the work of https://github.com/leiweibau/Pi.Alert # Based on the work of https://github.com/leiweibau/Pi.Alert
# python3 /home/pi/pialert/pialert/plugins/website_monitor/script.py urls=http://google.com,http://bing.com # python3 /home/pi/pialert/front/plugins/website_monitor/script.py urls=http://google.com,http://bing.com
from __future__ import unicode_literals from __future__ import unicode_literals
from time import sleep, time, strftime from time import sleep, time, strftime
import requests import requests

View File

@@ -396,7 +396,7 @@ function generateTabs()
${localize(pluginObj, 'description')} ${localize(pluginObj, 'description')}
<span> <span>
<a href="https://github.com/jokob-sk/Pi.Alert/tree/main/pialert/plugins/${pluginObj.code_name}" target="_blank"><?= lang('Gen_ReadDocs');?></a> <a href="https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins/${pluginObj.code_name}" target="_blank"><?= lang('Gen_ReadDocs');?></a>
</span> </span>
</div> </div>

View File

@@ -10,7 +10,7 @@ confPath = "/config/pialert.conf"
dbPath = '/db/pialert.db' dbPath = '/db/pialert.db'
pluginsPath = pialertPath + '/pialert/plugins' pluginsPath = pialertPath + '/front/plugins'
logPath = pialertPath + '/front/log' logPath = pialertPath + '/front/log'
apiPath = pialertPath + '/front/api/' apiPath = pialertPath + '/front/api/'
fullConfPath = pialertPath + confPath fullConfPath = pialertPath + confPath

View File

@@ -1,529 +0,0 @@
## 📚 Docs for individual plugins
### Script based plugins
- [website_monitor (WEBMON)](https://github.com/jokob-sk/Pi.Alert/blob/main/pialert/plugins/website_monitor/)
- [dhcp_servers (DHCPSRVS)](https://github.com/jokob-sk/Pi.Alert/blob/main/pialert/plugins/dhcp_servers/)
- [dhcp_leases (DHCPLSS)](https://github.com/jokob-sk/Pi.Alert/blob/main/pialert/plugins/dhcp_leases/)
- [unifi_import (UNFIMP)](https://github.com/jokob-sk/Pi.Alert/blob/main/pialert/plugins/unifi_import/)
- [snmp_discovery (SNMPDSC)](https://github.com/jokob-sk/Pi.Alert/blob/main/pialert/plugins/snmp_discovery/)
- [undiscoverables (UNDIS)](https://github.com/jokob-sk/Pi.Alert/blob/main/pialert/plugins/undiscoverables/)
### SQL query based plugins
- [nmap_services (NMAPSERV)](https://github.com/jokob-sk/Pi.Alert/blob/main/pialert/plugins/nmap_services/)
### template based plugins
- [newdev_template (NEWDEV)](https://github.com/jokob-sk/Pi.Alert/blob/main/pialert/plugins/newdev_template/)
## 🌟 Create a custom plugin: Overview
| ![Screen 1][screen1] | ![Screen 2][screen2] |
|----------------------|----------------------|
| ![Screen 3][screen3] | ![Screen 4][screen4] |
PiAlert comes with a plugin system to feed events from third-party scripts into the UI and then send notifications, if desired. The highlighted core functionality this plugin system supports, is:
* dynamic creation of a simple UI to interact with the discovered objects,
* filtering of displayed values in the Devices UI
* surface settings of plugins in the UI,
* different column types for reported values to e.g. link back to a device
* import objects into existing PiAlert database tables
> (Currently, update/overwriting of existing objects is not supported.)
Example use cases for plugins could be:
* Monitor a web service and alert me if it's down
* Import devices from dhcp.leases files instead/complementary to using PiHole or arp-scans
* Creating ad-hoc UI tables from existing data in the PiAlert database, e.g. to show all open ports on devices, to list devices that disconnected in the last hour, etc.
* Using other device discovery methods on the network and importing the data as new devices
* Creating a script to create FAKE devices based on user input via custom settings
* ...at this point the limitation is mostly the creativity than the capability (there might be edge cases and a need to support more form controls for user input off custom settings, but you probably get the idea)
If you wish to develop a plugin, please check the existing plugin structure. Once the settings are saved by the user they need to be removed from the `pialert.conf` file manually if you want to re-initialize them from the `config.json` of the plugin.
Again, please read the below carefully if you'd like to contribute with a plugin yourself. This documentation file might be outdated, so double-check the sample plugins as well.
## ⚠ Disclaimer
Follow the below very carefully and check example plugin(s) if you'd like to write one yourself. Plugin UI is not my priority right now, happy to approve PRs if you are interested in extending/improving the UI experience. Example improvements for the taking:
* Making the tables sortable/filterable
* Using the same approach to display table data as in the Devices section (solves above)
* Adding form controls supported to display the data (Currently supported ones are listed in the section "UI settings in database_column_definitions" below)
* ...
## ❗ Known issues:
These issues will be hopefully fixed with time, so please don't report them. Instead, if you know how, feel free to investigate and submit a PR to fix the below. Keep the PRs small as it's easier to approve them:
* Existing plugin objects sometimes not interpreted correctly and a new object is created instead, resulting in duplicate entries.
* Occasional (experienced twice) hanging of processing plugin script file.
UI displays outdated values until the API endpoints get refreshed.
## Plugin file structure overview
> Folder name must be the same as the code name value in: `"code_name": "<value>"`
> Unique prefix needs to be unique compared to the other settings prefixes, e.g.: the prefix `APPRISE` is already in use.
| File | Required (plugin type) | Description |
|----------------------|----------------------|----------------------|
| `config.json` | yes | Contains the plugin configuration (manifest) including the settings available to the user. |
| `script.py` | yes (script) | The Python script itself |
| `last_result.log` | yes (script) | The file used to interface between PiAlert and the plugin (script). |
| `script.log` | no | Logging output (recommended) |
| `README.md` | no | Any setup considerations or overview (recommended) |
More on specifics below.
### Column order and values
| Order | Represented Column | Required | Description |
|----------------------|----------------------|----------------------|----------------------|
| 0 | `Object_PrimaryID` | yes | The primary ID used to group Events under. |
| 1 | `Object_SecondaryID` | no | Optional secondary ID to create a relationship beween other entities, such as a MAC address |
| 2 | `DateTime` | yes | When the event occured in the format `2023-01-02 15:56:30` |
| 3 | `Watched_Value1` | yes | A value that is watched and users can receive notifications if it changed compared to the previously saved entry. For example IP address |
| 4 | `Watched_Value2` | no | As above |
| 5 | `Watched_Value3` | no | As above |
| 6 | `Watched_Value4` | no | As above |
| 7 | `Extra` | no | Any other data you want to pass and display in PiAlert and the notifications |
| 8 | `ForeignKey` | no | A foreign key that can be used to link to the parent object (usually a MAC address) |
# config.json structure
## Supported data sources
Currently, only 3 data sources are supported (valid `data_source` value).
- Script (`python-script`)
- SQL query on the PiAlert database (`pialert-db-query`)
- Template (`template`)
> 🔎Example
>```json
>"data_source": "pialert-db-query"
>```
Any of the above data sources have to return a "table" of the exact structure as outlined above.
### "data_source": "python-script"
If the `data_source` is set to `python-script` the `CMD` setting (that you specify in the `settings` array section in the `config.json`) needs to contain an executable Linux command, that generates a `last_result.log` file. This file needs to be stored in the same folder as the plugin.
The content of the `last_result.log` file needs to contain the columns as defined in the "Column order and values" section above. The order of columns can't be changed. After every scan it should contain only the results from the latest scan/execution.
- The format of the `last_result.log` is a `csv`-like file with the pipe `|` as a separator.
- 9 (nine) values need to be supplied, so every line needs to contain 8 pipe separators. Empty values are represented by `null`.
- Don't render "headers" for these "columns".
- Every scan result / event entry needs to be on a new line.
- You can find which "columns" need to be present, and if the value is required or optional, in the "Column order and values" section.
- The order of these "columns" can't be changed.
### 👍 Python script.py tips
The [Undicoverables plugins `script.py` file](https://github.com/jokob-sk/Pi.Alert/blob/main/pialert/plugins/undiscoverables/script.py) is a good and simple example to start with if you are considering creating a custom plugin. It uses the [`plugin_helper.py` library](https://github.com/jokob-sk/Pi.Alert/blob/main/pialert/plugins/plugin_helper.py) that significantly simplifies the creation of your custom script.
#### 🔎 last_result.log examples
Valid CSV:
```csv
https://www.google.com|null|2023-01-02 15:56:30|200|0.7898|null|null|null|null
https://www.duckduckgo.com|192.168.0.1|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine|ff:ee:ff:11:ff:11
```
Invalid CSV with different errors on each line:
```csv
https://www.google.com|null|2023-01-02 15:56:30|200|0.7898||null|null|null
https://www.duckduckgo.com|null|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine|
|https://www.duckduckgo.com|null|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine|null
null|192.168.1.1|2023-01-02 15:56:30|200|0.9898|null|null|Best search engine
https://www.duckduckgo.com|192.168.1.1|2023-01-02 15:56:30|null|0.9898|null|null|Best search engine
https://www.google.com|null|2023-01-02 15:56:30|200|0.7898|||
https://www.google.com|null|2023-01-02 15:56:30|200|0.7898|
```
### "data_source": "pialert-db-query"
If the `data_source` is set to `pialert-db-query` the `CMD` setting needs to contain a SQL query rendering the columns as defined in the "Column order and values" section above. The order of columns is important.
This SQL query is executed on the `pialert.db` SQLite database file.
> 🔎Example
>
> SQL query example:
>
> ```SQL
> SELECT dv.dev_Name as Object_PrimaryID,
> cast(dv.dev_LastIP as VARCHAR(100)) || ':' || cast( SUBSTR(ns.Port ,0, INSTR(ns.Port , '/')) as VARCHAR(100)) as Object_SecondaryID,
> datetime() as DateTime,
> ns.Service as Watched_Value1,
> ns.State as Watched_Value2,
> 'null' as Watched_Value3,
> 'null' as Watched_Value4,
> ns.Extra as Extra,
> dv.dev_MAC as ForeignKey
> FROM
> (SELECT * FROM Nmap_Scan) ns
> LEFT JOIN
> (SELECT dev_Name, dev_MAC, dev_LastIP FROM Devices) dv
> ON ns.MAC = dv.dev_MAC
> ```
>
> Required `CMD` setting example with above query (you can set `"type": "label"` if you want it to make uneditable in the UI):
>
> ```json
> {
> "function": "CMD",
> "type": "text",
> "default_value":"SELECT dv.dev_Name as Object_PrimaryID, cast(dv.dev_LastIP as VARCHAR(100)) || ':' || cast( SUBSTR(ns.Port ,0, INSTR(ns.Port , '/')) as VARCHAR(100)) as Object_SecondaryID, datetime() as DateTime, ns.Service as Watched_Value1, ns.State as Watched_Value2, 'null' as Watched_Value3, 'null' as Watched_Value4, ns.Extra as Extra FROM (SELECT * FROM Nmap_Scan) ns LEFT JOIN (SELECT dev_Name, dev_MAC, dev_LastIP FROM Devices) dv ON ns.MAC = dv.dev_MAC",
> "options": [],
> "localized": ["name", "description"],
> "name" : [{
> "language_code":"en_us",
> "string" : "SQL to run"
> }],
> "description": [{
> "language_code":"en_us",
> "string" : "This SQL query is used to populate the coresponding UI tables under the Plugins section."
> }]
> }
> ```
### "data_source": "template"
Used to initialize internal settings. Check the `newdev_template` plugin for details.
## Filters
Plugin entries can be filtered based on values entered into filter fields. The `txtMacFilter` textbox/field contains the Mac address of the currently viewed device or simply a Mac address that's available in the `mac` query string.
| Property | Required | Description |
|----------------------|----------------------|----------------------|
| `compare_column` | yes | Plugin column name that's value is used for comparison (**Left** side of the equation) |
| `compare_operator` | yes | JavaScript comparison operator |
| `compare_field_id` | yes | The `id` of a input text field containing a value is used for comparison (**Right** side of the equation)|
| `compare_js_template` | yes | JavaScript code used to convert left and right side of the equation. `{value}` is replaced with input values. |
| `compare_use_quotes` | yes | If `true` then the end result of the `compare_js_template` i swrapped in `"` quotes. Use to compare strings. |
> 🔎Example:
>
> ```json
> "data_filters": [
> {
> "compare_column" : "Object_PrimaryID",
> "compare_operator" : "==",
> "compare_field_id": "txtMacFilter",
> "compare_js_template": "'{value}'.toString()",
> "compare_use_quotes": true
> }
> ],
> ```
1. On the `pluginsCore.php` page is an input field with the `txtMacFilter` id:
```html
<input class="form-control" id="txtMacFilter" type="text" value="--">
```
2. This input field is initialized via the `&mac=` query string.
3. The app then proceeds to use this Mac value from this field and compares it to the value of the `Object_PrimaryID` database field. The `compare_operator` is `==`.
4. Both values, from the database field `Object_PrimaryID` and from the `txtMacFilter` are wrapped and evaluated with the `compare_js_template`, that is `'{value}.toString()'`.
5. `compare_use_quotes` is set to `true` so `'{value}'.toString()` is wrappe dinto `"` quotes.
6. This results in for example this code:
```javascript
// left part of teh expression coming from compare_column and right from the input field
// notice the added quotes ()") around the left and right part of teh expression
"eval('ac:82:ac:82:ac:82".toString()')" == "eval('ac:82:ac:82:ac:82".toString()')"
```
7. Filters are only applied if a filter is specified and the `txtMacFilter` is not `undefined` or empty (`--`).
### Mapping the plugin results into a database table
PiAlert will take the results of the plugin execution and insert these results into a database table, if a plugin contains the property `"mapped_to_table"` in the `config.json` root. The mapping of the columns is defined in the `database_column_definitions` array.
This approach is used to implement the `DHCPLSS` plugin. The script parses all supplied "dhcp.leases" files, get's the results in the generic table format outlined in the "Column order and values" section above and takes individual values and inserts them into the `"DHCP_Leases"` database table in the PiAlert database. All this is achieved by:
1) Specifying the database table into which the results are inserted by defining `"mapped_to_table": "DHCP_Leases"` in the root of the `config.json` file as shown below:
```json
{
"code_name": "dhcp_leases",
"unique_prefix": "DHCPLSS",
...
"data_source": "python-script",
"localized": ["display_name", "description", "icon"],
"mapped_to_table": "DHCP_Leases",
...
}
```
2) Defining the target column with the `mapped_to_column` property for individual columns in the `database_column_definitions` array of the `config.json` file. For example in the `DHCPLSS` plugin, I needed to map the value of the `Object_PrimaryID` column returned by the plugin, to the `DHCP_MAC` column in the PiAlert database `DHCP_Leases` table. Notice the `"mapped_to_column": "DHCP_MAC"` key-value pair in the sample below.
```json
{
"column": "Object_PrimaryID",
"mapped_to_column": "DHCP_MAC",
"css_classes": "col-sm-2",
"show": true,
"type": "devicemac",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "MAC address"
}]
}
```
3) That's it. PiAlert takes care of the rest. It loops thru the objects discovered by the plugin, takes the results line, by line and inserts them into the database table specified in `"mapped_to_table"`. The columns are translated from the generic plugin columns to the target table via the `"mapped_to_column"` property in the column definitions.
#### params
The `params` array in the `config.json` is used to enable the user to change the parameters of the executed script. For example, the user wants to monitor a specific URL.
> 🔎 Example:
> Passing user-defined settings to a command. Let's say, you want to have a script, that is called with a user-defined parameter called `urls`:
>
> ```bash
> root@server# python3 /home/pi/pialert/pialert/plugins/website_monitor/script.py urls=https://google.com,https://duck.com
> ```
* You can allow the user to add URLs to a setting with the `function` property set to a custom name, such as `urls_to_check` (this is not a reserved name from the section "Supported settings `function` values" below).
* You specify the parameter `urls` in the `params` section of the `config.json` the following way (`WEBMON_` is the plugin prefix automatically added to all the settings):
```json
{
"params" : [
{
"name" : "urls",
"type" : "setting",
"value" : "WEBMON_urls_to_check"
}]
}
```
* Then you use this setting as an input parameter for your command in the `CMD` setting. Notice `urls={urls}` in the below json:
```json
{
"function": "CMD",
"type": "text",
"default_value":"python3 /home/pi/pialert/pialert/plugins/website_monitor/script.py urls={urls}",
"options": [],
"localized": ["name", "description"],
"name" : [{
"language_code":"en_us",
"string" : "Command"
}],
"description": [{
"language_code":"en_us",
"string" : "Command to run"
}]
}
```
During script execution, the app will take the command `"python3 /home/pi/pialert/pialert/plugins/website_monitor/script.py urls={urls}"`, take the `{urls}` wildcard and replace it by with the value from the `WEBMON_urls_to_check` setting. This is because:
1) The app checks the `params` entries
2) It finds `"name" : "urls"`
3) Checks the type of the `urls` params and finds `"type" : "setting"`
4) Gets the setting name from `"value" : "WEBMON_urls_to_check"`
- IMPORTANT: in the `config.json` this setting is identified by `"function":"urls_to_check"`, not `"function":"WEBMON_urls_to_check"`
- You can also use a global setting, or a setting from a different plugin
5) The app gets the user defined value from the setting with the code name `WEBMON_urls_to_check`
- let's say the setting with the code name `WEBMON_urls_to_check` contains 2 values entered by the user:
- `WEBMON_urls_to_check=['https://google.com','https://duck.com']`
6) The app takes the value from `WEBMON_urls_to_check` and replaces the `{urls}` wildcard in the setting where `"function":"CMD"`, so you go from:
- `python3 /home/pi/pialert/pialert/plugins/website_monitor/script.py urls={urls}`
- to
- `python3 /home/pi/pialert/pialert/plugins/website_monitor/script.py urls=https://google.com,https://duck.com`
Below are some general additional notes, when defining `params`:
- `"name":"name_value"` - is used as a wildcard replacement in the `CMD` setting value by using curly brackets `{name_value}`. The wildcard is replaced by the result of the `"value" : "param_value"` and `"type":"type_value"` combo configuration below.
- `"type":"<sql|setting>"` - is used to specify the type of the params, currently only 2 supported (`sql`,`setting`).
- `"type":"sql"` - will execute the SQL query specified in the `value` property. The sql query needs to return only one column. The column is flattened and separated by commas (`,`), e.g: `SELECT dev_MAC from DEVICES` -> `Internet,74:ac:74:ac:74:ac,44:44:74:ac:74:ac`. This is then used to replace the wildcards in the `CMD` setting.
- `"type":"setting"` - The setting code name. A combination of the value from `unique_prefix` + `_` + `function` value, or otherwise the code name you can find in the Settings page under the Setting display name, e.g. `SCAN_CYCLE_MINUTES`.
- `"value" : "param_value"` - Needs to contain a setting code name or SQL query without wildcards.
> 🔎Example:
>
> ```json
> {
> "params" : [{
> "name" : "macs",
> "type" : "sql",
> "value" : "SELECT dev_MAC from DEVICES"
> },
> {
> "name" : "urls",
> "type" : "setting",
> "value" : "WEBMON_urls_to_check"
> },
> {
> "name" : "internet_ip",
> "type" : "setting",
> "value" : "WEBMON_SQL_internet_ip"
> }]
> }
> ```
#### Setting object structure
- `"function": "<see Supported settings function values>"` - What function the setting drives or a simple unique code name
- `"type": "<text|integer|boolean|password|readonly|integer.select|text.select|text.multiselect|list|integer.checkbox>"` - The form control used for the setting displayed in the Settings page and what values are accepted.
- `"localized"` - a list of properties on the current JSON level which need to be localized
- `"name"` and `"description"` - Displayed in the Settings page. An array of localized strings. (see Localized strings below).
##### Supported settings `function` values
You can have any `"function": "my_custom_name"` custom name, however, the ones listed below have a specific functionality attached to them. If you use a custom name, then the setting is mostly used as an input parameter for the `params` section.
- `RUN` - (required) Specifies when the service is executed
- Supported Options: "disabled", "once", "schedule" (if included then a `RUN_SCHD` setting needs to be specified), "always_after_scan", "on_new_device"
- `RUN_SCHD` - (required if you include the above `RUN` function) Cron-like scheduling used if the `RUN` setting set to `schedule`
- `CMD` - (required) What command should be executed.
- `API_SQL` - (optional) Generates a `table_` + code_name + `.json` file as per [API docs](https://github.com/jokob-sk/Pi.Alert/blob/main/docs/API.md).
- `RUN_TIMEOUT` - (optional) Max execution time of the script. If not specified a default value of 10 seconds is used to prevent hanging.
- `WATCH` - (optional) Which database columns are watched for changes for this particular plugin. If not specified no notifications are sent.
- `REPORT_ON` - (optional) Send a notification only on these statuses. Supported options are:
- `new` means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered.
- `watched-changed` - means that selected `Watched_ValueN` columns changed
- `watched-not-changed` - reports even on events where selected `Watched_ValueN` did not change
> 🔎 Example:
>
> ```json
> {
> "function": "RUN",
> "type": "text.select",
> "default_value":"disabled",
> "options": ["disabled", "once", "schedule", "always_after_scan", "on_new_device"],
> "localized": ["name", "description"],
> "name" :[{
> "language_code":"en_us",
> "string" : "When to run"
> }],
> "description": [{
> "language_code":"en_us",
> "string" : "Enable a regular scan of your services. If you select <code>schedule</code> the scheduling settings from below are applied. If you select <code>once</code> the scan is run only once on start of the application (container) for the time specified in <a href=\"#WEBMON_RUN_TIMEOUT\"><code>WEBMON_RUN_TIMEOUT</code> setting</a>."
> }]
> }
> ```
##### Localized strings
- `"language_code":"<en_us|es_es|de_de>"` - code name of the language string. Only these three are currently supported. At least the `"language_code":"en_us"` variant has to be defined.
- `"string"` - The string to be displayed in the given language.
> 🔎 Example:
>
> ```json
>
> {
> "language_code":"en_us",
> "string" : "When to run"
> }
>
> ```
##### UI settings in database_column_definitions
The UI will adjust how columns are displayed in the UI based on the definition of the `database_column_definitions` object. These are the supported form controls and related functionality:
- Only columns with `"show": true` and also with at least an English translation will be shown in the UI.
- Supported types: `label`, `text`, `threshold`, `replace`, `deviceip`, `devicemac`, `url`. Check for details below, how columns behave based on the type.
- `label` makes a column display only
- `text` makes a column editable and a save icon is displayed next to it.
- See below for information on `threshold`, `replace`
- The `options` property is used in conjunction with these types:
- `threshold` - The `options` array contains objects from lowest `maximum` to highest with corresponding `hexColor` used for the value background color if it's less than the specified `maximum`, but more than the previous one in the `options` array
- `replace` - The `options` array contains objects with an `equals` property, that is compared to the "value" and if the values are the same, the string in `replacement` is displayed in the UI instead of the actual "value"
- `devicemac` - The value is considered to be a Mac address and a link pointing to the device with the given Mac address is generated.
- `deviceip` - The value is considered to be an IP address and a link pointing to the device with the given IP is generated. The IP is checked against the last detected IP addresses and translated into a Mac address that is then used for the link itself.
- `url` - The value is considered to be a URL so a link is generated.
```json
{
"column": "Watched_Value1",
"css_classes": "col-sm-2",
"show": true,
"type": "threshold",
"default_value":"",
"options": [
{
"maximum": 199,
"hexColor": "#792D86"
},
{
"maximum": 299,
"hexColor": "#5B862D"
},
{
"maximum": 399,
"hexColor": "#7D862D"
},
{
"maximum": 499,
"hexColor": "#BF6440"
},
{
"maximum": 599,
"hexColor": "#D33115"
}
],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Status code"
}]
},
{
"column": "Status",
"show": true,
"type": "replace",
"default_value":"",
"options": [
{
"equals": "watched-not-changed",
"replacement": "<i class='fa-solid fa-square-check'></i>"
},
{
"equals": "watched-changed",
"replacement": "<i class='fa-solid fa-triangle-exclamation'></i>"
},
{
"equals": "new",
"replacement": "<i class='fa-solid fa-circle-plus'></i>"
}
],
"localized": ["name"],
"name":[{
"language_code":"en_us",
"string" : "Status"
}]
}
```
[screen1]: https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/docs/img/plugins.png "Screen 1"
[screen2]: https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/docs/img/plugins_settings.png "Screen 2"
[screen3]: https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/docs/img/plugins_json_settings.png "Screen 3"
[screen4]: https://raw.githubusercontent.com/jokob-sk/Pi.Alert/main/docs/img/plugins_json_ui.png "Screen 4"