Compare commits
35 Commits
v25.4.1
...
79d67d1cbe
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
79d67d1cbe | ||
|
|
0bc93a2352 | ||
|
|
27443c441a | ||
|
|
7894b08051 | ||
|
|
31089e2aa6 | ||
|
|
46cbf85584 | ||
|
|
9d3a537b10 | ||
|
|
a3fcd4373f | ||
|
|
fb8876df0d | ||
|
|
8b617ffb8d | ||
|
|
55fa24bced | ||
|
|
b1cfaac33b | ||
|
|
476dd67796 | ||
|
|
f52ae328bc | ||
|
|
cbf626a5b6 | ||
|
|
4bb87fe8df | ||
|
|
71bcbbe7f9 | ||
|
|
f941133304 | ||
|
|
470997fcde | ||
|
|
d6b2ac587f | ||
|
|
e6962e0393 | ||
|
|
426dd48540 | ||
|
|
7da11d167d | ||
|
|
40e090c5c6 | ||
|
|
3ccb165658 | ||
|
|
a12da278c6 | ||
|
|
ffb0d0238d | ||
|
|
599603d9ff | ||
|
|
befb58619b | ||
|
|
f83cdc766b | ||
|
|
6fb1547fc4 | ||
|
|
ea9a07d29e | ||
|
|
2889be28e4 | ||
|
|
46a8bb66e7 | ||
|
|
578a6d0d48 |
3
.github/ISSUE_TEMPLATE/i-have-an-issue.yml
vendored
@@ -59,12 +59,15 @@ body:
|
||||
validations:
|
||||
required: false
|
||||
- type: dropdown
|
||||
id: installation_type
|
||||
attributes:
|
||||
label: What installation are you running?
|
||||
options:
|
||||
- Production (netalertx)
|
||||
- Dev (netalertx-dev)
|
||||
- Home Assistant (addon)
|
||||
- Home Assistant fa (full-access addon)
|
||||
- Bare-metal (community only support - Check Discord)
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
|
||||
3
.github/ISSUE_TEMPLATE/setup-help.yml
vendored
@@ -44,12 +44,15 @@ body:
|
||||
validations:
|
||||
required: false
|
||||
- type: dropdown
|
||||
id: installation_type
|
||||
attributes:
|
||||
label: What installation are you running?
|
||||
options:
|
||||
- Production (netalertx)
|
||||
- Dev (netalertx-dev)
|
||||
- Home Assistant (addon)
|
||||
- Home Assistant fa (full-access addon)
|
||||
- Bare-metal (community only support - Check Discord)
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
|
||||
2
.github/tweet.md
vendored
Executable file
@@ -0,0 +1,2 @@
|
||||
🎉 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
|
||||
7
.github/workflows/code_checks.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: URL Path Check
|
||||
name: Code checks
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
@@ -25,4 +25,9 @@ jobs:
|
||||
else
|
||||
echo "✅ No absolute path URLs found."
|
||||
fi
|
||||
- name: Check Python syntax
|
||||
run: |
|
||||
set -e
|
||||
echo "🔍 Checking Python syntax..."
|
||||
find . -name "*.py" -print0 | xargs -0 -n1 python3 -m py_compile
|
||||
|
||||
|
||||
43
.github/workflows/label-issues.yml
vendored
Executable file
@@ -0,0 +1,43 @@
|
||||
name: Label Issues by Installation Type
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
jobs:
|
||||
add-label:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Get issue content
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const body = context.payload.issue.body;
|
||||
|
||||
const lowerBody = body.toLowerCase();
|
||||
|
||||
let labelsToAdd = [];
|
||||
|
||||
if (lowerBody.includes('bare-metal')) {
|
||||
labelsToAdd.push('bare-metal ❗');
|
||||
}
|
||||
|
||||
if (lowerBody.includes('home assistant')) {
|
||||
labelsToAdd.push('Home Assistant 🏠');
|
||||
}
|
||||
|
||||
if (lowerBody.includes('production (netalertx)') || lowerBody.includes('dev (netalertx-dev)')) {
|
||||
labelsToAdd.push('Docker 🐋');
|
||||
}
|
||||
|
||||
if (labelsToAdd.length > 0) {
|
||||
await github.rest.issues.addLabels({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.issue.number,
|
||||
labels: labelsToAdd
|
||||
});
|
||||
}
|
||||
@@ -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 {} \;"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -41,6 +41,10 @@ Send notifications to more than 80+ services, including Telegram via [Apprise](h
|
||||
Feed your data and device changes into [Home Assistant](https://github.com/jokob-sk/NetAlertX/blob/main/docs/HOME_ASSISTANT.md), read [API endpoints](https://github.com/jokob-sk/NetAlertX/blob/main/docs/API.md), or use [Webhooks](https://github.com/jokob-sk/NetAlertX/blob/main/docs/WEBHOOK_N8N.md) to setup custom automation flows. You can also
|
||||
build your own scanners with the [Plugin system](https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md#readme) in as little as [15 minutes](https://www.youtube.com/watch?v=cdbxlwiWhv8).
|
||||
|
||||
### Workflows
|
||||
|
||||
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
|
||||
<!--- --------------------------------------------------------------------- --->
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
## High-level overview
|
||||
|
||||
If a Plugin supplies data to the main app it's doine either vie a SQL query or via a script that updates the `last_result.log` file in the plugin folder (`front/plugins/<plugin>`).
|
||||
If a Plugin supplies data to the main app it's done either vie a SQL query or via a script that updates the `last_result.log` file in the plugin log folder (`app/log/plugins/`).
|
||||
|
||||
For a more in-depth overview on how plugins work check the [Plugins development docs](https://github.com/jokob-sk/NetAlertX/blob/main/docs/PLUGINS.md).
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
## Status Colors
|
||||
|
||||

|
||||
|
||||
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.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# `docker-compose.yaml` Examples
|
||||
|
||||
> [!NOTE]
|
||||
> The container needs to run in `network_mode:"host"`.
|
||||
> The container needs to run in `network_mode:"host"`. This also means that not all functionality is supported on a Windows host as Docker for Windows doesn't support this networking option.
|
||||
|
||||
### Example 1
|
||||
|
||||
@@ -122,7 +122,6 @@ services:
|
||||
environment:
|
||||
- TZ=Europe/London
|
||||
- PORT=20211
|
||||
# network_mode: host
|
||||
networks:
|
||||
- outside
|
||||
deploy:
|
||||
@@ -130,10 +129,6 @@ services:
|
||||
replicas: 1
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
# placement: # ✅ Placement is now correctly inside deploy
|
||||
# constraints:
|
||||
# - node.role == manager
|
||||
# - node.labels.device == NUC2
|
||||
|
||||
networks:
|
||||
outside:
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
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.
|
||||
|
||||
> [!TIP]
|
||||
> You can install NetAlertX also as a Home Assistant addon [](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/). 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.
|
||||
> You can install NetAlertX also as a Home Assistant addon [](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.
|
||||
|
||||
## ⚠ Note
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
## Installation options
|
||||
|
||||
NetAlertX can be installed several ways. The best supported option is Docker, followed by a supervised the Home Assistant instance, as an Unraid app and lastly on bare metal.
|
||||
NetAlertX can be installed several ways. The best supported option is Docker, followed by a supervised Home Assistant instance, as an Unraid app, and lastly, on bare metal.
|
||||
|
||||
- [[Installation] Docker (recommended)](https://github.com/jokob-sk/NetAlertX/blob/main/dockerfiles/README.md)
|
||||
- [[Installation] Home Assistant](https://github.com/alexbelgium/hassio-addons/tree/master/netalertx)
|
||||
|
||||
26
docs/LOGGING.md
Executable file
@@ -0,0 +1,26 @@
|
||||
# Logging
|
||||
|
||||
NetAlertX comes with several logs that help to identify application issues.
|
||||
|
||||
For plugin-specific log debugging, please read the [Debug Plugins](./DEBUG_PLUGINS.md) guide.
|
||||
|
||||
When debugging any issue, increase the `LOG_LEVEL` Setting as per the [Debug tips](./DEBUG_TIPS.md) documentation.
|
||||
|
||||
|
||||
## Main logs
|
||||
|
||||
You can find most of the logs exposed in the UI under _Maintenance -> Logs_.
|
||||
|
||||
If the UI is inaccessible, you can access them under `/app/log`.
|
||||
|
||||

|
||||
|
||||
In the _Maintennace -> Logs_ you can **Purge logs**, download the full log file or Filter the lines with some substring to narrow down your search.
|
||||
|
||||
## Plugin logging
|
||||
|
||||
If a Plugin supplies data to the main app it's done either vie a SQL query or via a script that updates the `last_result.log` file in the plugin log folder (`app/log/plugins/`). These files are processed at the end of the scan and deleted on successful processing.
|
||||
|
||||
The data is in most of the cases then displayed in the application under _Integrations -> Plugins_ (or _Device -> Plugins_ if the plugin is supplying device-specific data).
|
||||
|
||||

|
||||
47
docs/NAME_RESOLUTION.md
Executable file
@@ -0,0 +1,47 @@
|
||||
# Device Name Resolution
|
||||
|
||||
Name resolution in NetAlertX relies on multiple plugins to resolve device names from IP addresses. If you are seeing `(name not found)` as device names, follow these steps to diagnose and fix the issue.
|
||||
|
||||
## Required Plugins
|
||||
|
||||
For best results, ensure the following name resolution plugins are enabled:
|
||||
|
||||
- **AVAHISCAN** – Uses mDNS/Avahi to resolve local network names.
|
||||
- **NBTSCAN** – Queries NetBIOS to find device names.
|
||||
- **NSLOOKUP** – Performs standard DNS lookups.
|
||||
|
||||
You can check which plugins are active in your _Settings_ section and enable any that are missing.
|
||||
|
||||
There are other plugins that can supply device names as well, but they rely on bespoke hardware and services. See [Plugins overview](./PLUGINS.md) for details and look for plugins with name discovery (🆎) features.
|
||||
|
||||
## Checking Logs
|
||||
|
||||
If names are not resolving, check the logs for errors or timeouts.
|
||||
|
||||
See how to explore logs in the [Logging guide](./LOGGING.md).
|
||||
|
||||
Logs will show which plugins attempted resolution and any failures encountered.
|
||||
|
||||
## Adjusting Timeout Settings
|
||||
|
||||
If resolution is slow or failing due to timeouts, increase the timeout settings in your configuration, for example.
|
||||
|
||||
```ini
|
||||
NSLOOKUP_RUN_TIMEOUT = 30
|
||||
```
|
||||
|
||||
Raising the timeout may help if your network has high latency or slow DNS responses.
|
||||
|
||||
## Checking Plugin Objects
|
||||
|
||||
Each plugin stores results in its respective object. You can inspect these objects to see if they contain valid name resolution data.
|
||||
|
||||
See [Logging guide](./LOGGING.md) and [Debug plugins](./DEBUG_PLUGINS.md) guides for details.
|
||||
|
||||
If the object contains no results, the issue may be with DNS settings or network access.
|
||||
|
||||
## Improving name resolution
|
||||
|
||||
For more details how to improve name resolution refer to the
|
||||
[Reverse DNS Documentation](./REVERSE_DNS.md).
|
||||
|
||||
@@ -8,17 +8,38 @@ NetAlertX supports additional plugins to extend its functionality, each with its
|
||||
## ⚡ Quick start
|
||||
|
||||
> [!TIP]
|
||||
> You can load additional Plugins via the General -> `LOADED_PLUGINS` setting.
|
||||
> You can load additional Plugins via the General -> `LOADED_PLUGINS` setting. You need to save the settings for the new plugins to load (cache/page reload may be necessary).
|
||||
> 
|
||||
|
||||
1. Pick your `🔍 dev scanner` plugin (e.g. `ARPSCAN` or `NMAPDEV`), or import devices into the application with an `📥 importer` plugin. (See **✅Enabling plugins** below)
|
||||
1. Pick your `🔍 dev scanner` plugin (e.g. `ARPSCAN` or `NMAPDEV`), or import devices into the application with an `📥 importer` plugin. (See **Enabling plugins** below)
|
||||
2. Pick a `▶️ publisher` plugin, if you want to send notifications. If you don't see a publisher you'd like to use, look at the [📚_publisher_apprise](/front/plugins/_publisher_apprise/) plugin which is a proxy for over 80 notification services.
|
||||
3. Setup your [Network topology diagram](./NETWORK_TREE.md)
|
||||
4. Fine-tune [Notifications](./NOTIFICATIONS.md)
|
||||
5. [Backup your setup](./BACKUPS.md)
|
||||
6. Contribute and [Create custom plugins](./PLUGINS_DEV.md)
|
||||
5. Setup [Workflows](./WORKFLOWS.md)
|
||||
6. [Backup your setup](./BACKUPS.md)
|
||||
7. Contribute and [Create custom plugins](./PLUGINS_DEV.md)
|
||||
|
||||
|
||||
## 📑 Available Plugins
|
||||
## Plugin types
|
||||
|
||||
| Plugin type | Icon | Description | When to run | Required | Data source [?](./PLUGINS_DEV.md) |
|
||||
| -------------- | ---- | ---------------------------------------------------------------- | ----------------------------------- | -------- | ------------------------------------- |
|
||||
| publisher | ▶️ | Sending notifications to services. | `on_notification` | ✖ | Script |
|
||||
| dev scanner | 🔍 | Create devices in the app, manages online/offline device status. | `schedule` | ✖ | Script / SQLite DB |
|
||||
| name discovery | 🆎 | Discovers names of devices via various protocols. | `before_name_updates`, `schedule` | ✖ | Script |
|
||||
| importer | 📥 | Importing devices from another service. | `schedule` | ✖ | Script / SQLite DB |
|
||||
| system | ⚙ | Providing core system functionality. | `schedule` / always on | ✖/✔ | Script / Template |
|
||||
| other | ♻ | Other plugins | misc | ✖ | Script / Template |
|
||||
|
||||
## Features
|
||||
|
||||
| Icon | Description |
|
||||
| ---- | ------------------------------------------------------------ |
|
||||
| 🖧 | Auto-imports the network topology diagram |
|
||||
| 🔄 | Has the option to sync some data back into the plugin source |
|
||||
|
||||
|
||||
## Available Plugins
|
||||
|
||||
Device-detecting plugins insert values into the `CurrentScan` database table. The plugins that are not required are safe to ignore, however, it makes sense to have at least some device-detecting plugins enabled, such as `ARPSCAN` or `NMAPDEV`.
|
||||
|
||||
@@ -36,7 +57,7 @@ Device-detecting plugins insert values into the `CurrentScan` database table. T
|
||||
| `DHCPLSS` | 🔍/📥/🆎| Import devices from DHCP leases | | | Script | [dhcp_leases](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/dhcp_leases/) |
|
||||
| `DHCPSRVS` | ♻ | DHCP servers | | | Script | [dhcp_servers](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/dhcp_servers/) |
|
||||
| `FREEBOX` | 🔍/♻/🆎| Pull data and names from Freebox/Iliadbox | | | Script | [freebox](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/freebox/) |
|
||||
| `ICMP` | 🔍 | ICMP (ping) status checker | | | Script | [icmp_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/icmp_scan/) |
|
||||
| `ICMP` | ♻ | ICMP (ping) status checker | | | Script | [icmp_scan](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/icmp_scan/) |
|
||||
| `INTRNT` | 🔍 | Internet IP scanner | | | Script | [internet_ip](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/internet_ip/) |
|
||||
| `INTRSPD` | ♻ | Internet speed test | | | Script | [internet_speedtest](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/internet_speedtest/) |
|
||||
| `IPNEIGH` | 🔍 | Scan ARP (IPv4) and NDP (IPv6) tables | | | Script | [ipneigh](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/ipneigh/) |
|
||||
@@ -72,27 +93,9 @@ Device-detecting plugins insert values into the `CurrentScan` database table. T
|
||||
> ❌ marked for removal
|
||||
> ⌚It's recommended to use the same schedule interval for all plugins responsible for discovering new devices.
|
||||
|
||||
## Plugin types
|
||||
|
||||
|
||||
| Plugin type | Icon | Description | When to run | Required | Data source [?](./PLUGINS_DEV.md) |
|
||||
| -------------- | ---- | ---------------------------------------------------------------- | ----------------------------------- | -------- | ------------------------------------- |
|
||||
| publisher | ▶️ | Sending notifications to services. | `on_notification` | ✖ | Script |
|
||||
| dev scanner | 🔍 | Create devices in the app, manages online/offline device status. | `schedule` | ✖ | Script / SQLite DB |
|
||||
| name discovery | 🆎 | Discovers names of devices via various protocols. | `before_name_updates`, `schedule` | ✖ | Script |
|
||||
| importer | 📥 | Importing devices from another service. | `schedule` | ✖ | Script / SQLite DB |
|
||||
| system | ⚙ | Providing core system functionality. | `schedule` / always on | ✖/✔ | Script / Template |
|
||||
| other | ♻ | Other plugins | misc | ✖ | Script / Template |
|
||||
|
||||
## Features
|
||||
|
||||
| Icon | Description |
|
||||
| ---- | ------------------------------------------------------------ |
|
||||
| 🖧 | Auto-imports the network topology diagram |
|
||||
| 🔄 | Has the option to sync some data back into the plugin source |
|
||||
|
||||
|
||||
## ✅Enabling plugins
|
||||
## Enabling plugins
|
||||
|
||||
Plugins can be enabled via Settings, and can be disabled as needed.
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ The following workarounds should work for most complex network setups.
|
||||
|
||||
## Supplementing Plugins
|
||||
|
||||
You can use supplementary plugins that employ alternate methods. Protocols used by the `SNMPDSC` or `DHCPLSS` plugins are widely supported on different routers and can be effective as workarounds. Check the [plugins list](https://github.com/jokob-sk/NetAlertX/blob/main/docs/PLUGINS.md) to find a plugin that works with your router and network setup.
|
||||
You can use supplementary plugins that employ alternate methods. Protocols used by the `SNMPDSC` or `DHCPLSS` plugins are widely supported on different routers and can be effective as workarounds. Check the [plugins list](./PLUGINS.md) to find a plugin that works with your router and network setup.
|
||||
|
||||
## Multiple NetAlertX Instances
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ services:
|
||||
|
||||

|
||||
|
||||
7. Replace the paths to your volume and/or comment out unnecessary line(s):
|
||||
7. Replace the paths to your volume and comment out unnecessary line(s):
|
||||
|
||||
- This is only an example, your paths will differ.
|
||||
|
||||
|
||||
@@ -1,49 +1,70 @@
|
||||
# Debugging inaccessible UI
|
||||
|
||||
## 1. Port conflicts
|
||||
The application uses the following default ports:
|
||||
|
||||
When opening an issue please:
|
||||
- **Web UI**: `20211`
|
||||
- **GraphQL API**: `20212`
|
||||
|
||||
The **Web UI** is served by an **nginx** server, while the **API backend** runs on a **Flask (Python)** server.
|
||||
|
||||
## Changing Ports
|
||||
|
||||
- To change the **Web UI** port, update the `PORT` environment variable in the `docker-compose.yml` file.
|
||||
- To change the **GraphQL API** port, use the `GRAPHQL_PORT` setting, either directly or via Docker:
|
||||
```yaml
|
||||
APP_CONF_OVERRIDE={"GRAPHQL_PORT":"20212"}
|
||||
```
|
||||
|
||||
For more information, check the [Docker installation guide](https://github.com/jokob-sk/NetAlertX/blob/main/dockerfiles/README.md).
|
||||
|
||||
## Possible issues and troubleshooting
|
||||
|
||||
Follow all of the below in order to disqualify potential causes of issues and to troubleshoot these problems faster.
|
||||
|
||||
### 1. Port conflicts
|
||||
|
||||
When opening an issue or debugging:
|
||||
|
||||
1. Include a screenshot of what you see when accessing `HTTP://<your rpi IP>/20211` (or your custom port)
|
||||
1. [Follow steps 1, 2, 3, 4 on this page](./DEBUG_TIPS.md)
|
||||
1. Execute the following in the container to see the processes and their ports and submit a screenshot of the result:
|
||||
1. `sudo apk add lsof`
|
||||
1. `sudo lsof -i`
|
||||
1. Try running the `nginx` command in the container
|
||||
1. if you get `nginx: [emerg] bind() to 0.0.0.0:20211 failed (98: Address in use)` try using a different port number
|
||||
- `sudo apk add lsof`
|
||||
- `sudo lsof -i`
|
||||
1. Try running the `nginx` command in the container:
|
||||
- if you get `nginx: [emerg] bind() to 0.0.0.0:20211 failed (98: Address in use)` try using a different port number
|
||||
|
||||
|
||||

|
||||
|
||||
## 2. JavaScript issues
|
||||
### 2. JavaScript issues
|
||||
|
||||
Check for browser console (F12 browser dev console) errors + check different browsers.
|
||||
|
||||
## 3. Clear the app cache and cached JavaScript files
|
||||
### 3. Clear the app cache and cached JavaScript files
|
||||
|
||||
Refresh the browser cache (usually shoft + refresh), try a private window, or different browsers. Please also refresh the app cache by clicking the 🔃 (reload) button in the header of the application.
|
||||
|
||||
## 4. Disable proxy
|
||||
### 4. Disable proxies
|
||||
|
||||
If you have any reverse proxy or similar, try disabling it.
|
||||
|
||||
## 5. Disable your firewall
|
||||
### 5. Disable your firewall
|
||||
|
||||
If you are using a firewall, try to temporarily disabling it.
|
||||
|
||||
## 6. Post your docker start details
|
||||
### 6. Post your docker start details
|
||||
|
||||
If you haven't, post your docker compose/run command.
|
||||
|
||||
## 7. Check for errors in your PHP/NGINX error logs
|
||||
### 7. Check for errors in your PHP/NGINX error logs
|
||||
|
||||
In the container execute:
|
||||
In the container execute and investigate:
|
||||
|
||||
`cat /var/log/nginx/error.log`
|
||||
|
||||
`cat /app/log/app.php_errors.log`
|
||||
|
||||
## 8. Make sure permissions are correct
|
||||
### 8. Make sure permissions are correct
|
||||
|
||||
> [!TIP]
|
||||
> You can try to start the container without mapping the `/app/config` and `/app/db` dirs and if the UI shows up then the issue is most likely related to your file system permissions or file ownership.
|
||||
|
||||
@@ -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.
|
||||
|
||||

|
||||
|
||||
@@ -15,8 +15,13 @@ Below are a few examples that demonstrate how this module can be used to simplif
|
||||
|
||||
### Triggers
|
||||
|
||||

|
||||
|
||||
Triggers define the event that activates a workflow. They monitor changes to objects within the system, such as updates to devices or the insertion of new entries. When the specified event occurs, the workflow is executed.
|
||||
|
||||
> [!TIP]
|
||||
> Workflows not running? Check the [Workflows debugging](./WORKFLOWS_DEBUGGING.md) guide how to troubleshoot triggers and conditions.
|
||||
|
||||
#### Example Trigger:
|
||||
- **Object Type**: `Devices`
|
||||
- **Event Type**: `update`
|
||||
@@ -32,7 +37,7 @@ Conditions determine whether a workflow should proceed based on certain criteria
|
||||
> [!TIP]
|
||||
> To better understand how to use specific Device fields, please read through the [Database overview](./DATABASE.md) guide.
|
||||
|
||||
### Example Condition:
|
||||
#### Example Condition:
|
||||
- **Logic**: `AND`
|
||||
- **Field**: `devVendor`
|
||||
- **Operator**: `contains` (case in-sensitive)
|
||||
@@ -48,7 +53,7 @@ Actions define the tasks that the workflow will perform once the conditions are
|
||||
|
||||
You can include multiple actions that should execute once the conditions are met.
|
||||
|
||||
### Example Action:
|
||||
#### Example Action:
|
||||
- **Action Type**: `update_field`
|
||||
- **Field**: `devIsNew`
|
||||
- **Value**: `0`
|
||||
|
||||
38
docs/WORKFLOWS_DEBUGGING.md
Executable file
@@ -0,0 +1,38 @@
|
||||
# Workflows debugging and troubleshooting
|
||||
|
||||
> [!TIP]
|
||||
> Before troubleshooting, please ensure you have [Debugging enabled](./DEBUG_TIPS.md).
|
||||
|
||||
Workflows are triggered by various events. These events are captured and listed in the _Integrations -> App Events_ section of the application.
|
||||
|
||||
## Troubleshooting triggers
|
||||
|
||||
> [!NOTE]
|
||||
> Workflow events are processed once every 5 seconds. However, if a scan or other background tasks are running, this can cause a delay up to a few minutes.
|
||||
|
||||
If an event doesn't trigger a workflow as expected, check the _App Events_ section for the event. You can filter these by the ID of the device (`devMAC` or `devGUID`).
|
||||
|
||||

|
||||
|
||||
Once you find the _Event Guid_ and _Object GUID_, use them to find relevant debug entries.
|
||||
|
||||
Navigate to _Mainetenace -> Logs_ where you can filter the logs based on the _Event or Object GUID_.
|
||||
|
||||

|
||||
|
||||
Below you can find some example `app.log` entries that will help you understand why a Workflow was or was not triggered.
|
||||
|
||||
```bash
|
||||
16:27:03 [WF] Checking if '13f0ce26-1835-4c48-ae03-cdaf38f328fe' triggers the workflow 'Sample Device Update Workflow'
|
||||
16:27:03 [WF] self.triggered 'False' for event '[[155], ['13f0ce26-1835-4c48-ae03-cdaf38f328fe'], [0], ['2025-04-02 05:26:56'], ['Devices'], ['050b6980-7af6-4409-950d-08e9786b7b33'], ['DEVICES'], ['00:11:32:ef:a5:6c'], ['192.168.1.82'], ['050b6980-7af6-4409-950d-08e9786b7b33'], [None], [0], [0], ['devPresentLastScan'], ['online'], ['update'], [None], [None], [None], [None]] and trigger {"object_type": "Devices", "event_type": "insert"}'
|
||||
16:27:03 [WF] Checking if '13f0ce26-1835-4c48-ae03-cdaf38f328fe' triggers the workflow 'Location Change'
|
||||
16:27:03 [WF] self.triggered 'True' for event '[[155], ['13f0ce26-1835-4c48-ae03-cdaf38f328fe'], [0], ['2025-04-02 05:26:56'], ['Devices'], ['050b6980-7af6-4409-950d-08e9786b7b33'], ['DEVICES'], ['00:11:32:ef:a5:6c'], ['192.168.1.82'], ['050b6980-7af6-4409-950d-08e9786b7b33'], [None], [0], [0], ['devPresentLastScan'], ['online'], ['update'], [None], [None], [None], [None]] and trigger {"object_type": "Devices", "event_type": "update"}'
|
||||
16:27:03 [WF] Event with GUID '13f0ce26-1835-4c48-ae03-cdaf38f328fe' triggered the workflow 'Location Change'
|
||||
```
|
||||
|
||||
Note how one trigger executed, but the other didn't based on different `"event_type"` values. One is `"event_type": "insert"`, the other `"event_type": "update"`.
|
||||
|
||||
Given the Event is a update event (note `...['online'], ['update'], [None]...` in the event structure), the `"event_type": "insert"` trigger didn't execute.
|
||||
|
||||
|
||||
|
||||
BIN
docs/img/DEVICE_MANAGEMENT/device_management_display_settings.png
Executable file
|
After Width: | Height: | Size: 7.7 KiB |
BIN
docs/img/LOGGING/logging_integrations_plugins.png
Executable file
|
After Width: | Height: | Size: 110 KiB |
BIN
docs/img/LOGGING/maintenance_logs.png
Executable file
|
After Width: | Height: | Size: 93 KiB |
BIN
docs/img/NAME_RESOLUTION/name_res_nslookup_timeout.png
Executable file
|
After Width: | Height: | Size: 15 KiB |
BIN
docs/img/PLUGINS/loaded_plugins_setting.png
Executable file
|
After Width: | Height: | Size: 77 KiB |
BIN
docs/img/WORKFLOWS/trigger.jpg
Executable file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
docs/img/WORKFLOWS/workflows_app_events_search.png
Executable file
|
After Width: | Height: | Size: 166 KiB |
BIN
docs/img/WORKFLOWS/workflows_logs_search.png
Executable file
|
After Width: | Height: | Size: 164 KiB |
@@ -1857,6 +1857,11 @@ input[readonly] {
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.workflows
|
||||
{
|
||||
max-width: 800px;
|
||||
}
|
||||
|
||||
.workflows .col-sm-12, .workflows .col-sx-12
|
||||
{
|
||||
padding-right: 5px;
|
||||
|
||||
@@ -266,7 +266,7 @@
|
||||
|
||||
})
|
||||
|
||||
}, 1);
|
||||
}, 100);
|
||||
});
|
||||
|
||||
}
|
||||
@@ -338,6 +338,7 @@
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Save device data to DB
|
||||
function setDeviceData(direction = '', refreshCallback = '') {
|
||||
// Check MAC
|
||||
if (mac === '') {
|
||||
|
||||
@@ -2,10 +2,13 @@
|
||||
<link rel="stylesheet" href="css/app.css">
|
||||
|
||||
<?php
|
||||
require dirname(__FILE__).'/php/server/init.php';
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// check if authenticated
|
||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||
// Be CAREFUL WHEN INCLUDING NEW PHP FILES
|
||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/server/db.php';
|
||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/language/lang.php';
|
||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||
|
||||
$CookieSaveLoginName = 'NetAlertX_SaveLogin';
|
||||
|
||||
|
||||
@@ -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ó."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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_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": ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -683,15 +683,15 @@
|
||||
"WF_Condition_value": "Valeur",
|
||||
"WF_Conditions": "Conditions",
|
||||
"WF_Conditions_logic_rules": "Règles logiques",
|
||||
"WF_Duplicate": "",
|
||||
"WF_Duplicate": "Dupliquer le workflow",
|
||||
"WF_Enabled": "Workflow activé",
|
||||
"WF_Export": "",
|
||||
"WF_Export_Copy": "",
|
||||
"WF_Import": "",
|
||||
"WF_Import_Copy": "",
|
||||
"WF_Export": "Exporter le workflow",
|
||||
"WF_Export_Copy": "Copier le workflow ci-dessous pour pouvoir l'importer au besoin.",
|
||||
"WF_Import": "Importer un workflow",
|
||||
"WF_Import_Copy": "Coller le workflow précédemment copié.",
|
||||
"WF_Name": "Nom du workflow",
|
||||
"WF_Remove": "Supprimer le workflow",
|
||||
"WF_Remove_Copy": "",
|
||||
"WF_Remove_Copy": "Voulez-vous supprimer ce workflow ?",
|
||||
"WF_Save": "Enregistrer les workflows",
|
||||
"WF_Trigger": "Déclencheur",
|
||||
"WF_Trigger_event_type": "Type d'événement",
|
||||
@@ -742,4 +742,4 @@
|
||||
"settings_update_item_warning": "Mettre à jour la valeur ci-dessous. Veillez à bien suivre le même format qu'auparavant. <b>Il n'y a pas de pas de contrôle.</b>",
|
||||
"test_event_icon": "fa-vial-circle-check",
|
||||
"test_event_tooltip": "Enregistrer d'abord vos modifications avant de tester vôtre paramétrage."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -683,15 +683,15 @@
|
||||
"WF_Condition_value": "Valore",
|
||||
"WF_Conditions": "Condizioni",
|
||||
"WF_Conditions_logic_rules": "Regole logiche",
|
||||
"WF_Duplicate": "",
|
||||
"WF_Duplicate": "Flusso di lavoro duplicato",
|
||||
"WF_Enabled": "Flusso di lavoro abilitato",
|
||||
"WF_Export": "",
|
||||
"WF_Export_Copy": "",
|
||||
"WF_Import": "",
|
||||
"WF_Import_Copy": "",
|
||||
"WF_Export": "Esporta flusso di lavoro",
|
||||
"WF_Export_Copy": "Copia il flusso di lavoro sottostante e importalo dove necessario.",
|
||||
"WF_Import": "Importa flusso di lavoro",
|
||||
"WF_Import_Copy": "Incolla il flusso di lavoro copiato in precedenza.",
|
||||
"WF_Name": "Nome flusso di lavoro",
|
||||
"WF_Remove": "Rimuovi flusso di lavoro",
|
||||
"WF_Remove_Copy": "",
|
||||
"WF_Remove_Copy": "Vuoi rimuovere questo flusso di lavoro?",
|
||||
"WF_Save": "Salva flussi di lavoro",
|
||||
"WF_Trigger": "Trigger",
|
||||
"WF_Trigger_event_type": "Tipo evento",
|
||||
@@ -742,4 +742,4 @@
|
||||
"settings_update_item_warning": "Aggiorna il valore qui sotto. Fai attenzione a seguire il formato precedente. <b>La convalida non viene eseguita.</b>",
|
||||
"test_event_icon": "fa-vial-circle-check",
|
||||
"test_event_tooltip": "Salva le modifiche prima di provare le nuove impostazioni."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"About_Design": "Разработан:",
|
||||
"About_Exit": "Зарегистрироваться",
|
||||
"About_Title": "Сетевой сканер и система уведомлений",
|
||||
"AppEvents_AppEventProcessed": "",
|
||||
"AppEvents_AppEventProcessed": "Обработанный",
|
||||
"AppEvents_DateTimeCreated": "Журнал",
|
||||
"AppEvents_Extra": "Дополнительно",
|
||||
"AppEvents_GUID": "GUID события приложения",
|
||||
@@ -22,7 +22,7 @@
|
||||
"AppEvents_ObjectPlugin": "Связанный плагин",
|
||||
"AppEvents_ObjectPrimaryID": "Первичный ID",
|
||||
"AppEvents_ObjectSecondaryID": "Вторичный ID",
|
||||
"AppEvents_ObjectStatus": "Состояние (во время входа в систему)",
|
||||
"AppEvents_ObjectStatus": "Зарегистрированный статус",
|
||||
"AppEvents_ObjectStatusColumn": "Колонка состояния",
|
||||
"AppEvents_ObjectType": "Тип объекта",
|
||||
"AppEvents_Plugin": "Плагин",
|
||||
@@ -70,7 +70,7 @@
|
||||
"DevDetail_Copy_Device_Tooltip": "Скопируйте данные с устройства из раскрывающегося списка. Все на этой странице будет перезаписано",
|
||||
"DevDetail_CustomProperties_Title": "Пользовательские свойства",
|
||||
"DevDetail_CustomProps_reset_info": "Это удалит ваши пользовательские свойства на этом устройстве и вернет их к значению по умолчанию.",
|
||||
"DevDetail_DisplayFields_Title": "Дисплей",
|
||||
"DevDetail_DisplayFields_Title": "Отображение",
|
||||
"DevDetail_EveandAl_AlertAllEvents": "Оповещения о событиях",
|
||||
"DevDetail_EveandAl_AlertDown": "Оповещение о доступности",
|
||||
"DevDetail_EveandAl_Archived": "Архив",
|
||||
@@ -225,7 +225,7 @@
|
||||
"Device_TableHead_Name": "Имя",
|
||||
"Device_TableHead_NetworkSite": "Сайт устройства",
|
||||
"Device_TableHead_Owner": "Владелец",
|
||||
"Device_TableHead_Parent_MAC": "MAC род. узла",
|
||||
"Device_TableHead_Parent_MAC": "Родительский узел сети",
|
||||
"Device_TableHead_Port": "Порт",
|
||||
"Device_TableHead_PresentLastScan": "Присутствие",
|
||||
"Device_TableHead_RowID": "ID строки",
|
||||
@@ -363,8 +363,8 @@
|
||||
"Maintenance_Title": "Инструменты обслуживания",
|
||||
"Maintenance_Tool_DownloadConfig": "Экспорт настроек",
|
||||
"Maintenance_Tool_DownloadConfig_text": "Загрузите полную резервную копию конфигурации настроек, хранящуюся в файле <code>app.conf</code>.",
|
||||
"Maintenance_Tool_DownloadWorkflows": "",
|
||||
"Maintenance_Tool_DownloadWorkflows_text": "",
|
||||
"Maintenance_Tool_DownloadWorkflows": "Экспорт Workflow",
|
||||
"Maintenance_Tool_DownloadWorkflows_text": "Загрузите полную резервную копию ваших Workflow, хранящихся в файле <code> hairpflows.json </code>.",
|
||||
"Maintenance_Tool_ExportCSV": "Экспорт устройств (csv)",
|
||||
"Maintenance_Tool_ExportCSV_noti": "Экспорт устройств (csv)",
|
||||
"Maintenance_Tool_ExportCSV_noti_text": "Вы уверены, что хотите создать файл CSV?",
|
||||
@@ -463,7 +463,7 @@
|
||||
"NETWORK_DEVICE_TYPES_description": "Какие типы устройств разрешено использовать в качестве сетевых устройств в представлении Сеть. Тип устройства должен точно соответствовать настройке <code>Type</code> для конкретного устройства в сведениях об устройстве. Добавьте его на устройство с помощью кнопки <code>+</code>. Не удаляйте существующие типы, а только добавляйте новые.",
|
||||
"NETWORK_DEVICE_TYPES_name": "Типы сетевых устройств",
|
||||
"Navigation_About": "О NetAlertX",
|
||||
"Navigation_AppEvents": "",
|
||||
"Navigation_AppEvents": "События приложения",
|
||||
"Navigation_Devices": "Устройства",
|
||||
"Navigation_Donations": "Пожертвования",
|
||||
"Navigation_Events": "События",
|
||||
@@ -670,32 +670,32 @@
|
||||
"UI_REFRESH_name": "Автоматическое обновление интерфейса",
|
||||
"VERSION_description": "Вспомогательное значение версии или метки времени, позволяющее проверить, было ли приложение обновлено.",
|
||||
"VERSION_name": "Версия или временная метка",
|
||||
"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": "Добавить действие",
|
||||
"WF_Action_field": "Поле",
|
||||
"WF_Action_type": "Тип",
|
||||
"WF_Action_value": "Значение",
|
||||
"WF_Actions": "Действия",
|
||||
"WF_Add": "Добавить Workflow",
|
||||
"WF_Add_Condition": "Добавить условие",
|
||||
"WF_Add_Group": "Добавить группу",
|
||||
"WF_Condition_field": "Поле",
|
||||
"WF_Condition_operator": "Оператор",
|
||||
"WF_Condition_value": "Значение",
|
||||
"WF_Conditions": "Условия",
|
||||
"WF_Conditions_logic_rules": "Правила логики",
|
||||
"WF_Duplicate": "Дублировать Workflow",
|
||||
"WF_Enabled": "Включить Workflow",
|
||||
"WF_Export": "Экспорт Workflow",
|
||||
"WF_Export_Copy": "Скопируйте приведенный ниже Workflow и импортируйте его, где это необходимо.",
|
||||
"WF_Import": "Импорт Workflow",
|
||||
"WF_Import_Copy": "Вставьте в Workflow, который вы скопировали ранее.",
|
||||
"WF_Name": "Имя Workflow",
|
||||
"WF_Remove": "Удалить Workflow",
|
||||
"WF_Remove_Copy": "Вы хотите удалить этот Workflow?",
|
||||
"WF_Save": "Сохранить Workflow",
|
||||
"WF_Trigger": "Триггер",
|
||||
"WF_Trigger_event_type": "Тип события",
|
||||
"WF_Trigger_type": "Тип триггера",
|
||||
"add_icon_event_icon": "fa-square-plus",
|
||||
"add_icon_event_tooltip": "Добавить новую иконку",
|
||||
"add_option_event_icon": "fa-square-plus",
|
||||
@@ -742,4 +742,4 @@
|
||||
"settings_update_item_warning": "Обновить значение ниже. Будьте осторожны, следуя предыдущему формату. <b>Проверка не выполняется.</b>",
|
||||
"test_event_icon": "fa-vial-circle-check",
|
||||
"test_event_tooltip": "Сначала сохраните изменения, прежде чем проверять настройки."
|
||||
}
|
||||
}
|
||||
|
||||
718
front/php/templates/language/tr_tr.json
Executable file → Normal 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": "Açı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 TCP’nin %93’ünü ve UDP’nin %49’unu 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": "Açı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": ""
|
||||
}
|
||||
}
|
||||
|
||||
0
front/php/templates/language/uk_ua.json
Normal file → Executable 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": "在测试设置之前,请先保存更改。"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ 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 database import DB
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -41,8 +41,8 @@ The OMADA SDN plugin aims at synchronizing data between NetAlertX and a TPLINK O
|
||||
OMADA SDN limitation fixed by the plugin:
|
||||
0. OMADA SDN can't use DNS for names and keep using MAC ref: https://community.tp-link.com/en/business/forum/topic/503782
|
||||
- when you use an OMADA user Role = Administrator, the plugin will attempt to fix OMADA's shortcoming and populat the NAME field from NetAlertX (from DNS/DHCP/...)
|
||||

