Compare commits

..

50 Commits

Author SHA1 Message Date
jokob-sk
84d8363383 Presence start-end tooltip #1066 2025-05-24 09:38:02 +10:00
Jokob @NetAlertX
3830b00c33 Merge pull request #1068 from KihtrakRaknas/patch-1
Some checks failed
Code checks / check-url-paths (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled
Fix minor typo "longet"
2025-05-21 12:10:16 +10:00
Karthik Sankar
84103bb8ed Fix typo "longet"
`longet` should have been `longer`
2025-05-20 21:08:50 -04:00
slothsnow
0d7202f7a2 Translated using Weblate (German)
Some checks failed
Code checks / check-url-paths (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled
Currently translated at 89.3% (664 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/de/
2025-05-18 21:01:54 +02:00
jokob-sk
a1f4f9b92f Merge branch 'main' of https://github.com/jokob-sk/NetAlertX
Some checks failed
Code checks / check-url-paths (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled
2025-05-12 20:24:49 +10:00
jokob-sk
82410814de DateTime format based on TIMEZONE #1044 2025-05-12 20:24:44 +10:00
Hosted Weblate
98cf0a4bc0 Merge branch 'origin/main' into Weblate.
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
2025-05-11 23:10:59 +02:00
Максим Горпиніч
5efc9dcb16 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (743 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/uk/
2025-05-11 23:10:59 +02:00
Massimo Pissarello
cfa7fb47e4 Translated using Weblate (Italian)
Currently translated at 100.0% (743 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2025-05-11 23:10:59 +02:00
Safeguard
29d677253e Translated using Weblate (Russian)
Currently translated at 100.0% (743 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ru/
2025-05-11 23:10:58 +02:00
Sylvain Pichon
210a5e9ae2 Translated using Weblate (French)
Currently translated at 100.0% (743 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/fr/
2025-05-11 23:10:58 +02:00
Hans Meine
49465715a6 Translated using Weblate (German)
Currently translated at 89.2% (663 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/de/
2025-05-11 23:10:58 +02:00
jokob-sk
a0a14f24cc docs #1064 2025-05-12 07:10:20 +10:00
jokob-sk
209d06421c Merge branch 'main' of https://github.com/jokob-sk/NetAlertX
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
2025-05-11 08:34:38 +10:00
jokob-sk
cac2af8422 docs 2025-05-11 08:34:07 +10:00
Anonymous
57a9b269a0 Translated using Weblate (Ukrainian)
Currently translated at 99.8% (742 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/uk/
2025-05-10 23:40:30 +02:00
Anonymous
17b11a016c Translated using Weblate (Catalan)
Currently translated at 99.8% (742 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ca/
2025-05-10 23:40:30 +02:00
Anonymous
d05de62cc7 Translated using Weblate (Turkish)
Currently translated at 67.9% (505 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/tr/
2025-05-10 23:40:30 +02:00
Anonymous
3c28f9ed36 Translated using Weblate (Portuguese (Brazil))
Currently translated at 58.9% (438 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/pt_BR/
2025-05-10 23:40:30 +02:00
Anonymous
56bd1d2772 Translated using Weblate (Italian)
Currently translated at 99.8% (742 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/it/
2025-05-10 23:40:29 +02:00
Anonymous
7e65b06ff2 Translated using Weblate (Russian)
Currently translated at 99.8% (742 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ru/
2025-05-10 23:40:29 +02:00
Anonymous
78cb68d2c4 Translated using Weblate (French)
Currently translated at 99.8% (742 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/fr/
2025-05-10 23:40:29 +02:00
Anonymous
f8df8dc41a Translated using Weblate (Spanish)
Currently translated at 99.8% (742 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/es/
2025-05-10 23:40:29 +02:00
Hosted Weblate
4199f8891c Merge branch 'origin/main' into Weblate. 2025-05-10 23:28:02 +02:00
Hans Meine
7aa5f499b9 Translated using Weblate (German)
Currently translated at 89.2% (663 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/de/
2025-05-10 23:28:01 +02:00
jokob-sk
990f490fb3 docs #1064 2025-05-11 07:27:33 +10:00
jokob-sk
7dba186e39 Docker swarm guide #1031
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
2025-05-10 15:43:46 +10:00
jokob-sk
7443c52021 DateTime format based on TIMEZONE #1044 2025-05-10 15:28:54 +10:00
jokob-sk
03822ac8fa DateTime format based on TIMEZONE #1044 2025-05-10 15:23:02 +10:00
jokob-sk
01f7a18dce Auto delete in-app notifications #1052 2025-05-10 14:33:27 +10:00
Hosted Weblate
a392803478 Merge branch 'origin/main' into Weblate.
Some checks failed
Code checks / check-url-paths (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled
2025-05-07 22:31:41 +00:00
Ondřej Karaffa
c9ef1b1bce Translated using Weblate (Czech)
Currently translated at 1.3% (10 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/cs/
2025-05-07 22:31:40 +00:00
jokob-sk
87eda72a62 SMTP 2025-05-08 08:30:57 +10:00
jokob-sk
984bc58cf2 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX 2025-05-08 08:12:23 +10:00
jokob-sk
4d7a55e4f6 enable multiple to emails SMTP #1061 2025-05-08 08:12:18 +10:00
Bekir Kayra Çiğdem
79d67d1cbe Translated using Weblate (Turkish)
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
Currently translated at 68.1% (506 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/tr/
2025-05-07 12:02:06 +00:00
jokob-sk
0bc93a2352 Merge branch 'main' of https://github.com/jokob-sk/NetAlertX
Some checks failed
Code checks / check-url-paths (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled
2025-05-04 11:25:45 +10:00
jokob-sk
27443c441a docs,MQTT alert_down #1057 2025-05-04 11:24:54 +10:00
Hosted Weblate
7894b08051 Merge branch 'origin/main' into Weblate. 2025-05-03 22:53:07 +00:00
Bekir Kayra Çiğdem
31089e2aa6 Translated using Weblate (Turkish)
Currently translated at 42.7% (318 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/tr/
2025-05-03 22:53:05 +00:00
jokob-sk
46cbf85584 LOG_LEVEL fix, WEBMON timeout multiplier, docs, fix for watched-changed #1053 2025-05-04 08:52:13 +10:00
Jokob @NetAlertX
9d3a537b10 Merge pull request #1058 from jangrewe/main
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
properly indent HTML tables in report emails to fix broken links
2025-05-03 09:51:40 +10:00
Bekir Kayra Çiğdem
a3fcd4373f Translated using Weblate (Turkish)
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
Currently translated at 26.7% (199 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/tr/
2025-05-02 22:24:11 +02:00
Marco Rios
fb8876df0d Translated using Weblate (Spanish)
Currently translated at 100.0% (743 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/es/
2025-05-02 22:24:11 +02:00
Jan Grewe
8b617ffb8d properly indent HTML tables in report emails to fix broken links 2025-05-01 12:08:24 +02:00
Ondřej Karaffa
55fa24bced Translated using Weblate (Czech)
Some checks failed
Code checks / check-url-paths (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled
Currently translated at 1.0% (8 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/cs/
2025-04-27 06:45:17 +02:00
Ondřej Karaffa
b1cfaac33b Translated using Weblate (Czech)
Some checks failed
Code checks / check-url-paths (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled
Currently translated at 0.8% (6 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/cs/
2025-04-22 22:59:28 +02:00
Jackxwb
476dd67796 Translated using Weblate (Chinese (Simplified Han script))
Some checks are pending
Code checks / check-url-paths (push) Waiting to run
docker / docker_dev (push) Waiting to run
Deploy MkDocs / deploy (push) Waiting to run
Currently translated at 83.4% (620 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/zh_Hans/
2025-04-22 17:54:26 +02:00
anton garcias
f52ae328bc Translated using Weblate (Catalan)
Some checks failed
Code checks / check-url-paths (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Deploy MkDocs / deploy (push) Has been cancelled
Currently translated at 100.0% (743 of 743 strings)

Translation: NetAlertX/core
Translate-URL: https://hosted.weblate.org/projects/pialert/core/ca/
2025-04-15 14:49:19 +02:00
GitHub Actions
cbf626a5b6 Add release tweet for v25.4.14 - Styling, Workflows and other fixes
Some checks failed
Deploy MkDocs / deploy (push) Has been cancelled
docker / docker_dev (push) Has been cancelled
Code checks / check-url-paths (push) Has been cancelled
2025-04-13 22:58:05 +00:00
78 changed files with 1158 additions and 858 deletions

4
.github/tweet.md vendored
View File

@@ -1,2 +1,2 @@
🎉 New release: **v25.4.1 - 🔀 Workflows - automate device management ** is live! 🚀
Check it out here: https://github.com/jokob-sk/NetAlertX/releases/tag/v25.4.1
🎉 New release: ** v25.4.14 - Styling, Workflows and other fixes ** is live! 🚀
Check it out here: https://github.com/jokob-sk/NetAlertX/releases/tag/v25.4.14

View File

@@ -13,7 +13,7 @@ ENV PATH="/opt/venv/bin:$PATH"
COPY . ${INSTALL_DIR}/
RUN pip install openwrt-luci-rpc asusrouter asyncio aiohttp graphene flask tplink-omada-client wakeonlan pycryptodome requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython librouteros git+https://github.com/foreign-sub/aiofreepybox.git \
RUN pip install openwrt-luci-rpc asusrouter asyncio aiohttp graphene flask tplink-omada-client wakeonlan pycryptodome requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython librouteros yattag git+https://github.com/foreign-sub/aiofreepybox.git \
&& bash -c "find ${INSTALL_DIR} -type d -exec chmod 750 {} \;" \
&& bash -c "find ${INSTALL_DIR} -type f -exec chmod 640 {} \;" \
&& bash -c "find ${INSTALL_DIR} -type f \( -name '*.sh' -o -name '*.py' -o -name 'speedtest-cli' \) -exec chmod 750 {} \;"

View File

@@ -43,7 +43,7 @@ RUN phpenmod -v 8.2 sqlite3
RUN apt-get install -y python3-venv
RUN python3 -m venv myenv
RUN /bin/bash -c "source myenv/bin/activate && update-alternatives --install /usr/bin/python python /usr/bin/python3 10 && pip3 install openwrt-luci-rpc asusrouter asyncio aiohttp graphene flask tplink-omada-client wakeonlan pycryptodome requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython librouteros "
RUN /bin/bash -c "source myenv/bin/activate && update-alternatives --install /usr/bin/python python /usr/bin/python3 10 && pip3 install openwrt-luci-rpc asusrouter asyncio aiohttp graphene flask tplink-omada-client wakeonlan pycryptodome requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython librouteros yattag "
# Create a buildtimestamp.txt to later check if a new version was released
RUN date +%s > ${INSTALL_DIR}/front/buildtimestamp.txt

View File

@@ -43,7 +43,7 @@ build your own scanners with the [Plugin system](https://github.com/jokob-sk/Net
### Workflows
The [workflows module](https://github.com/jokob-sk/NetAlertX/blob/main/docs/WORKFLOWS.md) in NetAlertX allows to automate repetitive tasks, making network management more efficient. Whether you need to assign newly discovered devices to a specific Network Node, auto-group devices from a given vendor, unarchive a device if detected online, or automatically delete devices, this module provides the flexibility to tailor the automations to your needs.
The [workflows module](https://github.com/jokob-sk/NetAlertX/blob/main/docs/WORKFLOWS.md) allows to automate repetitive tasks, making network management more efficient. Whether you need to assign newly discovered devices to a specific Network Node, auto-group devices from a given vendor, unarchive a device if detected online, or automatically delete devices, this module provides the flexibility to tailor the automations to your needs.
## 📚 Documentation

View File

@@ -14,6 +14,8 @@ You can select devices in the _Devices_ view by selecting devices to edit and th
## CSV bulk edit
The database and device structure may change with new releases. When using the CSV import functionality, ensure the format matches what the application expects. To avoid issues, you can first export the devices and review the column formats before importing any custom data.
> [!NOTE]
> As always, backup everything, just in case.

View File

@@ -3,4 +3,13 @@
This set of settings allows you to group Devices under different views. The Archived toggle allows you to exclude a Device from most listings and notifications.
![Display settings](./img/DEVICE_MANAGEMENT/DeviceDetails_DisplaySettings.png)
![Display settings](./img/DEVICE_MANAGEMENT/DeviceDetails_DisplaySettings.png)
## Status Colors
![Sattus colors](./img/DEVICE_MANAGEMENT/device_management_display_settings.png)
1. Online (Green) = A device that is no longer marked as a "New Device"
2. New (Green) = A newly discovered device that is online and is still "ticked" as a "New Device"
3. New (Grey) = Same as No.2 but device is now offline.

79
docs/DOCKER_SWARM.md Executable file
View File

@@ -0,0 +1,79 @@
# Docker Swarm Deployment Guide (IPvlan)
This guide describes how to deploy **NetAlertX** in a **Docker Swarm** environment using an `ipvlan` network. This enables the container to receive a LAN IP address directly, which is ideal for network monitoring.
---
## ⚙️ Step 1: Create an IPvlan Config-Only Network on All Nodes
> Run this command on **each node** in the Swarm.
```bash
docker network create -d ipvlan \
--subnet=192.168.1.0/24 \ # 🔧 Replace with your LAN subnet
--gateway=192.168.1.1 \ # 🔧 Replace with your LAN gateway
-o ipvlan_mode=l2 \
-o parent=eno1 \ # 🔧 Replace with your network interface (e.g., eth0, eno1)
--config-only \
ipvlan-swarm-config
```
---
## 🖥️ Step 2: Create the Swarm-Scoped IPvlan Network (One-Time Setup)
> Run this on **one Swarm manager node only**.
```bash
docker network create -d ipvlan \
--scope swarm \
--config-from ipvlan-swarm-config \
swarm-ipvlan
```
---
## 🧾 Step 3: Deploy NetAlertX with Docker Compose
Use the following Compose snippet to deploy NetAlertX with a **static LAN IP** assigned via the `swarm-ipvlan` network.
```yaml
services:
netalertx:
image: ghcr.io/jokob-sk/netalertx:latest
ports:
- 20211:20211
volumes:
- /mnt/YOUR_SERVER/netalertx/config:/app/config:rw
- /mnt/YOUR_SERVER/netalertx/db:/netalertx/app/db:rw
- /mnt/YOUR_SERVER/netalertx/logs:/netalertx/app/log:rw
environment:
- TZ=Europe/London
- PORT=20211
networks:
swarm-ipvlan:
ipv4_address: 192.168.1.240 # ⚠️ Choose a free IP from your LAN
deploy:
mode: replicated
replicas: 1
restart_policy:
condition: on-failure
placement:
constraints:
- node.role == manager # 🔄 Or use: node.labels.netalertx == true
networks:
swarm-ipvlan:
external: true
```
---
## ✅ Notes
* The `ipvlan` setup allows **NetAlertX** to have a direct IP on your LAN.
* Replace `eno1` with your interface, IP addresses, and volume paths to match your environment.
* Make sure the assigned IP (`192.168.1.240` above) is not in use or managed by DHCP.
* You may also use a node label constraint instead of `node.role == manager` for more control.

View File

@@ -1,4 +1,4 @@
# Overview
# Home Assistant integration overview
NetAlertX comes with MQTT support, allowing you to show all detected devices as devices in Home Assistant. It also supplies a collection of stats, such as number of online devices.

View File

@@ -1,6 +1,6 @@
# Workflows Overview
The workflows module in NetAlertX allows to automate repetitive tasks, making network management more efficient. Whether you need to assign newly discovered devices to a specific Network Node, auto-group devices from a given vendor, unarchive a device if detected online, or automatically delete devices, this module provides the flexibility to tailor the automations to your needs.
The workflows module in allows to automate repetitive tasks, making network management more efficient. Whether you need to assign newly discovered devices to a specific Network Node, auto-group devices from a given vendor, unarchive a device if detected online, or automatically delete devices, this module provides the flexibility to tailor the automations to your needs.
![Workflows diagram](./img/WORKFLOWS/workflows_diagram.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@@ -2,6 +2,8 @@
Welcome to the official NetAlertX documentation! NetAlertX is a powerful tool designed to simplify the management and monitoring of your network. Below, you will find guides and resources to help you set up, configure, and troubleshoot your NetAlertX instance.
![Preview](./img/devices_split.png)
## In-App Help
NetAlertX provides contextual help within the application:
@@ -13,6 +15,8 @@ NetAlertX provides contextual help within the application:
## Installation Guides
The app can be installed different ways, with the best support of the docker-based deployments. This includes the Home Assistant and Unraid installation approaches. See details below.
### Docker (Fully Supported)
NetAlertX is fully supported in Docker environments, allowing for easy setup and configuration. Follow the official guide to get started:
@@ -21,12 +25,25 @@ NetAlertX is fully supported in Docker environments, allowing for easy setup and
This guide will take you through the process of setting up NetAlertX using Docker Compose or standalone Docker commands.
### Home Assistant (Fully Supported)
You can install NetAlertX also as a Home Assistant addon [![Home Assistant](https://img.shields.io/badge/Repo-blue?logo=home-assistant&style=for-the-badge&color=0aa8d2&logoColor=fff&label=Add)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons) via the [alexbelgium/hassio-addons](https://github.com/alexbelgium/hassio-addons/) repository. This is only possible if you run a supervised instance of Home Assistant. If not, you can still run NetAlertX in a separate Docker container and follow this guide to configure MQTT.
- [[Installation] Home Assistant](https://github.com/alexbelgium/hassio-addons/tree/master/netalertx)
### Unraid (Partial Support)
The Unraid template was created by the community, so it's only partially supported. Alternatively, here is [another version of the Unraid template](https://github.com/jokob-sk/NetAlertX-unraid).
- [[Installation] Unraid App](https://unraid.net/community/apps)
### Bare-Metal Installation (Experimental)
If you prefer to run NetAlertX on your own hardware, you can try the experimental bare-metal installation. Please note that this method is still under development, and we're looking for maintainers to help improve it.
If you prefer to run NetAlertX on your own hardware, you can try the experimental bare-metal installation. Please note that this method is still under development, and are looking for maintainers to help improve it.
- [Bare-Metal Installation Guide](./HW_INSTALL.md)
---
## Help and Support
@@ -66,14 +83,10 @@ To keep up with the latest changes and updates to NetAlertX, please refer to the
Make sure to follow the project on GitHub to get notifications for new releases and important updates.
---
## Additional info
## Additional Resources
- **Configuration Tips**: Learn how to optimize NetAlertX for your network setup.
- **Advanced Features**: Explore advanced functionalities like plugin development and custom configurations.
- **Documentation Index**: Check out the full [documentation index](https://github.com/jokob-sk/NetAlertX/tree/main/docs) for all the guides available.
We hope you find this documentation helpful. If you have any suggestions or improvements, please dont hesitate to contribute!
If you have any suggestions or improvements, please dont hesitate to contribute!
---
NetAlertX is actively maintained. You can find the source code, report bugs, or request new features on our [GitHub page](https://github.com/jokob-sk/NetAlertX).

View File

@@ -173,7 +173,7 @@
// Additional form elements like the random MAC address button for devMac
let inlineControl = "";
// handle rendom mac
// handle random mac
if (setting.setKey == "NEWDEV_devMac" && deviceData["devIsRandomMAC"] == true) {
inlineControl += `<span class="input-group-addon pointer"
title="${getString("RandomMAC_hover")}">

View File

@@ -65,7 +65,7 @@ function initializeSessionsDatatable () {
// Replace HTML codes
{targets: [0],
'createdCell': function (td, cellData, rowData, row, col) {
$(td).html (translateHTMLcodes (cellData));
$(td).html (translateHTMLcodes (localizeTimestamp(cellData)));
} }
],

View File

@@ -219,9 +219,8 @@ function initializeCalendar() {
},
eventRender: function (event, element) {
$(element).tooltip({container: 'body', placement: 'bottom',
title: event.tooltip});
// element.attr ('title', event.tooltip); // Alternative tooltip
// $(element).tooltip({container: 'body', placement: 'bottom', title: event.tooltip});
element.attr ('title', event.tooltip); // Alternative tooltip
},
loading: function( isLoading, view ) {

View File

@@ -47,9 +47,28 @@
{visible: false, targets: [0]},
// Replace HTML codes
{targets: [1,2,3,5],
{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);
} }
],

View File

@@ -216,7 +216,7 @@ function initializeDatatable () {
} },
// Replace HTML codes
{targets: [3,4,5,6,7],
{targets: [4,5,6,7],
"createdCell": function (td, cellData, rowData, row, col) {
$(td).html (translateHTMLcodes (cellData));
} },
@@ -226,6 +226,12 @@ function initializeDatatable () {
"createdCell": function (td, cellData, rowData, row, col) {
// console.log(cellData);
$(td).html (cellData);
} },
// Date
{targets: [3],
"createdCell": function (td, cellData, rowData, row, col) {
// console.log(cellData);
$(td).html (localizeTimestamp(cellData));
} }
],

View File

@@ -353,6 +353,28 @@ function getLangCode() {
// String utilities
// -----------------------------------------------------------------------------
function localizeTimestamp(result)
{
// contains TZ in format Europe/Berlin
tz = getSetting("TIMEZONE")
const date = new Date(result); // Assumes result is a timestamp or ISO string
const formatter = 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 // change to true if you want AM/PM format
});
return formatter.format(date);
}
// ----------------------------------------------------
/**
* Replaces double quotes within single-quoted strings, then converts all single quotes to double quotes,

5
front/lib/popper_tooltip/popper.min.js vendored Executable file

File diff suppressed because one or more lines are too long

View File

@@ -42,6 +42,7 @@
<script src="lib/datatables.net/js/jquery.dataTables.min.js"></script>
<script src="lib/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>
<script src="lib/datatables.net/js/dataTables.select.min.js"></script>
<script src="lib/popper_tooltip/popper.min.js"></script>
<script src="js/common.js?v=<?php include 'php/templates/version.php'; ?>"></script>
<script src="js/modal.js?v=<?php include 'php/templates/version.php'; ?>"></script>
@@ -120,34 +121,8 @@
let timeZone = "<?php echo $timeZone ?>";
let now = new Date();
// Convert to the specified time zone
let formatter = new Intl.DateTimeFormat("en-UK", {
timeZone: timeZone,
day: "2-digit",
month: "short",
year: "numeric",
hour: "2-digit",
minute: "2-digit",
second: "2-digit",
hour12: false, // Use 24-hour format
});
let parts = formatter.formatToParts(now);
// Extract date components
let day = parts.find(p => p.type === "day").value;
let month = parts.find(p => p.type === "month").value;
let year = parts.find(p => p.type === "year").value;
// Extract time components
let hour = parts.find(p => p.type === "hour").value;
let minute = parts.find(p => p.type === "minute").value;
let second = parts.find(p => p.type === "second").value;
// Construct the date and time in DD-MMM-YYYY HH:MM:SS format
let formattedDateTime = `${day}-${month}-${year} ${hour}:${minute}:${second}`;
if (document.getElementById) {
document.getElementById("NAX_Servertime_plc").innerHTML = '(' + formattedDateTime + ')';
document.getElementById("NAX_Servertime_plc").innerHTML = '(' + localizeTimestamp(now) + ')';
document.getElementById("NAX_TZ").innerHTML = timeZone;
}

View File

@@ -8,7 +8,7 @@
"About_Design": "Dissenyat per:",
"About_Exit": "Sortir",
"About_Title": "Escàner de seguretat de xarxa i marc de notificacions",
"AppEvents_AppEventProcessed": "",
"AppEvents_AppEventProcessed": "Processat",
"AppEvents_DateTimeCreated": "Logged",
"AppEvents_Extra": "Extra",
"AppEvents_GUID": "GUID d'esdeveniments d'Aplicació",
@@ -22,7 +22,7 @@
"AppEvents_ObjectPlugin": "Plugin enllaçat",
"AppEvents_ObjectPrimaryID": "ID primari",
"AppEvents_ObjectSecondaryID": "ID secundari",
"AppEvents_ObjectStatus": "Estat (temps del registre)",
"AppEvents_ObjectStatus": "Registre d'estat",
"AppEvents_ObjectStatusColumn": "Columna d'estat",
"AppEvents_ObjectType": "Tipus d'objecte",
"AppEvents_Plugin": "Plugin",
@@ -225,7 +225,7 @@
"Device_TableHead_Name": "Nom",
"Device_TableHead_NetworkSite": "Network Site",
"Device_TableHead_Owner": "Propietari",
"Device_TableHead_Parent_MAC": "MAC del node pare",
"Device_TableHead_Parent_MAC": "Node pare de xarxa",
"Device_TableHead_Port": "Port",
"Device_TableHead_PresentLastScan": "Presència",
"Device_TableHead_RowID": "ID de fila",
@@ -363,8 +363,8 @@
"Maintenance_Title": "Eines de manteniment",
"Maintenance_Tool_DownloadConfig": "Exportació de paràmetres",
"Maintenance_Tool_DownloadConfig_text": "Descarregueu una còpia de seguretat completa de la vostra configuració de configuració emmagatzemada al fitxer <code>app.conf</code>.",
"Maintenance_Tool_DownloadWorkflows": "",
"Maintenance_Tool_DownloadWorkflows_text": "",
"Maintenance_Tool_DownloadWorkflows": "Exportació de fluxos de treball",
"Maintenance_Tool_DownloadWorkflows_text": "Descarregueu una còpia de seguretat completa dels vostres fluxos de treball emmagatzemats en el fitxer <code>workflows.json</code>.",
"Maintenance_Tool_ExportCSV": "CSV Exportació de dispositius",
"Maintenance_Tool_ExportCSV_noti": "CSV Exportació",
"Maintenance_Tool_ExportCSV_noti_text": "Estàs segur que vols generar un fitxer CSV?",
@@ -463,7 +463,7 @@
"NETWORK_DEVICE_TYPES_description": "Quins tipus de dispositius es poden utilitzar com a dispositius de xarxa a la vista \"xarxa\". El tipus de dispositiu ha de coincidir exactament amb la configuració <code>Tipus</code> dels detalls de dispositiu. Afegir-ho al dispositiu fent servir el botó <code>+</code>. No elimini els tipus existents, només afegir-ne nous.",
"NETWORK_DEVICE_TYPES_name": "Tipus de dispositiu de xarxa",
"Navigation_About": "Sobre",
"Navigation_AppEvents": "",
"Navigation_AppEvents": "Esdeveniments de l'Aplicació",
"Navigation_Devices": "Dispositius",
"Navigation_Donations": "Donacions",
"Navigation_Events": "Esdeveniments",
@@ -670,32 +670,32 @@
"UI_REFRESH_name": "Auto-refresc UI",
"VERSION_description": "Versió o valor timestamp per comprovar si l'aplicació va ser actualitzada.",
"VERSION_name": "Versió o timestamp",
"WF_Action_Add": "",
"WF_Action_field": "",
"WF_Action_type": "",
"WF_Action_value": "",
"WF_Actions": "",
"WF_Add": "",
"WF_Add_Condition": "",
"WF_Add_Group": "",
"WF_Condition_field": "",
"WF_Condition_operator": "",
"WF_Condition_value": "",
"WF_Conditions": "",
"WF_Conditions_logic_rules": "",
"WF_Duplicate": "",
"WF_Enabled": "",
"WF_Export": "",
"WF_Export_Copy": "",
"WF_Import": "",
"WF_Import_Copy": "",
"WF_Name": "",
"WF_Remove": "",
"WF_Remove_Copy": "",
"WF_Save": "",
"WF_Trigger": "",
"WF_Trigger_event_type": "",
"WF_Trigger_type": "",
"WF_Action_Add": "Afegir Acció",
"WF_Action_field": "Camp",
"WF_Action_type": "Tipus",
"WF_Action_value": "Valor",
"WF_Actions": "Accions",
"WF_Add": "Afegeix fluix de treball",
"WF_Add_Condition": "Afegeix Condició",
"WF_Add_Group": "Afegir Grup",
"WF_Condition_field": "Camp",
"WF_Condition_operator": "Operador",
"WF_Condition_value": "Valor",
"WF_Conditions": "Condicions",
"WF_Conditions_logic_rules": "Regles de lògica",
"WF_Duplicate": "Flux de treball duplicat",
"WF_Enabled": "Flux de treball activat",
"WF_Export": "Exportar fluix de treball",
"WF_Export_Copy": "Copiar el flux de treball següent i importar-lo on sigui necessari.",
"WF_Import": "Importar fluix de treball",
"WF_Import_Copy": "Enganxeu el flux de treball que heu copiat prèviament.",
"WF_Name": "Nom del flux de treball",
"WF_Remove": "Eliminar fluix de treball",
"WF_Remove_Copy": "Vols eliminar aquest flux de treball?",
"WF_Save": "Desa els fluxos de treball",
"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",
@@ -742,4 +742,4 @@
"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ó."
}
}

View File

@@ -2,26 +2,26 @@
"API_CUSTOM_SQL_description": "",
"API_CUSTOM_SQL_name": "",
"API_TOKEN_description": "",
"API_TOKEN_name": "",
"API_display_name": "",
"API_icon": "",
"API_TOKEN_name": "API token",
"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_DateTimeCreated": "",
"AppEvents_Extra": "",
"AppEvents_AppEventProcessed": "Zpracováno",
"AppEvents_DateTimeCreated": "Zalogováno",
"AppEvents_Extra": "Extra",
"AppEvents_GUID": "",
"AppEvents_Helper1": "",
"AppEvents_Helper2": "",
"AppEvents_Helper3": "",
"AppEvents_ObjectForeignKey": "",
"AppEvents_ObjectIndex": "",
"AppEvents_ObjectForeignKey": "Cizí klíč",
"AppEvents_ObjectIndex": "Index",
"AppEvents_ObjectIsArchived": "",
"AppEvents_ObjectIsNew": "",
"AppEvents_ObjectPlugin": "",
"AppEvents_ObjectPrimaryID": "",
"AppEvents_ObjectSecondaryID": "",
"AppEvents_ObjectPrimaryID": "Primární ID",
"AppEvents_ObjectSecondaryID": "Sekundární ID",
"AppEvents_ObjectStatus": "",
"AppEvents_ObjectStatusColumn": "",
"AppEvents_ObjectType": "",
@@ -29,7 +29,7 @@
"AppEvents_Type": "",
"BackDevDetail_Actions_Ask_Run": "",
"BackDevDetail_Actions_Not_Registered": "",
"BackDevDetail_Actions_Title_Run": "",
"BackDevDetail_Actions_Title_Run": "Spustit akci",
"BackDevDetail_Copy_Ask": "",
"BackDevDetail_Copy_Title": "",
"BackDevDetail_Tools_WOL_error": "",
@@ -742,4 +742,4 @@
"settings_update_item_warning": "",
"test_event_icon": "",
"test_event_tooltip": ""
}
}

18
front/php/templates/language/de_de.json Executable file → Normal file
View File

@@ -1,7 +1,7 @@
{
"API_CUSTOM_SQL_description": "Benutzerdefinierte SQL-Abfrage, welche eine JSON-Datei generiert und diese mit dem <a href=\"/php/server/query_json.php?file=table_custom_endpoint.json\" target=\"_blank\">Dateiendpunkt <code>table_custom_endpoint.json</code></a> zur Verfügung stellt.",
"API_CUSTOM_SQL_name": "Benutzerdefinierte SQL-Abfrage",
"API_TOKEN_description": "API-Token zur Absicherung der Kommunikation Sie können einen generieren oder einen beliebigen Wert eingeben. Er wird im Anfrage-Header übermittelt. Wird im <code>SYNC</code>-Plugin und GraphQL-Server verwendet.",
"API_TOKEN_description": "API-Token zur Absicherung der Kommunikation Sie können einen neuen generieren oder einen beliebigen Wert eingeben. Er wird im Anfrage-Header übermittelt und zum Beispiel im <code>SYNC</code>-Plugin, im GraphQL-Server und in anderen API Endpunkten verwendet (siehe auch <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/API.md\" target=\"_blank\">API Dokumentation)</a>..",
"API_TOKEN_name": "API-Schlüssel",
"API_display_name": "API",
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
@@ -61,7 +61,7 @@
"BackDevices_DBTools_ImportCSVError": "Die CSV-Datei konnte nicht importiert werden. Stellen Sie sicher, dass das Format korrekt ist.",
"BackDevices_DBTools_ImportCSVMissing": "Die CSV-Datei konnte nicht in <b>/config/devices.csv</b> gefunden werden.",
"BackDevices_DBTools_Purge": "Die ältesten Backups wurden gelöscht",
"BackDevices_DBTools_UpdDev": "Gerät wurde erfolgreich aktualisiert",
"BackDevices_DBTools_UpdDev": "Gerät wurde erfolgreich aktualisiert. Es kann etwas dauern bis die Übersicht neu geladen ist, wenn ein Scan aktiv ist.",
"BackDevices_DBTools_UpdDevError": "Fehler beim Aktualisieren des Gerätes",
"BackDevices_DBTools_Upgrade": "Datenbank wurde erfolgreich aktualisiert",
"BackDevices_DBTools_UpgradeError": "Fehler beim Aktualisieren der Datenbank",
@@ -76,7 +76,7 @@
"CustProps_cant_remove": "Kann nicht entfernt werden, es wird mindestens eine Eigenschaft benötigt.",
"DAYS_TO_KEEP_EVENTS_description": "Dies ist eine Wartungseinstellung. Spezifiziert wie viele Tage Events gespeichert bleiben. Alle älteren Events werden periodisch gelöscht. Wird auch auf die Plugins History angewendet.",
"DAYS_TO_KEEP_EVENTS_name": "Ereignisse löschen, die älter sind als",
"DISCOVER_PLUGINS_description": "Deaktiviere diese Option um die Initialisierung und Speicherdauer der Einstellungen zu verringern. Wenn es deaktiviert ist, können keine Plugins gefunden oder neue Plugins zu den vorhandenen hinzugefügt werden.",
"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_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",
@@ -295,7 +295,7 @@
"Events_Tablelenght": "Zeige _MENU_ Einträge",
"Events_Tablelenght_all": "Alle",
"Events_Title": "Ereignisse",
"GRAPHQL_PORT_description": "Die Portnummer des GraphQL-Servers.",
"GRAPHQL_PORT_description": "Die Portnummer des GraphQL-Servers. Stellen Sie sicher, dass dieser Port von keiner anderen Anwendung oder NetAlertX Instanz verwendet wird.",
"GRAPHQL_PORT_name": "GraphQL-Port",
"Gen_Action": "Action",
"Gen_Add": "Hinzufügen",
@@ -341,7 +341,7 @@
"Gen_Warning": "Warnung",
"Gen_Work_In_Progress": "Keine Finalversion, feedback bitte unter: https://github.com/jokob-sk/NetAlertX/issues",
"Gen_create_new_device": "Neues Gerät",
"Gen_create_new_device_info": "",
"Gen_create_new_device_info": "Geräte werden normalerweise über <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">Plugins</a> gefunden. In Ausnahmefällen kann es nötig sein, sie manuell hinzuzufügen. Konkrete Szenarien sind in der <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/REMOTE_NETWORKS.md\">Dokumentation über entfernte Netzwerke</a> zu finden.",
"General_display_name": "Allgemein",
"General_icon": "<i class=\"fa fa-gears\"></i>",
"HRS_TO_KEEP_NEWDEV_description": "Dies ist eine Wartungseinstellung <b>DELETING devices</b>. Wenn aktiviert (<code>0</code> bedeutet deaktiviert), werden als <b>\"Neues Gerät\"</b> markierte Geräte gelöscht, wenn ihre <b>erste Sitzung</b> länger her ist als in dieser Einstellung angegeben. Verwenden Sie diese Einstellung, wenn Sie <b>Neue Geräte</b> nach <code>X</code> Stunden automatisch löschen wollen.",
@@ -383,11 +383,11 @@
"MQTT_icon": "<i class=\"fa fa-square-rss\"></i>",
"Maint_PurgeLog": "Protokoll bereinigen",
"Maint_RestartServer": "Server neu starten",
"Maint_Restart_Server_noti_text": "",
"Maint_Restart_Server_noti_text": "Soll der Backend-Server wirklich neu gestartet werden? Das könnte Instabilitäten verursachen. Vorher ein Backup erstellen. <br/><br/>Hinweis: Das kann einige Minuten dauern.",
"Maintenance_Running_Version": "Installierte Version",
"Maintenance_Status": "Status",
"Maintenance_Title": "Wartungswerkzeuge",
"Maintenance_Tool_DownloadConfig": "",
"Maintenance_Tool_DownloadConfig": "Einstellungen exportieren",
"Maintenance_Tool_DownloadConfig_text": "",
"Maintenance_Tool_DownloadWorkflows": "",
"Maintenance_Tool_DownloadWorkflows_text": "",
@@ -479,7 +479,7 @@
"Maintenance_lang_selector_apply": "Übernehmen",
"Maintenance_lang_selector_empty": "Sprache wählen",
"Maintenance_lang_selector_lable": "Sprachauswahl",
"Maintenance_lang_selector_text": "Die Änderung findet serverseitig statt, betrifft also alle verwendeten Geräte.",
"Maintenance_lang_selector_text": "Die Änderung findet clientseitig statt, betrifft also nur den aktuellen Browser.",
"Maintenance_new_version": "Eine neue Version ist vefügbar. Sieh dir die <a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">Versionshinweise</a> an.",
"Maintenance_themeselector_apply": "Übernehmen",
"Maintenance_themeselector_empty": "Skin wählen",
@@ -823,4 +823,4 @@
"settings_update_item_warning": "",
"test_event_icon": "",
"test_event_tooltip": "Speichere die Änderungen, bevor Sie die Einstellungen testen."
}
}

View File

@@ -334,7 +334,7 @@
"General_icon": "<i class=\"fa fa-gears\"></i>",
"HRS_TO_KEEP_NEWDEV_description": "This is a maintenance setting <b>DELETING devices</b>. If enabled (<code>0</code> is disabled), devices marked as <b>New Device</b> will be deleted if their <b>First Session</b> time was older than the specified hours in this setting. Use this setting if you want to auto-delete <b>New Devices</b> after <code>X</code> hours.",
"HRS_TO_KEEP_NEWDEV_name": "Delete new devices after",
"HRS_TO_KEEP_OFFDEV_description": "This is a maintenance setting <b>DELETING devices</b>. If enabled (<code>0</code> is disabled), devices that are <b>Offline</b> and their <b>Last Offline</b> date time is older than the specified hours in this setting, will be deleted. Use this setting if you want to auto-delete <b>Offline Devices</b> after <code>X</code> hours being offline.",
"HRS_TO_KEEP_OFFDEV_description": "This is a maintenance setting <b>DELETING devices</b>. If enabled (<code>0</code> is disabled), devices that are <b>Offline</b> and their <b>Last Connection</b> date time is older than the specified hours in this setting, will be deleted. Use this setting if you want to auto-delete <b>Offline Devices</b> after <code>X</code> hours being offline.",
"HRS_TO_KEEP_OFFDEV_name": "Delete offline devices after",
"LOADED_PLUGINS_description": "Which Plugins to load. Adding plugins might slow the application. Read more about which plugins need to be enabled, types, or scanning options in the <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">plugins docs</a>. Unloaded plugins will lose your settings. Only <code>disabled</code> plugins can be unloaded.",
"LOADED_PLUGINS_name": "Loaded plugins",

View File

@@ -1,7 +1,7 @@
{
"API_CUSTOM_SQL_description": "Puede especificar una consulta SQL personalizada que generará un archivo JSON y luego lo expondrá a través del <a href=\"/php/server/query_json.php?file=table_custom_endpoint.json\" target=\"_blank\">archivo <code>table_custom_endpoint.json</code ></a>.",
"API_CUSTOM_SQL_name": "Endpoint personalizado",
"API_TOKEN_description": "Token de API para asegurar la comunicación, puede generar uno o introducir cualquier valor. Se envía en el encabezado de solicitud. Se utiliza en el plugin <code>SYNC</code> del servidor GraphQL.",
"API_TOKEN_description": "Token de API para comunicación segura. Genere uno o introduzca cualquier valor. Se envía en el encabezado de la solicitud y se usa en el complemento <code>SYNC</code>, el servidor GraphQL y otros puntos de conexión de la API. Puede usar los puntos de conexión de la API para crear integraciones personalizadas, como se describe en la <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/API.md\" target=\"_blank\">documentación de la API</a>.",
"API_TOKEN_name": "Token de la API",
"API_display_name": "API",
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
@@ -16,7 +16,7 @@
"About_Design": "Diseñado para:",
"About_Exit": "Salir",
"About_Title": "Escáner de seguridad de la red y marco de notificaciones",
"AppEvents_AppEventProcessed": "",
"AppEvents_AppEventProcessed": "Procesado",
"AppEvents_DateTimeCreated": "Registrado",
"AppEvents_Extra": "Extra",
"AppEvents_GUID": "GUID del evento de aplicación",
@@ -30,7 +30,7 @@
"AppEvents_ObjectPlugin": "Complemento vinculado",
"AppEvents_ObjectPrimaryID": "ID principal",
"AppEvents_ObjectSecondaryID": "ID secundario",
"AppEvents_ObjectStatus": "Estado (en el momento del registro)",
"AppEvents_ObjectStatus": "Estado registrado",
"AppEvents_ObjectStatusColumn": "Columna de estado",
"AppEvents_ObjectType": "Tipo de objeto",
"AppEvents_Plugin": "Plugin",
@@ -59,7 +59,7 @@
"BackDevices_DBTools_ImportCSVError": "El archivo CSV no pudo ser importado. Asegúrate de que el formato es correcto.",
"BackDevices_DBTools_ImportCSVMissing": "El archivo CSV no se pudo encontrar en <b>/config/devices.csv.</b>",
"BackDevices_DBTools_Purge": "Las copias de seguridad más antiguas fueron eliminadas",
"BackDevices_DBTools_UpdDev": "Dispositivo actualizado con éxito",
"BackDevices_DBTools_UpdDev": "Dispositivo actualizado con éxito. Es posible que la lista de dispositivos principales necesite algún tiempo para recargarse si hay un escaneo en progreso.",
"BackDevices_DBTools_UpdDevError": "Error al actualizar el dispositivo",
"BackDevices_DBTools_Upgrade": "Base de datos actualizada correctamente",
"BackDevices_DBTools_UpgradeError": "Falló la actualización de la base de datos",
@@ -71,15 +71,15 @@
"BackDevices_darkmode_enabled": "Darkmode Activado",
"CLEAR_NEW_FLAG_description": "Si está habilitado (<code>0</code> está desactivado), los dispositivos marcados como <b>Nuevo dispositivo</b> se desmarcarán si el límite de tiempo (especificado en horas) excede su tiempo de <b>primera sesión</b>.",
"CLEAR_NEW_FLAG_name": "Eliminar la nueva bandera",
"CustProps_cant_remove": "",
"CustProps_cant_remove": "No se puede eliminar, al menos una propiedad es requerida.",
"DAYS_TO_KEEP_EVENTS_description": "Esta es una configuración de mantenimiento. Esto especifica el número de días de entradas de eventos que se guardarán. Todos los eventos anteriores se eliminarán periódicamente.",
"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_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": "",
"DevDetail_CustomProps_reset_info": "",
"DevDetail_CustomProperties_Title": "Propiedades personalizadas",
"DevDetail_CustomProps_reset_info": "Esto eliminará sus propiedades personalizadas en este dispositivo y las reiniciará a sus valores por defecto.",
"DevDetail_DisplayFields_Title": "Mostrar",
"DevDetail_EveandAl_AlertAllEvents": "Notificaciones de eventos",
"DevDetail_EveandAl_AlertDown": "Alerta de caída",
@@ -196,7 +196,7 @@
"DevDetail_button_Delete": "Eliminar dispositivo",
"DevDetail_button_DeleteEvents": "Eliminar eventos",
"DevDetail_button_DeleteEvents_Warning": "¿Desea eliminar todos los eventos de este dispositivo?<br><br>(se eliminarán el <b>Historial de eventos</b> y las <b>Sesiones</b>, y puede ayudar en el caso de notificaciones constantes)",
"DevDetail_button_Delete_ask": "",
"DevDetail_button_Delete_ask": "¿Está seguro que desea eliminar este dispositivo? También puede archivarla.",
"DevDetail_button_OverwriteIcons": "Sobreescribir iconos",
"DevDetail_button_OverwriteIcons_Tooltip": "Sobreescribir los iconos de todos los dispositivos con el mismo tipo",
"DevDetail_button_OverwriteIcons_Warning": "¿Sobreescribir todos los iconos de todos los dispositivos con el mismo tipo que el dispositivo actual?",
@@ -220,7 +220,7 @@
"Device_Shortcut_OnlineChart": "Presencia del dispositivo a lo largo del tiempo",
"Device_TableHead_AlertDown": "Alerta desactivada",
"Device_TableHead_Connected_Devices": "Conexiones",
"Device_TableHead_CustomProps": "",
"Device_TableHead_CustomProps": "Propiedades / Acciones",
"Device_TableHead_Favorite": "Favorito",
"Device_TableHead_FirstSession": "1ra. sesión",
"Device_TableHead_GUID": "GUID",
@@ -235,7 +235,7 @@
"Device_TableHead_Name": "Nombre",
"Device_TableHead_NetworkSite": "Lugar de la red",
"Device_TableHead_Owner": "Propietario",
"Device_TableHead_Parent_MAC": "Nodo principal de la MAC",
"Device_TableHead_Parent_MAC": "Nodo principal de la red",
"Device_TableHead_Port": "Puerto",
"Device_TableHead_PresentLastScan": "Historial",
"Device_TableHead_RowID": "ID de fila",
@@ -253,11 +253,11 @@
"Device_Tablelenght": "Mostrar _MENU_ entradas",
"Device_Tablelenght_all": "Todos",
"Device_Title": "Dispositivos",
"Devices_Filters": "",
"Devices_Filters": "Filtros",
"ENABLE_PLUGINS_description": "Habilita la funcionalidad de los <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">complementos</a>. Cargar los complementos requiere más recursos de hardware, así que quizás quieras desactivarlo en hardware poco potente.",
"ENABLE_PLUGINS_name": "Habilitar complementos",
"ENCRYPTION_KEY_description": "",
"ENCRYPTION_KEY_name": "",
"ENCRYPTION_KEY_description": "Llave de cifrado de datos.",
"ENCRYPTION_KEY_name": "Llave de cifrado",
"Email_display_name": "Email",
"Email_icon": "<i class=\"fa fa-at\"></i>",
"Events_Loading": "Cargando...",
@@ -281,7 +281,7 @@
"Events_TableHead_Disconnection": "Desconexión",
"Events_TableHead_Duration": "Duración",
"Events_TableHead_DurationOrder": "Orden de duración",
"Events_TableHead_EventType": "Tipo de evento",
"Events_TableHead_EventType": "Tipo de Evento",
"Events_TableHead_IP": "Dirección IP",
"Events_TableHead_IPOrder": "Orden de IP",
"Events_TableHead_Order": "Ordenar",
@@ -293,7 +293,7 @@
"Events_Tablelenght": "Mostrando entradas del MENÚ",
"Events_Tablelenght_all": "Todos",
"Events_Title": "Eventos",
"GRAPHQL_PORT_description": "El número de puerto del servidor GraphQL.",
"GRAPHQL_PORT_description": "El número de puerto del servidor GraphQL. Asegúrese de que el puerto sea único en todas sus aplicaciones en este host y en las instancias de NetAlertX.",
"GRAPHQL_PORT_name": "Puerto GraphQL",
"Gen_Action": "Acción",
"Gen_Add": "Añadir",
@@ -320,7 +320,7 @@
"Gen_ReadDocs": "Lee más en los documentos.",
"Gen_Remove_All": "Quitar todo",
"Gen_Remove_Last": "Quitar el último",
"Gen_Reset": "",
"Gen_Reset": "Reiniciar",
"Gen_Restore": "Ejecutar restauración",
"Gen_Run": "Ejecutar",
"Gen_Save": "Guardar",
@@ -335,7 +335,7 @@
"Gen_Upd_Fail": "Fallo al actualizar",
"Gen_Update": "Actualizar",
"Gen_Update_Value": "Actualizar valor",
"Gen_ValidIcon": "",
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
"Gen_Warning": "Advertencia",
"Gen_Work_In_Progress": "Trabajo en curso, un buen momento para hacer comentarios en https://github.com/jokob-sk/NetAlertX/issues",
"Gen_create_new_device": "Nuevo dispositivo",
@@ -385,25 +385,25 @@
"Maintenance_Running_Version": "Versión instalada",
"Maintenance_Status": "Situación",
"Maintenance_Title": "Herramientas de mantenimiento",
"Maintenance_Tool_DownloadConfig": "",
"Maintenance_Tool_DownloadConfig_text": "",
"Maintenance_Tool_DownloadWorkflows": "",
"Maintenance_Tool_DownloadWorkflows_text": "",
"Maintenance_Tool_ExportCSV": "Exportación CSV",
"Maintenance_Tool_ExportCSV_noti": "Exportación CSV",
"Maintenance_Tool_DownloadConfig": "Exportación de configuraciones",
"Maintenance_Tool_DownloadConfig_text": "Descargue una copia de seguridad completa de su configuración de ajustes almacenada en el archivo <code>app.conf</code>.",
"Maintenance_Tool_DownloadWorkflows": "Exportación de flujos de trabajo",
"Maintenance_Tool_DownloadWorkflows_text": "Descargue una copia de seguridad completa de sus flujos de trabajo almacenados en el archivo <code>workflows.json</code>.",
"Maintenance_Tool_ExportCSV": "Exportación de dispositivos (CSV)",
"Maintenance_Tool_ExportCSV_noti": "Exportación de dispositivos (CSV)",
"Maintenance_Tool_ExportCSV_noti_text": "¿Está seguro de que quiere generar un archivo CSV?",
"Maintenance_Tool_ExportCSV_text": "Genere un archivo CSV (valor separado por comas) que contenga la lista de Dispositivos incluyendo las relaciones de red entre los Nodos de red y los dispositivos conectados. También puedes activarlo accediendo a esta URL <code>your NetAlertX url/php/server/devices.php?action=ExportCSV</code> o activando el plugin <a href=\"settings.php#CSVBCKP_header\">Copia de seguridad CSV</a>.",
"Maintenance_Tool_ImportCSV": "Importación CSV",
"Maintenance_Tool_ImportCSV_noti": "Importación CSV",
"Maintenance_Tool_ExportCSV_text": "Genere un archivo CSV (valor separado por comas) que contenga la lista de Dispositivos incluyendo las relaciones de red entre los Nodos de red y los dispositivos conectados. También puedes activarlo accediendo a esta URL <code>your_NetAlertX_url/php/server/devices.php?action=ExportCSV</code> o activando el plugin <a href=\"settings.php#CSVBCKP_header\">Copia de seguridad CSV</a>.",
"Maintenance_Tool_ImportCSV": "Importación de dispositivos (CSV)",
"Maintenance_Tool_ImportCSV_noti": "Importación de dispositivos (CSV)",
"Maintenance_Tool_ImportCSV_noti_text": "¿Estás seguro de que quieres importar el archivo CSV? Esto <b>sobrescribirá</b> completamente los dispositivos en su base de datos.",
"Maintenance_Tool_ImportCSV_text": "Antes de usar esta función, haga una copia de seguridad. Importe un archivo CSV (valor separado por comas) que contiene la lista de dispositivos, incluidas las relaciones de red entre nodos de red y dispositivos conectados. Para hacer eso, coloque el archivo CSV llamado <b> devices.csv </b> en su carpeta <b>/config </b>.",
"Maintenance_Tool_ImportConfig_noti": "",
"Maintenance_Tool_ImportPastedCSV": "Importar CSV (Pegar)",
"Maintenance_Tool_ImportConfig_noti": "Importar ajustes (app.conf)",
"Maintenance_Tool_ImportPastedCSV": "Importar dispositivos (CSV) (Pegar)",
"Maintenance_Tool_ImportPastedCSV_noti_text": "¿Seguro que desea importar el CSV pegado? Esto <b>sobrescribirá</b> completamente los dispositivos en su base de datos.",
"Maintenance_Tool_ImportPastedCSV_text": "Antes de usar esta función, por favor haga una copia de seguridad. Importar un archivo CSV (valor separado por comas) que contiene la lista de Dispositivos incluyendo las relaciones de red entre los Nodos de red y los dispositivos conectados.",
"Maintenance_Tool_ImportPastedConfig": "",
"Maintenance_Tool_ImportPastedConfig_noti_text": "",
"Maintenance_Tool_ImportPastedConfig_text": "",
"Maintenance_Tool_ImportPastedConfig": "Importar ajustes (pegar)",
"Maintenance_Tool_ImportPastedConfig_noti_text": "¿Seguro que quieres importar la configuración pegada? Esto <b>sobrescribirá</b> por completo el archivo <code>app.conf</code>.",
"Maintenance_Tool_ImportPastedConfig_text": "Importa el archivo <code>app.conf</code> que contiene toda la configuración de la aplicación. Es recomendable descargar primero el archivo <code>app.conf</code> actual con la <b>Exportación de configuración</b>.",
"Maintenance_Tool_arpscansw": "Activar arp-scan (on/off)",
"Maintenance_Tool_arpscansw_noti": "Activar arp-scan on or off",
"Maintenance_Tool_arpscansw_noti_text": "Cuando el escaneo se ha apagado, permanece apagado hasta que se active nuevamente.",
@@ -484,7 +484,7 @@
"Maintenance_themeselector_lable": "Seleccionar tema",
"Maintenance_themeselector_text": "El cambio se produce en el lado del servidor, por lo que afecta a todos los dispositivos en uso.",
"Maintenance_version": "Actualizaciones de la aplicación",
"NETWORK_DEVICE_TYPES_description": "Qué tipos de dispositivos pueden usarse como dispositivos de red en la vista Red. El tipo de dispositivo debe coincidir exactamente con la configuración <code> Tipo </code> en un dispositivo específico en los Detalles del dispositivo. No elimine los tipos existentes, solo agregue nuevos.",
"NETWORK_DEVICE_TYPES_description": "Qué tipos de dispositivos se pueden usar como dispositivos de red en la vista de red. El tipo de dispositivo debe coincidir exactamente con la configuración de <code>Tipo</code> de un dispositivo específico en los detalles del dispositivo. Añádalo al dispositivo mediante el botón <code>+</code>. No elimine los tipos existentes, solo añada los nuevos.",
"NETWORK_DEVICE_TYPES_name": "Tipos de dispositivos de red",
"NTFY_HOST_description": "URL de host NTFY que comienza con <code>http://</code> o <code>https://</code>. Puede usar la instancia alojada en <a target=\"_blank\" href=\"https://ntfy.sh/\">https://ntfy.sh</a> simplemente ingresando <code>https://ntfy. sh</código>.",
"NTFY_HOST_name": "URL del host NTFY",
@@ -497,7 +497,7 @@
"NTFY_display_name": "NTFY",
"NTFY_icon": "<i class=\"fa fa-terminal\"></i>",
"Navigation_About": "Acerca de",
"Navigation_AppEvents": "",
"Navigation_AppEvents": "Eventos de la aplicación",
"Navigation_Devices": "Dispositivos",
"Navigation_Donations": "Donaciones",
"Navigation_Events": "Eventos",
@@ -746,32 +746,32 @@
"WEBHOOK_SIZE_name": "Tamaño máximo de carga útil",
"WEBHOOK_URL_description": "URL de destino comienza con <code>http://</code> o <code>https://</code>.",
"WEBHOOK_URL_name": "URL de destino",
"WF_Action_Add": "",
"WF_Action_field": "",
"WF_Action_type": "",
"WF_Action_value": "",
"WF_Actions": "",
"WF_Add": "",
"WF_Add_Condition": "",
"WF_Add_Group": "",
"WF_Condition_field": "",
"WF_Condition_operator": "",
"WF_Condition_value": "",
"WF_Conditions": "",
"WF_Conditions_logic_rules": "",
"WF_Duplicate": "",
"WF_Enabled": "",
"WF_Export": "",
"WF_Export_Copy": "",
"WF_Import": "",
"WF_Import_Copy": "",
"WF_Name": "",
"WF_Remove": "",
"WF_Remove_Copy": "",
"WF_Save": "",
"WF_Trigger": "",
"WF_Trigger_event_type": "",
"WF_Trigger_type": "",
"WF_Action_Add": "Agregar acción",
"WF_Action_field": "Campo",
"WF_Action_type": "Tipo",
"WF_Action_value": "Valor",
"WF_Actions": "Acciones",
"WF_Add": "Agregar flujo de trabajo",
"WF_Add_Condition": "Agregar condición",
"WF_Add_Group": "Agregar grupo",
"WF_Condition_field": "Campo",
"WF_Condition_operator": "Operador",
"WF_Condition_value": "Valor",
"WF_Conditions": "Condiciones",
"WF_Conditions_logic_rules": "Reglas lógicas",
"WF_Duplicate": "Duplicar flujo de trabajo",
"WF_Enabled": "Flujo de trabajo habilitado",
"WF_Export": "Exportar flujo de trabajo",
"WF_Export_Copy": "Copiar el flujo de trabajo de abajo e importarlo donde necesite.",
"WF_Import": "Importar flujo de trabajo",
"WF_Import_Copy": "Pegar en el flujo de trabajo que copió previamente.",
"WF_Name": "Nombre del flujo de trabajo",
"WF_Remove": "Eliminar flujo de trabajo",
"WF_Remove_Copy": "¿Desea eliminar este flujo de trabajo?",
"WF_Save": "Guardar flujos de trabajo",
"WF_Trigger": "Disparador",
"WF_Trigger_event_type": "Tipo de evento",
"WF_Trigger_type": "TIpo de disparador",
"Webhooks_display_name": "Webhooks",
"Webhooks_icon": "<i class=\"fa fa-circle-nodes\"></i>",
"Webhooks_settings_group": "<i class=\"fa fa-circle-nodes\"></i> Webhooks",
@@ -786,7 +786,7 @@
"general_event_title": "Ejecutar un evento ad-hoc",
"go_to_node_event_icon": "fa-square-up-right",
"go_to_node_event_tooltip": "Vaya a la página de Red del nodo indicado",
"new_version_available": "",
"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:",
@@ -815,10 +815,10 @@
"settings_publishers_info": "Cargue más editor@s con el ajuste <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a>",
"settings_publishers_label": "Editores",
"settings_readonly": "No se puede LEER ni ESCRIBIR <code>app.conf</code>. Intente reiniciar el contenedor y lea la <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/FILE_PERMISSIONS.md\" target=\"_blank\">documentación de permisos de archivo</a>",
"settings_saved": "<br/>Ajustes guardados. <br/><br/> Recargando... <br/><i class=\"ion ion-ios-loop-strong fa-spin fa-2x fa-fw\"></i> <br/>",
"settings_saved": "<br/>Ajustes guardados. <br/> Recargando... <br/><i class=\"ion ion-ios-loop-strong fa-spin fa-2x fa-fw\"></i> <br/>",
"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."
}
}

View File

@@ -334,7 +334,7 @@
"General_icon": "<i class=\"fa fa-gears\"></i>",
"HRS_TO_KEEP_NEWDEV_description": "Paramètre de maintenance. S'il est activé (<code>0</code> s'il est désactivé), les appareils marqués comme <b>Nouvel appareil</b> seront supprimés si leur durée depuis la <b>première session</b> est plus ancienne que le nombre d'heures paramétré. Utilisez ce paramétrage si vous voulez supprimer automatiquement les <b>Nouveaux appareils</b> après <code>X</code> heures.",
"HRS_TO_KEEP_NEWDEV_name": "Supprimer les nouveaux appareils après",
"HRS_TO_KEEP_OFFDEV_description": "Il s'agit d'un paramètre de maintenance <b>SUPPRIMER des appareils</b>. Si cette option est activée (<code>0</code> est désactivé), les appareils qui sont <b>Hors ligne</b> et dont la <b>dernière heure hors ligne</b> est plus ancienne que les heures spécifiées dans ce paramètre. Utilisez ce paramètre si vous souhaitez supprimer automatiquement <b>Appareils hors ligne</b> après <code>X</code> heures de déconnexion.",
"HRS_TO_KEEP_OFFDEV_description": "Il s'agit d'un paramètre de maintenance <b>SUPPRIMER des appareils</b>. Si cette option est activée (<code>0</code> est désactivé), les appareils qui sont <b>Hors ligne</b> et dont la <b>dernière connexion</b> est plus ancienne que les heures spécifiées dans ce paramètre. Utilisez ce paramètre si vous souhaitez supprimer automatiquement <b>Appareils hors ligne</b> après <code>X</code> heures de déconnexion.",
"HRS_TO_KEEP_OFFDEV_name": "Supprimez les appareils hors ligne après",
"LOADED_PLUGINS_description": "Affiche les plugins chargés. Ajouter des plugins peut ralentir l'application. Obtenez plus d'informations dur quels plugins dont à activer, ou les options de scan dans la <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">documentation des plugins</a>. Décharger des plugins leur fait perdre leurs paramètres. Seuls les plugins <code>désactivés</code> peuvent être déchargés.",
"LOADED_PLUGINS_name": "Plugins chargés",

2
front/php/templates/language/it_it.json Normal file → Executable file
View File

@@ -334,7 +334,7 @@
"General_icon": "<i class=\"fa fa-gears\"></i>",
"HRS_TO_KEEP_NEWDEV_description": "Questa è un'impostazione di manutenzione <b>ELIMINAZIONE dispositivi</b>. Se abilitata (<code>0</code> è disabilitata), tutti i dispositivi marcati con <b>Nuovo dispositivo</b> verranno eliminati se l'orario della <b>Prima sessione</b> è precedente all'orario di questa impostazione. Usa questa impostazione se vuoi eliminare automaticamente i <b>Nuovi dispositivi</b> dopo <code>X</code> ore.",
"HRS_TO_KEEP_NEWDEV_name": "Elimina nuovi dispositivi dopo",
"HRS_TO_KEEP_OFFDEV_description": "Questa è un'impostazione di manutenzione <b>ELIMINAZIONE dispositivi</b>. Se abilitata (<code>0</code> è disabilitata), i dispositivi che sono <b>Offline</b> e la loro data e ora <b>Ultima offline</b> sono più vecchi delle ore specificate in questa impostazione saranno eliminati. Usa questa impostazione se vuoi eliminare automaticamente <b>Dispositivi offline</b> dopo <code>X</code> ore trascorse offline.",
"HRS_TO_KEEP_OFFDEV_description": "Questa è un'impostazione di manutenzione <b>ELIMINAZIONE dispositivi</b>. Se abilitata (<code>0</code> è disabilitata), i dispositivi che sono <b>Offline</b> e la loro data e ora <b>Ultima connessione</b> sono più vecchi delle ore specificate in questa impostazione saranno eliminati. Usa questa impostazione se vuoi eliminare automaticamente <b>Dispositivi offline</b> dopo <code>X</code> ore trascorse offline.",
"HRS_TO_KEEP_OFFDEV_name": "Elimina dispositivi offline dopo",
"LOADED_PLUGINS_description": "Quali Plugin caricare. L'aggiunta di plugin potrebbe rallentare l'applicazione. Leggi di più su quali plugin necessitano di essere abilitati, tipi e opzioni di scansione nella <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">documentazione plugin</a>. I plugin disinstallati perdono la loro configurazione. Solo i plugin <code>disabilitati</code> possono essere disinstallati.",
"LOADED_PLUGINS_name": "Plugin caricati",

View File

@@ -742,4 +742,4 @@
"settings_update_item_warning": "",
"test_event_icon": "",
"test_event_tooltip": "Guarde as alterações antes de testar as definições."
}
}

View File

@@ -334,7 +334,7 @@
"General_icon": "<i class=\"fa fa-gears\"></i>",
"HRS_TO_KEEP_NEWDEV_description": "Это настройка обслуживания <b>УДАЛЕНИЕ устройств</b>. Если этот параметр включен (<code>0</code> отключен), устройства, помеченные как <b>Новое устройство</b>, будут удалены, если время их <b>Первого сеанса</b> было старше указанных в этой настройке часов. Используйте этот параметр, если вы хотите автоматически удалять <b>Новые устройства</b> через <code>X</code> часов.",
"HRS_TO_KEEP_NEWDEV_name": "Удалить новые устройства после",
"HRS_TO_KEEP_OFFDEV_description": "Это настройка обслуживания <b>УДАЛЕНИЕ устройств</b>. Если этот параметр включен (<code>0</code> отключен), устройства, которые находятся <b>в Offline</b> и их дата и время <b>последнего Offline</b> старше, чем часы, указанные в этом параметре. Используйте этот параметр, если вы хотите автоматически удалять <b>Offline устройства</b> после <code>X</code> часов отсутствия в сети.",
"HRS_TO_KEEP_OFFDEV_description": "Это настройка обслуживания <b>УДАЛЕНИЕ устройств</b>. Если этот параметр включен (<code>0</code> отключен), устройства, которые находятся <b>в Offline</b> и их дата и время <b>последнего подключения</b> старше, чем часы, указанные в этом параметре. Используйте этот параметр, если вы хотите автоматически удалять <b>Offline устройства</b> после <code>X</code> часов отсутствия в сети.",
"HRS_TO_KEEP_OFFDEV_name": "Удалить устройства Offline после",
"LOADED_PLUGINS_description": "Какие плагины загружать. Добавление плагинов может замедлить работу приложения. Подробнее о том, какие плагины необходимо включить, их типах или параметрах сканирования, читайте в <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md \">Документация по плагинам</a>. Выгруженные плагины потеряют ваши настройки. Можно выгрузить только <code>отключенные</code> плагины.",
"LOADED_PLUGINS_name": "Загруженные плагины",

View File

@@ -1,440 +1,440 @@
{
"API_CUSTOM_SQL_description": "",
"API_CUSTOM_SQL_name": "",
"API_TOKEN_description": "",
"API_TOKEN_name": "",
"API_display_name": "",
"API_icon": "",
"About_Design": "",
"API_CUSTOM_SQL_description": "Özel bir SQL sorgusu belirleyebilir ve bu sorgu ile bir JSON dosyası oluşturabilir, ardından bu dosyayı <a href=\"/php/server/query_json.php?file=table_custom_endpoint.json\" target=\"_blank\"><code>table_custom_endpoint.json</code> dosya uç noktası</a> üzerinden erişime açabilirsiniz.",
"API_CUSTOM_SQL_name": "Kişiselleştirilmiş endpoint",
"API_TOKEN_description": "Güvenli iletişim için API token'ı. Bir tane oluşturun veya herhangi bir değer girin. Bu token, istek başlığında gönderilir ve <code>SYNC</code> eklentisi, GraphQL sunucusu ve diğer API uç noktalarında kullanılır. API uç noktalarını, <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/API.md\" target=\"_blank\">API belgelerinde</a> açıklanan şekilde özel entegrasyonlar oluşturmak için kullanabilirsiniz.",
"API_TOKEN_name": "API token",
"API_display_name": "API",
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
"About_Design": "Tasarım Amacı:",
"About_Exit": "Oturum kapat",
"About_Title": "",
"AppEvents_AppEventProcessed": "",
"AppEvents_DateTimeCreated": "",
"About_Title": "Ağ güvenlik tarayıcısı & bildirim çerçevesi",
"AppEvents_AppEventProcessed": "İşlendi",
"AppEvents_DateTimeCreated": "Giriş yapıldı",
"AppEvents_Extra": "Ekstra",
"AppEvents_GUID": "",
"AppEvents_GUID": "Uygulama Olayı GUID'si",
"AppEvents_Helper1": "Yardımcı 1",
"AppEvents_Helper2": "Yardımcı 2",
"AppEvents_Helper3": "Yardımcı 3",
"AppEvents_ObjectForeignKey": "",
"AppEvents_ObjectIndex": "",
"AppEvents_ObjectIsArchived": "",
"AppEvents_ObjectIsNew": "",
"AppEvents_ObjectPlugin": "",
"AppEvents_ObjectPrimaryID": "",
"AppEvents_ObjectSecondaryID": "",
"AppEvents_ObjectStatus": "",
"AppEvents_ObjectStatusColumn": "",
"AppEvents_ObjectType": "",
"AppEvents_Plugin": "",
"AppEvents_Type": "",
"BackDevDetail_Actions_Ask_Run": "Komutları çalıştırmak istiyor musunuz?",
"BackDevDetail_Actions_Not_Registered": "",
"BackDevDetail_Actions_Title_Run": "Komutu çalıştır",
"BackDevDetail_Copy_Ask": "",
"AppEvents_ObjectForeignKey": "Yabancı Anahtar",
"AppEvents_ObjectIndex": "Dizin",
"AppEvents_ObjectIsArchived": "Arşivlendi (kayıt zamanı itibariyle)",
"AppEvents_ObjectIsNew": "Yeni (kayıt zamanında)",
"AppEvents_ObjectPlugin": "Bağlantılı Eklenti",
"AppEvents_ObjectPrimaryID": "Birincil ID",
"AppEvents_ObjectSecondaryID": "İkincil ID",
"AppEvents_ObjectStatus": "Kaydedilmiş Durum",
"AppEvents_ObjectStatusColumn": "Durum sütunu",
"AppEvents_ObjectType": "Nesne Tipi",
"AppEvents_Plugin": "Eklenti",
"AppEvents_Type": "Tür",
"BackDevDetail_Actions_Ask_Run": "İşlemi gerçekleştirmek istiyor musunuz?",
"BackDevDetail_Actions_Not_Registered": "Eylem kaydedilmedi: ",
"BackDevDetail_Actions_Title_Run": "Eylemi çalıştır",
"BackDevDetail_Copy_Ask": "ılır menüden cihazın detaylarını kopyala (Bu sayfadaki her şeyin üzerine yazılacak)?",
"BackDevDetail_Copy_Title": "Ayrıntıları kopyala",
"BackDevDetail_Tools_WOL_error": "Komut çalıştırılmadı.",
"BackDevDetail_Tools_WOL_okay": "Komut çalıştırıldı.",
"BackDevices_Arpscan_disabled": "",
"BackDevices_Arpscan_enabled": "",
"BackDevices_Backup_CopError": "",
"BackDevices_Backup_Failed": "",
"BackDevices_Backup_okay": "",
"BackDevices_Arpscan_disabled": "Arp-Scan Devre Dışı",
"BackDevices_Arpscan_enabled": "Arp-Scan Etkin",
"BackDevices_Backup_CopError": "Orijinal veritabanı kaydedilemedi.",
"BackDevices_Backup_Failed": "Yedekleme kısmi olarak başarılı bir şekilde çalıştırıldı. Arşiv oluşturulamadı ya da boş.",
"BackDevices_Backup_okay": "Yedekleme, yeni arşiv ile başarılı bir şekilde gerçekleştirildi",
"BackDevices_DBTools_DelDevError_a": "Cihaz silinirken hata oluştu",
"BackDevices_DBTools_DelDevError_b": "Cihazlar silinirken hata oluştu",
"BackDevices_DBTools_DelDev_a": "Cihaz silindi",
"BackDevices_DBTools_DelDev_b": "Cihazlar silindi",
"BackDevices_DBTools_DelEvents": "",
"BackDevices_DBTools_DelEventsError": "",
"BackDevices_DBTools_ImportCSV": "",
"BackDevices_DBTools_ImportCSVError": "",
"BackDevices_DBTools_ImportCSVMissing": "",
"BackDevices_DBTools_Purge": "",
"BackDevices_DBTools_UpdDev": "Cihaz başarılı bir şekilde güncellendi",
"BackDevices_DBTools_DelEvents": "Eventler (olay kayıtları) silinmiş durumda",
"BackDevices_DBTools_DelEventsError": "Eventler (olay kayıtları) silerken hata oluştu",
"BackDevices_DBTools_ImportCSV": "CSV dosyasındaki aygıtlar başarıyla içe aktarıldı.",
"BackDevices_DBTools_ImportCSVError": "CSV dosyası içe aktarılamadı. Formatın doğru olduğundan emin olun.",
"BackDevices_DBTools_ImportCSVMissing": "CSV dosyası <b>/config/devices.csv</b> altında bulunamadı",
"BackDevices_DBTools_Purge": "Geriye dönük yedekler kaldırıldı",
"BackDevices_DBTools_UpdDev": "Cihaz başarılı bir şekilde güncellendi. Ana aygıtlar listesi, bir tarama işlemi devam ediyorsa yeniden yüklenmesi için biraz zaman alabilir.",
"BackDevices_DBTools_UpdDevError": "Cihaz güncellenirken hata oluştu",
"BackDevices_DBTools_Upgrade": "Veritabanı başarılı bir şekilde güncellendi",
"BackDevices_DBTools_UpgradeError": "Veritabanı güncellenemedi",
"BackDevices_Device_UpdDevError": "Cihazlar güncellenirken hata oluştu, daha sonra tekrar deneyiz. Veritabanı, devam eden bir komut nedeniyle kilitli olabilir.",
"BackDevices_Restore_CopError": "",
"BackDevices_Restore_Failed": "",
"BackDevices_Restore_okay": "",
"BackDevices_darkmode_disabled": "",
"BackDevices_darkmode_enabled": "",
"CLEAR_NEW_FLAG_description": "",
"CLEAR_NEW_FLAG_name": "",
"CustProps_cant_remove": "",
"DAYS_TO_KEEP_EVENTS_description": "",
"DAYS_TO_KEEP_EVENTS_name": "",
"DISCOVER_PLUGINS_description": "",
"DISCOVER_PLUGINS_name": "",
"DevDetail_Copy_Device_Title": "",
"DevDetail_Copy_Device_Tooltip": "",
"DevDetail_CustomProperties_Title": "",
"DevDetail_CustomProps_reset_info": "",
"DevDetail_DisplayFields_Title": "",
"DevDetail_EveandAl_AlertAllEvents": "",
"DevDetail_EveandAl_AlertDown": "",
"DevDetail_EveandAl_Archived": "",
"BackDevices_Restore_CopError": "Orijinal veritabanı kaydedilemedi.",
"BackDevices_Restore_Failed": "Geri yükleme başarısız oldu. Lütfen yedeği manuel olarak geri yükleyin.",
"BackDevices_Restore_okay": "Geri yükleme başarılı bir şekilde gerçekleştirildi.",
"BackDevices_darkmode_disabled": "Karanlık mod devre dışı bırakıldı",
"BackDevices_darkmode_enabled": "Karanlık mod etkinleştirildi",
"CLEAR_NEW_FLAG_description": "Eğer etkinleştirilmişse (<code>0</code> devre dışı bırakılmıştır), <b>Yeni Cihaz</b> olarak işaretlenen cihazlar, belirlenen saat cinsinden süre sınırı, <b>İlk Oturum</b> zamanlarını aşarsa işaretlenmemiş hale gelir.",
"CLEAR_NEW_FLAG_name": "Yeni bayrağını kaldır",
"CustProps_cant_remove": "Kaldırılamaz, en az bir özellik gereklidir.",
"DAYS_TO_KEEP_EVENTS_description": "Bu bir bakım ayarıdır. Bu, saklanacak olay girişlerinin gün cinsinden sayısını belirtir. Daha eski tüm olaylar periyodik olarak silinecektir. Ayrıca Eklenti Olay Geçmişi üzerinde de geçerlidir.",
"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_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",
"DevDetail_CustomProps_reset_info": "Bu, bu cihazdaki özelleştirilmiş özelliklerinizi kaldıracak ve varsayılan değere sıfırlayacaktır.",
"DevDetail_DisplayFields_Title": "Görüntüle",
"DevDetail_EveandAl_AlertAllEvents": "Alarm Olayları",
"DevDetail_EveandAl_AlertDown": "Alarm Düşüşü",
"DevDetail_EveandAl_Archived": "Arşivlenmiş",
"DevDetail_EveandAl_NewDevice": "Yeni Cihaz",
"DevDetail_EveandAl_NewDevice_Tooltip": "",
"DevDetail_EveandAl_RandomMAC": "",
"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_Descr": "",
"DevDetail_EveandAl_NewDevice_Tooltip": "Cihaz için Yeni durumunu gösterecek ve Yeni Cihazlar filtresi aktif olduğunda listelere dahil edecektir. Bildirimleri etkilemez.",
"DevDetail_EveandAl_RandomMAC": "Rastgele MAC",
"DevDetail_EveandAl_ScanCycle": "Cihazı tara",
"DevDetail_EveandAl_ScanCycle_a": "Cihaz Tarama",
"DevDetail_EveandAl_ScanCycle_z": "Cihazı Sakın Etme",
"DevDetail_EveandAl_Skip": "Tekrarlanan bildirimleri atla",
"DevDetail_EveandAl_Title": "Bildirim konfigürasyonu",
"DevDetail_Events_CheckBox": "Bağlantı Olaylarını Gizle",
"DevDetail_GoToNetworkNode": "Verilen düğümün Ağ sayfasına gidin.",
"DevDetail_Icon": "İkon",
"DevDetail_Icon_Descr": "fa- öneki olmadan veya tam sınıfa sahip bir font awesome simge adı girin, örneğin: fa fa-brands fa-apple.",
"DevDetail_Loading": "YÜkleniyor...",
"DevDetail_MainInfo_Comments": "Yorumlar",
"DevDetail_MainInfo_Favorite": "",
"DevDetail_MainInfo_Favorite": "Favori",
"DevDetail_MainInfo_Group": "Grup",
"DevDetail_MainInfo_Location": "Konum",
"DevDetail_MainInfo_Name": "İsim",
"DevDetail_MainInfo_Network": "",
"DevDetail_MainInfo_Network_Port": "",
"DevDetail_MainInfo_Network_Site": "",
"DevDetail_MainInfo_Network_Title": "",
"DevDetail_MainInfo_Network": "<i class=\"fa fa-server\"></i> Makine (MAC)",
"DevDetail_MainInfo_Network_Port": "<i class=\"fa fa-ethernet\"></i> Port",
"DevDetail_MainInfo_Network_Site": "Alan",
"DevDetail_MainInfo_Network_Title": "Network",
"DevDetail_MainInfo_Owner": "Sahip",
"DevDetail_MainInfo_SSID": "",
"DevDetail_MainInfo_Title": "",
"DevDetail_MainInfo_Type": "",
"DevDetail_MainInfo_Vendor": "",
"DevDetail_MainInfo_mac": "",
"DevDetail_Network_Node_hover": "",
"DevDetail_Network_Port_hover": "",
"DevDetail_Nmap_Scans": "",
"DevDetail_Nmap_Scans_desc": "",
"DevDetail_Nmap_buttonDefault": "",
"DevDetail_Nmap_buttonDefault_text": "",
"DevDetail_MainInfo_SSID": "SSID",
"DevDetail_MainInfo_Title": "Genel Bilgiler",
"DevDetail_MainInfo_Type": "Tür",
"DevDetail_MainInfo_Vendor": "Üretici",
"DevDetail_MainInfo_mac": "MAC",
"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ı",
"DevDetail_Nmap_Scans_desc": "Buradan manuel NMAP taramaları gerçekleştirebilirsiniz. Ayrıca, Services & Ports (NMAP) eklentisi aracılığıyla düzenli otomatik NMAP taramaları da planlayabilirsiniz. Daha fazla bilgi için <a href='/settings.php' target='_blank'>Ayarlar</a> sayfasına göz atın",
"DevDetail_Nmap_buttonDefault": "Standart Tarama",
"DevDetail_Nmap_buttonDefault_text": "Standart Tarama: Nmap, her bir protokol için en yaygın 1.000 portu tarayarak TCPnin %93ünü ve UDPnin %49unu tespit eder. (yaklaşık 5 saniyelik süreyle)",
"DevDetail_Nmap_buttonDetail": "Detaylı Tarama",
"DevDetail_Nmap_buttonDetail_text": "",
"DevDetail_Nmap_buttonDetail_text": "Detaylı Tarama: Varsayılan taramaya ek olarak, OS tespiti, sürüm tespiti, betik taraması ve traceroute özellikleri etkinleştirilmiştir. (30 saniye veya daha uzun sürebilir)",
"DevDetail_Nmap_buttonFast": "Hızlı Tarama",
"DevDetail_Nmap_buttonFast_text": "",
"DevDetail_Nmap_buttonSkipDiscovery": "",
"DevDetail_Nmap_buttonSkipDiscovery_text": "",
"DevDetail_Nmap_buttonFast_text": "Hızlı Tarama: Varsayılan taramadan daha az portu (100) tarar (birkaç saniye sürer)",
"DevDetail_Nmap_buttonSkipDiscovery": "Ağ cihazı keşfini atla",
"DevDetail_Nmap_buttonSkipDiscovery_text": "Ağ cihazı keşfini atla (-Pn seçeneği): Host keşfi yapılmadan varsayılan tarama",
"DevDetail_Nmap_resultsLink": "Tarama başlattıktan sonra bu sayfadan çıkabilirsiniz. Sonuçlara <code>app_front.log</code> dosyasından da ulaşılabilir.",
"DevDetail_Owner_hover": "",
"DevDetail_Owner_hover": "Cihazın sahibi kimdir? Serbest metin kutusu.",
"DevDetail_Periodselect_All": "Tüm Bilgi",
"DevDetail_Periodselect_LastMonth": "Geçen Ay",
"DevDetail_Periodselect_LastWeek": "Geçen Hafta",
"DevDetail_Periodselect_LastYear": "Geçen Yıl",
"DevDetail_Periodselect_today": "Bugün",
"DevDetail_Run_Actions_Title": "<i class=\"fa fa-play\"></i>Komutu cihazda çalıştır",
"DevDetail_Run_Actions_Tooltip": "",
"DevDetail_Run_Actions_Tooltip": "Mevcut cihaz üzerinde açılır menüden bir işlem çalıştırın.",
"DevDetail_SessionInfo_FirstSession": "İlk Oturum",
"DevDetail_SessionInfo_LastIP": "Son IP",
"DevDetail_SessionInfo_LastSession": "",
"DevDetail_SessionInfo_StaticIP": "",
"DevDetail_SessionInfo_LastSession": "Son Çevrimdışı",
"DevDetail_SessionInfo_StaticIP": "Statik IP",
"DevDetail_SessionInfo_Status": "Durum",
"DevDetail_SessionInfo_Title": "Oturum Bİlgisi",
"DevDetail_SessionTable_Additionalinfo": "Ek bilgi",
"DevDetail_SessionTable_Connection": "Bağlantı",
"DevDetail_SessionTable_Disconnection": "",
"DevDetail_SessionTable_Disconnection": "Bağlantıyı Kes",
"DevDetail_SessionTable_Duration": "Süre",
"DevDetail_SessionTable_IP": "IP",
"DevDetail_SessionTable_Order": "Sıra",
"DevDetail_Shortcut_CurrentStatus": "Mevcut Durum",
"DevDetail_Shortcut_DownAlerts": "",
"DevDetail_Shortcut_Presence": "",
"DevDetail_Shortcut_DownAlerts": "Kapalı Alarmlar",
"DevDetail_Shortcut_Presence": "Mevcudiyet",
"DevDetail_Shortcut_Sessions": "Oturumlar",
"DevDetail_Tab_Details": "Detaylar",
"DevDetail_Tab_Events": "",
"DevDetail_Tab_Events": "Etkinlikler",
"DevDetail_Tab_EventsTableDate": "Tarih",
"DevDetail_Tab_EventsTableEvent": "",
"DevDetail_Tab_EventsTableEvent": "Etkinlik Türü",
"DevDetail_Tab_EventsTableIP": "IP",
"DevDetail_Tab_EventsTableInfo": "Ek bilgi",
"DevDetail_Tab_Nmap": "",
"DevDetail_Tab_NmapEmpty": "",
"DevDetail_Tab_Nmap": "<i class=\"fa fa-ethernet\"></i> Nmap",
"DevDetail_Tab_NmapEmpty": "Bu cihazda Nmap ile herhangi bir port tespit edilmedi.",
"DevDetail_Tab_NmapTableExtra": "Ekstra",
"DevDetail_Tab_NmapTableHeader": "Planlanmış tarama sonuçları",
"DevDetail_Tab_NmapTableIndex": "",
"DevDetail_Tab_NmapTablePort": "",
"DevDetail_Tab_NmapTableService": "",
"DevDetail_Tab_NmapTableState": "",
"DevDetail_Tab_NmapTableText": "",
"DevDetail_Tab_NmapTableIndex": "İndeks",
"DevDetail_Tab_NmapTablePort": "Port",
"DevDetail_Tab_NmapTableService": "Servis",
"DevDetail_Tab_NmapTableState": "Status",
"DevDetail_Tab_NmapTableText": "Bir takvim oluşturun <a href=\"/settings.php#NMAP_ACTIVE\">Ayarlar</a> bölümünde",
"DevDetail_Tab_NmapTableTime": "Zaman",
"DevDetail_Tab_Plugins": "",
"DevDetail_Tab_Presence": "",
"DevDetail_Tab_Plugins": "Eklentiler",
"DevDetail_Tab_Presence": "Mevcudiyet",
"DevDetail_Tab_Sessions": "Oturumlar",
"DevDetail_Tab_Tools": "",
"DevDetail_Tab_Tools_Internet_Info_Description": "",
"DevDetail_Tab_Tools": "Araçlar",
"DevDetail_Tab_Tools_Internet_Info_Description": "İnternet Bilgisi aracı, IP adresi, şehir, ülke, alan kodu ve saat dilimi gibi internet bağlantısı hakkında bilgi görüntüler.",
"DevDetail_Tab_Tools_Internet_Info_Error": "Bir hata oluştu",
"DevDetail_Tab_Tools_Internet_Info_Start": "",
"DevDetail_Tab_Tools_Internet_Info_Title": "",
"DevDetail_Tab_Tools_Nslookup_Description": "",
"DevDetail_Tab_Tools_Nslookup_Error": "Hata: Geçersiz IP adresi.",
"DevDetail_Tab_Tools_Nslookup_Start": "",
"DevDetail_Tab_Tools_Nslookup_Title": "",
"DevDetail_Tab_Tools_Speedtest_Description": "",
"DevDetail_Tab_Tools_Speedtest_Start": "",
"DevDetail_Tab_Tools_Speedtest_Title": "",
"DevDetail_Tab_Tools_Traceroute_Description": "",
"DevDetail_Tab_Tools_Internet_Info_Start": "İnternet Bilgisi Başlat",
"DevDetail_Tab_Tools_Internet_Info_Title": "İnternet Bilgisi",
"DevDetail_Tab_Tools_Nslookup_Description": "Nslookup, Alan Adı Sistemi'ni (DNS) sorgulamak için kullanılan bir komut satırı aracıdır. DNS, www.google.com gibi alan adlarını, 172.217.0.142 gibi IP adreslerine çeviren bir sistemdir.",
"DevDetail_Tab_Tools_Nslookup_Error": "Hata: Geçersiz IP adresi",
"DevDetail_Tab_Tools_Nslookup_Start": "Nslookup Başlat",
"DevDetail_Tab_Tools_Nslookup_Title": "Nslookup",
"DevDetail_Tab_Tools_Speedtest_Description": "Speedtest aracı, internet bağlantısının indirme hızı, yükleme hızı ve gecikme süresini ölçer.",
"DevDetail_Tab_Tools_Speedtest_Start": "Speedtest Başlat",
"DevDetail_Tab_Tools_Speedtest_Title": "Çevrimiçi Speedtest",
"DevDetail_Tab_Tools_Traceroute_Description": "Traceroute, veri paketlerinin bir host'tan diğerine gittiği yolu izlemek için kullanılan bir ağ tanılama komutudur.Bu komut, İnternet Kontrol Mesajı Protokolü (ICMP) kullanarak, rotadaki ara düğümlere paketler gönderir; her bir ara düğüm, ICMP zaman aşımı (TTL zaman aşımı) paketleri ile yanıt verir.Traceroute komutunun çıktısı, rotadaki her bir ara düğümün IP adresini görüntüler.Traceroute komutu, ağ sorunlarını teşhis etmek için kullanılabilir, örneğin gecikmeler, paket kaybı ve engellenmiş rotalar gibi.Ayrıca, bir ağdaki ara düğümün konumunu belirlemek için de kullanılabilir.",
"DevDetail_Tab_Tools_Traceroute_Error": "Hata: Geçersiz IP adresi",
"DevDetail_Tab_Tools_Traceroute_Start": "",
"DevDetail_Tab_Tools_Traceroute_Title": "",
"DevDetail_Tools_WOL": "",
"DevDetail_Tools_WOL_noti": "",
"DevDetail_Tools_WOL_noti_text": "",
"DevDetail_Type_hover": "",
"DevDetail_Vendor_hover": "",
"DevDetail_WOL_Title": "",
"DevDetail_Tab_Tools_Traceroute_Start": "Traceroute Başlat",
"DevDetail_Tab_Tools_Traceroute_Title": "Traceroute",
"DevDetail_Tools_WOL": "WoL komutunu gönder ",
"DevDetail_Tools_WOL_noti": "Wake-on-LAN",
"DevDetail_Tools_WOL_noti_text": "Wake-on-LAN komutu yayın adresine gönderilir. Eğer hedef, NetAlertX'in alt ağında/VLAN'ında değilse, hedef cihaz yanıt vermez.",
"DevDetail_Type_hover": "Cihazın Türü. Eğer önceden tanımlanmış ağ cihazlarından herhangiini (örneğin: AP, Firewall, Router, Switch...) seçerseniz, bu cihazlar Ağ ağacı yapılandırmasında olası üst ağ düğümleri olarak görüntülenir.",
"DevDetail_Vendor_hover": "Satıcı otomatik olarak tespit edilmelidir. Kendi özel değerini yazabilir veya üzerine yazabilirsiniz.",
"DevDetail_WOL_Title": "<i class=\"fa fa-power-off\"></i> Wake-on-LAN",
"DevDetail_button_AddIcon": "Yeni İkon Ekle",
"DevDetail_button_AddIcon_Help": "",
"DevDetail_button_AddIcon_Tooltip": "",
"DevDetail_button_AddIcon_Help": "Bir SVG HTML etiketi veya Font Awesome HTML etiketi simgesi yapıştırın. Detaylar için <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">Simge dökümantasyonunu</a> okuyun.",
"DevDetail_button_AddIcon_Tooltip": "Bu cihaza, açılır menüde henüz mevcut olmayan yeni bir simge ekleyin.",
"DevDetail_button_Delete": "Cihazı Sil",
"DevDetail_button_DeleteEvents": "",
"DevDetail_button_DeleteEvents_Warning": "",
"DevDetail_button_Delete_ask": "",
"DevDetail_button_OverwriteIcons": "",
"DevDetail_button_OverwriteIcons_Tooltip": "",
"DevDetail_button_OverwriteIcons_Warning": "",
"DevDetail_button_DeleteEvents": "Etkinlikleri Sil",
"DevDetail_button_DeleteEvents_Warning": "Bu cihazın tüm Etkinliklerini silmek istediğinizden emin misiniz?<br><br>(Bu işlem, <b>Etkinlik geçmişi</b> ve <b>Oturumları</b> temizler, ayrıca sürekli (kalıcı) bildirimlerin giderilmesine yardımcı olabilir.)",
"DevDetail_button_Delete_ask": "Bu cihazı silmek istediğinizden emin misiniz? Bunun yerine arşivlemeyi de seçebilirsiniz.",
"DevDetail_button_OverwriteIcons": "Simgeleri Üzerine Yaz",
"DevDetail_button_OverwriteIcons_Tooltip": "Aynı cihaz türüne sahip tüm cihazların simgelerini üzerine yazın",
"DevDetail_button_OverwriteIcons_Warning": "Mevcut cihaz türüyle aynı cihaz türüne sahip tüm cihazların simgelerini üzerine yazmak istediğinizden emin misiniz?",
"DevDetail_button_Reset": "Değişiklikleri Sıfırla",
"DevDetail_button_Save": "Kaydet",
"DeviceEdit_ValidMacIp": "",
"Device_MultiEdit": "",
"Device_MultiEdit_Backup": "",
"Device_MultiEdit_Fields": "",
"DeviceEdit_ValidMacIp": "Geçerli bir <b>Mac</b> ve <b>IP</b> adresi girin.",
"Device_MultiEdit": "Çoklu Düzenleme",
"Device_MultiEdit_Backup": "Dikkat, aşağıya yanlış değerler girmeniz yapılandırmanızı bozabilir. Lütfen önce veritabanınızı veya Cihazlar yapılandırmanızı yedekleyin (<a href=\"php/server/devices.php?action=ExportCSV\">İndirmeniz için tıklayın <i class=\"fa-solid fa-download fa-bounce\"></i></a>). Bu dosyadan Cihazları nasıl geri yükleyeceğinizi öğrenmek için <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\"_blank\">Yedekleme dökümantasyonunu</a> okuyun.",
"Device_MultiEdit_Fields": "Alanları Düzenle:",
"Device_MultiEdit_MassActions": "Toplu komutlar:",
"Device_MultiEdit_Tooltip": "",
"Device_Searchbox": "",
"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_Archived": "",
"Device_Shortcut_Archived": "Arşivlenmiş",
"Device_Shortcut_Connected": "Bağlandı",
"Device_Shortcut_Devices": "Cihazlar",
"Device_Shortcut_DownAlerts": "",
"Device_Shortcut_DownOnly": "",
"Device_Shortcut_DownAlerts": "Çalışmıyor & Çevrimdışı",
"Device_Shortcut_DownOnly": "Çalışmıyor",
"Device_Shortcut_Favorites": "Favoriler",
"Device_Shortcut_NewDevices": "Yeni Cİhazlar",
"Device_Shortcut_OnlineChart": "",
"Device_TableHead_AlertDown": "",
"Device_Shortcut_OnlineChart": "Cihaz Durumu",
"Device_TableHead_AlertDown": "Çalışmama Alarmı",
"Device_TableHead_Connected_Devices": "Bağlantılar",
"Device_TableHead_CustomProps": "",
"Device_TableHead_Favorite": "",
"Device_TableHead_CustomProps": "Özellikler / Eylemler",
"Device_TableHead_Favorite": "Favori",
"Device_TableHead_FirstSession": "İlk Oturum",
"Device_TableHead_GUID": "",
"Device_TableHead_GUID": "GUID",
"Device_TableHead_Group": "Grup",
"Device_TableHead_Icon": "",
"Device_TableHead_LastIP": "",
"Device_TableHead_LastIPOrder": "",
"Device_TableHead_LastSession": "",
"Device_TableHead_Icon": "İkon",
"Device_TableHead_LastIP": "Son IP",
"Device_TableHead_LastIPOrder": "Son IP Sırası",
"Device_TableHead_LastSession": "Son Çevrimdışı Zamanı",
"Device_TableHead_Location": "Konum",
"Device_TableHead_MAC": "",
"Device_TableHead_MAC_full": "",
"Device_TableHead_MAC": "Rastgele MAC",
"Device_TableHead_MAC_full": "Tam MAC",
"Device_TableHead_Name": "İsim",
"Device_TableHead_NetworkSite": "",
"Device_TableHead_Owner": "",
"Device_TableHead_Parent_MAC": "",
"Device_TableHead_Port": "",
"Device_TableHead_PresentLastScan": "",
"Device_TableHead_RowID": "",
"Device_TableHead_Rowid": "",
"Device_TableHead_SSID": "",
"Device_TableHead_SourcePlugin": "",
"Device_TableHead_NetworkSite": "Ağ Alanı",
"Device_TableHead_Owner": "Kurucu",
"Device_TableHead_Parent_MAC": "Üst ağ düğümü",
"Device_TableHead_Port": "Port",
"Device_TableHead_PresentLastScan": "Varlık",
"Device_TableHead_RowID": "Satır ID",
"Device_TableHead_Rowid": "Satır ID",
"Device_TableHead_SSID": "SSID",
"Device_TableHead_SourcePlugin": "Kaynak Eklentisi Modülü",
"Device_TableHead_Status": "Durum",
"Device_TableHead_SyncHubNodeName": "",
"Device_TableHead_Type": "",
"Device_TableHead_Vendor": "",
"Device_TableHead_SyncHubNodeName": "Senkronizasyon Node",
"Device_TableHead_Type": "Tür",
"Device_TableHead_Vendor": "Üretici",
"Device_Table_Not_Network_Device": "Ağ cihazı olarak ayarlanmadı",
"Device_Table_info": "",
"Device_Table_info": "Showing _START_ to _END_ of _TOTAL_ entries",
"Device_Table_nav_next": "Sonraki",
"Device_Table_nav_prev": "Önceki",
"Device_Tablelenght": "",
"Device_Tablelenght_all": "",
"Device_Tablelenght": "Show _MENU_ entries",
"Device_Tablelenght_all": "Hepsi",
"Device_Title": "Cihazlar",
"Devices_Filters": "",
"ENABLE_PLUGINS_description": "",
"ENABLE_PLUGINS_name": "",
"ENCRYPTION_KEY_description": "",
"ENCRYPTION_KEY_name": "",
"Devices_Filters": "Filtreler",
"ENABLE_PLUGINS_description": "<a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">Eklentiler</a> işlevini etkinleştirir. Eklentilerin yüklenmesi daha fazla donanım kaynağı gerektirir, bu nedenle düşük güçteki sistemlerde devre dışı bırakmak isteyebilirsiniz.",
"ENABLE_PLUGINS_name": "Eklentileri Etkinleştir",
"ENCRYPTION_KEY_description": "Veri encryption şifresi.",
"ENCRYPTION_KEY_name": "Encryption şifresi",
"Email_display_name": "Eposta",
"Email_icon": "<i class=\"fa fa-at\"></i>",
"Events_Loading": "Yükleniyor...",
"Events_Periodselect_All": "",
"Events_Periodselect_All": "Tüm Bilgiler",
"Events_Periodselect_LastMonth": "Geçen Ay",
"Events_Periodselect_LastWeek": "Geçen Hafta",
"Events_Periodselect_LastYear": "Geçen Yıl",
"Events_Periodselect_today": "Bugün",
"Events_Searchbox": "",
"Events_Shortcut_AllEvents": "",
"Events_Shortcut_DownAlerts": "",
"Events_Shortcut_Events": "",
"Events_Shortcut_MissSessions": "",
"Events_Searchbox": "Arama",
"Events_Shortcut_AllEvents": "Tüm Olaylar",
"Events_Shortcut_DownAlerts": "Kapanma Alarmı",
"Events_Shortcut_Events": "Olaylar",
"Events_Shortcut_MissSessions": "Eksik Oturumlar",
"Events_Shortcut_NewDevices": "Yeni Cİhazlar",
"Events_Shortcut_Sessions": "Oturumlar",
"Events_Shortcut_VoidSessions": "",
"Events_Shortcut_VoidSessions": "Geçersiz Oturumlar",
"Events_TableHead_AdditionalInfo": "Ek Bilgi",
"Events_TableHead_Connection": "Bağlantı",
"Events_TableHead_Date": "Tarih",
"Events_TableHead_Device": "Cihaz",
"Events_TableHead_Disconnection": "",
"Events_TableHead_Disconnection": "Bağlantı Kesildi",
"Events_TableHead_Duration": "Süre",
"Events_TableHead_DurationOrder": "",
"Events_TableHead_EventType": "",
"Events_TableHead_IP": "",
"Events_TableHead_IPOrder": "",
"Events_TableHead_DurationOrder": "Süre Düzeni",
"Events_TableHead_EventType": "Olay Türü",
"Events_TableHead_IP": "IP",
"Events_TableHead_IPOrder": "IP Sırası",
"Events_TableHead_Order": "Sıra",
"Events_TableHead_Owner": "",
"Events_TableHead_PendingAlert": "",
"Events_Table_info": "",
"Events_Table_nav_next": "",
"Events_TableHead_Owner": "Kurucu",
"Events_TableHead_PendingAlert": "Bekleyen Alarm",
"Events_Table_info": "Showing _START_ to _END_ of _TOTAL_ entries",
"Events_Table_nav_next": "Sonraki",
"Events_Table_nav_prev": "Önceki",
"Events_Tablelenght": "",
"Events_Tablelenght_all": "",
"Events_Title": "",
"GRAPHQL_PORT_description": "",
"GRAPHQL_PORT_name": "",
"Events_Tablelenght": "Show _MENU_ entries",
"Events_Tablelenght_all": "Hepsi",
"Events_Title": "Olaylar",
"GRAPHQL_PORT_description": "GraphQL sunucusunun port numarası. Portun, bu anahtardaki tüm uygulamalar ve NetAlertX örnekleri arasında benzersiz olduğundan emin olun.",
"GRAPHQL_PORT_name": "GraphQL port",
"Gen_Action": "Komut",
"Gen_Add": "Ekle",
"Gen_AddDevice": "",
"Gen_AddDevice": "Cihaz Ekle",
"Gen_Add_All": "Tümünü ekle",
"Gen_All_Devices": "Tüm Cihazlar",
"Gen_AreYouSure": "Emin misiniz?",
"Gen_Backup": "",
"Gen_Backup": "Yedeklemeyi Çalıştır",
"Gen_Cancel": "İptal",
"Gen_Change": "",
"Gen_Change": "Değiştir",
"Gen_Copy": "Çalıştır",
"Gen_DataUpdatedUITakesTime": "TAMAM - Eğer bir tarama çalışıyorsa arayüzün güncellenmesi biraz zaman alabilir",
"Gen_DataUpdatedUITakesTime": "TAMAM - Eğer bir tarama çalışıyorsa arayüzün güncellenmesi biraz zaman alabilir.",
"Gen_Delete": "Sil",
"Gen_DeleteAll": "Tümünü sil",
"Gen_Description": "",
"Gen_Description": "ıklama",
"Gen_Error": "Hata",
"Gen_Filter": "Filtre",
"Gen_Generate": "",
"Gen_LockedDB": "",
"Gen_Generate": "Oluştur",
"Gen_LockedDB": "HATA - Veritabanı kilitlenmiş olabilir - F12 Geliştirici araçlarını -> Konsol kısmını kontrol edin veya daha sonra tekrar deneyin.",
"Gen_Offline": "Çevrimdışı",
"Gen_Okay": "Tamam",
"Gen_Online": "",
"Gen_Online": "Çevrimiçi",
"Gen_Purge": ıkar",
"Gen_ReadDocs": "",
"Gen_ReadDocs": "Dokümanlarda daha fazla bilgiye ulaşın.",
"Gen_Remove_All": "Tümünü kaldır",
"Gen_Remove_Last": "",
"Gen_Reset": "",
"Gen_Restore": "",
"Gen_Remove_Last": "Sonuncuyu Kaldır",
"Gen_Reset": "Sıfırla",
"Gen_Restore": "Geri Yükleme Yap",
"Gen_Run": "Çalıştır",
"Gen_Save": "Kaydet",
"Gen_Saved": "Kaydedildi",
"Gen_Search": "",
"Gen_Select": "",
"Gen_SelectIcon": "",
"Gen_SelectToPreview": "",
"Gen_Search": "Arama",
"Gen_Select": "Seç",
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
"Gen_SelectToPreview": "Önizleme yapmak için seçin",
"Gen_Selected_Devices": "Seçilmiş Cihazlar:",
"Gen_Switch": "",
"Gen_Switch": "Switch",
"Gen_Upd": "Başarılı bir şekilde güncellendi",
"Gen_Upd_Fail": "",
"Gen_Update": "",
"Gen_Update_Value": "",
"Gen_ValidIcon": "",
"Gen_Upd_Fail": "Güncelleme işlemi başarısız oldu",
"Gen_Update": "Güncelleme",
"Gen_Update_Value": "Değeri Güncelle",
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
"Gen_Warning": "Uyarı",
"Gen_Work_In_Progress": "",
"Gen_create_new_device": "",
"Gen_create_new_device_info": "",
"Gen_Work_In_Progress": "Çalışma devam ediyor, geri bildirimde bulunmak için iyi bir zaman: https://github.com/jokob-sk/NetAlertX/issues",
"Gen_create_new_device": "Yeni cihaz",
"Gen_create_new_device_info": "Cihazlar genellikle <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">eklentiler</a> kullanılarak keşfedilir. Ancak, bazı durumlarda cihazları manuel olarak eklemeniz gerekebilir. Belirli senaryoları incelemek için <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/REMOTE_NETWORKS.md\">Uzak Ağlar belgelerini</a> kontrol edin.",
"General_display_name": "Genel",
"General_icon": "<i class=\"fa fa-gears\"></i>",
"HRS_TO_KEEP_NEWDEV_description": "",
"HRS_TO_KEEP_NEWDEV_name": "",
"HRS_TO_KEEP_OFFDEV_description": "",
"HRS_TO_KEEP_OFFDEV_name": "",
"LOADED_PLUGINS_description": "",
"LOADED_PLUGINS_name": "",
"LOG_LEVEL_description": "",
"LOG_LEVEL_name": "",
"HRS_TO_KEEP_NEWDEV_description": "Bu bir bakım ayarıdır <b>Cihazları SİLME</b>. Etkinleştirildiğinde (<code>0</code> devre dışıdır), <b>Yeni Cihaz</b> olarak işaretlenen cihazlar, <b>İlk Oturum</b> zamanı belirtilen saatten daha eskiyse silinecektir. Bu ayarı, <code>X</code> saat sonra <b>Yeni Cihazlar</b>ı otomatik olarak silmek için kullanabilirsiniz.",
"HRS_TO_KEEP_NEWDEV_name": "Yeni Cihazları Silmeden Önce",
"HRS_TO_KEEP_OFFDEV_description": "Bu bir bakım ayarıdır <b>Cihazları SİLME</b>. Etkinleştirildiğinde (<code>0</code> devre dışıdır), <b>Çevrimdışı</b> olan ve <b>Son Çevrimdışı</b> tarihi belirtilen saatten daha eski olan cihazlar silinecektir. Bu ayarı, <code>X</code> saat çevrimdışı olduktan sonra <b>Çevrimdışı Cihazlar</b>ı otomatik olarak silmek için kullanabilirsiniz.",
"HRS_TO_KEEP_OFFDEV_name": "Çevrimdışı Cihazları Silmeden Önce",
"LOADED_PLUGINS_description": "Hangi Eklentilerin Yükleneceği. Eklenti eklemek, uygulamanın hızını yavaşlatabilir. Hangi eklentilerin etkinleştirilmesi gerektiği, türler veya tarama seçenekleri hakkında daha fazla bilgi için <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">eklentiler belgelerini</a> okuyun. Yüklenmeyen eklentiler, ayarlarınızı kaybedecektir. Sadece <code>devre dışı bırakılmış</code> eklentiler yüklenebilir.",
"LOADED_PLUGINS_name": "Yüklenen Eklentiler",
"LOG_LEVEL_description": "Bu ayar, daha ayrıntılı günlüklemeyi etkinleştirecektir. Veritabanına yazılan olayları hata ayıklamak için faydalıdır.",
"LOG_LEVEL_name": "Ekstra günlükleme yazdır",
"Loading": "Yükleniyor...",
"Login_Box": "Şifrenizi giriniz",
"Login_Default_PWD": "Varsayılan şifre \"123456\" hâlâ aktif.",
"Login_Info": "",
"Login_Info": "Parolalar, Set Password eklentisi aracılığıyla ayarlanır. Giriş yapmakta sorun yaşıyorsanız, <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">SETPWD belgelerini</a> kontrol edin.",
"Login_Psw-box": "Şİfre",
"Login_Psw_alert": "",
"Login_Psw_folder": "",
"Login_Psw_alert": "Parola Uyarısı!",
"Login_Psw_folder": "Konfigürasyon klasöründe.",
"Login_Psw_new": "yeni_sifre",
"Login_Psw_run": "",
"Login_Psw_run": "Şifreyi değiştirmek için şu komutu çalıştırın:",
"Login_Remember": "Hatırla",
"Login_Remember_small": "(7 gün geçerli)",
"Login_Submit": "Oturum aç",
"Login_Toggle_Alert_headline": "",
"Login_Toggle_Info": "",
"Login_Toggle_Info_headline": "",
"Maint_PurgeLog": "",
"Maint_RestartServer": "",
"Maint_Restart_Server_noti_text": "",
"Login_Toggle_Alert_headline": "Şifre Uyarısı!",
"Login_Toggle_Info": "Şifre Bilgisi",
"Login_Toggle_Info_headline": "Şifre Bilgisi",
"Maint_PurgeLog": "Kayıtları Sil",
"Maint_RestartServer": "Sunucuyu Yeniden Başlat",
"Maint_Restart_Server_noti_text": "Arka uç sunucusunu yeniden başlatmak istediğinizden emin misiniz? Bu, uygulama tutarsızlıklarına yol açabilir. Önce yapılandırmanızı yedekleyin. <br/> <br/> Not: Bu işlem birkaç dakika sürebilir.",
"Maintenance_Running_Version": "Yüklenmiş sürüm",
"Maintenance_Status": "Durum",
"Maintenance_Title": "",
"Maintenance_Tool_DownloadConfig": "",
"Maintenance_Tool_DownloadConfig_text": "",
"Maintenance_Tool_DownloadWorkflows": "",
"Maintenance_Tool_DownloadWorkflows_text": "",
"Maintenance_Tool_ExportCSV": "",
"Maintenance_Tool_ExportCSV_noti": "",
"Maintenance_Title": "Bakım Araçları",
"Maintenance_Tool_DownloadConfig": "Ayarları Dışa Aktar",
"Maintenance_Tool_DownloadConfig_text": "<code>app.conf</code> dosyasında saklanan Ayar yapılandırmanızın tam yedeğini indirin.",
"Maintenance_Tool_DownloadWorkflows": "İş Akışlarını Dışa Aktar",
"Maintenance_Tool_DownloadWorkflows_text": "<code>workflows.json</code> dosyasında saklanan İş Akışlarınızın tam yedeğini indirin.",
"Maintenance_Tool_ExportCSV": "Cihazları Dışa Aktar (csv)",
"Maintenance_Tool_ExportCSV_noti": "Cihazları Dışa Aktar (csv)",
"Maintenance_Tool_ExportCSV_noti_text": "Bir CSV dosyası oluşturmak istediğinize emin misiniz?",
"Maintenance_Tool_ExportCSV_text": "",
"Maintenance_Tool_ImportCSV": "",
"Maintenance_Tool_ImportCSV_noti": "",
"Maintenance_Tool_ImportCSV_noti_text": "",
"Maintenance_Tool_ImportCSV_text": "",
"Maintenance_Tool_ImportConfig_noti": "",
"Maintenance_Tool_ImportPastedCSV": "",
"Maintenance_Tool_ImportPastedCSV_noti_text": "",
"Maintenance_Tool_ImportPastedCSV_text": "",
"Maintenance_Tool_ImportPastedConfig": "",
"Maintenance_Tool_ImportPastedConfig_noti_text": "",
"Maintenance_Tool_ImportPastedConfig_text": "",
"Maintenance_Tool_arpscansw": "",
"Maintenance_Tool_arpscansw_noti": "",
"Maintenance_Tool_arpscansw_noti_text": "",
"Maintenance_Tool_arpscansw_text": "",
"Maintenance_Tool_backup": "",
"Maintenance_Tool_backup_noti": "",
"Maintenance_Tool_backup_noti_text": "",
"Maintenance_Tool_backup_text": "",
"Maintenance_Tool_check_visible": "",
"Maintenance_Tool_darkmode": "",
"Maintenance_Tool_darkmode_noti": "",
"Maintenance_Tool_darkmode_noti_text": "",
"Maintenance_Tool_darkmode_text": "",
"Maintenance_Tool_del_ActHistory": "",
"Maintenance_Tool_del_ActHistory_noti": "",
"Maintenance_Tool_del_ActHistory_noti_text": "",
"Maintenance_Tool_del_ActHistory_text": "",
"Maintenance_Tool_ExportCSV_text": "Ağa bağlı cihazlar ve Ağ Düğümleri arasındaki ağ ilişkilerini içeren Cihazlar listesini içeren bir CSV (virgülle ayrılmış değerler) dosyası oluşturun. Bunu ayrıca şu URL'yi ziyaret ederek tetikleyebilirsiniz: <code>your_NetAlertX_url/php/server/devices.php?action=ExportCSV</code> veya <a href=\"settings.php#CSVBCKP_header\">CSV Yedekleme</a> eklentisini etkinleştirerek de yapabilirsiniz.",
"Maintenance_Tool_ImportCSV": "Cihazları İçe Aktar (csv)",
"Maintenance_Tool_ImportCSV_noti": "Cihazları İçe Aktar (csv)",
"Maintenance_Tool_ImportCSV_noti_text": "CSV dosyasını içe aktarmak istediğinizden emin misiniz? Bu işlem, veritabanınızdaki cihazları tamamen <b>üstünede yazar</b> olacaktır.",
"Maintenance_Tool_ImportCSV_text": "Bu fonksiyonu kullanmadan önce lütfen bir yedek alın. Ağa bağlı cihazlar ve Ağ Düğümleri arasındaki ağ ilişkilerini içeren Cihazlar listesini içeren bir CSV (virgülle ayrılmış değerler) dosyasını içe aktarın. Bunu yapmak için <b>devices.csv</b> adıyla CSV dosyasını <b>/config</b> klasörüne yerleştirin.",
"Maintenance_Tool_ImportConfig_noti": "Ayarları İçe Aktar (app.conf)",
"Maintenance_Tool_ImportPastedCSV": "Cihazları İçe Aktar (csv) (Yapıştırarak)",
"Maintenance_Tool_ImportPastedCSV_noti_text": "Yapıştırılan CSV'yi içe aktarmak istediğinizden emin misiniz? Bu işlem, veritabanınızdaki cihazları tamamen <b>üstünede yazar</b> olacaktır.",
"Maintenance_Tool_ImportPastedCSV_text": "Bu işlevi kullanmadan önce lütfen bir yedekleme yapın. Ağ Düğümleri ve bağlı cihazlar arasındaki Ağ ilişkileri de dahil olmak üzere Cihazların listesini içeren bir CSV (virgülle ayrılmış değer) dosyasını içe aktarın.",
"Maintenance_Tool_ImportPastedConfig": "Ayarları İçe Aktar (yapıştır)",
"Maintenance_Tool_ImportPastedConfig_noti_text": "Yapıştırılan yapılandırma ayarlarını içe aktarmak istediğinizden emin misiniz? Bu tamamen olacak <b>Üzerine</b> bu <code>app.conf</code> dosya.",
"Maintenance_Tool_ImportPastedConfig_text": "İçe aktarır <code>app.conf</code> tüm uygulama Ayarlarını içeren dosya. Güncel olanı indirmek isteyebilirsiniz. <code>app.conf</code> Önce dosya ile <b>Ayarlar Dışa Aktarma</b>.",
"Maintenance_Tool_arpscansw": "arp-Scan arasında geçiş yapın (açık/kapalı)",
"Maintenance_Tool_arpscansw_noti": "arp-Scan'i açma veya kapatma",
"Maintenance_Tool_arpscansw_noti_text": "Tarama kapatıldığında, tekrar etkinleştirilene kadar kapalı kalır.",
"Maintenance_Tool_arpscansw_text": "Arp taramasını açma veya kapatma. Tarama kapatıldığında, tekrar etkinleştirilene kadar kapalı kalır. Etkin taramalar iptal edilmez.",
"Maintenance_Tool_backup": "Veritabanı Yedekleme",
"Maintenance_Tool_backup_noti": "Veritabanı Yedekleme",
"Maintenance_Tool_backup_noti_text": "DB Yedeklemesini yürütmek istediğinizden emin misiniz? Şu anda hiçbir taramanın çalışmadığından emin olun.",
"Maintenance_Tool_backup_text": "Veritabanı yedekleri, veritabanı dizininde, oluşturulma tarihiyle adlandırılan bir zip arşivi olarak bulunur. Maksimum yedekleme sayısı yoktur.",
"Maintenance_Tool_check_visible": "Sütunu gizlemek için işareti kaldırın.",
"Maintenance_Tool_darkmode": "Modları Değiştir (Koyu/Açık)",
"Maintenance_Tool_darkmode_noti": "Modları Aç/Kapat",
"Maintenance_Tool_darkmode_noti_text": "Tema geçişinden sonra sayfa, değişikliği etkinleştirmek için kendini yeniden yüklemeye çalışır. Gerekirse, önbellek temizlenmelidir.",
"Maintenance_Tool_darkmode_text": "Karanlık mod ve aydınlık mod arasında geçiş yapın. Anahtar düzgün çalışmıyorsa, tarayıcı önbelleğini temizlemeyi deneyin. Değişiklik sunucu tarafında gerçekleşir, bu nedenle kullanımdaki tüm cihazları etkiler.",
"Maintenance_Tool_del_ActHistory": "Ağ etkinliğini silme",
"Maintenance_Tool_del_ActHistory_noti": "Ağ etkinliğini sil",
"Maintenance_Tool_del_ActHistory_noti_text": "Ağ etkinliğini sıfırlamak istediğinizden emin misiniz?",
"Maintenance_Tool_del_ActHistory_text": "Ağ etkinliği grafiği sıfırlanır. Bu olayları etkilemez.",
"Maintenance_Tool_del_alldev": "Tüm Cihazları Sil",
"Maintenance_Tool_del_alldev_noti": "",
"Maintenance_Tool_del_alldev_noti": "Silinmiş Cihazlar",
"Maintenance_Tool_del_alldev_noti_text": "Tüm cihazları silmek istediğinize emin misiniz?",
"Maintenance_Tool_del_alldev_text": "",
"Maintenance_Tool_del_allevents": "",
"Maintenance_Tool_del_allevents30": "",
"Maintenance_Tool_del_allevents30_noti": "",
"Maintenance_Tool_del_allevents30_noti_text": "",
"Maintenance_Tool_del_allevents30_text": "",
"Maintenance_Tool_del_allevents_noti": "",
"Maintenance_Tool_del_allevents_noti_text": "",
"Maintenance_Tool_del_allevents_text": "",
"Maintenance_Tool_del_empty_macs": "",
"Maintenance_Tool_del_alldev_text": "Bu işlevi kullanmadan önce lütfen bir yedekleme yapın. Silme işlemi geri alınamaz. Tüm cihazlar veritabanından silinecektir.",
"Maintenance_Tool_del_allevents": "Olayları Sil (Varlığı Sıfırla)",
"Maintenance_Tool_del_allevents30": "30 günden eski tüm Etkinlikleri sil",
"Maintenance_Tool_del_allevents30_noti": "Etkinlikleri Sil",
"Maintenance_Tool_del_allevents30_noti_text": "30 günden eski tüm Etkinlikleri silmek istediğinizden emin misiniz? Bu, tüm Cihazların Varlığını sıfırlar.",
"Maintenance_Tool_del_allevents30_text": "Bu işlevi kullanmadan önce lütfen bir yedekleme yapın. Silme işlemi geri alınamaz. Veritabanında 30 günden daha eski olan tüm olaylar silinecektir. O anda tüm cihazların varlığı sıfırlanacaktır. Bu, geçersiz oturumlara yol açabilir. Bu, cihazların çevrimdışı olmalarına rağmen \"mevcut\" olarak görüntülendiği anlamına gelir. Söz konusu cihaz çevrimiçiyken yapılan bir tarama sorunu çözer.",
"Maintenance_Tool_del_allevents_noti": "Etkinlikleri Sil",
"Maintenance_Tool_del_allevents_noti_text": "Tüm Etkinlikleri silmek istediğinizden emin misiniz? Bu, tüm Cihazların Varlığını sıfırlar.",
"Maintenance_Tool_del_allevents_text": "Bu işlevi kullanmadan önce lütfen bir yedekleme yapın. Silme işlemi geri alınamaz. Veritabanındaki tüm olaylar silinecektir. O anda tüm cihazların varlığı sıfırlanacaktır. Bu, geçersiz oturumlara yol açabilir. Bu, cihazların çevrimdışı olmalarına rağmen \"mevcut\" olarak görüntülendiği anlamına gelir. Söz konusu cihaz çevrimiçiyken yapılan bir tarama sorunu çözer.",
"Maintenance_Tool_del_empty_macs": "Boş MAC'leri olan Aygıtları Silin",
"Maintenance_Tool_del_empty_macs_noti": "Cihazları Sil",
"Maintenance_Tool_del_empty_macs_noti_text": "",
"Maintenance_Tool_del_empty_macs_text": "",
"Maintenance_Tool_del_empty_macs_noti_text": "MAC adresleri boş olan tüm cihazları silmek istediğinizden emin misiniz?<br>(belki arşivlemeyi tercih edersiniz)",
"Maintenance_Tool_del_empty_macs_text": "Bu işlevi kullanmadan önce lütfen bir yedekleme yapın. Silme işlemi geri alınamaz. MAC olmayan tüm cihazlar veritabanından silinecektir.",
"Maintenance_Tool_del_selecteddev": "Seçilmiş cihazları sil",
"Maintenance_Tool_del_selecteddev_text": "",
"Maintenance_Tool_del_selecteddev_text": "Bu işlevi kullanmadan önce lütfen bir yedekleme yapın. Silme işlemi geri alınamaz. Seçilen cihazlar veritabanından silinecektir.",
"Maintenance_Tool_del_unknowndev": "(bilinmeyen) Cihazları Sil",
"Maintenance_Tool_del_unknowndev_noti": "",
"Maintenance_Tool_del_unknowndev_noti_text": "",
"Maintenance_Tool_del_unknowndev_text": "",
"Maintenance_Tool_displayed_columns_text": "",
"Maintenance_Tool_drag_me": "",
"Maintenance_Tool_order_columns_text": "",
"Maintenance_Tool_purgebackup": "",
"Maintenance_Tool_purgebackup_noti": "",
"Maintenance_Tool_purgebackup_noti_text": "",
"Maintenance_Tool_purgebackup_text": "",
"Maintenance_Tool_restore": "",
"Maintenance_Tool_restore_noti": "",
"Maintenance_Tool_restore_noti_text": "",
"Maintenance_Tool_restore_text": "",
"Maintenance_Tool_upgrade_database_noti": "",
"Maintenance_Tool_upgrade_database_noti_text": "",
"Maintenance_Tool_upgrade_database_text": "",
"Maintenance_Tools_Tab_BackupRestore": "",
"Maintenance_Tools_Tab_Logging": "",
"Maintenance_Tool_del_unknowndev_noti": "(Bilinmeyen) Cihazları Sil",
"Maintenance_Tool_del_unknowndev_noti_text": "Tüm (bilinmeyen) ve (ad bulunamadı) cihazları silmek istediğinizden emin misiniz?",
"Maintenance_Tool_del_unknowndev_text": "Bu işlevi kullanmadan önce lütfen bir yedekleme yapın. Silme işlemi geri alınamaz. (Bilinmeyen) adlı tüm cihazlar veritabanından silinecektir.",
"Maintenance_Tool_displayed_columns_text": "Sütunların görünürlüğünü ve sırasını değiştirme <a href=\"devices.php\"><b> <i class=\"fa-laptop\"></i> Aygıtları</b></a> sayfa.",
"Maintenance_Tool_drag_me": "Sütunları yeniden sıralamak için beni sürükleyin.",
"Maintenance_Tool_order_columns_text": "Maintenance_Tool_order_columns_text",
"Maintenance_Tool_purgebackup": "Yedeklemeleri Temizle",
"Maintenance_Tool_purgebackup_noti": "Yedeklemeleri Temizle",
"Maintenance_Tool_purgebackup_noti_text": "Son 3 dışındaki tüm yedeklemeleri silmek istediğinizden emin misiniz?",
"Maintenance_Tool_purgebackup_text": "Son 3 yedekleme dışında diğer tüm yedeklemeler silinecektir.",
"Maintenance_Tool_restore": "Veritabanı Geri Yükleme",
"Maintenance_Tool_restore_noti": "Veritabanı Geri Yükleme",
"Maintenance_Tool_restore_noti_text": "Veritabanı Geri Yükleme'yi yürütmek istediğinizden emin misiniz? Şu anda hiçbir taramanın çalışmadığından emin olun.",
"Maintenance_Tool_restore_text": "En son yedekleme düğme aracılığıyla geri yüklenebilir, ancak eski yedeklemeler yalnızca manuel olarak geri yüklenebilir. Geri yüklemeden sonra, yedekleme oluşturulduğunda veritabanı'nın şu anda yazma erişiminde olması durumunda, güvenlik için veritabanında bir bütünlük kontrolü yapın.",
"Maintenance_Tool_upgrade_database_noti": "Veritabanını yükseltme",
"Maintenance_Tool_upgrade_database_noti_text": "Veritabanını yükseltmek istediğinizden emin misiniz?<br>(belki arşivlemeyi tercih edersiniz)",
"Maintenance_Tool_upgrade_database_text": "Bu düğme, son 12 saatteki Ağ etkinliği grafiğini etkinleştirmek için veritabanını yükseltir. Sorun olması durumunda lütfen veritabanınızı yedekleyin.",
"Maintenance_Tools_Tab_BackupRestore": "Yedekleme / Geri Yükleme",
"Maintenance_Tools_Tab_Logging": "Günlük",
"Maintenance_Tools_Tab_Settings": "Ayarlar",
"Maintenance_Tools_Tab_Tools": "Araçlar",
"Maintenance_Tools_Tab_UISettings": "Arayüz Ayarları",
@@ -443,73 +443,73 @@
"Maintenance_arp_status_on": "tarama(lar) şu anda çalışıyor",
"Maintenance_built_on": "",
"Maintenance_current_version": "",
"Maintenance_database_backup": "",
"Maintenance_database_backup": "Veritabanı Yedeklemeleri",
"Maintenance_database_backup_found": "yedekler bulundu",
"Maintenance_database_backup_total": "",
"Maintenance_database_lastmod": "",
"Maintenance_database_path": "",
"Maintenance_database_rows": "",
"Maintenance_database_size": "",
"Maintenance_database_backup_total": "Toplam disk kullanımı",
"Maintenance_database_lastmod": "Son Değişiklik",
"Maintenance_database_path": "Veritabanı Yolu",
"Maintenance_database_rows": "Tablo (Satırlar)",
"Maintenance_database_size": "Veritabanı Boyutu",
"Maintenance_lang_selector_apply": "Uygula",
"Maintenance_lang_selector_empty": "",
"Maintenance_lang_selector_lable": "",
"Maintenance_lang_selector_text": "",
"Maintenance_lang_selector_empty": "Dil Seçin",
"Maintenance_lang_selector_lable": "Dil seçin",
"Maintenance_lang_selector_text": "Değişiklik istemci tarafında gerçekleşir, bu nedenle yalnızca mevcut tarayıcıyı etkiler.",
"Maintenance_new_version": "",
"Maintenance_themeselector_apply": "Uygula",
"Maintenance_themeselector_empty": "",
"Maintenance_themeselector_lable": "",
"Maintenance_themeselector_text": "",
"Maintenance_version": "",
"NETWORK_DEVICE_TYPES_description": "",
"NETWORK_DEVICE_TYPES_name": "",
"Maintenance_themeselector_empty": "Bir Dış Görünüm Seçin",
"Maintenance_themeselector_lable": "Dış Görünüm Seç",
"Maintenance_themeselector_text": "Değişiklik sunucu tarafında gerçekleşir, bu nedenle kullanımdaki tüm cihazları etkiler.",
"Maintenance_version": "Uygulama güncellemeleri",
"NETWORK_DEVICE_TYPES_description": "Ağ görünümünde hangi aygıt türlerinin ağ aygıtı olarak kullanılmasına izin verildiği. Cihaz tipinin tam olarak eşleşmesi gerekir. <code>Tür</code> Cihaz ayrıntıları'nda belirli bir cihazda ayarlayın. aracılığıyla Cihaza ekleyin <code>+</code> düğme. Mevcut türleri kaldırmayın, yalnızca yenilerini ekleyin.",
"NETWORK_DEVICE_TYPES_name": "Ağ aygıtı türleri",
"Navigation_About": "Hakkında",
"Navigation_AppEvents": "",
"Navigation_AppEvents": "Uygulama Etkinlikleri",
"Navigation_Devices": "Cihazlar",
"Navigation_Donations": "",
"Navigation_Events": "",
"Navigation_Integrations": "",
"Navigation_Maintenance": "",
"Navigation_Monitoring": "",
"Navigation_Network": "",
"Navigation_Donations": "Bağış",
"Navigation_Events": "Olay",
"Navigation_Integrations": "Tümleştirme",
"Navigation_Maintenance": "Bakım",
"Navigation_Monitoring": "Izleme",
"Navigation_Network": "Network",
"Navigation_Notifications": "Bildirimler",
"Navigation_Plugins": "",
"Navigation_Presence": "",
"Navigation_Report": "",
"Navigation_Plugins": "Eklentiler",
"Navigation_Presence": "Varlık",
"Navigation_Report": "Gönderilen Raporlar",
"Navigation_Settings": "Ayarlar",
"Navigation_SystemInfo": "",
"Navigation_Workflows": "",
"Network_Assign": "",
"Navigation_SystemInfo": "Sistem bilgisi",
"Navigation_Workflows": "İş Akışları",
"Network_Assign": "Yukarıdakilere bağlanın <i class=\"fa fa-server\"></i> Ağ düğümü",
"Network_Cant_Assign": "",
"Network_Configuration_Error": "Kurulum Hatası",
"Network_Connected": "Bağlanmış cihazlar",
"Network_ManageAdd": "Cihaz Ekle",
"Network_ManageAdd_Name": "Cihaz İsmi",
"Network_ManageAdd_Name_text": "Özel karakterler olmadan isim veriniz",
"Network_ManageAdd_Port": "",
"Network_ManageAdd_Port_text": "",
"Network_ManageAdd_Port": "Port Sayısı",
"Network_ManageAdd_Port_text": "WiFi ve elektrik hattı için boş bırakın",
"Network_ManageAdd_Submit": "Cihaz Ekle",
"Network_ManageAdd_Type": "",
"Network_ManageAdd_Type_text": "",
"Network_ManageAssign": "",
"Network_ManageDel": "",
"Network_ManageDel_Name": "",
"Network_ManageDel_Name_text": "",
"Network_ManageDel_Submit": "",
"Network_ManageAdd_Type": "Cihaz Türü",
"Network_ManageAdd_Type_text": "-- Tür Seçin --",
"Network_ManageAssign": "Atamak",
"Network_ManageDel": "Cihazı Sil",
"Network_ManageDel_Name": "Silinecek cihaz",
"Network_ManageDel_Name_text": "-- Cihaz Seçiniz --",
"Network_ManageDel_Submit": "Sil",
"Network_ManageDevices": "Cihazları Yönet",
"Network_ManageEdit": "",
"Network_ManageEdit_ID": "",
"Network_ManageEdit_ID_text": "",
"Network_ManageEdit": "Cihazı Güncelle",
"Network_ManageEdit_ID": "Güncellenecek cihaz",
"Network_ManageEdit_ID_text": "-- Düzenlemek için Cihaz Seçin --",
"Network_ManageEdit_Name": "Yeni Cihaz İsmi",
"Network_ManageEdit_Name_text": "",
"Network_ManageEdit_Port": "",
"Network_ManageEdit_Port_text": "",
"Network_ManageEdit_Name_text": "Özel karakterler içermeyen ad",
"Network_ManageEdit_Port": " Yeni Port Sayısı",
"Network_ManageEdit_Port_text": "WiFi ve elektrik hattı için boş bırakın",
"Network_ManageEdit_Submit": "Ayarları Kaydet",
"Network_ManageEdit_Type": "",
"Network_ManageEdit_Type_text": "",
"Network_ManageLeaf": "",
"Network_ManageUnassign": "",
"Network_ManageEdit_Type": "Yeni Cihaz Türü",
"Network_ManageEdit_Type_text": "-- Tür Seçin --",
"Network_ManageLeaf": "Atamayı yönet",
"Network_ManageUnassign": "Atamayı kaldır",
"Network_NoAssignedDevices": "",
"Network_NoDevices": "",
"Network_NoDevices": "Yapılandırılacak cihaz yok",
"Network_Node": "",
"Network_Node_Name": "",
"Network_Parent": "",
@@ -539,12 +539,12 @@
"Plugins_no_control": "",
"Presence_CalHead_day": "gün",
"Presence_CalHead_lang": "",
"Presence_CalHead_month": "",
"Presence_CalHead_month": "ay",
"Presence_CalHead_quarter": "çeyrek",
"Presence_CalHead_week": "hafta",
"Presence_CalHead_year": "yıl",
"Presence_CallHead_Devices": "Cihazlar",
"Presence_Key_OnlineNow": "",
"Presence_Key_OnlineNow": "Şimdi çevrimiçi",
"Presence_Key_OnlineNow_desc": "",
"Presence_Key_OnlinePast": "",
"Presence_Key_OnlinePastMiss": "",
@@ -742,4 +742,4 @@
"settings_update_item_warning": "",
"test_event_icon": "",
"test_event_tooltip": ""
}
}

View File

@@ -334,7 +334,7 @@
"General_icon": "<i class=\"fa fa-gears\"></i>",
"HRS_TO_KEEP_NEWDEV_description": "Це налаштування обслуговування <b>ВИДАЛЕННЯ пристроїв</b>. Якщо ввімкнено (<code>0</code> вимкнено), пристрої, позначені як <b>Новий пристрій</b>, буде видалено, якщо час їхнього <b>першого сеансу</b> був старшим за вказані години в цьому налаштування. Використовуйте це налаштування, якщо ви хочете автоматично видаляти <b>Нові пристрої</b> через <code>X</code> годин.",
"HRS_TO_KEEP_NEWDEV_name": "Видаліть нові пристрої після",
"HRS_TO_KEEP_OFFDEV_description": "Це налаштування обслуговування <b>ВИДАЛЕННЯ пристроїв</b>. Якщо ввімкнути (<code>0</code> вимкнено), пристрої, які <b>офлайн</b> і дата їх <b>останнього вимкнення</b> старші за вказані години в цьому параметрі, будуть бути видалено. Використовуйте це налаштування, якщо ви хочете автоматично видаляти <b>Автономні пристрої</b> після <code>X</code> годин роботи в режимі офлайн.",
"HRS_TO_KEEP_OFFDEV_description": "Це налаштування обслуговування <b>ВИДАЛЕННЯ пристроїв</b>. Якщо ввімкнено (<code>0</code> вимкнено), пристрої, які <b>офлайн</b>, та їх <b>Останнє підключення</b> дата та час старіші за вказані години в цьому налаштуванні, будуть видалені. Використовуйте це налаштування, якщо ви хочете автоматично видаляти <b>офлайн-пристрої</b> після <code>X</code> годин перебування в мережі.",
"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": "Завантажені плагіни",

View File

@@ -1,7 +1,7 @@
{
"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_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_display_name": "API",
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
@@ -742,4 +742,4 @@
"settings_update_item_warning": "更新下面的值。请注意遵循先前的格式。<b>未执行验证。</b>",
"test_event_icon": "",
"test_event_tooltip": "在测试设置之前,请先保存更改。"
}
}

View File

@@ -16,7 +16,8 @@ from plugin_utils import get_plugins_configs
from logger import mylog, Logger
from const import pluginsPath, fullDbPath, logPath
from helper import timeNowTZ, get_setting_value
from notification import write_notification
from messaging.in_app import write_notification
import conf
# Make sure the TIMEZONE for logging is correct

View File

@@ -24,7 +24,7 @@ from plugin_utils import getPluginObject
from plugin_helper import Plugin_Objects
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value, bytes_to_string, sanitize_string, cleanDeviceName
from notification import Notification_obj
from models.notification_instance import NotificationInstance
from database import DB, get_device_stats
pluginName = 'TESTONLY'

View File

@@ -17,7 +17,7 @@ from const import confFileName, logPath
from plugin_helper import Plugin_Objects
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value
from notification import Notification_obj
from models.notification_instance import NotificationInstance
from database import DB
from pytz import timezone
@@ -50,8 +50,8 @@ def main():
# Initialize the Plugin obj output file
plugin_objects = Plugin_Objects(RESULT_FILE)
# Create a Notification_obj instance
notifications = Notification_obj(db)
# Create a NotificationInstance instance
notifications = NotificationInstance(db)
# Retrieve new notifications
new_notifications = notifications.getNew()

View File

@@ -658,7 +658,7 @@
"description": [
{
"language_code": "en_us",
"string": "Email address to which the notification will be send to."
"string": "Email address to which the notification will be send to. You can enter multiple emails separated by a comma (<code>,</code>)."
},
{
"language_code": "es_es",

View File

@@ -24,9 +24,9 @@ sys.path.extend([f"{INSTALL_PATH}/front/plugins", f"{INSTALL_PATH}/server"])
import conf
from const import confFileName, logPath
from plugin_helper import Plugin_Objects
from logger import mylog, Logger, append_line_to_file, print_log
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value, hide_email
from notification import Notification_obj
from models.notification_instance import NotificationInstance
from database import DB
from pytz import timezone
@@ -59,8 +59,8 @@ def main():
# Initialize the Plugin obj output file
plugin_objects = Plugin_Objects(RESULT_FILE)
# Create a Notification_obj instance
notifications = Notification_obj(db)
# Create a NotificationInstance instance
notifications = NotificationInstance(db)
# Retrieve new notifications
new_notifications = notifications.getNew()
@@ -119,44 +119,58 @@ def send(pHTML, pText):
subject, from_email, to_email, message_html, message_text = sanitize_email_content('NetAlertX Report', get_setting_value("SMTP_REPORT_FROM"), get_setting_value("SMTP_REPORT_TO"), pHTML, pText)
# Compose email
msg = MIMEMultipart('alternative')
msg['Subject'] = subject
msg['From'] = from_email
msg['To'] = to_email
msg['Date'] = formatdate(localtime=True)
msg.attach (MIMEText (message_text, 'plain'))
msg.attach (MIMEText (message_html, 'html'))
# Set a timeout for the SMTP connection (in seconds)
smtp_timeout = 30
mylog('debug', ['Trying to open connection to ' + str(get_setting_value('SMTP_SERVER')) + ':' + str(get_setting_value('SMTP_PORT'))])
if get_setting_value("LOG_LEVEL") == 'debug':
send_email(msg,smtp_timeout)
emails = []
# handle multiple emails
if ',' in to_email:
emails = to_email.split(',')
else:
emails.append(to_email)
mylog('debug', [f'[{pluginName}] Sending emails to {emails}'])
for mail_addr in emails:
mail_addr = mail_addr.strip()
# Compose email
msg = MIMEMultipart('alternative')
msg['Subject'] = subject
msg['From'] = from_email
msg['To'] = mail_addr
msg['Date'] = formatdate(localtime=True)
msg.attach (MIMEText (message_text, 'plain'))
msg.attach (MIMEText (message_html, 'html'))
# Set a timeout for the SMTP connection (in seconds)
smtp_timeout = 30
mylog('debug', ['Trying to open connection to ' + str(get_setting_value('SMTP_SERVER')) + ':' + str(get_setting_value('SMTP_PORT'))])
if get_setting_value("LOG_LEVEL") == 'debug':
try:
send_email(msg,smtp_timeout)
except smtplib.SMTPAuthenticationError as e:
mylog('none', [' ERROR: Couldn\'t connect to the SMTP server (SMTPAuthenticationError)'])
mylog('none', [' ERROR: Double-check your SMTP_USER and SMTP_PASS settings.)'])
mylog('none', [' ERROR: ', str(e)])
except smtplib.SMTPServerDisconnected as e:
mylog('none', [' ERROR: Couldn\'t connect to the SMTP server (SMTPServerDisconnected)'])
mylog('none', [' ERROR: ', str(e)])
except socket.gaierror as e:
mylog('none', [' ERROR: Could not resolve hostname (socket.gaierror)'])
mylog('none', [' ERROR: ', str(e)])
except ssl.SSLError as e:
mylog('none', [' ERROR: Could not establish SSL connection (ssl.SSLError)'])
mylog('none', [' ERROR: Are you sure you need SMTP_FORCE_SSL enabled? Check your SMTP provider docs.'])
mylog('none', [' ERROR: ', str(e)])
else:
try:
send_email(msg,smtp_timeout)
except smtplib.SMTPAuthenticationError as e:
mylog('none', [' ERROR: Couldn\'t connect to the SMTP server (SMTPAuthenticationError)'])
mylog('none', [' ERROR: Double-check your SMTP_USER and SMTP_PASS settings.)'])
mylog('none', [' ERROR: ', str(e)])
except smtplib.SMTPServerDisconnected as e:
mylog('none', [' ERROR: Couldn\'t connect to the SMTP server (SMTPServerDisconnected)'])
mylog('none', [' ERROR: ', str(e)])
except socket.gaierror as e:
mylog('none', [' ERROR: Could not resolve hostname (socket.gaierror)'])
mylog('none', [' ERROR: ', str(e)])
except ssl.SSLError as e:
mylog('none', [' ERROR: Could not establish SSL connection (ssl.SSLError)'])
mylog('none', [' ERROR: Are you sure you need SMTP_FORCE_SSL enabled? Check your SMTP provider docs.'])
mylog('none', [' ERROR: ', str(e)])
# ----------------------------------------------------------------------------------
def send_email(msg,smtp_timeout):

View File

@@ -28,7 +28,7 @@ from plugin_utils import getPluginObject
from plugin_helper import Plugin_Objects
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value, bytes_to_string, sanitize_string, normalize_string
from notification import Notification_obj
from models.notification_instance import NotificationInstance
from database import DB, get_device_stats
from pytz import timezone
@@ -467,6 +467,7 @@ def mqtt_start(db):
devJson = {
"last_ip": device["devLastIP"],
"is_new": str(device["devIsNew"]),
"alert_down": str(device["devAlertDown"]),
"vendor": sanitize_string(device["devVendor"]),
"mac_address": str(device["devMac"]),
"model": devDisplayName,

View File

@@ -20,7 +20,7 @@ from const import confFileName, logPath
from plugin_helper import Plugin_Objects, handleEmpty
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value
from notification import Notification_obj
from models.notification_instance import NotificationInstance
from database import DB
from pytz import timezone
@@ -53,8 +53,8 @@ def main():
# Initialize the Plugin obj output file
plugin_objects = Plugin_Objects(RESULT_FILE)
# Create a Notification_obj instance
notifications = Notification_obj(db)
# Create a NotificationInstance instance
notifications = NotificationInstance(db)
# Retrieve new notifications
new_notifications = notifications.getNew()

View File

@@ -12,7 +12,7 @@ sys.path.extend([f"{INSTALL_PATH}/front/plugins", f"{INSTALL_PATH}/server"])
from plugin_helper import Plugin_Objects, handleEmpty # noqa: E402
from logger import mylog, Logger # noqa: E402
from helper import timeNowTZ, get_setting_value, hide_string # noqa: E402
from notification import Notification_obj # noqa: E402
from models.notification_instance import NotificationInstance # noqa: E402
from database import DB # noqa: E402
import conf
from const import confFileName, logPath
@@ -49,8 +49,8 @@ def main():
# Initialize the Plugin obj output file
plugin_objects = Plugin_Objects(RESULT_FILE)
# Create a Notification_obj instance
notifications = Notification_obj(db)
# Create a NotificationInstance instance
notifications = NotificationInstance(db)
# Retrieve new notifications
new_notifications = notifications.getNew()

View File

@@ -20,7 +20,7 @@ from const import confFileName, logPath
from plugin_helper import Plugin_Objects, handleEmpty
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value, hide_string
from notification import Notification_obj
from models.notification_instance import NotificationInstance
from database import DB
from pytz import timezone
@@ -53,8 +53,8 @@ def main():
# Initialize the Plugin obj output file
plugin_objects = Plugin_Objects(RESULT_FILE)
# Create a Notification_obj instance
notifications = Notification_obj(db)
# Create a NotificationInstance instance
notifications = NotificationInstance(db)
# Retrieve new notifications
new_notifications = notifications.getNew()

View File

@@ -17,7 +17,7 @@ from const import confFileName, logPath
from plugin_helper import Plugin_Objects
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value
from notification import Notification_obj
from models.notification_instance import NotificationInstance
from database import DB
from pytz import timezone
@@ -51,8 +51,8 @@ def main():
# Initialize the Plugin obj output file
plugin_objects = Plugin_Objects(RESULT_FILE)
# Create a Notification_obj instance
notifications = Notification_obj(db)
# Create a NotificationInstance instance
notifications = NotificationInstance(db)
# Retrieve new notifications
new_notifications = notifications.getNew()

View File

@@ -23,7 +23,7 @@ from const import logPath, confFileName
from plugin_helper import Plugin_Objects, handleEmpty
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value, hide_string, write_file
from notification import Notification_obj
from models.notification_instance import NotificationInstance
from database import DB
from pytz import timezone
@@ -56,8 +56,8 @@ def main():
# Initialize the Plugin obj output file
plugin_objects = Plugin_Objects(RESULT_FILE)
# Create a Notification_obj instance
notifications = Notification_obj(db)
# Create a NotificationInstance instance
notifications = NotificationInstance(db)
# Retrieve new notifications
new_notifications = notifications.getNew()

View File

@@ -16,7 +16,7 @@ from plugin_utils import get_plugins_configs
from logger import mylog, Logger
from const import pluginsPath, fullDbPath, logPath
from helper import timeNowTZ, get_setting_value
from notification import write_notification
from messaging.in_app import write_notification
from database import DB
from models.device_instance import DeviceInstance
import conf

View File

@@ -25,7 +25,7 @@ from plugin_utils import get_plugins_configs
from logger import mylog, Logger
from const import pluginsPath, fullDbPath, logPath
from helper import timeNowTZ, get_setting_value
from notification import write_notification
from messaging.in_app import write_notification
import conf
# Make sure the TIMEZONE for logging is correct

View File

@@ -19,7 +19,7 @@ from plugin_utils import get_plugins_configs
from logger import mylog, Logger
from const import pluginsPath, fullDbPath, logPath
from helper import timeNowTZ, get_setting_value
from notification import write_notification
from messaging.in_app import write_notification
import conf
# Make sure the TIMEZONE for logging is correct

View File

@@ -243,6 +243,34 @@
"string": "How many last <code>app.log</code> lines to keep. If <code>LOG_LEVEL</code> is set to <code>debug</code> the app generates about 10000 lines per hour, so when debugging an issue the recommended setting should cover the bug occurence timeframe. For example for a bug with a 3 day periodical appearence the value <code>1000000</code> should be sufficient. Setting this value to <code>1000000</code> generates approximatelly a 50MB <code>app.log</code> file. Set to <code>0</code> to disable log purging."
}
]
},
{
"function": "NOTI_LENGTH",
"type": {
"dataType": "integer",
"elements": [
{
"elementType": "input",
"elementOptions": [{ "type": "number" }],
"transformers": []
}
]
},
"default_value": 0,
"options": [],
"localized": ["name", "description"],
"name": [
{
"language_code": "en_us",
"string": "Notifications history"
}
],
"description": [
{
"language_code": "en_us",
"string": "How many latest in-app Notification entries to keep. Set to <code>0</code> to disable."
}
]
}
],

View File

@@ -19,6 +19,7 @@ from plugin_helper import Plugin_Object, Plugin_Objects, decodeBase64
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value
from const import logPath, applicationPath
from messaging.in_app import remove_old
import conf
from pytz import timezone
@@ -41,6 +42,7 @@ def main():
mylog('verbose', [f'[{pluginName}] In script'])
MAINT_LOG_LENGTH = int(get_setting_value('MAINT_LOG_LENGTH'))
MAINT_NOTI_LENGTH = int(get_setting_value('MAINT_NOTI_LENGTH'))
# Check if set
if MAINT_LOG_LENGTH != 0:
@@ -63,7 +65,10 @@ def main():
mylog('verbose', [f'[{pluginName}] Cleanup finished'])
# Check if set
if MAINT_NOTI_LENGTH != 0:
mylog('verbose', [f'[{pluginName}] Cleaning in-app notification history'])
remove_old(MAINT_NOTI_LENGTH)
return 0

View File

@@ -16,7 +16,7 @@ from plugin_utils import get_plugins_configs
from logger import mylog, Logger
from const import pluginsPath, fullDbPath, logPath
from helper import timeNowTZ, get_setting_value
from notification import write_notification
from messaging.in_app import write_notification
from database import DB
from models.device_instance import DeviceInstance
import conf

View File

@@ -969,13 +969,13 @@
"name": [
{
"language_code": "en_us",
"string": "Last Connection"
"string": "Last Seen"
}
],
"description": [
{
"language_code": "en_us",
"string": "The date and time of the last connection with the device. Uneditable - Autodetected."
"string": "The date and time of the last seen connection with the device. Uneditable - Autodetected."
}
]
},
@@ -1150,7 +1150,7 @@
"description": [
{
"language_code": "en_us",
"string": "Indicates whether an alert should be triggered when the device goes down. The device has to be down for longet than the time set in the <b>Alert Down After</b> <code>NTFPRCS_alert_down_time</code> setting."
"string": "Indicates whether an alert should be triggered when the device goes down. The device has to be down for longer than the time set in the <b>Alert Down After</b> <code>NTFPRCS_alert_down_time</code> setting."
}
]
},
@@ -1633,4 +1633,4 @@
],
"required": [],
"additionalProperties": false
}
}

View File

@@ -2,10 +2,6 @@
This plugin scans your network for open ports. Only IPs are scanned that are accessible by the app container.
### Usage
- TBD
### Notes
- N/A
![Screenshot](nmap_ports_services.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

View File

@@ -45,7 +45,7 @@ from plugin_utils import get_plugins_configs
from logger import mylog, Logger
from const import pluginsPath, fullDbPath, logPath
from helper import timeNowTZ, get_setting_value
from notification import write_notification
from messaging.in_app import write_notification
from pytz import timezone
import conf

View File

@@ -20,7 +20,7 @@ from logger import mylog, Logger
from const import pluginsPath, fullDbPath, logPath
from helper import timeNowTZ, get_setting_value
from crypto_utils import encrypt_data
from notification import write_notification
from messaging.in_app import write_notification
import conf
from pytz import timezone

View File

@@ -17,7 +17,7 @@ from plugin_utils import get_plugins_configs
from logger import mylog, Logger
from const import pluginsPath, fullDbPath, logPath
from helper import timeNowTZ, get_setting_value
from notification import write_notification
from messaging.in_app import write_notification
from database import DB
from models.device_instance import DeviceInstance
import conf

View File

@@ -45,7 +45,8 @@
{
"name": "urls",
"type": "setting",
"value": "WEBMON_urls_to_check"
"value": "WEBMON_urls_to_check",
"timeoutMultiplier": true
}
],
"database_column_definitions": [

View File

@@ -50,17 +50,34 @@ def main():
return
def check_services_health(site):
mylog('verbose', [f'[{pluginName}] Checking {site}'])
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
try:
resp = requests.get(site, verify=False, timeout=10)
resp = requests.get(site, verify=False, timeout=get_setting_value('WEBMON_RUN_TIMEOUT'))
latency = resp.elapsed.total_seconds()
status = resp.status_code
except requests.exceptions.SSLError:
status = 503
except SSLError:
status = 495 # SSL Certificate Error (non-standard, but more meaningful than 503)
latency = 99999
except:
status = 503
mylog('debug', [f'[{pluginName}] SSL error while checking {site}'])
except Timeout:
status = 504 # Gateway Timeout
latency = 99999
mylog('debug', [f'[{pluginName}] Timeout while checking {site}'])
except RequestException as e:
status = 520 # Web server is returning an unknown error (Cloudflare-style)
latency = 99999
mylog('debug', [f'[{pluginName}] Request error while checking {site}: {e}'])
except Exception as e:
status = 500 # Internal Server Error (fallback)
latency = 99999
mylog('debug', [f'[{pluginName}] Unexpected error while checking {site}: {e}'])
mylog('verbose', [f'[{pluginName}] Result for {site} (status|latency) : {status}|{latency}'])
return status, latency
def service_monitoring(urls, plugin_objects):

View File

@@ -324,8 +324,15 @@ function initializeCalendar () {
},
eventRender: function (event, element, view) {
$(element).tooltip({container: 'body', placement: 'bottom', title: event.tooltip});
// element.attr ('title', event.tooltip); // Alternative tooltip
// $(element).tooltip({container: 'body', placement: 'bottom', title: event.tooltip});
tltp = event.tooltip.replace('\n',' | ')
element.attr ('title', tltp); // Alternative tooltip
},
eventClick: function(info) {
console.log(info);
},
loading: function( isLoading, view ) {

View File

@@ -15,7 +15,7 @@
<tr>
<td bgcolor=#3c8dbc align=center style="padding: 20px 10px 10px 10px; font-size: 20px; color:#ffffff; border-top-right-radius: 5px; border-top-left-radius: 5px; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2)">
<img src="https://netalertx.com/NetAlertX_logo.png" alt="NetAlertX Logo" style="vertical-align: middle; margin-top:-6px" width="32" height="32" />
Net<b>Alert</b><sup>x</sup>
<span style="padding: 0px 0px 0px 0px;">Net<b>Alert</b><sup>x</sup></span>
</td>
</tr>
<tr>

View File

@@ -78,6 +78,9 @@ require 'php/templates/header.php';
if (result.includes("+")) { // Check if timezone offset is present
result = result.split('+')[0]; // Remove timezone offset
}
result = localizeTimestamp(result);
return result;
}
},

View File

@@ -30,5 +30,5 @@ source myenv/bin/activate
update-alternatives --install /usr/bin/python python /usr/bin/python3 10
# install packages thru pip3
pip3 install openwrt-luci-rpc asusrouter asyncio aiohttp graphene flask tplink-omada-client wakeonlan pycryptodome requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython librouteros git+https://github.com/foreign-sub/aiofreepybox.git
pip3 install openwrt-luci-rpc asusrouter asyncio aiohttp graphene flask tplink-omada-client wakeonlan pycryptodome requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython librouteros yattag git+https://github.com/foreign-sub/aiofreepybox.git

View File

@@ -43,6 +43,7 @@ nav:
- Reverse Proxy: REVERSE_PROXY.md
- Webhooks (n8n): WEBHOOK_N8N.md
- Workflows: WORKFLOWS.md
- Docker Swarm: DOCKER_SWARM.md
- Help:
- Common issues: COMMON_ISSUES.md
- Random MAC: RANDOM_MAC.md

View File

@@ -31,9 +31,9 @@ from api import update_api
from scan.session_events import process_scan
from initialise import importConfigs
from database import DB
from reporting import get_notifications
from notification import Notification_obj
from plugin import run_plugin_scripts, check_and_run_user_event
from messaging.reporting import get_notifications
from models.notification_instance import NotificationInstance
from plugin import plugin_manager
from scan.device_handling import update_devices_names
from workflows.manager import WorkflowManager
@@ -96,6 +96,9 @@ def main ():
# re-load user configuration and plugins
all_plugins, imported = importConfigs(db, all_plugins)
# initiate plugin manager
pm = plugin_manager(db, all_plugins)
# update time started
conf.loop_start_time = timeNowTZ()
@@ -103,11 +106,11 @@ def main ():
# Handle plugins executed ONCE
if conf.plugins_once_run == False:
run_plugin_scripts(db, all_plugins, 'once')
pm.run_plugin_scripts('once')
conf.plugins_once_run = True
# check if user is waiting for api_update
check_and_run_user_event(db, all_plugins)
pm.check_and_run_user_event()
# Update API endpoints
update_api(db, all_plugins, False)
@@ -126,13 +129,13 @@ def main ():
startTime = startTime.replace (microsecond=0)
# Check if any plugins need to run on schedule
run_plugin_scripts(db, all_plugins, 'schedule')
pm.run_plugin_scripts('schedule')
# determine run/scan type based on passed time
# --------------------------------------------
# Runs plugin scripts which are set to run every time after a scans finished
run_plugin_scripts(db, all_plugins, 'always_after_scan')
pm.run_plugin_scripts('always_after_scan')
# process all the scanned data into new devices
processScan = updateState("Check scan").processScan
@@ -146,7 +149,7 @@ def main ():
# --------
# Reporting
# run plugins before notification processing (e.g. Plugins to discover device names)
run_plugin_scripts(db, all_plugins, 'before_name_updates')
pm.run_plugin_scripts('before_name_updates')
# Resolve devices names
mylog('debug','[Main] Resolve devices names')
@@ -160,7 +163,7 @@ def main ():
# new devices were found
if len(newDevices) > 0:
# run all plugins registered to be run when new devices are found
run_plugin_scripts(db, all_plugins, 'on_new_device')
pm.run_plugin_scripts('on_new_device')
# Notification handling
# ----------------------------------------
@@ -169,13 +172,13 @@ def main ():
final_json = get_notifications(db)
# Write the notifications into the DB
notification = Notification_obj(db)
notification = NotificationInstance(db)
notificationObj = notification.create(final_json, "")
# run all enabled publisher gateways
if notificationObj.HasNotifications:
run_plugin_scripts(db, all_plugins, 'on_notification')
pm.run_plugin_scripts('on_notification')
notification.setAllProcessed()
notification.clearPendingEmailFlag()

View File

@@ -9,8 +9,8 @@ from const import (apiPath, sql_appevents, sql_devices_all, sql_events_pending_a
from logger import mylog
from helper import write_file, get_setting_value, timeNowTZ
from app_state import updateState
from user_events_queue import UserEventsQueue
from notification import write_notification
from models.user_events_queue_instance import UserEventsQueueInstance
from messaging.in_app import write_notification
# Import the start_server function
from graphql_server.graphql_server_start import start_server
@@ -147,7 +147,7 @@ class api_endpoint_class:
# Update user event execution log
# mylog('verbose', [f'[API] api_endpoint_class: is_ad_hoc_user_event {self.is_ad_hoc_user_event}'])
if self.is_ad_hoc_user_event:
execution_log = UserEventsQueue()
execution_log = UserEventsQueueInstance()
execution_log.finalize_event("update_api")
self.is_ad_hoc_user_event = False

View File

@@ -120,12 +120,10 @@ class Query(ObjectType):
device["devIsRandomMac"] = 1 if is_random_mac(device["devMac"]) else 0
device["devParentChildrenCount"] = get_number_of_children(device["devMac"], devices_data)
device["devIpLong"] = format_ip_long(device.get("devLastIP", ""))
mylog('verbose', f'[graphql_schema] devices_data: {devices_data}')
# Apply sorting if options are provided
if options:

View File

@@ -11,7 +11,7 @@ sys.path.extend([f"{INSTALL_PATH}/server"])
from logger import mylog
from helper import get_setting_value, timeNowTZ
from app_state import updateState
from notification import write_notification
from messaging.in_app import write_notification
# Flask application
app = Flask(__name__)

View File

@@ -17,9 +17,9 @@ from app_state import updateState
from logger import mylog
from api import update_api
from scheduler import schedule_class
from plugin import print_plugin_info, run_plugin_scripts
from plugin import plugin_manager, print_plugin_info
from plugin_utils import get_plugins_configs, get_set_value_for_init
from notification import write_notification
from messaging.in_app import write_notification
from crypto_utils import get_random_bytes
#===============================================================================
@@ -402,7 +402,8 @@ def importConfigs (db, all_plugins):
update_api(db, all_plugins, True, ["settings"])
# run plugins that are modifying the config
run_plugin_scripts(db, all_plugins, 'before_config_save' )
pm = plugin_manager(db, all_plugins)
pm.run_plugin_scripts('before_config_save')
# Used to determine the next import
conf.lastImportedConfFile = os.path.getmtime(config_file)

View File

@@ -45,10 +45,11 @@ reqLvl = 0
#-------------------------------------------------------------------------------
class Logger:
def __init__(self, LOG_LEVEL='verbose'):
def __init__(self, LOG_LEVEL):
global currentLevel
currentLevel = LOG_LEVEL
conf.LOG_LEVEL = currentLevel
# Automatically set up custom logging handler
self.setup_logging()
@@ -89,7 +90,7 @@ def mylog(requestedDebugLevel, n):
reqLvl = lvl[1]
if reqLvl <= setLvl:
file_print (*n)
file_print (*n)
#-------------------------------------------------------------------------------
# Queue for log messages
@@ -138,18 +139,6 @@ def file_print(*args):
# Ensure the log writer thread is running
start_log_writer_thread()
#-------------------------------------------------------------------------------
def print_log(pText):
# Check if logging is active
if not conf.LOG_LEVEL == 'debug':
return
# Current Time
log_timestamp2 = datetime.datetime.now(conf.tz).replace(microsecond=0)
# Print line + time + text
file_print('[LOG_LEVEL=debug]', log_timestamp2.strftime('%H:%M:%S'), pText)
return pText
#-------------------------------------------------------------------------------
def append_file_binary(file_path, input_data):

105
server/messaging/in_app.py Executable file
View File

@@ -0,0 +1,105 @@
import datetime
import os
import sys
import _io
import json
import uuid
import socket
import subprocess
import requests
from yattag import indent
from json2table import convert
# Register NetAlertX directories
INSTALL_PATH="/app"
sys.path.extend([f"{INSTALL_PATH}/server"])
# Register NetAlertX modules
import conf
from const import applicationPath, logPath, apiPath, confFileName, reportTemplatesPath
from logger import logResult, mylog
from helper import generate_mac_links, removeDuplicateNewLines, timeNowTZ, get_file_content, write_file, get_setting_value, get_timezone_offset
NOTIFICATION_API_FILE = apiPath + 'user_notifications.json'
# Show Frontend User Notification
def write_notification(content, level, timestamp):
# Generate GUID
guid = str(uuid.uuid4())
# Prepare notification dictionary
notification = {
'timestamp': str(timestamp),
'guid': guid,
'read': 0,
'level': level,
'content': content
}
# If file exists, load existing data, otherwise initialize as empty list
if os.path.exists(NOTIFICATION_API_FILE):
with open(NOTIFICATION_API_FILE, 'r') as file:
# Check if the file object is of type _io.TextIOWrapper
if isinstance(file, _io.TextIOWrapper):
file_contents = file.read() # Read file contents
if file_contents == '':
file_contents = '[]' # If file is empty, initialize as empty list
# mylog('debug', ['[Notification] User Notifications file: ', file_contents])
notifications = json.loads(file_contents) # Parse JSON data
else:
mylog('none', '[Notification] File is not of type _io.TextIOWrapper')
notifications = []
else:
notifications = []
# Append new notification
notifications.append(notification)
# Write updated data back to file
with open(NOTIFICATION_API_FILE, 'w') as file:
json.dump(notifications, file, indent=4)
# Trim notifications
def remove_old(keepNumberOfEntries):
# Check if file exists
if not os.path.exists(NOTIFICATION_API_FILE):
mylog('info', '[Notification] No notifications file to clean.')
return
# Load existing notifications
try:
with open(NOTIFICATION_API_FILE, 'r') as file:
file_contents = file.read().strip()
if file_contents == '':
notifications = []
else:
notifications = json.loads(file_contents)
except Exception as e:
mylog('none', f'[Notification] Error reading notifications file: {e}')
return
if not isinstance(notifications, list):
mylog('none', '[Notification] Invalid format: not a list')
return
# Sort by timestamp descending
try:
notifications.sort(key=lambda x: x['timestamp'], reverse=True)
except KeyError:
mylog('none', '[Notification] Missing timestamp in one or more entries')
return
# Trim to the latest entries
trimmed = notifications[:keepNumberOfEntries]
# Write back the trimmed list
try:
with open(NOTIFICATION_API_FILE, 'w') as file:
json.dump(trimmed, file, indent=4)
mylog('verbose', f'[Notification] Trimmed notifications to latest {keepNumberOfEntries}')
except Exception as e:
mylog('none', f'Error writing trimmed notifications file: {e}')

View File

@@ -12,12 +12,16 @@
import datetime
import json
import sys
# Register NetAlertX directories
INSTALL_PATH="/app"
sys.path.extend([f"{INSTALL_PATH}/server"])
import conf
from const import applicationPath, logPath, apiPath, confFileName
from helper import timeNowTZ, get_file_content, write_file, get_timezone_offset, get_setting_value
from logger import logResult, mylog, print_log
from logger import logResult, mylog
#===============================================================================
# REPORTING

View File

@@ -4,7 +4,7 @@ import sys
INSTALL_PATH="/app"
sys.path.extend([f"{INSTALL_PATH}/server"])
from logger import mylog, print_log
from logger import mylog
#-------------------------------------------------------------------------------
# Device object handling (WIP)

View File

@@ -2,22 +2,30 @@ import datetime
import os
import _io
import json
import sys
import uuid
import socket
import subprocess
import requests
from yattag import indent
from json2table import convert
# Register NetAlertX directories
INSTALL_PATH="/app"
sys.path.extend([f"{INSTALL_PATH}/server"])
# Register NetAlertX modules
import conf
from const import applicationPath, logPath, apiPath, confFileName, reportTemplatesPath
from logger import logResult, mylog, print_log
from logger import logResult, mylog
from helper import generate_mac_links, removeDuplicateNewLines, timeNowTZ, get_file_content, write_file, get_setting_value, get_timezone_offset
from messaging.in_app import write_notification
#-------------------------------------------------------------------------------
# Notification object handling
#-------------------------------------------------------------------------------
class Notification_obj:
class NotificationInstance:
def __init__(self, db):
self.db = db
@@ -172,9 +180,16 @@ class Notification_obj:
final_text = removeDuplicateNewLines(mail_text)
# Create clickable MAC links
final_html = generate_mac_links (mail_html, conf.REPORT_DASHBOARD_URL + '/deviceDetails.php?mac=')
mail_html = generate_mac_links (mail_html, conf.REPORT_DASHBOARD_URL + '/deviceDetails.php?mac=')
send_api(self.JSON, mail_text, mail_html)
final_html = indent(
mail_html,
indentation = ' ',
newline = '\r\n',
indent_text = True
)
send_api(self.JSON, final_text, final_html)
# Write output data for debug
write_file (logPath + '/report_output.txt', final_text)
@@ -282,45 +297,7 @@ class Notification_obj:
# Reporting
#-------------------------------------------------------------------------------
# Handle Frontend User Notifications
def write_notification(content, level, timestamp):
NOTIFICATION_API_FILE = apiPath + 'user_notifications.json'
# Generate GUID
guid = str(uuid.uuid4())
# Prepare notification dictionary
notification = {
'timestamp': str(timestamp),
'guid': guid,
'read': 0,
'level': level,
'content': content
}
# If file exists, load existing data, otherwise initialize as empty list
if os.path.exists(NOTIFICATION_API_FILE):
with open(NOTIFICATION_API_FILE, 'r') as file:
# Check if the file object is of type _io.TextIOWrapper
if isinstance(file, _io.TextIOWrapper):
file_contents = file.read() # Read file contents
if file_contents == '':
file_contents = '[]' # If file is empty, initialize as empty list
# mylog('debug', ['[Notification] User Notifications file: ', file_contents])
notifications = json.loads(file_contents) # Parse JSON data
else:
mylog('error', 'File is not of type _io.TextIOWrapper')
notifications = []
else:
notifications = []
# Append new notification
notifications.append(notification)
# Write updated data back to file
with open(NOTIFICATION_API_FILE, 'w') as file:
json.dump(notifications, file, indent=4)
#-------------------------------------------------------------------------------
def construct_notifications(JSON, section):

View File

@@ -4,7 +4,7 @@ import sys
INSTALL_PATH="/app"
sys.path.extend([f"{INSTALL_PATH}/server"])
from logger import mylog, print_log
from logger import mylog
#-------------------------------------------------------------------------------
# Plugin object handling (WIP)

View File

@@ -1,10 +1,15 @@
import os
import sys
# Register NetAlertX directories
INSTALL_PATH="/app"
sys.path.extend([f"{INSTALL_PATH}/server"])
# Register NetAlertX modules
from const import pluginsPath, logPath, applicationPath, reportTemplatesPath
from logger import mylog
class UserEventsQueue:
class UserEventsQueueInstance:
"""
Handles the execution queue log file, allowing reading, writing,
and removing processed events.
@@ -30,7 +35,7 @@ class UserEventsQueue:
Returns an empty list if the file doesn't exist.
"""
if not os.path.exists(self.log_file):
mylog('none', ['[UserEventsQueue] Log file not found: ', self.log_file])
mylog('none', ['[UserEventsQueueInstance] Log file not found: ', self.log_file])
return [] # No log file, return empty list
with open(self.log_file, "r") as file:
return file.readlines()
@@ -72,7 +77,7 @@ class UserEventsQueue:
self.write_log(updated_lines)
mylog('minimal', ['[UserEventsQueue] Processed event: ', event])
mylog('minimal', ['[UserEventsQueueInstance] Processed event: ', event])
return removed

View File

@@ -16,12 +16,154 @@ from helper import timeNowTZ, get_file_content, write_file, get_setting, get_set
from app_state import updateState
from api import update_api
from plugin_utils import logEventStatusCounts, get_plugin_string, get_plugin_setting_obj, print_plugin_info, list_to_csv, combine_plugin_objects, resolve_wildcards_arr, handle_empty, custom_plugin_decoder, decode_and_rename_files
from notification import Notification_obj, write_notification
from user_events_queue import UserEventsQueue
from models.notification_instance import NotificationInstance
from messaging.in_app import write_notification
from models.user_events_queue_instance import UserEventsQueueInstance
from crypto_utils import generate_deterministic_guid
# Make sure log level is initialized correctly
Logger(get_setting_value('LOG_LEVEL'))
#-------------------------------------------------------------------------------
class plugin_manager:
def __init__(self, db, all_plugins):
self.db = db
self.all_plugins = all_plugins
# Make sure log level is initialized correctly
Logger(get_setting_value('LOG_LEVEL'))
#-------------------------------------------------------------------------------
def run_plugin_scripts(self, runType):
# Header
updateState("Run: Plugins")
mylog('debug', ['[Plugins] Check if any plugins need to be executed on run type: ', runType])
for plugin in self.all_plugins:
shouldRun = False
prefix = plugin["unique_prefix"]
set = get_plugin_setting_obj(plugin, "RUN")
# mylog('debug', [f'[run_plugin_scripts] plugin: {plugin}'])
# mylog('debug', [f'[run_plugin_scripts] set: {set}'])
if set != None and set['value'] == runType:
if runType != "schedule":
shouldRun = True
elif runType == "schedule":
# run if overdue scheduled time
# check schedules if any contains a unique plugin prefix matching the current plugin
for schd in conf.mySchedules:
if schd.service == prefix:
# Check if schedule overdue
shouldRun = schd.runScheduleCheck()
if shouldRun:
# Header
updateState(f"Plugin: {prefix}")
print_plugin_info(plugin, ['display_name'])
mylog('debug', ['[Plugins] CMD: ', get_plugin_setting_obj(plugin, "CMD")["value"]])
execute_plugin(self.db, self.all_plugins, plugin)
# update last run time
if runType == "schedule":
for schd in conf.mySchedules:
if schd.service == prefix:
# note the last time the scheduled plugin run was executed
schd.last_run = timeNowTZ()
#===============================================================================
# Handling of user initialized front-end events
#===============================================================================
def check_and_run_user_event(self):
"""
Process user events from the execution queue log file and notify the user about executed events.
"""
execution_log = UserEventsQueueInstance()
# Track whether to show notification for executed events
executed_events = []
# Read the log file to get the lines
lines = execution_log.read_log()
if not lines:
mylog('debug', ['[check_and_run_user_event] User Execution Queue is empty'])
return # Exit early if the log file is empty
else:
mylog('debug', ['[check_and_run_user_event] Process User Execution Queue:' + ', '.join(map(str, lines))])
for line in lines:
# Extract event name and parameters from the log line
columns = line.strip().split('|')[2:4]
event, param = "", ""
if len(columns) == 2:
event, param = columns
# Process each event type
if event == 'test':
self.handle_test(param)
executed_events.append(f"test with param {param}")
execution_log.finalize_event("test")
elif event == 'run':
self.handle_run(param)
executed_events.append(f"run with param {param}")
execution_log.finalize_event("run")
elif event == 'update_api':
# async handling
update_api(self.db, self.all_plugins, False, param.split(','), True)
else:
mylog('minimal', ['[check_and_run_user_event] WARNING: Unhandled event in execution queue: ', event, ' | ', param])
execution_log.finalize_event(event) # Finalize unknown events to remove them
# Notify user about executed events (if applicable)
if len(executed_events) > 0 and executed_events:
executed_events_message = ', '.join(executed_events)
mylog('minimal', ['[check_and_run_user_event] INFO: Executed events: ', executed_events_message])
write_notification(f"[Ad-hoc events] Events executed: {executed_events_message}", "interrupt", timeNowTZ())
return
#-------------------------------------------------------------------------------
def handle_run(self, runType):
mylog('minimal', ['[', timeNowTZ(), '] START Run: ', runType])
# run the plugin to run
for plugin in self.all_plugins:
if plugin["unique_prefix"] == runType:
execute_plugin(self.db, self.all_plugins, plugin)
mylog('minimal', ['[', timeNowTZ(), '] END Run: ', runType])
return
#-------------------------------------------------------------------------------
def handle_test(self, runType):
mylog('minimal', ['[', timeNowTZ(), '] [Test] START Test: ', runType])
# Prepare test samples
sample_json = json.loads(get_file_content(reportTemplatesPath + 'webhook_json_sample.json'))[0]["body"]["attachments"][0]["text"]
# Create fake notification
notification = NotificationInstance(self.db)
notificationObj = notification.create(sample_json, "")
# Run test
self.handle_run(runType)
# Remove sample notification
notificationObj.remove(notificationObj.GUID)
mylog('minimal', ['[Test] END Test: ', runType])
return
#-------------------------------------------------------------------------------
class plugin_param:
@@ -103,47 +245,7 @@ class plugin_param:
self.paramValuesCount = paramValuesCount
self.multiplyTimeout = multiplyTimeout
#-------------------------------------------------------------------------------
def run_plugin_scripts(db, all_plugins, runType):
# Header
updateState("Run: Plugins")
mylog('debug', ['[Plugins] Check if any plugins need to be executed on run type: ', runType])
for plugin in all_plugins:
shouldRun = False
prefix = plugin["unique_prefix"]
set = get_plugin_setting_obj(plugin, "RUN")
# mylog('debug', [f'[run_plugin_scripts] plugin: {plugin}'])
# mylog('debug', [f'[run_plugin_scripts] set: {set}'])
if set != None and set['value'] == runType:
if runType != "schedule":
shouldRun = True
elif runType == "schedule":
# run if overdue scheduled time
# check schedules if any contains a unique plugin prefix matching the current plugin
for schd in conf.mySchedules:
if schd.service == prefix:
# Check if schedule overdue
shouldRun = schd.runScheduleCheck()
if shouldRun:
# Header
updateState(f"Plugin: {prefix}")
print_plugin_info(plugin, ['display_name'])
mylog('debug', ['[Plugins] CMD: ', get_plugin_setting_obj(plugin, "CMD")["value"]])
execute_plugin(db, all_plugins, plugin)
# update last run time
if runType == "schedule":
for schd in conf.mySchedules:
if schd.service == prefix:
# note the last time the scheduled plugin run was executed
schd.last_run = timeNowTZ()
# Function to run a plugin command
@@ -448,13 +550,10 @@ def execute_plugin(db, all_plugins, plugin ):
# check if the subprocess / SQL query failed / there was no valid output
if len(sqlParams) == 0:
mylog('none', [f'[Plugins] No output received from the plugin "{plugin["unique_prefix"]}"'])
return
else:
mylog('verbose', ['[Plugins] SUCCESS, received ', len(sqlParams), ' entries'])
mylog('debug', ['[Plugins] sqlParam entries: ', sqlParams])
# process results if any
if len(sqlParams) > 0:
mylog('verbose', [f'[Plugins] SUCCESS for {plugin["unique_prefix"]} received {len(sqlParams)} entries'])
# mylog('debug', ['[Plugins] sqlParam entries: ', sqlParams])
# create objects
process_plugin_events(db, plugin, sqlParams)
@@ -463,7 +562,7 @@ def execute_plugin(db, all_plugins, plugin ):
endpoints = ["plugins_events","plugins_objects", "plugins_history", "appevents"]
# check if we need to update devices api endpoint as well to prevent long user waits on Loading...
userUpdatedDevices = UserEventsQueue().has_update_devices
userUpdatedDevices = UserEventsQueueInstance().has_update_devices
if userUpdatedDevices:
endpoints += ["devices"]
@@ -483,7 +582,8 @@ def process_plugin_events(db, plugin, plugEventsArr):
pluginPref = plugin["unique_prefix"]
mylog('debug', ['[Plugins] Processing : ', pluginPref])
mylog('verbose', ['[Plugins] Processing : ', pluginPref])
try:
# Begin a transaction
@@ -497,8 +597,7 @@ def process_plugin_events(db, plugin, plugEventsArr):
for obj in plugObjectsArr:
pluginObjects.append(plugin_object_class(plugin, obj))
# create plugin objects from events - will be processed to find existing objects
for eve in plugEventsArr:
pluginEvents.append(plugin_object_class(plugin, eve))
@@ -506,15 +605,13 @@ def process_plugin_events(db, plugin, plugEventsArr):
mylog('debug', ['[Plugins] Existing objects from Plugins_Objects: ', len(pluginObjects)])
mylog('debug', ['[Plugins] Logged events from the plugin run : ', len(pluginEvents)])
# Loop thru all current events and update the status to "exists" if the event matches an existing object
index = 0
for tmpObjFromEvent in pluginEvents:
# compare hash of the IDs for uniqueness
if any(x.idsHash == tmpObjFromEvent.idsHash for x in pluginObjects):
if any(x.idsHash == tmpObjFromEvent.idsHash for x in pluginObjects):
pluginEvents[index].status = "exists"
index += 1
@@ -526,9 +623,13 @@ def process_plugin_events(db, plugin, plugEventsArr):
if tmpObjFromEvent.status == "exists":
# compare hash of the changed watched columns for uniqueness
if any(x.watchedHash != tmpObjFromEvent.watchedHash for x in pluginObjects):
pluginEvents[index].status = "watched-changed"
# compare hash of the changed watched columns for uniqueness - make sure you compare the values with the same idsHash before checking watchedHash
if any(
x.idsHash == tmpObjFromEvent.idsHash and x.watchedHash != tmpObjFromEvent.watchedHash
for x in pluginObjects
):
pluginEvents[index].status = "watched-changed"
else:
pluginEvents[index].status = "watched-not-changed"
index += 1
@@ -838,106 +939,20 @@ class plugin_object_class:
for clmName in self.watchedClmns:
for mapping in indexNameColumnMapping:
if clmName == indexNameColumnMapping[1]:
self.watchedIndxs.append(indexNameColumnMapping[0])
if clmName == mapping[1]:
self.watchedIndxs.append(mapping[0])
tmp = ''
for indx in self.watchedIndxs:
tmp += str(objDbRow[indx])
self.watchedHash = str(hash(tmp))
#===============================================================================
# Handling of user initialized front-end events
#===============================================================================
def check_and_run_user_event(db, all_plugins):
"""
Process user events from the execution queue log file and notify the user about executed events.
"""
execution_log = UserEventsQueue()
# Track whether to show notification for executed events
executed_events = []
# Read the log file to get the lines
lines = execution_log.read_log()
if not lines:
mylog('debug', ['[check_and_run_user_event] User Execution Queue is empty'])
return # Exit early if the log file is empty
else:
mylog('debug', ['[check_and_run_user_event] Process User Execution Queue:' + ', '.join(map(str, lines))])
for line in lines:
# Extract event name and parameters from the log line
columns = line.strip().split('|')[2:4]
event, param = "", ""
if len(columns) == 2:
event, param = columns
# Process each event type
if event == 'test':
handle_test(param, db, all_plugins)
executed_events.append(f"test with param {param}")
execution_log.finalize_event("test")
elif event == 'run':
handle_run(param, db, all_plugins)
executed_events.append(f"run with param {param}")
execution_log.finalize_event("run")
elif event == 'update_api':
# async handling
update_api(db, all_plugins, False, param.split(','), True)
else:
mylog('minimal', ['[check_and_run_user_event] WARNING: Unhandled event in execution queue: ', event, ' | ', param])
execution_log.finalize_event(event) # Finalize unknown events to remove them
# Notify user about executed events (if applicable)
if len(executed_events) > 0 and executed_events:
executed_events_message = ', '.join(executed_events)
mylog('minimal', ['[check_and_run_user_event] INFO: Executed events: ', executed_events_message])
write_notification(f"[Ad-hoc events] Events executed: {executed_events_message}", "interrupt", timeNowTZ())
return
def __repr__(self):
attrs = vars(self)
return f"<PluginObject " + ", ".join(f"{k}={v!r}" for k, v in attrs.items()) + ">"
#-------------------------------------------------------------------------------
def handle_run(runType, db, all_plugins):
mylog('minimal', ['[', timeNowTZ(), '] START Run: ', runType])
# run the plugin to run
for plugin in all_plugins:
if plugin["unique_prefix"] == runType:
execute_plugin(db, all_plugins, plugin)
mylog('minimal', ['[', timeNowTZ(), '] END Run: ', runType])
return
#-------------------------------------------------------------------------------
def handle_test(runType, db, all_plugins):
mylog('minimal', ['[', timeNowTZ(), '] [Test] START Test: ', runType])
# Prepare test samples
sample_json = json.loads(get_file_content(reportTemplatesPath + 'webhook_json_sample.json'))[0]["body"]["attachments"][0]["text"]
# Create fake notification
notification = Notification_obj(db)
notificationObj = notification.create(sample_json, "")
# Run test
handle_run(runType, db, all_plugins)
# Remove sample notification
notificationObj.remove(notificationObj.GUID)
mylog('minimal', ['[Test] END Test: ', runType])
return

View File

@@ -9,7 +9,7 @@ import conf
import os
import re
from helper import timeNowTZ, get_setting, get_setting_value, list_to_where, resolve_device_name_dig, get_device_name_nbtlookup, get_device_name_nslookup, get_device_name_mdns, check_IP_format, sanitize_SQL_input
from logger import mylog, print_log
from logger import mylog
from const import vendorsPath, vendorsPathNewest, sql_generateGuid
from models.device_instance import DeviceInstance

View File

@@ -8,7 +8,7 @@ import conf
from scan.device_handling import create_new_devices, print_scan_stats, save_scanned_devices, update_devices_data_from_scan, exclude_ignored_devices
from helper import timeNowTZ
from logger import mylog
from reporting import skip_repeated_notifications
from messaging.reporting import skip_repeated_notifications
#===============================================================================

View File

@@ -1,7 +1,7 @@
""" class to manage schedules """
import datetime
from logger import mylog, print_log
from logger import mylog
import conf
#-------------------------------------------------------------------------------

View File

@@ -14,7 +14,7 @@ from helper import get_setting_value, timeNowTZ
# Make sure the TIMEZONE for logging is correct
# conf.tz = pytz.timezone(get_setting_value('TIMEZONE'))
from logger import mylog, Logger, print_log, logResult
from logger import mylog, Logger, logResult
# Make sure log level is initialized correctly
Logger(get_setting_value('LOG_LEVEL'))