Compare commits
133 Commits
v25.7.4
...
e8d3d5c2a9
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e8d3d5c2a9 | ||
|
|
d4b898358f | ||
|
|
bd5a9b4f72 | ||
|
|
5f1d2ee26c | ||
|
|
9175a5a45f | ||
|
|
2af60c034f | ||
|
|
c503aeaf00 | ||
|
|
3f9922b7df | ||
|
|
91fc1da896 | ||
|
|
3d2e4f6343 | ||
|
|
39d44689de | ||
|
|
2547e6e805 | ||
|
|
3c5a76b512 | ||
|
|
dc76ba2fda | ||
|
|
386ee473bd | ||
|
|
feebe96fec | ||
|
|
86f83eff5b | ||
|
|
54fa2743f9 | ||
|
|
2475133405 | ||
|
|
cdb3dee8ed | ||
|
|
e667abf6fb | ||
|
|
d5b2e2f0ee | ||
|
|
cd7cbcc4c8 | ||
|
|
a055c2450a | ||
|
|
170a3c0ae1 | ||
|
|
6fe865e115 | ||
|
|
1c1c5bd32b | ||
|
|
d40ad8bd09 | ||
|
|
2b70e1c2e5 | ||
|
|
da8ea98c28 | ||
|
|
caac65f4f9 | ||
|
|
a92d66c981 | ||
|
|
5fd709ed35 | ||
|
|
29f120e66b | ||
|
|
74f5933627 | ||
|
|
56a93ee75b | ||
|
|
3a8634844f | ||
|
|
26d546f6ec | ||
|
|
0265c41612 | ||
|
|
a53b410713 | ||
|
|
3035b5b6b2 | ||
|
|
266d7c25da | ||
|
|
77b25a9740 | ||
|
|
618bafa514 | ||
|
|
415f589716 | ||
|
|
54c7c820b8 | ||
|
|
89864f7070 | ||
|
|
b4916cd3b6 | ||
|
|
97567ad472 | ||
|
|
b00dbd560f | ||
|
|
c41fbab8ee | ||
|
|
771db9fa0e | ||
|
|
dd6ccf830c | ||
|
|
b0e079aeb2 | ||
|
|
d1d49572e2 | ||
|
|
774078df9c | ||
|
|
8c708f2c96 | ||
|
|
3c68b0151d | ||
|
|
6cb252c0ed | ||
|
|
11f2a74b5d | ||
|
|
9bba3c9e50 | ||
|
|
b3d71a5fec | ||
|
|
a111ed929b | ||
|
|
21dd85f62f | ||
|
|
b08bca5ce4 | ||
|
|
dff6cba2d8 | ||
|
|
10a0921e35 | ||
|
|
70443942ff | ||
|
|
7d26966250 | ||
|
|
9ada27cf7e | ||
|
|
752322bbad | ||
|
|
0444e338ec | ||
|
|
a669abd47e | ||
|
|
4e46fcb9e6 | ||
|
|
31d7d0c143 | ||
|
|
b470b985e9 | ||
|
|
c90c6b5c90 | ||
|
|
26f0d0ac2f | ||
|
|
5e3365935e | ||
|
|
5b6424d405 | ||
|
|
698ad8e45d | ||
|
|
09fd345528 | ||
|
|
edfba9f1bc | ||
|
|
bb844ceac4 | ||
|
|
c6f3b60671 | ||
|
|
3178a65e72 | ||
|
|
aedfb4e5dd | ||
|
|
e0dcc191c7 | ||
|
|
c80e6d3474 | ||
|
|
46cd4887a3 | ||
|
|
bfbf70cf1a | ||
|
|
61de54bc34 | ||
|
|
e27af88690 | ||
|
|
393c3fd3b6 | ||
|
|
0e53aef9ea | ||
|
|
8a742b0ec0 | ||
|
|
b17b70a91f | ||
|
|
6f536f9952 | ||
|
|
034caf965a | ||
|
|
6322e3f4cf | ||
|
|
6b78adb702 | ||
|
|
6e8c931bf3 | ||
|
|
b80fe44c08 | ||
|
|
0921773666 | ||
|
|
13e960f5cb | ||
|
|
094583b8f6 | ||
|
|
fd7ec5d2cf | ||
|
|
370659f461 | ||
|
|
1f853a8bb1 | ||
|
|
b93c3b6093 | ||
|
|
6145fff2fd | ||
|
|
48687dc6dd | ||
|
|
4591cc87e2 | ||
|
|
67491615c0 | ||
|
|
fadf64450b | ||
|
|
34bb7bb93f | ||
|
|
67f8401dce | ||
|
|
f9fb711881 | ||
|
|
26c35a01f3 | ||
|
|
9538842fcb | ||
|
|
8ca31ab049 | ||
|
|
b19c9b5eb6 | ||
|
|
896ead0bb8 | ||
|
|
9835381186 | ||
|
|
d49ced8942 | ||
|
|
9a01263d70 | ||
|
|
7980554924 | ||
|
|
8949bcb567 | ||
|
|
ac90bb702e | ||
|
|
088c913ede | ||
|
|
7554a7f246 | ||
|
|
31e5c9fe96 | ||
|
|
e21c1771c7 |
2
.github/tweet.md
vendored
@@ -1,2 +0,0 @@
|
||||
🎉 New release: **v25.7.3 - 🌍 Arabic translation and various fixes** is live! 🚀
|
||||
Check it out here: https://github.com/jokob-sk/NetAlertX/releases/tag/v25.7.3
|
||||
37
.github/workflows/social_post_on_release.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: 📧 Twitter and Discord Posts
|
||||
name: 📧 Social Posts
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
@@ -16,38 +16,3 @@ jobs:
|
||||
-d '{"content": "🎉 New release: **${{ github.event.release.name }}** is live! 🚀\nCheck it out here: ${{ github.event.release.html_url }}"}' \
|
||||
${{ secrets.DISCORD_WEBHOOK_URL }}
|
||||
|
||||
post-twitter:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Wait for 15 minutes
|
||||
run: sleep 900 # 15 minutes delay
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Set Git config
|
||||
run: |
|
||||
git config --global user.email "github-actions@github.com"
|
||||
git config --global user.name "GitHub Actions"
|
||||
|
||||
- name: Create tweet file
|
||||
run: |
|
||||
echo "🎉 New release: **${{ github.event.release.name }}** is live! 🚀" > .github/tweet.md
|
||||
echo "Check it out here: ${{ github.event.release.html_url }}" >> .github/tweet.md
|
||||
git add .github/tweet.md
|
||||
git commit -m "Add release tweet for ${{ github.event.release.name }}"
|
||||
|
||||
- name: Push changes
|
||||
run: |
|
||||
git push https://github.com/${{ github.repository }}.git HEAD:main
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Tweet
|
||||
uses: twitter-together/action@v3
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
TWITTER_ACCESS_TOKEN: ${{ secrets.TWITTER_ACCESS_TOKEN }}
|
||||
TWITTER_ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }}
|
||||
TWITTER_API_KEY: ${{ secrets.TWITTER_API_KEY }}
|
||||
TWITTER_API_SECRET_KEY: ${{ secrets.TWITTER_API_SECRET_KEY }}
|
||||
|
||||
@@ -23,11 +23,11 @@ services:
|
||||
# - ${DEV_LOCATION}/api:/app/api
|
||||
# ---------------------------------------------------------------------------
|
||||
# DELETE START anyone trying to use this file: comment out / delete BELOW lines, they are only for development purposes
|
||||
- ${APP_DATA_LOCATION}/netalertx/dhcp_samples/dhcp1.leases:/mnt/dhcp1.leases
|
||||
- ${APP_DATA_LOCATION}/netalertx/dhcp_samples/dhcp2.leases:/mnt/dhcp2.leases
|
||||
- ${APP_DATA_LOCATION}/netalertx/dhcp_samples/pihole_dhcp_full.leases:/etc/pihole/dhcp.leases
|
||||
- ${APP_DATA_LOCATION}/netalertx/dhcp_samples/pihole_dhcp_2.leases:/etc/pihole/dhcp2.leases
|
||||
- ${APP_DATA_LOCATION}/pihole/etc-pihole/pihole-FTL.db:/etc/pihole/pihole-FTL.db
|
||||
- ${APP_DATA_LOCATION}/netalertx/dhcp_samples/dhcp1.leases:/mnt/dhcp1.leases # test data for DCPLSS plugin
|
||||
- ${APP_DATA_LOCATION}/netalertx/dhcp_samples/dhcp2.leases:/mnt/dhcp2.leases # test data for DCPLSS plugin
|
||||
- ${APP_DATA_LOCATION}/netalertx/dhcp_samples/pihole_dhcp_full.leases:/etc/pihole/dhcp.leases # test data for DCPLSS plugin
|
||||
- ${APP_DATA_LOCATION}/netalertx/dhcp_samples/pihole_dhcp_2.leases:/etc/pihole/dhcp2.leases # test data for DCPLSS plugin
|
||||
- ${APP_DATA_LOCATION}/pihole/etc-pihole/pihole-FTL.db:/etc/pihole/pihole-FTL.db # test data for PIHOLE plugin
|
||||
- ${DEV_LOCATION}/mkdocs.yml:/app/mkdocs.yml
|
||||
- ${DEV_LOCATION}/docs:/app/docs
|
||||
- ${DEV_LOCATION}/server:/app/server
|
||||
|
||||
@@ -39,6 +39,8 @@
|
||||
| `devSourcePlugin` | Source plugin that discovered the device. | `ARPSCAN` |
|
||||
| `devCustomProps` | [Custom properties](./CUSTOM_PROPERTIES.md) related to the device. The value is a base64-encoded JSON object. | `PHN2ZyB...` |
|
||||
| `devFQDN` | Fully qualified domain name. | `raspberrypi.local` |
|
||||
| `devParentRelType` | The type of relationship between the current device and it's parent node. By default, selecting `nic` will hide it from lists. | `nic` |
|
||||
| `devReqNicsOnline` | If all NICs are required to be online to mark teh current device online. | `0` |
|
||||
|
||||
|
||||
To understand how values of these fields influuence application behavior, such as Notifications or Network topology, see also:
|
||||
|
||||
@@ -10,7 +10,7 @@ Check the the HTTP response of the failing backend call by following these steps
|
||||
- Copy the URL causing the error and enter it in the address bar of your browser directly and hit enter. The copied URLs could look something like this (notice the query strings at the end):
|
||||
- `http://<NetAlertX URL>:20211/api/table_devices.json?nocache=1704141103121`
|
||||
- `http://<NetAlertX URL>:20211/php/server/devices.php?action=getDevicesTotals`
|
||||
- `http://<NetAlertX URL>:20211/php/server/devices.php?action=getDevicesList&status=all`
|
||||
|
||||
|
||||
- Post the error response in the existing issue thread on GitHub or create a new issue and include the redacted response of the failing query.
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ services:
|
||||
network_mode: "host"
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ${APP_DATA_LOCATION}/netalertx/config:/app/config
|
||||
- ${APP_CONFIG_LOCATION}/netalertx/config:/app/config
|
||||
- ${APP_DATA_LOCATION}/netalertx/db/:/app/db/
|
||||
# (optional) useful for debugging if you have issues setting up the container
|
||||
- ${LOGS_LOCATION}:/app/log
|
||||
|
||||
@@ -5,7 +5,7 @@ To download and install NetAlertX on the hardware/server directly use the `curl`
|
||||
> [!NOTE]
|
||||
> This is an Experimental feature 🧪 and it relies on community support.
|
||||
>
|
||||
> 🙏 Looking for maintainers for this installation method 🙂 Curent community volunteers:
|
||||
> 🙏 Looking for maintainers for this installation method 🙂 Current community volunteers:
|
||||
> - [slammingprogramming](https://github.com/slammingprogramming)
|
||||
>
|
||||
> There is no guarantee that the install script or any other script will gracefully handle other installed software.
|
||||
|
||||
@@ -1,63 +1,104 @@
|
||||
## How to setup your Network page
|
||||
## How to Set Up Your Network Page
|
||||
|
||||
Make sure you have a root device with the MAC `Internet` (No other MAC addresses are currently supported as the root node) set to a network device type (e.g.: **Type**:`Router`).
|
||||
The **Network** page lets you map how devices connect — visually and logically.
|
||||
It’s especially useful for planning infrastructure, assigning parent-child relationships, and spotting gaps.
|
||||
|
||||
> 💡 Tip: You can add dummy devices via the [Create dummy device](./DEVICE_MANAGEMENT.md#dummy-devices) button in the Devices listing page.
|
||||

|
||||
|
||||
> 💡 Tip: Export your configuration of the Network and Devices once in a while via the Export CSV feature under **Maintenance** -> **Backup/Restore** -> **CSV Export**.
|
||||
To get started, you’ll need to define at least one root node and mark certain devices as network nodes (like Switches or Routers).
|
||||
|
||||
## ⚡Quick setup:
|
||||
---
|
||||
|
||||
* Go to a Device you want to use as network device (network nodes, such as a Switch).
|
||||
* Set the **Type** of such a device to one of the following: AP, Firewall, Gateway, PLC, Powerline, Router, Switch, USB LAN Adapter, USB WIFI Adapter and WLAN (you can create a custom network type device with in Settings -> General -> `NETWORK_DEVICE_TYPES`).
|
||||
* Save and go to Network where the devices you've marked as network devices (by selecting the Type as mentioned above) will show up as tabs.
|
||||
* You can now assign the Unassigend devices to the network node.
|
||||
* If port is empty or 0 a wifi icon is rendered, otherwise a ethernet port icon.
|
||||
Start by creating a root device with the MAC address `Internet`, if the application didn’t create one already.
|
||||
This special MAC address (`Internet`) is required for the root network node — no other value is currently supported.
|
||||
Set its **Type** to a valid network type — such as `Router` or `Gateway`.
|
||||
|
||||
> [!TIP]
|
||||
> If you don’t have one, use the [Create new device](./DEVICE_MANAGEMENT.md#dummy-devices) button on the **Devices** page to add a root device.
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> [Bulk-edit devices](./DEVICES_BULK_EDITING.md) by using the _CSV Export_ functionality in the _Maintenance_ section. You can use this to fix `Internet` node assignment issues.
|
||||
---
|
||||
|
||||
## 🔍Detailed example:
|
||||
## ⚡ Quick Setup
|
||||
|
||||
In this example you will setup a device named `rapberrypi` as a `Switch` in our network.
|
||||
1. Open the device you want to use as a network node (e.g. a Switch).
|
||||
2. Set its **Type** to one of the following:
|
||||
`AP`, `Firewall`, `Gateway`, `PLC`, `Powerline`, `Router`, `Switch`, `USB LAN Adapter`, `USB WIFI Adapter`, `WLAN`
|
||||
*(Or add custom types under **Settings → General → `NETWORK_DEVICE_TYPES`**.)*
|
||||
3. Save the device.
|
||||
4. Go to the **Network** page — supported device types will appear as tabs.
|
||||
5. Use the **Assign** button to connect unassigned devices to a network node.
|
||||
6. If the **Port** is `0` or empty, a Wi-Fi icon is shown. Otherwise, an Ethernet icon appears.
|
||||
|
||||
### 1. Device details page
|
||||
> [!NOTE]
|
||||
> Use [bulk editing](./DEVICES_BULK_EDITING.md) with _CSV Export_ to fix `Internet` root assignments or update many devices at once.
|
||||
|
||||
- Go to the `Devices` (1) page:
|
||||
---
|
||||
|
||||

|
||||
## Example: Setting up a `raspberrypi` as a Switch
|
||||
|
||||
- In the (2) `Details` tab navigate to the the `Type` (3) dropdown and select the type `Switch` (4).
|
||||
Let’s walk through setting up a device named `raspberrypi` to act as a network Switch that other devices connect through.
|
||||
|
||||
> Note: Only the following device types will show up as selectable Network nodes ( = devices you can connect other devices to):
|
||||
> AP, Firewall, Gateway, Hypervisor, PLC, Powerline, Router, Switch, USB LAN Adapter, USB WIFI Adapter and WLAN. Custom types can be added via the `NETWORK_DEVICE_TYPES` setting.
|
||||
---
|
||||
|
||||
- Assign a device to your root device from the `Node` (5) dropdown which has the MAC `Internet` (6) (Your name may differ, but the MAC needs to be set to `Internet` - this is done by default).
|
||||
### 1. Set Device Type and Parent
|
||||
|
||||
- Save your changes (7)
|
||||
- Go to the **Devices** page
|
||||
- Open the device detail view for `raspberrypi`
|
||||
- In the **Type** dropdown, select `Switch`
|
||||
|
||||
### 2. Network page
|
||||

|
||||
|
||||
- Navigate to your `Network` (1) page:
|
||||
- Optionally assign a **Parent Node** (where this device connects to) and the **Relationship type** of the connection.
|
||||
The `nic` relationship type can affect parent notifications — see the setting description and [Notifications documentation](./NOTIFICATIONS.md) for more.
|
||||
|
||||

|
||||

|
||||
|
||||
- Notice the newly added `raspberrypi` (2) tab which now represents a network node, also showing up in the tree (3).
|
||||
- As we asssigned the `raspberrypi` in the previous (1) Device details page section to the `Internet` parent network node in step (6), the link is also showing up in the tree diagram (4)
|
||||
- We can now assign the device `(AppleTV)` (5) to this `raspberrypi` node, representing a network Switch in this example
|
||||
> [!NOTE]
|
||||
> Only certain device types can act as network nodes:
|
||||
> `AP`, `Firewall`, `Gateway`, `Hypervisor`, `PLC`, `Powerline`, `Router`, `Switch`, `USB LAN Adapter`, `USB WIFI Adapter`, `WLAN`
|
||||
> You can add custom types via the `NETWORK_DEVICE_TYPES` setting.
|
||||
|
||||
### 3. Network page with 2 levels
|
||||
- Click **Save**
|
||||
|
||||
- After clicking the `Assign` button in the previous section, the `(AppleTV)` (1) device is now connected to our `raspberrypi` (2).
|
||||
---
|
||||
|
||||

|
||||
### 2. Confirm The Device Appears as a Network Node
|
||||
|
||||
- You can see the `raspberrypi` represents the Network node type `Switch` (3)
|
||||
- The `(AppleTV)` to `raspberrypi` connection is also displayed in the table of `Connected devices` (4).
|
||||
- You can also see that our `raspberrypi` node is connected to it's Parent network device node with the MAC `Internet` (5). This connection again shows up in the tree (6) as well.
|
||||
You can confirm that `raspberrypi` now acts as a network device in two places:
|
||||
|
||||
- Navigate to a different device and verify that `raspberrypi` now appears as an option for a **Parent Node**:
|
||||
|
||||

|
||||
|
||||
- Go to the **Network** page — you'll now see a `raspberrypi` tab, meaning it's recognized as a network node (Switch):
|
||||
|
||||

|
||||
|
||||
- You can now assign other devices to it.
|
||||
|
||||
---
|
||||
|
||||
### 3. Assign Connected Devices
|
||||
|
||||
- Use the **Assign** button to link other devices (e.g. PCs) to `raspberrypi`.
|
||||
- After assigning, connected devices will appear beneath the `raspberrypi` switch node.
|
||||
|
||||

|
||||
|
||||
- Relationship lines may vary in color based on the selected Relationship type. These are editable on the device details page where you can also assign a parent node.
|
||||
|
||||

|
||||
|
||||
> Hovering over devices in the tree reveals connection details and tooltips for quick inspection.
|
||||
|
||||
---
|
||||
|
||||
## ✅ Summary
|
||||
|
||||
To configure devices on the **Network** page:
|
||||
|
||||
- Ensure a device with MAC `Internet` is set up as the root
|
||||
- Assign valid **Type** values to switches, routers, and other supported nodes that represent network devices
|
||||
- Use the **Assign** button to connect devices logically to their parent node
|
||||
|
||||
Need to reset or undo changes? [Use backups](./BACKUPS.md) or [bulk editing](./DEVICES_BULK_EDITING.md) to manage devices at scale. You can also automate device assignment with [Workflows](./WORKFLOWS.md).
|
||||
|
||||
@@ -15,11 +15,12 @@ There are 4 ways how to influence notifications:
|
||||
|
||||

|
||||
|
||||
There are 4 settings on the device for influencing notifications. You can:
|
||||
The following device properties influence notifications. You can:
|
||||
|
||||
1. **Alert Events** - Enables alerts of connections, disconnections, IP changes (down and down reconnected notifications are still sent even if this is disabled).
|
||||
2. **Alert Down** - Alerts when a device goes down. This setting overrides a disabled **Alert Events** setting, so you will get a notification of a device going down even if you don't have **Alert Events** ticked. Disabling this will disable down and down reconnected notifications on the device.
|
||||
3. **Skip repeated notifications**, if for example you know there is a temporary issue and want to pause the same notification for this device for a given time.
|
||||
4. **Require NICs Online** - Indicates whether this device should be considered online only if all associated NICs (devices with the `nic` relationship type) are online. If disabled, the device is considered online if any NIC is online. If a NIC is online it sets the parent (this) device's status to online irrespectivelly of the detected device's status. The Relationship type is set on the childern device.
|
||||
|
||||
> [!NOTE]
|
||||
> Please read through the [NTFPRCS plugin](https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/notification_processing/README.md) documentation to understand how device and global settings influence the notification processing.
|
||||
|
||||
@@ -43,51 +43,50 @@ NetAlertX supports additional plugins to extend its functionality, each with its
|
||||
|
||||
Device-detecting plugins insert values into the `CurrentScan` database table. The plugins that are not required are safe to ignore, however, it makes sense to have at least some device-detecting plugins enabled, such as `ARPSCAN` or `NMAPDEV`.
|
||||
|
||||
|
||||
| ID | Type | Description | Features | Required | Data source | Detailed docs |
|
||||
|---------------|---------|--------------------------------------------|----------|----------|--------------|---------------------------------------------------------------------|
|
||||
| `APPRISE` | ▶️ | Apprise notification proxy | | | Script | [_publisher_apprise](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_apprise/) |
|
||||
| `ARPSCAN` | 🔍 | ARP-scan on current network | | | Script | [arp_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/arp_scan/) |
|
||||
| `AVAHISCAN` | 🆎 | Avahi (mDNS-based) name resolution | | | Script | [avahi_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/avahi_scan/) |
|
||||
| `ASUSWRT` | 🔍 | Import connected devices from AsusWRT | | | Script | [asuswrt_import](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/asuswrt_import/) |
|
||||
| `CSVBCKP` | ⚙ | CSV devices backup | | | Script | [csv_backup](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/csv_backup/) |
|
||||
| `CUSTPROP` | ⚙ | Managing custom device properties values | | Yes | Template | [custom_props](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/custom_props/) |
|
||||
| `DBCLNP` | ⚙ | Database cleanup | | Yes* | Script | [db_cleanup](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/db_cleanup/) |
|
||||
| `DDNS` | ⚙ | DDNS update | | | Script | [ddns_update](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/ddns_update/) |
|
||||
| `DHCPLSS` | 🔍/📥/🆎| Import devices from DHCP leases | | | Script | [dhcp_leases](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/dhcp_leases/) |
|
||||
| `DHCPSRVS` | ♻ | DHCP servers | | | Script | [dhcp_servers](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/dhcp_servers/) |
|
||||
| `DIGSCAN` | 🆎 | Dig (DNS) Name resolution | | | Script | [dig_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/dig_scan/) |
|
||||
| `FREEBOX` | 🔍/♻/🆎| Pull data and names from Freebox/Iliadbox | | | Script | [freebox](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/freebox/) |
|
||||
| `ICMP` | ♻ | ICMP (ping) status checker | | | Script | [icmp_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/icmp_scan/) |
|
||||
| `INTRNT` | 🔍 | Internet IP scanner | | | Script | [internet_ip](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/internet_ip/) |
|
||||
| `INTRSPD` | ♻ | Internet speed test | | | Script | [internet_speedtest](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/internet_speedtest/) |
|
||||
| `IPNEIGH` | 🔍 | Scan ARP (IPv4) and NDP (IPv6) tables | | | Script | [ipneigh](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/ipneigh/) |
|
||||
| `LUCIRPC` | 🔍 | Import connected devices from OpenWRT | | | Script | [luci_import](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/luci_import/) |
|
||||
| `MAINT` | ⚙ | Maintenance of logs, etc. | | | Script | [maintenance](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/maintenance/) |
|
||||
| `MQTT` | ▶️ | MQTT for synching to Home Assistant | | | Script | [_publisher_mqtt](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_mqtt/) |
|
||||
| `NBTSCAN` | 🆎 | Nbtscan (NetBIOS-based) name resolution | | | Script | [nbtscan_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nbtscan_scan/) |
|
||||
| `NEWDEV` | ⚙ | New device template | | Yes | Template | [newdev_template](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/newdev_template/) |
|
||||
| `NMAP` | ♻ | Nmap port scanning & discovery | | | Script | [nmap_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan/) |
|
||||
| `NMAPDEV` | 🔍 | Nmap dev scan on current network | | | Script | [nmap_dev_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_dev_scan/) |
|
||||
| `NSLOOKUP` | 🆎 | NSLookup (DNS-based) name resolution | | | Script | [nslookup_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nslookup_scan/) |
|
||||
| `NTFPRCS` | ⚙ | Notification processing | | Yes | Template | [notification_processing](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/notification_processing/)|
|
||||
| `NTFY` | ▶️ | NTFY notifications | | | Script | [_publisher_ntfy](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_ntfy/) |
|
||||
| `OMDSDN` | 📥/🆎 ❌ | UNMAINTAINED use `OMDSDNOPENAPI` | 🖧 🔄 | | Script | [omada_sdn_imp](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/omada_sdn_imp/) |
|
||||
| `OMDSDNOPENAPI`| 📥/🆎 | OMADA TP-Link import via OpenAPI | 🖧 | | Script | [omada_sdn_openapi](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/omada_sdn_openapi/) |
|
||||
| `PIHOLE` | 🔍/🆎/📥| Pi-hole device import & sync | | | SQLite DB | [pihole_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/pihole_scan/) |
|
||||
| `PUSHSAFER` | ▶️ | Pushsafer notifications | | | Script | [_publisher_pushsafer](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_pushsafer/) |
|
||||
| `PUSHOVER` | ▶️ | Pushover notifications | | | Script | [_publisher_pushover](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_pushover/) |
|
||||
| `SETPWD` | ⚙ | Set password | | Yes | Template | [set_password](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password/) |
|
||||
| `SMTP` | ▶️ | Email notifications | | | Script | [_publisher_email](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_email/) |
|
||||
| `SNMPDSC` | 🔍/📥 | SNMP device import & sync | | | Script | [snmp_discovery](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/snmp_discovery/) |
|
||||
| `SYNC` | 🔍/⚙/📥| Sync & import from NetAlertX instances | 🖧 🔄 | Yes | Script | [sync](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/sync/) |
|
||||
| `TELEGRAM` | ▶️ | Telegram notifications | | | Script | [_publisher_telegram](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_telegram/) |
|
||||
| `UI` | ♻ | UI specific settings | | Yes | Template | [ui_settings](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/ui_settings/) |
|
||||
| `UNFIMP` | 🔍/📥/🆎| UniFi device import & sync | 🖧 | | Script | [unifi_import](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/unifi_import/) |
|
||||
| `VNDRPDT` | ⚙ | Vendor database update | | | Script | [vendor_update](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/vendor_update/) |
|
||||
| `WEBHOOK` | ▶️ | Webhook notifications | | | Script | [_publisher_webhook](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_webhook/) |
|
||||
| `WEBMON` | ♻ | Website down monitoring | | | Script | [website_monitor](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/website_monitor/) |
|
||||
| `WOL` | ♻ | Automatic wake-on-lan | | | Script | [wake_on_lan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/wake_on_lan/) |
|
||||
| ID | Plugin docs | Type | Description | Features | Required |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------ | -------- | ----------------------------------------- | -------- | -------- |
|
||||
| `APPRISE` | [_publisher_apprise](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_apprise/) | ▶️ | Apprise notification proxy | | |
|
||||
| `ARPSCAN` | [arp_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/arp_scan/) | 🔍 | ARP-scan on current network | | |
|
||||
| `AVAHISCAN` | [avahi_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/avahi_scan/) | 🆎 | Avahi (mDNS-based) name resolution | | |
|
||||
| `ASUSWRT` | [asuswrt_import](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/asuswrt_import/) | 🔍 | Import connected devices from AsusWRT | | |
|
||||
| `CSVBCKP` | [csv_backup](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/csv_backup/) | ⚙ | CSV devices backup | | |
|
||||
| `CUSTPROP` | [custom_props](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/custom_props/) | ⚙ | Managing custom device properties values | | Yes |
|
||||
| `DBCLNP` | [db_cleanup](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/db_cleanup/) | ⚙ | Database cleanup | | Yes\* |
|
||||
| `DDNS` | [ddns_update](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/ddns_update/) | ⚙ | DDNS update | | |
|
||||
| `DHCPLSS` | [dhcp_leases](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/dhcp_leases/) | 🔍/📥/🆎 | Import devices from DHCP leases | | |
|
||||
| `DHCPSRVS` | [dhcp_servers](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/dhcp_servers/) | ♻ | DHCP servers | | |
|
||||
| `DIGSCAN` | [dig_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/dig_scan/) | 🆎 | Dig (DNS) Name resolution | | |
|
||||
| `FREEBOX` | [freebox](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/freebox/) | 🔍/♻/🆎 | Pull data and names from Freebox/Iliadbox | | |
|
||||
| `ICMP` | [icmp_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/icmp_scan/) | ♻ | ICMP (ping) status checker | | |
|
||||
| `INTRNT` | [internet_ip](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/internet_ip/) | 🔍 | Internet IP scanner | | |
|
||||
| `INTRSPD` | [internet_speedtest](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/internet_speedtest/) | ♻ | Internet speed test | | |
|
||||
| `IPNEIGH` | [ipneigh](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/ipneigh/) | 🔍 | Scan ARP (IPv4) and NDP (IPv6) tables | | |
|
||||
| `LUCIRPC` | [luci_import](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/luci_import/) | 🔍 | Import connected devices from OpenWRT | | |
|
||||
| `MAINT` | [maintenance](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/maintenance/) | ⚙ | Maintenance of logs, etc. | | |
|
||||
| `MQTT` | [_publisher_mqtt](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_mqtt/) | ▶️ | MQTT for synching to Home Assistant | | |
|
||||
| `NBTSCAN` | [nbtscan_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nbtscan_scan/) | 🆎 | Nbtscan (NetBIOS-based) name resolution | | |
|
||||
| `NEWDEV` | [newdev_template](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/newdev_template/) | ⚙ | New device template | | Yes |
|
||||
| `NMAP` | [nmap_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan/) | ♻ | Nmap port scanning & discovery | | |
|
||||
| `NMAPDEV` | [nmap_dev_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_dev_scan/) | 🔍 | Nmap dev scan on current network | | |
|
||||
| `NSLOOKUP` | [nslookup_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nslookup_scan/) | 🆎 | NSLookup (DNS-based) name resolution | | |
|
||||
| `NTFPRCS` | [notification_processing](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/notification_processing/) | ⚙ | Notification processing | | Yes |
|
||||
| `NTFY` | [_publisher_ntfy](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_ntfy/) | ▶️ | NTFY notifications | | |
|
||||
| `OMDSDN` | [omada_sdn_imp](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/omada_sdn_imp/) | 📥/🆎 ❌ | UNMAINTAINED use `OMDSDNOPENAPI` | 🖧 🔄 | |
|
||||
| `OMDSDNOPENAPI` | [omada_sdn_openapi](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/omada_sdn_openapi/) | 📥/🆎 | OMADA TP-Link import via OpenAPI | 🖧 | |
|
||||
| `PIHOLE` | [pihole_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/pihole_scan/) | 🔍/🆎/📥 | Pi-hole device import & sync | | |
|
||||
| `PUSHSAFER` | [_publisher_pushsafer](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_pushsafer/) | ▶️ | Pushsafer notifications | | |
|
||||
| `PUSHOVER` | [_publisher_pushover](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_pushover/) | ▶️ | Pushover notifications | | |
|
||||
| `SETPWD` | [set_password](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password/) | ⚙ | Set password | | Yes |
|
||||
| `SMTP` | [_publisher_email](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_email/) | ▶️ | Email notifications | | |
|
||||
| `SNMPDSC` | [snmp_discovery](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/snmp_discovery/) | 🔍/📥 | SNMP device import & sync | | |
|
||||
| `SYNC` | [sync](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/sync/) | 🔍/⚙/📥 | Sync & import from NetAlertX instances | 🖧 🔄 | Yes |
|
||||
| `TELEGRAM` | [_publisher_telegram](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_telegram/) | ▶️ | Telegram notifications | | |
|
||||
| `UI` | [ui_settings](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/ui_settings/) | ♻ | UI specific settings | | Yes |
|
||||
| `UNFIMP` | [unifi_import](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/unifi_import/) | 🔍/📥/🆎 | UniFi device import & sync | 🖧 | |
|
||||
| `VNDRPDT` | [vendor_update](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/vendor_update/) | ⚙ | Vendor database update | | |
|
||||
| `WEBHOOK` | [_publisher_webhook](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_webhook/) | ▶️ | Webhook notifications | | |
|
||||
| `WEBMON` | [website_monitor](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/website_monitor/) | ♻ | Website down monitoring | | |
|
||||
| `WOL` | [wake_on_lan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/wake_on_lan/) | ♻ | Automatic wake-on-lan | | |
|
||||
|
||||
|
||||
> \* The database cleanup plugin (`DBCLNP`) is not _required_ but the app will become unusable after a while if not executed.
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
# Docker Update Strategies to upgrade NetAlertX
|
||||
|
||||
> [!WARNING]
|
||||
> For versions prior to `v25.6.7` upgrade to version `v25.5.24` first (`docker pull ghcr.io/jokob-sk/netalertx:25.5.24`) as later versions don't support a full upgrade. Alternatovelly, devices and settings can be migrated manually, e.g. via [CSV import](./DEVICES_BULK_EDITING.md).
|
||||
> For versions prior to `v25.6.7` upgrade to version `v25.5.24` first (`docker pull ghcr.io/jokob-sk/netalertx:25.5.24`) as later versions don't support a full upgrade. Alternatively, devices and settings can be migrated manually, e.g. via [CSV import](./DEVICES_BULK_EDITING.md).
|
||||
|
||||
This guide outlines approaches for updating Docker containers, usually when upgrading to a newer version of NetAlertX. Each method offers different benefits depending on the situation. Here are the methods:
|
||||
|
||||
- Manual: Direct commands to stop, remove, and rebuild containers.
|
||||
- Dockcheck: Semi-automated with more control, suited for bulk updates.
|
||||
- Watchtower: Fully automated, runs continuously to check and update containers.
|
||||
- Portainer: Manual with UI.
|
||||
|
||||
You can choose any approach that fits your workflow.
|
||||
|
||||
@@ -107,10 +108,42 @@ docker run -d \
|
||||
|
||||
```
|
||||
|
||||
## 4. Portainer controlled image
|
||||
|
||||
This assumes you're using Portainer to manage Docker (or Docker Swarm) and want to pull the latest version of an image and redeploy the container.
|
||||
|
||||
> [!NOTE]
|
||||
> * Portainer does **not auto-update** containers. For automation, use **Watchtower** or similar tools.
|
||||
> * Make sure you have the [persistent volumes mounted or backups ready](BACKUPS.md) before recreating.
|
||||
|
||||
### 4.1 Steps to Update an Image in Portainer (Standalone Docker)
|
||||
|
||||
1. **Login to Portainer.**
|
||||
2. Go to **"Containers"** in the left sidebar.
|
||||
3. Find the container you want to update, click its name.
|
||||
4. Click **"Recreate"** (top right).
|
||||
5. **Tick**: _Pull latest image_ (this ensures Portainer fetches the newest version from Docker Hub or your registry).
|
||||
6. Click **"Recreate"** again.
|
||||
7. Wait for the container to be stopped, removed, and recreated with the updated image.
|
||||
|
||||
### 4.2 For Docker Swarm Services
|
||||
|
||||
If you're using Docker Swarm (under **"Stacks"** or **"Services"**):
|
||||
|
||||
1. Go to **"Stacks"**.
|
||||
2. Select the stack managing the container.
|
||||
3. Click **"Editor"** (or "Update the Stack").
|
||||
4. Add a version tag or use `:latest` if your image tag is `latest` (not recommended for production).
|
||||
5. Click **"Update the Stack"**. ⚠ Portainer will not pull the new image unless the tag changes OR the stack is forced to recreate.
|
||||
6. If image tag hasn't changed, go to **"Services"**, find the service, and click **"Force Update"**.
|
||||
|
||||
## Summary
|
||||
|
||||
- Manual: Ideal for individual or critical updates.
|
||||
- Dockcheck: Suitable for controlled, mass updates.
|
||||
- Watchtower: Fully automated, best for continuous deployment setups.
|
||||
| Method | Type | Pros | Cons |
|
||||
|------------|--------------|----------------------------------|------------------------------|
|
||||
| Manual | CLI | Full control, no dependencies | Tedious for many containers |
|
||||
| Dockcheck | CLI Script | Great for batch updates | Needs setup, semi-automated |
|
||||
| Watchtower | Daemonized | Fully automated updates | Less control, version drift |
|
||||
| Portainer | UI | Easy via web interface | No auto-updates |
|
||||
|
||||
These approaches allow you to maintain flexibility in how you update Docker containers, depending on the urgency and scale of the update.
|
||||
|
||||
@@ -63,68 +63,8 @@ You can include multiple actions that should execute once the conditions are met
|
||||
|
||||
# Examples
|
||||
|
||||
Below you can find a couple of configuration examples.
|
||||
You can find a couple of configuration examples in [Workflow Examples](WORKFLOW_EXAMPLES.md).
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
## Example 1: Assign Device to Network Node Based on IP
|
||||
|
||||
This workflow assigns newly added devices with IP addresses in the `192.168.1.*` range to the device with the MAC address `6c:6d:6d:6c:6c:6c`.
|
||||
|
||||
### Trigger:
|
||||
- **Object Type**: `Devices`
|
||||
- **Event Type**: `insert`
|
||||
|
||||
### Conditions:
|
||||
- **Logic**: `AND`
|
||||
- `Field`: `devLastIP`
|
||||
- `Operator`: `contains`
|
||||
- `Value`: `192.168.1.`
|
||||
|
||||
This condition ensures that the workflow only applies to devices with an IP address in the `192.168.1.*` range.
|
||||
|
||||
### Actions:
|
||||
- **Action Type**: `update_field`
|
||||
- **Field**: `devNetworkNode`
|
||||
- **Value**: `6c:6d:6d:6c:6c:6c`
|
||||
|
||||
---
|
||||
|
||||
## Example 2: Mark Device as Not New and Delete If from Google Vendor
|
||||
|
||||
This workflow automates the process of marking Google devices as not new and deleting them if they meet the criteria.
|
||||
|
||||
### Trigger:
|
||||
- **Object Type**: `Devices`
|
||||
- **Event Type**: `update`
|
||||
|
||||
### Conditions:
|
||||
- **Logic**: `AND`
|
||||
- `Field`: `devVendor`
|
||||
- `Operator`: `contains`
|
||||
- `Value`: `Google`
|
||||
|
||||
This condition checks if the device's vendor is `Google`.
|
||||
|
||||
- **Logic**: `AND`
|
||||
- `Field`: `devIsNew`
|
||||
- `Operator`: `equals`
|
||||
- `Value`: `1`
|
||||
|
||||
This ensures the workflow applies only to new devices.
|
||||
|
||||
### Actions:
|
||||
1. **Action Type**: `update_field`
|
||||
- **Field**: `devIsNew`
|
||||
- **Value**: `0`
|
||||
|
||||
This action marks the device as no longer new.
|
||||
|
||||
2. **Action Type**: `delete_device`
|
||||
|
||||
This action deletes the device after it is marked as not new.
|
||||
|
||||
> [!TIP]
|
||||
> Share your workflows in [Discord](https://discord.com/invite/NczTUTWyRr) or [GitHub Discussions](https://github.com/jokob-sk/NetAlertX/discussions).
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
Workflows in NetAlertX automate actions based on real-time events and conditions. Below are practical examples that demonstrate how to build automation using triggers, conditions, and actions.
|
||||
|
||||
## Un-archive devices if detected online
|
||||
## Example 1: Un-archive devices if detected online
|
||||
|
||||
This workflow automatically unarchives a device if it was previously archived but has now been detected as online.
|
||||
|
||||
@@ -57,4 +57,129 @@ Sometimes devices are manually archived (e.g., no longer expected on the network
|
||||
|
||||
### ✅ Result
|
||||
|
||||
Whenever a previously archived device shows up during a network scan, it will be automatically unarchived — allowing it to reappear in your device lists and dashboards.
|
||||
Whenever a previously archived device shows up during a network scan, it will be automatically unarchived — allowing it to reappear in your device lists and dashboards.
|
||||
|
||||
|
||||
Here is your updated version of **Example 2** and **Example 3**, fully aligned with the format and structure of **Example 1** for consistency and professionalism:
|
||||
|
||||
---
|
||||
|
||||
## Example 2: Assign Device to Network Node Based on IP
|
||||
|
||||
This workflow assigns newly added devices with IP addresses in the `192.168.1.*` range to a specific network node with MAC address `6c:6d:6d:6c:6c:6c`.
|
||||
|
||||
### 📋 Use Case
|
||||
|
||||
When new devices join your network, assigning them to the correct network node is important for accurate topology and grouping. This workflow ensures devices in a specific subnet are automatically linked to the intended node.
|
||||
|
||||
### ⚙️ Workflow Configuration
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Assign Device to Network Node Based on IP",
|
||||
"trigger": {
|
||||
"object_type": "Devices",
|
||||
"event_type": "insert"
|
||||
},
|
||||
"conditions": [
|
||||
{
|
||||
"logic": "AND",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "devLastIP",
|
||||
"operator": "contains",
|
||||
"value": "192.168.1."
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"type": "update_field",
|
||||
"field": "devNetworkNode",
|
||||
"value": "6c:6d:6d:6c:6c:6c"
|
||||
}
|
||||
],
|
||||
"enabled": "Yes"
|
||||
}
|
||||
```
|
||||
|
||||
### 🔍 Explanation
|
||||
|
||||
* **Trigger**: Activates when a new device is added.
|
||||
* **Condition**:
|
||||
|
||||
* `devLastIP` contains `192.168.1.` (matches subnet).
|
||||
* **Action**:
|
||||
|
||||
* Sets `devNetworkNode` to the specified MAC address.
|
||||
|
||||
### ✅ Result
|
||||
|
||||
New devices with IPs in the `192.168.1.*` subnet are automatically assigned to the correct network node, streamlining device organization and reducing manual work.
|
||||
|
||||
---
|
||||
|
||||
## Example 3: Mark Device as Not New and Delete If from Google Vendor
|
||||
|
||||
This workflow automatically marks newly detected Google devices as not new and deletes them immediately.
|
||||
|
||||
### 📋 Use Case
|
||||
|
||||
You may want to automatically clear out newly detected Google devices (such as Chromecast or Google Home) if they’re not needed in your device database. This workflow handles that clean-up automatically.
|
||||
|
||||
### ⚙️ Workflow Configuration
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Mark Device as Not New and Delete If from Google Vendor",
|
||||
"trigger": {
|
||||
"object_type": "Devices",
|
||||
"event_type": "update"
|
||||
},
|
||||
"conditions": [
|
||||
{
|
||||
"logic": "AND",
|
||||
"conditions": [
|
||||
{
|
||||
"field": "devVendor",
|
||||
"operator": "contains",
|
||||
"value": "Google"
|
||||
},
|
||||
{
|
||||
"field": "devIsNew",
|
||||
"operator": "equals",
|
||||
"value": "1"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"type": "update_field",
|
||||
"field": "devIsNew",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"type": "delete_device"
|
||||
}
|
||||
],
|
||||
"enabled": "Yes"
|
||||
}
|
||||
```
|
||||
|
||||
### 🔍 Explanation
|
||||
|
||||
* **Trigger**: Runs on device updates.
|
||||
* **Conditions**:
|
||||
|
||||
* Vendor contains `Google`.
|
||||
* Device is marked as new (`devIsNew` is `1`).
|
||||
* **Actions**:
|
||||
|
||||
1. Set `devIsNew` to `0` (mark as not new).
|
||||
2. Delete the device.
|
||||
|
||||
### ✅ Result
|
||||
|
||||
Any newly detected Google devices are cleaned up instantly — first marked as not new, then deleted — helping you avoid clutter in your device records.
|
||||
|
Before Width: | Height: | Size: 100 KiB |
BIN
docs/img/NETWORK_TREE/Network_Assign.png
Executable file
|
After Width: | Height: | Size: 73 KiB |
BIN
docs/img/NETWORK_TREE/Network_Assigned_Nodes.png
Executable file
|
After Width: | Height: | Size: 92 KiB |
BIN
docs/img/NETWORK_TREE/Network_Device_Details.png
Executable file
|
After Width: | Height: | Size: 58 KiB |
BIN
docs/img/NETWORK_TREE/Network_Device_Details_Parent.png
Executable file
|
After Width: | Height: | Size: 34 KiB |
BIN
docs/img/NETWORK_TREE/Network_Device_ParentDropdown.png
Executable file
|
After Width: | Height: | Size: 42 KiB |
BIN
docs/img/NETWORK_TREE/Network_Device_type.png
Executable file
|
After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 185 KiB |
|
Before Width: | Height: | Size: 89 KiB |
BIN
docs/img/NETWORK_TREE/Network_Sample.png
Executable file
|
After Width: | Height: | Size: 81 KiB |
BIN
docs/img/NETWORK_TREE/Network_tree_setup_hover.png
Executable file
|
After Width: | Height: | Size: 84 KiB |
@@ -1,3 +1,8 @@
|
||||
<span class="helpIcon">
|
||||
<a target="_blank" href="https://github.com/jokob-sk/NetAlertX/blob/main/docs/WORKFLOWS_DEBUGGING.md">
|
||||
<i class="fa fa-circle-question"></i>
|
||||
</a>
|
||||
</span>
|
||||
<section class="content">
|
||||
<div class="nav-tabs-custom app-event-content" style="margin-bottom: 0px;">
|
||||
<ul id="tabs-location" class="nav nav-tabs col-sm-2 hidden">
|
||||
|
||||
@@ -12,10 +12,12 @@
|
||||
----------------------------------------------------------------------------- */
|
||||
:root {
|
||||
--color-aqua: #00c0ef;
|
||||
--color-lightblue: #3c8dbc;
|
||||
--color-blue: #0060df;
|
||||
--color-green: #00a65a;
|
||||
--color-yellow: #f39c12;
|
||||
--color-red: #dd4b39;
|
||||
--color-gray: #8c8c8c;
|
||||
}
|
||||
|
||||
.input-group .checkbox
|
||||
@@ -28,6 +30,45 @@ h5
|
||||
font-size: medium;
|
||||
}
|
||||
|
||||
a[target="_blank"] {
|
||||
position: relative;
|
||||
display: inline-block; /* Needed for positioning */
|
||||
padding-right: 0.6em; /* Space for the icon */
|
||||
}
|
||||
|
||||
a[target="_blank"]::after {
|
||||
content: '↗';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
font-size: 0.75em;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.select2 .hover-node-info::after {
|
||||
padding-left: 1px ;
|
||||
}
|
||||
|
||||
/* .node-standard-device .netNodeText::after
|
||||
{
|
||||
right: -7px;
|
||||
top: 1px;
|
||||
} */
|
||||
|
||||
/* .select2-container--default .select2-selection--multiple .select2-selection__choice
|
||||
{
|
||||
padding-right: 15px !important;
|
||||
} */
|
||||
|
||||
.hoverHighlight
|
||||
{
|
||||
opacity: 0.7;
|
||||
}
|
||||
.hoverHighlight:hover
|
||||
{
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
Helper Classes
|
||||
----------------------------------------------------------------------------- */
|
||||
@@ -48,6 +89,7 @@ h5
|
||||
float: inline-end;
|
||||
}
|
||||
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
Text Classes
|
||||
----------------------------------------------------------------------------- */
|
||||
@@ -340,6 +382,11 @@ body
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.networkTable .nav-tabs-custom
|
||||
{
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.pa-small-box-2 .inner h3 {
|
||||
margin-left: 0em;
|
||||
margin-bottom: 1.3em;
|
||||
@@ -474,7 +521,7 @@ body
|
||||
}
|
||||
|
||||
.bottom-border-primary {
|
||||
border-bottom-color: #3c8dbc;
|
||||
border-bottom-color: var(--color-lightblue);
|
||||
border-bottom-style: solid;
|
||||
border-bottom-width: 3px
|
||||
}
|
||||
@@ -879,6 +926,10 @@ height: 50px;
|
||||
margin: 10px;
|
||||
padding: 10px;
|
||||
}
|
||||
#notifications .notification-box{
|
||||
min-height: 90vh;
|
||||
}
|
||||
|
||||
|
||||
#notificationData textarea{
|
||||
width: 100%;
|
||||
@@ -1032,7 +1083,7 @@ height: 50px;
|
||||
|
||||
.myhidden
|
||||
{
|
||||
display:none;
|
||||
display:none !important;
|
||||
}
|
||||
|
||||
.center
|
||||
@@ -1354,6 +1405,7 @@ input[readonly] {
|
||||
|
||||
.iconPreview {
|
||||
min-width: 40px;
|
||||
/* display: inherit; */
|
||||
}
|
||||
|
||||
.iconPreview svg{
|
||||
@@ -1399,7 +1451,8 @@ input[readonly] {
|
||||
cursor: -webkit-grab;
|
||||
}
|
||||
|
||||
.select2-container--default .select2-selection--multiple .select2-selection__choice
|
||||
#settingsPage .select2-container--default .select2-selection--multiple .select2-selection__choice,
|
||||
#maintenancePage .select2-container--default .select2-selection--multiple .select2-selection__choice
|
||||
{
|
||||
background-color:#258744 !important;
|
||||
}
|
||||
@@ -1413,6 +1466,15 @@ input[readonly] {
|
||||
background-color:#606060 !important;
|
||||
}
|
||||
|
||||
.select2-container--default .select2-selection--multiple,
|
||||
.select2-container--default .select2-selection--single
|
||||
{
|
||||
border-radius: 0px !important;
|
||||
border-color: #d2d6de !important;
|
||||
min-height: 42px;
|
||||
}
|
||||
|
||||
|
||||
.helpIconSmallTopRight{
|
||||
position: absolute;
|
||||
font-size: x-small;
|
||||
@@ -1449,6 +1511,11 @@ input[readonly] {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#panDetails .input-group {
|
||||
|
||||
min-height: 40px;
|
||||
}
|
||||
|
||||
#devicePageInfoPlc
|
||||
{
|
||||
display: none;
|
||||
@@ -1527,18 +1594,98 @@ input[readonly] {
|
||||
}
|
||||
/* #panDetails .dataTables_wrapper .bottom .paging_simple_numbers */
|
||||
|
||||
#panDetails #NEWDEV_devIcon
|
||||
{
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#panDetails #NEWDEV_devCustomProps_label
|
||||
{
|
||||
display: none;
|
||||
}
|
||||
|
||||
#deviceDetailsEdit .select2-container--default .select2-selection--multiple .select2-selection__choice a
|
||||
{
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#deviceDetailsEdit .iconPreview svg
|
||||
{
|
||||
height: 14px;
|
||||
}
|
||||
|
||||
#deviceDetailsEdit .select2-container--default .select2-selection--multiple .select2-selection__choice
|
||||
{
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
#deviceDetailsEdit .select2-container--disabled
|
||||
{
|
||||
background-color: #606060;
|
||||
}
|
||||
|
||||
#deviceDetailsEdit .select2-container--default .select2-selection--multiple .select2-selection__choice span
|
||||
{
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#deviceDetailsEdit .select2-selection
|
||||
{
|
||||
width: initial;
|
||||
display: inline-block;
|
||||
min-height: 42px;
|
||||
}
|
||||
|
||||
/* Remove the default Select2 chevron (the down arrow) */
|
||||
.select2-container .select2-selection__arrow b {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* Add custom icon */
|
||||
.select2-container .select2-selection__arrow::after {
|
||||
font-family: 'Font Awesome 6 Free';
|
||||
content: "\f078"; /* fa-chevron-down */
|
||||
font-weight: 700;
|
||||
position: absolute;
|
||||
top: 75%;
|
||||
left: 30%;
|
||||
transform: translate(-50%, -50%);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
#deviceDetailsEdit .form-control
|
||||
{
|
||||
min-height: 42px;
|
||||
}
|
||||
|
||||
.select2-selection--single .custom-chip
|
||||
{
|
||||
margin-top: 11px;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.select2-container--default .select2-selection--single .select2-selection__rendered,
|
||||
.select2-container--default .select2-selection--single, .select2-selection .select2-selection--single
|
||||
{
|
||||
padding: 0px 0px;
|
||||
min-height: 42px;
|
||||
}
|
||||
|
||||
/* .select2-container--default .select2-selection--single .select2-selection__rendered, */
|
||||
.select2-container--default .select2-selection--single
|
||||
{
|
||||
/* color:initial !important; */
|
||||
background-color:initial !important;
|
||||
}
|
||||
|
||||
|
||||
#deviceDetailsEdit .select2-container
|
||||
{
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
#deviceDetailsEdit .select2-container .selection
|
||||
{
|
||||
width: 100% !important;
|
||||
display: inline-grid;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------- */
|
||||
/* MODAL popups */
|
||||
/* ----------------------------------------------------------------- */
|
||||
@@ -1557,10 +1704,30 @@ input[readonly] {
|
||||
/* NETWORK page */
|
||||
/* ----------------------------------------------------------------- */
|
||||
|
||||
.hide-node-names .node-name {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#toggleFilters
|
||||
{
|
||||
display: block;
|
||||
position: fixed;
|
||||
padding-left: 32px;
|
||||
padding-top: 10px;
|
||||
background-color: inherit;
|
||||
z-index: 3;
|
||||
width: 190px;
|
||||
box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
/* AdminLTE overrides */
|
||||
.content-wrapper {
|
||||
min-height: calc(100vh - 31px) !important;
|
||||
}
|
||||
|
||||
#networkTree .box
|
||||
{
|
||||
/* border-top:1px; */
|
||||
border-width:1px;
|
||||
border-top-color:grey;
|
||||
padding:0px;
|
||||
margin:0px;
|
||||
@@ -1596,6 +1763,7 @@ input[readonly] {
|
||||
opacity: 0.3;
|
||||
display: initial;
|
||||
float: left;
|
||||
width: 1em;
|
||||
}
|
||||
|
||||
#networkTree
|
||||
@@ -1619,6 +1787,42 @@ input[readonly] {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
#hover-box
|
||||
{
|
||||
background-color: #ffffff;;
|
||||
}
|
||||
|
||||
#hover-box .iconPreview
|
||||
{
|
||||
padding: 0px;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
#hover-box .devName
|
||||
{
|
||||
font-size: larger;
|
||||
display: contents;
|
||||
}
|
||||
|
||||
#hover-box b
|
||||
{
|
||||
float: left;
|
||||
}
|
||||
|
||||
#hover-box .line
|
||||
{
|
||||
float: left;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#hover-box span
|
||||
{
|
||||
float: right;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
display: block;
|
||||
max-width: 200px;
|
||||
}
|
||||
|
||||
#networkTree .netCollapse
|
||||
{
|
||||
@@ -1626,11 +1830,39 @@ input[readonly] {
|
||||
right: 0;
|
||||
margin-right: -3px;
|
||||
}
|
||||
|
||||
/* var(--color-aqua);
|
||||
--color-aqua: #00c0ef;
|
||||
--color-blue: #0060df;
|
||||
--color-green: #00a65a;
|
||||
--color-yellow: #f39c12;
|
||||
--color-red: #dd4b39; */
|
||||
|
||||
#networkTree .node-inner.node-network-device:hover
|
||||
{
|
||||
box-shadow: var(--color-aqua) 0px 0px 20px;
|
||||
}
|
||||
|
||||
#networkTree .node-inner.node-standard-device:hover
|
||||
{
|
||||
box-shadow: var(--color-gray) 0px 0px 10px;
|
||||
}
|
||||
|
||||
#networkTree .network-hw-icon
|
||||
{
|
||||
position: absolute;
|
||||
margin-left: -0.4em;
|
||||
opacity: 0.3;
|
||||
margin-top: 0.1em;
|
||||
}
|
||||
|
||||
#networkTree .highlightedNode
|
||||
{
|
||||
/* border: solid; */
|
||||
border-color:cyan;
|
||||
border-color:var(--color-lightblue);
|
||||
box-shadow: var(--color-lightblue) 0px 0px 20px;
|
||||
}
|
||||
|
||||
#networkTree .netStatus-Off-line i,
|
||||
#networkTree .netStatus-Off-line svg
|
||||
{
|
||||
@@ -1654,6 +1886,23 @@ input[readonly] {
|
||||
/* margin-left: 0.2em; */
|
||||
}
|
||||
|
||||
.networkTable
|
||||
{
|
||||
padding-bottom: 1px;
|
||||
z-index: 3;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.networkNodeTabHeaders .icon i
|
||||
{
|
||||
padding-top: 8px !important;
|
||||
padding-left: 6px !important;
|
||||
}
|
||||
|
||||
.networkTable .box-body {
|
||||
padding-top: 5px;
|
||||
}
|
||||
|
||||
.networkTable .networkNodeTabHeaders a {
|
||||
display: block;
|
||||
height: 3em;
|
||||
@@ -1682,6 +1931,8 @@ input[readonly] {
|
||||
text-wrap: nowrap;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@media (max-width: 767px) {
|
||||
|
||||
.networkNodeTabHeaders .node-name
|
||||
@@ -1712,7 +1963,10 @@ input[readonly] {
|
||||
/* PLUGINS page */
|
||||
/* ----------------------------------------------------------------- */
|
||||
|
||||
|
||||
#tabs-location
|
||||
{
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
.plugin-filters
|
||||
{
|
||||
@@ -1727,15 +1981,31 @@ input[readonly] {
|
||||
padding-bottom: 0px;
|
||||
}
|
||||
|
||||
.plugin-content .left-nav{
|
||||
.plugin-content .nav-tabs li a
|
||||
{
|
||||
border-right-width: 0px;
|
||||
}
|
||||
|
||||
#tabs-content-location-wrap
|
||||
{
|
||||
min-height: 90vh;
|
||||
}
|
||||
|
||||
#tabs-content-location textarea {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.plugin-content .left-nav{
|
||||
width: calc(100%);
|
||||
padding-right: 0px;
|
||||
z-index: 2;
|
||||
background-color: inherit !important;
|
||||
}
|
||||
|
||||
.plugin-content #tabs-content-location
|
||||
{
|
||||
margin: 0px;
|
||||
/* padding-top: 0; */
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
.integrations-plugins .content
|
||||
@@ -1803,6 +2073,9 @@ input[readonly] {
|
||||
.pluginBadge
|
||||
{
|
||||
float: right;
|
||||
margin-right: 10px;
|
||||
opacity: 0.6;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.pluginBadgeWrap
|
||||
@@ -1811,42 +2084,51 @@ input[readonly] {
|
||||
display: ruby;
|
||||
z-index: 1;
|
||||
position: sticky;
|
||||
margin-top: 1px;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
Spin
|
||||
----------------------------------------------------------------------------- */
|
||||
#loadingSpinner {
|
||||
position: fixed;
|
||||
z-index: 1000;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s ease-in-out;
|
||||
pointer-events: none;
|
||||
display: block;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
#loadingSpinner.visible {
|
||||
opacity: 1;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
.pa_semitransparent-panel {
|
||||
position: absolute;
|
||||
width: 100%; /*calc (100% -40px);*/
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
left: 0;
|
||||
top: 0;
|
||||
display: block;
|
||||
|
||||
opacity: 0.8;
|
||||
background-color: #fff;
|
||||
z-index: 800;
|
||||
opacity: 0.8;
|
||||
z-index: 99;
|
||||
}
|
||||
|
||||
.pa_spinner {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
right: 0;
|
||||
position: absolute;
|
||||
top: 100px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
padding: 15px;
|
||||
width: 200px;
|
||||
background-color: #fff;
|
||||
z-index: 801;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
#loadingSpinner
|
||||
{
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
/* Multi-edit adjustements */
|
||||
.box-header
|
||||
|
||||
@@ -10,6 +10,16 @@
|
||||
*
|
||||
* Additional fixes For Pi.Alert UI by leiweibau */
|
||||
|
||||
:root {
|
||||
--color-aqua: #00c0ef;
|
||||
--color-lightblue: #3c8dbc;
|
||||
--color-blue: #0060df;
|
||||
--color-green: #00a65a;
|
||||
--color-yellow: #f39c12;
|
||||
--color-red: #dd4b39;
|
||||
--color-gray: #8c8c8c;
|
||||
}
|
||||
|
||||
:root {
|
||||
--datatable-bgcolor: rgba(64, 76, 88, 0.8);
|
||||
}
|
||||
@@ -722,7 +732,7 @@ input[type="password"]::-webkit-caps-lock-indicator {
|
||||
margin-left: 0px;
|
||||
}
|
||||
.small-box:hover .icon {
|
||||
font-size: 3.74em;
|
||||
font-size: 3em;
|
||||
}
|
||||
.small-box .icon {
|
||||
top: 0.01em;
|
||||
@@ -732,6 +742,36 @@ input[type="password"]::-webkit-caps-lock-indicator {
|
||||
background-color: #000 !important;
|
||||
}
|
||||
|
||||
|
||||
.select2-container--default .select2-selection--single {
|
||||
color: initial !important;
|
||||
background-color: #353c42 !important;
|
||||
}
|
||||
|
||||
/* Chevron color */
|
||||
.select2-container .select2-selection__arrow::after {
|
||||
color: #bec5cb;
|
||||
}
|
||||
|
||||
/* Chevron color */
|
||||
.select2-selection .select2-selection--single {
|
||||
color: #bec5cb;
|
||||
}
|
||||
|
||||
.select2-container--default .select2-selection--multiple, .select2-container--default .select2-selection--single {
|
||||
border-color: #3d444b !important;
|
||||
}
|
||||
|
||||
.select2-container--default .select2-selection--single .select2-selection__rendered .custom-chip
|
||||
{
|
||||
color: #bec5cb;
|
||||
}
|
||||
|
||||
#hover-box
|
||||
{
|
||||
background-color: #353c42 !important;
|
||||
}
|
||||
|
||||
.callout code {
|
||||
background-color: #fff !important;
|
||||
color:#000 !important;
|
||||
@@ -740,4 +780,9 @@ input[type="password"]::-webkit-caps-lock-indicator {
|
||||
.thresholdFormControl
|
||||
{
|
||||
color:#000;
|
||||
}
|
||||
|
||||
.btn:hover
|
||||
{
|
||||
color: var(--color-gray);
|
||||
}
|
||||
@@ -11,6 +11,16 @@
|
||||
* Additional fixes For Pi.Alert UI by leiweibau */
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
|
||||
:root {
|
||||
--color-aqua: #00c0ef;
|
||||
--color-lightblue: #3c8dbc;
|
||||
--color-blue: #0060df;
|
||||
--color-green: #00a65a;
|
||||
--color-yellow: #f39c12;
|
||||
--color-red: #dd4b39;
|
||||
--color-gray: #8c8c8c;
|
||||
}
|
||||
|
||||
:root {
|
||||
--datatable-bgcolor: rgba(64, 76, 88, 0.8);
|
||||
@@ -651,8 +661,14 @@
|
||||
border-color: #888888;
|
||||
}
|
||||
.table-hover tbody tr:hover td, .table-hover tbody tr:hover th {
|
||||
background-color: rgb(189,192,198);
|
||||
color: #444;
|
||||
background-color: var(--datatable-bgcolor);
|
||||
color: var(--fbc-white);
|
||||
}
|
||||
|
||||
table.dataTable tbody tr.selected, table.dataTable tbody tr .selected
|
||||
{
|
||||
background-color: var(--datatable-bgcolor);
|
||||
color: var(--fbc-white);
|
||||
}
|
||||
|
||||
.db_info_table_cell:nth-child(1) {background: #272c30}
|
||||
@@ -724,7 +740,7 @@
|
||||
margin-left: 0px;
|
||||
}
|
||||
.small-box:hover .icon {
|
||||
font-size: 3.74em;
|
||||
font-size: 3em;
|
||||
}
|
||||
.small-box .icon {
|
||||
top: 0.01em;
|
||||
@@ -734,6 +750,35 @@
|
||||
background-color: #000 !important;
|
||||
}
|
||||
|
||||
.select2-container--default .select2-selection--single {
|
||||
color: initial !important;
|
||||
background-color: #353c42 !important;
|
||||
}
|
||||
|
||||
/* Chevron color */
|
||||
.select2-container .select2-selection__arrow::after {
|
||||
color: #bec5cb;
|
||||
}
|
||||
|
||||
/* Chevron color */
|
||||
.select2-selection .select2-selection--single {
|
||||
color: #bec5cb;
|
||||
}
|
||||
|
||||
.select2-container--default .select2-selection--multiple, .select2-container--default .select2-selection--single {
|
||||
border-color: #3d444b !important;
|
||||
}
|
||||
|
||||
.select2-container--default .select2-selection--single .select2-selection__rendered .custom-chip
|
||||
{
|
||||
color: #bec5cb;
|
||||
}
|
||||
|
||||
#hover-box
|
||||
{
|
||||
background-color: #353c42 !important;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.callout code {
|
||||
@@ -746,3 +791,7 @@
|
||||
color:#000;
|
||||
}
|
||||
|
||||
.btn:hover
|
||||
{
|
||||
color: var(--color-gray);
|
||||
}
|
||||
@@ -16,8 +16,9 @@
|
||||
require 'php/templates/header.php';
|
||||
?>
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
showSpinner();
|
||||
</script>
|
||||
|
||||
<!-- Page ------------------------------------------------------------------ -->
|
||||
<div class="content-wrapper">
|
||||
@@ -125,15 +126,11 @@
|
||||
<div class="tab-content" style="min-height: 430px;">
|
||||
|
||||
<!-- tab page 1 ------------------------------------------------------------ -->
|
||||
<!--
|
||||
<div class="tab-pane fade in active" id="panDetails">
|
||||
-->
|
||||
<div class="tab-pane fade" id="panDetails">
|
||||
|
||||
<div class="tab-pane fade" id="panDetails">
|
||||
<?php
|
||||
require 'deviceDetailsEdit.php';
|
||||
?>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- tab page 2 ------------------------------------------------------------ -->
|
||||
@@ -141,51 +138,38 @@
|
||||
<?php
|
||||
require 'deviceDetailsSessions.php';
|
||||
?>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<!-- tab page "Tools" ------------------------------------------------------------ -->
|
||||
|
||||
<div class="tab-pane fade" id="panTools">
|
||||
|
||||
<?php
|
||||
require 'deviceDetailsTools.php';
|
||||
?>
|
||||
|
||||
|
||||
?>
|
||||
</div>
|
||||
|
||||
<!-- tab page 3 ------------------------------------------------------------ -->
|
||||
<div class="tab-pane fade table-responsive" id="panPresence">
|
||||
|
||||
<div class="tab-pane fade table-responsive" id="panPresence">
|
||||
<?php
|
||||
// Include the other page
|
||||
include 'deviceDetailsPresence.php';
|
||||
?>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- tab page 4 ------------------------------------------------------------ -->
|
||||
<div class="tab-pane fade table-responsive" id="panEvents">
|
||||
|
||||
<?php
|
||||
// Include the other page
|
||||
include 'deviceDetailsEvents.php';
|
||||
?>
|
||||
|
||||
|
||||
?>
|
||||
</div>
|
||||
|
||||
<!-- tab page 7 ------------------------------------------------------------ -->
|
||||
<div class="tab-pane fade table-responsive" id="panPlugins">
|
||||
|
||||
|
||||
<?php
|
||||
// Include the other page
|
||||
include 'pluginsCore.php';
|
||||
?>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -273,7 +257,7 @@ function main () {
|
||||
period = '1 day';
|
||||
sessionsRows = 50;
|
||||
eventsRows = 50;
|
||||
$('#chkHideConnectionEvents')[0].checked = eval(eventsHide == 'true');
|
||||
// $('#chkHideConnectionEvents')[0].checked = eval(eventsHide == 'true');
|
||||
|
||||
// Initialize components with parameters
|
||||
|
||||
@@ -282,26 +266,7 @@ function main () {
|
||||
$( document ).ready(function() {
|
||||
initializeTabs();
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
// Events tab toggle conenction events
|
||||
$('input').on('ifToggled', function(event){
|
||||
// Hide / Show Events
|
||||
if (event.currentTarget.id == 'chkHideConnectionEvents') {
|
||||
getDeviceEvents();
|
||||
} else {
|
||||
// Activate save & restore
|
||||
// activateSaveRestoreData();
|
||||
|
||||
// Ask skip notifications
|
||||
// if (event.currentTarget.id == 'chkArchived' ) {
|
||||
// askSkipNotifications();
|
||||
// }
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -328,6 +293,48 @@ function recordSwitch(direction) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------
|
||||
// Handle previous/next arrows/chevrons
|
||||
function updateChevrons(currentMac) {
|
||||
const devicesList = getDevicesList();
|
||||
|
||||
// Find the index of the device by MAC
|
||||
pos = devicesList.findIndex(item => item.devMac == currentMac);
|
||||
|
||||
// If device not found, optionally add it or handle error
|
||||
if (pos === -1) {
|
||||
// If you want to add a placeholder or handle missing device:
|
||||
// devicesList.push({ mac: currentMac, name: 'Unknown', type: 'Unknown' });
|
||||
// pos = devicesList.length - 1;
|
||||
|
||||
// Or just return early if device not found
|
||||
console.warn('Device with MAC not found:', currentMac);
|
||||
return;
|
||||
}
|
||||
|
||||
// Update the record number display
|
||||
$('#txtRecord').html((pos + 1) + ' / ' + devicesList.length);
|
||||
|
||||
// Enable/disable previous button
|
||||
if (pos <= 0) {
|
||||
$('#btnPrevious').attr('disabled', '');
|
||||
$('#btnPrevious').addClass('text-gray50');
|
||||
} else {
|
||||
$('#btnPrevious').removeAttr('disabled');
|
||||
$('#btnPrevious').removeClass('text-gray50');
|
||||
}
|
||||
|
||||
// Enable/disable next button
|
||||
if (pos >= devicesList.length - 1) {
|
||||
$('#btnNext').attr('disabled', '');
|
||||
$('#btnNext').addClass('text-gray50');
|
||||
} else {
|
||||
$('#btnNext').removeAttr('disabled');
|
||||
$('#btnNext').removeClass('text-gray50');
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
function performSwitch(direction)
|
||||
@@ -338,7 +345,9 @@ function performSwitch(direction)
|
||||
|
||||
// Update the global position in the devices list variable 'pos'
|
||||
if (direction === "next") {
|
||||
if (pos < devicesList.length - 1) {
|
||||
console.log("direction" + direction);
|
||||
|
||||
if (pos < devicesList.length) {
|
||||
pos++;
|
||||
}
|
||||
} else if (direction === "prev") {
|
||||
@@ -358,15 +367,12 @@ function performSwitch(direction)
|
||||
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Activate save & restore on any value change
|
||||
$(document).on('input', 'input:text', function() {
|
||||
settingsChanged();
|
||||
});
|
||||
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
function initializeTabs () {
|
||||
@@ -380,8 +386,6 @@ function initializeTabs () {
|
||||
}
|
||||
|
||||
$('.nav-tabs a[id='+ selectedTab +']').tab('show');
|
||||
// $('.nav-tabs a[id='+ selectedTab +']').parent().click();
|
||||
// $('.nav-tabs a[id="tabPlugins"]').tab('show');
|
||||
|
||||
// When changed save new current tab
|
||||
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
|
||||
@@ -391,11 +395,6 @@ function initializeTabs () {
|
||||
// events on tab change
|
||||
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
|
||||
var target = $(e.target).attr("href") // activated tab
|
||||
|
||||
// if(target == "#panTools")
|
||||
// {
|
||||
// // loadTools();
|
||||
// }
|
||||
});
|
||||
}
|
||||
|
||||
@@ -447,7 +446,7 @@ async function renderSmallBoxes() {
|
||||
"labelLang": "DevDetail_Shortcut_Presence",
|
||||
"iconId": "deviceEventsIcon",
|
||||
"iconClass": "fa fa-calendar",
|
||||
"dataValue": `${deviceData.devPresenceHours}h`
|
||||
"dataValue": `${deviceData.devPresenceHours ?? 0}h`
|
||||
},
|
||||
{
|
||||
"onclickEvent": "$('#tabEvents').trigger('click');",
|
||||
@@ -482,22 +481,41 @@ async function renderSmallBoxes() {
|
||||
console.error('Error in renderSmallBoxes:', error);
|
||||
} finally {
|
||||
// Hide loading dialog
|
||||
hideSpinner();
|
||||
// hideSpinner();
|
||||
}
|
||||
}
|
||||
|
||||
function updateDevicePageName(mac) {
|
||||
|
||||
name = getDevDataByMac(mac, "devName")
|
||||
owner = getDevDataByMac(mac, "devOwner")
|
||||
|
||||
// Page title - Name
|
||||
if (mac == "new") {
|
||||
$('#pageTitle').html(`<i title="${getString("Gen_create_new_device")}" class="fa fa-square-plus"></i> ` + getString("Gen_create_new_device"));
|
||||
$('#devicePageInfoPlc .inner').html(`<i class="fa fa-circle-info"></i> ` + getString("Gen_create_new_device_info"));
|
||||
$('#devicePageInfoPlc').show();
|
||||
} else if (owner == null || owner == '' ||
|
||||
(name.toString()).indexOf(owner) != -1) {
|
||||
$('#pageTitle').html(name);
|
||||
$('#devicePageInfoPlc').hide();
|
||||
} else {
|
||||
$('#pageTitle').html(name + ' (' + owner + ')');
|
||||
$('#devicePageInfoPlc').hide();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------------
|
||||
|
||||
|
||||
window.onload = function async()
|
||||
{
|
||||
initializeTabs();
|
||||
|
||||
updateChevrons(mac);
|
||||
updateDevicePageName(mac);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
?>
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="row" id="deviceDetailsEdit">
|
||||
<div class="box-body form-horizontal">
|
||||
<form id="edit-form">
|
||||
<!-- Form fields will be appended here -->
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Get plugin and settings data from API endpoints
|
||||
function getDeviceData(readAllData){
|
||||
function getDeviceData(){
|
||||
|
||||
mac = getMac()
|
||||
|
||||
@@ -53,17 +53,21 @@
|
||||
|
||||
var deviceData = JSON.parse(data);
|
||||
|
||||
// Deactivate next previous buttons
|
||||
if (readAllData) {
|
||||
$('#btnPrevious').attr ('disabled','');
|
||||
$('#btnPrevious').addClass ('text-gray50');
|
||||
$('#btnNext').attr ('disabled','');
|
||||
$('#btnNext').addClass ('text-gray50');
|
||||
}
|
||||
// // Deactivate next previous buttons
|
||||
// if (readAllData) {
|
||||
// $('#btnPrevious').attr ('disabled','');
|
||||
// $('#btnPrevious').addClass ('text-gray50');
|
||||
// $('#btnNext').attr ('disabled','');
|
||||
// $('#btnNext').addClass ('text-gray50');
|
||||
// }
|
||||
|
||||
// some race condition, need to implement delay
|
||||
setTimeout(() => {
|
||||
$.get('php/server/query_json.php', { file: 'table_settings.json', nocache: Date.now() }, function(res) {
|
||||
$.get('php/server/query_json.php', {
|
||||
file: 'table_settings.json',
|
||||
// nocache: Date.now()
|
||||
},
|
||||
function(res) {
|
||||
|
||||
settingsData = res["data"];
|
||||
|
||||
@@ -85,7 +89,7 @@
|
||||
},
|
||||
// Group for event and alert settings
|
||||
DevDetail_EveandAl_Title: {
|
||||
data: ["devAlertEvents", "devAlertDown", "devSkipRepeated"],
|
||||
data: ["devAlertEvents", "devAlertDown", "devSkipRepeated", "devReqNicsOnline", "devChildrenNicsDynamic"],
|
||||
docs: "https://github.com/jokob-sk/NetAlertX/blob/main/docs/NOTIFICATIONS.md",
|
||||
iconClass: "fa fa-bell",
|
||||
inputGroupClasses: "field-group alert-group col-lg-4 col-sm-6 col-xs-12",
|
||||
@@ -94,9 +98,9 @@
|
||||
},
|
||||
// Group for network details
|
||||
DevDetail_MainInfo_Network_Title: {
|
||||
data: ["devParentMAC", "devParentPort", "devSSID", "devSite", "devSyncHubNode"],
|
||||
data: ["devParentMAC", "devParentRelType", "devParentPort", "devSSID", "devSite", "devSyncHubNode"],
|
||||
docs: "https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md",
|
||||
iconClass: "fa fa-network-wired",
|
||||
iconClass: "fa fa-sitemap fa-rotate-270",
|
||||
inputGroupClasses: "field-group network-group col-lg-4 col-sm-6 col-xs-12",
|
||||
labelClasses: "col-sm-4 col-xs-12 control-label",
|
||||
inputClasses: "col-sm-8 col-xs-12 input-group"
|
||||
@@ -119,12 +123,21 @@
|
||||
labelClasses: "col-sm-4 col-xs-12 control-label",
|
||||
inputClasses: "col-sm-8 col-xs-12 input-group"
|
||||
},
|
||||
// Group for Children.
|
||||
DevDetail_Children_Title: {
|
||||
data: ["devChildrenDynamic"],
|
||||
docs: "https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md",
|
||||
iconClass: "fa fa-list",
|
||||
inputGroupClasses: "field-group cutprop-group col-lg-6 col-sm-12 col-xs-12",
|
||||
labelClasses: "col-sm-12 col-xs-12 control-label",
|
||||
inputClasses: "col-sm-12 col-xs-12 input-group"
|
||||
},
|
||||
// Group for Custom properties.
|
||||
DevDetail_CustomProperties_Title: {
|
||||
data: ["devCustomProps"],
|
||||
docs: "https://github.com/jokob-sk/NetAlertX/blob/main/docs/CUSTOM_PROPERTIES.md",
|
||||
iconClass: "fa fa-list",
|
||||
inputGroupClasses: "field-group cutprop-group col-lg-12 col-sm-12 col-xs-12",
|
||||
inputGroupClasses: "field-group cutprop-group col-lg-6 col-sm-12 col-xs-12",
|
||||
labelClasses: "col-sm-12 col-xs-12 control-label",
|
||||
inputClasses: "col-sm-12 col-xs-12 input-group"
|
||||
}
|
||||
@@ -167,6 +180,7 @@
|
||||
// Get the field data (replace 'NEWDEV_' prefix from the key)
|
||||
fieldData = deviceData[setting.setKey.replace('NEWDEV_', '')]
|
||||
fieldData = fieldData == null ? "" : fieldData;
|
||||
fieldOptionsOverride = null;
|
||||
|
||||
// console.log(setting.setKey);
|
||||
// console.log(fieldData);
|
||||
@@ -198,16 +212,21 @@
|
||||
<i class="fa-solid fa-dice" ></i>
|
||||
</span>`;
|
||||
}
|
||||
|
||||
// handle generate IP for new device
|
||||
if (setting.setKey == "NEWDEV_devIcon") {
|
||||
inlineControl += `<span class="input-group-addon pointer"
|
||||
onclick="showIconSelection()"
|
||||
title="${getString("Gen_Select")}">
|
||||
<i class="fa-solid fa-chevron-down" ></i>
|
||||
</span>`;
|
||||
}
|
||||
|
||||
// handle devChildrenDynamic or NEWDEV_devChildrenNicsDynamic - selected values and options are the same
|
||||
if (
|
||||
Array.isArray(fieldData) &&
|
||||
(setting.setKey == "NEWDEV_devChildrenDynamic" ||
|
||||
setting.setKey == "NEWDEV_devChildrenNicsDynamic" )
|
||||
)
|
||||
{
|
||||
fieldDataNew = []
|
||||
fieldData.forEach(child => {
|
||||
fieldDataNew.push(child.devMac)
|
||||
})
|
||||
fieldData = fieldDataNew;
|
||||
fieldOptionsOverride = fieldDataNew;
|
||||
}
|
||||
|
||||
// Generate the input field HTML
|
||||
const inputFormHtml = `<div class="form-group col-xs-12">
|
||||
@@ -219,7 +238,7 @@
|
||||
</i>
|
||||
</label>
|
||||
<div class="${obj.inputClasses}">
|
||||
${generateFormHtml(settingsData, setting, fieldData.toString(), null, null)}
|
||||
${generateFormHtml(settingsData, setting, fieldData.toString(), fieldOptionsOverride, null)}
|
||||
${inlineControl}
|
||||
</div>
|
||||
</div>`;
|
||||
@@ -236,32 +255,18 @@
|
||||
updateAllIconPreviews();
|
||||
|
||||
// update readonly fields
|
||||
handleReadOnly(settingsData, disabledFields);
|
||||
|
||||
// Page title - Name
|
||||
if (mac == "new") {
|
||||
$('#pageTitle').html(`<i title="${getString("Gen_create_new_device")}" class="fa fa-square-plus"></i> ` + getString("Gen_create_new_device"));
|
||||
$('#devicePageInfoPlc .inner').html(`<i class="fa fa-circle-info"></i> ` + getString("Gen_create_new_device_info"));
|
||||
$('#devicePageInfoPlc').show();
|
||||
} else if (deviceData['devOwner'] == null || deviceData['devOwner'] == '' ||
|
||||
(deviceData['devName'].toString()).indexOf(deviceData['devOwner']) != -1) {
|
||||
$('#pageTitle').html(deviceData['devName']);
|
||||
$('#devicePageInfoPlc').hide();
|
||||
} else {
|
||||
$('#pageTitle').html(deviceData['devName'] + ' (' + deviceData['devOwner'] + ')');
|
||||
$('#devicePageInfoPlc').hide();
|
||||
}
|
||||
handleReadOnly(settingsData, disabledFields);
|
||||
};
|
||||
|
||||
// console.log(relevantSettings)
|
||||
|
||||
generateSimpleForm(relevantSettings);
|
||||
|
||||
// <> chevrons
|
||||
updateChevrons(deviceData)
|
||||
|
||||
toggleNetworkConfiguration(mac == 'Internet')
|
||||
|
||||
initSelect2();
|
||||
initHoverNodeInfo();
|
||||
|
||||
hideSpinner();
|
||||
|
||||
})
|
||||
@@ -272,46 +277,6 @@
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------
|
||||
// Handle previous/next arrows/chevrons
|
||||
function updateChevrons(deviceData) {
|
||||
|
||||
devicesList = getDevicesList();
|
||||
|
||||
// console.log(devicesList);
|
||||
|
||||
// Check if device is part of the devicesList
|
||||
pos = devicesList.findIndex(item => item.rowid == deviceData['rowid']);
|
||||
|
||||
// console.log(pos);
|
||||
|
||||
if (pos == -1) {
|
||||
devicesList.push({"rowid" : deviceData['rowid'], "mac" : deviceData['devMac'], "name": deviceData['devName'], "type": deviceData['devType']});
|
||||
pos=0;
|
||||
}
|
||||
|
||||
// Record number
|
||||
$('#txtRecord').html (pos+1 +' / '+ devicesList.length);
|
||||
|
||||
// Deactivate previous button
|
||||
if (pos <= 0) {
|
||||
$('#btnPrevious').attr ('disabled','');
|
||||
$('#btnPrevious').addClass ('text-gray50');
|
||||
} else {
|
||||
$('#btnPrevious').removeAttr ('disabled');
|
||||
$('#btnPrevious').removeClass ('text-gray50');
|
||||
}
|
||||
|
||||
// Deactivate next button
|
||||
if (pos >= (devicesList.length-1)) {
|
||||
$('#btnNext').attr ('disabled','');
|
||||
$('#btnNext').addClass ('text-gray50');
|
||||
} else {
|
||||
$('#btnNext').removeAttr ('disabled');
|
||||
$('#btnNext').removeClass ('text-gray50');
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------
|
||||
// Handle the read-only fields
|
||||
function handleReadOnly(settingsData, disabledFields) {
|
||||
@@ -364,7 +329,7 @@
|
||||
mac: $('#NEWDEV_devMac').val(),
|
||||
name: encodeURIComponent($('#NEWDEV_devName').val().replace(/'/g, "’")),
|
||||
owner: encodeURIComponent($('#NEWDEV_devOwner').val().replace(/'/g, "’")),
|
||||
type: $('#NEWDEV_devType').val().replace(/'/g, ""),
|
||||
type: $('#NEWDEV_devType').val().replace(/'/g, ""),
|
||||
vendor: encodeURIComponent($('#NEWDEV_devVendor').val().replace(/'/g, "’")),
|
||||
icon: encodeURIComponent($('#NEWDEV_devIcon').val()),
|
||||
favorite: ($('#NEWDEV_devFavorite')[0].checked * 1),
|
||||
@@ -380,6 +345,8 @@
|
||||
alertevents: ($('#NEWDEV_devAlertEvents')[0].checked * 1),
|
||||
alertdown: ($('#NEWDEV_devAlertDown')[0].checked * 1),
|
||||
skiprepeated: $('#NEWDEV_devSkipRepeated').val().split(' ')[0],
|
||||
relType: $('#NEWDEV_devParentRelType').val().replace(/'/g, ""),
|
||||
reqNics: ($('#NEWDEV_devReqNicsOnline')[0].checked * 1),
|
||||
newdevice: ($('#NEWDEV_devIsNew')[0].checked * 1),
|
||||
archived: ($('#NEWDEV_devIsArchived')[0].checked * 1),
|
||||
devFirstConnection: ($('#NEWDEV_devFirstConnection').val()),
|
||||
@@ -427,9 +394,47 @@
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------
|
||||
// INIT with polling for panel element visibility
|
||||
// -----------------------------------------------
|
||||
|
||||
var deviceDetailsPageInitialized = false;
|
||||
|
||||
function initdeviceDetailsPage()
|
||||
{
|
||||
// Only proceed if .plugin-content is visible
|
||||
if (!$('#panDetails:visible').length) {
|
||||
return; // exit early if nothing is visible
|
||||
}
|
||||
|
||||
// init page once
|
||||
if (deviceDetailsPageInitialized) return; // ENSURE ONCE
|
||||
deviceDetailsPageInitialized = true;
|
||||
|
||||
showSpinner();
|
||||
|
||||
getDeviceData();
|
||||
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Recurring function to monitor the URL and reinitialize if needed
|
||||
function deviceDetailsPageUpdater() {
|
||||
initdeviceDetailsPage();
|
||||
|
||||
// Run updater again after delay
|
||||
setTimeout(deviceDetailsPageUpdater, 200);
|
||||
}
|
||||
|
||||
// if visible, load immediately, if not start updater
|
||||
if (!$('#panDetails:visible').length) {
|
||||
deviceDetailsPageUpdater();
|
||||
}
|
||||
else
|
||||
{
|
||||
getDeviceData();
|
||||
}
|
||||
|
||||
// -------------------- INIT ------------------------
|
||||
getDeviceData(true);
|
||||
|
||||
|
||||
</script>
|
||||
@@ -7,11 +7,11 @@
|
||||
|
||||
|
||||
<!-- Hide Connections -->
|
||||
<div class="text-center">
|
||||
<label>
|
||||
<input class="checkbox blue hidden" id="chkHideConnectionEvents" type="checkbox" checked>
|
||||
<?= lang('DevDetail_Events_CheckBox');?>
|
||||
<div class="col-sm-12 col-xs-12">
|
||||
<label class="col-sm-3 col-xs-10">
|
||||
<?= lang('DevDetail_Events_CheckBox');?>
|
||||
</label>
|
||||
<input class="checkbox blue col-sm-1 col-xs-2" id="chkHideConnectionEvents" type="checkbox" onChange="loadEventsData()">
|
||||
</div>
|
||||
|
||||
<!-- Datatable Events -->
|
||||
@@ -29,66 +29,132 @@
|
||||
|
||||
<script>
|
||||
|
||||
var eventsRows = 10;
|
||||
var eventsHide = true;
|
||||
var parEventsRows = 'Front_Details_Events_Rows';
|
||||
var parEventsHide = 'Front_Details_Events_Hide';
|
||||
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function loadEventsData() {
|
||||
const hideConnections = $('#chkHideConnectionEvents')[0].checked;
|
||||
const hideConnectionsStr = hideConnections ? 'true' : 'false';
|
||||
|
||||
function loadEventsData() {
|
||||
// Define Events datasource and query dada
|
||||
hideConnections = $('#chkHideConnectionEvents')[0].checked;
|
||||
$('#tableEvents').DataTable().ajax.url('php/server/events.php?action=getDeviceEvents&mac=' + mac +'&period='+ period +'&hideConnections='+ hideConnections).load();
|
||||
}
|
||||
mac = getMac()
|
||||
|
||||
function initializeSessionsDatatable () {
|
||||
const rawSql = `
|
||||
SELECT eve_DateTime, eve_EventType, eve_IP, eve_AdditionalInfo
|
||||
FROM Events
|
||||
WHERE eve_MAC = "${mac}"
|
||||
AND (
|
||||
(eve_EventType NOT IN ("Connected", "Disconnected", "VOIDED - Connected", "VOIDED - Disconnected"))
|
||||
OR "${hideConnectionsStr}" = "false"
|
||||
)
|
||||
`;
|
||||
|
||||
// Events datatable
|
||||
$('#tableEvents').DataTable({
|
||||
'paging' : true,
|
||||
'lengthChange': true,
|
||||
'lengthMenu' : [[10, 25, 50, 100, 500, -1], [10, 25, 50, 100, 500, 'All']],
|
||||
'searching' : true,
|
||||
'ordering' : true,
|
||||
'info' : true,
|
||||
'autoWidth' : false,
|
||||
'order' : [[0,'desc']],
|
||||
const apiUrl = `php/server/dbHelper.php?action=read&rawSql=${btoa(encodeURIComponent(rawSql))}`;
|
||||
|
||||
// Parameters
|
||||
'pageLength' : eventsRows,
|
||||
// Manually load the data first
|
||||
$.get(apiUrl, function (data) {
|
||||
const parsed = JSON.parse(data);
|
||||
|
||||
const rows = parsed.map(row => {
|
||||
const rawDate = row.eve_DateTime;
|
||||
const formattedDate = rawDate ? localizeTimestamp(rawDate) : '-';
|
||||
return [
|
||||
formattedDate,
|
||||
row.eve_EventType,
|
||||
row.eve_IP,
|
||||
row.eve_AdditionalInfo
|
||||
];
|
||||
});
|
||||
|
||||
'columnDefs' : [
|
||||
// Replace HTML codes
|
||||
{targets: [0],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
$(td).html (translateHTMLcodes (localizeTimestamp(cellData)));
|
||||
} }
|
||||
],
|
||||
|
||||
// Processing
|
||||
'processing' : true,
|
||||
'language' : {
|
||||
processing: '<table><td width="130px" align="middle"><?= lang("DevDetail_Loading");?></td>'+
|
||||
'<td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw">'+
|
||||
'</td></table>',
|
||||
emptyTable: 'No data',
|
||||
"lengthMenu": "<?= lang('Events_Tablelenght');?>",
|
||||
"search": "<?= lang('Events_Searchbox');?>: ",
|
||||
"paginate": {
|
||||
"next": "<?= lang('Events_Table_nav_next');?>",
|
||||
"previous": "<?= lang('Events_Table_nav_prev');?>"
|
||||
},
|
||||
"info": "<?= lang('Events_Table_info');?>",
|
||||
}
|
||||
});
|
||||
// Fill the table manually
|
||||
const table = $('#tableEvents').DataTable();
|
||||
table.clear();
|
||||
table.rows.add(rows); // assuming each row is an array
|
||||
table.draw();
|
||||
|
||||
hideSpinner();
|
||||
});
|
||||
}
|
||||
|
||||
initializeSessionsDatatable();
|
||||
loadEventsData();
|
||||
function initializeEventsDatatable (eventsRows) {
|
||||
|
||||
if ($.fn.dataTable.isDataTable('#tableEvents')) {
|
||||
$('#tableEvents').DataTable().clear().destroy();
|
||||
}
|
||||
|
||||
$('#tableEvents').DataTable({
|
||||
'paging' : true,
|
||||
'lengthChange': true,
|
||||
'lengthMenu' : [[10, 25, 50, 100, 500, -1], [10, 25, 50, 100, 500, 'All']],
|
||||
'searching' : true,
|
||||
'ordering' : true,
|
||||
'info' : true,
|
||||
'autoWidth' : false,
|
||||
'order' : [[0,'desc']],
|
||||
'pageLength' : eventsRows,
|
||||
|
||||
'columnDefs' : [
|
||||
{
|
||||
targets: [0],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
$(td).html(translateHTMLcodes(localizeTimestamp(cellData)));
|
||||
}
|
||||
}
|
||||
],
|
||||
|
||||
'processing' : true,
|
||||
'language' : {
|
||||
processing: '<table><td width="130px" align="middle"><?= lang("DevDetail_Loading");?></td>'+
|
||||
'<td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></i></td></table>',
|
||||
emptyTable: 'No data',
|
||||
"lengthMenu": "<?= lang('Events_Tablelenght');?>",
|
||||
"search": "<?= lang('Events_Searchbox');?>: ",
|
||||
"paginate": {
|
||||
"next": "<?= lang('Events_Table_nav_next');?>",
|
||||
"previous": "<?= lang('Events_Table_nav_prev');?>"
|
||||
},
|
||||
"info": "<?= lang('Events_Table_info');?>",
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// -----------------------------------------------
|
||||
// INIT with polling for panel element visibility
|
||||
// -----------------------------------------------
|
||||
|
||||
var eventsPageInitialized = false;
|
||||
|
||||
function initDeviceEventsPage()
|
||||
{
|
||||
// Only proceed if .plugin-content is visible
|
||||
if (!$('#panEvents:visible').length) {
|
||||
return; // exit early if nothing is visible
|
||||
}
|
||||
|
||||
// init page once
|
||||
if (eventsPageInitialized) return; // ENSURE ONCE
|
||||
eventsPageInitialized = true;
|
||||
|
||||
showSpinner();
|
||||
|
||||
var eventsRows = 10;
|
||||
var eventsHide = true;
|
||||
|
||||
initializeEventsDatatable(eventsRows);
|
||||
loadEventsData();
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Recurring function to monitor the URL and reinitialize if needed
|
||||
function deviceEventsPageUpdater() {
|
||||
initDeviceEventsPage();
|
||||
|
||||
// Run updater again after delay
|
||||
setTimeout(deviceEventsPageUpdater, 200);
|
||||
}
|
||||
|
||||
deviceEventsPageUpdater();
|
||||
|
||||
|
||||
</script>
|
||||
@@ -23,8 +23,6 @@
|
||||
|
||||
|
||||
<script>
|
||||
initializeCalendar();
|
||||
loadPresenceData();
|
||||
|
||||
// Force re-render calendar on tab change
|
||||
// (bugfix for render error at left panel)
|
||||
@@ -234,6 +232,37 @@ function initializeCalendar() {
|
||||
})
|
||||
}
|
||||
|
||||
// -----------------------------------------------
|
||||
// INIT with polling for panel element visibility
|
||||
// -----------------------------------------------
|
||||
|
||||
var presencePageInitialized = false;
|
||||
|
||||
function initDevicePresencePage() {
|
||||
// Only proceed if the Presence tab is visible
|
||||
if (!$('#panPresence:visible').length) {
|
||||
return; // Exit early if nothing is visible
|
||||
}
|
||||
|
||||
// Ensure initialization only happens once
|
||||
if (presencePageInitialized) return;
|
||||
presencePageInitialized = true;
|
||||
|
||||
showSpinner();
|
||||
|
||||
initializeCalendar();
|
||||
loadPresenceData();
|
||||
}
|
||||
|
||||
// Recurring check to initialize when visible
|
||||
function devicePresencePageUpdater() {
|
||||
initDevicePresencePage();
|
||||
|
||||
setTimeout(devicePresencePageUpdater, 200);
|
||||
}
|
||||
|
||||
devicePresencePageUpdater();
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
@@ -24,77 +24,126 @@
|
||||
|
||||
<script>
|
||||
|
||||
var parSessionsRows = 'Front_Details_Sessions_Rows';
|
||||
|
||||
|
||||
function initializeSessionsDatatable (sessionsRows) {
|
||||
// Sessions datatable
|
||||
$('#tableSessions').DataTable({
|
||||
'paging' : true,
|
||||
'lengthChange': true,
|
||||
'lengthMenu' : [[10, 25, 50, 100, 500, -1], [10, 25, 50, 100, 500, 'All']],
|
||||
'searching' : true,
|
||||
'ordering' : true,
|
||||
'info' : true,
|
||||
'autoWidth' : false,
|
||||
'order' : [[0,'desc'], [1,'desc']],
|
||||
|
||||
// Parameters
|
||||
'pageLength' : sessionsRows,
|
||||
|
||||
'columnDefs' : [
|
||||
{visible: false, targets: [0]},
|
||||
|
||||
// Replace HTML codes
|
||||
{targets: [3,5],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
$(td).html (translateHTMLcodes (cellData));
|
||||
} },
|
||||
// Date
|
||||
{targets: [1,2],
|
||||
"createdCell": function (td, cellData, rowData, row, col) {
|
||||
// console.log(cellData);
|
||||
|
||||
if (!cellData.includes("missing event") && !cellData.includes("..."))
|
||||
{
|
||||
if (cellData.includes("+")) { // Check if timezone offset is present
|
||||
cellData = cellData.split('+')[0]; // Remove timezone offset
|
||||
}
|
||||
// console.log(cellData);
|
||||
result = localizeTimestamp(cellData);
|
||||
} else
|
||||
{
|
||||
result = translateHTMLcodes(cellData)
|
||||
}
|
||||
|
||||
$(td).html (result);
|
||||
} }
|
||||
],
|
||||
|
||||
// Processing
|
||||
'processing' : true,
|
||||
'language' : {
|
||||
processing: '<table><td width="130px" align="middle"><?= lang("DevDetail_Loading");?></td>'+
|
||||
'<td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw">'+
|
||||
'</td></table>',
|
||||
emptyTable: 'No data',
|
||||
"lengthMenu": "<?= lang('Events_Tablelenght');?>",
|
||||
"search": "<?= lang('Events_Searchbox');?>: ",
|
||||
"paginate": {
|
||||
"next": "<?= lang('Events_Table_nav_next');?>",
|
||||
"previous": "<?= lang('Events_Table_nav_prev');?>"
|
||||
},
|
||||
"info": "<?= lang('Events_Table_info');?>",
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
// -----------------------------------------------
|
||||
// INIT with polling for panel element visibility
|
||||
// -----------------------------------------------
|
||||
|
||||
// -----------------------------------------------------------
|
||||
// Init datatable
|
||||
function loadSessionsData(period){
|
||||
const table = $('#tableSessions').DataTable();
|
||||
|
||||
showSpinner();
|
||||
|
||||
// table.clear().draw(); // Clear existing data before reloading
|
||||
|
||||
table.ajax
|
||||
.url('php/server/events.php?action=getDeviceSessions&mac=' + getMac() + '&period=' + period)
|
||||
.load(function () {
|
||||
hideSpinner();
|
||||
});
|
||||
}
|
||||
|
||||
var sessionsPageInitialized = false;
|
||||
|
||||
// -----------------------------------------------------------
|
||||
// Main init function
|
||||
function initDeviceSessionsPage()
|
||||
{
|
||||
// Only proceed if .plugin-content is visible
|
||||
if (!$('#panSessions:visible').length) {
|
||||
return; // exit early if nothing is visible
|
||||
}
|
||||
|
||||
// init page once
|
||||
if (sessionsPageInitialized) return;
|
||||
sessionsPageInitialized = true;
|
||||
|
||||
showSpinner();
|
||||
|
||||
var sessionsRows = 10;
|
||||
var period = '1 month';
|
||||
|
||||
function initializeSessionsDatatable () {
|
||||
// Sessions datatable
|
||||
$('#tableSessions').DataTable({
|
||||
'paging' : true,
|
||||
'lengthChange': true,
|
||||
'lengthMenu' : [[10, 25, 50, 100, 500, -1], [10, 25, 50, 100, 500, 'All']],
|
||||
'searching' : true,
|
||||
'ordering' : true,
|
||||
'info' : true,
|
||||
'autoWidth' : false,
|
||||
'order' : [[0,'desc'], [1,'desc']],
|
||||
initializeSessionsDatatable(sessionsRows);
|
||||
loadSessionsData(period);
|
||||
}
|
||||
|
||||
// Parameters
|
||||
'pageLength' : sessionsRows,
|
||||
// -----------------------------------------------------------------------------
|
||||
// Recurring function to monitor the URL and reinitialize if needed
|
||||
function deviceSessionsPageUpdater() {
|
||||
initDeviceSessionsPage();
|
||||
|
||||
'columnDefs' : [
|
||||
{visible: false, targets: [0]},
|
||||
// Run updater again after delay
|
||||
setTimeout(deviceSessionsPageUpdater, 200);
|
||||
}
|
||||
|
||||
// Replace HTML codes
|
||||
{targets: [3,5],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
$(td).html (translateHTMLcodes (cellData));
|
||||
} },
|
||||
// Date
|
||||
{targets: [1,2],
|
||||
"createdCell": function (td, cellData, rowData, row, col) {
|
||||
// console.log(cellData);
|
||||
|
||||
if (!cellData.includes("missing event") && !cellData.includes("..."))
|
||||
{
|
||||
if (cellData.includes("+")) { // Check if timezone offset is present
|
||||
cellData = cellData.split('+')[0]; // Remove timezone offset
|
||||
}
|
||||
// console.log(cellData);
|
||||
result = localizeTimestamp(cellData);
|
||||
} else
|
||||
{
|
||||
result = translateHTMLcodes(cellData)
|
||||
}
|
||||
|
||||
$(td).html (result);
|
||||
} }
|
||||
],
|
||||
|
||||
// Processing
|
||||
'processing' : true,
|
||||
'language' : {
|
||||
processing: '<table><td width="130px" align="middle"><?= lang("DevDetail_Loading");?></td>'+
|
||||
'<td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw">'+
|
||||
'</td></table>',
|
||||
emptyTable: 'No data',
|
||||
"lengthMenu": "<?= lang('Events_Tablelenght');?>",
|
||||
"search": "<?= lang('Events_Searchbox');?>: ",
|
||||
"paginate": {
|
||||
"next": "<?= lang('Events_Table_nav_next');?>",
|
||||
"previous": "<?= lang('Events_Table_nav_prev');?>"
|
||||
},
|
||||
"info": "<?= lang('Events_Table_info');?>",
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function loadSessionsData(){
|
||||
$('#tableSessions').DataTable().ajax.url('php/server/events.php?action=getDeviceSessions&mac=' + getMac() +'&period='+ period).load();
|
||||
}
|
||||
|
||||
initializeSessionsDatatable();
|
||||
loadSessionsData();
|
||||
// start updater
|
||||
deviceSessionsPageUpdater();
|
||||
|
||||
</script>
|
||||
@@ -14,7 +14,7 @@
|
||||
<?= lang("DevDetail_Tab_Tools_Internet_Info_Description") ?>
|
||||
</h5>
|
||||
<br>
|
||||
<div style="width:100%; text-align: center; margin-bottom: 50px;">
|
||||
<div style="width:100%; text-align: center;">
|
||||
<button type="button" id="internetinfo" class="btn btn-primary pa-btn" style="margin: auto;" onclick="internetinfo()">
|
||||
<?= lang("DevDetail_Tab_Tools_Internet_Info_Start") ?></button>
|
||||
<br>
|
||||
@@ -33,13 +33,13 @@
|
||||
<?= lang("DevDetail_Copy_Device_Tooltip") ?>
|
||||
</h5>
|
||||
<br>
|
||||
<div style="width:100%; text-align: center; margin-bottom: 50px;">
|
||||
<div style="width:100%; text-align: center;">
|
||||
<select class="form-control"
|
||||
title="<?= lang('DevDetail_Copy_Device_Tooltip');?>"
|
||||
id="txtCopyFromDevice" >
|
||||
<option value="lemp_loading" id="lemp_loading">Loading</option>
|
||||
</select>
|
||||
<button type="button" id="internetinfo" class="btn btn-primary pa-btn" style="margin: auto;" onclick="()">
|
||||
<button type="button" id="internetinfo" class="btn btn-primary pa-btn" style="margin: auto; margin-top:10px;" onclick="copyFromDevice()">
|
||||
<?= lang("BackDevDetail_Copy_Title") ?></button>
|
||||
<br>
|
||||
</div>
|
||||
@@ -56,7 +56,7 @@
|
||||
<?= lang("DevDetail_Tools_WOL_noti_text") ?>
|
||||
</h5>
|
||||
<br>
|
||||
<div style="width:100%; text-align: center; margin-bottom: 50px;">
|
||||
<div style="width:100%; text-align: center;">
|
||||
<button type="button" id="internetinfo" class="btn btn-primary pa-btn" style="margin: auto;" onclick="wakeonlan()">
|
||||
<?= lang("DevDetail_Tools_WOL_noti") ?></button>
|
||||
<br>
|
||||
@@ -74,7 +74,7 @@
|
||||
<?= lang("DevDetail_button_DeleteEvents_Warning") ?>
|
||||
</h5>
|
||||
<br>
|
||||
<div style="width:100%; text-align: center; margin-bottom: 50px;">
|
||||
<div style="width:100%; text-align: center;">
|
||||
<button type="button"
|
||||
class="btn btn-default pa-btn pa-btn-delete"
|
||||
style="margin-left:0px;"
|
||||
@@ -94,7 +94,7 @@
|
||||
<?= lang("DevDetail_CustomProps_reset_info") ?>
|
||||
</h5>
|
||||
<br>
|
||||
<div style="width:100%; text-align: center; margin-bottom: 50px;">
|
||||
<div style="width:100%; text-align: center;">
|
||||
<button type="button"
|
||||
class="btn btn-default pa-btn pa-btn-delete"
|
||||
style="margin-left:0px;"
|
||||
@@ -116,7 +116,7 @@
|
||||
<?= lang("DevDetail_Tab_Tools_Speedtest_Description") ?>
|
||||
</h5>
|
||||
<br>
|
||||
<div style="width:100%; text-align: center; margin-bottom: 50px;">
|
||||
<div style="width:100%; text-align: center;">
|
||||
<button type="button" id="speedtestcli" class="btn btn-primary pa-btn" style="margin: auto;" onclick="speedtestcli()">
|
||||
<?= lang("DevDetail_Tab_Tools_Speedtest_Start") ?></button>
|
||||
<br>
|
||||
@@ -133,7 +133,7 @@
|
||||
<h5 class="">
|
||||
<?= lang("DevDetail_Tab_Tools_Traceroute_Description") ?>
|
||||
</h5>
|
||||
<div style="width:100%; text-align: center; margin-bottom: 50px;">
|
||||
<div style="width:100%; text-align: center;">
|
||||
<button type="button" id="traceroute" class="btn btn-primary pa-btn" style="margin: auto;" onclick="traceroute()">
|
||||
<?= lang("DevDetail_Tab_Tools_Traceroute_Start") ?>
|
||||
</button>
|
||||
@@ -151,7 +151,7 @@
|
||||
<h5 class="">
|
||||
<?= lang("DevDetail_Tab_Tools_Nslookup_Description") ?>
|
||||
</h5>
|
||||
<div style="width:100%; text-align: center; margin-bottom: 50px;">
|
||||
<div style="width:100%; text-align: center;">
|
||||
<button type="button" id="nslookup" class="btn btn-primary pa-btn" style="margin: auto;" onclick="nslookup()">
|
||||
<?= lang("DevDetail_Tab_Tools_Nslookup_Start") ?>
|
||||
</button>
|
||||
@@ -295,7 +295,7 @@
|
||||
function initCopyFromDevice() {
|
||||
|
||||
const devices = getVisibleDevicesList()
|
||||
console.log(devices);
|
||||
// console.log(devices);
|
||||
|
||||
const $select = $('#txtCopyFromDevice');
|
||||
$select.empty(); // Clear existing options
|
||||
|
||||
@@ -539,7 +539,9 @@ function mapColumnIndexToFieldName(index, tableColumnVisible) {
|
||||
"devPresentLastScan",
|
||||
"devAlertDown",
|
||||
"devCustomProps",
|
||||
"devFQDN"
|
||||
"devFQDN",
|
||||
"devParentRelType",
|
||||
"devReqNicsOnline"
|
||||
];
|
||||
|
||||
// console.log("OrderBy: " + columnNames[tableColumnOrder[index]]);
|
||||
@@ -650,6 +652,8 @@ function initializeDatatable (status) {
|
||||
devIpLong
|
||||
devCustomProps
|
||||
devFQDN
|
||||
devParentRelType
|
||||
devReqNicsOnline
|
||||
}
|
||||
count
|
||||
}
|
||||
@@ -725,7 +729,9 @@ function initializeDatatable (status) {
|
||||
device.devPresentLastScan || "",
|
||||
device.devAlertDown || "",
|
||||
device.devCustomProps || "",
|
||||
device.devFQDN || ""
|
||||
device.devFQDN || "",
|
||||
device.devParentRelType || "",
|
||||
device.devReqNicsOnline || 0
|
||||
];
|
||||
|
||||
const newRow = [];
|
||||
@@ -770,17 +776,34 @@ function initializeDatatable (status) {
|
||||
|
||||
// Device Name and FQDN
|
||||
{targets: [mapIndx(0), mapIndx(27)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
|
||||
// console.log(cellData)
|
||||
$(td).html ('<b class="anonymizeDev"><a href="deviceDetails.php?mac='+ rowData[mapIndx(11)] +'" class="">'+ cellData +'</a></b>');
|
||||
$(td).html (
|
||||
`<b class="anonymizeDev "
|
||||
>
|
||||
<a href="deviceDetails.php?mac=${rowData[mapIndx(11)]}" class="hover-node-info"
|
||||
data-name="${cellData}"
|
||||
data-ip="${rowData[mapIndx(8)]}"
|
||||
data-mac="${rowData[mapIndx(11)]}"
|
||||
data-vendor="${rowData[mapIndx(17)]}"
|
||||
data-type="${rowData[mapIndx(2)]}"
|
||||
data-firstseen="${rowData[mapIndx(6)]}"
|
||||
data-lastseen="${rowData[mapIndx(7)]}"
|
||||
data-relationship="${rowData[mapIndx(28)]}"
|
||||
data-status="${rowData[mapIndx(10)]}"
|
||||
data-present="${rowData[mapIndx(24)]}"
|
||||
data-alert="${rowData[mapIndx(25)]}"
|
||||
data-icon="${rowData[mapIndx(3)]}">
|
||||
${cellData}
|
||||
</a>
|
||||
</b>`
|
||||
);
|
||||
} },
|
||||
|
||||
// Connected Devices
|
||||
{targets: [mapIndx(15)],
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
|
||||
|
||||
'createdCell': function (td, cellData, rowData, row, col) {
|
||||
// check if this is a network device
|
||||
if(getSetting("NETWORK_DEVICE_TYPES").includes(`'${rowData[mapIndx(2)]}'`) )
|
||||
{
|
||||
@@ -822,7 +845,7 @@ function initializeDatatable (status) {
|
||||
<a href="http://${cellData}" class="pointer" target="_blank">
|
||||
${cellData}
|
||||
</a>
|
||||
<span class="alignRight">
|
||||
<span class="alignRight lockIcon">
|
||||
<a href="https://${cellData}" class="pointer" target="_blank">
|
||||
<i class="fa fa-lock "></i>
|
||||
</a>
|
||||
@@ -893,25 +916,14 @@ function initializeDatatable (status) {
|
||||
tmp_devPresentLastScan = rowData[mapIndx(24)]
|
||||
tmp_devAlertDown = rowData[mapIndx(25)]
|
||||
|
||||
if (tmp_devPresentLastScan == 1)
|
||||
{
|
||||
css = "green text-white statusOnline"
|
||||
icon = '<i class="fa-solid fa-plug"></i>'
|
||||
} else if (tmp_devPresentLastScan != 1 && tmp_devAlertDown == 1)
|
||||
{
|
||||
css = "red text-white statusDown"
|
||||
icon = '<i class="fa-solid fa-triangle-exclamation"></i>'
|
||||
} else if(tmp_devPresentLastScan != 1)
|
||||
{
|
||||
css = "gray text-white statusOffline"
|
||||
icon = '<i class="fa-solid fa-xmark"></i>'
|
||||
} else
|
||||
{
|
||||
css = "gray text-white statusUnknown"
|
||||
icon = '<i class="fa-solid fa-question"></i>'
|
||||
}
|
||||
const badge = getStatusBadgeParts(
|
||||
rowData[mapIndx(24)], // tmp_devPresentLastScan
|
||||
rowData[mapIndx(25)], // tmp_devAlertDown
|
||||
rowData[mapIndx(11)], // MAC
|
||||
cellData // optional text
|
||||
);
|
||||
|
||||
$(td).html (`<a href="deviceDetails.php?mac=${rowData[mapIndx(11)]}" class="badge bg-${css}">${icon} ${cellData.replace('-', '')}</a>`);
|
||||
$(td).html (`<a href="${badge.url}" class="badge ${badge.cssClass}">${badge.iconHtml} ${badge.text}</a>`);
|
||||
} },
|
||||
],
|
||||
|
||||
@@ -970,7 +982,7 @@ function initializeDatatable (status) {
|
||||
}, debounceTime);
|
||||
});
|
||||
|
||||
|
||||
initHoverNodeInfo();
|
||||
hideSpinner();
|
||||
|
||||
},
|
||||
@@ -1035,40 +1047,24 @@ function multiEditDevices()
|
||||
// -----------------------------------------------------------------------------
|
||||
// Function collects shown devices from the DataTable
|
||||
function getMacsOfShownDevices() {
|
||||
rows = $('#tableDevices')[0].rows;
|
||||
macs = [];
|
||||
var table = $('#tableDevices').DataTable();
|
||||
|
||||
// var devicesDataTableData = $('#tableDevices').dataTable().fnGetData();
|
||||
var devicesDataTableData = $('#tableDevices').DataTable().rows({ selected: false, page: 'current' }).data().toArray();
|
||||
var macs = [];
|
||||
|
||||
console.log(devicesDataTableData);
|
||||
// Get all row indexes on current page, in display order
|
||||
var allIndexes = table.rows({ page: 'current' }).indexes();
|
||||
|
||||
var selectedDevices = [];
|
||||
|
||||
// first row is the heading, skip
|
||||
for (var i = 1; i < rows.length; i++) {
|
||||
var rowIndex = rows[i]._DT_RowIndex;
|
||||
|
||||
// Ensure the rowIndex is valid and within bounds of devicesDataTableData
|
||||
if (rowIndex >= 0 && rowIndex < devicesDataTableData.length) {
|
||||
selectedDevices.push(devicesDataTableData[rowIndex]);
|
||||
} else {
|
||||
console.log(`Invalid rowIndex: ${rowIndex} at row ${i}`);
|
||||
allIndexes.each(function(idx) {
|
||||
var rowData = table.row(idx).data();
|
||||
if (rowData) {
|
||||
macs.push(rowData[mapIndx(11)]); // mapIndx(11) == MAC column
|
||||
}
|
||||
}
|
||||
|
||||
for (var j = 0; j < selectedDevices.length; j++) {
|
||||
// Ensure that selectedDevices[j] is not undefined
|
||||
if (selectedDevices[j]) {
|
||||
macs.push(selectedDevices[j][mapIndx(11)]); // mapIndx(11) == MAC
|
||||
} else {
|
||||
console.log(`selectedDevices[${j}] is undefined`);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return macs;
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Handle custom actions/properties on a device
|
||||
function renderCustomProps(custProps, mac) {
|
||||
|
||||
@@ -99,18 +99,6 @@ if (isset ($_SESSION["login"]) == FALSE || $_SESSION["login"] != 1)
|
||||
|
||||
<!-- Favicon -->
|
||||
<link id="favicon" rel="icon" type="image/x-icon" href="img/NetAlertX_logo.png">
|
||||
|
||||
<!-- Dark-Mode Patch -->
|
||||
<?php
|
||||
switch ($UI_THEME) {
|
||||
case "Dark":
|
||||
echo '<link rel="stylesheet" href="css/dark-patch.css">';
|
||||
break;
|
||||
case "System":
|
||||
echo '<link rel="stylesheet" href="css/system-dark-patch.css">';
|
||||
break;
|
||||
}
|
||||
?>
|
||||
<link rel="stylesheet" href="/css/offline-font.css">
|
||||
</head>
|
||||
<body class="hold-transition login-page col-sm-12 col-sx-12">
|
||||
|
||||
@@ -362,18 +362,64 @@ function getLangCode() {
|
||||
// -----------------------------------------------------------------------------
|
||||
// String utilities
|
||||
// -----------------------------------------------------------------------------
|
||||
function localizeTimestamp(input) {
|
||||
let tz = getSetting("TIMEZONE") || 'Europe/Berlin';
|
||||
|
||||
// Convert to string and trim
|
||||
input = String(input || '').trim();
|
||||
|
||||
function localizeTimestamp(result)
|
||||
{
|
||||
// contains TZ in format Europe/Berlin
|
||||
tz = getSetting("TIMEZONE")
|
||||
// Normalize multiple spaces and remove commas
|
||||
const cleaned = input.replace(',', ' ').replace(/\s+/g, ' ');
|
||||
|
||||
// set default if not available or app still loading
|
||||
tz == "" ? tz = 'Europe/Berlin' : tz = tz;
|
||||
|
||||
const date = new Date(result); // Assumes result is a timestamp or ISO string
|
||||
const formatter = new Intl.DateTimeFormat('default', {
|
||||
// DD/MM/YYYY format check
|
||||
const dateTimeParts = cleaned.split(' ');
|
||||
if (dateTimeParts.length >= 2 && dateTimeParts[0].includes('/')) {
|
||||
const [day, month, year] = dateTimeParts[0].split('/');
|
||||
const timePart = dateTimeParts[1];
|
||||
|
||||
if (day && month && year && timePart) {
|
||||
const isoString = `${year}-${month}-${day}T${timePart.length === 5 ? timePart + ':00' : timePart}`;
|
||||
const date = new Date(isoString);
|
||||
if (!isFinite(date)) return 'b-';
|
||||
|
||||
return new Intl.DateTimeFormat('default', {
|
||||
timeZone: tz,
|
||||
year: 'numeric',
|
||||
month: '2-digit',
|
||||
day: '2-digit',
|
||||
hour: '2-digit',
|
||||
minute: '2-digit',
|
||||
second: '2-digit',
|
||||
hour12: false
|
||||
}).format(date);
|
||||
}
|
||||
}
|
||||
|
||||
// ISO style YYYY-MM-DD HH:mm(:ss)?
|
||||
const match = cleaned.match(/^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2})(:\d{2})?$/);
|
||||
if (match) {
|
||||
let iso = `${match[1]}T${match[2]}${match[3] || ':00'}`;
|
||||
|
||||
const date = new Date(iso);
|
||||
if (!isFinite(date)) return 'c-';
|
||||
|
||||
return new Intl.DateTimeFormat('default', {
|
||||
timeZone: tz,
|
||||
year: 'numeric',
|
||||
month: '2-digit',
|
||||
day: '2-digit',
|
||||
hour: '2-digit',
|
||||
minute: '2-digit',
|
||||
second: '2-digit',
|
||||
hour12: false
|
||||
}).format(date);
|
||||
}
|
||||
|
||||
// Fallback: try to parse any other string input
|
||||
const date = new Date(input);
|
||||
if (!isFinite(date)) return 'Failed conversion: ' + input;
|
||||
|
||||
return new Intl.DateTimeFormat('default', {
|
||||
timeZone: tz,
|
||||
year: 'numeric',
|
||||
month: '2-digit',
|
||||
@@ -381,12 +427,12 @@ function localizeTimestamp(result)
|
||||
hour: '2-digit',
|
||||
minute: '2-digit',
|
||||
second: '2-digit',
|
||||
hour12: false // change to true if you want AM/PM format
|
||||
});
|
||||
|
||||
return formatter.format(date);
|
||||
hour12: false
|
||||
}).format(date);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------------
|
||||
/**
|
||||
* Replaces double quotes within single-quoted strings, then converts all single quotes to double quotes,
|
||||
@@ -1063,46 +1109,52 @@ function getGuid() {
|
||||
// -----------------------------------------------------------------------------
|
||||
// Loading Spinner overlay
|
||||
// -----------------------------------------------------------------------------
|
||||
spinnerHtml = `
|
||||
<!-- spinner -->
|
||||
<div id="loadingSpinner" style="display: block">
|
||||
<div class="pa_semitransparent-panel"></div>
|
||||
<div class="panel panel-default pa_spinner">
|
||||
<table>
|
||||
<td width="130px" align="middle">_text_</td>
|
||||
<td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></td>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
`
|
||||
|
||||
function showSpinner(stringKey='Loading')
|
||||
{
|
||||
let spinnerTimeout = null;
|
||||
let animationTime = 300
|
||||
|
||||
if(stringKey == "")
|
||||
{
|
||||
text = ''
|
||||
} else
|
||||
{
|
||||
text = getString(stringKey)
|
||||
}
|
||||
function showSpinner(stringKey = 'Loading') {
|
||||
const text = isEmpty(stringKey) ? "Loading" : getString(stringKey || "Loading");
|
||||
const spinner = $("#loadingSpinner");
|
||||
|
||||
if (spinner.length && spinner.is(':visible')) {
|
||||
clearTimeout(spinnerTimeout);
|
||||
|
||||
console.log(spinner);
|
||||
|
||||
text = isEmpty(text) ? "Loading" : text;
|
||||
$("#loadingSpinnerText").text(text);
|
||||
spinner.addClass("visible");
|
||||
|
||||
if($("#loadingSpinner").length)
|
||||
{
|
||||
$("#loadingSpinner").show();
|
||||
}
|
||||
else{
|
||||
$(".wrapper").append(spinnerHtml.replace('_text_',text))
|
||||
spinner.fadeIn(animationTime);
|
||||
} else {
|
||||
$("#loadingSpinnerText").text(text);
|
||||
|
||||
requestAnimationFrame(() => {
|
||||
spinner.addClass("visible");
|
||||
spinner.fadeIn(animationTime);
|
||||
});
|
||||
}
|
||||
}
|
||||
// -----------------------------------------------------------------------------
|
||||
function hideSpinner()
|
||||
{
|
||||
$("#loadingSpinner").hide()
|
||||
|
||||
function hideSpinner() {
|
||||
clearTimeout(spinnerTimeout);
|
||||
|
||||
const spinner = $("#loadingSpinner");
|
||||
|
||||
if (spinner.length) {
|
||||
spinner.removeClass("visible");
|
||||
spinner.fadeOut(animationTime);
|
||||
|
||||
spinnerTimeout = setTimeout(() => {
|
||||
spinner.removeClass("visible");
|
||||
spinner.fadeOut(animationTime); // optional remove or hide again
|
||||
}, 300);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// --------------------------------------------------------
|
||||
// Calls a backend function to add a front-end event to an execution queue
|
||||
|
||||
@@ -363,8 +363,6 @@ function removeAllOptions(element) {
|
||||
function selectAll(element) {
|
||||
settingsChanged();
|
||||
|
||||
// Get the <select> element with the class 'deviceSelector'
|
||||
// var selectElement = $('.deviceSelector select');
|
||||
var selectElement = $(`#${$(element).attr("my-input-to")}`);
|
||||
|
||||
// Iterate over each option within the select element
|
||||
@@ -381,8 +379,6 @@ function selectAll(element) {
|
||||
// UN-Select All
|
||||
function unselectAll(element) {
|
||||
settingsChanged();
|
||||
// Get the <select> element with the class 'deviceSelector'
|
||||
// var selectElement = $('.deviceSelector select');
|
||||
var selectElement = $(`#${$(element).attr("my-input-to")}`);
|
||||
|
||||
// Iterate over each option within the select element
|
||||
@@ -399,8 +395,7 @@ function unselectAll(element) {
|
||||
// Trigger change to open up the dropdown filed
|
||||
function selectChange(element) {
|
||||
settingsChanged();
|
||||
// Get the <select> element with the class 'deviceSelector'
|
||||
// var selectElement = $('.deviceSelector select');
|
||||
|
||||
var selectElement = $(`#${$(element).attr("my-input-to")}`);
|
||||
|
||||
selectElement.parent().find("input").focus().click();
|
||||
@@ -624,6 +619,7 @@ function generateOptionsOrSetOptions(
|
||||
// console.log( setKey);
|
||||
|
||||
// NOTE {value} options to replace with a setting or SQL value are handled in the cacheSettings() function
|
||||
// obj.push({ id: item, name: item })
|
||||
options = arrayToObject(createArray(overrideOptions ? overrideOptions : getSettingOptions(setKey)))
|
||||
|
||||
|
||||
@@ -689,6 +685,13 @@ function reverseTransformers(val, transformers) {
|
||||
// retrieve string
|
||||
val = getString(val);
|
||||
break;
|
||||
case "deviceChip":
|
||||
mac = val // value is mac
|
||||
val = `${getDevDataByMac(mac, "devName")}`
|
||||
break;
|
||||
case "deviceRelType":
|
||||
val = val; // nothing to do
|
||||
break;
|
||||
default:
|
||||
console.warn(`Unknown transformer: ${transformer}`);
|
||||
}
|
||||
@@ -822,13 +825,14 @@ function arrayToObject(array) {
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Processor to generate options
|
||||
// options - available options
|
||||
// valuesArray - values = selected options
|
||||
function generateOptions(options, valuesArray, targetField, transformers, placeholder) {
|
||||
var optionsHtml = "";
|
||||
|
||||
resultArray = []
|
||||
selectedArray = []
|
||||
cssClass = ""
|
||||
|
||||
cssClass = ""
|
||||
|
||||
// determine if options or values are used in the listing
|
||||
if (valuesArray.length > 0 && options.length > 0){
|
||||
@@ -847,7 +851,6 @@ function generateOptions(options, valuesArray, targetField, transformers, placeh
|
||||
// dropdown -> options only (value == 1 STRING not ARRAY)
|
||||
resultArray = options;
|
||||
}
|
||||
|
||||
|
||||
// Create a map to track the index of each item in valuesArray
|
||||
const orderMap = new Map(valuesArray.map((item, index) => [item, index]));
|
||||
@@ -1007,10 +1010,12 @@ function generateFormHtml(settingsData, set, overrideValue, overrideOptions, ori
|
||||
class="form-control ${addCss} ${cssClasses}"
|
||||
name="${setKey}"
|
||||
id="${setKey}"
|
||||
my-transformers=${transformers}
|
||||
my-customparams="${customParams}"
|
||||
my-customid="${customId}"
|
||||
my-originalSetKey="${originalSetKey}"
|
||||
${multi}>
|
||||
${multi}
|
||||
${readOnly ? "disabled" : ""}>
|
||||
<option value="" id="${setKey + "_temp_"}"></option>
|
||||
</select>`;
|
||||
|
||||
@@ -1188,22 +1193,49 @@ function generateFormHtml(settingsData, set, overrideValue, overrideOptions, ori
|
||||
|
||||
const eventsList = createArray(set['setEvents']);
|
||||
// inline buttons events
|
||||
|
||||
if (eventsList.length > 0) {
|
||||
eventsList.forEach(event => {
|
||||
let eventIcon = "fa-play";
|
||||
|
||||
if (eventsList.length > 0) {
|
||||
eventsList.forEach(event => {
|
||||
switch (event) {
|
||||
case "select_icon":
|
||||
eventIcon = "fa-chevron-down";
|
||||
break;
|
||||
case "add_icon":
|
||||
case "add_option":
|
||||
eventIcon = "fa-square-plus";
|
||||
break;
|
||||
case "copy_icons":
|
||||
eventIcon = "fa-copy";
|
||||
break;
|
||||
case "go_to_device":
|
||||
eventIcon = "fa-square-up-right";
|
||||
break;
|
||||
case "go_to_node":
|
||||
eventIcon = "fa-sitemap fa-rotate-270";
|
||||
break;
|
||||
case "run":
|
||||
eventIcon = "fa-play";
|
||||
break;
|
||||
case "test":
|
||||
eventIcon = "fa-vial-circle-check";
|
||||
break;
|
||||
default:
|
||||
eventIcon = "fa-play";
|
||||
break;
|
||||
}
|
||||
|
||||
eventsHtml += `<span class="input-group-addon pointer"
|
||||
id="${`${event}_${setKey}`}"
|
||||
data-myparam-setkey="${setKey}"
|
||||
data-myparam="${setKey}"
|
||||
data-myparam-plugin="${setKey.split('_')[0] || ''}"
|
||||
data-myevent="${event}"
|
||||
onclick="execute_settingEvent(this)">
|
||||
<i title="${getString(event + "_event_tooltip")}" class="fa ${getString(event + "_event_icon")}"></i>
|
||||
</span>`;
|
||||
});
|
||||
}
|
||||
eventsHtml += `<span class="input-group-addon pointer"
|
||||
id="${`${event}_${setKey}`}"
|
||||
data-myparam-setkey="${setKey}"
|
||||
data-myparam="${setKey}"
|
||||
data-myparam-plugin="${setKey.split('_')[0] || ''}"
|
||||
data-myevent="${event}"
|
||||
onclick="execute_settingEvent(this)">
|
||||
<i title="${getString(event + "_event_tooltip")}" class="fa ${eventIcon}"></i>
|
||||
</span>`;
|
||||
});
|
||||
}
|
||||
|
||||
// Combine and return the final HTML
|
||||
return inputHtml + eventsHtml;
|
||||
|
||||
@@ -8,64 +8,6 @@
|
||||
----------------------------------------------------------------------------- */
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Initialize device selectors / pickers fields
|
||||
// -----------------------------------------------------------------------------
|
||||
function initDeviceSelectors(devicesListAll_JSON) {
|
||||
|
||||
// Check if both device list exists
|
||||
if (devicesListAll_JSON) {
|
||||
// Parse the JSON string to get the device list array
|
||||
var devicesList = JSON.parse(devicesListAll_JSON);
|
||||
|
||||
var selectorFieldsHTML = ''
|
||||
|
||||
// Loop through the devices list
|
||||
devicesList.forEach(function(device) {
|
||||
|
||||
selectorFieldsHTML += `<option value="${device.devMac}">${device.devName}</option>`;
|
||||
});
|
||||
|
||||
selector = `<div class="db_info_table_row col-sm-12" >
|
||||
<div class="form-group" >
|
||||
<div class="input-group col-sm-12 " >
|
||||
<select class="form-control select2 select2-hidden-accessible" multiple="" style="width: 100%;" tabindex="-1" aria-hidden="true">
|
||||
${selectorFieldsHTML}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>`
|
||||
|
||||
|
||||
// Find HTML elements with class "deviceSelector" and append selector field
|
||||
$('.deviceSelector').append(selector);
|
||||
}
|
||||
|
||||
// Initialize selected items after a delay so selected macs are available in the context
|
||||
setTimeout(function(){
|
||||
// Retrieve MAC addresses from query string or cache
|
||||
var macs = getQueryString('macs') || getCache('selectedDevices');
|
||||
|
||||
if(macs)
|
||||
{
|
||||
// Split MAC addresses if they are comma-separated
|
||||
macs = macs.split(',');
|
||||
|
||||
console.log(macs)
|
||||
|
||||
// Loop through macs to be selected list
|
||||
macs.forEach(function(mac) {
|
||||
|
||||
// Create the option and append to Select2
|
||||
var option = new Option($('.deviceSelector select option[value="' + mac + '"]').html(), mac, true, true);
|
||||
|
||||
$('.deviceSelector select').append(option).trigger('change');
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}, 10);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Utility function to generate a random API token in the format t_<random string of specified length>
|
||||
@@ -128,9 +70,6 @@ function getRandomBytes(elem, length) {
|
||||
targetElement.val(formattedHex);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// ----------------------------------------------
|
||||
// Updates the icon preview
|
||||
function updateAllIconPreviews() {
|
||||
@@ -342,6 +281,7 @@ function execute_settingEvent(element) {
|
||||
feSetKey = $(element).attr('data-myparam-setkey');
|
||||
feParam = $(element).attr('data-myparam');
|
||||
feSourceId = $(element).attr('id');
|
||||
feValue = $("#"+feSetKey).val();
|
||||
|
||||
if (["test", "run"].includes(feEvent)) {
|
||||
// Calls a backend function to add a front-end event (specified by the attributes 'data-myevent' and 'data-myparam-plugin' on the passed element) to an execution queue
|
||||
@@ -383,8 +323,12 @@ function execute_settingEvent(element) {
|
||||
() => addIconAsBase64(element), // Wrap in an arrow function
|
||||
feSourceId // triggered by id
|
||||
);
|
||||
} else if (["copy_icons"].includes(feEvent)) {
|
||||
} else if (["select_icon"].includes(feEvent)) {
|
||||
|
||||
showIconSelection(feSetKey)
|
||||
// myparam-setkey
|
||||
|
||||
} else if (["copy_icons"].includes(feEvent)) {
|
||||
|
||||
// Ask overwrite icon types
|
||||
showModalWarning (
|
||||
@@ -394,9 +338,12 @@ function execute_settingEvent(element) {
|
||||
getString('Gen_Okay'),
|
||||
'overwriteIconType'
|
||||
);
|
||||
} else if (["go_to_node"].includes(feEvent)) {
|
||||
} else if (["go_to_device"].includes(feEvent)) {
|
||||
|
||||
goToNetworkNode('NEWDEV_devParentMAC');
|
||||
goToDevice(feValue);
|
||||
} else if (["go_to_node"].includes(feEvent)) {
|
||||
|
||||
goToNetworkNode(feValue);
|
||||
|
||||
} else {
|
||||
console.warn(`🔺Not implemented: ${feEvent}`)
|
||||
@@ -408,12 +355,24 @@ function execute_settingEvent(element) {
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Go to the correct network node in the Network section
|
||||
function goToNetworkNode(dropdownId)
|
||||
{
|
||||
setCache('activeNetworkTab', $('#'+dropdownId).val().replaceAll(":","_")+'_id');
|
||||
function goToNetworkNode(mac)
|
||||
{
|
||||
setCache('activeNetworkTab', mac.replaceAll(":","_")+'_id');
|
||||
window.location.href = './network.php';
|
||||
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Go to the device
|
||||
function goToDevice(mac, newtab = false) {
|
||||
const url = './deviceDetails.php?mac=' + encodeURIComponent(mac);
|
||||
|
||||
if (newtab) {
|
||||
window.open(url, '_blank');
|
||||
} else {
|
||||
window.location.href = url;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------
|
||||
@@ -494,10 +453,11 @@ function addIconAsBase64 (el) {
|
||||
|
||||
}
|
||||
|
||||
// -----------------------------------------------
|
||||
// modal pop up for icon selection
|
||||
function showIconSelection(setKey) {
|
||||
|
||||
|
||||
function showIconSelection() {
|
||||
const selectElement = document.getElementById('NEWDEV_devIcon');
|
||||
const selectElement = document.getElementById(setKey);
|
||||
const modalId = 'dynamicIconModal';
|
||||
|
||||
// Create modal HTML dynamically
|
||||
@@ -574,19 +534,9 @@ function showIconSelection() {
|
||||
|
||||
}
|
||||
|
||||
// "Device_TableHead_Owner",
|
||||
// "Device_TableHead_Type",
|
||||
// "Device_TableHead_Group",
|
||||
// "Device_TableHead_Status",
|
||||
// "Device_TableHead_Location",
|
||||
// "Device_TableHead_Vendor",
|
||||
// "Device_TableHead_SyncHubNodeName",
|
||||
// "Device_TableHead_NetworkSite",
|
||||
// "Device_TableHead_SSID",
|
||||
// "Device_TableHead_SourcePlugin"
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Get teh correct db column code name based on table header title string
|
||||
// Get the correct db column code name based on table header title string
|
||||
function getColumnNameFromLangString(headStringKey) {
|
||||
columnNameMap = {
|
||||
"Device_TableHead_Name": "devName",
|
||||
@@ -615,12 +565,96 @@ function getColumnNameFromLangString(headStringKey) {
|
||||
"Device_TableHead_SourcePlugin": "devSourcePlugin",
|
||||
"Device_TableHead_PresentLastScan": "devPresentLastScan",
|
||||
"Device_TableHead_AlertDown": "devAlertDown",
|
||||
"Device_TableHead_CustomProps": "devCustomProps"
|
||||
"Device_TableHead_CustomProps": "devCustomProps",
|
||||
"Device_TableHead_FQDN": "devFQDN",
|
||||
"Device_TableHead_ParentRelType": "devParentRelType",
|
||||
"Device_TableHead_ReqNicsOnline": "devReqNicsOnline"
|
||||
};
|
||||
|
||||
return columnNameMap[headStringKey] || "";
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// Generating the device status chip
|
||||
function getStatusBadgeParts(devPresentLastScan, devAlertDown, devMac, statusText = '') {
|
||||
let css = 'bg-gray text-white statusUnknown';
|
||||
let icon = '<i class="fa-solid fa-question"></i>';
|
||||
let status = 'unknown';
|
||||
let cssText = '';
|
||||
|
||||
if (devPresentLastScan == 1) {
|
||||
css = 'bg-green text-white statusOnline';
|
||||
cssText = 'text-green';
|
||||
icon = '<i class="fa-solid fa-plug"></i>';
|
||||
status = 'online';
|
||||
} else if (devAlertDown == 1) {
|
||||
css = 'bg-red text-white statusDown';
|
||||
cssText = 'text-red';
|
||||
icon = '<i class="fa-solid fa-triangle-exclamation"></i>';
|
||||
status = 'down';
|
||||
} else if (devPresentLastScan != 1) {
|
||||
css = 'bg-gray text-white statusOffline';
|
||||
cssText = 'text-gray50';
|
||||
icon = '<i class="fa-solid fa-xmark"></i>';
|
||||
status = 'offline';
|
||||
}
|
||||
|
||||
const cleanedText = statusText.replace(/-/g, '');
|
||||
const url = `deviceDetails.php?mac=${encodeURIComponent(devMac)}`;
|
||||
|
||||
return {
|
||||
cssClass: css,
|
||||
cssText: cssText,
|
||||
iconHtml: icon,
|
||||
mac: devMac,
|
||||
text: cleanedText,
|
||||
status: status,
|
||||
url: url
|
||||
};
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
// Getting the color and css class for device relationships
|
||||
function getRelationshipConf(relType) {
|
||||
let cssClass = '';
|
||||
let color = '';
|
||||
|
||||
// --color-aqua: #00c0ef;
|
||||
// --color-blue: #0060df;
|
||||
// --color-green: #00a65a;
|
||||
// --color-yellow: #f39c12;
|
||||
// --color-red: #dd4b39;
|
||||
|
||||
switch (relType) {
|
||||
|
||||
case "child":
|
||||
color = "#f39c12"; // yellow
|
||||
cssClass = "text-yellow";
|
||||
break;
|
||||
case "nic":
|
||||
color = "#dd4b39"; // red
|
||||
cssClass = "text-red";
|
||||
break;
|
||||
case "virtual":
|
||||
color = "#0060df"; // blue
|
||||
cssClass = "text-blue";
|
||||
break;
|
||||
case "logical":
|
||||
color = "#00a65a"; // green
|
||||
cssClass = "text-green";
|
||||
break;
|
||||
default:
|
||||
color = "#5B5B66"; // grey
|
||||
cssClass = "text-light-grey";
|
||||
break;
|
||||
}
|
||||
|
||||
return {
|
||||
cssClass: cssClass,
|
||||
color: color
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// initialize
|
||||
@@ -634,17 +668,90 @@ function initSelect2() {
|
||||
// check if cache ready
|
||||
if(isValidJSON(devicesListAll_JSON))
|
||||
{
|
||||
// prepare HTML DOM before initializing the frotend
|
||||
initDeviceSelectors(devicesListAll_JSON)
|
||||
|
||||
|
||||
// --------------------------------------------------------
|
||||
//Initialize Select2 Elements and make them sortable
|
||||
|
||||
$(function () {
|
||||
// Iterate over each Select2 dropdown
|
||||
$('.select2').each(function() {
|
||||
var selectEl = $(this).select2();
|
||||
$('.select2').each(function() {
|
||||
// handle Device chips, if my-transformers="deviceChip"
|
||||
if($(this).attr("my-transformers") == "deviceChip")
|
||||
{
|
||||
var selectEl = $(this).select2({
|
||||
templateSelection: function (data, container) {
|
||||
if (!data.id) return data.text; // default for placeholder etc.
|
||||
|
||||
const device = getDevDataByMac(data.id);
|
||||
|
||||
const badge = getStatusBadgeParts(
|
||||
device.devPresentLastScan,
|
||||
device.devAlertDown,
|
||||
device.devMac
|
||||
)
|
||||
|
||||
$(container).addClass(badge.cssClass);
|
||||
|
||||
// Custom HTML
|
||||
const html = $(`
|
||||
<a href="${badge.url}" target="_blank">
|
||||
<span class="custom-chip hover-node-info"
|
||||
data-name="${device.devName}"
|
||||
data-ip="${device.devLastIP}"
|
||||
data-mac="${device.devMac}"
|
||||
data-vendor="${device.devVendor}"
|
||||
data-type="${device.devType}"
|
||||
data-lastseen="${device.devLastConnection}"
|
||||
data-firstseen="${device.devFirstConnection}"
|
||||
data-relationship="${device.devParentRelType}"
|
||||
data-status="${device.devStatus}"
|
||||
data-present="${device.devPresentLastScan}"
|
||||
data-alert="${device.devAlertDown}"
|
||||
data-icon="${device.devIcon}"
|
||||
>
|
||||
<span class="iconPreview">${atob(device.devIcon)}</span>
|
||||
${data.text}
|
||||
<span>
|
||||
(${badge.iconHtml})
|
||||
</span
|
||||
</span>
|
||||
</a>
|
||||
`);
|
||||
|
||||
return html;
|
||||
},
|
||||
escapeMarkup: function (m) {
|
||||
return m; // Allow HTML
|
||||
}
|
||||
});
|
||||
|
||||
} else if($(this).attr("my-transformers") == "deviceRelType") // handling dropdown for relationships
|
||||
{
|
||||
var selectEl = $(this).select2({
|
||||
minimumResultsForSearch: Infinity,
|
||||
templateSelection: function (data, container) {
|
||||
if (!data.id) return data.text; // default for placeholder etc.
|
||||
|
||||
const relConf = getRelationshipConf(data.text);
|
||||
|
||||
// Custom HTML
|
||||
const html = $(`
|
||||
<span class="custom-chip ${relConf.cssClass}" >
|
||||
${data.text}
|
||||
</span>
|
||||
`);
|
||||
|
||||
return html;
|
||||
},
|
||||
escapeMarkup: function (m) {
|
||||
return m; // Allow HTML
|
||||
}
|
||||
});
|
||||
|
||||
} else // default handling - default template
|
||||
{
|
||||
var selectEl = $(this).select2();
|
||||
}
|
||||
|
||||
// Apply sortable functionality to the dropdown's dropdown-container
|
||||
selectEl.next().children().children().children().sortable({
|
||||
@@ -675,14 +782,127 @@ function initSelect2() {
|
||||
}
|
||||
}
|
||||
|
||||
// init functions after dom loaded
|
||||
window.addEventListener("load", function() {
|
||||
// try to initialize
|
||||
setTimeout(() => {
|
||||
initSelect2()
|
||||
// initializeiCheck();
|
||||
}, 1000);
|
||||
});
|
||||
// ------------------------------------------
|
||||
// Display device info on hover (attach only once)
|
||||
function initHoverNodeInfo() {
|
||||
if ($('#hover-box').length === 0) {
|
||||
$('<div id="hover-box"></div>').appendTo('body').hide().css({
|
||||
position: 'absolute',
|
||||
zIndex: 9999,
|
||||
border: '1px solid #ccc',
|
||||
borderRadius: '8px',
|
||||
padding: '10px',
|
||||
boxShadow: '0 4px 12px rgba(0,0,0,0.15)',
|
||||
minWidth: '200px',
|
||||
maxWidth: '300px',
|
||||
fontSize: '14px',
|
||||
pointerEvents: 'none',
|
||||
backgroundColor: '#fff'
|
||||
});
|
||||
}
|
||||
|
||||
// check if handlers already attached to prevent flickering
|
||||
if (initHoverNodeInfo._handlersAttached) return;
|
||||
initHoverNodeInfo._handlersAttached = true;
|
||||
|
||||
let hoverTimeout = null;
|
||||
let lastTarget = null;
|
||||
|
||||
// remove title as it's replaced by the hover-box
|
||||
$(document).on('mouseover', '.hover-node-info', function () {
|
||||
this.removeAttribute('title');
|
||||
|
||||
$(this).attr("title", ""); // remove title as it's replaced by the hover-box
|
||||
});
|
||||
|
||||
$(document).on('mouseenter', '.hover-node-info', function (e) {
|
||||
const $el = $(this);
|
||||
lastTarget = this;
|
||||
|
||||
// use timeout to prevent a quick hover and exit toi flash a card when navigating to a target node with your mouse
|
||||
clearTimeout(hoverTimeout);
|
||||
|
||||
hoverTimeout = setTimeout(() => {
|
||||
if (lastTarget !== this) return;
|
||||
|
||||
const icon = $el.data('icon');
|
||||
const name = $el.data('name') || 'Unknown';
|
||||
const ip = $el.data('ip') || 'N/A';
|
||||
const mac = $el.data('mac') || 'N/A';
|
||||
const vendor = $el.data('vendor') || 'Unknown';
|
||||
const type = $el.data('type') || 'Unknown';
|
||||
const lastseen = $el.data('lastseen') || 'Unknown';
|
||||
const firstseen = $el.data('firstseen') || 'Unknown';
|
||||
const relationship = $el.data('relationship') || 'Unknown';
|
||||
const badge = getStatusBadgeParts( $el.data('present'), $el.data('alert'), $el.data('mac'))
|
||||
const status =`<span class="badge ${badge.cssClass}">${badge.iconHtml} ${badge.status}</span>`
|
||||
|
||||
const html = `
|
||||
<div>
|
||||
<b> <div class="iconPreview">${atob(icon)}</div> </b><b class="devName"> ${name}</b><br>
|
||||
</div>
|
||||
<hr/>
|
||||
<div class="line">
|
||||
<b>Status:</b> <span>${status}</span><br>
|
||||
</div>
|
||||
<div class="line">
|
||||
<b>IP:</b> <span>${ip}</span><br>
|
||||
</div>
|
||||
<div class="line">
|
||||
<b>MAC:</b> <span>${mac}</span><br>
|
||||
</div>
|
||||
<div class="line">
|
||||
<b>Vendor:</b> <span>${vendor}</span><br>
|
||||
</div>
|
||||
<div class="line">
|
||||
<b>Type:</b> <span>${type}</span><br>
|
||||
</div>
|
||||
<div class="line">
|
||||
<b>First seen:</b> <span>${firstseen}</span><br>
|
||||
</div>
|
||||
<div class="line">
|
||||
<b>Last seen:</b> <span>${lastseen}</span><br>
|
||||
</div>
|
||||
<div class="line">
|
||||
<b>Relationship:</b> <span class="${getRelationshipConf(relationship).cssClass}">${relationship}</span>
|
||||
</div>
|
||||
`;
|
||||
|
||||
$('#hover-box').html(html).fadeIn(150);
|
||||
}, 300);
|
||||
});
|
||||
|
||||
$(document).on('mousemove', '.hover-node-info', function (e) {
|
||||
const hoverBox = $('#hover-box');
|
||||
const boxWidth = hoverBox.outerWidth();
|
||||
const boxHeight = hoverBox.outerHeight();
|
||||
const padding = 15;
|
||||
|
||||
const winWidth = $(window).width();
|
||||
const winHeight = $(window).height();
|
||||
|
||||
let left = e.pageX + padding;
|
||||
let top = e.pageY + padding;
|
||||
|
||||
// Position leftward if close to right edge
|
||||
if (e.pageX + boxWidth + padding > winWidth) {
|
||||
left = e.pageX - boxWidth - padding;
|
||||
}
|
||||
|
||||
// Position upward if close to bottom edge
|
||||
if (e.pageY + boxHeight + padding > winHeight) {
|
||||
top = e.pageY - boxHeight - padding;
|
||||
}
|
||||
|
||||
hoverBox.css({ top: top + 'px', left: left + 'px' });
|
||||
});
|
||||
|
||||
$(document).on('mouseleave', '.hover-node-info', function () {
|
||||
clearTimeout(hoverTimeout);
|
||||
lastTarget = null;
|
||||
$('#hover-box').fadeOut(100);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
console.log("init ui_components.js")
|
||||
@@ -17,18 +17,21 @@
|
||||
<h3 class="box-title"><?= lang('Gen_Selected_Devices');?></h3>
|
||||
|
||||
</div>
|
||||
<div class="deviceSelector col-md-11 col-sm-11" style="z-index:5"></div>
|
||||
|
||||
<div class="col-md-1">
|
||||
<button type="button" class="btn btn-default col-md-12" onclick="markAllSelected()" title="<?= lang('Gen_Add_All');?>">
|
||||
<i class="fa-solid fa-circle-check"></i>
|
||||
</button>
|
||||
<button type="button" class="btn btn-default col-md-12" onclick="markAllNotSelected()" title="<?= lang('Gen_Remove_All');?>">
|
||||
<i class="fa-solid fa-circle-xmark"></i>
|
||||
</button>
|
||||
<div class="deviceSelector col-md-11 col-sm-11" style="z-index:5">
|
||||
<div class="db_info_table_row col-sm-12" >
|
||||
<div class="form-group" >
|
||||
<div class="input-group col-sm-12 " >
|
||||
<select class="form-control select2 select2-hidden-accessible" multiple="" style="width: 100%;" tabindex="-1" aria-hidden="true">
|
||||
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-1 hoverHighlight">
|
||||
<i class="fa-solid fa-circle-check hoverHighlight pointer" onclick="markAllSelected()" title="<?= lang('Gen_Add_All');?>"></i>
|
||||
<i class="fa-solid fa-circle-xmark hoverHighlight pointer" onclick="markAllNotSelected()" title="<?= lang('Gen_Remove_All');?>"></i>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
@@ -77,7 +80,7 @@
|
||||
|
||||
settingsData = res["data"];
|
||||
|
||||
excludedColumns = ["NEWDEV_devMac", "NEWDEV_devFirstConnection", "NEWDEV_devLastConnection", "NEWDEV_devLastNotification", "NEWDEV_devScan", "NEWDEV_devPresentLastScan", "NEWDEV_devCustomProps" ]
|
||||
excludedColumns = ["NEWDEV_devMac", "NEWDEV_devFirstConnection", "NEWDEV_devLastConnection", "NEWDEV_devLastNotification", "NEWDEV_devScan", "NEWDEV_devPresentLastScan", "NEWDEV_devCustomProps", "NEWDEV_devChildrenNicsDynamic", "NEWDEV_devChildrenDynamic" ]
|
||||
|
||||
const relevantColumns = settingsData.filter(set =>
|
||||
set.setGroup === "NEWDEV" &&
|
||||
@@ -208,13 +211,64 @@
|
||||
|
||||
generateSimpleForm(relevantColumns);
|
||||
|
||||
initSelect2();
|
||||
initDeviceSelectors();
|
||||
|
||||
|
||||
})
|
||||
|
||||
}, 500);
|
||||
}, 100);
|
||||
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Initialize device selectors / pickers fields
|
||||
function initDeviceSelectors() {
|
||||
|
||||
// Parse device list
|
||||
devicesList = JSON.parse(getCache('devicesListAll_JSON'));
|
||||
|
||||
// Check if the device list exists and is an array
|
||||
if (Array.isArray(devicesList)) {
|
||||
const $select = $(".deviceSelector select");
|
||||
|
||||
$select.append(
|
||||
devicesList
|
||||
.filter(d => d.devMac && d.devName)
|
||||
.map(d => `<option value="${d.devMac}">${d.devName}</option>`)
|
||||
.join('')
|
||||
).trigger('change');
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Initialize selected items after a delay so selected macs are available in the context
|
||||
setTimeout(function(){
|
||||
// Retrieve MAC addresses from query string or cache
|
||||
var macs = getQueryString('macs') || getCache('selectedDevices');
|
||||
|
||||
if(macs)
|
||||
{
|
||||
// Split MAC addresses if they are comma-separated
|
||||
macs = macs.split(',');
|
||||
|
||||
console.log(macs)
|
||||
|
||||
// Loop through macs to be selected list
|
||||
macs.forEach(function(mac) {
|
||||
|
||||
// Create the option and append to Select2
|
||||
var option = new Option($('.deviceSelector select option[value="' + mac + '"]').html(), mac, true, true);
|
||||
|
||||
$('.deviceSelector select').append(option).trigger('change');
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}, 10);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Get selected devices Macs
|
||||
|
||||
1283
front/network.php
@@ -63,7 +63,7 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||
}
|
||||
|
||||
if (isset ($_REQUEST['rawSql'])) {
|
||||
$rawSql = urldecode(base64_decode($_REQUEST['rawSql']));
|
||||
$rawSql = urldecode(base64_decode($_REQUEST['rawSql'])); // base64 encoded SQL
|
||||
}
|
||||
|
||||
if (isset ($_REQUEST['dbtable'])) {
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
if (isset ($_REQUEST['action']) && !empty ($_REQUEST['action'])) {
|
||||
$action = $_REQUEST['action'];
|
||||
switch ($action) {
|
||||
case 'getServerDeviceData': getServerDeviceData(); break;
|
||||
case 'getServerDeviceData': getServerDeviceData(); break;
|
||||
case 'setDeviceData': setDeviceData(); break;
|
||||
case 'deleteDevice': deleteDevice(); break;
|
||||
case 'deleteAllWithEmptyMACs': deleteAllWithEmptyMACs(); break;
|
||||
@@ -45,8 +45,7 @@
|
||||
case 'ImportCSV': ImportCSV(); break;
|
||||
|
||||
case 'getDevicesTotals': getDevicesTotals(); break;
|
||||
case 'getDevicesList': getDevicesList(); break;
|
||||
case 'getDevicesListCalendar': getDevicesListCalendar(); break;
|
||||
case 'getDevicesListCalendar': getDevicesListCalendar(); break; //todo: slowly deprecate this
|
||||
|
||||
case 'updateNetworkLeaf': updateNetworkLeaf(); break;
|
||||
case 'overwriteIconType': overwriteIconType(); break;
|
||||
@@ -92,6 +91,8 @@ function getServerDeviceData() {
|
||||
"devLogEvents" => 0,
|
||||
"devAlertEvents" => 0,
|
||||
"devAlertDown" => 0,
|
||||
"devParentRelType" => "default",
|
||||
"devReqNicsOnline" => 0,
|
||||
"devSkipRepeated" => 0,
|
||||
"devLastNotification" => "",
|
||||
"devPresentLastScan" => 0,
|
||||
@@ -120,69 +121,87 @@ function getServerDeviceData() {
|
||||
}
|
||||
|
||||
|
||||
// Device Data
|
||||
$sql = 'SELECT rowid, *,
|
||||
CASE WHEN devAlertDown !=0 AND devPresentLastScan=0 THEN "Down"
|
||||
WHEN devPresentLastScan=1 THEN "On-line"
|
||||
ELSE "Off-line" END as devStatus
|
||||
FROM Devices
|
||||
WHERE devMac="'. $mac .'" or cast(rowid as text)="'. $mac. '"';
|
||||
$result = $db->query($sql);
|
||||
$row = $result -> fetchArray (SQLITE3_ASSOC);
|
||||
// Get current date (used in presence calc)
|
||||
$currentdate = date("Y-m-d H:i:s");
|
||||
|
||||
// Fetch Device Info + Children + Events Stats
|
||||
$sql =<<<SQL
|
||||
SELECT
|
||||
d.rowid,
|
||||
d.*,
|
||||
CASE
|
||||
WHEN d.devAlertDown != 0 AND d.devPresentLastScan = 0 THEN "Down"
|
||||
WHEN d.devPresentLastScan = 1 THEN "On-line"
|
||||
ELSE "Off-line"
|
||||
END AS devStatus,
|
||||
|
||||
-- Event counters
|
||||
(SELECT COUNT(*) FROM Sessions
|
||||
WHERE ses_MAC = d.devMac AND (
|
||||
ses_DateTimeConnection >= $periodDate OR
|
||||
ses_DateTimeDisconnection >= $periodDate OR
|
||||
ses_StillConnected = 1
|
||||
)
|
||||
) AS devSessions,
|
||||
|
||||
(SELECT COUNT(*) FROM Events
|
||||
WHERE eve_MAC = d.devMac AND
|
||||
eve_DateTime >= $periodDate AND
|
||||
eve_EventType NOT IN ("Connected", "Disconnected")
|
||||
) AS devEvents,
|
||||
|
||||
(SELECT COUNT(*) FROM Events
|
||||
WHERE eve_MAC = d.devMac AND
|
||||
eve_DateTime >= $periodDate AND
|
||||
eve_EventType = "Device Down"
|
||||
) AS devDownAlerts,
|
||||
|
||||
(SELECT CAST(( MAX (0, SUM (julianday (IFNULL (ses_DateTimeDisconnection,'$currentdate'))
|
||||
- julianday (CASE WHEN ses_DateTimeConnection < $periodDate
|
||||
THEN $periodDate
|
||||
ELSE ses_DateTimeConnection END)) *24 )) AS INT)
|
||||
FROM Sessions
|
||||
WHERE ses_MAC = d.devMac AND
|
||||
ses_DateTimeConnection IS NOT NULL AND
|
||||
(ses_DateTimeDisconnection IS NOT NULL OR ses_StillConnected = 1) AND
|
||||
(
|
||||
ses_DateTimeConnection >= $periodDate OR
|
||||
ses_DateTimeDisconnection >= $periodDate OR
|
||||
ses_StillConnected = 1
|
||||
)
|
||||
) AS devPresenceHours
|
||||
|
||||
FROM Devices d
|
||||
WHERE d.devMac = "$mac" OR CAST(d.rowid AS TEXT) = "$mac"
|
||||
SQL;
|
||||
|
||||
$row = $db->query($sql)->fetchArray(SQLITE3_ASSOC);
|
||||
$deviceData = $row;
|
||||
$mac = $deviceData['devMac'];
|
||||
|
||||
$deviceData['devParentMAC'] = $row['devParentMAC'];
|
||||
$deviceData['devParentPort'] = $row['devParentPort'];
|
||||
$deviceData['devFirstConnection'] = formatDate ($row['devFirstConnection']); // Date formated
|
||||
$deviceData['devLastConnection'] = formatDate ($row['devLastConnection']); // Date formated
|
||||
$deviceData['devFirstConnection'] = formatDate($deviceData['devFirstConnection']);
|
||||
$deviceData['devLastConnection'] = formatDate($deviceData['devLastConnection']);
|
||||
$deviceData['devIsRandomMAC'] = isRandomMAC($mac);
|
||||
|
||||
$deviceData['devIsRandomMAC'] = isRandomMAC($mac);
|
||||
|
||||
// Count Totals
|
||||
$condition = ' WHERE eve_MAC="'. $mac .'" AND eve_DateTime >= '. $periodDate;
|
||||
|
||||
// Connections
|
||||
$sql = 'SELECT COUNT(*) FROM Sessions
|
||||
WHERE ses_MAC="'. $mac .'"
|
||||
AND ( ses_DateTimeConnection >= '. $periodDate .'
|
||||
OR ses_DateTimeDisconnection >= '. $periodDate .'
|
||||
OR ses_StillConnected = 1 )';
|
||||
// Fetch children once and split in PHP
|
||||
$sql = 'SELECT rowid, * FROM Devices WHERE devParentMAC = "' . $mac . '" ORDER BY devPresentLastScan DESC';
|
||||
$result = $db->query($sql);
|
||||
$row = $result -> fetchArray (SQLITE3_NUM);
|
||||
$deviceData['devSessions'] = $row[0];
|
||||
|
||||
// Events
|
||||
$sql = 'SELECT COUNT(*) FROM Events '. $condition .' AND eve_EventType <> "Connected" AND eve_EventType <> "Disconnected" ';
|
||||
$result = $db->query($sql);
|
||||
$row = $result -> fetchArray (SQLITE3_NUM);
|
||||
$deviceData['devEvents'] = $row[0];
|
||||
$children = [];
|
||||
$childrenNics = [];
|
||||
|
||||
// Down Alerts
|
||||
$sql = 'SELECT COUNT(*) FROM Events '. $condition .' AND eve_EventType = "Device Down"';
|
||||
$result = $db->query($sql);
|
||||
$row = $result -> fetchArray (SQLITE3_NUM);
|
||||
$deviceData['devDownAlerts'] = $row[0];
|
||||
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
|
||||
$children[] = $row;
|
||||
if ($row['devParentRelType'] === 'nic') {
|
||||
$childrenNics[] = $row;
|
||||
}
|
||||
}
|
||||
|
||||
// Get current date using php, sql datetime does not return time respective to timezone.
|
||||
$currentdate = date("Y-m-d H:i:s");
|
||||
// Presence hours
|
||||
$sql = 'SELECT CAST(( MAX (0, SUM (julianday (IFNULL (ses_DateTimeDisconnection,"'. $currentdate .'" ))
|
||||
- julianday (CASE WHEN ses_DateTimeConnection < '. $periodDate .' THEN '. $periodDate .'
|
||||
ELSE ses_DateTimeConnection END)) *24 )) AS INT)
|
||||
FROM Sessions
|
||||
WHERE ses_MAC="'. $mac .'"
|
||||
AND ses_DateTimeConnection IS NOT NULL
|
||||
AND (ses_DateTimeDisconnection IS NOT NULL OR ses_StillConnected = 1 )
|
||||
AND ( ses_DateTimeConnection >= '. $periodDate .'
|
||||
OR ses_DateTimeDisconnection >= '. $periodDate .'
|
||||
OR ses_StillConnected = 1 )';
|
||||
$result = $db->query($sql);
|
||||
$row = $result -> fetchArray (SQLITE3_NUM);
|
||||
$deviceData['devPresenceHours'] = round ($row[0]);
|
||||
$deviceData['devChildrenDynamic'] = $children;
|
||||
$deviceData['devChildrenNicsDynamic'] = $childrenNics;
|
||||
|
||||
// Return JSON
|
||||
echo json_encode($deviceData);
|
||||
|
||||
// Return json
|
||||
echo (json_encode ($deviceData));
|
||||
}
|
||||
|
||||
|
||||
@@ -211,6 +230,8 @@ function setDeviceData() {
|
||||
$scancycle = quotes($_POST['scancycle']);
|
||||
$alertevents = quotes($_POST['alertevents']);
|
||||
$alertdown = quotes($_POST['alertdown']);
|
||||
$relType = quotes($_POST['relType']);
|
||||
$reqNics = quotes($_POST['reqNics']);
|
||||
$skiprepeated = quotes($_POST['skiprepeated']);
|
||||
$newdevice = quotes($_POST['newdevice']);
|
||||
$archived = quotes($_POST['archived']);
|
||||
@@ -242,6 +263,8 @@ function setDeviceData() {
|
||||
devScan = '$scancycle',
|
||||
devAlertEvents = '$alertevents',
|
||||
devAlertDown = '$alertdown',
|
||||
devParentRelType = '$relType',
|
||||
devReqNicsOnline = '$reqNics',
|
||||
devSkipRepeated = '$skiprepeated',
|
||||
devIsNew = '$newdevice',
|
||||
devIsArchived = '$archived',
|
||||
@@ -267,6 +290,8 @@ function setDeviceData() {
|
||||
devScan,
|
||||
devAlertEvents,
|
||||
devAlertDown,
|
||||
devParentRelType,
|
||||
devReqNicsOnline,
|
||||
devSkipRepeated,
|
||||
devIsNew,
|
||||
devIsArchived,
|
||||
@@ -295,6 +320,8 @@ function setDeviceData() {
|
||||
'$scancycle',
|
||||
'$alertevents',
|
||||
'$alertdown',
|
||||
'$relType',
|
||||
'$reqNics',
|
||||
'$skiprepeated',
|
||||
'$newdevice',
|
||||
'$archived',
|
||||
@@ -744,143 +771,6 @@ function getDevicesTotals() {
|
||||
echo ($resultJSON);
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Query the List of devices in a determined Status
|
||||
//------------------------------------------------------------------------------
|
||||
function getDevicesList() {
|
||||
global $db;
|
||||
|
||||
$forceDefaultOrder = FALSE;
|
||||
|
||||
if (isset ($_REQUEST['forceDefaultOrder']) )
|
||||
{
|
||||
$forceDefaultOrder = TRUE;
|
||||
}
|
||||
|
||||
// This object is used to map from the old order ( second parameter, first number) to the new mapping, that is represented by the 3rd parameter (Second number)
|
||||
$columnOrderMapping = array(
|
||||
array("devName", 0, 0),
|
||||
array("devOwner", 1, 1),
|
||||
array("devType", 2, 2),
|
||||
array("devIcon", 3, 3),
|
||||
array("devFavorite", 4, 4),
|
||||
array("devGroup", 5, 5),
|
||||
array("devFirstConnection", 6, 6),
|
||||
array("devLastConnection", 7, 7),
|
||||
array("devLastIP", 8, 8),
|
||||
array("devMac", 9, 9),
|
||||
array("devStatus", 10, 10),
|
||||
array("devMac_full", 11, 11),
|
||||
array("devLastIP_orderable", 12, 12),
|
||||
array("rowid", 13, 13),
|
||||
array("devParentMAC", 14, 14),
|
||||
array("connected_devices", 15, 15),
|
||||
array("devLocation", 16, 16),
|
||||
array("devVendor", 17, 17),
|
||||
array("devParentPort", 18, 18),
|
||||
array("devGUID", 19, 19),
|
||||
array("devSyncHubNode", 20, 20),
|
||||
array("devSite", 21, 21),
|
||||
array("devSSID", 22, 22),
|
||||
array("devSourcePlugin", 23, 23)
|
||||
);
|
||||
|
||||
if($forceDefaultOrder == FALSE)
|
||||
{
|
||||
// get device columns order
|
||||
$sql = 'SELECT par_Value FROM Parameters where par_ID = "Front_Devices_Columns_Order"';
|
||||
$result = $db->query($sql);
|
||||
$row = $result -> fetchArray (SQLITE3_NUM);
|
||||
|
||||
if($row != NULL && count($row) == 1)
|
||||
{
|
||||
// ordered columns setting from the maintenance page
|
||||
$orderedColumns = createArray($row[0]);
|
||||
|
||||
// init ordered columns
|
||||
for($i = 0; $i < count($orderedColumns); $i++) {
|
||||
|
||||
$columnOrderMapping[$i][2] = $orderedColumns[$i];
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// SQL
|
||||
$condition = getDeviceCondition ($_REQUEST['status']);
|
||||
|
||||
$sql = 'SELECT * FROM (
|
||||
SELECT rowid, *, CASE
|
||||
WHEN t1.devAlertDown !=0 AND t1.devPresentLastScan=0 THEN "Down"
|
||||
WHEN t1.devIsNew=1 THEN "New"
|
||||
WHEN t1.devPresentLastScan=1 THEN "On-line"
|
||||
ELSE "Off-line" END AS devStatus
|
||||
FROM Devices t1 '.$condition.') t3
|
||||
LEFT JOIN
|
||||
(
|
||||
SELECT devParentMAC as devParentMAC_t2, devMac as devMac_t2,
|
||||
count() as connected_devices
|
||||
FROM Devices b
|
||||
WHERE b.devParentMAC NOT NULL group by b.devParentMAC
|
||||
) t2
|
||||
ON (t3.devMac = t2.devParentMAC_t2);';
|
||||
|
||||
$result = $db->query($sql);
|
||||
|
||||
// arrays of rows
|
||||
$tableData = array();
|
||||
while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
|
||||
$defaultOrder = array (
|
||||
$row['devName'],
|
||||
$row['devOwner'],
|
||||
handleNull($row['devType']),
|
||||
handleNull($row['devIcon'], "PGkgY2xhc3M9J2ZhIGZhLWxhcHRvcCc+PC9pPg=="), // laptop icon
|
||||
$row['devFavorite'],
|
||||
$row['devGroup'],
|
||||
// ----
|
||||
formatDate ($row['devFirstConnection']),
|
||||
formatDate ($row['devLastConnection']),
|
||||
$row['devLastIP'],
|
||||
( isRandomMAC($row['devMac']) ),
|
||||
$row['devStatus'],
|
||||
$row['devMac'], // MAC (hidden)
|
||||
formatIPlong ($row['devLastIP']), // IP orderable
|
||||
$row['rowid'], // Rowid (hidden)
|
||||
handleNull($row['devParentMAC']),
|
||||
handleNull($row['connected_devices']),
|
||||
handleNull($row['devLocation']),
|
||||
handleNull($row['devVendor']),
|
||||
handleNull($row['devParentPort']),
|
||||
handleNull($row['devGUID']),
|
||||
handleNull($row['devSyncHubNode']),
|
||||
handleNull($row['devSite']),
|
||||
handleNull($row['devSSID']),
|
||||
handleNull($row['devSourcePlugin'])
|
||||
);
|
||||
|
||||
$newOrder = array();
|
||||
|
||||
// reorder columns based on user settings
|
||||
for($index = 0; $index < count($columnOrderMapping); $index++)
|
||||
{
|
||||
array_push($newOrder, $defaultOrder[$columnOrderMapping[$index][2]]);
|
||||
}
|
||||
|
||||
$tableData['data'][] = $newOrder;
|
||||
}
|
||||
|
||||
// Control no rows
|
||||
if (empty($tableData['data'])) {
|
||||
$tableData['data'] = '';
|
||||
}
|
||||
|
||||
// Return json
|
||||
echo (json_encode ($tableData));
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Determine if Random MAC
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
@@ -29,7 +29,6 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||
case 'getEvents': getEvents(); break;
|
||||
case 'getDeviceSessions': getDeviceSessions(); break;
|
||||
case 'getDevicePresence': getDevicePresence(); break;
|
||||
case 'getDeviceEvents': getDeviceEvents(); break;
|
||||
case 'getEventsCalendar': getEventsCalendar(); break;
|
||||
default: logServerConsole ('Action: '. $action); break;
|
||||
}
|
||||
@@ -410,41 +409,4 @@ function getEventsCalendar() {
|
||||
echo (json_encode($tableData));
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Query Device events
|
||||
//------------------------------------------------------------------------------
|
||||
function getDeviceEvents() {
|
||||
global $db;
|
||||
|
||||
// Request Parameters
|
||||
$mac = $_REQUEST['mac'];
|
||||
$periodDate = getDateFromPeriod();
|
||||
$hideConnections = $_REQUEST ['hideConnections'];
|
||||
|
||||
// SQL
|
||||
$SQL = 'SELECT eve_DateTime, eve_EventType, eve_IP, eve_AdditionalInfo
|
||||
FROM Events
|
||||
WHERE eve_MAC="'. $mac .'" AND eve_DateTime >= '. $periodDate .'
|
||||
AND ( (eve_EventType <> "Connected" AND eve_EventType <> "Disconnected" AND
|
||||
eve_EventType <> "VOIDED - Connected" AND eve_EventType <> "VOIDED - Disconnected")
|
||||
OR "'. $hideConnections .'" = "false" ) ';
|
||||
$result = $db->query($SQL);
|
||||
|
||||
// arrays of rows
|
||||
$tableData = array();
|
||||
while ($row = $result -> fetchArray (SQLITE3_NUM)) {
|
||||
$row[0] = formatDate ($row[0]);
|
||||
$tableData['data'][] = $row;
|
||||
}
|
||||
|
||||
// Control no rows
|
||||
if (empty($tableData['data'])) {
|
||||
$tableData['data'] = '';
|
||||
}
|
||||
|
||||
// Return json
|
||||
echo (json_encode ($tableData));
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
@@ -587,7 +587,9 @@ function getDevicesColumns(){
|
||||
"devSSID",
|
||||
"devSourcePlugin",
|
||||
"devCustomProps",
|
||||
"devFQDN"
|
||||
"devFQDN",
|
||||
"devParentRelType",
|
||||
"devReqNicsOnline"
|
||||
];
|
||||
|
||||
return $columns;
|
||||
|
||||
@@ -136,7 +136,21 @@
|
||||
<!-- ----------------------------------------------------------------------- -->
|
||||
<!-- Layout Boxed Yellow -->
|
||||
|
||||
<body class="hold-transition fixed <?php echo $pia_skin_selected;?> sidebar-mini" onLoad="update_servertime();" >
|
||||
<!-- spinner -->
|
||||
|
||||
|
||||
<body class="hold-transition fixed <?php echo $pia_skin_selected;?> theme-<?php echo $UI_THEME;?> sidebar-mini" onLoad="update_servertime();" >
|
||||
|
||||
<div id="loadingSpinner">
|
||||
<div class="pa_semitransparent-panel"></div>
|
||||
<div class="panel panel-default pa_spinner">
|
||||
<table>
|
||||
<td id="loadingSpinnerText" width="130px" ></td>
|
||||
<td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></td>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Site wrapper -->
|
||||
<div class="wrapper">
|
||||
|
||||
@@ -297,6 +311,9 @@
|
||||
<li>
|
||||
<a href="devices.php#archived" onclick="forceLoadUrl('devices.php#archived')" > <?= lang("Device_Shortcut_Archived");?> </a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="devices.php#all" onclick="forceLoadUrl('devices.php#all_nodes')" > <?= lang("Device_Shortcut_AllNodes");?> </a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</li>
|
||||
@@ -329,7 +346,7 @@
|
||||
|
||||
<!-- Network menu item -->
|
||||
<li class=" <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('network.php') ) ){ echo 'active'; } ?>">
|
||||
<a href="network.php"><i class="fa fa-fw fa-network-wired"></i> <span><?= lang('Navigation_Network');?></span></a>
|
||||
<a href="network.php"><i class="fa fa-fw fa-sitemap fa-rotate-270"></i> <span><?= lang('Navigation_Network');?></span></a>
|
||||
</li>
|
||||
|
||||
<!-- Maintenance menu item -->
|
||||
|
||||
18
front/php/templates/language/ar_ar.json
Executable file → Normal file
@@ -66,6 +66,7 @@
|
||||
"DAYS_TO_KEEP_EVENTS_name": "مدة الاحتفاظ بالأحداث",
|
||||
"DISCOVER_PLUGINS_description": "اكتشاف المكونات الإضافية المتاحة",
|
||||
"DISCOVER_PLUGINS_name": "اكتشاف المكونات الإضافية",
|
||||
"DevDetail_Children_Title": "",
|
||||
"DevDetail_Copy_Device_Title": "نسخ التفاصيل من الجهاز",
|
||||
"DevDetail_Copy_Device_Tooltip": "انسخ تفاصيل الجهاز من القائمة المنسدلة. سيتم استبدال كل ما في هذه الصفحة.",
|
||||
"DevDetail_CustomProperties_Title": "الخصائص المخصصة",
|
||||
@@ -102,6 +103,7 @@
|
||||
"DevDetail_MainInfo_Type": "النوع",
|
||||
"DevDetail_MainInfo_Vendor": "المصنع",
|
||||
"DevDetail_MainInfo_mac": "عنوان MAC",
|
||||
"DevDetail_NavToChildNode": "",
|
||||
"DevDetail_Network_Node_hover": "انقر للذهاب إلى عقدة الشبكة",
|
||||
"DevDetail_Network_Port_hover": "منفذ الشبكة",
|
||||
"DevDetail_Nmap_Scans": "عمليات فحص Nmap",
|
||||
@@ -200,6 +202,7 @@
|
||||
"Device_MultiEdit_Tooltip": "تعديل الأجهزة المحددة",
|
||||
"Device_Searchbox": "بحث",
|
||||
"Device_Shortcut_AllDevices": "جميع الأجهزة",
|
||||
"Device_Shortcut_AllNodes": "",
|
||||
"Device_Shortcut_Archived": "مؤرشف",
|
||||
"Device_Shortcut_Connected": "متصل",
|
||||
"Device_Shortcut_Devices": "الأجهزة",
|
||||
@@ -226,9 +229,11 @@
|
||||
"Device_TableHead_Name": "الاسم",
|
||||
"Device_TableHead_NetworkSite": "موقع الشبكة",
|
||||
"Device_TableHead_Owner": "المالك",
|
||||
"Device_TableHead_ParentRelType": "",
|
||||
"Device_TableHead_Parent_MAC": "عنوان MAC الأصل",
|
||||
"Device_TableHead_Port": "المنفذ",
|
||||
"Device_TableHead_PresentLastScan": "موجود في آخر فحص",
|
||||
"Device_TableHead_ReqNicsOnline": "",
|
||||
"Device_TableHead_RowID": "معرف الصف",
|
||||
"Device_TableHead_Rowid": "معرف الصف",
|
||||
"Device_TableHead_SSID": "معرف الشبكة اللاسلكية",
|
||||
@@ -486,6 +491,7 @@
|
||||
"Navigation_Workflows": "تدفقات العمل",
|
||||
"Network_Assign": "تعيين",
|
||||
"Network_Cant_Assign": "لا يمكن التعيين",
|
||||
"Network_Cant_Assign_No_Node_Selected": "",
|
||||
"Network_Configuration_Error": "خطأ في التكوين",
|
||||
"Network_Connected": "متصل",
|
||||
"Network_ManageAdd": "إضافة إدارة",
|
||||
@@ -522,6 +528,8 @@
|
||||
"Network_Root": "الجذر",
|
||||
"Network_Root_Not_Configured": "الجذر غير مكون",
|
||||
"Network_Root_Unconfigurable": "الجذر غير قابل للتكوين",
|
||||
"Network_ShowArchived": "",
|
||||
"Network_ShowOffline": "",
|
||||
"Network_Table_Hostname": "اسم المضيف",
|
||||
"Network_Table_IP": "عنوان IP",
|
||||
"Network_Table_State": "الحالة",
|
||||
@@ -704,24 +712,21 @@
|
||||
"WF_Trigger": "المشغل",
|
||||
"WF_Trigger_event_type": "نوع حدث المشغل",
|
||||
"WF_Trigger_type": "نوع المشغل",
|
||||
"add_icon_event_icon": "أيقونة إضافة أيقونة",
|
||||
"add_icon_event_tooltip": "تلميح إضافة أيقونة",
|
||||
"add_option_event_icon": "أيقونة إضافة خيار",
|
||||
"add_option_event_tooltip": "تلميح إضافة خيار",
|
||||
"copy_icons_event_icon": "أيقونة نسخ الأيقونات",
|
||||
"copy_icons_event_tooltip": "تلميح نسخ الأيقونات",
|
||||
"devices_old": "الأجهزة القديمة",
|
||||
"general_event_description": "وصف الحدث العام",
|
||||
"general_event_title": "عنوان الحدث العام",
|
||||
"go_to_node_event_icon": "أيقونة الانتقال إلى العقدة",
|
||||
"go_to_device_event_tooltip": "",
|
||||
"go_to_node_event_tooltip": "تلميح الانتقال إلى العقدة",
|
||||
"new_version_available": "يتوفر إصدار جديد",
|
||||
"report_guid": "معرف التقرير",
|
||||
"report_guid_missing": "معرف التقرير مفقود",
|
||||
"report_select_format": "اختر تنسيق التقرير",
|
||||
"report_time": "وقت التقرير",
|
||||
"run_event_icon": "أيقونة تشغيل الحدث",
|
||||
"run_event_tooltip": "تلميح تشغيل الحدث",
|
||||
"select_icon_event_tooltip": "",
|
||||
"settings_core_icon": "أيقونة الإعدادات الأساسية",
|
||||
"settings_core_label": "تسمية الإعدادات الأساسية",
|
||||
"settings_device_scanners": "ماسحات الأجهزة",
|
||||
@@ -748,6 +753,5 @@
|
||||
"settings_system_icon": "أيقونة النظام",
|
||||
"settings_system_label": "تسمية النظام",
|
||||
"settings_update_item_warning": "تحذير تحديث العنصر",
|
||||
"test_event_icon": "أيقونة اختبار الحدث",
|
||||
"test_event_tooltip": "تلميح اختبار الحدث"
|
||||
}
|
||||
}
|
||||
|
||||
18
front/php/templates/language/ca_ca.json
Executable file → Normal file
@@ -66,6 +66,7 @@
|
||||
"DAYS_TO_KEEP_EVENTS_name": "Esborrar esdeveniments més vells de",
|
||||
"DISCOVER_PLUGINS_description": "Desactiva aquesta opció per accelerar la inicialització i l'estalvi de configuració. Quan està desactivat, els connectors no es descobreixen, i no podeu afegir nous connectors a la configuració <code>LOADED_PLUGINS</code>.",
|
||||
"DISCOVER_PLUGINS_name": "Descobreix els plugins",
|
||||
"DevDetail_Children_Title": "",
|
||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Copiar detalls des del dispositiu",
|
||||
"DevDetail_Copy_Device_Tooltip": "Copiar detalls del dispositius des de la llista desplegable. Tot el d'aquesta pàgina es sobre-escriurà",
|
||||
"DevDetail_CustomProperties_Title": "Propietats personalitzades",
|
||||
@@ -102,6 +103,7 @@
|
||||
"DevDetail_MainInfo_Type": "Tipus",
|
||||
"DevDetail_MainInfo_Vendor": "Venedor",
|
||||
"DevDetail_MainInfo_mac": "MAC",
|
||||
"DevDetail_NavToChildNode": "",
|
||||
"DevDetail_Network_Node_hover": "Seleccioneu el dispositiu de xarxa al qual aquest dispositiu està connectat, per poder omplir l'arbre de xarxa.",
|
||||
"DevDetail_Network_Port_hover": "El port on el dispositiu està connectat al dispositiu de xarxa del pare. Si es deixa buit, sortirà una icona wifi a la representació de la Xarxa.",
|
||||
"DevDetail_Nmap_Scans": "Escaneig manual Nmap",
|
||||
@@ -200,6 +202,7 @@
|
||||
"Device_MultiEdit_Tooltip": "Atenció. Si feu clic a això s'aplicarà el valor de l'esquerra a tots els dispositius seleccionats a dalt.",
|
||||
"Device_Searchbox": "Cerca",
|
||||
"Device_Shortcut_AllDevices": "Els meus dispositius",
|
||||
"Device_Shortcut_AllNodes": "",
|
||||
"Device_Shortcut_Archived": "Arxivat",
|
||||
"Device_Shortcut_Connected": "Connectat",
|
||||
"Device_Shortcut_Devices": "Dispositius",
|
||||
@@ -226,9 +229,11 @@
|
||||
"Device_TableHead_Name": "Nom",
|
||||
"Device_TableHead_NetworkSite": "Network Site",
|
||||
"Device_TableHead_Owner": "Propietari",
|
||||
"Device_TableHead_ParentRelType": "",
|
||||
"Device_TableHead_Parent_MAC": "Node pare de xarxa",
|
||||
"Device_TableHead_Port": "Port",
|
||||
"Device_TableHead_PresentLastScan": "Presència",
|
||||
"Device_TableHead_ReqNicsOnline": "",
|
||||
"Device_TableHead_RowID": "ID de fila",
|
||||
"Device_TableHead_Rowid": "ID de fila",
|
||||
"Device_TableHead_SSID": "SSID",
|
||||
@@ -486,6 +491,7 @@
|
||||
"Navigation_Workflows": "Workflows",
|
||||
"Network_Assign": "Connecta el <i class=\"fa fa-server\"></i> node de Xarxa",
|
||||
"Network_Cant_Assign": "No es pot assignar el node arrel d'Internet com a node fill.",
|
||||
"Network_Cant_Assign_No_Node_Selected": "",
|
||||
"Network_Configuration_Error": "Error de configuració",
|
||||
"Network_Connected": "Dispositius connectats",
|
||||
"Network_ManageAdd": "Afegir dispositiu",
|
||||
@@ -522,6 +528,8 @@
|
||||
"Network_Root": "Node arrel",
|
||||
"Network_Root_Not_Configured": "Seleccioneu un tipus de dispositiu de xarxa, per exemple un tipus <b>Gateway</b>, al camp <b>Tipus</b>del <a href=\"deviceDetails.php?mac=Internet\">dispositiu arrel d'Internet</a> per començar a configurar aquesta pantalla. <br/><br/>. Podeu trobar més documentació a la <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank\">Guia de com configurar la vostra pàgina de xarxa</a>",
|
||||
"Network_Root_Unconfigurable": "Arrel no configurable",
|
||||
"Network_ShowArchived": "",
|
||||
"Network_ShowOffline": "",
|
||||
"Network_Table_Hostname": "Hostname",
|
||||
"Network_Table_IP": "IP",
|
||||
"Network_Table_State": "Estat",
|
||||
@@ -704,24 +712,21 @@
|
||||
"WF_Trigger": "Disparador(Trigger)",
|
||||
"WF_Trigger_event_type": "Tipus d'esdeveniment",
|
||||
"WF_Trigger_type": "Tipus de disparador",
|
||||
"add_icon_event_icon": "fa-square-plus",
|
||||
"add_icon_event_tooltip": "Afegir nova icona",
|
||||
"add_option_event_icon": "fa-square-plus",
|
||||
"add_option_event_tooltip": "Afegir nou valor",
|
||||
"copy_icons_event_icon": "fa-copy",
|
||||
"copy_icons_event_tooltip": "Sobreescriure icones de tots els dispositius amb el mateix tipus de dispositiu",
|
||||
"devices_old": "Refrescant...",
|
||||
"general_event_description": "L'esdeveniment que has desencadenat pot trigar un temps fins que acabin els processos de fons. L'execució acabarà una cop buida la cua d'execució (Comprova el registre d'errors <a href='/maintenance.php#tab_Logging'></a> si hi ha problemes). <br/> <br/> Cua d'execució:",
|
||||
"general_event_title": "Execució d'un esdeveniment ad-hoc",
|
||||
"go_to_node_event_icon": "fa-square-up-right",
|
||||
"go_to_device_event_tooltip": "",
|
||||
"go_to_node_event_tooltip": "Navegació a la pàgina de la Xarxa del node donat",
|
||||
"new_version_available": "Ja està disponible una nova versió.",
|
||||
"report_guid": "Notificació guid:",
|
||||
"report_guid_missing": "No s'ha trobat la notificació enllaçada. Hi ha un petit retard entre les notificacions enviades recentment i que estiguin disponibles. Refresqui la pàgina i la memòria cau d'aquí uns segons. També és possible que la notificació seleccionada s'hagi esborrat durant el manteniment tal com s'especifica a la configuració <code>DBCLNP_NOTIFI_HIST</code>. <br/> <br/>L'última notificació es mostra en el seu lloc. La notificació perduda té el següent GUID:",
|
||||
"report_select_format": "Seleccioneu Format:",
|
||||
"report_time": "Data de recepció:",
|
||||
"run_event_icon": "fa-play",
|
||||
"run_event_tooltip": "Habiliteu la configuració i deseu els canvis al principi abans d'executar-lo.",
|
||||
"select_icon_event_tooltip": "",
|
||||
"settings_core_icon": "fa-solid fa-gem",
|
||||
"settings_core_label": "Nucli",
|
||||
"settings_device_scanners": "Escàners de dispositius utilitzats per descobrir dispositius que escriuen a la taula de base de dades CurrentScan.",
|
||||
@@ -748,6 +753,5 @@
|
||||
"settings_system_icon": "fa-solid fa-gear",
|
||||
"settings_system_label": "Sistema",
|
||||
"settings_update_item_warning": "Actualitza el valor sota. Sigues curós de seguir el format anterior. <b>No hi ha validació.</b>",
|
||||
"test_event_icon": "fa-vial-circle-check",
|
||||
"test_event_tooltip": "Deseu els canvis primer abans de comprovar la configuració."
|
||||
}
|
||||
}
|
||||
|
||||
18
front/php/templates/language/cs_cz.json
Executable file → Normal file
@@ -66,6 +66,7 @@
|
||||
"DAYS_TO_KEEP_EVENTS_name": "",
|
||||
"DISCOVER_PLUGINS_description": "",
|
||||
"DISCOVER_PLUGINS_name": "",
|
||||
"DevDetail_Children_Title": "",
|
||||
"DevDetail_Copy_Device_Title": "",
|
||||
"DevDetail_Copy_Device_Tooltip": "",
|
||||
"DevDetail_CustomProperties_Title": "",
|
||||
@@ -102,6 +103,7 @@
|
||||
"DevDetail_MainInfo_Type": "",
|
||||
"DevDetail_MainInfo_Vendor": "",
|
||||
"DevDetail_MainInfo_mac": "",
|
||||
"DevDetail_NavToChildNode": "",
|
||||
"DevDetail_Network_Node_hover": "",
|
||||
"DevDetail_Network_Port_hover": "",
|
||||
"DevDetail_Nmap_Scans": "",
|
||||
@@ -200,6 +202,7 @@
|
||||
"Device_MultiEdit_Tooltip": "",
|
||||
"Device_Searchbox": "",
|
||||
"Device_Shortcut_AllDevices": "",
|
||||
"Device_Shortcut_AllNodes": "",
|
||||
"Device_Shortcut_Archived": "",
|
||||
"Device_Shortcut_Connected": "",
|
||||
"Device_Shortcut_Devices": "",
|
||||
@@ -226,9 +229,11 @@
|
||||
"Device_TableHead_Name": "",
|
||||
"Device_TableHead_NetworkSite": "",
|
||||
"Device_TableHead_Owner": "",
|
||||
"Device_TableHead_ParentRelType": "",
|
||||
"Device_TableHead_Parent_MAC": "",
|
||||
"Device_TableHead_Port": "",
|
||||
"Device_TableHead_PresentLastScan": "",
|
||||
"Device_TableHead_ReqNicsOnline": "",
|
||||
"Device_TableHead_RowID": "",
|
||||
"Device_TableHead_Rowid": "",
|
||||
"Device_TableHead_SSID": "",
|
||||
@@ -486,6 +491,7 @@
|
||||
"Navigation_Workflows": "",
|
||||
"Network_Assign": "",
|
||||
"Network_Cant_Assign": "",
|
||||
"Network_Cant_Assign_No_Node_Selected": "",
|
||||
"Network_Configuration_Error": "",
|
||||
"Network_Connected": "",
|
||||
"Network_ManageAdd": "",
|
||||
@@ -522,6 +528,8 @@
|
||||
"Network_Root": "",
|
||||
"Network_Root_Not_Configured": "",
|
||||
"Network_Root_Unconfigurable": "",
|
||||
"Network_ShowArchived": "",
|
||||
"Network_ShowOffline": "",
|
||||
"Network_Table_Hostname": "",
|
||||
"Network_Table_IP": "",
|
||||
"Network_Table_State": "",
|
||||
@@ -704,24 +712,21 @@
|
||||
"WF_Trigger": "",
|
||||
"WF_Trigger_event_type": "",
|
||||
"WF_Trigger_type": "",
|
||||
"add_icon_event_icon": "fa-square-plus",
|
||||
"add_icon_event_tooltip": "Přidat novou ikonu",
|
||||
"add_option_event_icon": "fa-square-plus",
|
||||
"add_option_event_tooltip": "Přidat novou hodnotu",
|
||||
"copy_icons_event_icon": "fa-copy",
|
||||
"copy_icons_event_tooltip": "Přepiš ikony všech zařízení za stejný typ zařízení",
|
||||
"devices_old": "Obnovuji…",
|
||||
"general_event_description": "",
|
||||
"general_event_title": "",
|
||||
"go_to_node_event_icon": "",
|
||||
"go_to_device_event_tooltip": "",
|
||||
"go_to_node_event_tooltip": "",
|
||||
"new_version_available": "",
|
||||
"report_guid": "",
|
||||
"report_guid_missing": "",
|
||||
"report_select_format": "",
|
||||
"report_time": "",
|
||||
"run_event_icon": "",
|
||||
"run_event_tooltip": "",
|
||||
"select_icon_event_tooltip": "",
|
||||
"settings_core_icon": "",
|
||||
"settings_core_label": "",
|
||||
"settings_device_scanners": "",
|
||||
@@ -748,6 +753,5 @@
|
||||
"settings_system_icon": "",
|
||||
"settings_system_label": "",
|
||||
"settings_update_item_warning": "",
|
||||
"test_event_icon": "",
|
||||
"test_event_tooltip": ""
|
||||
}
|
||||
}
|
||||
|
||||
18
front/php/templates/language/de_de.json
Executable file → Normal file
@@ -78,6 +78,7 @@
|
||||
"DAYS_TO_KEEP_EVENTS_name": "Ereignisse löschen, die älter sind als",
|
||||
"DISCOVER_PLUGINS_description": "Deaktiviere diese Option, um Initialisierung und Speichern der Einstellungen zu beschleunigen. Wenn es deaktiviert ist, werden keine neuen Plugins gefunden und es können keine manuell hinzugefügt werden.",
|
||||
"DISCOVER_PLUGINS_name": "Entdecke Erweiterungen",
|
||||
"DevDetail_Children_Title": "",
|
||||
"DevDetail_Copy_Device_Title": "Details von Gerät kopieren",
|
||||
"DevDetail_Copy_Device_Tooltip": "Details vom Gerät aus der Dropdown-Liste kopieren. Alles auf dieser Seite wird überschrieben",
|
||||
"DevDetail_CustomProperties_Title": "Benutzerdefinierte Eigenschaften",
|
||||
@@ -114,6 +115,7 @@
|
||||
"DevDetail_MainInfo_Type": "Typ",
|
||||
"DevDetail_MainInfo_Vendor": "Hersteller",
|
||||
"DevDetail_MainInfo_mac": "MAC",
|
||||
"DevDetail_NavToChildNode": "",
|
||||
"DevDetail_Network_Node_hover": "Wählen Sie das Elternnetzgerät aus, an das das aktuelle Gerät angeschlossen ist, um den Netzwerkbaum zu erstellen.",
|
||||
"DevDetail_Network_Port_hover": "Der Port, mit dem dieses Gerät am übergeordneten Netzwerkgerät verbunden ist. Bleibt er leer, wird ein WLAN-Symbol in der Netzwerkstruktur angezeigt.",
|
||||
"DevDetail_Nmap_Scans": "Nmap Scans",
|
||||
@@ -212,6 +214,7 @@
|
||||
"Device_MultiEdit_Tooltip": "Achtung! Beim Drücken werden alle Werte auf die oben ausgewählten Geräte übertragen.",
|
||||
"Device_Searchbox": "Suche",
|
||||
"Device_Shortcut_AllDevices": "Meine Geräte",
|
||||
"Device_Shortcut_AllNodes": "",
|
||||
"Device_Shortcut_Archived": "Archiviert",
|
||||
"Device_Shortcut_Connected": "Verbunden",
|
||||
"Device_Shortcut_Devices": "Geräte",
|
||||
@@ -238,9 +241,11 @@
|
||||
"Device_TableHead_Name": "Name",
|
||||
"Device_TableHead_NetworkSite": "Netzwerkseite",
|
||||
"Device_TableHead_Owner": "Eigentümer",
|
||||
"Device_TableHead_ParentRelType": "",
|
||||
"Device_TableHead_Parent_MAC": "Übergeordneter Netzwerkknoten",
|
||||
"Device_TableHead_Port": "Port",
|
||||
"Device_TableHead_PresentLastScan": "Anwesenheit",
|
||||
"Device_TableHead_ReqNicsOnline": "",
|
||||
"Device_TableHead_RowID": "Zeilen ID",
|
||||
"Device_TableHead_Rowid": "Zeilennummer",
|
||||
"Device_TableHead_SSID": "SSID",
|
||||
@@ -523,6 +528,7 @@
|
||||
"Navigation_Workflows": "Arbeitsabläufe",
|
||||
"Network_Assign": "Zum obigen <i class=\"fa fa-server\"></i> Netzwerkknoten zuweisen",
|
||||
"Network_Cant_Assign": "Internet-Wurzelknoten kann nicht als äußerer Kindknoten zugewiesen werden.",
|
||||
"Network_Cant_Assign_No_Node_Selected": "",
|
||||
"Network_Configuration_Error": "Konfigurationsfehler",
|
||||
"Network_Connected": "Verbundene Geräte",
|
||||
"Network_ManageAdd": "Gerät hinzufügen",
|
||||
@@ -559,6 +565,8 @@
|
||||
"Network_Root": "Wurzelknoten",
|
||||
"Network_Root_Not_Configured": "",
|
||||
"Network_Root_Unconfigurable": "Nicht konfigurierbare Wurzel",
|
||||
"Network_ShowArchived": "",
|
||||
"Network_ShowOffline": "",
|
||||
"Network_Table_Hostname": "Gerätename",
|
||||
"Network_Table_IP": "IP",
|
||||
"Network_Table_State": "Status",
|
||||
@@ -785,24 +793,21 @@
|
||||
"WF_Trigger_type": "Auslösertyp",
|
||||
"Webhooks_display_name": "Webhooks",
|
||||
"Webhooks_icon": "<i class=\"fa fa-circle-nodes\"></i>",
|
||||
"add_icon_event_icon": "",
|
||||
"add_icon_event_tooltip": "Neues Symbol hinzufügen",
|
||||
"add_option_event_icon": "",
|
||||
"add_option_event_tooltip": "Neuen Wert hinzufügen",
|
||||
"copy_icons_event_icon": "",
|
||||
"copy_icons_event_tooltip": "Icons aller Geräte mit demselben Gerätetyp überschreiben",
|
||||
"devices_old": "Aktualisiert...",
|
||||
"general_event_description": "Das Ereignis, das Sie ausgelöst haben, könnte eine Weile dauern, bis Hintergrundprozesse abgeschlossen sind. Die Ausführung endet, wenn die unten ausgeführte Warteschlangen abgearbeitet ist. (Siehe <a href='/maintenance.php#tab_Logging'>error log</a>, wenn Probleme auftreten.)<br/> <br/> Ausführungsschlange:",
|
||||
"general_event_title": "",
|
||||
"go_to_node_event_icon": "",
|
||||
"go_to_device_event_tooltip": "",
|
||||
"go_to_node_event_tooltip": "",
|
||||
"new_version_available": "Es ist eine neue Version verfügbar.",
|
||||
"report_guid": "",
|
||||
"report_guid_missing": "",
|
||||
"report_select_format": "Format auswählen:",
|
||||
"report_time": "Benachrichtigungszeit:",
|
||||
"run_event_icon": "",
|
||||
"run_event_tooltip": "Aktiviere die Einstellung und speichere deine Änderungen, bevor du sie ausführst.",
|
||||
"select_icon_event_tooltip": "",
|
||||
"settings_core_icon": "",
|
||||
"settings_core_label": "Kern",
|
||||
"settings_device_scanners": "",
|
||||
@@ -829,6 +834,5 @@
|
||||
"settings_system_icon": "",
|
||||
"settings_system_label": "System",
|
||||
"settings_update_item_warning": "",
|
||||
"test_event_icon": "",
|
||||
"test_event_tooltip": "Speichere die Änderungen, bevor Sie die Einstellungen testen."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"About_Exit": "Sign out",
|
||||
"About_Title": "Network security scanner & notification framework",
|
||||
"AppEvents_AppEventProcessed": "Processed",
|
||||
"AppEvents_DateTimeCreated": "Discovered On",
|
||||
"AppEvents_DateTimeCreated": "Logged",
|
||||
"AppEvents_Extra": "Extra",
|
||||
"AppEvents_GUID": "Application Event GUID",
|
||||
"AppEvents_Helper1": "Helper 1",
|
||||
@@ -66,6 +66,7 @@
|
||||
"DAYS_TO_KEEP_EVENTS_name": "Delete events older than",
|
||||
"DISCOVER_PLUGINS_description": "Disable this option to speed up initialization and settings saving. When disabled, plugins are not discovered, and you cannot add new plugins to the <code>LOADED_PLUGINS</code> setting.",
|
||||
"DISCOVER_PLUGINS_name": "Discover plugins",
|
||||
"DevDetail_Children_Title": "Children Relationships",
|
||||
"DevDetail_Copy_Device_Title": "Copy details from device",
|
||||
"DevDetail_Copy_Device_Tooltip": "Copy details from device from the dropdown list. Everything on this page will be overwritten",
|
||||
"DevDetail_CustomProperties_Title": "Custom Properties",
|
||||
@@ -102,10 +103,11 @@
|
||||
"DevDetail_MainInfo_Type": "Type",
|
||||
"DevDetail_MainInfo_Vendor": "Vendor",
|
||||
"DevDetail_MainInfo_mac": "MAC",
|
||||
"DevDetail_NavToChildNode": "Open children node",
|
||||
"DevDetail_Network_Node_hover": "Select the parent network device the current device is connected to, to populate the Network tree.",
|
||||
"DevDetail_Network_Port_hover": "The port this device is connected to on the parent network device. If left empty a wifi icon is displayed in the Network tree.",
|
||||
"DevDetail_Nmap_Scans": "Manual Nmap Scans",
|
||||
"DevDetail_Nmap_Scans_desc": "Here you can execute manual NMAP scans. You can also schedule regular automatic NMAP scans via the Services & Ports (NMAP) plugin. Head to <a href='/settings.php' target='_blank'>Settings</a> to find out more",
|
||||
"DevDetail_Nmap_Scans_desc": "Here you can execute manual NMAP scans. You can also schedule regular automatic NMAP scans via the Services & Ports (NMAP) plugin. Head to <a href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Docs</a> to find out more",
|
||||
"DevDetail_Nmap_buttonDefault": "Default Scan",
|
||||
"DevDetail_Nmap_buttonDefault_text": "Default Scan: Nmap scans the top 1,000 ports for each scan protocol requested. This catches roughly 93% of the TCP ports and 49% of the UDP ports. (about 5 seconds)",
|
||||
"DevDetail_Nmap_buttonDetail": "Detailed Scan",
|
||||
@@ -200,6 +202,7 @@
|
||||
"Device_MultiEdit_Tooltip": "Careful. Clicking this will apply the value on the left to all devices selected above.",
|
||||
"Device_Searchbox": "Search",
|
||||
"Device_Shortcut_AllDevices": "My Devices",
|
||||
"Device_Shortcut_AllNodes": "All Nodes",
|
||||
"Device_Shortcut_Archived": "Archived",
|
||||
"Device_Shortcut_Connected": "Connected",
|
||||
"Device_Shortcut_Devices": "Devices",
|
||||
@@ -226,9 +229,11 @@
|
||||
"Device_TableHead_Name": "Name",
|
||||
"Device_TableHead_NetworkSite": "Network Site",
|
||||
"Device_TableHead_Owner": "Owner",
|
||||
"Device_TableHead_ParentRelType": "Relationship Type",
|
||||
"Device_TableHead_Parent_MAC": "Parent network node",
|
||||
"Device_TableHead_Port": "Port",
|
||||
"Device_TableHead_PresentLastScan": "Presence",
|
||||
"Device_TableHead_ReqNicsOnline": "Require NICs Online",
|
||||
"Device_TableHead_RowID": "Row ID",
|
||||
"Device_TableHead_Rowid": "Row ID",
|
||||
"Device_TableHead_SSID": "SSID",
|
||||
@@ -486,6 +491,7 @@
|
||||
"Navigation_Workflows": "Workflows",
|
||||
"Network_Assign": "Connect to the above <i class=\"fa fa-server\"></i> Network node",
|
||||
"Network_Cant_Assign": "Can't assign the root Internet node as a child leaf node.",
|
||||
"Network_Cant_Assign_No_Node_Selected": "Can't assign, no parent node selected.",
|
||||
"Network_Configuration_Error": "Configuration Error",
|
||||
"Network_Connected": "Connected devices",
|
||||
"Network_ManageAdd": "Add Device",
|
||||
@@ -522,6 +528,8 @@
|
||||
"Network_Root": "Root node",
|
||||
"Network_Root_Not_Configured": "Select a network device type, for example a <b>Gateway</b>, in the <b>Type</b> field of the <a href=\"deviceDetails.php?mac=Internet\">the Internet root device</a> to start configuring this screen. <br/><br/> More documentation can be found in the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank\">How to setup your Network page</a> guide",
|
||||
"Network_Root_Unconfigurable": "Unconfigurable root",
|
||||
"Network_ShowArchived": "Show Archived",
|
||||
"Network_ShowOffline": "Show Offline",
|
||||
"Network_Table_Hostname": "Hostname",
|
||||
"Network_Table_IP": "IP",
|
||||
"Network_Table_State": "State",
|
||||
@@ -704,24 +712,21 @@
|
||||
"WF_Trigger": "Trigger",
|
||||
"WF_Trigger_event_type": "Event type",
|
||||
"WF_Trigger_type": "Trigger type",
|
||||
"add_icon_event_icon": "fa-square-plus",
|
||||
"add_icon_event_tooltip": "Add new icon",
|
||||
"add_option_event_icon": "fa-square-plus",
|
||||
"add_option_event_tooltip": "Add new value",
|
||||
"copy_icons_event_icon": "fa-copy",
|
||||
"copy_icons_event_tooltip": "Overwrite icons of all devices with the same device type",
|
||||
"devices_old": "Refreshing…",
|
||||
"general_event_description": "The event you have triggered might take a while until background processes finish. The execution ended once the below execution queue empties (Check the <a href='/maintenance.php#tab_Logging'>error log</a> if you encounter issues). <br/> <br/> Execution queue:",
|
||||
"general_event_title": "Executing an ad-hoc event",
|
||||
"go_to_node_event_icon": "fa-square-up-right",
|
||||
"go_to_device_event_tooltip": "Navigate to the Device",
|
||||
"go_to_node_event_tooltip": "Navigate to the Network page of the given node",
|
||||
"new_version_available": "A new version is available.",
|
||||
"report_guid": "Notification guid:",
|
||||
"report_guid_missing": "Linked notification not found. There is a small delay between recently sent notifications and them being available. Referesh your page and cache after a few seconds. It's also possible the selected notification have been deleted during maintenance as specified in the <code>DBCLNP_NOTIFI_HIST</code> setting. <br/> <br/>The latest notification is displayed instead. The missing notification has the following GUID:",
|
||||
"report_select_format": "Select Format:",
|
||||
"report_time": "Notification time:",
|
||||
"run_event_icon": "fa-play",
|
||||
"run_event_tooltip": "Enable the setting and save your changes at first before you run it.",
|
||||
"select_icon_event_tooltip": "Select icon",
|
||||
"settings_core_icon": "fa-solid fa-gem",
|
||||
"settings_core_label": "Core",
|
||||
"settings_device_scanners": "Device scanners used to discover devices that write into the CurrentScan database table.",
|
||||
@@ -748,6 +753,5 @@
|
||||
"settings_system_icon": "fa-solid fa-gear",
|
||||
"settings_system_label": "System",
|
||||
"settings_update_item_warning": "Update the value below. Be careful to follow the previous format. <b>Validation is not performed.</b>",
|
||||
"test_event_icon": "fa-vial-circle-check",
|
||||
"test_event_tooltip": "Save your changes at first before you test your settings."
|
||||
}
|
||||
18
front/php/templates/language/es_es.json
Executable file → Normal file
@@ -76,6 +76,7 @@
|
||||
"DAYS_TO_KEEP_EVENTS_name": "Eliminar eventos anteriores a",
|
||||
"DISCOVER_PLUGINS_description": "Desactive esta opción para acelerar la inicialización y el ahorro de ajustes. Cuando está desactivado, los plugins no se descubren y no puede añadir nuevos plugins a la configuración <code>LOADED_PLUGINS</code>.",
|
||||
"DISCOVER_PLUGINS_name": "Descubrir plugins",
|
||||
"DevDetail_Children_Title": "",
|
||||
"DevDetail_Copy_Device_Title": "Copiar detalles del dispositivo",
|
||||
"DevDetail_Copy_Device_Tooltip": "Copiar detalles del dispositivo de la lista desplegable. Todo en esta página se sobrescribirá",
|
||||
"DevDetail_CustomProperties_Title": "Propiedades personalizadas",
|
||||
@@ -112,6 +113,7 @@
|
||||
"DevDetail_MainInfo_Type": "Tipo",
|
||||
"DevDetail_MainInfo_Vendor": "Proveedor",
|
||||
"DevDetail_MainInfo_mac": "MAC",
|
||||
"DevDetail_NavToChildNode": "",
|
||||
"DevDetail_Network_Node_hover": "Seleccione el dispositivo de red principal al que está conectado el dispositivo actual para completar el árbol de Red.",
|
||||
"DevDetail_Network_Port_hover": "El puerto al que está conectado este dispositivo en el dispositivo de red principal. Si se deja vacío, se muestra un icono de wifi en el árbol de Red.",
|
||||
"DevDetail_Nmap_Scans": "Escaneos de Nmap",
|
||||
@@ -210,6 +212,7 @@
|
||||
"Device_MultiEdit_Tooltip": "Cuidado. Al hacer clic se aplicará el valor de la izquierda a todos los dispositivos seleccionados anteriormente.",
|
||||
"Device_Searchbox": "Búsqueda",
|
||||
"Device_Shortcut_AllDevices": "Mis dispositivos",
|
||||
"Device_Shortcut_AllNodes": "",
|
||||
"Device_Shortcut_Archived": "Archivado(s)",
|
||||
"Device_Shortcut_Connected": "Conectado(s)",
|
||||
"Device_Shortcut_Devices": "Dispositivos",
|
||||
@@ -236,9 +239,11 @@
|
||||
"Device_TableHead_Name": "Nombre",
|
||||
"Device_TableHead_NetworkSite": "Lugar de la red",
|
||||
"Device_TableHead_Owner": "Propietario",
|
||||
"Device_TableHead_ParentRelType": "",
|
||||
"Device_TableHead_Parent_MAC": "Nodo principal de la red",
|
||||
"Device_TableHead_Port": "Puerto",
|
||||
"Device_TableHead_PresentLastScan": "Historial",
|
||||
"Device_TableHead_ReqNicsOnline": "",
|
||||
"Device_TableHead_RowID": "ID de fila",
|
||||
"Device_TableHead_Rowid": "ID de fila",
|
||||
"Device_TableHead_SSID": "SSID",
|
||||
@@ -521,6 +526,7 @@
|
||||
"Navigation_Workflows": "Flujo de trabajo",
|
||||
"Network_Assign": "Conectar al nodo de <i class=\"fa fa-server\"></i> red",
|
||||
"Network_Cant_Assign": "No se puede asignar el nodo principal de Internet como nodo secundario.",
|
||||
"Network_Cant_Assign_No_Node_Selected": "",
|
||||
"Network_Configuration_Error": "Error en la configuración",
|
||||
"Network_Connected": "Dispositivos conectados",
|
||||
"Network_ManageAdd": "Añadir dispositivo",
|
||||
@@ -557,6 +563,8 @@
|
||||
"Network_Root": "Nodo principal",
|
||||
"Network_Root_Not_Configured": "Seleccione un tipo de dispositivo de red, por ejemplo un <b>Gateway</b>, en el campo <b>Tipo</b> del <a href=\"deviceDetails.php?mac=Internet\">dispositivo principal de Internet</a> para empezar a configurar esta pantalla. <br/><br/>Puede encontrar más documentación en la guía <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank\">¿Cómo configurar su página de Red?</a>",
|
||||
"Network_Root_Unconfigurable": "Root no configurable",
|
||||
"Network_ShowArchived": "",
|
||||
"Network_ShowOffline": "",
|
||||
"Network_Table_Hostname": "Nombre de host",
|
||||
"Network_Table_IP": "Dirección IP",
|
||||
"Network_Table_State": "Estado",
|
||||
@@ -783,24 +791,21 @@
|
||||
"Webhooks_display_name": "Webhooks",
|
||||
"Webhooks_icon": "<i class=\"fa fa-circle-nodes\"></i>",
|
||||
"Webhooks_settings_group": "<i class=\"fa fa-circle-nodes\"></i> Webhooks",
|
||||
"add_icon_event_icon": "fa-square-plus",
|
||||
"add_icon_event_tooltip": "Agregar nuevo icono",
|
||||
"add_option_event_icon": "fa-square-plus",
|
||||
"add_option_event_tooltip": "Añadir nuevo valor",
|
||||
"copy_icons_event_icon": "fa-copy",
|
||||
"copy_icons_event_tooltip": "Sobrescribir los iconos de todos los dispositivos con el mismo tipo de dispositivo",
|
||||
"devices_old": "Volviendo a actualizar....",
|
||||
"general_event_description": "El evento que ha activado puede tardar un poco hasta que finalicen los procesos en segundo plano. La ejecución finalizó una vez que se vacía la cola de ejecución a continuación (consulte el <a href='/maintenance.php#tab_Logging'>registro de errores</a> si encuentra problemas). <br/> <br/> Cola de ejecución:",
|
||||
"general_event_title": "Ejecutar un evento ad-hoc",
|
||||
"go_to_node_event_icon": "fa-square-up-right",
|
||||
"go_to_device_event_tooltip": "",
|
||||
"go_to_node_event_tooltip": "Vaya a la página de Red del nodo indicado",
|
||||
"new_version_available": "Una nueva versión está disponible.",
|
||||
"report_guid": "Guía de las notificaciones:",
|
||||
"report_guid_missing": "No se ha encontrado la notificación vinculada. Hay un pequeño retraso entre las notificaciones enviadas recientemente y su disponibilidad. Actualiza tu página y la caché después de unos segundos. También es posible que la notificación seleccionada se haya eliminado durante el mantenimiento, tal y como se especifica en la configuración <code>de DBCLNP_NOTIFI_HIST</code>. <br/> <br/>En su lugar, se muestra la notificación más reciente. La notificación que falta tiene el siguiente GUID:",
|
||||
"report_select_format": "Selecciona el formato:",
|
||||
"report_time": "Hora de la notificación:",
|
||||
"run_event_icon": "fa-play",
|
||||
"run_event_tooltip": "Activa el ajuste y guarda tus cambios antes de ejecutarlo.",
|
||||
"select_icon_event_tooltip": "",
|
||||
"settings_core_icon": "fa-solid fa-gem",
|
||||
"settings_core_label": "Núcleo",
|
||||
"settings_device_scanners": "Los escáneres de los dispositivos se utilizan para descubrir dispositivos que escriben en la tabla de base de datos de CurrentScan.",
|
||||
@@ -827,6 +832,5 @@
|
||||
"settings_system_icon": "fa-solid fa-gear",
|
||||
"settings_system_label": "Sistema",
|
||||
"settings_update_item_warning": "Actualice el valor a continuación. Tenga cuidado de seguir el formato anterior. <b>O la validación no se realiza.</b>",
|
||||
"test_event_icon": "fa-vial-circle-check",
|
||||
"test_event_tooltip": "Guarda tus cambios antes de probar nuevos ajustes."
|
||||
}
|
||||
}
|
||||
|
||||
20
front/php/templates/language/fr_fr.json
Executable file → Normal file
@@ -66,6 +66,7 @@
|
||||
"DAYS_TO_KEEP_EVENTS_name": "Supprimer les événements plus anciens que",
|
||||
"DISCOVER_PLUGINS_description": "Désactivez cette option pour accélérer le démarrage et l'enregistrement de paramètres. Quand elle est désactivée, les plugins ne sont pas découverts, et vous ne pouvez près ajouter de nouveaux plugins au paramètre <code>LOADED_PLUGINS</code>.",
|
||||
"DISCOVER_PLUGINS_name": "Découvrir des plugins",
|
||||
"DevDetail_Children_Title": "Relations avec les éléments inférieurs",
|
||||
"DevDetail_Copy_Device_Title": "Copier les détails de l'appareil",
|
||||
"DevDetail_Copy_Device_Tooltip": "Copier les détails de l'appareil dans la liste déroulante. Tout ce qui se trouve sur cette page sera remplacé",
|
||||
"DevDetail_CustomProperties_Title": "Champs personnalisés",
|
||||
@@ -102,10 +103,11 @@
|
||||
"DevDetail_MainInfo_Type": "Type",
|
||||
"DevDetail_MainInfo_Vendor": "Fabricant",
|
||||
"DevDetail_MainInfo_mac": "MAC",
|
||||
"DevDetail_NavToChildNode": "Ouvrir le noeud de l'élément inférieur",
|
||||
"DevDetail_Network_Node_hover": "Sélectionner l'appareil du réseau principal auquel cet appareil est connecté afin de compléter l'arborescence du Réseau.",
|
||||
"DevDetail_Network_Port_hover": "Le port auquel cet appareil est connecté sur l'appareil du réseau principal. Si vide, une icône Wifi est affichée dans l'arborescence du Réseau.",
|
||||
"DevDetail_Nmap_Scans": "Scans manuels via Nmap",
|
||||
"DevDetail_Nmap_Scans_desc": "Vous pouvez lancer des scans NMAP manuels. Vous pouvez aussi programmer des sans réguliers via le plugin Services & Ports (NMAP). Aller dans les <a href='/settings.php' target='_blank'>Paramètres</a> pour plus de details",
|
||||
"DevDetail_Nmap_Scans_desc": "Vous pouvez lancer des scans NMAP manuels. Vous pouvez aussi programmer des sans réguliers via le plugin Services & Ports (NMAP). Aller dans les <a href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Docs</a> pour plus de details",
|
||||
"DevDetail_Nmap_buttonDefault": "Scan par défaut",
|
||||
"DevDetail_Nmap_buttonDefault_text": "Scan par défaut : NMAP scanne les 1 000 premiers ports pour chaque demande de scan de protocole. Cela couvre environ 93% des ports TCP et 49% des ports UDP (environ 5 secondes)",
|
||||
"DevDetail_Nmap_buttonDetail": "Scan détaillé",
|
||||
@@ -200,6 +202,7 @@
|
||||
"Device_MultiEdit_Tooltip": "Attention. Ceci va appliquer la valeur de gauche à tous les appareils sélectionnés au-dessus.",
|
||||
"Device_Searchbox": "Rechercher",
|
||||
"Device_Shortcut_AllDevices": "Mes appareils",
|
||||
"Device_Shortcut_AllNodes": "Tous les nœuds",
|
||||
"Device_Shortcut_Archived": "Archivés",
|
||||
"Device_Shortcut_Connected": "Connectés",
|
||||
"Device_Shortcut_Devices": "Appareils",
|
||||
@@ -226,9 +229,11 @@
|
||||
"Device_TableHead_Name": "Nom",
|
||||
"Device_TableHead_NetworkSite": "Site Réseau",
|
||||
"Device_TableHead_Owner": "Propriétaire",
|
||||
"Device_TableHead_ParentRelType": "Type de relation",
|
||||
"Device_TableHead_Parent_MAC": "Nœud réseau principal",
|
||||
"Device_TableHead_Port": "Port",
|
||||
"Device_TableHead_PresentLastScan": "Présence",
|
||||
"Device_TableHead_ReqNicsOnline": "Nécessite que l'interface réseau (NIC) soit connectée",
|
||||
"Device_TableHead_RowID": "ID de colonne",
|
||||
"Device_TableHead_Rowid": "ID de colonne",
|
||||
"Device_TableHead_SSID": "SSID",
|
||||
@@ -486,6 +491,7 @@
|
||||
"Navigation_Workflows": "Flux de travail",
|
||||
"Network_Assign": "Se connecter à ce <i class=\"fa fa-server\"></i> nœud réseau",
|
||||
"Network_Cant_Assign": "Impossible d'assigner le noeud racine Internet comme enfant d'un noeud.",
|
||||
"Network_Cant_Assign_No_Node_Selected": "Impossible d'assigner, aucun noeud parent sélectionné.",
|
||||
"Network_Configuration_Error": "Erreur de configuration",
|
||||
"Network_Connected": "Appareils connectés",
|
||||
"Network_ManageAdd": "Ajouter un appareil",
|
||||
@@ -522,6 +528,8 @@
|
||||
"Network_Root": "Noeud racine",
|
||||
"Network_Root_Not_Configured": "Pour commencer la configuration de cet écran, sélectionner un type d'appareil réseau, par exemple une <b>Gateway</b>, dans le champ <b>Type</b> de <a href=\"deviceDetails.php?mac=Internet\">l'appareil racine pour Internet</a> <br/><br/> Plus d'informations dans le guide <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank\">Comment configurer votre page Réseau</a>",
|
||||
"Network_Root_Unconfigurable": "Racine non configurable",
|
||||
"Network_ShowArchived": "Montrer les archivés",
|
||||
"Network_ShowOffline": "Montrer les hors ligne",
|
||||
"Network_Table_Hostname": "Nom de hôte",
|
||||
"Network_Table_IP": "IP",
|
||||
"Network_Table_State": "État",
|
||||
@@ -704,24 +712,21 @@
|
||||
"WF_Trigger": "Déclencheur",
|
||||
"WF_Trigger_event_type": "Type d'événement",
|
||||
"WF_Trigger_type": "Type de déclencheur",
|
||||
"add_icon_event_icon": "fa-square-plus",
|
||||
"add_icon_event_tooltip": "Ajouter une nouvelle icône",
|
||||
"add_option_event_icon": "fa-square-plus",
|
||||
"add_option_event_tooltip": "Ajouter une nouvelle valeur",
|
||||
"copy_icons_event_icon": "fa-copy",
|
||||
"copy_icons_event_tooltip": "Remplace les icônes de tous les appareils du même type",
|
||||
"devices_old": "Rafraichissement…",
|
||||
"general_event_description": "L'événement que vous avez lancé peut prendre du temps avant que les tâches de fond ne soit terminées. La durée d'exécution finira une fois que la file d'exécution ci-dessous sera vide (consulter les <a href='/maintenance.php#tab_Logging'>journaux d'erreur</a> si vous rencontrez des erreurs). <br/> <br/> File d'exécution :",
|
||||
"general_event_title": "Lancement d'un événement sur mesure",
|
||||
"go_to_node_event_icon": "fa-square-up-right",
|
||||
"go_to_device_event_tooltip": "Naviguer vers cet appareil",
|
||||
"go_to_node_event_tooltip": "Aller vers la page Réseau du nœud concerné",
|
||||
"new_version_available": "Une nouvelle version est disponible.",
|
||||
"report_guid": "GUID de la notification :",
|
||||
"report_guid_missing": "La notification associée n'a pas été trouvée. Un petit délai existe entre l'envoi d'une notification et sa disponibilité réelle pour affichage. Rafraichissez la page et votre cache après quelques secondes. Il est aussi possible que la notification sélectionnée ait été supprimée durant une opération de maintenance, comme renseigné dans le paramètre <code>DBCLNP_NOTIFI_HIST</code>. <br/> <br/> La dernière notification est affichée à sa place. La notification manquante dispose du GUID suivant :",
|
||||
"report_select_format": "Sélectionner un format :",
|
||||
"report_time": "Heure de la notification :",
|
||||
"run_event_icon": "fa-play",
|
||||
"run_event_tooltip": "Activez le paramètre et enregistrez vos changements avant de le lancer.",
|
||||
"select_icon_event_tooltip": "Sélectionner l'icône",
|
||||
"settings_core_icon": "fa-solid fa-gem",
|
||||
"settings_core_label": "Principal",
|
||||
"settings_device_scanners": "Les scanners d'appareils utilisés pour découvrir des appareils, qui écrivent dans la table CurrentScan (scan actuel) de la base de données.",
|
||||
@@ -748,6 +753,5 @@
|
||||
"settings_system_icon": "fa-solid fa-gear",
|
||||
"settings_system_label": "Système",
|
||||
"settings_update_item_warning": "Mettre à jour la valeur ci-dessous. Veillez à bien suivre le même format qu'auparavant. <b>Il n'y a pas de pas de contrôle.</b>",
|
||||
"test_event_icon": "fa-vial-circle-check",
|
||||
"test_event_tooltip": "Enregistrer d'abord vos modifications avant de tester vôtre paramétrage."
|
||||
}
|
||||
}
|
||||
|
||||
20
front/php/templates/language/it_it.json
Executable file → Normal file
@@ -66,6 +66,7 @@
|
||||
"DAYS_TO_KEEP_EVENTS_name": "Elimina eventi più vecchi di",
|
||||
"DISCOVER_PLUGINS_description": "Disattiva questa opzione per velocizzare l'inizializzazione e il salvataggio delle impostazioni. Quando è disattivata, i plugin non vengono scoperti e non puoi aggiungere nuovi plugin all'impostazione <code>LOADED_PLUGINS</code>.",
|
||||
"DISCOVER_PLUGINS_name": "Scopri i plugin",
|
||||
"DevDetail_Children_Title": "Relazioni tra figli",
|
||||
"DevDetail_Copy_Device_Title": "Copia dettagli dal dispositivo",
|
||||
"DevDetail_Copy_Device_Tooltip": "Copia i dettagli dal dispositivo dall'elenco a discesa. Tutto in questa pagina verrà sovrascritto",
|
||||
"DevDetail_CustomProperties_Title": "Proprietà personalizzate",
|
||||
@@ -102,10 +103,11 @@
|
||||
"DevDetail_MainInfo_Type": "Tipo",
|
||||
"DevDetail_MainInfo_Vendor": "Produttore",
|
||||
"DevDetail_MainInfo_mac": "MAC",
|
||||
"DevDetail_NavToChildNode": "Apri nodo figlio",
|
||||
"DevDetail_Network_Node_hover": "Seleziona il dispositivo di rete principale a cui è connesso il dispositivo corrente per popolare la struttura di rete.",
|
||||
"DevDetail_Network_Port_hover": "La porta a cui è connesso questo dispositivo sul dispositivo di rete principale. Se lasciato vuoto, verrà visualizzata un'icona Wi-Fi nella struttura di rete.",
|
||||
"DevDetail_Nmap_Scans": "Scansioni Nmap manuali",
|
||||
"DevDetail_Nmap_Scans_desc": "Qui puoi eseguire scansioni manuali NMAP. Puoi anche pianificare scansioni automatiche NMAP attraverso il plugin Servizi e porte (NMAP). Vai alle <a href='/settings.php' target='_blank'>Impostazioni</a> per scoprire di più",
|
||||
"DevDetail_Nmap_Scans_desc": "Qui puoi eseguire scansioni manuali NMAP. Puoi anche pianificare scansioni automatiche NMAP attraverso il plugin Servizi e porte (NMAP). Vai alla <a href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Documentazione</a> per saperne di più",
|
||||
"DevDetail_Nmap_buttonDefault": "Scansione predefinita",
|
||||
"DevDetail_Nmap_buttonDefault_text": "Scansione predefinita: Nmap scansiona 1000 porte per ogni protocollo richiesto. Questo dovrebbe coprire circa il 93% delle porte TCP e il 49% delle porte UDP (circa 5 secondi)",
|
||||
"DevDetail_Nmap_buttonDetail": "Scansione dettagliata",
|
||||
@@ -200,6 +202,7 @@
|
||||
"Device_MultiEdit_Tooltip": "Attento. Facendo clic verrà applicato il valore sulla sinistra a tutti i dispositivi selezionati sopra.",
|
||||
"Device_Searchbox": "Cerca",
|
||||
"Device_Shortcut_AllDevices": "Miei dispositivi",
|
||||
"Device_Shortcut_AllNodes": "Tutti i nodi",
|
||||
"Device_Shortcut_Archived": "Archiviati",
|
||||
"Device_Shortcut_Connected": "Connessi",
|
||||
"Device_Shortcut_Devices": "Dispositivi",
|
||||
@@ -226,9 +229,11 @@
|
||||
"Device_TableHead_Name": "Nome",
|
||||
"Device_TableHead_NetworkSite": "Sito di rete",
|
||||
"Device_TableHead_Owner": "Proprietario",
|
||||
"Device_TableHead_ParentRelType": "Tipo di relazione",
|
||||
"Device_TableHead_Parent_MAC": "Nodo di rete principale",
|
||||
"Device_TableHead_Port": "Porta",
|
||||
"Device_TableHead_PresentLastScan": "Presenza",
|
||||
"Device_TableHead_ReqNicsOnline": "Richiedi NIC online",
|
||||
"Device_TableHead_RowID": "ID riga",
|
||||
"Device_TableHead_Rowid": "ID riga",
|
||||
"Device_TableHead_SSID": "SSID",
|
||||
@@ -486,6 +491,7 @@
|
||||
"Navigation_Workflows": "Workflow",
|
||||
"Network_Assign": "Connetti al nodo di rete <i class=\"fa fa-server\"></i> sopra",
|
||||
"Network_Cant_Assign": "Impossibile assegnare il nodo Internet root come nodo foglia figlio.",
|
||||
"Network_Cant_Assign_No_Node_Selected": "Impossibile assegnare, nessun nodo padre selezionato.",
|
||||
"Network_Configuration_Error": "Errore di configurazione",
|
||||
"Network_Connected": "Dispositivi connessi",
|
||||
"Network_ManageAdd": "Aggiungi dispositivo",
|
||||
@@ -522,6 +528,8 @@
|
||||
"Network_Root": "Nodo radice",
|
||||
"Network_Root_Not_Configured": "Seleziona un tipo di dispositivo di rete, ad esempio un <b>Gateway</b>, nel campo <b>Tipo</b> del <a href=\"deviceDetails.php?mac=Internet\">dispositivo root Internet</a> per iniziare a configurare questa schermata. <br/><br/> Ulteriore documentazione è disponibile nella guida <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank\"> Come impostare la tua pagina di rete</a>",
|
||||
"Network_Root_Unconfigurable": "Radice non configurabile",
|
||||
"Network_ShowArchived": "Mostra archiviati",
|
||||
"Network_ShowOffline": "Mostra offline",
|
||||
"Network_Table_Hostname": "Nome host",
|
||||
"Network_Table_IP": "IP",
|
||||
"Network_Table_State": "Stato",
|
||||
@@ -704,24 +712,21 @@
|
||||
"WF_Trigger": "Trigger",
|
||||
"WF_Trigger_event_type": "Tipo evento",
|
||||
"WF_Trigger_type": "Tipo di trigger",
|
||||
"add_icon_event_icon": "fa-square-plus",
|
||||
"add_icon_event_tooltip": "Aggiungi nuova icona",
|
||||
"add_option_event_icon": "fa-square-plus",
|
||||
"add_option_event_tooltip": "Aggiungi nuovo valore",
|
||||
"copy_icons_event_icon": "fa-copy",
|
||||
"copy_icons_event_tooltip": "Sovrascrivi le icone di tutti i dispositivi con lo stesso tipo di dispositivo",
|
||||
"devices_old": "Aggiornamento…",
|
||||
"general_event_description": "L'evento che hai attivato potrebbe richiedere del tempo prima che i processi in background vengano completati. L'esecuzione è terminata una volta che la coda di esecuzione sottostante si è svuotata (controlla il <a href='/maintenance.php#tab_Logging'>log degli errori</a> se riscontri problemi). <br/> <br/> Coda di esecuzione:",
|
||||
"general_event_title": "Esecuzione di un evento ad-hoc",
|
||||
"go_to_node_event_icon": "fa-square-up-right",
|
||||
"go_to_device_event_tooltip": "Naviga al dispositivo",
|
||||
"go_to_node_event_tooltip": "Passa alla pagina Rete del nodo specificato",
|
||||
"new_version_available": "È disponibile una nuova versione.",
|
||||
"report_guid": "GUID notifica:",
|
||||
"report_guid_missing": "Notifica collegata non trovata. C'è un piccolo ritardo tra la disponibilità delle notifiche inviate di recente e la loro disponibilità. Aggiorna la pagina e la cache dopo alcuni secondi. È anche possibile che la notifica selezionata sia stata eliminata durante la manutenzione come specificato nell'impostazione <code>DBCLNP_NOTIFI_HIST</code>. <br/> <br/>Viene invece visualizzata l'ultima notifica. La notifica mancante ha il seguente GUID:",
|
||||
"report_select_format": "Seleziona formato:",
|
||||
"report_time": "Orario notifica:",
|
||||
"run_event_icon": "fa-play",
|
||||
"run_event_tooltip": "Abilita l'impostazione e salva le modifiche prima di eseguirla.",
|
||||
"select_icon_event_tooltip": "Seleziona icona",
|
||||
"settings_core_icon": "fa-solid fa-gem",
|
||||
"settings_core_label": "Core",
|
||||
"settings_device_scanners": "Scanner dei dispositivi utilizzati per rilevare i dispositivi che scrivono nella tabella del database CurrentScan.",
|
||||
@@ -748,6 +753,5 @@
|
||||
"settings_system_icon": "fa-solid fa-gear",
|
||||
"settings_system_label": "Sistema",
|
||||
"settings_update_item_warning": "Aggiorna il valore qui sotto. Fai attenzione a seguire il formato precedente. <b>La convalida non viene eseguita.</b>",
|
||||
"test_event_icon": "fa-vial-circle-check",
|
||||
"test_event_tooltip": "Salva le modifiche prima di provare le nuove impostazioni."
|
||||
}
|
||||
}
|
||||
|
||||
18
front/php/templates/language/nb_no.json
Executable file → Normal file
@@ -66,6 +66,7 @@
|
||||
"DAYS_TO_KEEP_EVENTS_name": "Slett hendelser eldre enn",
|
||||
"DISCOVER_PLUGINS_description": "",
|
||||
"DISCOVER_PLUGINS_name": "",
|
||||
"DevDetail_Children_Title": "",
|
||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Kopier detaljer fra enhet",
|
||||
"DevDetail_Copy_Device_Tooltip": "Kopier detaljer fra enheten via nedtrekks menyen. Alt på denne siden vil bli overskrevet",
|
||||
"DevDetail_CustomProperties_Title": "",
|
||||
@@ -102,6 +103,7 @@
|
||||
"DevDetail_MainInfo_Type": "Type",
|
||||
"DevDetail_MainInfo_Vendor": "Leverandør",
|
||||
"DevDetail_MainInfo_mac": "MAC",
|
||||
"DevDetail_NavToChildNode": "",
|
||||
"DevDetail_Network_Node_hover": "Velg overordnet nettverksenhet til enheten som er tilkoblet, for å fylle nettverkstreet.",
|
||||
"DevDetail_Network_Port_hover": "Porten denne enheten er koblet til på overordnet nettverksenhet. Hvis den er tom, vises et wifi-ikon i nettverkstreet i stedet.",
|
||||
"DevDetail_Nmap_Scans": "Manuelle Nmap-skanninger",
|
||||
@@ -200,6 +202,7 @@
|
||||
"Device_MultiEdit_Tooltip": "Forsiktig. Ved å klikke på denne vil verdien til venstre brukes på alle enhetene som er valgt ovenfor.",
|
||||
"Device_Searchbox": "Søk",
|
||||
"Device_Shortcut_AllDevices": "Mine Enheter",
|
||||
"Device_Shortcut_AllNodes": "",
|
||||
"Device_Shortcut_Archived": "Arkivert",
|
||||
"Device_Shortcut_Connected": "Tilkoblet",
|
||||
"Device_Shortcut_Devices": "Enheter",
|
||||
@@ -226,9 +229,11 @@
|
||||
"Device_TableHead_Name": "Navn",
|
||||
"Device_TableHead_NetworkSite": "",
|
||||
"Device_TableHead_Owner": "Eier",
|
||||
"Device_TableHead_ParentRelType": "",
|
||||
"Device_TableHead_Parent_MAC": "Overordnet node MAC",
|
||||
"Device_TableHead_Port": "Port",
|
||||
"Device_TableHead_PresentLastScan": "",
|
||||
"Device_TableHead_ReqNicsOnline": "",
|
||||
"Device_TableHead_RowID": "Rad ID",
|
||||
"Device_TableHead_Rowid": "Rad ID",
|
||||
"Device_TableHead_SSID": "",
|
||||
@@ -486,6 +491,7 @@
|
||||
"Navigation_Workflows": "Arbeidsflyter",
|
||||
"Network_Assign": "Koble til ovenfor <i class=\"fa fa-server\"></i> nettverksnode",
|
||||
"Network_Cant_Assign": "Kan ikke tilordne rot-internettnoden som sekundær node.",
|
||||
"Network_Cant_Assign_No_Node_Selected": "",
|
||||
"Network_Configuration_Error": "Konfigurasjonsfeil",
|
||||
"Network_Connected": "Tilkoblede enheter",
|
||||
"Network_ManageAdd": "Legg til enhet",
|
||||
@@ -522,6 +528,8 @@
|
||||
"Network_Root": "Rotnode",
|
||||
"Network_Root_Not_Configured": "Velg en nettverksenhetstype, for eksempel <b>Gateway</b>, i <b>Type</b> -feltet til <a href=\"deviceDetails.php?mac=Internet\">Internet Root -enheten</a> for å begynne å konfigurere på denne siden. <br/><br/> Mer dokumentasjon finner du i <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank\">Hvordan konfigurere nettverkssiden din</a> guide",
|
||||
"Network_Root_Unconfigurable": "Ukonfigurerbar rot",
|
||||
"Network_ShowArchived": "",
|
||||
"Network_ShowOffline": "",
|
||||
"Network_Table_Hostname": "Vertsnavn",
|
||||
"Network_Table_IP": "IP",
|
||||
"Network_Table_State": "Tilstand",
|
||||
@@ -704,24 +712,21 @@
|
||||
"WF_Trigger": "",
|
||||
"WF_Trigger_event_type": "",
|
||||
"WF_Trigger_type": "",
|
||||
"add_icon_event_icon": "",
|
||||
"add_icon_event_tooltip": "",
|
||||
"add_option_event_icon": "",
|
||||
"add_option_event_tooltip": "",
|
||||
"copy_icons_event_icon": "",
|
||||
"copy_icons_event_tooltip": "",
|
||||
"devices_old": "Oppdaterer...",
|
||||
"general_event_description": "Hendelsen du har utløst kan ta en stund til før bakgrunnsprosesser er ferdig. Utførelsen ble avsluttet når utførelseskøen nedenfor tømmes (sjekk <a href='/maintenance.php#tab_Logging'>Feillogg</a> Hvis du møter problemer). <br/> <br/> Utførelseskø:",
|
||||
"general_event_title": "Utfører en ad-hoc hendelse",
|
||||
"go_to_node_event_icon": "",
|
||||
"go_to_device_event_tooltip": "",
|
||||
"go_to_node_event_tooltip": "",
|
||||
"new_version_available": "",
|
||||
"report_guid": "Notifikasjons GUID:",
|
||||
"report_guid_missing": "Koblet notifikasjon ikke funnet. Det er en liten forsinkelse mellom nylig sendt notifikasjoner og at de er tilgjengelige. Oppdater siden din og hurtigbufferen etter noen sekunder. Det er også mulig den valgte notifikasjonen er slettet under vedlikehold som spesifisert i <code>DBCLNP_NOTIFI_HIST</code> innstillingen. <br/> <br/> Den siste notifikasjonen vises i stedet. Den manglende notifikasjonen har følgende GUID:",
|
||||
"report_select_format": "Velg format:",
|
||||
"report_time": "Notifikasjonstid:",
|
||||
"run_event_icon": "fa-play",
|
||||
"run_event_tooltip": "Aktiver innstillingen og lagre endringene først før du kjører den.",
|
||||
"select_icon_event_tooltip": "",
|
||||
"settings_core_icon": "fa-solid fa-gem",
|
||||
"settings_core_label": "Core",
|
||||
"settings_device_scanners": "Enhets-skannere som brukes til å oppdage enheter som skrives inn i CurrentScan databasetabellen.",
|
||||
@@ -748,6 +753,5 @@
|
||||
"settings_system_icon": "fa-solid fa-gear",
|
||||
"settings_system_label": "System",
|
||||
"settings_update_item_warning": "Oppdater verdien nedenfor. Pass på å følge forrige format. <b>Validering etterpå utføres ikke.</b>",
|
||||
"test_event_icon": "fa-vial-circle-check",
|
||||
"test_event_tooltip": "Lagre endringene først, før du tester innstillingene dine."
|
||||
}
|
||||
}
|
||||
|
||||
1014
front/php/templates/language/pl_pl.json
Executable file → Normal file
18
front/php/templates/language/pt_br.json
Executable file → Normal file
@@ -66,6 +66,7 @@
|
||||
"DAYS_TO_KEEP_EVENTS_name": "Excluir eventos mais antigos que",
|
||||
"DISCOVER_PLUGINS_description": "Desative esta opção para acelerar a inicialização e a gravação de definições. Quando desativada, os plug-ins não são descobertos e não é possível adicionar novos plug-ins à definição<code>LOADED_PLUGINS</code>.",
|
||||
"DISCOVER_PLUGINS_name": "Descobrir plugins",
|
||||
"DevDetail_Children_Title": "",
|
||||
"DevDetail_Copy_Device_Title": "Copiar detalhes do dispositivo",
|
||||
"DevDetail_Copy_Device_Tooltip": "Copiar detalhes do dispositivo a partir da lista pendente. Tudo o que se encontra nesta página será substituído",
|
||||
"DevDetail_CustomProperties_Title": "Propriedades personalizadas",
|
||||
@@ -102,6 +103,7 @@
|
||||
"DevDetail_MainInfo_Type": "Tipo",
|
||||
"DevDetail_MainInfo_Vendor": "Vendedor",
|
||||
"DevDetail_MainInfo_mac": "MAC",
|
||||
"DevDetail_NavToChildNode": "",
|
||||
"DevDetail_Network_Node_hover": "Selecione o dispositivo de rede principal ao qual o dispositivo atual está conectado, para preencher a árvore Rede.",
|
||||
"DevDetail_Network_Port_hover": "A porta a que este dispositivo está ligado no dispositivo de rede principal. Se for deixado vazio, é apresentado um ícone wifi na árvore Rede.",
|
||||
"DevDetail_Nmap_Scans": "Varreduras manuais do Nmap",
|
||||
@@ -200,6 +202,7 @@
|
||||
"Device_MultiEdit_Tooltip": "Cuidadoso. Clicar aqui aplicará o valor à esquerda a todos os dispositivos selecionados acima.",
|
||||
"Device_Searchbox": "Procurar",
|
||||
"Device_Shortcut_AllDevices": "Meus dispositivos",
|
||||
"Device_Shortcut_AllNodes": "",
|
||||
"Device_Shortcut_Archived": "Arquivado",
|
||||
"Device_Shortcut_Connected": "Conectado",
|
||||
"Device_Shortcut_Devices": "Dispositivos",
|
||||
@@ -226,9 +229,11 @@
|
||||
"Device_TableHead_Name": "Nome",
|
||||
"Device_TableHead_NetworkSite": "Site da rede",
|
||||
"Device_TableHead_Owner": "Proprietário",
|
||||
"Device_TableHead_ParentRelType": "",
|
||||
"Device_TableHead_Parent_MAC": "Nó pai MAC",
|
||||
"Device_TableHead_Port": "Porta",
|
||||
"Device_TableHead_PresentLastScan": "Presente",
|
||||
"Device_TableHead_ReqNicsOnline": "",
|
||||
"Device_TableHead_RowID": "ID da linha",
|
||||
"Device_TableHead_Rowid": "ID da linha",
|
||||
"Device_TableHead_SSID": "SSID",
|
||||
@@ -486,6 +491,7 @@
|
||||
"Navigation_Workflows": "",
|
||||
"Network_Assign": "",
|
||||
"Network_Cant_Assign": "",
|
||||
"Network_Cant_Assign_No_Node_Selected": "",
|
||||
"Network_Configuration_Error": "",
|
||||
"Network_Connected": "",
|
||||
"Network_ManageAdd": "",
|
||||
@@ -522,6 +528,8 @@
|
||||
"Network_Root": "",
|
||||
"Network_Root_Not_Configured": "",
|
||||
"Network_Root_Unconfigurable": "",
|
||||
"Network_ShowArchived": "",
|
||||
"Network_ShowOffline": "",
|
||||
"Network_Table_Hostname": "",
|
||||
"Network_Table_IP": "",
|
||||
"Network_Table_State": "",
|
||||
@@ -704,24 +712,21 @@
|
||||
"WF_Trigger": "",
|
||||
"WF_Trigger_event_type": "",
|
||||
"WF_Trigger_type": "",
|
||||
"add_icon_event_icon": "",
|
||||
"add_icon_event_tooltip": "",
|
||||
"add_option_event_icon": "",
|
||||
"add_option_event_tooltip": "",
|
||||
"copy_icons_event_icon": "",
|
||||
"copy_icons_event_tooltip": "",
|
||||
"devices_old": "",
|
||||
"general_event_description": "",
|
||||
"general_event_title": "",
|
||||
"go_to_node_event_icon": "",
|
||||
"go_to_device_event_tooltip": "",
|
||||
"go_to_node_event_tooltip": "",
|
||||
"new_version_available": "",
|
||||
"report_guid": "",
|
||||
"report_guid_missing": "",
|
||||
"report_select_format": "",
|
||||
"report_time": "",
|
||||
"run_event_icon": "",
|
||||
"run_event_tooltip": "",
|
||||
"select_icon_event_tooltip": "",
|
||||
"settings_core_icon": "",
|
||||
"settings_core_label": "",
|
||||
"settings_device_scanners": "",
|
||||
@@ -748,6 +753,5 @@
|
||||
"settings_system_icon": "",
|
||||
"settings_system_label": "",
|
||||
"settings_update_item_warning": "",
|
||||
"test_event_icon": "",
|
||||
"test_event_tooltip": "Guarde as alterações antes de testar as definições."
|
||||
}
|
||||
}
|
||||
|
||||
18
front/php/templates/language/ru_ru.json
Executable file → Normal file
@@ -66,6 +66,7 @@
|
||||
"DAYS_TO_KEEP_EVENTS_name": "Удалить события старше",
|
||||
"DISCOVER_PLUGINS_description": "Отключите эту опцию, чтобы ускорить инициализацию и сохранение настроек. При отключении этой опции плагины не обнаруживаются, и вы не можете добавлять новые плагины в параметр <code>LOADED_PLUGINS</code>.",
|
||||
"DISCOVER_PLUGINS_name": "Обзор плагинов",
|
||||
"DevDetail_Children_Title": "",
|
||||
"DevDetail_Copy_Device_Title": "Скопировать данные с устройства",
|
||||
"DevDetail_Copy_Device_Tooltip": "Скопируйте данные с устройства из раскрывающегося списка. Все на этой странице будет перезаписано",
|
||||
"DevDetail_CustomProperties_Title": "Пользовательские свойства",
|
||||
@@ -102,6 +103,7 @@
|
||||
"DevDetail_MainInfo_Type": "Тип",
|
||||
"DevDetail_MainInfo_Vendor": "Поставщик",
|
||||
"DevDetail_MainInfo_mac": "MAC адрес",
|
||||
"DevDetail_NavToChildNode": "",
|
||||
"DevDetail_Network_Node_hover": "Выберите родительское сетевое устройство, к которому подключено текущее устройство, чтобы заполнить дерево сети.",
|
||||
"DevDetail_Network_Port_hover": "Порт, к которому подключено это устройство на родительском сетевом устройстве. Если оставить пустым, в дереве сети отобразится значок Wi-Fi.",
|
||||
"DevDetail_Nmap_Scans": "Ручные сканеры Nmap",
|
||||
@@ -200,6 +202,7 @@
|
||||
"Device_MultiEdit_Tooltip": "Осторожно. При нажатии на эту кнопку значение слева будет применено ко всем устройствам, выбранным выше.",
|
||||
"Device_Searchbox": "Поиск",
|
||||
"Device_Shortcut_AllDevices": "Мои устройства",
|
||||
"Device_Shortcut_AllNodes": "",
|
||||
"Device_Shortcut_Archived": "Архив",
|
||||
"Device_Shortcut_Connected": "Подключенные",
|
||||
"Device_Shortcut_Devices": "Устройства",
|
||||
@@ -226,9 +229,11 @@
|
||||
"Device_TableHead_Name": "Имя",
|
||||
"Device_TableHead_NetworkSite": "Сайт устройства",
|
||||
"Device_TableHead_Owner": "Владелец",
|
||||
"Device_TableHead_ParentRelType": "",
|
||||
"Device_TableHead_Parent_MAC": "Родительский узел сети",
|
||||
"Device_TableHead_Port": "Порт",
|
||||
"Device_TableHead_PresentLastScan": "Присутствие",
|
||||
"Device_TableHead_ReqNicsOnline": "",
|
||||
"Device_TableHead_RowID": "ID строки",
|
||||
"Device_TableHead_Rowid": "ID строки",
|
||||
"Device_TableHead_SSID": "SSID",
|
||||
@@ -486,6 +491,7 @@
|
||||
"Navigation_Workflows": "Рабочие процессы",
|
||||
"Network_Assign": "Подключитесь к указанному выше сетевому узлу <i class=\"fa fa-server\"></i>",
|
||||
"Network_Cant_Assign": "Невозможно назначить корневой узел Интернета в качестве дочернего конечного узла.",
|
||||
"Network_Cant_Assign_No_Node_Selected": "",
|
||||
"Network_Configuration_Error": "Ошибка конфигурации",
|
||||
"Network_Connected": "Подключенные устройства",
|
||||
"Network_ManageAdd": "Добавить устройство",
|
||||
@@ -522,6 +528,8 @@
|
||||
"Network_Root": "Корневой узел",
|
||||
"Network_Root_Not_Configured": "Выберите тип сетевого устройства, например <b>Шлюз</b>, в поле <b>Тип</b> <a href=\"deviceDetails.php?mac=Internet\">корневого Интернет-устройства</a>, чтобы начать настройку этого экрана. <br/><br/> Дополнительную документацию можно найти в руководстве <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank \">Как настроить свою сетевую страницу</a>",
|
||||
"Network_Root_Unconfigurable": "Ненастраиваемый ROOT",
|
||||
"Network_ShowArchived": "",
|
||||
"Network_ShowOffline": "",
|
||||
"Network_Table_Hostname": "Имя хоста",
|
||||
"Network_Table_IP": "IP",
|
||||
"Network_Table_State": "Состояние",
|
||||
@@ -704,24 +712,21 @@
|
||||
"WF_Trigger": "Триггер",
|
||||
"WF_Trigger_event_type": "Тип события",
|
||||
"WF_Trigger_type": "Тип триггера",
|
||||
"add_icon_event_icon": "fa-square-plus",
|
||||
"add_icon_event_tooltip": "Добавить новую иконку",
|
||||
"add_option_event_icon": "fa-square-plus",
|
||||
"add_option_event_tooltip": "Добавить новое значение",
|
||||
"copy_icons_event_icon": "fa-copy",
|
||||
"copy_icons_event_tooltip": "Заменить иконки всех устройств с одним и тем же типом устройства",
|
||||
"devices_old": "Актуализируется…",
|
||||
"general_event_description": "Событие, которое вы инициировали, может занять некоторое время, прежде чем фоновые процессы завершатся. Выполнение завершится, как только очередь выполнения, указанная ниже, опустеет (Проверьте <a href='/maintenance.php#tab_Logging'>журнал ошибок</a> при возникновении проблем). <br/> <br/>· · Очередь выполнения:",
|
||||
"general_event_title": "Выполнение специального события",
|
||||
"go_to_node_event_icon": "fa-square-up-right",
|
||||
"go_to_device_event_tooltip": "",
|
||||
"go_to_node_event_tooltip": "Переход на страницу \"Сеть\" данного узла",
|
||||
"new_version_available": "Доступна новая версия.",
|
||||
"report_guid": "Идентификатор уведомления:",
|
||||
"report_guid_missing": "Связанное уведомление не найдено. Между недавно отправленными уведомлениями и их доступностью существует небольшая задержка. Обновите страницу и кэшируйте ее через несколько секунд. Также возможно, что выбранное уведомление было удалено во время обслуживания, как указано в настройке <code>DBCLNP_NOTIFI_HIST</code>. <br/> <br/>Вместо этого отображается последнее уведомление. Отсутствующее уведомление имеет следующий GUID:",
|
||||
"report_select_format": "Выбрать формат:",
|
||||
"report_time": "Время уведомления:",
|
||||
"run_event_icon": "fa-play",
|
||||
"run_event_tooltip": "Включите настройку и сначала сохраните изменения, прежде чем запускать ее.",
|
||||
"select_icon_event_tooltip": "",
|
||||
"settings_core_icon": "fa-solid fa-gem",
|
||||
"settings_core_label": "Основные",
|
||||
"settings_device_scanners": "Сканеры устройств, используемые для обнаружения устройств, записывающих данные в таблицу базы данных CurrentScan.",
|
||||
@@ -748,6 +753,5 @@
|
||||
"settings_system_icon": "fa-solid fa-gear",
|
||||
"settings_system_label": "Система",
|
||||
"settings_update_item_warning": "Обновить значение ниже. Будьте осторожны, следуя предыдущему формату. <b>Проверка не выполняется.</b>",
|
||||
"test_event_icon": "fa-vial-circle-check",
|
||||
"test_event_tooltip": "Сначала сохраните изменения, прежде чем проверять настройки."
|
||||
}
|
||||
}
|
||||
|
||||
18
front/php/templates/language/tr_tr.json
Executable file → Normal file
@@ -66,6 +66,7 @@
|
||||
"DAYS_TO_KEEP_EVENTS_name": "Şu tarihten eski olayları sil",
|
||||
"DISCOVER_PLUGINS_description": "Bu seçeneği devre dışı bırakmak, başlatma süresini ve ayarların kaydedilmesini hızlandırır. Devre dışı bırakıldığında, eklentiler keşfedilmez ve <code>LOADED_PLUGINS</code> ayarına yeni eklentiler eklenemez.",
|
||||
"DISCOVER_PLUGINS_name": "Eklentileri keşfet",
|
||||
"DevDetail_Children_Title": "",
|
||||
"DevDetail_Copy_Device_Title": "Cihazdan detayları kopyala",
|
||||
"DevDetail_Copy_Device_Tooltip": "Aşağıdaki açılır listeden cihazın detaylarını kopyalayın. Bu sayfadaki her şey üzerine yazılacaktır",
|
||||
"DevDetail_CustomProperties_Title": "Özelleştirilmiş Özellikler",
|
||||
@@ -102,6 +103,7 @@
|
||||
"DevDetail_MainInfo_Type": "Tür",
|
||||
"DevDetail_MainInfo_Vendor": "Üretici",
|
||||
"DevDetail_MainInfo_mac": "MAC",
|
||||
"DevDetail_NavToChildNode": "",
|
||||
"DevDetail_Network_Node_hover": "Cihazın bağlı olduğu üst ağ cihazını seçerek Ağ ağacının doldurulmasını sağlayın.",
|
||||
"DevDetail_Network_Port_hover": "Bu cihazın, üst ağ cihazı üzerindeki bağlı olduğu port. Boş bırakılırsa, Ağ ağacında bir Wi-Fi simgesi görüntülenir.",
|
||||
"DevDetail_Nmap_Scans": "Manuel Nmap Taramaları",
|
||||
@@ -200,6 +202,7 @@
|
||||
"Device_MultiEdit_Tooltip": "Dikkat. Buna tıklamak, soldaki değeri yukarıda seçilen tüm cihazlara uygulayacaktır.",
|
||||
"Device_Searchbox": "Arama",
|
||||
"Device_Shortcut_AllDevices": "Cihazlarım",
|
||||
"Device_Shortcut_AllNodes": "",
|
||||
"Device_Shortcut_Archived": "Arşivlenmiş",
|
||||
"Device_Shortcut_Connected": "Bağlandı",
|
||||
"Device_Shortcut_Devices": "Cihazlar",
|
||||
@@ -226,9 +229,11 @@
|
||||
"Device_TableHead_Name": "İsim",
|
||||
"Device_TableHead_NetworkSite": "Ağ Alanı",
|
||||
"Device_TableHead_Owner": "Kurucu",
|
||||
"Device_TableHead_ParentRelType": "",
|
||||
"Device_TableHead_Parent_MAC": "Üst ağ düğümü",
|
||||
"Device_TableHead_Port": "Port",
|
||||
"Device_TableHead_PresentLastScan": "Varlık",
|
||||
"Device_TableHead_ReqNicsOnline": "",
|
||||
"Device_TableHead_RowID": "Satır ID",
|
||||
"Device_TableHead_Rowid": "Satır ID",
|
||||
"Device_TableHead_SSID": "SSID",
|
||||
@@ -486,6 +491,7 @@
|
||||
"Navigation_Workflows": "İş Akışları",
|
||||
"Network_Assign": "Yukarıdakilere bağlanın <i class=\"fa fa-server\"></i> Ağ düğümü",
|
||||
"Network_Cant_Assign": "",
|
||||
"Network_Cant_Assign_No_Node_Selected": "",
|
||||
"Network_Configuration_Error": "Kurulum Hatası",
|
||||
"Network_Connected": "Bağlanmış cihazlar",
|
||||
"Network_ManageAdd": "Cihaz Ekle",
|
||||
@@ -522,6 +528,8 @@
|
||||
"Network_Root": "",
|
||||
"Network_Root_Not_Configured": "",
|
||||
"Network_Root_Unconfigurable": "",
|
||||
"Network_ShowArchived": "",
|
||||
"Network_ShowOffline": "",
|
||||
"Network_Table_Hostname": "",
|
||||
"Network_Table_IP": "",
|
||||
"Network_Table_State": "",
|
||||
@@ -704,24 +712,21 @@
|
||||
"WF_Trigger": "",
|
||||
"WF_Trigger_event_type": "",
|
||||
"WF_Trigger_type": "",
|
||||
"add_icon_event_icon": "",
|
||||
"add_icon_event_tooltip": "",
|
||||
"add_option_event_icon": "",
|
||||
"add_option_event_tooltip": "",
|
||||
"copy_icons_event_icon": "",
|
||||
"copy_icons_event_tooltip": "",
|
||||
"devices_old": "Yenileniyor...",
|
||||
"general_event_description": "",
|
||||
"general_event_title": "",
|
||||
"go_to_node_event_icon": "",
|
||||
"go_to_device_event_tooltip": "",
|
||||
"go_to_node_event_tooltip": "",
|
||||
"new_version_available": "",
|
||||
"report_guid": "",
|
||||
"report_guid_missing": "",
|
||||
"report_select_format": "",
|
||||
"report_time": "Bildirim zamanı:",
|
||||
"run_event_icon": "",
|
||||
"run_event_tooltip": "",
|
||||
"select_icon_event_tooltip": "",
|
||||
"settings_core_icon": "",
|
||||
"settings_core_label": "",
|
||||
"settings_device_scanners": "",
|
||||
@@ -748,6 +753,5 @@
|
||||
"settings_system_icon": "",
|
||||
"settings_system_label": "Sistem",
|
||||
"settings_update_item_warning": "",
|
||||
"test_event_icon": "",
|
||||
"test_event_tooltip": ""
|
||||
}
|
||||
}
|
||||
|
||||
86
front/php/templates/language/uk_ua.json
Executable file → Normal file
@@ -66,6 +66,7 @@
|
||||
"DAYS_TO_KEEP_EVENTS_name": "Видалити події, старші за",
|
||||
"DISCOVER_PLUGINS_description": "Вимкніть цю опцію, щоб прискорити ініціалізацію та збереження налаштувань. Якщо вимкнено, плагіни не виявляються, і ви не можете додавати нові плагіни до параметра <code>LOADED_PLUGINS</code>.",
|
||||
"DISCOVER_PLUGINS_name": "Відкрийте для себе плагіни",
|
||||
"DevDetail_Children_Title": "Стосунки з дітьми",
|
||||
"DevDetail_Copy_Device_Title": "Скопіюйте деталі з пристрою",
|
||||
"DevDetail_Copy_Device_Tooltip": "Скопіюйте деталі пристрою зі спадного списку. Усе на цій сторінці буде перезаписано",
|
||||
"DevDetail_CustomProperties_Title": "Спеціальні властивості",
|
||||
@@ -74,21 +75,21 @@
|
||||
"DevDetail_EveandAl_AlertAllEvents": "Повідомлення про події",
|
||||
"DevDetail_EveandAl_AlertDown": "Сповіщення вниз",
|
||||
"DevDetail_EveandAl_Archived": "Архівовано",
|
||||
"DevDetail_EveandAl_NewDevice": "Новий пристрій",
|
||||
"DevDetail_EveandAl_NewDevice": "Новий пристроїв",
|
||||
"DevDetail_EveandAl_NewDevice_Tooltip": "Відображатиме новий статус для пристрою та включатиме його до списків, коли фільтр нових пристроїв активний. Не впливає на сповіщення.",
|
||||
"DevDetail_EveandAl_RandomMAC": "Випадковий MAC",
|
||||
"DevDetail_EveandAl_ScanCycle": "скануючий пристрій",
|
||||
"DevDetail_EveandAl_ScanCycle": "Скануючий пристрій",
|
||||
"DevDetail_EveandAl_ScanCycle_a": "Пристрій сканування",
|
||||
"DevDetail_EveandAl_ScanCycle_z": "Не сканувати пристрій",
|
||||
"DevDetail_EveandAl_Skip": "Пропустити повторні сповіщення для",
|
||||
"DevDetail_EveandAl_Title": "Конфігурація сповіщень",
|
||||
"DevDetail_Events_CheckBox": "Приховати події підключення",
|
||||
"DevDetail_GoToNetworkNode": "Перейдіть на сторінку Мережа даного вузла.",
|
||||
"DevDetail_Icon": "значок",
|
||||
"DevDetail_Icon": "Значок",
|
||||
"DevDetail_Icon_Descr": "Введіть чудову назву значка шрифту без префікса fa- або з повним класом, наприклад: fa fa-бренди fa-яблуко.",
|
||||
"DevDetail_Loading": "Завантаження…",
|
||||
"DevDetail_MainInfo_Comments": "Коментарі",
|
||||
"DevDetail_MainInfo_Favorite": "улюблений",
|
||||
"DevDetail_MainInfo_Favorite": "Улюблений",
|
||||
"DevDetail_MainInfo_Group": "Група",
|
||||
"DevDetail_MainInfo_Location": "Розташування",
|
||||
"DevDetail_MainInfo_Name": "Ім'я",
|
||||
@@ -102,10 +103,11 @@
|
||||
"DevDetail_MainInfo_Type": "Тип",
|
||||
"DevDetail_MainInfo_Vendor": "Продавець",
|
||||
"DevDetail_MainInfo_mac": "MAC",
|
||||
"DevDetail_NavToChildNode": "Відкрити дочірній вузол",
|
||||
"DevDetail_Network_Node_hover": "Виберіть батьківський мережевий пристрій, до якого підключено поточний пристрій, щоб заповнити дерево мережі.",
|
||||
"DevDetail_Network_Port_hover": "Порт, до якого підключено цей пристрій на батьківському мережевому пристрої. Якщо залишити пустим, у дереві мережі відобразиться значок Wi-Fi.",
|
||||
"DevDetail_Nmap_Scans": "Сканування Nmap вручну",
|
||||
"DevDetail_Nmap_Scans_desc": "Тут ви можете виконувати сканування NMAP вручну. Ви також можете запланувати регулярне автоматичне сканування NMAP за допомогою плагіна Services & Ports (NMAP). Перейдіть до <a href='/settings.php' target='_blank'>Налаштувань</a>, щоб дізнатися більше",
|
||||
"DevDetail_Nmap_Scans_desc": "Тут ви можете виконувати ручні сканування NMAP. Ви також можете запланувати регулярні автоматичні сканування NMAP за допомогою плагіна Services & Ports (NMAP). Щоб дізнатися більше, перейдіть до <a href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Документації</a>",
|
||||
"DevDetail_Nmap_buttonDefault": "Сканування за замовчуванням",
|
||||
"DevDetail_Nmap_buttonDefault_text": "Сканування за замовчуванням: Nmap сканує 1000 найпопулярніших портів для кожного запитуваного протоколу сканування. Це перехоплює приблизно 93% портів TCP і 49% портів UDP. (приблизно 5 секунд)",
|
||||
"DevDetail_Nmap_buttonDetail": "Детальне сканування",
|
||||
@@ -134,7 +136,7 @@
|
||||
"DevDetail_SessionTable_Disconnection": "Відключення",
|
||||
"DevDetail_SessionTable_Duration": "Тривалість",
|
||||
"DevDetail_SessionTable_IP": "IP",
|
||||
"DevDetail_SessionTable_Order": "порядок",
|
||||
"DevDetail_SessionTable_Order": "Порядок",
|
||||
"DevDetail_Shortcut_CurrentStatus": "Поточний статус",
|
||||
"DevDetail_Shortcut_DownAlerts": "Сповіщення про падіння",
|
||||
"DevDetail_Shortcut_Presence": "Присутність",
|
||||
@@ -154,7 +156,7 @@
|
||||
"DevDetail_Tab_NmapTableService": "Сервіс",
|
||||
"DevDetail_Tab_NmapTableState": "Держава",
|
||||
"DevDetail_Tab_NmapTableText": "Налаштуйте розклад у <a href=\"/settings.php#NMAP_ACTIVE\">Settings</a>",
|
||||
"DevDetail_Tab_NmapTableTime": "час",
|
||||
"DevDetail_Tab_NmapTableTime": "Час",
|
||||
"DevDetail_Tab_Plugins": "Плагіни",
|
||||
"DevDetail_Tab_Presence": "Присутність",
|
||||
"DevDetail_Tab_Sessions": "Сеанси",
|
||||
@@ -191,7 +193,7 @@
|
||||
"DevDetail_button_OverwriteIcons_Tooltip": "Перезаписати піктограми всіх пристроїв одним типом пристрою",
|
||||
"DevDetail_button_OverwriteIcons_Warning": "Ви впевнені, що бажаєте перезаписати всі піктограми всіх пристроїв тим самим типом пристрою, що й поточний тип пристрою?",
|
||||
"DevDetail_button_Reset": "Скинути зміни",
|
||||
"DevDetail_button_Save": "зберегти",
|
||||
"DevDetail_button_Save": "Зберегти",
|
||||
"DeviceEdit_ValidMacIp": "Введіть дійсну адресу <b>Mac</b> та <b>IP</b>.",
|
||||
"Device_MultiEdit": "Мультиредагування",
|
||||
"Device_MultiEdit_Backup": "Обережно, введення неправильних значень нижче призведе до порушення роботи налаштувань. Спочатку створіть резервну копію бази даних або конфігурації пристроїв (<a href=\"php/server/devices.php?action=ExportCSV\">натисніть, щоб завантажити <i class=\"fa-solid fa-download fa-bounce\"></i></a>). Прочитайте, як відновити пристрої з цього файлу, у <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\"_blank\">документації щодо резервних копій</a>. Щоб застосувати зміни, натисніть значок <b>Зберегти<i class=\"fa-solid fa-save\"></i></b> у кожному полі, яке потрібно оновити.",
|
||||
@@ -200,6 +202,7 @@
|
||||
"Device_MultiEdit_Tooltip": "Обережно. Якщо натиснути це, значення зліва буде застосовано до всіх пристроїв, вибраних вище.",
|
||||
"Device_Searchbox": "Пошук",
|
||||
"Device_Shortcut_AllDevices": "Мої пристрої",
|
||||
"Device_Shortcut_AllNodes": "Усі вузли",
|
||||
"Device_Shortcut_Archived": "Архівовано",
|
||||
"Device_Shortcut_Connected": "Підключено",
|
||||
"Device_Shortcut_Devices": "Пристрої",
|
||||
@@ -212,11 +215,11 @@
|
||||
"Device_TableHead_Connected_Devices": "Зв'язки",
|
||||
"Device_TableHead_CustomProps": "Реквізит / дії",
|
||||
"Device_TableHead_FQDN": "FQDN",
|
||||
"Device_TableHead_Favorite": "улюблений",
|
||||
"Device_TableHead_Favorite": "Улюблений",
|
||||
"Device_TableHead_FirstSession": "Перша сесія",
|
||||
"Device_TableHead_GUID": "GUID",
|
||||
"Device_TableHead_Group": "Група",
|
||||
"Device_TableHead_Icon": "значок",
|
||||
"Device_TableHead_Icon": "Значок",
|
||||
"Device_TableHead_LastIP": "Останній IP",
|
||||
"Device_TableHead_LastIPOrder": "Останнє замовлення IP",
|
||||
"Device_TableHead_LastSession": "Останній офлайн",
|
||||
@@ -226,9 +229,11 @@
|
||||
"Device_TableHead_Name": "Ім'я",
|
||||
"Device_TableHead_NetworkSite": "Мережевий сайт",
|
||||
"Device_TableHead_Owner": "Власник",
|
||||
"Device_TableHead_Parent_MAC": "Узел родительской сети",
|
||||
"Device_TableHead_ParentRelType": "Тип зв'язку",
|
||||
"Device_TableHead_Parent_MAC": "Батьківський мережевий вузол",
|
||||
"Device_TableHead_Port": "Порт",
|
||||
"Device_TableHead_PresentLastScan": "Присутність",
|
||||
"Device_TableHead_ReqNicsOnline": "Вимагати мережевих карт онлайн",
|
||||
"Device_TableHead_RowID": "ID рядка",
|
||||
"Device_TableHead_Rowid": "ID рядка",
|
||||
"Device_TableHead_SSID": "SSID",
|
||||
@@ -242,7 +247,7 @@
|
||||
"Device_Table_nav_next": "Далі",
|
||||
"Device_Table_nav_prev": "Попередній",
|
||||
"Device_Tablelenght": "Показати записи _МЕНЮ_",
|
||||
"Device_Tablelenght_all": "все",
|
||||
"Device_Tablelenght_all": "Все",
|
||||
"Device_Title": "Пристрої",
|
||||
"Devices_Filters": "Фільтри",
|
||||
"ENABLE_PLUGINS_description": "Вмикає функції <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">плагінів</a>. Завантаження плагінів вимагає більше апаратних ресурсів, тому ви можете вимкнути їх у системі з низьким енергоспоживанням.",
|
||||
@@ -268,26 +273,26 @@
|
||||
"Events_TableHead_AdditionalInfo": "Додаткова Інформація",
|
||||
"Events_TableHead_Connection": "Підключення",
|
||||
"Events_TableHead_Date": "Дата",
|
||||
"Events_TableHead_Device": "пристрій",
|
||||
"Events_TableHead_Device": "Пристрій",
|
||||
"Events_TableHead_Disconnection": "Відключення",
|
||||
"Events_TableHead_Duration": "Тривалість",
|
||||
"Events_TableHead_DurationOrder": "Порядок тривалості",
|
||||
"Events_TableHead_EventType": "Тип Події",
|
||||
"Events_TableHead_IP": "IP",
|
||||
"Events_TableHead_IPOrder": "Замовлення IP",
|
||||
"Events_TableHead_Order": "порядок",
|
||||
"Events_TableHead_Order": "Порядок",
|
||||
"Events_TableHead_Owner": "Власник",
|
||||
"Events_TableHead_PendingAlert": "Сповіщення в очікуванні",
|
||||
"Events_Table_info": "Показано від _START_ до _END_ із _TOTAL_ записів",
|
||||
"Events_Table_nav_next": "Далі",
|
||||
"Events_Table_nav_prev": "Попередній",
|
||||
"Events_Tablelenght": "Показати записи _МЕНЮ_",
|
||||
"Events_Tablelenght_all": "все",
|
||||
"Events_Tablelenght_all": "Все",
|
||||
"Events_Title": "Події",
|
||||
"GRAPHQL_PORT_description": "Номер порту сервера GraphQL. Переконайтеся, що порт є унікальним для всіх ваших програм на цьому хості та екземплярах NetAlertX.",
|
||||
"GRAPHQL_PORT_name": "Порт GraphQL",
|
||||
"Gen_Action": "Дія",
|
||||
"Gen_Add": "додати",
|
||||
"Gen_Add": "Додати",
|
||||
"Gen_AddDevice": "Додати пристрій",
|
||||
"Gen_Add_All": "Додати все",
|
||||
"Gen_All_Devices": "Усі пристрої",
|
||||
@@ -295,13 +300,13 @@
|
||||
"Gen_Backup": "Запустіть резервне копіювання",
|
||||
"Gen_Cancel": "Скасувати",
|
||||
"Gen_Change": "Зміна",
|
||||
"Gen_Copy": "бігти",
|
||||
"Gen_Copy": "Запустити",
|
||||
"Gen_DataUpdatedUITakesTime": "Добре. Оновлення інтерфейсу може зайняти деякий час, якщо сканування виконується.",
|
||||
"Gen_Delete": "Видалити",
|
||||
"Gen_DeleteAll": "Видалити все",
|
||||
"Gen_Description": "опис",
|
||||
"Gen_Description": "Опис",
|
||||
"Gen_Error": "Помилка",
|
||||
"Gen_Filter": "фільтр",
|
||||
"Gen_Filter": "Фільтр",
|
||||
"Gen_Generate": "Генерувати",
|
||||
"Gen_LockedDB": "ПОМИЛКА – БД може бути заблоковано – перевірте F12 Інструменти розробника -> Консоль або спробуйте пізніше.",
|
||||
"Gen_Offline": "Офлайн",
|
||||
@@ -314,7 +319,7 @@
|
||||
"Gen_Reset": "Скинути",
|
||||
"Gen_Restore": "Запустіть Restore",
|
||||
"Gen_Run": "бігти",
|
||||
"Gen_Save": "зберегти",
|
||||
"Gen_Save": "Зберегти",
|
||||
"Gen_Saved": "Збережено",
|
||||
"Gen_Search": "Пошук",
|
||||
"Gen_Select": "Виберіть",
|
||||
@@ -324,12 +329,12 @@
|
||||
"Gen_Switch": "Перемикач",
|
||||
"Gen_Upd": "Оновлено успішно",
|
||||
"Gen_Upd_Fail": "Не вдалося оновити",
|
||||
"Gen_Update": "оновлення",
|
||||
"Gen_Update": "Оновлення",
|
||||
"Gen_Update_Value": "Оновити значення",
|
||||
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
|
||||
"Gen_Warning": "УВАГА",
|
||||
"Gen_Warning": "Попередження",
|
||||
"Gen_Work_In_Progress": "Робота триває, час залишити відгук на https://github.com/jokob-sk/NetAlertX/issues",
|
||||
"Gen_create_new_device": "новий пристрій",
|
||||
"Gen_create_new_device": "Новий пристрій",
|
||||
"Gen_create_new_device_info": "Пристрої зазвичай виявляють за допомогою <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">плагінів</a>. Однак у деяких випадках може знадобитися додати пристрої вручну. Щоб дослідити конкретні сценарії, перегляньте <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/REMOTE_NETWORKS.md\">документацію щодо віддалених мереж</a>.",
|
||||
"General_display_name": "Загальний",
|
||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||
@@ -352,7 +357,7 @@
|
||||
"Login_Psw_run": "Щоб змінити пароль, запустіть:",
|
||||
"Login_Remember": "Пам'ятайте",
|
||||
"Login_Remember_small": "(дійсний 7 днів)",
|
||||
"Login_Submit": "авторизуватися",
|
||||
"Login_Submit": "Авторизуватися",
|
||||
"Login_Toggle_Alert_headline": "Захист пароля!",
|
||||
"Login_Toggle_Info": "Інформація про пароль",
|
||||
"Login_Toggle_Info_headline": "Інформація про пароль",
|
||||
@@ -468,7 +473,7 @@
|
||||
"Maintenance_version": "Оновлення програми",
|
||||
"NETWORK_DEVICE_TYPES_description": "Які типи пристроїв дозволено використовувати як мережеві пристрої в поданні мережі. Тип пристрою має точно відповідати налаштуванню <code>Тип</code> на певному пристрої в Деталях пристрою. Додайте його на пристрій за допомогою кнопки <code>+</code>. Не видаляйте існуючі типи, лише додайте нові.",
|
||||
"NETWORK_DEVICE_TYPES_name": "Типи мережевих пристроїв",
|
||||
"Navigation_About": "про",
|
||||
"Navigation_About": "Про",
|
||||
"Navigation_AppEvents": "События приложения",
|
||||
"Navigation_Devices": "Пристрої",
|
||||
"Navigation_Donations": "Пожертви",
|
||||
@@ -486,6 +491,7 @@
|
||||
"Navigation_Workflows": "Робочі процеси",
|
||||
"Network_Assign": "Підключіться до зазначеного вище <i class=\"fa fa-server\"></i> вузла мережі",
|
||||
"Network_Cant_Assign": "Неможливо призначити кореневий вузол Інтернету як дочірній кінцевий вузол.",
|
||||
"Network_Cant_Assign_No_Node_Selected": "Неможливо призначити, не вибрано батьківський вузол.",
|
||||
"Network_Configuration_Error": "Помилка конфігурації",
|
||||
"Network_Connected": "Підключені пристрої",
|
||||
"Network_ManageAdd": "Додати пристрій",
|
||||
@@ -508,7 +514,7 @@
|
||||
"Network_ManageEdit_Name": "Нова назва пристрою",
|
||||
"Network_ManageEdit_Name_text": "Назва без спеціальних символів",
|
||||
"Network_ManageEdit_Port": " Нова кількість портів",
|
||||
"Network_ManageEdit_Port_text": "залиште порожнім для wifi та powerline",
|
||||
"Network_ManageEdit_Port_text": "залиште порожнім для Wi-Fi та Powerline",
|
||||
"Network_ManageEdit_Submit": "Зберегти зміни",
|
||||
"Network_ManageEdit_Type": "Новий тип пристрою",
|
||||
"Network_ManageEdit_Type_text": "-- Виберіть тип --",
|
||||
@@ -522,6 +528,8 @@
|
||||
"Network_Root": "Кореневий вузол",
|
||||
"Network_Root_Not_Configured": "Виберіть тип мережевого пристрою, наприклад <b>Шлюз</b>, у полі <b>Тип</b> <a href=\"deviceDetails.php?mac=Internet\">кореневого Інтернет-пристрою</a>, щоб розпочати налаштування цього екрана. <br/><br/> Додаткову документацію можна знайти в <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank\"> Посібник із налаштування сторінки мережі</a>",
|
||||
"Network_Root_Unconfigurable": "Ненастроюваний root",
|
||||
"Network_ShowArchived": "Показати архівовані",
|
||||
"Network_ShowOffline": "Показати офлайн",
|
||||
"Network_Table_Hostname": "Ім'я хоста",
|
||||
"Network_Table_IP": "IP",
|
||||
"Network_Table_State": "Держава",
|
||||
@@ -572,7 +580,7 @@
|
||||
"REPORT_ERROR": "Сторінка, яку ви шукаєте, тимчасово недоступна, спробуйте ще раз через кілька секунд",
|
||||
"REPORT_MAIL_description": "Якщо ввімкнено, електронною поштою буде надіслано список змін, на які ви підписалися. Будь ласка, також заповніть усі інші налаштування, пов’язані з налаштуванням SMTP нижче. Якщо виникли проблеми, установіть <code>LOG_LEVEL</code> на <code>debug</code> і перевірте <a href=\"/maintenance.php#tab_Logging\">журнал помилок</a>.",
|
||||
"REPORT_MAIL_name": "Увімкнути електронну пошту",
|
||||
"REPORT_TITLE": "звіт",
|
||||
"REPORT_TITLE": "Звіт",
|
||||
"RandomMAC_hover": "Автоматично визначено – вказує, чи пристрій рандомізує свою MAC-адресу. Ви можете виключити певні MAC-адреси за допомогою параметра UI_NOT_RANDOM_MAC. Натисніть, щоб дізнатися більше.",
|
||||
"Reports_Sent_Log": "Журнал надісланих звітів",
|
||||
"SCAN_SUBNETS_description": "Більшість мережевих сканерів (ARP-SCAN, NMAP, NSLOOKUP, DIG) покладаються на сканування конкретних мережевих інтерфейсів і підмереж. Перегляньте <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">документацію підмереж</a>, щоб отримати допомогу щодо цього налаштування, особливо VLAN, які VLAN підтримуються або як визначити маску мережі та ваш інтерфейс. <br/> <br/> Альтернативою мережевим сканерам є ввімкнення деяких інших сканерів/імпортерів пристроїв, які не покладаються на доступ NetAlert<sup>X</sup> до мережі (UNIFI, dhcp.leases , PiHole тощо). <br/> <br/> Примітка. Сам час сканування залежить від кількості IP-адрес, які потрібно перевірити, тому ретельно налаштуйте це за допомогою відповідної маски мережі та інтерфейсу.",
|
||||
@@ -589,7 +597,7 @@
|
||||
"Systeminfo_CPU_Cores": "Ядра ЦП:",
|
||||
"Systeminfo_CPU_Name": "Назва ЦП:",
|
||||
"Systeminfo_CPU_Speed": "Швидкість ЦП:",
|
||||
"Systeminfo_CPU_Temp": "температура процесора:",
|
||||
"Systeminfo_CPU_Temp": "Температура ЦП:",
|
||||
"Systeminfo_CPU_Vendor": "Постачальник ЦП:",
|
||||
"Systeminfo_Client_Resolution": "Роздільна здатність браузера:",
|
||||
"Systeminfo_Client_User_Agent": "Агент користувача:",
|
||||
@@ -639,23 +647,23 @@
|
||||
"Systeminfo_Services_Description": "Опис послуги",
|
||||
"Systeminfo_Services_Name": "Назва служби",
|
||||
"Systeminfo_Storage": "Зберігання",
|
||||
"Systeminfo_Storage_Device": "пристрій:",
|
||||
"Systeminfo_Storage_Device": "Пристрій:",
|
||||
"Systeminfo_Storage_Mount": "Точка монтування:",
|
||||
"Systeminfo_Storage_Size": "Розмір:",
|
||||
"Systeminfo_Storage_Type": "Тип:",
|
||||
"Systeminfo_Storage_Usage": "Використання сховища",
|
||||
"Systeminfo_Storage_Usage_Free": "безкоштовно:",
|
||||
"Systeminfo_Storage_Usage_Free": "Безкоштовно:",
|
||||
"Systeminfo_Storage_Usage_Mount": "Точка монтування:",
|
||||
"Systeminfo_Storage_Usage_Total": "Всього:",
|
||||
"Systeminfo_Storage_Usage_Used": "б/в:",
|
||||
"Systeminfo_System": "система",
|
||||
"Systeminfo_Storage_Usage_Used": "Використано:",
|
||||
"Systeminfo_System": "Система",
|
||||
"Systeminfo_System_AVG": "Середнє навантаження:",
|
||||
"Systeminfo_System_Architecture": "Архітектура:",
|
||||
"Systeminfo_System_Kernel": "Ядро:",
|
||||
"Systeminfo_System_OSVersion": "Операційна система:",
|
||||
"Systeminfo_System_Running_Processes": "Запущені процеси:",
|
||||
"Systeminfo_System_System": "система:",
|
||||
"Systeminfo_System_Uname": "ім'я:",
|
||||
"Systeminfo_System_System": "Система:",
|
||||
"Systeminfo_System_Uname": "Перейменувати:",
|
||||
"Systeminfo_System_Uptime": "Час роботи:",
|
||||
"Systeminfo_This_Client": "Цей клієнт",
|
||||
"Systeminfo_USB_Devices": "USB-пристрої",
|
||||
@@ -704,24 +712,21 @@
|
||||
"WF_Trigger": "Тригер",
|
||||
"WF_Trigger_event_type": "Тип події",
|
||||
"WF_Trigger_type": "Тип тригера",
|
||||
"add_icon_event_icon": "фа-квадрат-плюс",
|
||||
"add_icon_event_tooltip": "додати новий значок",
|
||||
"add_option_event_icon": "фа-квадрат-плюс",
|
||||
"add_option_event_tooltip": "Додати нове значення",
|
||||
"copy_icons_event_icon": "фа-копія",
|
||||
"copy_icons_event_tooltip": "Перезаписати піктограми всіх пристроїв одним типом пристрою",
|
||||
"devices_old": "Освіжає…",
|
||||
"general_event_description": "Подія, яку ви ініціювали, може зайняти деякий час, поки завершаться фонові процеси. Виконання завершилося, коли наведена нижче черга виконання спорожнилася (перевірте <a href='/maintenance.php#tab_Logging'>журнал помилок</a>, якщо виникнуть проблеми). <br/> <br/> Черга виконання:",
|
||||
"general_event_title": "Виконання спеціальної події",
|
||||
"go_to_node_event_icon": "fa-квадрат-вгору-вправо",
|
||||
"go_to_device_event_tooltip": "Перейдіть до пристрою",
|
||||
"go_to_node_event_tooltip": "Перейдіть на сторінку Мережа даного вузла",
|
||||
"new_version_available": "Доступна нова версія.",
|
||||
"report_guid": "Довідник сповіщень:",
|
||||
"report_guid_missing": "Пов’язане сповіщення не знайдено. Існує невелика затримка між нещодавно надісланими сповіщеннями та їх доступністю. Оновіть сторінку та кеш через кілька секунд. Також можливо, вибране сповіщення було видалено під час обслуговування, як зазначено в параметрі <code>DBCLNP_NOTIFI_HIST</code>. <br/> <br/>Натомість відображається останнє сповіщення. Відсутнє сповіщення має такий GUID:",
|
||||
"report_select_format": "Виберіть формат:",
|
||||
"report_time": "Час сповіщення:",
|
||||
"run_event_icon": "fa- play",
|
||||
"run_event_tooltip": "Увімкніть налаштування та збережіть зміни, перш ніж запускати його.",
|
||||
"select_icon_event_tooltip": "Виберіть значок",
|
||||
"settings_core_icon": "фа-твердий фа-самоцвіт",
|
||||
"settings_core_label": "Ядро",
|
||||
"settings_device_scanners": "Сканери пристроїв, які використовуються для виявлення пристроїв, які записують дані в таблицю бази даних CurrentScan.",
|
||||
@@ -748,6 +753,5 @@
|
||||
"settings_system_icon": "фа-твердий фа-передача",
|
||||
"settings_system_label": "Система",
|
||||
"settings_update_item_warning": "Оновіть значення нижче. Слідкуйте за попереднім форматом. <b>Перевірка не виконана.</b>",
|
||||
"test_event_icon": "fa-vial-circle- check",
|
||||
"test_event_tooltip": "Перш ніж перевіряти налаштування, збережіть зміни."
|
||||
}
|
||||
}
|
||||
|
||||
114
front/php/templates/language/zh_cn.json
Executable file → Normal file
@@ -2,13 +2,13 @@
|
||||
"API_CUSTOM_SQL_description": "您可以指定一个自定义 SQL 查询,它将生成一个 JSON 文件,然后通过 <a href=\"/php/server/query_json.php?file=table_custom_endpoint.json\" target=\"_blank\"><code>table_custom_endpoint.json</code> 文件端点</a> 公开它。",
|
||||
"API_CUSTOM_SQL_name": "自定义终点",
|
||||
"API_TOKEN_description": "用于安全通信的API令牌。生成一个或输入任何值。它在请求标头中发送,并用于 <code>SYNC</code> 插件、GraphQL服务器和其他API端点中。 您可以使用API端点创建自定义集成,详情请参考此 <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/API.md\" target=\"_blank\">API 文档</a>。",
|
||||
"API_TOKEN_name": "",
|
||||
"API_TOKEN_name": "API 令牌",
|
||||
"API_display_name": "API",
|
||||
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
|
||||
"About_Design": "设计用于:",
|
||||
"About_Exit": "登出",
|
||||
"About_Title": "网络安全扫描器和通知框架",
|
||||
"AppEvents_AppEventProcessed": "",
|
||||
"AppEvents_AppEventProcessed": "已处理",
|
||||
"AppEvents_DateTimeCreated": "已记录",
|
||||
"AppEvents_Extra": "额外的",
|
||||
"AppEvents_GUID": "应用程序事件 GUID",
|
||||
@@ -65,12 +65,13 @@
|
||||
"DAYS_TO_KEEP_EVENTS_description": "这是维护设置。它指定将保留的事件条目的天数。所有较旧的事件将被定期删除。也适用于插件事件历史记录。",
|
||||
"DAYS_TO_KEEP_EVENTS_name": "删除早于",
|
||||
"DISCOVER_PLUGINS_description": "禁用此选项可加快初始化和设置保存的速度。当禁用时,插件不会被发现,并且您无法将新插件添加到 <code>LOADED_PLUGINS</code>设置中。",
|
||||
"DISCOVER_PLUGINS_name": "",
|
||||
"DISCOVER_PLUGINS_name": "发现插件",
|
||||
"DevDetail_Children_Title": "子代关系",
|
||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> 从设备复制详细信息",
|
||||
"DevDetail_Copy_Device_Tooltip": "从下拉列表中复制设备的详细信息。此页面上的所有内容都将被覆盖",
|
||||
"DevDetail_CustomProperties_Title": "自定义属性",
|
||||
"DevDetail_CustomProps_reset_info": "",
|
||||
"DevDetail_DisplayFields_Title": "",
|
||||
"DevDetail_CustomProps_reset_info": "这将删除此设备上的自定义属性并将其重置为默认值。",
|
||||
"DevDetail_DisplayFields_Title": "显示",
|
||||
"DevDetail_EveandAl_AlertAllEvents": "提醒所有事件",
|
||||
"DevDetail_EveandAl_AlertDown": "警报关闭",
|
||||
"DevDetail_EveandAl_Archived": "已归档",
|
||||
@@ -102,6 +103,7 @@
|
||||
"DevDetail_MainInfo_Type": "类型",
|
||||
"DevDetail_MainInfo_Vendor": "制造商",
|
||||
"DevDetail_MainInfo_mac": "MAC",
|
||||
"DevDetail_NavToChildNode": "开子节点",
|
||||
"DevDetail_Network_Node_hover": "选择当前设备连接到的父网络设备,以填充网络树。",
|
||||
"DevDetail_Network_Port_hover": "此设备连接到父网络设备上的端口。如果留空,则网络树中会显示一个 wifi 图标。",
|
||||
"DevDetail_Nmap_Scans": "手动 Nmap 扫描",
|
||||
@@ -186,13 +188,13 @@
|
||||
"DevDetail_button_Delete": "删除设备",
|
||||
"DevDetail_button_DeleteEvents": "删除事件",
|
||||
"DevDetail_button_DeleteEvents_Warning": "您确定要删除此设备的所有事件吗?<br><br>(这将清除<b>事件历史记录</b>和<b>会话</b>,并且可能有助于持续(持久)通知)",
|
||||
"DevDetail_button_Delete_ask": "",
|
||||
"DevDetail_button_Delete_ask": "您确认要删除这个设备吗?您也可以归档这个设备。",
|
||||
"DevDetail_button_OverwriteIcons": "覆盖图标",
|
||||
"DevDetail_button_OverwriteIcons_Tooltip": "覆盖具有相同设备类型的所有设备的图标",
|
||||
"DevDetail_button_OverwriteIcons_Warning": "您确定要覆盖与当前设备类型相同的所有设备的所有图标吗?",
|
||||
"DevDetail_button_Reset": "重置",
|
||||
"DevDetail_button_Save": "保存",
|
||||
"DeviceEdit_ValidMacIp": "",
|
||||
"DeviceEdit_ValidMacIp": "请输入有效的<b>Mac</b>和<b>IP</b>地址。",
|
||||
"Device_MultiEdit": "编辑",
|
||||
"Device_MultiEdit_Backup": "小心,输入错误的值将破坏您的设置。请先备份您的数据库或设备配置(<a href=\"php/server/devices.php?action=ExportCSV\">点击下载<i class=\"fa-solid fa-download fa-bounce\"></i></a>)。在<a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\"_blank\">备份文档</a>中了解如何从此文件恢复设备。",
|
||||
"Device_MultiEdit_Fields": "编辑:",
|
||||
@@ -200,6 +202,7 @@
|
||||
"Device_MultiEdit_Tooltip": "小心。 单击此按钮会将左侧的值应用到上面选择的所有设备。",
|
||||
"Device_Searchbox": "搜索",
|
||||
"Device_Shortcut_AllDevices": "我的设备",
|
||||
"Device_Shortcut_AllNodes": "全部节点",
|
||||
"Device_Shortcut_Archived": "已存档",
|
||||
"Device_Shortcut_Connected": "在线设备",
|
||||
"Device_Shortcut_Devices": "设备管理",
|
||||
@@ -208,10 +211,10 @@
|
||||
"Device_Shortcut_Favorites": "收藏",
|
||||
"Device_Shortcut_NewDevices": "新设备",
|
||||
"Device_Shortcut_OnlineChart": "设备统计",
|
||||
"Device_TableHead_AlertDown": "",
|
||||
"Device_TableHead_AlertDown": "提醒宕机",
|
||||
"Device_TableHead_Connected_Devices": "链接",
|
||||
"Device_TableHead_CustomProps": "",
|
||||
"Device_TableHead_FQDN": "",
|
||||
"Device_TableHead_CustomProps": "属性",
|
||||
"Device_TableHead_FQDN": "FQDN",
|
||||
"Device_TableHead_Favorite": "收藏",
|
||||
"Device_TableHead_FirstSession": "加入",
|
||||
"Device_TableHead_GUID": "GUID",
|
||||
@@ -226,29 +229,31 @@
|
||||
"Device_TableHead_Name": "名字",
|
||||
"Device_TableHead_NetworkSite": "网络站点",
|
||||
"Device_TableHead_Owner": "所有者",
|
||||
"Device_TableHead_ParentRelType": "关系类型",
|
||||
"Device_TableHead_Parent_MAC": "父节点",
|
||||
"Device_TableHead_Port": "端口",
|
||||
"Device_TableHead_PresentLastScan": "",
|
||||
"Device_TableHead_PresentLastScan": "检测",
|
||||
"Device_TableHead_ReqNicsOnline": "需要网卡在线",
|
||||
"Device_TableHead_RowID": "排行",
|
||||
"Device_TableHead_Rowid": "排行",
|
||||
"Device_TableHead_SSID": "SSID",
|
||||
"Device_TableHead_SourcePlugin": "",
|
||||
"Device_TableHead_SourcePlugin": "源插件",
|
||||
"Device_TableHead_Status": "状态",
|
||||
"Device_TableHead_SyncHubNodeName": "同步节点",
|
||||
"Device_TableHead_Type": "类型",
|
||||
"Device_TableHead_Vendor": "制造商",
|
||||
"Device_Table_Not_Network_Device": "未配置为网络设备",
|
||||
"Device_Table_info": "",
|
||||
"Device_Table_info": "显示第_START_至 END_条_共_TOTAL_条",
|
||||
"Device_Table_nav_next": "下一页",
|
||||
"Device_Table_nav_prev": "上一页",
|
||||
"Device_Tablelenght": "显示 _MENU_ 页",
|
||||
"Device_Tablelenght_all": "所有",
|
||||
"Device_Title": "设备",
|
||||
"Devices_Filters": "",
|
||||
"Devices_Filters": "过滤器",
|
||||
"ENABLE_PLUGINS_description": "启用<a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">插件</a>功能。加载插件需要更多硬件资源,因此您可能需要在低功耗系统上禁用它们。",
|
||||
"ENABLE_PLUGINS_name": "启用插件",
|
||||
"ENCRYPTION_KEY_description": "",
|
||||
"ENCRYPTION_KEY_name": "",
|
||||
"ENCRYPTION_KEY_description": "数据密钥。",
|
||||
"ENCRYPTION_KEY_name": "密钥",
|
||||
"Email_display_name": "Email",
|
||||
"Email_icon": "<i class=\"fa fa-at\"></i>",
|
||||
"Events_Loading": "加载中...",
|
||||
@@ -278,65 +283,65 @@
|
||||
"Events_TableHead_Order": "排序",
|
||||
"Events_TableHead_Owner": "所有者",
|
||||
"Events_TableHead_PendingAlert": "待处理警报",
|
||||
"Events_Table_info": "",
|
||||
"Events_Table_info": "显示第_START_至_END_条_共_TOTAL_条",
|
||||
"Events_Table_nav_next": "下一个",
|
||||
"Events_Table_nav_prev": "以前的",
|
||||
"Events_Tablelenght": "",
|
||||
"Events_Tablelenght": "显示_MENU_条",
|
||||
"Events_Tablelenght_all": "全部",
|
||||
"Events_Title": "事件",
|
||||
"GRAPHQL_PORT_description": "",
|
||||
"GRAPHQL_PORT_name": "",
|
||||
"GRAPHQL_PORT_description": "GraphQL服务器的端口号。请确保该端口在该主机和 NetAlertX 实例上的所有应用程序中都是唯一的。",
|
||||
"GRAPHQL_PORT_name": "GraphQL端口",
|
||||
"Gen_Action": "动作",
|
||||
"Gen_Add": "增加",
|
||||
"Gen_AddDevice": "",
|
||||
"Gen_AddDevice": "添加设备",
|
||||
"Gen_Add_All": "全部添加",
|
||||
"Gen_All_Devices": "所有设备",
|
||||
"Gen_AreYouSure": "你确定吗?",
|
||||
"Gen_Backup": "运行备份",
|
||||
"Gen_Cancel": "取消",
|
||||
"Gen_Change": "",
|
||||
"Gen_Change": "修改",
|
||||
"Gen_Copy": "运行",
|
||||
"Gen_DataUpdatedUITakesTime": "好的 - 如果扫描正在运行,UI 可能需要一段时间才能更新。",
|
||||
"Gen_Delete": "删除",
|
||||
"Gen_DeleteAll": "全部删除",
|
||||
"Gen_Description": "",
|
||||
"Gen_Description": "描述",
|
||||
"Gen_Error": "错误",
|
||||
"Gen_Filter": "筛选",
|
||||
"Gen_Generate": "",
|
||||
"Gen_Generate": "生成",
|
||||
"Gen_LockedDB": "错误 - DB 可能被锁定 - 检查 F12 开发工具 -> 控制台或稍后重试。",
|
||||
"Gen_Offline": "离线",
|
||||
"Gen_Okay": "Ok",
|
||||
"Gen_Online": "",
|
||||
"Gen_Online": "在线",
|
||||
"Gen_Purge": "清除",
|
||||
"Gen_ReadDocs": "在文档中阅读更多内容。",
|
||||
"Gen_Remove_All": "全部删除",
|
||||
"Gen_Remove_Last": "删除最后一个",
|
||||
"Gen_Reset": "",
|
||||
"Gen_Reset": "重置",
|
||||
"Gen_Restore": "运行恢复",
|
||||
"Gen_Run": "运行",
|
||||
"Gen_Save": "保存",
|
||||
"Gen_Saved": "已保存",
|
||||
"Gen_Search": "搜索",
|
||||
"Gen_Select": "",
|
||||
"Gen_SelectIcon": "",
|
||||
"Gen_SelectToPreview": "",
|
||||
"Gen_Select": "选择",
|
||||
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\">",
|
||||
"Gen_SelectToPreview": "选择预览",
|
||||
"Gen_Selected_Devices": "选定的设备:",
|
||||
"Gen_Switch": "交换",
|
||||
"Gen_Upd": "已成功更新",
|
||||
"Gen_Upd_Fail": "更新失败",
|
||||
"Gen_Update": "更新",
|
||||
"Gen_Update_Value": "更新值",
|
||||
"Gen_ValidIcon": "",
|
||||
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \">",
|
||||
"Gen_Warning": "警告",
|
||||
"Gen_Work_In_Progress": "工作正在进行中,欢迎在 https://github.com/jokob-sk/NetAlertX/issues 上反馈",
|
||||
"Gen_create_new_device": "",
|
||||
"Gen_create_new_device_info": "",
|
||||
"Gen_create_new_device": "新设备",
|
||||
"Gen_create_new_device_info": "通常使用<a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">plugins</a>来发现设备。但是,在某些情况下,您可能需要手动添加设备。要探索特定场景,请查看<a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/REMOTE_NETWORKS.md\">。",
|
||||
"General_display_name": "通用",
|
||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||
"HRS_TO_KEEP_NEWDEV_description": "这是一项维护设置。如果启用(<code>0</code> 为禁用),则标记为<b>新设备</b>的设备(如果其<b>首次会话</b>时间早于此设置中指定的小时数)将被删除。如果您想在 <code>X</code> 小时后自动删除<b>新设备</b>,请使用此设置。",
|
||||
"HRS_TO_KEEP_NEWDEV_name": "保留新设备",
|
||||
"HRS_TO_KEEP_OFFDEV_description": "",
|
||||
"HRS_TO_KEEP_OFFDEV_name": "",
|
||||
"HRS_TO_KEEP_OFFDEV_description": "这是维护设置<b>删除设备</b>。如果启用了这个设置(<code>0</code>是禁用),任何<b>上次链接</b>时间比设置里存的指定时间长的<b>下线</b>设备都会被删除。要是您想<code>X</code>小时以候自动处理<b>下线设备</b>,请用这个设置。",
|
||||
"HRS_TO_KEEP_OFFDEV_name": "保留离线设备",
|
||||
"LOADED_PLUGINS_description": "加载哪些插件。添加插件可能会降低应用程序的速度。在<a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">插件文档</a>中详细了解需要启用哪些插件、插件类型或扫描选项。卸载插件将丢失您的设置。只有<code>已禁用</code>的插件才能卸载。",
|
||||
"LOADED_PLUGINS_name": "已加载插件",
|
||||
"LOG_LEVEL_description": "此设置将启用更详细的日志记录。对于调试写入数据库的事件很有用。",
|
||||
@@ -344,7 +349,7 @@
|
||||
"Loading": "加载中...",
|
||||
"Login_Box": "输入密码",
|
||||
"Login_Default_PWD": "默认密码“123456”仍然有效。",
|
||||
"Login_Info": "",
|
||||
"Login_Info": "设置密码使用设置密码插件。如果您无法登录,请查看<a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">。",
|
||||
"Login_Psw-box": "密码",
|
||||
"Login_Psw_alert": "密码警报!",
|
||||
"Login_Psw_folder": "在配置文件夹中。",
|
||||
@@ -359,18 +364,18 @@
|
||||
"Maint_PurgeLog": "清除日志",
|
||||
"Maint_RestartServer": "重启服务器",
|
||||
"Maint_Restart_Server_noti_text": "您确定要重新启动后端服务器吗?这可能会导致应用程序不一致。请先备份您的设置。<br/> <br/> 注意:这可能需要几分钟。",
|
||||
"Maintenance_InitCheck": "",
|
||||
"Maintenance_InitCheck_Checking": "",
|
||||
"Maintenance_InitCheck_QuickSetupGuide": "",
|
||||
"Maintenance_InitCheck_Success": "",
|
||||
"Maintenance_ReCheck": "",
|
||||
"Maintenance_InitCheck": "初步检查",
|
||||
"Maintenance_InitCheck_Checking": "查看中…",
|
||||
"Maintenance_InitCheck_QuickSetupGuide": "确保您遵循<a href=\"https://jokob-sk.github.io/NetAlertX/INITIAL_SETUP/\" target=\"_blank\">快速设置指南</a>。",
|
||||
"Maintenance_InitCheck_Success": "应用程序启动成功!",
|
||||
"Maintenance_ReCheck": "重试检查",
|
||||
"Maintenance_Running_Version": "安装版本",
|
||||
"Maintenance_Status": "状态",
|
||||
"Maintenance_Title": "维护工具",
|
||||
"Maintenance_Tool_DownloadConfig": "",
|
||||
"Maintenance_Tool_DownloadConfig_text": "",
|
||||
"Maintenance_Tool_DownloadWorkflows": "",
|
||||
"Maintenance_Tool_DownloadWorkflows_text": "",
|
||||
"Maintenance_Tool_DownloadConfig": "设置导出",
|
||||
"Maintenance_Tool_DownloadConfig_text": "下载<code>app.conf</code> 里存的设置的完整备份。",
|
||||
"Maintenance_Tool_DownloadWorkflows": "工作流程导出",
|
||||
"Maintenance_Tool_DownloadWorkflows_text": "下载<code>workflows.json</code> 里存的工作流程的完整备份。",
|
||||
"Maintenance_Tool_ExportCSV": "CSV 导出",
|
||||
"Maintenance_Tool_ExportCSV_noti": "CSV 导出",
|
||||
"Maintenance_Tool_ExportCSV_noti_text": "您确定要生成 CSV 文件吗?",
|
||||
@@ -379,13 +384,13 @@
|
||||
"Maintenance_Tool_ImportCSV_noti": "CSV 导入",
|
||||
"Maintenance_Tool_ImportCSV_noti_text": "您确定要导入 CSV 文件吗?这将完全<b>覆盖</b>数据库中的设备。",
|
||||
"Maintenance_Tool_ImportCSV_text": "在使用此功能之前,请先备份。导入一个 CSV(逗号分隔值)文件,其中包含设备列表,包括网络节点和连接设备之间的网络关系。为此,请将名为 <b>devices.csv</b> 的 CSV 文件放入您的 <b>/config</b> 文件夹中。",
|
||||
"Maintenance_Tool_ImportConfig_noti": "",
|
||||
"Maintenance_Tool_ImportConfig_noti": "设置导入(app.conf)",
|
||||
"Maintenance_Tool_ImportPastedCSV": "CSV 导入(粘贴)",
|
||||
"Maintenance_Tool_ImportPastedCSV_noti_text": "您确定要导入粘贴的 CSV 吗?这将完全<b>覆盖</b>数据库中的设备。",
|
||||
"Maintenance_Tool_ImportPastedCSV_text": "使用此功能前,请先备份。导入一个包含设备列表(包括网络节点和所连接设备之间的网络关系)的 CSV(逗号分隔值)文件。",
|
||||
"Maintenance_Tool_ImportPastedConfig": "",
|
||||
"Maintenance_Tool_ImportPastedConfig_noti_text": "",
|
||||
"Maintenance_Tool_ImportPastedConfig_text": "",
|
||||
"Maintenance_Tool_ImportPastedConfig": "设置导入(粘贴)",
|
||||
"Maintenance_Tool_ImportPastedConfig_noti_text": "您确认要导入粘贴的设置吗?这会完全<b>覆盖</b><code>app.conf</code>的内容。",
|
||||
"Maintenance_Tool_ImportPastedConfig_text": "导入包含所有应用程序设置的<code>app.config</code>文件。建议先通过<b>设置导出</b>功能下载当前的<code>app.conf</code>文件。",
|
||||
"Maintenance_Tool_arpscansw": "切换 arp 扫描(开/关)",
|
||||
"Maintenance_Tool_arpscansw_noti": "打开或关闭 arp 扫描",
|
||||
"Maintenance_Tool_arpscansw_noti_text": "当扫描关闭时,它会保持关闭状态,直到再次激活为止。",
|
||||
@@ -486,6 +491,7 @@
|
||||
"Navigation_Workflows": "工作流程",
|
||||
"Network_Assign": "连接上述 <i class=\"fa fa-server\"></i> 网络节点",
|
||||
"Network_Cant_Assign": "无法将根 Internet 节点指定为子节点。",
|
||||
"Network_Cant_Assign_No_Node_Selected": "",
|
||||
"Network_Configuration_Error": "配置错误",
|
||||
"Network_Connected": "联网设备",
|
||||
"Network_ManageAdd": "添加设备",
|
||||
@@ -522,6 +528,8 @@
|
||||
"Network_Root": "根节点",
|
||||
"Network_Root_Not_Configured": "在<a href=\"deviceDetails.php?mac=Internet\">Internet 根设备</a>的<b>类型</b>字段中选择一个网络设备类型,例如<b>网关</b>,以开始配置此屏幕。<br/><br/>更多文档可在<a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank\">如何设置您的网络页面</a>指南中找到",
|
||||
"Network_Root_Unconfigurable": "无法配置根",
|
||||
"Network_ShowArchived": "",
|
||||
"Network_ShowOffline": "",
|
||||
"Network_Table_Hostname": "主机名",
|
||||
"Network_Table_IP": "IP",
|
||||
"Network_Table_State": "状态",
|
||||
@@ -704,24 +712,21 @@
|
||||
"WF_Trigger": "",
|
||||
"WF_Trigger_event_type": "",
|
||||
"WF_Trigger_type": "",
|
||||
"add_icon_event_icon": "",
|
||||
"add_icon_event_tooltip": "",
|
||||
"add_option_event_icon": "",
|
||||
"add_option_event_tooltip": "",
|
||||
"copy_icons_event_icon": "",
|
||||
"copy_icons_event_tooltip": "",
|
||||
"devices_old": "刷新中...",
|
||||
"general_event_description": "您触发的事件可能需要一段时间才能完成后台进程。一旦以下执行队列清空,执行就会结束(如果遇到问题,请检查<a href='/maintenance.php#tab_Logging'>错误日志</a>)。<br/> <br/> 执行队列:",
|
||||
"general_event_title": "执行自组织网络事件",
|
||||
"go_to_node_event_icon": "",
|
||||
"go_to_device_event_tooltip": "",
|
||||
"go_to_node_event_tooltip": "",
|
||||
"new_version_available": "",
|
||||
"report_guid": "通知guid:",
|
||||
"report_guid_missing": "未找到链接的通知。最近发送的通知与可用通知之间存在短暂延迟。几秒钟后刷新页面并缓存。所选通知也可能已在维护期间被删除,如 <code>DBCLNP_NOTIFI_HIST</code> 设置中所述。<br/> <br/>系统将改为显示最新通知。缺失的通知具有以下 GUID:",
|
||||
"report_select_format": "选择格式:",
|
||||
"report_time": "通知时间:",
|
||||
"run_event_icon": "",
|
||||
"run_event_tooltip": "在运行之前,请先启用设置并保存更改。",
|
||||
"select_icon_event_tooltip": "",
|
||||
"settings_core_icon": "",
|
||||
"settings_core_label": "核",
|
||||
"settings_device_scanners": "设备扫描器用于发现写入当前扫描数据库表的设备。",
|
||||
@@ -748,6 +753,5 @@
|
||||
"settings_system_icon": "",
|
||||
"settings_system_label": "系统",
|
||||
"settings_update_item_warning": "更新下面的值。请注意遵循先前的格式。<b>未执行验证。</b>",
|
||||
"test_event_icon": "",
|
||||
"test_event_tooltip": "在测试设置之前,请先保存更改。"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -453,7 +453,7 @@
|
||||
"value": "Example Plugin"
|
||||
},
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
|
Before Width: | Height: | Size: 139 KiB After Width: | Height: | Size: 103 KiB |
@@ -134,7 +134,7 @@
|
||||
},
|
||||
{
|
||||
"column": "Watched_Value1",
|
||||
"css_classes": "col-sm-2",
|
||||
"css_classes": "col-sm-1",
|
||||
"show": true,
|
||||
"type": "eval",
|
||||
"default_value": "",
|
||||
|
||||
@@ -134,7 +134,7 @@
|
||||
},
|
||||
{
|
||||
"column": "Watched_Value1",
|
||||
"css_classes": "col-sm-2",
|
||||
"css_classes": "col-sm-1",
|
||||
"show": true,
|
||||
"type": "eval",
|
||||
"default_value": "",
|
||||
|
||||
@@ -147,7 +147,7 @@
|
||||
{
|
||||
"column": "Watched_Value1",
|
||||
"css_classes": "col-sm-3",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
@@ -177,7 +177,7 @@
|
||||
{
|
||||
"column": "Watched_Value3",
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
@@ -193,7 +193,7 @@
|
||||
"column": "Watched_Value4",
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"type": "device_mac",
|
||||
"type": "device_name_mac",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
"localized": ["name"],
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
},
|
||||
{
|
||||
"column": "Watched_Value1",
|
||||
"css_classes": "col-sm-3",
|
||||
"css_classes": "col-sm-1",
|
||||
"show": true,
|
||||
"type": "eval",
|
||||
"default_value": "",
|
||||
@@ -527,6 +527,34 @@
|
||||
"string": "All NTFY messages have a priority, which defines how urgently your phone notifies you. On Android, you can set custom notification sounds and vibration patterns on your phone to map to these priorities (see <a href=\"https://docs.ntfy.sh/subscribe/phone/\">Android config</a>)."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "VERIFY_SSL",
|
||||
"type": {
|
||||
"dataType": "boolean",
|
||||
"elements": [
|
||||
{
|
||||
"elementType": "input",
|
||||
"elementOptions": [{ "type": "checkbox" }],
|
||||
"transformers": []
|
||||
}
|
||||
]
|
||||
},
|
||||
"default_value": true,
|
||||
"options": [],
|
||||
"localized": ["name", "description"],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Verify SSL"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Enable TLS support. Disable if you are using a self-signed certificate."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -98,6 +98,7 @@ def send(html, text):
|
||||
token = get_setting_value('NTFY_TOKEN')
|
||||
user = get_setting_value('NTFY_USER')
|
||||
pwd = get_setting_value('NTFY_PASSWORD')
|
||||
verify_ssl = get_setting_value('NTFY_VERIFY_SSL')
|
||||
|
||||
# prepare request headers
|
||||
headers = {
|
||||
@@ -121,7 +122,8 @@ def send(html, text):
|
||||
response = requests.post("{}/{}".format( get_setting_value('NTFY_HOST'),
|
||||
get_setting_value('NTFY_TOPIC')),
|
||||
data = text,
|
||||
headers = headers)
|
||||
headers = headers,
|
||||
verify = verify_ssl)
|
||||
|
||||
response_status_code = response.status_code
|
||||
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
},
|
||||
{
|
||||
"column": "Watched_Value1",
|
||||
"css_classes": "col-sm-3",
|
||||
"css_classes": "col-sm-1",
|
||||
"show": true,
|
||||
"type": "eval",
|
||||
"default_value": "",
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
},
|
||||
{
|
||||
"column": "Watched_Value1",
|
||||
"css_classes": "col-sm-3",
|
||||
"css_classes": "col-sm-1",
|
||||
"show": true,
|
||||
"type": "eval",
|
||||
"default_value": "",
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
},
|
||||
{
|
||||
"column": "Watched_Value1",
|
||||
"css_classes": "col-sm-2",
|
||||
"css_classes": "col-sm-1",
|
||||
"show": true,
|
||||
"type": "eval",
|
||||
"default_value": "",
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
},
|
||||
{
|
||||
"column": "Watched_Value1",
|
||||
"css_classes": "col-sm-3",
|
||||
"css_classes": "col-sm-1",
|
||||
"show": true,
|
||||
"type": "eval",
|
||||
"default_value": "",
|
||||
@@ -116,7 +116,7 @@
|
||||
},
|
||||
{
|
||||
"column": "Watched_Value2",
|
||||
"css_classes": "col-sm-2",
|
||||
"css_classes": "col-sm-3",
|
||||
"show": true,
|
||||
"type": "textarea_readonly",
|
||||
"default_value": "",
|
||||
@@ -131,7 +131,7 @@
|
||||
},
|
||||
{
|
||||
"column": "Watched_Value3",
|
||||
"css_classes": "col-sm-2",
|
||||
"css_classes": "col-sm-3",
|
||||
"show": true,
|
||||
"type": "textarea_readonly",
|
||||
"default_value": "",
|
||||
|
||||
@@ -468,7 +468,7 @@
|
||||
"value": "ARPSCAN"
|
||||
},
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
@@ -492,7 +492,7 @@
|
||||
"value": "ASUSWRT"
|
||||
},
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
@@ -284,7 +284,7 @@
|
||||
{
|
||||
"column": "Watched_Value1",
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
@@ -28,6 +28,9 @@
|
||||
"settings": [
|
||||
{
|
||||
"function": "icon",
|
||||
"events": [
|
||||
"select_icon"
|
||||
],
|
||||
"type": {
|
||||
"dataType": "array",
|
||||
"elements": [
|
||||
|
||||
@@ -607,7 +607,7 @@
|
||||
"value": "DDNS"
|
||||
},
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
@@ -437,7 +437,7 @@
|
||||
"value": "Freebox"
|
||||
},
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
@@ -311,7 +311,7 @@
|
||||
"column": "Watched_Value2",
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"type": "label",
|
||||
"type": "textarea_readonly",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
"localized": [
|
||||
@@ -365,7 +365,7 @@
|
||||
"value": "ICMP"
|
||||
},
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
@@ -548,7 +548,7 @@
|
||||
"value": "INTRNT"
|
||||
},
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
@@ -335,7 +335,7 @@
|
||||
"value": "IPNEIGH"
|
||||
},
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
@@ -491,7 +491,7 @@
|
||||
"value": "LUCIRPC"
|
||||
},
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
@@ -292,7 +292,7 @@
|
||||
{
|
||||
"column": "Watched_Value1",
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
@@ -562,7 +562,8 @@
|
||||
"function": "devIcon",
|
||||
"events": [
|
||||
"copy_icons",
|
||||
"add_icon"
|
||||
"add_icon",
|
||||
"select_icon"
|
||||
],
|
||||
"type": {
|
||||
"dataType": "string",
|
||||
@@ -587,7 +588,7 @@
|
||||
"elementHasInputValue": 1,
|
||||
"elementOptions": [
|
||||
{
|
||||
"cssClasses": "iconInputVal"
|
||||
"cssClasses": "iconInputVal myhidden"
|
||||
},
|
||||
{
|
||||
"onChange": "updateIconPreview(this)"
|
||||
@@ -933,7 +934,7 @@
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "First Connection"
|
||||
"string": "First Seen"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
@@ -1338,7 +1339,8 @@
|
||||
{
|
||||
"function": "devParentMAC",
|
||||
"events": [
|
||||
"go_to_node"
|
||||
"go_to_node",
|
||||
"go_to_device"
|
||||
],
|
||||
"type": {
|
||||
"dataType": "string",
|
||||
@@ -1373,13 +1375,47 @@
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Network Node"
|
||||
"string": "Parent Node"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "The MAC address of the network node."
|
||||
"string": "The MAC address of the Parent network node."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "devParentRelType",
|
||||
"type": {
|
||||
"dataType": "array",
|
||||
"elements": [
|
||||
{
|
||||
"elementType": "select",
|
||||
"elementOptions": [{ "ordeable": "true"}],
|
||||
"transformers": ["deviceRelType"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"default_value": "default",
|
||||
"options": [
|
||||
"default",
|
||||
"child",
|
||||
"logical",
|
||||
"nic",
|
||||
"virtual"
|
||||
],
|
||||
"localized": ["name", "description"],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Relationship Type"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Defines the relationship between this device and its parent. Selecting <code>nic</code> links it as a network interface, allowing the parent’s online status to be evaluated using its <code>devReqNicsOnline</code> (“Require NICs Online”) setting. Some relationship types may hide the device from lists; see the <code>UI_hide_rel_types</code> setting for details."
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1404,7 +1440,7 @@
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Network Node Port"
|
||||
"string": "Parent Node Port"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
@@ -1414,6 +1450,34 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "devChildrenDynamic",
|
||||
"type": {
|
||||
"dataType": "array",
|
||||
"elements": [
|
||||
{
|
||||
"elementType": "select",
|
||||
"elementOptions": [{ "multiple": "true", "ordeable": "true", "readonly": "true" }],
|
||||
"transformers": ["deviceChip"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"default_value": [],
|
||||
"options": [],
|
||||
"localized": ["name", "description"],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Children Nodes"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Children nodes assigned to this device. Navigate to the child device directly to edit the relationship and details."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "devSSID",
|
||||
"type": {
|
||||
@@ -1561,7 +1625,7 @@
|
||||
"elementHasInputValue": 1,
|
||||
"elementOptions": [
|
||||
{
|
||||
"cssClasses": "iconInputVal"
|
||||
"cssClasses": "iconInputVal myhidden"
|
||||
},
|
||||
{
|
||||
"onChange": "updateIconPreview(this)"
|
||||
@@ -1665,6 +1729,69 @@
|
||||
"string": "Fully Qualified Domain Name - Autodetected and Uneditable. Can be auto-refreshed by enabling the <code>REFRESH_FQDN</code> setting."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "devReqNicsOnline",
|
||||
"type": {
|
||||
"dataType": "integer",
|
||||
"elements": [
|
||||
{
|
||||
"elementType": "input",
|
||||
"elementOptions": [
|
||||
{
|
||||
"type": "checkbox"
|
||||
}
|
||||
],
|
||||
"transformers": []
|
||||
}
|
||||
]
|
||||
},
|
||||
"default_value": 0,
|
||||
"options": [],
|
||||
"localized": [
|
||||
"name",
|
||||
"description"
|
||||
],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Require NICs Online"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Indicates whether this device should be considered online only if all associated NICs (devices with the <code>nic</code> relationship type) are online. If disabled, the device is considered online if any NIC is online."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "devChildrenNicsDynamic",
|
||||
"type": {
|
||||
"dataType": "array",
|
||||
"elements": [
|
||||
{
|
||||
"elementType": "select",
|
||||
"elementOptions": [{ "multiple": "true", "ordeable": "true", "readonly": "true" }],
|
||||
"transformers": ["deviceChip"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"default_value": [],
|
||||
"options": [],
|
||||
"localized": ["name", "description"],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "NICs"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Children nodes with the <code>nic</code> Relationship Type. Navigate to the child device directly to edit the relationship and details."
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"required": [],
|
||||
|
||||
@@ -508,7 +508,7 @@
|
||||
"value": "NMAPDEV"
|
||||
},
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
@@ -284,7 +284,7 @@
|
||||
{
|
||||
"column": "Watched_Value1",
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
@@ -620,7 +620,7 @@
|
||||
"value": "OMDSDN"
|
||||
},
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
@@ -426,7 +426,7 @@
|
||||
"value": "PIHOLE"
|
||||
},
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
@@ -279,7 +279,7 @@
|
||||
"value": "SNMPDSC"
|
||||
},
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
@@ -587,7 +587,7 @@
|
||||
"value": "sync"
|
||||
},
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
@@ -176,32 +176,31 @@ def main():
|
||||
# only process received .log files, skipping the one logging the progress of this plugin
|
||||
if file_name != 'last_result.log':
|
||||
mylog('verbose', [f'[{pluginName}] Processing: "{file_name}"'])
|
||||
|
||||
# Store e.g. Node_1 from last_result.encoded.Node_1.1.log
|
||||
tmp_SyncHubNodeName = ''
|
||||
if len(file_name.split('.')) > 2:
|
||||
tmp_SyncHubNodeName = file_name.split('.')[1]
|
||||
|
||||
|
||||
file_path = f"{LOG_PATH}/{file_name}"
|
||||
|
||||
with open(file_path, 'r') as f:
|
||||
data = json.load(f)
|
||||
for device in data['data']:
|
||||
if device['devMac'] not in unique_mac_addresses:
|
||||
device['devSyncHubNode'] = tmp_SyncHubNodeName
|
||||
unique_mac_addresses.add(device['devMac'])
|
||||
device_data.append(device)
|
||||
|
||||
# Rename the file to "processed_" + current name
|
||||
new_file_name = f"processed_{file_name}"
|
||||
new_file_path = os.path.join(LOG_PATH, new_file_name)
|
||||
# make sure the file has teh correct name (e.g last_result.encoded.Node_1.1.log) to skip any otehr plugin files
|
||||
if len(file_name.split('.')) > 2:
|
||||
# Store e.g. Node_1 from last_result.encoded.Node_1.1.log
|
||||
syncHubNodeName = file_name.split('.')[1]
|
||||
|
||||
# Overwrite if the new file already exists
|
||||
if os.path.exists(new_file_path):
|
||||
os.remove(new_file_path)
|
||||
file_path = f"{LOG_PATH}/{file_name}"
|
||||
|
||||
with open(file_path, 'r') as f:
|
||||
data = json.load(f)
|
||||
for device in data['data']:
|
||||
if device['devMac'] not in unique_mac_addresses:
|
||||
device['devSyncHubNode'] = syncHubNodeName
|
||||
unique_mac_addresses.add(device['devMac'])
|
||||
device_data.append(device)
|
||||
|
||||
# Rename the file to "processed_" + current name
|
||||
new_file_name = f"processed_{file_name}"
|
||||
new_file_path = os.path.join(LOG_PATH, new_file_name)
|
||||
|
||||
os.rename(file_path, new_file_path)
|
||||
# Overwrite if the new file already exists
|
||||
if os.path.exists(new_file_path):
|
||||
os.remove(new_file_path)
|
||||
|
||||
os.rename(file_path, new_file_path)
|
||||
|
||||
if len(device_data) > 0:
|
||||
# Retrieve existing devMac values from the Devices table
|
||||
|
||||
@@ -378,7 +378,9 @@
|
||||
"Device_TableHead_PresentLastScan",
|
||||
"Device_TableHead_AlertDown",
|
||||
"Device_TableHead_CustomProps",
|
||||
"Device_TableHead_FQDN"
|
||||
"Device_TableHead_FQDN",
|
||||
"Device_TableHead_ParentRelType",
|
||||
"Device_TableHead_ReqNicsOnline"
|
||||
],
|
||||
"localized": ["name", "description"],
|
||||
"name": [
|
||||
@@ -454,7 +456,8 @@
|
||||
"Device_TableHead_SyncHubNodeName",
|
||||
"Device_TableHead_NetworkSite",
|
||||
"Device_TableHead_SSID",
|
||||
"Device_TableHead_SourcePlugin"
|
||||
"Device_TableHead_SourcePlugin",
|
||||
"Device_TableHead_ParentRelType"
|
||||
],
|
||||
"localized": ["name", "description"],
|
||||
"name": [
|
||||
@@ -515,6 +518,43 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "hide_rel_types",
|
||||
"type": {
|
||||
"dataType": "array",
|
||||
"elements": [
|
||||
{
|
||||
"elementType": "select",
|
||||
"elementOptions": [{ "multiple": "true", "ordeable": "true" }],
|
||||
"transformers": []
|
||||
}
|
||||
]
|
||||
},
|
||||
"maxLength": 50,
|
||||
"default_value": [
|
||||
"nic",
|
||||
"virtual"
|
||||
],
|
||||
"options": [
|
||||
"child",
|
||||
"logical",
|
||||
"nic",
|
||||
"virtual"
|
||||
],
|
||||
"localized": ["name", "description"],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Relationships to hide"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Specifies which device relationships to their parent node should be hidden from the devices lists. Devices with a matching <code>devParentRelType</code> will be excluded from most lists."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "hide_empty",
|
||||
"type": {
|
||||
|
||||
@@ -11,16 +11,16 @@ Specify the following settings in the Settings section of NetAlertX:
|
||||
- `UNFIMP_host` - Host URL or IP address where the UNIFI controller is hosted (excluding `http://`)
|
||||
- `UNFIMP_sites` - Name of the sites (usually 'default', check the URL in your UniFi controller UI if unsure. The site id is in the following part of the URL: `https://192.168.1.1:8443/manage/site/this-is-the-site-id/settings/`).
|
||||
- `UNFIMP_protocol` - https:// or http://
|
||||
- `UNFIMP_port` - Usually `8443` or `8843`
|
||||
- `UNFIMP_port` - Usually `8443`, `8843`, or `443`
|
||||
- `UNFIMP_version` - see below table for details
|
||||
|
||||
|
||||
#### Version table
|
||||
#### Config overview
|
||||
|
||||
| Controller | `UNFIMP_version` |
|
||||
| ------------------------------------------------------ | ------------------------- |
|
||||
| Cloud Gateway Ultra / UCK cloudkey V2 plus (v4.0.18) | `UDMP-unifiOS` |
|
||||
| Docker hosted | `v5` |
|
||||
| Controller | `UNFIMP_version` | `UNFIMP_port` |
|
||||
| ------------------------------------------------------ | ------------------------- | ---------------- |
|
||||
| Cloud Gateway Ultra / UCK cloudkey V2 plus (v4.0.18) | `UDMP-unifiOS` | `443` |
|
||||
| Docker hosted | `v5` | `8443` (usually) |
|
||||
|
||||
### Notes
|
||||
|
||||
|
||||
@@ -355,7 +355,7 @@
|
||||
}
|
||||
],
|
||||
"options": [],
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label"
|
||||
},
|
||||
{
|
||||
|
||||
@@ -462,7 +462,7 @@
|
||||
"value": "VNDRPDT"
|
||||
},
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"show": false,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
|
||||
@@ -4,12 +4,6 @@
|
||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||
?>
|
||||
|
||||
<!-- ----------------------------------------------------------------------- -->
|
||||
|
||||
<!-- ----------------------------------------------------------------------- -->
|
||||
|
||||
|
||||
|
||||
<!-- Main content ---------------------------------------------------------- -->
|
||||
<section class="content">
|
||||
<div class="plugin-filters hidden" >
|
||||
@@ -23,44 +17,70 @@
|
||||
<ul id="tabs-location" class="nav nav-tabs col-sm-2 ">
|
||||
<!-- PLACEHOLDER -->
|
||||
</ul>
|
||||
<div id="tabs-content-location" class="tab-content col-sm-10">
|
||||
<!-- PLACEHOLDER -->
|
||||
<div id="tabs-content-location-wrap" class="tab-content col-sm-10">
|
||||
<div id="tabs-content-location" class="tab-content col-sm-12">
|
||||
<!-- PLACEHOLDER -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Initializes fields based on current MAC
|
||||
function initFields() {
|
||||
// Global variable to track the last MAC we initialized with
|
||||
let lastMac = null;
|
||||
let keepUpdating = true;
|
||||
|
||||
var urlParams = new URLSearchParams(window.location.search);
|
||||
mac = urlParams.get ('mac');
|
||||
function initMacFilter() {
|
||||
// Parse the MAC parameter from the URL (e.g., ?mac=00:11:22:33:44:55)
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const mac = urlParams.get('mac');
|
||||
|
||||
// if the current mac has changed, reinitialize the data
|
||||
if(mac != undefined && $("#txtMacFilter").val() != mac)
|
||||
{
|
||||
|
||||
$("#txtMacFilter").val(mac);
|
||||
|
||||
getData();
|
||||
}
|
||||
// Set the MAC in the input field
|
||||
if(mac)
|
||||
{
|
||||
$("#txtMacFilter").val(mac);
|
||||
}
|
||||
else
|
||||
{
|
||||
$("#txtMacFilter").val("--");
|
||||
}
|
||||
|
||||
return mac;
|
||||
}
|
||||
|
||||
// -----------------------------------------------
|
||||
// INIT with polling for panel element visibility
|
||||
// -----------------------------------------------
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Checking if current MAC has changed and triggering an updated if needed
|
||||
function updater() {
|
||||
// Initializes the fields if the MAC in the URL is different or not yet set
|
||||
function initFields() {
|
||||
|
||||
initFields()
|
||||
// Only proceed if .plugin-content is visible
|
||||
if (!$('.plugin-content:visible').length) {
|
||||
return; // exit early if nothing is visible
|
||||
}
|
||||
|
||||
// loop
|
||||
setTimeout(function() {
|
||||
updater();
|
||||
}, 500);
|
||||
// Get current value from the readonly text field
|
||||
const currentVal = initMacFilter();
|
||||
|
||||
// If a MAC exists in the URL and it's either:
|
||||
// - the first time running (field shows default "--"), or
|
||||
// - different from what's already displayed
|
||||
if (currentVal != "--" && currentVal !== lastMac) {
|
||||
|
||||
// Update the lastMac so we don't reload unnecessarily
|
||||
lastMac = currentVal;
|
||||
|
||||
// Trigger data loading based on new MAC
|
||||
getData();
|
||||
} else if((currentVal === "--" || currentVal == null ) && keepUpdating)
|
||||
{
|
||||
$("#txtMacFilter").val("--"); // need to set this as filters are using this later on
|
||||
keepUpdating = false; // stop updates
|
||||
getData();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
@@ -241,7 +261,9 @@ pluginUnprocessedEvents = []
|
||||
pluginObjects = []
|
||||
pluginHistory = []
|
||||
|
||||
function getData(){
|
||||
function getData(){
|
||||
|
||||
console.log("Plugins getData called");
|
||||
|
||||
// Show the loading spinner while generating
|
||||
showSpinner();
|
||||
@@ -263,11 +285,9 @@ function getData(){
|
||||
pluginHistory = res["data"];
|
||||
|
||||
generateTabs()
|
||||
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@@ -279,15 +299,24 @@ function generateTabs() {
|
||||
// Sort pluginDefinitions by unique_prefix alphabetically
|
||||
pluginDefinitions.sort((a, b) => a.unique_prefix.localeCompare(b.unique_prefix));
|
||||
|
||||
assignActive = true;
|
||||
|
||||
// Iterate over the sorted pluginDefinitions to create tab headers and content
|
||||
pluginDefinitions.forEach(pluginObj => {
|
||||
if (pluginObj.show_ui) {
|
||||
stats = createTabContent(pluginObj); // Create the content for each tab
|
||||
createTabHeader(pluginObj, stats); // Create the header for each tab
|
||||
}
|
||||
});
|
||||
stats = createTabContent(pluginObj, assignActive); // Create the content for each tab
|
||||
|
||||
hideSpinner()
|
||||
if(stats.objectDataCount > 0)
|
||||
{
|
||||
createTabHeader(pluginObj, stats, assignActive); // Create the header for each tab
|
||||
assignActive = false; // only mark first with content active
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
hideSpinner()
|
||||
}
|
||||
|
||||
function resetTabs() {
|
||||
@@ -296,10 +325,13 @@ function resetTabs() {
|
||||
$('#tabs-content-location').empty();
|
||||
}
|
||||
|
||||
function createTabHeader(pluginObj, stats) {
|
||||
// ---------------------------------------------------------------
|
||||
// left headers
|
||||
function createTabHeader(pluginObj, stats, assignActive) {
|
||||
const prefix = pluginObj.unique_prefix; // Get the unique prefix for the plugin
|
||||
|
||||
// Determine the active class for the first tab
|
||||
const activeClass = pluginDefinitions.indexOf(pluginObj) === 0 ? 'active' : '';
|
||||
assignActive ? activeClass = "active" : activeClass = "";
|
||||
|
||||
// Append the tab header to the tabs location
|
||||
$('#tabs-location').append(`
|
||||
@@ -311,20 +343,23 @@ function createTabHeader(pluginObj, stats) {
|
||||
${stats.objectDataCount > 0 ? `<div class="pluginBadgeWrap"><span title="" class="badge pluginBadge" >${stats.objectDataCount}</span></div>` : ""}
|
||||
</li>
|
||||
`);
|
||||
|
||||
}
|
||||
|
||||
function createTabContent(pluginObj) {
|
||||
// ---------------------------------------------------------------
|
||||
// Content of selected plugin (header)
|
||||
function createTabContent(pluginObj, assignActive) {
|
||||
const prefix = pluginObj.unique_prefix; // Get the unique prefix for the plugin
|
||||
const colDefinitions = getColumnDefinitions(pluginObj); // Get column definitions for DataTables
|
||||
|
||||
// Get data for events, objects, and history related to the plugin
|
||||
const objectData = getObjectData(prefix, colDefinitions, pluginObj);
|
||||
const eventData = getEventData(prefix, colDefinitions);
|
||||
const eventData = getEventData(prefix, colDefinitions, pluginObj);
|
||||
const historyData = getHistoryData(prefix, colDefinitions, pluginObj);
|
||||
|
||||
// Append the content structure for the plugin's tab to the content location
|
||||
$('#tabs-content-location').append(`
|
||||
<div id="${prefix}" class="tab-pane ${pluginDefinitions.indexOf(pluginObj) === 0 ? 'active' : ''}">
|
||||
<div id="${prefix}" class="tab-pane ${objectData.length > 0 && assignActive? 'active' : ''}">
|
||||
${generateTabNavigation(prefix, objectData.length, eventData.length, historyData.length)} <!-- Create tab navigation -->
|
||||
<div class="tab-content">
|
||||
${generateDataTable(prefix, 'Objects', objectData, colDefinitions)}
|
||||
@@ -353,10 +388,10 @@ function getColumnDefinitions(pluginObj) {
|
||||
return pluginObj["database_column_definitions"].filter(colDef => colDef.show);
|
||||
}
|
||||
|
||||
function getEventData(prefix, colDefinitions) {
|
||||
function getEventData(prefix, colDefinitions, pluginObj) {
|
||||
// Extract event data specific to the plugin and format it for DataTables
|
||||
return pluginUnprocessedEvents
|
||||
.filter(event => event.Plugin === prefix) // Filter events for the specific plugin
|
||||
.filter(event => event.Plugin === prefix && shouldBeShown(event, pluginObj)) // Filter events for the specific plugin
|
||||
.map(event => colDefinitions.map(colDef => event[colDef.column] || '')); // Map to the defined columns
|
||||
}
|
||||
|
||||
@@ -370,7 +405,7 @@ function getObjectData(prefix, colDefinitions, pluginObj) {
|
||||
function getHistoryData(prefix, colDefinitions, pluginObj) {
|
||||
|
||||
return pluginHistory
|
||||
.filter(history => history.Plugin === prefix) // First, filter based on the plugin prefix
|
||||
.filter(history => history.Plugin === prefix && shouldBeShown(history, pluginObj)) // First, filter based on the plugin prefix
|
||||
.sort((a, b) => b.Index - a.Index) // Then, sort by the Index field in descending order
|
||||
.slice(0, 50) // Limit the result to the first 50 entries
|
||||
.map(object =>
|
||||
@@ -410,7 +445,7 @@ function generateDataTable(prefix, tableType, data, colDefinitions) {
|
||||
</table>
|
||||
<div class="plugin-obj-purge">
|
||||
<button class="btn btn-primary" onclick="purgeAll('${prefix}', 'Plugins_${tableType}' )"><?= lang('Plugins_DeleteAll');?></button>
|
||||
${tableType !== 'Events' ? `<button class="btn btn-danger" onclick="deleteListed('${prefix}', 'Plugins_${tableType}' )"><?= lang('Plugins_Obj_DeleteListed');?></button>` : ''}
|
||||
${tableType !== 'Events' ? `<button class="btn btn-primary" onclick="deleteListed('${prefix}', 'Plugins_${tableType}' )"><?= lang('Plugins_Obj_DeleteListed');?></button>` : ''}
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
@@ -463,9 +498,13 @@ function shouldBeShown(entry, pluginObj)
|
||||
compare_operator = dataFilters[i].compare_operator;
|
||||
compare_js_template = dataFilters[i].compare_js_template;
|
||||
compare_use_quotes = dataFilters[i].compare_use_quotes;
|
||||
compare_field_id_value = $(`#${compare_field_id}`).val();
|
||||
compare_field_id_value = $(`#${compare_field_id}`).val();
|
||||
|
||||
// console.log(compare_field_id_value);
|
||||
// console.log(compare_field_id);
|
||||
|
||||
|
||||
// apply filter i sthe filter field has a valid value
|
||||
// apply filter if the filter field has a valid value
|
||||
if(compare_field_id_value != undefined && compare_field_id_value != '--')
|
||||
{
|
||||
// valid value
|
||||
@@ -494,12 +533,14 @@ function shouldBeShown(entry, pluginObj)
|
||||
plugPrefix = ''
|
||||
dbTable = ''
|
||||
|
||||
// --------------------------------------------------------
|
||||
function purgeAll(callback) {
|
||||
plugPrefix = arguments[0]; // plugin prefix
|
||||
dbTable = arguments[1]; // DB table
|
||||
// Ask
|
||||
showModalWarning('<?= lang('Gen_Purge');?>' + ' ' + plugPrefix + ' ' + dbTable , '<?= lang('Gen_AreYouSure');?>',
|
||||
'<?= lang('Gen_Cancel');?>', '<?= lang('Gen_Okay');?>', "purgeAllExecute");
|
||||
|
||||
// Ask for confirmation
|
||||
showModalWarning(`${getString('Gen_Purge')} ${plugPrefix} ${dbTable}`, `${getString('Gen_AreYouSure')}`,
|
||||
`${getString('Gen_Cancel')}`, `${getString('Gen_Okay')}`, "purgeAllExecute");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------
|
||||
@@ -515,31 +556,59 @@ function purgeAllExecute() {
|
||||
}
|
||||
|
||||
// --------------------------------------------------------
|
||||
function deleteListed(plugPrefix, dbTable) {
|
||||
function deleteListed(plugPrefixArg, dbTableArg) {
|
||||
plugPrefix = plugPrefixArg;
|
||||
dbTable = dbTableArg;
|
||||
|
||||
idArr = $(`#${plugPrefix} table[data-my-dbtable="${dbTable}"] tr[data-my-index]`).map(function(){return $(this).attr("data-my-index");}).get();
|
||||
// Collect selected IDs
|
||||
idArr = $(`#${plugPrefix} table[data-my-dbtable="${dbTable}"] tr[data-my-index]`)
|
||||
.map(function() {
|
||||
return $(this).attr("data-my-index");
|
||||
}).get();
|
||||
|
||||
console.log(idArr);
|
||||
if (idArr.length === 0) {
|
||||
showModalOk('Nothing to delete', 'No items are selected for deletion.');
|
||||
return;
|
||||
}
|
||||
|
||||
// Ask for confirmation
|
||||
showModalWarning(`${getString('Gen_Purge')} ${plugPrefix} ${dbTable}`, `${getString('Gen_AreYouSure')} (${idArr.length})`,
|
||||
`${getString('Gen_Cancel')}`, `${getString('Gen_Okay')}`, "deleteListedExecute");
|
||||
}
|
||||
|
||||
// --------------------------------------------------------
|
||||
function deleteListedExecute() {
|
||||
$.ajax({
|
||||
method: "POST",
|
||||
url: "php/server/dbHelper.php",
|
||||
data: { action: "delete", dbtable: dbTable, columnName: 'Index', id:idArr.toString() },
|
||||
success: function(data, textStatus) {
|
||||
updateApi("plugins_objects")
|
||||
showModalOk ('Result', data );
|
||||
showModalOk('Result', data);
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Main sequence
|
||||
|
||||
// show spinning icon
|
||||
showSpinner()
|
||||
getData()
|
||||
updater()
|
||||
// -----------------------------------------------------------------------------
|
||||
// Recurring function to monitor the URL and reinitialize if needed
|
||||
function updater() {
|
||||
initFields();
|
||||
|
||||
// Run updater again after delay
|
||||
setTimeout(updater, 200);
|
||||
}
|
||||
|
||||
// if visible, load immediately, if not start updater
|
||||
if (!$('.plugin-content:visible').length) {
|
||||
updater();
|
||||
}
|
||||
else
|
||||
{
|
||||
initFields();
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
@@ -514,10 +514,11 @@ $settingsJSON_DB = json_encode($settings, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX
|
||||
initListInteractionOptions() // init remove and edit listitem click gestures
|
||||
}, 50);
|
||||
|
||||
setupSmoothScrolling()
|
||||
setupSmoothScrolling();
|
||||
// try to initialize select2
|
||||
initSelect2()
|
||||
hideSpinner()
|
||||
initSelect2();
|
||||
initHoverNodeInfo();
|
||||
hideSpinner();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -151,7 +151,7 @@ echo '<div class="box box-solid">
|
||||
// Network Hardware ----------------------------------------------------------
|
||||
echo '<div class="box box-solid">
|
||||
<div class="box-header">
|
||||
<h3 class="box-title sysinfo_headline"><i class="fas fa-network-wired"></i> ' . lang('Systeminfo_Network_Hardware') . '</h3>
|
||||
<h3 class="box-title sysinfo_headline"><i class="fa fa-sitemap fa-rotate-270"></i> ' . lang('Systeminfo_Network_Hardware') . '</h3>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
<table id="networkTable" class="table table-bordered table-hover">
|
||||
|
||||
@@ -117,7 +117,8 @@ require 'php/templates/header.php';
|
||||
var guid = data.split(":")[1].trim();
|
||||
return `<a href="report.php?guid=${guid}">Go to Report</a>`;
|
||||
} else {
|
||||
return data;
|
||||
// clear quotes (") if wrapped in them
|
||||
return (data.startsWith('"') && data.endsWith('"')) ? data.slice(1, -1) : data;
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -208,6 +209,7 @@ require 'php/templates/header.php';
|
||||
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<?php
|
||||
|
||||
@@ -44,7 +44,8 @@ let fieldOptions = [
|
||||
"devLastIP", "devStaticIP", "devScan", "devLogEvents", "devAlertEvents",
|
||||
"devAlertDown", "devSkipRepeated", "devLastNotification", "devPresentLastScan",
|
||||
"devIsNew", "devLocation", "devIsArchived", "devParentMAC", "devParentPort",
|
||||
"devIcon", "devSite", "devSSID", "devSyncHubNode", "devSourcePlugin", "devFQDN"
|
||||
"devIcon", "devSite", "devSSID", "devSyncHubNode", "devSourcePlugin", "devFQDN",
|
||||
"devParentRelType", "devReqNicsOnline"
|
||||
];
|
||||
|
||||
let triggerTypes = [
|
||||
|
||||