|
||||
-
|
||||

|
||||
|
||||
|
||||
can not fix some of tplinks OMADA SDN own limitations/bugs:
|
||||
1. OMADA SDN switches uplinks/downlinks is broken if the default router is not an OMADA native device
|
||||
|
||||
@@ -285,16 +285,18 @@ def main():
|
||||
mylog("verbose", [f"[{pluginName}] login to omada result is: {omada_login}"])
|
||||
|
||||
clients_list = callomada(["-t", "myomada", "clients"])
|
||||
client_list_count = clients_list.count("\n")
|
||||
mylog(
|
||||
"verbose",
|
||||
[f'[{pluginName}] clients found:"{clients_list.count("\n")}"\n{clients_list}'],
|
||||
[f'[{pluginName}] clients found:"{client_list_count}"\n{clients_list}'],
|
||||
)
|
||||
|
||||
switches_and_aps = callomada(["-t", "myomada", "devices"])
|
||||
switches_and_aps_count = switches_and_aps.count("\n")
|
||||
mylog(
|
||||
"verbose",
|
||||
[
|
||||
f'[{pluginName}] omada devices (switches, access points) found:"{switches_and_aps.count("\n")}" \n {switches_and_aps}'
|
||||
f'[{pluginName}] omada devices (switches, access points) found:"{switches_and_aps_count}" \n {switches_and_aps}'
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
@@ -45,7 +45,8 @@
|
||||
{
|
||||
"name": "urls",
|
||||
"type": "setting",
|
||||
"value": "WEBMON_urls_to_check"
|
||||
"value": "WEBMON_urls_to_check",
|
||||
"timeoutMultiplier": true
|
||||
}
|
||||
],
|
||||
"database_column_definitions": [
|
||||
|
||||
@@ -50,9 +50,12 @@ 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:
|
||||
@@ -61,6 +64,9 @@ def check_services_health(site):
|
||||
except:
|
||||
status = 503
|
||||
latency = 99999
|
||||
|
||||
mylog('verbose', [f'[{pluginName}] Result for {site} (status|latency) : {status}|{latency}'])
|
||||
|
||||
return status, latency
|
||||
|
||||
def service_monitoring(urls, plugin_objects):
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -66,6 +66,18 @@ let actionTypes = [
|
||||
"update_field", "delete_device"
|
||||
];
|
||||
|
||||
let emptyWorkflow = {
|
||||
"name": "New Workflow",
|
||||
"trigger": {
|
||||
"object_type": "Devices",
|
||||
"event_type": "insert"
|
||||
},
|
||||
"conditions": [
|
||||
],
|
||||
"actions": [
|
||||
]
|
||||
};
|
||||
|
||||
// --------------------------------------
|
||||
// Retrieve and process the data
|
||||
function getData() {
|
||||
@@ -1073,17 +1085,7 @@ function updateWorkflowsJson(workflows)
|
||||
// Get empty workflow JSON
|
||||
function getEmptyWorkflowJson()
|
||||
{
|
||||
return {
|
||||
"name": "New Workflow",
|
||||
"trigger": {
|
||||
"object_type": "Devices",
|
||||
"event_type": "create"
|
||||
},
|
||||
"conditions": [
|
||||
],
|
||||
"actions": [
|
||||
]
|
||||
}
|
||||
return emptyWorkflow;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -35,7 +35,8 @@ nav:
|
||||
- Security: SECURITY.md
|
||||
- Advanced guides:
|
||||
- Remote Networks: REMOTE_NETWORKS.md
|
||||
- Notifications Guide: NOTIFICATIONS.md
|
||||
- Notifications Guide: NOTIFICATIONS.md
|
||||
- Name Resolution: NAME_RESOLUTION.md
|
||||
- Authelia: AUTHELIA.md
|
||||
- Performance: PERFORMANCE.md
|
||||
- Reverse DNS: REVERSE_DNS.md
|
||||
@@ -57,10 +58,12 @@ nav:
|
||||
- Icons: ICONS.md
|
||||
- Network Topology: NETWORK_TREE.md
|
||||
- Troubleshooting:
|
||||
- Inspecting Logs: LOGGING.md
|
||||
- Debugging Tips: DEBUG_TIPS.md
|
||||
- Debugging Invalid JSON: DEBUG_INVALID_JSON.md
|
||||
- Debugging Plugins: DEBUG_PLUGINS.md
|
||||
- Debugging Web UI Port: WEB_UI_PORT_DEBUG.md
|
||||
- Debugging Workflows: WORKFLOWS_DEBUGGING.md
|
||||
- Development:
|
||||
- Plugin and app development:
|
||||
- Environment Setup: DEV_ENV_SETUP.md
|
||||
|
||||
@@ -33,7 +33,7 @@ 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 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
|
||||
# ----------------------------------------
|
||||
@@ -175,7 +178,7 @@ def main ():
|
||||
# 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()
|
||||
|
||||
|
||||
@@ -75,7 +75,6 @@ class DB():
|
||||
|
||||
return arr
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
def upgradeDB(self):
|
||||
"""
|
||||
@@ -929,4 +928,19 @@ def get_all_devices(db):
|
||||
return db.read(sql_devices_all)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
def get_array_from_sql_rows(rows):
|
||||
# Convert result into list of lists
|
||||
arr = []
|
||||
for row in rows:
|
||||
if isinstance(row, sqlite3.Row):
|
||||
arr.append(list(row)) # Convert row to list
|
||||
elif isinstance(row, (tuple, list)):
|
||||
arr.append(list(row)) # Already iterable, just convert to list
|
||||
else:
|
||||
arr.append([row]) # Handle single values safely
|
||||
|
||||
return arr
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ 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 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)
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -6,12 +6,13 @@ import uuid
|
||||
import socket
|
||||
import subprocess
|
||||
import requests
|
||||
from yattag import indent
|
||||
from json2table import convert
|
||||
|
||||
# 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
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -172,9 +173,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)
|
||||
|
||||
313
server/plugin.py
@@ -20,8 +20,150 @@ from notification import Notification_obj, write_notification
|
||||
from user_events_queue import UserEventsQueue
|
||||
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 = 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)
|
||||
executed_events.append(f"test with param {param}")
|
||||
execution_log.finalize_event("test")
|
||||
elif event == 'run':
|
||||
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 = Notification_obj(db)
|
||||
notificationObj = notification.create(sample_json, "")
|
||||
|
||||
# Run test
|
||||
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)
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -16,8 +16,7 @@ import json
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
""" class to manage schedules """
|
||||
import datetime
|
||||
|
||||
from logger import mylog, print_log
|
||||
from logger import mylog
|
||||
import conf
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
@@ -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'))
|
||||
|
||||
@@ -57,9 +57,7 @@ class ConditionGroup:
|
||||
|
||||
def __init__(self, group_json):
|
||||
|
||||
mylog('none', ["[WF] json.dumps(group_json)"])
|
||||
mylog('none', [json.dumps(group_json)])
|
||||
mylog('none', [group_json])
|
||||
mylog('verbose', [f"[WF] ConditionGroup json.dumps(group_json): {json.dumps(group_json)}"])
|
||||
|
||||
self.logic = group_json.get("logic", "AND").upper()
|
||||
self.conditions = []
|
||||
@@ -78,6 +76,6 @@ class ConditionGroup:
|
||||
elif self.logic == "OR":
|
||||
return any(results)
|
||||
else:
|
||||
m = f"[WF] Unsupported logic: {self.logic}"
|
||||
mylog('none', [m])
|
||||
m = f"[WF] ConditionGroup unsupported logic: {self.logic}"
|
||||
mylog('verbose', [m])
|
||||
raise ValueError(m)
|
||||
|
||||
@@ -50,20 +50,24 @@ class WorkflowManager:
|
||||
def process_event(self, event):
|
||||
"""Process the events. Check if events match a workflow trigger"""
|
||||
|
||||
mylog('verbose', [f"[WF] Processing event with GUID {event["GUID"]}"])
|
||||
evGuid = event["GUID"]
|
||||
|
||||
mylog('verbose', [f"[WF] Processing event with GUID {evGuid}"])
|
||||
|
||||
# Check if the trigger conditions match
|
||||
for workflow in self.workflows:
|
||||
|
||||
# Ensure workflow is enabled before proceeding
|
||||
if workflow.get("enabled", "No").lower() == "yes":
|
||||
wfName = workflow["name"]
|
||||
mylog('debug', [f"[WF] Checking if '{evGuid}' triggers the workflow '{wfName}'"])
|
||||
|
||||
# construct trigger object which also evaluates if the current event triggers it
|
||||
trigger = Trigger(workflow["trigger"], event, self.db)
|
||||
|
||||
if trigger.triggered:
|
||||
|
||||
mylog('verbose', [f"[WF] Event with GUID '{event["GUID"]}' triggered the workflow '{workflow["name"]}'"])
|
||||
mylog('verbose', [f"[WF] Event with GUID '{evGuid}' triggered the workflow '{wfName}'"])
|
||||
|
||||
self.execute_workflow(workflow, trigger)
|
||||
|
||||
@@ -80,6 +84,8 @@ class WorkflowManager:
|
||||
def execute_workflow(self, workflow, trigger):
|
||||
"""Execute the actions in the given workflow if conditions are met."""
|
||||
|
||||
wfName = workflow["name"]
|
||||
|
||||
# Ensure conditions exist
|
||||
if not isinstance(workflow.get("conditions"), list):
|
||||
m = f"[WF] workflow['conditions'] must be a list"
|
||||
@@ -93,7 +99,7 @@ class WorkflowManager:
|
||||
|
||||
if evaluator.evaluate(trigger): # If any group evaluates to True
|
||||
|
||||
mylog('none', [f"[WF] Workflow {workflow["name"]} will be executed - conditions were evaluated as TRUE"])
|
||||
mylog('none', [f"[WF] Workflow {wfName} will be executed - conditions were evaluated as TRUE"])
|
||||
mylog('debug', [f"[WF] Workflow condition_group: {condition_group}"])
|
||||
|
||||
self.execute_actions(workflow["actions"], trigger)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import sys
|
||||
import json
|
||||
|
||||
# Register NetAlertX directories
|
||||
INSTALL_PATH="/app"
|
||||
@@ -7,6 +8,7 @@ sys.path.extend([f"{INSTALL_PATH}/server"])
|
||||
import conf
|
||||
from logger import mylog, Logger
|
||||
from helper import get_setting_value, timeNowTZ
|
||||
from database import get_array_from_sql_rows
|
||||
|
||||
# Make sure log level is initialized correctly
|
||||
Logger(get_setting_value('LOG_LEVEL'))
|
||||
@@ -27,7 +29,8 @@ class Trigger:
|
||||
self.event = event # Store the triggered event context, if provided
|
||||
self.triggered = self.object_type == event["ObjectType"] and self.event_type == event["AppEventType"]
|
||||
|
||||
mylog('verbose', [f"[WF] self.triggered '{self.triggered}'"])
|
||||
mylog('debug', [f"""[WF] self.triggered '{self.triggered}' for event '{get_array_from_sql_rows(event)} and trigger {json.dumps(triggerJson)}' """])
|
||||
|
||||
|
||||
if self.triggered:
|
||||
# object type corresponds with the DB table name
|
||||
|
||||