mirror of
https://github.com/jokob-sk/NetAlertX.git
synced 2026-04-10 20:22:02 -07:00
Compare commits
327 Commits
7fd8b039ed
...
v24.10.31
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c6b5f0d18a | ||
|
|
a6322f6cfa | ||
|
|
c0bfb0d4e4 | ||
|
|
9c42cb0013 | ||
|
|
e42c3d8b76 | ||
|
|
f13d3c38aa | ||
|
|
38b8eaffe1 | ||
|
|
4be345af45 | ||
|
|
36dd3f9f06 | ||
|
|
a4b2fb0abf | ||
|
|
de35cdafda | ||
|
|
96bce2666f | ||
|
|
95d3fc55ab | ||
|
|
868210598f | ||
|
|
fa14e657c9 | ||
|
|
84c1aad700 | ||
|
|
3c6a48617a | ||
|
|
20c9b8c5ca | ||
|
|
10ed589cd5 | ||
|
|
bb33ab16fd | ||
|
|
12c848d3cd | ||
|
|
87a0dbba46 | ||
|
|
ea62b1116f | ||
|
|
b52c7ae0ed | ||
|
|
f46bfde782 | ||
|
|
463d7d7524 | ||
|
|
8e4e7bd76d | ||
|
|
cac35e2f20 | ||
|
|
425381a63e | ||
|
|
9f6e61581e | ||
|
|
9c255c77d1 | ||
|
|
c47ac62e9a | ||
|
|
7e2999b28a | ||
|
|
840413843b | ||
|
|
4c46b27643 | ||
|
|
907a3e1df8 | ||
|
|
27131af434 | ||
|
|
4d35013d3e | ||
|
|
4e481f9307 | ||
|
|
05e4de0dc8 | ||
|
|
14aa07c69b | ||
|
|
f0c90cef12 | ||
|
|
26503eaf52 | ||
|
|
c0f14e46ce | ||
|
|
439066510f | ||
|
|
500822327c | ||
|
|
ed933f91f1 | ||
|
|
bbb617ebda | ||
|
|
8b1e4635e6 | ||
|
|
44e217a924 | ||
|
|
400edd35d1 | ||
|
|
9d1fccfe29 | ||
|
|
6bad4764f6 | ||
|
|
d09bbbe73e | ||
|
|
7d0b583571 | ||
|
|
13a2e5ba26 | ||
|
|
4af9efa8f7 | ||
|
|
aa1a18015d | ||
|
|
abd2f66814 | ||
|
|
7dd77e06d4 | ||
|
|
4f859b5671 | ||
|
|
e24903a123 | ||
|
|
367a024860 | ||
|
|
987127302c | ||
|
|
8b1e732fa3 | ||
|
|
73b8ea9bfa | ||
|
|
77846df299 | ||
|
|
c91c31cfee | ||
|
|
ef2a102218 | ||
|
|
a8cc4de4d0 | ||
|
|
5f45308465 | ||
|
|
e62131b832 | ||
|
|
68fe5fffee | ||
|
|
8d198b34c4 | ||
|
|
166f700425 | ||
|
|
775f53d1d7 | ||
|
|
3c8dae5868 | ||
|
|
56f1e6adf8 | ||
|
|
12226cb899 | ||
|
|
2eb173b567 | ||
|
|
4ab8d67d76 | ||
|
|
a3aa81f369 | ||
|
|
53f798e50e | ||
|
|
eeb740f60d | ||
|
|
f3fd06725f | ||
|
|
eb16562e85 | ||
|
|
c77ae32736 | ||
|
|
7549a98877 | ||
|
|
02bf561c69 | ||
|
|
5fba247aaa | ||
|
|
cd4b556ee2 | ||
|
|
2471dfaf02 | ||
|
|
69d9584426 | ||
|
|
930f1a333e | ||
|
|
3d9bf32ec7 | ||
|
|
ff60ea82ea | ||
|
|
cb297aab8d | ||
|
|
7794380411 | ||
|
|
0c99c42b0a | ||
|
|
bb4f7616e4 | ||
|
|
1379923f30 | ||
|
|
60e9684084 | ||
|
|
2235a8cf8e | ||
|
|
15eb19fda1 | ||
|
|
3d51b1cd15 | ||
|
|
158ed324c2 | ||
|
|
d36486ef6d | ||
|
|
1767776dd9 | ||
|
|
507e0469d6 | ||
|
|
ae14229ca7 | ||
|
|
dcfeb51aa1 | ||
|
|
ab6e7d910b | ||
|
|
d6164a005b | ||
|
|
ca1d55b3c2 | ||
|
|
c4e0abf913 | ||
|
|
f9e6871ab2 | ||
|
|
30b8ecb743 | ||
|
|
506b8a17fc | ||
|
|
43c60586f4 | ||
|
|
a11d7d9c97 | ||
|
|
222a439212 | ||
|
|
48effdbbad | ||
|
|
62a0149435 | ||
|
|
8702ae032e | ||
|
|
82d2fa4125 | ||
|
|
189a4ece84 | ||
|
|
29de6654a8 | ||
|
|
06008058ab | ||
|
|
efc9a974b1 | ||
|
|
d91141f9ac | ||
|
|
e8d2e52ee2 | ||
|
|
d64b92c273 | ||
|
|
32bebe3ad4 | ||
|
|
2d119f39c0 | ||
|
|
f9b28b647b | ||
|
|
41a72f0292 | ||
|
|
129cd39ef8 | ||
|
|
68febd1350 | ||
|
|
669ce20a84 | ||
|
|
9427ff6453 | ||
|
|
7b2186073f | ||
|
|
30de0f9f93 | ||
|
|
d146b485c4 | ||
|
|
37290528fc | ||
|
|
b4d1505e42 | ||
|
|
afe5a2ae48 | ||
|
|
ef5dc885d9 | ||
|
|
a758548fea | ||
|
|
c6cfa398ef | ||
|
|
677e293138 | ||
|
|
ac259b1fab | ||
|
|
14996d6582 | ||
|
|
d44744657e | ||
|
|
615e5e4084 | ||
|
|
dd948b5e63 | ||
|
|
97a5cb6737 | ||
|
|
c6fe09d366 | ||
|
|
040f2792e4 | ||
|
|
d1d6d7f1ec | ||
|
|
33c16c4d00 | ||
|
|
cc8b57e790 | ||
|
|
57d8e97b60 | ||
|
|
91ad39e991 | ||
|
|
15ed621748 | ||
|
|
50304fd63b | ||
|
|
90689e5c69 | ||
|
|
5f4b2f114c | ||
|
|
e72a87ab43 | ||
|
|
044de61ab5 | ||
|
|
e5d835cfa9 | ||
|
|
e2d84a1885 | ||
|
|
e648acde5c | ||
|
|
a17e066f34 | ||
|
|
0bdc4c4ed1 | ||
|
|
9144fd0c3a | ||
|
|
02077d4654 | ||
|
|
e3b2039257 | ||
|
|
1fa38472e1 | ||
|
|
1e197ae749 | ||
|
|
7731a01f3c | ||
|
|
3ce08ba97d | ||
|
|
c58bbf21b1 | ||
|
|
3780e47117 | ||
|
|
e8f353024f | ||
|
|
7308797314 | ||
|
|
6e36f7d7aa | ||
|
|
8d3a4500e2 | ||
|
|
40d6bdc2b2 | ||
|
|
b7b2e0bc65 | ||
|
|
081d0f3400 | ||
|
|
a7f4565954 | ||
|
|
15a7779d6e | ||
|
|
2784f2ebeb | ||
|
|
d46046beea | ||
|
|
6233f4d646 | ||
|
|
31411e0a14 | ||
|
|
8d824af3bd | ||
|
|
f05f0d625a | ||
|
|
2fec3b6607 | ||
|
|
f285a28887 | ||
|
|
11cb47fada | ||
|
|
d8b413b5e7 | ||
|
|
656bba7ff7 | ||
|
|
a2cf8c1167 | ||
|
|
737cb07403 | ||
|
|
3febbc21cb | ||
|
|
7e14fae29c | ||
|
|
a16fe4561b | ||
|
|
f2afe9d681 | ||
|
|
f8c0a5a1ef | ||
|
|
631e992411 | ||
|
|
feafaff218 | ||
|
|
f6a06842cc | ||
|
|
0cc3ede86c | ||
|
|
aa277136c6 | ||
|
|
82ccb0c0b6 | ||
|
|
30750a9449 | ||
|
|
5278af48c5 | ||
|
|
77f19c3575 | ||
|
|
10df7363d6 | ||
|
|
06e49f7adb | ||
|
|
9fcbd9d64e | ||
|
|
c6888a79fd | ||
|
|
ef458903b7 | ||
|
|
b544734209 | ||
|
|
815810dc7a | ||
|
|
552d79eee8 | ||
|
|
2f70e2e8d8 | ||
|
|
4a20b66c92 | ||
|
|
36cec0ab38 | ||
|
|
6bde0f9084 | ||
|
|
f64ef5b881 | ||
|
|
1895f68233 | ||
|
|
d2fe53bc81 | ||
|
|
e9e45c34ae | ||
|
|
064a51acee | ||
|
|
7340ce6da2 | ||
|
|
703885308a | ||
|
|
71856b49a4 | ||
|
|
86c7d26107 | ||
|
|
d858f4f9d0 | ||
|
|
aefe470d31 | ||
|
|
99fb60c1b5 | ||
|
|
ec37e4d71b | ||
|
|
e240821d6c | ||
|
|
632e441dda | ||
|
|
24f7935891 | ||
|
|
dcc43d1f3c | ||
|
|
8f35bf36ff | ||
|
|
1548168eba | ||
|
|
2e35bac6ec | ||
|
|
ba348fc4c2 | ||
|
|
d3337e75a9 | ||
|
|
9e0bc043b0 | ||
|
|
29fdd0b115 | ||
|
|
48e92a186e | ||
|
|
1dcb66e972 | ||
|
|
fa0d6d312d | ||
|
|
a19fe342e7 | ||
|
|
c4fc68cac8 | ||
|
|
3a050c31a7 | ||
|
|
2cd406a390 | ||
|
|
b086417686 | ||
|
|
dbecbfc85f | ||
|
|
3f9e4c4425 | ||
|
|
4fd1869bde | ||
|
|
78025a376c | ||
|
|
615fd08f5b | ||
|
|
4839211fe1 | ||
|
|
19aaa92fa3 | ||
|
|
43aa40efbb | ||
|
|
95f48cb70d | ||
|
|
8c0da1d0df | ||
|
|
b0d07a6adc | ||
|
|
ee23ae19f7 | ||
|
|
0c73e49245 | ||
|
|
899a0c3608 | ||
|
|
d188b640e4 | ||
|
|
a95eb45924 | ||
|
|
f737a71939 | ||
|
|
9df97e0e33 | ||
|
|
4ce7077599 | ||
|
|
605a33330b | ||
|
|
9bd5ff10b4 | ||
|
|
45d3be2439 | ||
|
|
46209e3e47 | ||
|
|
9b9836cae2 | ||
|
|
89be97bfb2 | ||
|
|
3e4f64a7c6 | ||
|
|
50fbd6e616 | ||
|
|
5a96ad2304 | ||
|
|
25667014fc | ||
|
|
955472ef5c | ||
|
|
e32b60cafc | ||
|
|
3033c617fa | ||
|
|
1688836b4f | ||
|
|
f30b6b7fc1 | ||
|
|
0c5c754f38 | ||
|
|
da21ee6477 | ||
|
|
3a268add06 | ||
|
|
03b610a6ec | ||
|
|
38f70fd045 | ||
|
|
3473fabdbf | ||
|
|
46186e5d3b | ||
|
|
e0dd3ab53e | ||
|
|
c385ac68f4 | ||
|
|
e1c446b0df | ||
|
|
0413ac5fb4 | ||
|
|
01f8dc5f6b | ||
|
|
00451a6846 | ||
|
|
b181e2ada6 | ||
|
|
73a0a49934 | ||
|
|
b3ad58f5f3 | ||
|
|
03e0061b03 | ||
|
|
e5a63e9caa | ||
|
|
eb3a54ff1c | ||
|
|
b3b8196b64 | ||
|
|
408d8cb7c5 | ||
|
|
57d94634f1 | ||
|
|
3778dcb3ad | ||
|
|
393a0d8168 | ||
|
|
c98c22c27d | ||
|
|
54ae8a7b35 | ||
|
|
a2cc2b441e | ||
|
|
a3c0974e77 | ||
|
|
b7fa32f70a | ||
|
|
ae1673c1c3 |
28
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
28
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@@ -9,20 +9,6 @@ body:
|
|||||||
options:
|
options:
|
||||||
- label: I have searched the existing open and closed issues
|
- label: I have searched the existing open and closed issues
|
||||||
required: true
|
required: true
|
||||||
- type: checkboxes
|
|
||||||
attributes:
|
|
||||||
label: Am I willing to test this? 🧪
|
|
||||||
description: I rely on the community to test unreleased features. If you are requesting a feature, please be willing to test it within 48h of test request. Otherwise, the feature might be pulled from the code base.
|
|
||||||
options:
|
|
||||||
- label: I will do my best to test this feature on the `netlertx-dev` image when requested within 48h and report bugs to help deliver a great user experience for everyone and not to break existing installations.
|
|
||||||
required: true
|
|
||||||
- type: checkboxes
|
|
||||||
attributes:
|
|
||||||
label: Can I help implement this? 👩💻👨💻
|
|
||||||
description: The maintainer will provide guidance and help. The implementer will read the PR guidelines https://github.com/jokob-sk/NetAlertX/tree/main/docs#-pull-requests-prs
|
|
||||||
options:
|
|
||||||
- label: "Yes"
|
|
||||||
- label: "No"
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Is your feature request related to a problem? Please describe
|
label: Is your feature request related to a problem? Please describe
|
||||||
@@ -50,3 +36,17 @@ body:
|
|||||||
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
|
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Am I willing to test this? 🧪
|
||||||
|
description: I rely on the community to test unreleased features. If you are requesting a feature, please be willing to test it within 48h of test request. Otherwise, the feature might be pulled from the code base.
|
||||||
|
options:
|
||||||
|
- label: I will do my best to test this feature on the `netlertx-dev` image when requested within 48h and report bugs to help deliver a great user experience for everyone and not to break existing installations.
|
||||||
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Can I help implement this? 👩💻👨💻
|
||||||
|
description: The maintainer will provide guidance and help. The implementer will read the PR guidelines https://github.com/jokob-sk/NetAlertX/tree/main/docs#-pull-requests-prs
|
||||||
|
options:
|
||||||
|
- label: "Yes"
|
||||||
|
- label: "No"
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
FROM alpine:3.20 as builder
|
FROM alpine:3.20 AS builder
|
||||||
|
|
||||||
ARG INSTALL_DIR=/app
|
ARG INSTALL_DIR=/app
|
||||||
|
|
||||||
ENV PYTHONUNBUFFERED 1
|
ENV PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
# Install build dependencies
|
# Install build dependencies
|
||||||
RUN apk add --no-cache bash python3 python3-dev gcc musl-dev libffi-dev openssl-dev \
|
RUN apk add --no-cache bash python3 python3-dev gcc musl-dev libffi-dev openssl-dev \
|
||||||
@@ -21,7 +21,7 @@ RUN pip install netifaces tplink-omada-client pycryptodome requests paho-mqtt sc
|
|||||||
&& bash -c "find ${INSTALL_DIR} -type f \( -name '*.sh' -o -name '*.py' -o -name 'speedtest-cli' \) -exec chmod 750 {} \;"
|
&& bash -c "find ${INSTALL_DIR} -type f \( -name '*.sh' -o -name '*.py' -o -name 'speedtest-cli' \) -exec chmod 750 {} \;"
|
||||||
|
|
||||||
# second stage
|
# second stage
|
||||||
FROM alpine:3.20 as runner
|
FROM alpine:3.20 AS runner
|
||||||
|
|
||||||
ARG INSTALL_DIR=/app
|
ARG INSTALL_DIR=/app
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ ENV S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0
|
|||||||
|
|
||||||
RUN apk update --no-cache \
|
RUN apk update --no-cache \
|
||||||
&& apk add --no-cache bash zip lsblk gettext-envsubst sudo mtr tzdata s6-overlay \
|
&& apk add --no-cache bash zip lsblk gettext-envsubst sudo mtr tzdata s6-overlay \
|
||||||
&& apk add --no-cache curl arp-scan iproute2 iproute2-ss nmap nmap-scripts traceroute nbtscan net-tools net-snmp-tools bind-tools awake ca-certificates \
|
&& apk add --no-cache curl arp-scan iproute2 iproute2-ss nmap nmap-scripts traceroute nbtscan avahi avahi-tools openrc dbus net-tools net-snmp-tools bind-tools awake ca-certificates \
|
||||||
&& apk add --no-cache sqlite php83 php83-fpm php83-cgi php83-curl php83-sqlite3 php83-session \
|
&& apk add --no-cache sqlite php83 php83-fpm php83-cgi php83-curl php83-sqlite3 php83-session \
|
||||||
&& apk add --no-cache python3 nginx \
|
&& apk add --no-cache python3 nginx \
|
||||||
&& apk add --no-cache dcron \
|
&& apk add --no-cache dcron \
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
FROM debian:bookworm-slim
|
FROM debian:bookworm-slim
|
||||||
|
|
||||||
# default UID and GID
|
# default UID and GID
|
||||||
ENV USER=pi USER_ID=1000 USER_GID=1000 PORT=20211
|
ENV USER=pi USER_ID=1000 USER_GID=1000 PORT=20211
|
||||||
#TZ=Europe/London
|
#TZ=Europe/London
|
||||||
|
|
||||||
# Todo, figure out why using a workdir instead of full paths don't work
|
# Todo, figure out why using a workdir instead of full paths don't work
|
||||||
@@ -33,7 +33,7 @@ COPY --chmod=775 --chown=${USER_ID}:${USER_GID} . ${INSTALL_DIR}/
|
|||||||
RUN apt-get install -y \
|
RUN apt-get install -y \
|
||||||
tini snmp ca-certificates curl libwww-perl arp-scan perl apt-utils cron sudo \
|
tini snmp ca-certificates curl libwww-perl arp-scan perl apt-utils cron sudo \
|
||||||
nginx-light php php-cgi php-fpm php-sqlite3 php-curl sqlite3 dnsutils net-tools php-openssl \
|
nginx-light php php-cgi php-fpm php-sqlite3 php-curl sqlite3 dnsutils net-tools php-openssl \
|
||||||
python3 python3-dev iproute2 nmap python3-pip zip systemctl usbutils traceroute nbtscan
|
python3 python3-dev iproute2 nmap python3-pip zip systemctl usbutils traceroute nbtscan avahi avahi-tools openrc dbus
|
||||||
|
|
||||||
# Alternate dependencies
|
# Alternate dependencies
|
||||||
RUN apt-get install nginx nginx-core mtr php-fpm php8.2-fpm php-cli php8.2 php8.2-sqlite3 -y
|
RUN apt-get install nginx nginx-core mtr php-fpm php8.2-fpm php-cli php8.2 php8.2-sqlite3 -y
|
||||||
@@ -43,7 +43,7 @@ RUN phpenmod -v 8.2 sqlite3
|
|||||||
RUN apt-get install -y python3-venv
|
RUN apt-get install -y python3-venv
|
||||||
RUN python3 -m venv myenv
|
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 tplink-omada-client pycryptodome requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython cryptography librouteros "
|
RUN /bin/bash -c "source myenv/bin/activate && update-alternatives --install /usr/bin/python python /usr/bin/python3 10 && pip3 install tplink-omada-client pycryptodome requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython librouteros "
|
||||||
|
|
||||||
# Create a buildtimestamp.txt to later check if a new version was released
|
# Create a buildtimestamp.txt to later check if a new version was released
|
||||||
RUN date +%s > ${INSTALL_DIR}/front/buildtimestamp.txt
|
RUN date +%s > ${INSTALL_DIR}/front/buildtimestamp.txt
|
||||||
|
|||||||
14
README.md
14
README.md
@@ -1,12 +1,13 @@
|
|||||||
|
[](https://github.com/jokob-sk/NetAlertX)
|
||||||
|
[](https://hub.docker.com/r/jokobsk/netalertx)
|
||||||
|
[](https://hub.docker.com/r/jokobsk/netalertx)
|
||||||
|
[](https://github.com/jokob-sk/NetAlertX/releases)
|
||||||
|
[](https://discord.gg/NczTUTWyRr)
|
||||||
|
|
||||||
# 🖧🔍 Network scanner & notification framework
|
# 🖧🔍 Network scanner & notification framework
|
||||||
|
|
||||||
Get visibility of what's going on on your WIFI/LAN network. Schedule scans for devices, port changes and get alerts if unknown devices or changes are found. Write your own [Plugins](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins#readme) with auto-generated UI and in-build notification system. Build out and easily maintain your network source of truth (NSoT).
|
Get visibility of what's going on on your WIFI/LAN network. Schedule scans for devices, port changes and get alerts if unknown devices or changes are found. Write your own [Plugins](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins#readme) with auto-generated UI and in-build notification system. Build out and easily maintain your network source of truth (NSoT).
|
||||||
|
|
||||||
[](https://github.com/jokob-sk/NetAlertX)
|
|
||||||
[](https://hub.docker.com/r/jokobsk/netalertx)
|
|
||||||
[](https://hub.docker.com/r/jokobsk/netalertx)
|
|
||||||
[](https://github.com/jokob-sk/NetAlertX/releases)
|
|
||||||
[](https://github.com/sponsors/jokob-sk)
|
|
||||||
|
|
||||||
| 🐳 [Docker hub](https://registry.hub.docker.com/r/jokobsk/netalertx) | 📑 [Docker guide](https://github.com/jokob-sk/NetAlertX/blob/main/dockerfiles/README.md) |🆕 [Release notes](https://github.com/jokob-sk/NetAlertX/releases) | 📚 [All Docs](https://github.com/jokob-sk/NetAlertX/tree/main/docs) |
|
| 🐳 [Docker hub](https://registry.hub.docker.com/r/jokobsk/netalertx) | 📑 [Docker guide](https://github.com/jokob-sk/NetAlertX/blob/main/dockerfiles/README.md) |🆕 [Release notes](https://github.com/jokob-sk/NetAlertX/releases) | 📚 [All Docs](https://github.com/jokob-sk/NetAlertX/tree/main/docs) |
|
||||||
|----------------------|----------------------| ----------------------| ----------------------|
|
|----------------------|----------------------| ----------------------| ----------------------|
|
||||||
@@ -61,6 +62,8 @@ Head to [https://netalertx.com/](https://netalertx.com/) for more gifs and scree
|
|||||||
## Installation & Documentation
|
## Installation & Documentation
|
||||||
<!--- --------------------------------------------------------------------- --->
|
<!--- --------------------------------------------------------------------- --->
|
||||||
|
|
||||||
|
Supported browsers: Chrome, Firefox
|
||||||
|
|
||||||
| Docs | Link |
|
| Docs | Link |
|
||||||
|-------------|-------------|
|
|-------------|-------------|
|
||||||
| 📥🐳 | [Docker instructions](https://github.com/jokob-sk/NetAlertX/blob/main/dockerfiles/README.md)
|
| 📥🐳 | [Docker instructions](https://github.com/jokob-sk/NetAlertX/blob/main/dockerfiles/README.md)
|
||||||
@@ -92,6 +95,7 @@ Thank you to all the wonderful people who are sponsoring this project.
|
|||||||
<!-- SPONSORS-LIST DO NOT MODIFY BELOW -->
|
<!-- SPONSORS-LIST DO NOT MODIFY BELOW -->
|
||||||
| All Sponsors |
|
| All Sponsors |
|
||||||
|---|
|
|---|
|
||||||
|
| [joel72265](https://github.com/joel72265) |
|
||||||
|
|
||||||
<!-- SPONSORS-LIST DO NOT MODIFY ABOVE -->
|
<!-- SPONSORS-LIST DO NOT MODIFY ABOVE -->
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
SCAN_SUBNETS=['192.168.1.0/24 --interface=eth0']
|
SCAN_SUBNETS=['192.168.1.0/24 --interface=eth0']
|
||||||
TIMEZONE='Europe/Berlin'
|
TIMEZONE='Europe/Berlin'
|
||||||
LOADED_PLUGINS = ['ARPSCAN','CSVBCKP','DBCLNP', 'INTRNT','MAINT','NEWDEV','NSLOOKUP','NTFPRCS', 'PHOLUS','SETPWD','SMTP', 'SYNC', 'VNDRPDT', 'WORKFLOWS']
|
LOADED_PLUGINS = ['ARPSCAN','CSVBCKP','DBCLNP', 'INTRNT','MAINT','NEWDEV','NSLOOKUP','NTFPRCS', 'AVAHISCAN', 'SETPWD','SMTP', 'SYNC', 'VNDRPDT', 'WORKFLOWS']
|
||||||
|
|
||||||
DAYS_TO_KEEP_EVENTS=90
|
DAYS_TO_KEEP_EVENTS=90
|
||||||
# Used for generating links in emails. Make sure not to add a trailing slash!
|
# Used for generating links in emails. Make sure not to add a trailing slash!
|
||||||
@@ -28,7 +28,6 @@ REPORT_DASHBOARD_URL='http://netalertx'
|
|||||||
# Make sure at least these scanners are enabled for new installs, other defaults are taken from the config.json
|
# Make sure at least these scanners are enabled for new installs, other defaults are taken from the config.json
|
||||||
INTRNT_RUN='schedule'
|
INTRNT_RUN='schedule'
|
||||||
ARPSCAN_RUN='schedule'
|
ARPSCAN_RUN='schedule'
|
||||||
PHOLUS_RUN='on_new_device'
|
|
||||||
NSLOOKUP_RUN='before_name_updates'
|
NSLOOKUP_RUN='before_name_updates'
|
||||||
|
|
||||||
# Email
|
# Email
|
||||||
|
|||||||
@@ -64,7 +64,9 @@ services:
|
|||||||
# DELETE END anyone trying to use this file: comment out / delete ABOVE lines, they are only for development purposes
|
# DELETE END anyone trying to use this file: comment out / delete ABOVE lines, they are only for development purposes
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
environment:
|
environment:
|
||||||
|
# - APP_CONF_OVERRIDE={"SCAN_SUBNETS":"['192.168.1.0/24 --interface=eth1']","UI_theme":"Dark"}
|
||||||
- TZ=${TZ}
|
- TZ=${TZ}
|
||||||
- PORT=${PORT}
|
- PORT=${PORT}
|
||||||
# ❗ DANGER ZONE BELOW - Setting ALWAYS_FRESH_INSTALL=true will delete the content of the /db & /config folders
|
# ❗ DANGER ZONE BELOW - Setting ALWAYS_FRESH_INSTALL=true will delete the content of the /db & /config folders
|
||||||
- ALWAYS_FRESH_INSTALL=${ALWAYS_FRESH_INSTALL}
|
- ALWAYS_FRESH_INSTALL=${ALWAYS_FRESH_INSTALL}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
[](https://github.com/jokob-sk/NetAlertX)
|
[](https://github.com/jokob-sk/NetAlertX)
|
||||||
[](https://hub.docker.com/r/jokobsk/netalertx)
|
[](https://hub.docker.com/r/jokobsk/netalertx)
|
||||||
[](https://hub.docker.com/r/jokobsk/netalertx)
|
[](https://hub.docker.com/r/jokobsk/netalertx)
|
||||||

|
[](https://github.com/jokob-sk/NetAlertX/releases)
|
||||||
[](https://github.com/sponsors/jokob-sk)
|
[](https://discord.gg/NczTUTWyRr)
|
||||||
|
|
||||||
|
|
||||||
# NetAlertX 🖧🔍 Network scanner & notification framework
|
# NetAlertX 🖧🔍 Network scanner & notification framework
|
||||||
|
|
||||||
@@ -40,7 +41,8 @@ docker run -d --rm --network=host \
|
|||||||
| `PORT` |Port of the web interface | `20211` |
|
| `PORT` |Port of the web interface | `20211` |
|
||||||
| `LISTEN_ADDR` |Set the specific IP Address for the listener address for the nginx webserver (web interface). This could be useful when using multiple subnets to hide the web interface from all untrusted networks. | `0.0.0.0` |
|
| `LISTEN_ADDR` |Set the specific IP Address for the listener address for the nginx webserver (web interface). This could be useful when using multiple subnets to hide the web interface from all untrusted networks. | `0.0.0.0` |
|
||||||
|`TZ` |Time zone to display stats correctly. Find your time zone [here](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) | `Europe/Berlin` |
|
|`TZ` |Time zone to display stats correctly. Find your time zone [here](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) | `Europe/Berlin` |
|
||||||
|`ALWAYS_FRESH_INSTALL` | Setting to `true` will delete the content of the `/db` & `/config` folders. For testing purposes. Can be coupled with [watchtower](https://github.com/containrrr/watchtower) to have an always freshly installed `netalertx`/`-dev` image. | `N/A` |
|
|`APP_CONF_OVERRIDE` | JSON override for settings, e.g. `{"SCAN_SUBNETS":"['192.168.1.0/24 --interface=eth1']","UI_theme":"Dark"}` (Experimental 🧪) | `N/A` |
|
||||||
|
|`ALWAYS_FRESH_INSTALL` | If `true` will delete the content of the `/db` & `/config` folders. For testing purposes. Can be coupled with [watchtower](https://github.com/containrrr/watchtower) to have an always freshly installed `netalertx`/`netalertx-dev` image. | `N/A` |
|
||||||
|
|
||||||
### Docker paths
|
### Docker paths
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,20 @@ if [ "$ALWAYS_FRESH_INSTALL" = true ]; then
|
|||||||
rm -rf "$INSTALL_DIR_OLD/db/"*
|
rm -rf "$INSTALL_DIR_OLD/db/"*
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# OVERRIDE settings: Handling APP_CONF_OVERRIDE
|
||||||
|
# Check if APP_CONF_OVERRIDE is set
|
||||||
|
|
||||||
|
# remove old
|
||||||
|
rm "${INSTALL_DIR}/config/app_conf_override.json"
|
||||||
|
|
||||||
|
if [ -z "$APP_CONF_OVERRIDE" ]; then
|
||||||
|
echo "APP_CONF_OVERRIDE is not set. Skipping config file creation."
|
||||||
|
else
|
||||||
|
# Save the APP_CONF_OVERRIDE env variable as a JSON file
|
||||||
|
echo "$APP_CONF_OVERRIDE" > "${INSTALL_DIR}/config/app_conf_override.json"
|
||||||
|
echo "Config file saved to ${INSTALL_DIR}/config/app_conf_override.json"
|
||||||
|
fi
|
||||||
|
|
||||||
# 🔻 FOR BACKWARD COMPATIBILITY - REMOVE AFTER 12/12/2024
|
# 🔻 FOR BACKWARD COMPATIBILITY - REMOVE AFTER 12/12/2024
|
||||||
|
|
||||||
# Check if pialert.db exists, then create a symbolic link to app.db
|
# Check if pialert.db exists, then create a symbolic link to app.db
|
||||||
|
|||||||
275
docs/AUTHELIA.md
Executable file
275
docs/AUTHELIA.md
Executable file
@@ -0,0 +1,275 @@
|
|||||||
|
(DRAFT) Authelia support
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
theme: dark
|
||||||
|
|
||||||
|
default_2fa_method: "totp"
|
||||||
|
|
||||||
|
server:
|
||||||
|
address: 0.0.0.0:9091
|
||||||
|
endpoints:
|
||||||
|
enable_expvars: false
|
||||||
|
enable_pprof: false
|
||||||
|
authz:
|
||||||
|
forward-auth:
|
||||||
|
implementation: 'ForwardAuth'
|
||||||
|
authn_strategies:
|
||||||
|
- name: 'HeaderAuthorization'
|
||||||
|
schemes:
|
||||||
|
- 'Basic'
|
||||||
|
- name: 'CookieSession'
|
||||||
|
ext-authz:
|
||||||
|
implementation: 'ExtAuthz'
|
||||||
|
authn_strategies:
|
||||||
|
- name: 'HeaderAuthorization'
|
||||||
|
schemes:
|
||||||
|
- 'Basic'
|
||||||
|
- name: 'CookieSession'
|
||||||
|
auth-request:
|
||||||
|
implementation: 'AuthRequest'
|
||||||
|
authn_strategies:
|
||||||
|
- name: 'HeaderAuthRequestProxyAuthorization'
|
||||||
|
schemes:
|
||||||
|
- 'Basic'
|
||||||
|
- name: 'CookieSession'
|
||||||
|
legacy:
|
||||||
|
implementation: 'Legacy'
|
||||||
|
authn_strategies:
|
||||||
|
- name: 'HeaderLegacy'
|
||||||
|
- name: 'CookieSession'
|
||||||
|
disable_healthcheck: false
|
||||||
|
tls:
|
||||||
|
key: ""
|
||||||
|
certificate: ""
|
||||||
|
client_certificates: []
|
||||||
|
headers:
|
||||||
|
csp_template: ""
|
||||||
|
|
||||||
|
log:
|
||||||
|
## Level of verbosity for logs: info, debug, trace.
|
||||||
|
level: info
|
||||||
|
|
||||||
|
###############################################################
|
||||||
|
# The most important section
|
||||||
|
###############################################################
|
||||||
|
access_control:
|
||||||
|
## Default policy can either be 'bypass', 'one_factor', 'two_factor' or 'deny'.
|
||||||
|
default_policy: deny
|
||||||
|
networks:
|
||||||
|
- name: internal
|
||||||
|
networks:
|
||||||
|
- '192.168.0.0/18'
|
||||||
|
- '10.10.10.0/8' # Zerotier
|
||||||
|
- name: private
|
||||||
|
networks:
|
||||||
|
- '172.16.0.0/12'
|
||||||
|
rules:
|
||||||
|
- networks:
|
||||||
|
- private
|
||||||
|
domain:
|
||||||
|
- '*'
|
||||||
|
policy: bypass
|
||||||
|
- networks:
|
||||||
|
- internal
|
||||||
|
domain:
|
||||||
|
- '*'
|
||||||
|
policy: bypass
|
||||||
|
- domain:
|
||||||
|
# exclude itself from auth, should not happen as we use Traefik middleware on a case-by-case screnario
|
||||||
|
- 'auth.MYDOMAIN1.TLD'
|
||||||
|
- 'authelia.MYDOMAIN1.TLD'
|
||||||
|
- 'auth.MYDOMAIN2.TLD'
|
||||||
|
- 'authelia.MYDOMAIN2.TLD'
|
||||||
|
policy: bypass
|
||||||
|
- domain:
|
||||||
|
#All subdomains match
|
||||||
|
- 'MYDOMAIN1.TLD'
|
||||||
|
- '*.MYDOMAIN1.TLD'
|
||||||
|
policy: two_factor
|
||||||
|
- domain:
|
||||||
|
# This will not work yet as Authelio does not support multi-domain authentication
|
||||||
|
- 'MYDOMAIN2.TLD'
|
||||||
|
- '*.MYDOMAIN2.TLD'
|
||||||
|
policy: two_factor
|
||||||
|
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
identity_validation:
|
||||||
|
reset_password:
|
||||||
|
jwt_secret: "[REDACTED]"
|
||||||
|
|
||||||
|
identity_providers:
|
||||||
|
oidc:
|
||||||
|
enable_client_debug_messages: true
|
||||||
|
enforce_pkce: public_clients_only
|
||||||
|
hmac_secret: [REDACTED]
|
||||||
|
lifespans:
|
||||||
|
authorize_code: 1m
|
||||||
|
id_token: 1h
|
||||||
|
refresh_token: 90m
|
||||||
|
access_token: 1h
|
||||||
|
cors:
|
||||||
|
endpoints:
|
||||||
|
- authorization
|
||||||
|
- token
|
||||||
|
- revocation
|
||||||
|
- introspection
|
||||||
|
- userinfo
|
||||||
|
allowed_origins:
|
||||||
|
- "*"
|
||||||
|
allowed_origins_from_client_redirect_uris: false
|
||||||
|
jwks:
|
||||||
|
- key: [REDACTED]
|
||||||
|
certificate_chain:
|
||||||
|
clients:
|
||||||
|
- client_id: portainer
|
||||||
|
client_name: Portainer
|
||||||
|
# generate secret with "authelia crypto hash generate pbkdf2 --random --random.length 32 --random.charset alphanumeric"
|
||||||
|
# Random Password: [REDACTED]
|
||||||
|
# Digest: [REDACTED]
|
||||||
|
client_secret: [REDACTED]
|
||||||
|
token_endpoint_auth_method: 'client_secret_post'
|
||||||
|
public: false
|
||||||
|
authorization_policy: two_factor
|
||||||
|
consent_mode: pre-configured #explicit
|
||||||
|
pre_configured_consent_duration: '6M' #Must be re-authorised every 6 Months
|
||||||
|
scopes:
|
||||||
|
- openid
|
||||||
|
#- groups #Currently not supported in Authelia V
|
||||||
|
- email
|
||||||
|
- profile
|
||||||
|
redirect_uris:
|
||||||
|
- https://portainer.MYDOMAIN1.LTD
|
||||||
|
userinfo_signed_response_alg: none
|
||||||
|
|
||||||
|
- client_id: openproject
|
||||||
|
client_name: OpenProject
|
||||||
|
# generate secret with "authelia crypto hash generate pbkdf2 --random --random.length 32 --random.charset alphanumeric"
|
||||||
|
# Random Password: [REDACTED]
|
||||||
|
# Digest: [REDACTED]
|
||||||
|
client_secret: [REDACTED]
|
||||||
|
token_endpoint_auth_method: 'client_secret_basic'
|
||||||
|
public: false
|
||||||
|
authorization_policy: two_factor
|
||||||
|
consent_mode: pre-configured #explicit
|
||||||
|
pre_configured_consent_duration: '6M' #Must be re-authorised every 6 Months
|
||||||
|
scopes:
|
||||||
|
- openid
|
||||||
|
#- groups #Currently not supported in Authelia V
|
||||||
|
- email
|
||||||
|
- profile
|
||||||
|
redirect_uris:
|
||||||
|
- https://op.MYDOMAIN.TLD
|
||||||
|
#grant_types:
|
||||||
|
# - refresh_token
|
||||||
|
# - authorization_code
|
||||||
|
#response_types:
|
||||||
|
# - code
|
||||||
|
#response_modes:
|
||||||
|
# - form_post
|
||||||
|
# - query
|
||||||
|
# - fragment
|
||||||
|
userinfo_signed_response_alg: none
|
||||||
|
##################################################################
|
||||||
|
|
||||||
|
|
||||||
|
telemetry:
|
||||||
|
metrics:
|
||||||
|
enabled: false
|
||||||
|
address: tcp://0.0.0.0:9959
|
||||||
|
|
||||||
|
totp:
|
||||||
|
disable: false
|
||||||
|
issuer: authelia.com
|
||||||
|
algorithm: sha1
|
||||||
|
digits: 6
|
||||||
|
period: 30 ## The period in seconds a one-time password is valid for.
|
||||||
|
skew: 1
|
||||||
|
secret_size: 32
|
||||||
|
|
||||||
|
webauthn:
|
||||||
|
disable: false
|
||||||
|
timeout: 60s ## Adjust the interaction timeout for Webauthn dialogues.
|
||||||
|
display_name: Authelia
|
||||||
|
attestation_conveyance_preference: indirect
|
||||||
|
user_verification: preferred
|
||||||
|
|
||||||
|
ntp:
|
||||||
|
address: "pool.ntp.org"
|
||||||
|
version: 4
|
||||||
|
max_desync: 5s
|
||||||
|
disable_startup_check: false
|
||||||
|
disable_failure: false
|
||||||
|
|
||||||
|
authentication_backend:
|
||||||
|
password_reset:
|
||||||
|
disable: false
|
||||||
|
custom_url: ""
|
||||||
|
refresh_interval: 5m
|
||||||
|
file:
|
||||||
|
path: /config/users_database.yml
|
||||||
|
watch: true
|
||||||
|
password:
|
||||||
|
algorithm: argon2
|
||||||
|
argon2:
|
||||||
|
variant: argon2id
|
||||||
|
iterations: 3
|
||||||
|
memory: 65536
|
||||||
|
parallelism: 4
|
||||||
|
key_length: 32
|
||||||
|
salt_length: 16
|
||||||
|
|
||||||
|
password_policy:
|
||||||
|
standard:
|
||||||
|
enabled: false
|
||||||
|
min_length: 8
|
||||||
|
max_length: 0
|
||||||
|
require_uppercase: true
|
||||||
|
require_lowercase: true
|
||||||
|
require_number: true
|
||||||
|
require_special: true
|
||||||
|
## zxcvbn is a well known and used password strength algorithm. It does not have tunable settings.
|
||||||
|
zxcvbn:
|
||||||
|
enabled: false
|
||||||
|
min_score: 3
|
||||||
|
|
||||||
|
regulation:
|
||||||
|
max_retries: 3
|
||||||
|
find_time: 2m
|
||||||
|
ban_time: 5m
|
||||||
|
|
||||||
|
session:
|
||||||
|
name: authelia_session
|
||||||
|
secret: [REDACTED]
|
||||||
|
expiration: 60m
|
||||||
|
inactivity: 15m
|
||||||
|
cookies:
|
||||||
|
- domain: 'MYDOMAIN1.LTD'
|
||||||
|
authelia_url: 'https://auth.MYDOMAIN1.LTD'
|
||||||
|
name: 'authelia_session'
|
||||||
|
default_redirection_url: 'https://MYDOMAIN1.LTD'
|
||||||
|
- domain: 'MYDOMAIN2.LTD'
|
||||||
|
authelia_url: 'https://auth.MYDOMAIN2.LTD'
|
||||||
|
name: 'authelia_session_other'
|
||||||
|
default_redirection_url: 'https://MYDOMAIN2.LTD'
|
||||||
|
|
||||||
|
storage:
|
||||||
|
encryption_key: [REDACTED]
|
||||||
|
local:
|
||||||
|
path: /config/db.sqlite3
|
||||||
|
|
||||||
|
notifier:
|
||||||
|
disable_startup_check: true
|
||||||
|
smtp:
|
||||||
|
address: MYOTHERDOMAIN.LTD:465
|
||||||
|
timeout: 5s
|
||||||
|
username: "USER@DOMAIN"
|
||||||
|
password: "[REDACTED]"
|
||||||
|
sender: "Authelia <postmaster@MYOTHERDOMAIN.LTD>"
|
||||||
|
identifier: NAME@MYOTHERDOMAIN.LTD
|
||||||
|
subject: "[Authelia] {title}"
|
||||||
|
startup_check_address: postmaster@MYOTHERDOMAIN.LTD
|
||||||
|
|
||||||
|
```
|
||||||
@@ -8,10 +8,10 @@ There are 3 artifacts that can be used to backup the application:
|
|||||||
| File | Description | Limitations |
|
| File | Description | Limitations |
|
||||||
|-----------------------|-------------------------------|-------------------------------|
|
|-----------------------|-------------------------------|-------------------------------|
|
||||||
| `/db/app.db` | Database file(s) | The database file might be in an uncommitted state or corrupted |
|
| `/db/app.db` | Database file(s) | The database file might be in an uncommitted state or corrupted |
|
||||||
| `/config/app.conf` | Configuration file | Doesn't contain settings from the Maintenance section |
|
| `/config/app.conf` | Configuration file | Can be overridden with the [`APP_CONF_OVERRIDE` env variable](https://github.com/jokob-sk/NetAlertX/tree/main/dockerfiles#docker-environment-variables). |
|
||||||
| `/config/devices.csv` | CSV file containing device information | Doesn't contain historical data |
|
| `/config/devices.csv` | CSV file containing device information | Doesn't contain historical data |
|
||||||
|
|
||||||
## Data and cackup storage
|
## Data and backup storage
|
||||||
|
|
||||||
To decide on a backup strategy, check where the data is stored:
|
To decide on a backup strategy, check where the data is stored:
|
||||||
|
|
||||||
@@ -73,7 +73,7 @@ End-result: Partial restore (historical data & configurations from the Maintenan
|
|||||||
|
|
||||||
#### Recovery:
|
#### Recovery:
|
||||||
|
|
||||||
Even with a corrupted database you can recover what I would argue is 99% of the configuration (except of a couple of settings under Maintenance).
|
Even with a corrupted database you can recover what I would argue is 99% of the configuration.
|
||||||
|
|
||||||
- map the `/config/app.conf` file as described in the [Setup documentation](https://github.com/jokob-sk/NetAlertX/blob/main/dockerfiles/README.md#docker-paths).
|
- map the `/config/app.conf` file as described in the [Setup documentation](https://github.com/jokob-sk/NetAlertX/blob/main/dockerfiles/README.md#docker-paths).
|
||||||
- rename the `devices_<timestamp>.csv` to `devices.csv` and place it in the `/config` folder
|
- rename the `devices_<timestamp>.csv` to `devices.csv` and place it in the `/config` folder
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
| Pholus_Scan | Scan results of the Pholus python network penetration script. | ![Screen8][screen8] |
|
| Pholus_Scan | Scan results of the Pholus python network penetration script. | ![Screen8][screen8] |
|
||||||
| Plugins_Events | For capturing events exposed by a plugin via the `last_result.log` file. If unique then saved into the `Plugins_Objects` table. Entries are deleted once processed and stored in the `Plugins_History` and/or `Plugins_Objects` tables. | ![Screen10][screen10] |
|
| Plugins_Events | For capturing events exposed by a plugin via the `last_result.log` file. If unique then saved into the `Plugins_Objects` table. Entries are deleted once processed and stored in the `Plugins_History` and/or `Plugins_Objects` tables. | ![Screen10][screen10] |
|
||||||
| Plugins_History | History of all entries from the `Plugins_Events` table | ![Screen11][screen11] |
|
| Plugins_History | History of all entries from the `Plugins_Events` table | ![Screen11][screen11] |
|
||||||
| Plugins_Language_Strings | Language strings colelcted from the plugin `config.json` files used for string resolution in the frontend. | ![Screen12][screen12] |
|
| Plugins_Language_Strings | Language strings collected from the plugin `config.json` files used for string resolution in the frontend. | ![Screen12][screen12] |
|
||||||
| Plugins_Objects | Unique objects detected by individual plugins. | ![Screen13][screen13] |
|
| Plugins_Objects | Unique objects detected by individual plugins. | ![Screen13][screen13] |
|
||||||
| Sessions | Used to display sessions in the charts | ![Screen15][screen15] |
|
| Sessions | Used to display sessions in the charts | ![Screen15][screen15] |
|
||||||
| Settings | Database representation of the sum of all settings from `app.conf` and plugins coming from `config.json` files. | ![Screen16][screen16] |
|
| Settings | Database representation of the sum of all settings from `app.conf` and plugins coming from `config.json` files. | ![Screen16][screen16] |
|
||||||
|
|||||||
@@ -76,3 +76,16 @@ In the above output notice the section logging how many events are produced by t
|
|||||||
These values, if formatted correctly, will also show up in the UI:
|
These values, if formatted correctly, will also show up in the UI:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
### Sharing application state
|
||||||
|
|
||||||
|
Sometimes specific log sections are needed to debug issues. The Devices and CurrentScan table data is sometimes needed to figure out what's wrong.
|
||||||
|
|
||||||
|
1. Please set `LOG_LEVEL` to `trace` (Disable it once you have the info as this produces big log files).
|
||||||
|
2. Wait for the issue to occur.
|
||||||
|
3. Search for `================ DEVICES table content ================` in your logs.
|
||||||
|
4. Search for `================ CurrentScan table content ================` in your logs.
|
||||||
|
5. Open a new issue and post (redacted) output into the issue description (or send to the netalertx@gmail.com email if sensitive data present).
|
||||||
|
6. Please set `LOG_LEVEL` to `debug` or lower.
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,17 @@ services:
|
|||||||
# Other service configurations...
|
# Other service configurations...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 5. Sharing application state
|
||||||
|
|
||||||
|
Sometimes specific log sections are needed to debug issues. The Devices and CurrentScan table data is sometimes needed to figure out what's wrong.
|
||||||
|
|
||||||
|
1. Please set `LOG_LEVEL` to `trace` (Disable it once you have the info as this produces big log files).
|
||||||
|
2. Wait for the issue to occur.
|
||||||
|
3. Search for `================ DEVICES table content ================` in your logs.
|
||||||
|
4. Search for `================ CurrentScan table content ================` in your logs.
|
||||||
|
5. Open a new issue and post (redacted) output into the issue description (or send to the netalertx@gmail.com email if sensitive data present).
|
||||||
|
6. Please set `LOG_LEVEL` to `debug` or lower.
|
||||||
|
|
||||||
## 📃Common issues
|
## 📃Common issues
|
||||||
|
|
||||||
### Permissions
|
### Permissions
|
||||||
@@ -81,3 +92,7 @@ sudo dpkg -i libseccomp2_2.5.3-2_armhf.deb
|
|||||||
```
|
```
|
||||||
|
|
||||||
The link above will probably break in time too. Go to https://packages.debian.org/sid/armhf/libseccomp2/download to find the new version number and put that in the url.
|
The link above will probably break in time too. Go to https://packages.debian.org/sid/armhf/libseccomp2/download to find the new version number and put that in the url.
|
||||||
|
|
||||||
|
### Only Router and own device show up
|
||||||
|
|
||||||
|
Make sure that the subnet and interface in SCAN_SUBNETS are the correct ones. If your device/NAS has multiple ethernet ports, you probably need to change eth0 to something else!
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
## Development environemnt set up
|
## Development environment set up
|
||||||
|
|
||||||
>[!NOTE]
|
>[!NOTE]
|
||||||
> Replace `/development` with the path where your code files will be stored. The default container name is `netalertx` so there might be a conflict with your running containers.
|
> Replace `/development` with the path where your code files will be stored. The default container name is `netalertx` so there might be a conflict with your running containers.
|
||||||
@@ -52,13 +52,19 @@ A command to stop, remove the container and the image (replace `netalertx` and `
|
|||||||
|
|
||||||
- `sudo docker container stop netalertx ; sudo docker container rm netalertx ; sudo docker image rm netalertx-netalertx`
|
- `sudo docker container stop netalertx ; sudo docker container rm netalertx ; sudo docker image rm netalertx-netalertx`
|
||||||
|
|
||||||
### Restart hanging python script
|
### Restart the server backend
|
||||||
|
|
||||||
SSH into the container and kill & restart the main script loop
|
Most code changes can be tetsed without rebuilding the container. When working on the python server backend, you only need to restart the server.
|
||||||
|
|
||||||
|
1. You can usually restart the backend via Maintenance > Logs > Restart server
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
2. If above doesn't work, SSH into the container and kill & restart the main script loop
|
||||||
|
|
||||||
- `sudo docker exec -it netalertx /bin/bash`
|
- `sudo docker exec -it netalertx /bin/bash`
|
||||||
- `pkill -f "python /app/server" && python /app/server & `
|
- `pkill -f "python /app/server" && python /app/server & `
|
||||||
|
|
||||||
|
3. If none of the above work, restart the docker image. This is usually the last resort as sometimes the Docker engine becomes unresponsive and the whole engine needs to be restarted.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ NetAlertX comes with MQTT support, allowing you to show all detected devices as
|
|||||||
|
|
||||||
- Please note that discovery takes about ~10s per device.
|
- Please note that discovery takes about ~10s per device.
|
||||||
- Deleting of devices is not handled automatically. Please use [MQTT Explorer](https://mqtt-explorer.com/) to delete devices in the broker (Home Assistant), if needed.
|
- Deleting of devices is not handled automatically. Please use [MQTT Explorer](https://mqtt-explorer.com/) to delete devices in the broker (Home Assistant), if needed.
|
||||||
|
- For optimization reasons, the devices are not always fully synchronized. You can delete Plugin objects as described in the [MQTT plugin](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/_publisher_mqtt#forcing-an-update) docs to force a full synchronization.
|
||||||
|
|
||||||
|
|
||||||
## 🧭 Guide
|
## 🧭 Guide
|
||||||
|
|||||||
@@ -11,16 +11,15 @@ There are 4 ways how to influence notifications:
|
|||||||
> It's recommended to use the same schedule interval for all plugins responsible for scanning devices, otherwise false positives might be reported if different devices are discovered by different plugins. Check the **Settings** > **Enabled settings** section for a warning:
|
> It's recommended to use the same schedule interval for all plugins responsible for scanning devices, otherwise false positives might be reported if different devices are discovered by different plugins. Check the **Settings** > **Enabled settings** section for a warning:
|
||||||
> 
|
> 
|
||||||
|
|
||||||
|
|
||||||
## Device settings 💻
|
## Device settings 💻
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
There are 4 settings on the device for influencing notifications. You can:
|
There are 4 settings on the device for influencing notifications. You can:
|
||||||
|
|
||||||
1. Completely disable the scanning of the device
|
1. **Scan Device** - Completely disable the scanning of the device.
|
||||||
2. **Alert all events**, connections, disconnections, IP changes (noisy, usually not recommended)
|
2. **Alert Events** - Enables alerts of connections, disconnections, IP changes.
|
||||||
3. **Alert down** - alerts when a device goes down. This setting overrides disabled Alert All Events, so you will get a notification of a device going down even if you don't have Alert All Events ticked.
|
3. **Alert Down** - Alerts when a device goes down. This setting overrides a disabled **Alert Events** setting, so you will get a notification of a device going down even if you don't have **Alert Events** ticked.
|
||||||
4. **Skip repeated notifications**, if for example you know there is a temporary issue and want to pause the same notification for this device for a given time.
|
4. **Skip repeated notifications**, if for example you know there is a temporary issue and want to pause the same notification for this device for a given time.
|
||||||
|
|
||||||
## Plugin settings 🔌
|
## Plugin settings 🔌
|
||||||
@@ -40,7 +39,7 @@ Click the **Read more in the docs.** Link at the top of each plugin to get more
|
|||||||
|
|
||||||
In Notification Processing settings, you can specify blanket rules. These allow you to specify exceptions to the Plugin and Device settings and will override those.
|
In Notification Processing settings, you can specify blanket rules. These allow you to specify exceptions to the Plugin and Device settings and will override those.
|
||||||
|
|
||||||
1. Notify on (`NTFPRCS_INCLUDED_SECTIONS`) allows you to specify which events trigger notifications. Usual setups will have `new_devices`, `down_devices`, and possibly `events` set. Setting `plugin` might be too noisy for most setups. More info in the [NTFPRCS plugin](/front/plugins/notification_processing/README.md)
|
1. Notify on (`NTFPRCS_INCLUDED_SECTIONS`) allows you to specify which events trigger notifications. Usual setups will have `new_devices`, `down_devices`, and possibly `down_reconnected` set. Including `plugin` (dependenton the Plugin `<plugin>_WATCH` and `<plugin>_REPORT_ON` settings) and `events` (dependent on the on-device **Alert Events** setting) might be too noisy for most setups. More info in the [NTFPRCS plugin](/front/plugins/notification_processing/README.md)
|
||||||
2. Alert down after (`NTFPRCS_alert_down_time`) is useful if you want to wait for some time before the system sends out a down notification for a device. This is related to the on-device **Alert down** setting and only devices with this checked will trigger a down notification.
|
2. Alert down after (`NTFPRCS_alert_down_time`) is useful if you want to wait for some time before the system sends out a down notification for a device. This is related to the on-device **Alert down** setting and only devices with this checked will trigger a down notification.
|
||||||
3. A filter to allow you to set device-specific exceptions to New devices being added to the app.
|
3. A filter to allow you to set device-specific exceptions to New devices being added to the app.
|
||||||
4. A filter to allow you to set device-specific exceptions to generated Events.
|
4. A filter to allow you to set device-specific exceptions to generated Events.
|
||||||
|
|||||||
31
docs/PERFORMANCE.md
Executable file
31
docs/PERFORMANCE.md
Executable file
@@ -0,0 +1,31 @@
|
|||||||
|
# Performance tips
|
||||||
|
|
||||||
|
The application runs regular maintenance and DB cleanup tasks. If these tasks fail, you might encounter performance issues.
|
||||||
|
|
||||||
|
Most performance issues are caused by a big database or large log files. Enabling unnecessary plugins will also lead to performance degradation.
|
||||||
|
|
||||||
|
You can always check the size of your database and database tables under the Maintenance page.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> For around 100 devices the database should be approximately `50MB` and none of the entries (rows) should exceed the value of `10 000` on a healthy system. These numbers will depend on your network activity and settings.
|
||||||
|
|
||||||
|
## Maintenance plugins
|
||||||
|
|
||||||
|
There are 2 plugins responsible for maintaining the overal health of the application. One is responsible for the database cleanup and one for other tasks, such as log cleanup.
|
||||||
|
|
||||||
|
### DB Cleanup (DBCLNP)
|
||||||
|
|
||||||
|
The database cleanup plugin. Check details and related setting in the [DB Cleanup plugin docs](/front/plugins/db_cleanup/README.md). Make sure the plugin is not failing by checking the logs. Try changing the schedule `DBCLNP_RUN_SCHD` and the timeout `DBCLNP_RUN_TIMEOUT` (increase) if the plugin is failing to execute.
|
||||||
|
|
||||||
|
### Maintenance (MAINT)
|
||||||
|
|
||||||
|
The maintenance plugin. Check details and related setting in the [Maintenance plugin docs](/front/plugins/maintenance/README.md). Make sure the plugin is not failing by checking the logs. Try changing the schedule `MAINT_RUN_SCHD` and the timeout `MAINT_RUN_TIMEOUT` (increase) if the plugin is failing to execute.
|
||||||
|
|
||||||
|
## Scan frequency and coverage
|
||||||
|
|
||||||
|
The more often you scan the networks the more resources, traffic and DB read/write cycles are executed. Especially on busy networks and lower end hardware, consider increasing scan intervals (`<PLUGIN>_RUN_SCHD`) and timeouts (`<PLUGIN>_RUN_TIMEOUT`).
|
||||||
|
|
||||||
|
Also consider decreasing the scanned subnet, e.g. from `/16` to `/24` if need be.
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ The `config.json` file is the manifest of the plugin. It contains mainly setting
|
|||||||
|
|
||||||
## Execution order
|
## Execution order
|
||||||
|
|
||||||
The execution order is used to specify wwhen a plugin is executed. This is useful if a plugin has access and surfaces more information than others. If a device is detected by 2 plugins and inserted into the `CurrentScan` table, the plugin with the higher priority (e.g.: `Level_0` is a higher priority than `Level_1`) will insert it's values first. These values (devices) will be then prioritized over any values inserted later.
|
The execution order is used to specify when a plugin is executed. This is useful if a plugin has access and surfaces more information than others. If a device is detected by 2 plugins and inserted into the `CurrentScan` table, the plugin with the higher priority (e.g.: `Level_0` is a higher priority than `Level_1`) will insert it's values first. These values (devices) will be then prioritized over any values inserted later.
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
@@ -361,7 +361,7 @@ Plugin results are always inserted into the standard `Plugin_Objects` database t
|
|||||||
>3. That's it. The app takes care of the rest. It loops thru the objects discovered by the plugin, takes the results line-by-line, and inserts them into the database table specified in `"mapped_to_table"`. The columns are translated from the generic plugin columns to the target table columns via the `"mapped_to_column"` property in the column definitions.
|
>3. That's it. The app takes care of the rest. It loops thru the objects discovered by the plugin, takes the results line-by-line, and inserts them into the database table specified in `"mapped_to_table"`. The columns are translated from the generic plugin columns to the target table columns via the `"mapped_to_column"` property in the column definitions.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> You can create a column mapping with a default value via the `mapped_to_column_data` property. This means that the value of the given column will always be this value. That also menas that the `"column": "NameDoesntMatter"` is not important as there is no database source column.
|
> You can create a column mapping with a default value via the `mapped_to_column_data` property. This means that the value of the given column will always be this value. That also means that the `"column": "NameDoesntMatter"` is not important as there is no database source column.
|
||||||
|
|
||||||
|
|
||||||
>🔍 Example:
|
>🔍 Example:
|
||||||
@@ -518,6 +518,60 @@ Required attributes are:
|
|||||||
| (optional) `"override_value"` | Used to determine a user-defined override for the setting. Useful for template-based plugins, where you can choose to leave the current value or override it with the value defined in the setting. (Work in progress) |
|
| (optional) `"override_value"` | Used to determine a user-defined override for the setting. Useful for template-based plugins, where you can choose to leave the current value or override it with the value defined in the setting. (Work in progress) |
|
||||||
| (optional) `"events"` | Used to trigger the plugin. Usually used on the `RUN` setting. Not fully tested in all scenarios. Will show a play button next to the setting. After clicking, an event is generated for the backend in the `Parameters` database table to process the front-end event on the next run. |
|
| (optional) `"events"` | Used to trigger the plugin. Usually used on the `RUN` setting. Not fully tested in all scenarios. Will show a play button next to the setting. After clicking, an event is generated for the backend in the `Parameters` database table to process the front-end event on the next run. |
|
||||||
|
|
||||||
|
### UI Component Types Documentation
|
||||||
|
|
||||||
|
This section outlines the structure and types of UI components, primarily used to build HTML forms or interactive elements dynamically. Each UI component has a `"type"` which defines its structure, behavior, and rendering options.
|
||||||
|
|
||||||
|
#### UI Component JSON Structure
|
||||||
|
The UI component is defined as a JSON object containing a list of `elements`. Each element specifies how it should behave, with properties like `elementType`, `elementOptions`, and any associated `transformers` to modify the data. The example below demonstrates how a component with two elements (`span` and `select`) is structured:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"function": "dev_Icon",
|
||||||
|
"type": {
|
||||||
|
"dataType": "string",
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"elementType": "span",
|
||||||
|
"elementOptions": [
|
||||||
|
{ "cssClasses": "input-group-addon iconPreview" },
|
||||||
|
{ "getStringKey": "Gen_SelectToPreview" },
|
||||||
|
{ "customId": "NEWDEV_dev_Icon_preview" }
|
||||||
|
],
|
||||||
|
"transformers": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"elementType": "select",
|
||||||
|
"elementHasInputValue": 1,
|
||||||
|
"elementOptions": [
|
||||||
|
{ "cssClasses": "col-xs-12" },
|
||||||
|
{
|
||||||
|
"onChange": "updateIconPreview(this)"
|
||||||
|
},
|
||||||
|
{ "customParams": "NEWDEV_dev_Icon,NEWDEV_dev_Icon_preview" }
|
||||||
|
],
|
||||||
|
"transformers": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### Rendering Logic
|
||||||
|
|
||||||
|
The code snippet provided demonstrates how the elements are iterated over to generate their corresponding HTML. Depending on the `elementType`, different HTML tags (like `<select>`, `<input>`, `<textarea>`, `<button>`, etc.) are created with the respective attributes such as `onChange`, `my-data-type`, and `class` based on the provided `elementOptions`. Events can also be attached to elements like buttons or select inputs.
|
||||||
|
|
||||||
|
### Key Element Types
|
||||||
|
|
||||||
|
- **`select`**: Renders a dropdown list. Additional options like `isMultiSelect` and event handlers (e.g., `onChange`) can be attached.
|
||||||
|
- **`input`**: Handles various types of input fields, including checkboxes, text, and others, with customizable attributes like `readOnly`, `placeholder`, etc.
|
||||||
|
- **`button`**: Generates clickable buttons with custom event handlers (`onClick`), icons, or labels.
|
||||||
|
- **`textarea`**: Creates a multi-line input box for text input.
|
||||||
|
- **`span`**: Used for inline text or content with customizable classes and data attributes.
|
||||||
|
|
||||||
|
Each element may also have associated events (e.g., running a scan or triggering a notification) defined under `Events`.
|
||||||
|
|
||||||
|
|
||||||
##### Supported settings `function` values
|
##### Supported settings `function` values
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ There is also an in-app Help / FAQ section that should be answering frequently a
|
|||||||
- [Invalid JSON errors debug help](/docs/DEBUG_INVALID_JSON.md)
|
- [Invalid JSON errors debug help](/docs/DEBUG_INVALID_JSON.md)
|
||||||
- [Troubleshooting Plugins](/docs/DEBUG_PLUGINS.md)
|
- [Troubleshooting Plugins](/docs/DEBUG_PLUGINS.md)
|
||||||
- [File Permissions](/docs/FILE_PERMISSIONS.md)
|
- [File Permissions](/docs/FILE_PERMISSIONS.md)
|
||||||
|
- [Performance tips](/docs/PERFORMANCE.md)
|
||||||
|
|
||||||
#### 🔝 Popular/Suggested
|
#### 🔝 Popular/Suggested
|
||||||
|
|
||||||
@@ -63,6 +64,7 @@ There is also an in-app Help / FAQ section that should be answering frequently a
|
|||||||
|
|
||||||
- [Version history (legacy)](/docs/VERSIONS_HISTORY.md)
|
- [Version history (legacy)](/docs/VERSIONS_HISTORY.md)
|
||||||
- [Reverse proxy (Nginx, Apache, SWAG)](/docs/REVERSE_PROXY.md)
|
- [Reverse proxy (Nginx, Apache, SWAG)](/docs/REVERSE_PROXY.md)
|
||||||
|
- [Setting up Authelia](/docs/AUTHELIA.md) (DRAFT)
|
||||||
|
|
||||||
#### 👩💻For Developers👨💻
|
#### 👩💻For Developers👨💻
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,29 @@ If you are running a DNS server, such as **AdGuard**, set up **Private reverse D
|
|||||||
5. Click **Apply** to save your settings.
|
5. Click **Apply** to save your settings.
|
||||||
|
|
||||||
|
|
||||||
|
### Specifying the DNS in the container
|
||||||
|
|
||||||
|
You can specify the DNS server in the docker-compose to improve name resolution on your network.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
netalertx:
|
||||||
|
container_name: netalertx
|
||||||
|
image: "jokobsk/netalertx:latest"
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- /home/netalertx/config:/app/config
|
||||||
|
- /home/netalertx/db:/app/db
|
||||||
|
- /home/netalertx/log:/app/front/log
|
||||||
|
environment:
|
||||||
|
- TZ=Europe/Berlin
|
||||||
|
- PORT=20211
|
||||||
|
network_mode: host
|
||||||
|
dns: # specifying the DNS servers used for the container
|
||||||
|
- 10.8.0.1
|
||||||
|
- 10.8.0.17
|
||||||
|
```
|
||||||
|
|
||||||
### Using a custom resolv.conf file
|
### Using a custom resolv.conf file
|
||||||
|
|
||||||
You can configure a custom **/etc/resolv.conf** file in **docker-compose.yml** and set the nameserver to your LAN DNS server (e.g.: Pi-Hole). See the relevant [resolv.conf man](https://www.man7.org/linux/man-pages/man5/resolv.conf.5.html) entry for details.
|
You can configure a custom **/etc/resolv.conf** file in **docker-compose.yml** and set the nameserver to your LAN DNS server (e.g.: Pi-Hole). See the relevant [resolv.conf man](https://www.man7.org/linux/man-pages/man5/resolv.conf.5.html) entry for details.
|
||||||
|
|||||||
139
docs/SUBNETS.md
139
docs/SUBNETS.md
@@ -1,107 +1,130 @@
|
|||||||
# Subnets configuration
|
# Subnets Configuration
|
||||||
|
|
||||||
You need to specify the network interface and the network mask. You can also configure multiple subnets and specify VLANS (see exceptions below).
|
You need to specify the network interface and the network mask. You can also configure multiple subnets and specify VLANs (see VLAN exceptions below).
|
||||||
|
|
||||||
|
`ARPSCAN` can scan multiple networks if the network allows it. To scan networks directly, the subnets must be accessible from the network where NetAlertX is running. This means NetAlertX needs to have access to the interface attached to that subnet. You can verify this by running the following command in the container:
|
||||||
|
|
||||||
|
`sudo arp-scan --interface=eth0 192.168.1.0/24`
|
||||||
|
|
||||||
|
In this example, `--interface=eth0 192.168.1.0/24` represents a neighboring subnet. If this command returns no results, the network is not accessible due to your network or firewall restrictions.
|
||||||
|
|
||||||
|
If direct scans are not possible, you can use [supplementing plugins](https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/README.md) that use alternate methods. Protocols used by the `SNMPDSC` or `DHCPLSS` plugins have good support and usually can be used as a workaround.
|
||||||
|
|
||||||
|
Alternatively, you can set up separate NetAlertX instances running on the subnets and synchronize the results into one instance with the [`SYNC` plugin](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/sync).
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> You may need to increase the time between scans `ARPSCAN_RUN_SCHD` and the timeout `ARPSCAN_RUN_TIMEOUT` (and similar setting on related plugins) when adding more subnets. If the timeout setting is exceeded, the scan is cancelled to prevent application hanging from rogue plugins. Check [debugging plugins](/docs/DEBUG_PLUGINS.md) for more tips.
|
> You may need to increase the time between scans `ARPSCAN_RUN_SCHD` and the timeout `ARPSCAN_RUN_TIMEOUT` (and similar settings for related plugins) when adding more subnets. If the timeout setting is exceeded, the scan is canceled to prevent the application from hanging due to rogue plugins.
|
||||||
|
> Check [debugging plugins](/docs/DEBUG_PLUGINS.md) for more tips.
|
||||||
|
|
||||||
## Examples
|
## Example Values
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> Please use the UI to configure settings as that ensures that the config file is in the correct format. Edit `app.conf` directly only when really necessary.
|
> Please use the UI to configure settings as it ensures the config file is in the correct format. Edit `app.conf` directly only when really necessary.
|
||||||
> 
|
> 
|
||||||
|
|
||||||
* Examples for one and two subnets (❗ Note the `['...','...']` format):
|
* **Examples for one and two subnets:**
|
||||||
* One subnet: `SCAN_SUBNETS = ['192.168.1.0/24 --interface=eth0']`
|
* One subnet: `SCAN_SUBNETS = ['192.168.1.0/24 --interface=eth0']`
|
||||||
* Two subnets: `SCAN_SUBNETS = ['192.168.1.0/24 --interface=eth0','192.168.1.0/24 --interface=eth1 -vlan=107']`
|
* Two subnets: `SCAN_SUBNETS = ['192.168.1.0/24 --interface=eth0','192.168.1.0/24 --interface=eth1 -vlan=107']`
|
||||||
|
|
||||||
|
If you get timeout messages, decrease the network mask (e.g.: from `/16` to `/24`) or increase the `TIMEOUT` setting (e.g.: `ARPSCAN_RUN_TIMEOUT` to `300` (5-minute timeout)) for the plugin and the interval between scans (e.g.: `ARPSCAN_RUN_SCHD` to `*/10 * * * *` (scans every 10 minutes)).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Explanation
|
## Explanation
|
||||||
|
|
||||||
### Network mask
|
### Network Mask
|
||||||
|
|
||||||
**Example value: `192.168.1.0/24`**
|
**Example value:** `192.168.1.0/24`
|
||||||
|
|
||||||
The arp-scan time itself depends on the number of IP addresses to check.
|
The `arp-scan` time itself depends on the number of IP addresses to check.
|
||||||
|
|
||||||
> The number of IPs to check depends on the [network mask](https://www.calculator.net/ip-subnet-calculator.html) you set on the `SCAN_SUBNETS` setting.
|
> The number of IPs to check depends on the [network mask](https://www.calculator.net/ip-subnet-calculator.html) you set in the `SCAN_SUBNETS` setting.
|
||||||
> For example, a `/24` mask results in 256 IPs to check, whereas a `/16` mask checks around 65,536. Every IP takes a couple of seconds. This means that with an incorrect configuration, the arp-scan will take hours to complete instead of seconds.
|
> For example, a `/24` mask results in 256 IPs to check, whereas a `/16` mask checks around 65,536 IPs. Each IP takes a couple of seconds, so an incorrect configuration could make `arp-scan` take hours instead of seconds.
|
||||||
|
|
||||||
Specify the network filter (which **significantly** speeds up the scan process). For example, the filter `192.168.1.0/24` covers IP ranges `192.168.1.0` to `192.168.1.255`.
|
Specify the network filter, which **significantly** speeds up the scan process. For example, the filter `192.168.1.0/24` covers IP ranges from `192.168.1.0` to `192.168.1.255`.
|
||||||
|
|
||||||
### Network interface (adapter)
|
### Network Interface (Adapter)
|
||||||
|
|
||||||
**Example value: `--interface=eth0`**
|
**Example value:** `--interface=eth0`
|
||||||
|
|
||||||
The adapter will probably be `eth0` or `eth1`. (Check `System info` > `Network Hardware` or run `iwconfig` in the container to find your interface name(s))
|
The adapter will probably be `eth0` or `eth1`. (Check `System Info` > `Network Hardware` or run `iwconfig` in the container to find your interface name(s)).
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> Alterantive to `iwconfig` run `ip -o link show | awk -F': ' '!/lo|vir|docker/ {print $2}'` in your container to find your interface name(s) (e.g.: `eth0`, `eth1`).
|
> As an alternative to `iwconfig`, run `ip -o link show | awk -F': ' '!/lo|vir|docker/ {print $2}'` in your container to find your interface name(s) (e.g.: `eth0`, `eth1`).
|
||||||
|
|
||||||
### VLANs
|
### VLANs
|
||||||
|
|
||||||
**Example value: `-vlan=107`**
|
**Example value:** `-vlan=107`
|
||||||
|
|
||||||
- Append e.g.: ` -vlan=107` to the interface field (e.g.: `eth0 -vlan=107`) for multiple vlans. More details in this [comment in this issue](https://github.com/jokob-sk/NetAlertX/issues/170#issuecomment-1419902988)
|
- Append `-vlan=107` to the interface field (e.g.: `eth0 -vlan=107`) for multiple VLANs. More details are available in this [comment](https://github.com/jokob-sk/NetAlertX/issues/170#issuecomment-1419902988).
|
||||||
|
|
||||||
|
#### VLANs on a Hyper-V Setup
|
||||||
|
|
||||||
#### VLANs on a Hyper-V setup
|
> Community-sourced content by [mscreations](https://github.com/mscreations) from this [discussion](https://github.com/jokob-sk/NetAlertX/discussions/404).
|
||||||
|
|
||||||
> Community sourced content by [mscreations](https://github.com/mscreations) from this [discussion](https://github.com/jokob-sk/NetAlertX/discussions/404).
|
**Tested Setup:** Bare Metal → Hyper-V on Win Server 2019 → Ubuntu 22.04 VM → Docker → NetAlertX.
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> The setup this was tested on: Bare Metal -> Hyper-V on Win Server 2019 -> Ubuntu 22.04 VM -> Docker -> NetAlertX.
|
|
||||||
|
|
||||||
**Approach 1 (may cause issues):**
|
**Approach 1 (may cause issues):**
|
||||||
|
Configure multiple network adapters in Hyper-V with distinct VLANs connected to each one using Hyper-V's network setup. However, this action can potentially lead to the Docker host's inability to handle network traffic correctly. This might interfere with other applications such as Authentik.
|
||||||
|
|
||||||
Configure multiple network adapters in Hyper-V with distinct VLANs connected to each one using Hyper-V's network setup. However, this action can potentially lead to the Docker host's inability to handle network traffic correctly. The issue may stem from the creation of routes for network time servers or domain controllers on every interface, thereby preventing proper synchronization of the underlying Ubuntu VM. This interference can affect the performance of other applications such as Authentik.
|
**Approach 2 (working example):**
|
||||||
|
|
||||||
**Approach 2 (working example)**
|
|
||||||
|
|
||||||
Network connections to switches are configured as trunk and allow all VLANs access to the server.
|
Network connections to switches are configured as trunk and allow all VLANs access to the server.
|
||||||
|
|
||||||
By default Hyper-V only allows untagged packets through to the VM interface and no VLAN tagged packets get through. In order to fix this follow these steps:
|
By default, Hyper-V only allows untagged packets through to the VM interface, blocking VLAN-tagged packets. To fix this, follow these steps:
|
||||||
|
|
||||||
1) Run the following command in Powershell on the Hyper-V machine:
|
1. Run the following command in PowerShell on the Hyper-V machine:
|
||||||
|
|
||||||
```shell
|
```powershell
|
||||||
Set-VMNetworkAdapterVlan -VMName <Docker VM Name> -Trunk -NativeVlanId 0 -AllowedVlanIdList "<comma separated list of vlans>"
|
Set-VMNetworkAdapterVlan -VMName <Docker VM Name> -Trunk -NativeVlanId 0 -AllowedVlanIdList "<comma separated list of vlans>"
|
||||||
```
|
```
|
||||||
|
|
||||||
(There might be other ways how adjust this.)
|
|
||||||
|
|
||||||
2) Within the VM, set up sub-interfaces for each of the VLANs so they can be scanned. On Ubuntu 22.04 Netplan can be used.
|
2. Within the VM, set up sub-interfaces for each VLAN to enable scanning. On Ubuntu 22.04, Netplan can be used. In /etc/netplan/00-installer-config.yaml, add VLAN definitions:
|
||||||
|
|
||||||
In /etc/netplan/00-installer-config.yaml, add vlan definitions:
|
```yaml
|
||||||
|
|
||||||
```
|
network:
|
||||||
network:
|
ethernets:
|
||||||
ethernets:
|
eth0:
|
||||||
eth0:
|
dhcp4: yes
|
||||||
dhcp4: yes
|
vlans:
|
||||||
vlans:
|
eth0.2:
|
||||||
eth0.2:
|
id: 2
|
||||||
id: 2
|
link: eth0
|
||||||
link: eth0
|
addresses: [ "192.168.2.2/24" ]
|
||||||
addresses: [ "192.168.2.2/24" ]
|
routes:
|
||||||
routes:
|
- to: 192.168.2.0/24
|
||||||
- to: 192.168.2.0/24
|
via: 192.168.1.1
|
||||||
via: 192.168.1.1
|
```
|
||||||
```
|
|
||||||
|
|
||||||
3) Run `sudo netplan apply` and the interfaces are then available to scan in NetAlertX.
|
3. Run `sudo netplan apply` to activate the interfaces for scanning in NetAlertX.
|
||||||
4) In this case, use `192.168.2.0/24 --interface=eth0.2` in NetAlertX
|
|
||||||
|
|
||||||
#### VLAN 🔍Example:
|
In this case, use `192.168.2.0/24 --interface=eth0.2` in NetAlertX.
|
||||||
|
|
||||||

|
#### VLAN Support & Exceptions
|
||||||
|
|
||||||
#### Support for VLANS (& exceptions)
|
Please note the accessibility of macvlans when configured on the same computer. This is a general networking behavior, but feel free to clarify via a PR/issue.
|
||||||
|
|
||||||
Please note the accessibility of the macvlans when they are configured on the same computer. My understanding this is a general networking behavior, but feel free to clarify via a PR/issue.
|
|
||||||
|
|
||||||
- NetAlertX does not detect the macvlan container when it is running on the same computer.
|
- NetAlertX does not detect the macvlan container when it is running on the same computer.
|
||||||
- NetAlertX recognizes the macvlan container when it is running on a different computer.
|
- NetAlertX recognizes the macvlan container when it is running on a different computer.
|
||||||
|
|
||||||
|
|
||||||
|
### Wi-Fi Extenders
|
||||||
|
|
||||||
|
A Wi-Fi extender typically works by creating a separate network or subnet, which can cause certain network scanning tools, like `arp-scan`, to be unable to detect devices behind the extender.
|
||||||
|
|
||||||
|
This happens because `arp-scan` uses ARP (Address Resolution Protocol) to map IP addresses to MAC addresses on the local network. Since ARP is a Layer 2 (data link layer) protocol, it usually only works within a single broadcast domain, which is typically limited to a single router or network segment.
|
||||||
|
|
||||||
|
When you introduce a Wi-Fi extender, it may isolate devices on different segments of the network, meaning ARP packets cannot easily traverse from one segment (your main network) to another (the network behind the extender).
|
||||||
|
|
||||||
|
To scan devices behind the extender, you can try:
|
||||||
|
|
||||||
|
- Scanning the specific subnet that the extender uses, if it is separate from the main network.
|
||||||
|
- Using [supplementing plugins](https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/README.md) that use alternate methods. Protocols used by the `SNMPDSC` or `DHCPLSS` plugins have good support and usually can be used as a workaround.
|
||||||
|
|
||||||
|
Check the [plugins list](https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/README.md) to find a plugin supported by your router and your network setup.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
BIN
docs/img/DEV_ENV_SETUP/Maintenance_Logs_Restart_server.png
Executable file
BIN
docs/img/DEV_ENV_SETUP/Maintenance_Logs_Restart_server.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 59 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 82 KiB |
BIN
docs/img/PERFORMANCE/db_size_check.png
Executable file
BIN
docs/img/PERFORMANCE/db_size_check.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 61 KiB |
@@ -17,7 +17,7 @@ showSpinner()
|
|||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
|
|
||||||
// Load JSON data from the provided URL
|
// Load JSON data from the provided URL
|
||||||
$.getJSON('/api/table_appevents.json', function(data) {
|
$.getJSON('api/table_appevents.json', function(data) {
|
||||||
// Process the JSON data and generate UI dynamically
|
// Process the JSON data and generate UI dynamically
|
||||||
processData(data)
|
processData(data)
|
||||||
|
|
||||||
|
|||||||
@@ -12,11 +12,26 @@
|
|||||||
----------------------------------------------------------------------------- */
|
----------------------------------------------------------------------------- */
|
||||||
:root {
|
:root {
|
||||||
--color-aqua: #00c0ef;
|
--color-aqua: #00c0ef;
|
||||||
|
--color-blue: #0060df;
|
||||||
--color-green: #00a65a;
|
--color-green: #00a65a;
|
||||||
--color-yellow: #f39c12;
|
--color-yellow: #f39c12;
|
||||||
--color-red: #dd4b39;
|
--color-red: #dd4b39;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -----------------------------------------------------------------------------
|
||||||
|
Helper Classes
|
||||||
|
----------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
.pointer
|
||||||
|
{
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.question
|
||||||
|
{
|
||||||
|
cursor: help;
|
||||||
|
}
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
Text Classes
|
Text Classes
|
||||||
----------------------------------------------------------------------------- */
|
----------------------------------------------------------------------------- */
|
||||||
@@ -124,6 +139,21 @@
|
|||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
|
||||||
|
.hideOnBigScreen{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 767px) { /* on mobile */
|
||||||
|
|
||||||
|
.hideOnMobile{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
Main Sections
|
Main Sections
|
||||||
----------------------------------------------------------------------------- */
|
----------------------------------------------------------------------------- */
|
||||||
@@ -197,6 +227,12 @@
|
|||||||
{
|
{
|
||||||
line-height: 30px;
|
line-height: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body
|
||||||
|
{
|
||||||
|
background-image: url('../img/background.png');
|
||||||
|
}
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
Customized Main Menu
|
Customized Main Menu
|
||||||
----------------------------------------------------------------------------- */
|
----------------------------------------------------------------------------- */
|
||||||
@@ -261,7 +297,7 @@
|
|||||||
.main-sidebar {
|
.main-sidebar {
|
||||||
padding-top: 50px;
|
padding-top: 50px;
|
||||||
}
|
}
|
||||||
.content-header {
|
.content-header #pageTitle{
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -745,6 +781,47 @@ height: 50px;
|
|||||||
.infobox_label {
|
.infobox_label {
|
||||||
font-size: 16px !important;
|
font-size: 16px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.deviceSelector
|
||||||
|
{
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.deviceSelector input
|
||||||
|
{
|
||||||
|
width: 100% !important;
|
||||||
|
display: inline-grid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------- */
|
||||||
|
/* Presence */
|
||||||
|
/* --------------------------------------------------------- */
|
||||||
|
.presencenceKey
|
||||||
|
{
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.presenceOnlineNow{
|
||||||
|
background-color: var(--color-green);
|
||||||
|
}
|
||||||
|
|
||||||
|
.presenceOnlinePast{
|
||||||
|
background-color: var(--color-blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
.presenceOnlinePastMiss{
|
||||||
|
background-color: var(--color-yellow);
|
||||||
|
}
|
||||||
|
|
||||||
|
.presenceKeyBoxes
|
||||||
|
{
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
display: inline-block;
|
||||||
|
/* background: #fff; */
|
||||||
|
opacity: .75;
|
||||||
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------- */
|
/* --------------------------------------------------------- */
|
||||||
/* report */
|
/* report */
|
||||||
/* --------------------------------------------------------- */
|
/* --------------------------------------------------------- */
|
||||||
@@ -769,20 +846,20 @@ height: 50px;
|
|||||||
/* settings */
|
/* settings */
|
||||||
/* --------------------------------------------------------- */
|
/* --------------------------------------------------------- */
|
||||||
|
|
||||||
@media (max-width: 767px) {
|
@media (max-width: 767px) { /* on mobile */
|
||||||
/* hide on mobile */
|
/* hide on mobile */
|
||||||
.setting_description {
|
.setting_description {
|
||||||
/* color: red; */
|
/* color: red; */
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.setting_input{
|
/* .setting_input{
|
||||||
width:70%;
|
width:70%;
|
||||||
/* background-color: red; */
|
|
||||||
}
|
}
|
||||||
.setting_name
|
.setting_name
|
||||||
{
|
{
|
||||||
width:30%;
|
width:30%;
|
||||||
}
|
} */
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: 768px) {
|
@media (min-width: 768px) {
|
||||||
@@ -790,14 +867,14 @@ height: 50px;
|
|||||||
/* color: green; */
|
/* color: green; */
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
.setting_input{
|
/* .setting_input{
|
||||||
width:40%;
|
width:40%;
|
||||||
/* background-color: green; */
|
|
||||||
}
|
}
|
||||||
.setting_name
|
.setting_name
|
||||||
{
|
{
|
||||||
width:19%;
|
width:19%;
|
||||||
}
|
} */
|
||||||
}
|
}
|
||||||
|
|
||||||
.settingswrap
|
.settingswrap
|
||||||
@@ -862,10 +939,10 @@ height: 50px;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.table_row {
|
#settingsPage .table_row {
|
||||||
padding: 3px;
|
padding: 3px;
|
||||||
width:100%;
|
/* width:100%; */
|
||||||
display: flex;
|
/* display: flex; */
|
||||||
border-bottom-width: 1px;
|
border-bottom-width: 1px;
|
||||||
border-bottom-style: solid;
|
border-bottom-style: solid;
|
||||||
border-color: #606060;
|
border-color: #606060;
|
||||||
@@ -885,10 +962,6 @@ height: 50px;
|
|||||||
font-weight: 300;
|
font-weight: 300;
|
||||||
}
|
}
|
||||||
|
|
||||||
.setting_description
|
|
||||||
{
|
|
||||||
width:40%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.myhidden
|
.myhidden
|
||||||
{
|
{
|
||||||
@@ -1029,7 +1102,11 @@ input[readonly] {
|
|||||||
|
|
||||||
.settingsSearchWrap
|
.settingsSearchWrap
|
||||||
{
|
{
|
||||||
padding:10px;
|
/* padding:10px; */
|
||||||
|
/* display: flex; */
|
||||||
|
justify-content: center; /* Centers horizontally */
|
||||||
|
align-items: center; /* Centers vertically */
|
||||||
|
/* height: 60px; */
|
||||||
}
|
}
|
||||||
|
|
||||||
.settings-sticky-bottom-section {
|
.settings-sticky-bottom-section {
|
||||||
@@ -1039,11 +1116,12 @@ input[readonly] {
|
|||||||
/* opacity: 0.8; */
|
/* opacity: 0.8; */
|
||||||
bottom: 30px;
|
bottom: 30px;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
margin:1px;
|
/* margin:1px; */
|
||||||
border-width: 1px;
|
border-width: 1px;
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
border-color: inherit;
|
border-color: inherit;
|
||||||
/* width: 87%; */
|
/* width: 87%; */
|
||||||
|
padding: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.settings-sticky-bottom-section:hover {
|
.settings-sticky-bottom-section:hover {
|
||||||
@@ -1062,7 +1140,7 @@ input[readonly] {
|
|||||||
width: 14px;
|
width: 14px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: -6px;
|
right: -6px;
|
||||||
top: 6px;
|
top: 13px;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1074,16 +1152,71 @@ input[readonly] {
|
|||||||
.saveSettingsWrapper button
|
.saveSettingsWrapper button
|
||||||
{
|
{
|
||||||
width:70%;
|
width:70%;
|
||||||
margin-top:20px;
|
/* margin-top:20px; */
|
||||||
margin-left:15%;
|
margin-left:15%;
|
||||||
margin-bottom:20px;
|
/* margin-bottom:20px; */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#settingsPage .select2-selection
|
||||||
|
{
|
||||||
|
width: initial;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#settingsPage .form-control
|
||||||
|
{
|
||||||
|
min-height: 42px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#settingsPage .select2-selection
|
||||||
|
{
|
||||||
|
background-color: rgb(96, 96, 96);
|
||||||
|
}
|
||||||
|
#settingsPage .select2-container
|
||||||
|
{
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#settingsPage .select2-container .selection
|
||||||
|
{
|
||||||
|
width: 100% !important;
|
||||||
|
display: inline-grid;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Basic style for the div elements */
|
||||||
|
#settingsPage .setting_overriden_by_env {
|
||||||
|
position: relative;
|
||||||
|
/* width: 300px;
|
||||||
|
height: 200px; */
|
||||||
|
background-color: #f3f3f3;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Style for the overlay */
|
||||||
|
#settingsPage .setting_overriden_by_env::after {
|
||||||
|
content: "Overridden with ENV variable";
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background: rgba(0, 0, 0, 0.6); /* semi-transparent black overlay */
|
||||||
|
color: white;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 700;
|
||||||
|
z-index: 11;
|
||||||
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------- */
|
/* ----------------------------------------------------------------- */
|
||||||
/* Devices page */
|
/* Devices page */
|
||||||
/* ----------------------------------------------------------------- */
|
/* ----------------------------------------------------------------- */
|
||||||
|
|
||||||
#txtIconFA {
|
.iconPreview {
|
||||||
min-width: 40px;
|
min-width: 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1097,11 +1230,6 @@ input[readonly] {
|
|||||||
font-size: large;
|
font-size: large;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pointer
|
|
||||||
{
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.drag
|
.drag
|
||||||
{
|
{
|
||||||
cursor: move; /* fallback if grab cursor is unsupported */
|
cursor: move; /* fallback if grab cursor is unsupported */
|
||||||
@@ -1110,21 +1238,21 @@ input[readonly] {
|
|||||||
cursor: -webkit-grab;
|
cursor: -webkit-grab;
|
||||||
}
|
}
|
||||||
|
|
||||||
.db_info_table_row .select2-container--default .select2-selection--multiple .select2-selection__choice
|
.select2-container--default .select2-selection--multiple .select2-selection__choice
|
||||||
{
|
{
|
||||||
background-color:#258744;
|
background-color:#258744 !important;
|
||||||
}
|
}
|
||||||
.db_info_table_row .select2-container--default .select2-selection--multiple
|
.select2-container--default .select2-selection--multiple
|
||||||
{
|
{
|
||||||
background-color:#606060;
|
background-color:#606060 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-container .select2-dropdown
|
.select2-container .select2-dropdown
|
||||||
{
|
{
|
||||||
background-color:#606060;
|
background-color:#606060 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.networkPageHelp{
|
.helpIconSmallTopRight{
|
||||||
position: absolute;
|
position: absolute;
|
||||||
font-size: x-small;
|
font-size: x-small;
|
||||||
margin-bottom: 6px;
|
margin-bottom: 6px;
|
||||||
@@ -1241,7 +1369,8 @@ input[readonly] {
|
|||||||
border: solid;
|
border: solid;
|
||||||
border-color:cyan;
|
border-color:cyan;
|
||||||
}
|
}
|
||||||
#networkTree .netStatus-Off-line i
|
#networkTree .netStatus-Off-line i,
|
||||||
|
#networkTree .netStatus-Off-line svg
|
||||||
{
|
{
|
||||||
color: #dd4b39;
|
color: #dd4b39;
|
||||||
}
|
}
|
||||||
@@ -1322,7 +1451,17 @@ input[readonly] {
|
|||||||
.plugin-content #tabs-content-location
|
.plugin-content #tabs-content-location
|
||||||
{
|
{
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
|
/* padding-top: 0; */
|
||||||
|
}
|
||||||
|
|
||||||
|
.integrations-plugins .content
|
||||||
|
{
|
||||||
|
display: table;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plugin-content .tab-content
|
||||||
|
{
|
||||||
|
padding-top: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.plugins-description
|
.plugins-description
|
||||||
@@ -1377,6 +1516,33 @@ input[readonly] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.textOverflow
|
||||||
|
{
|
||||||
|
white-space: nowrap; /* Prevent text from wrapping to a new line */
|
||||||
|
overflow: hidden; /* Hide the overflowed text */
|
||||||
|
text-overflow: ellipsis; /* Show ellipsis (...) */
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-stretched
|
||||||
|
{
|
||||||
|
min-width: -moz-available;
|
||||||
|
min-width: -webkit-fill-available;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pluginBadge
|
||||||
|
{
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pluginBadgeWrap
|
||||||
|
{
|
||||||
|
float: right;
|
||||||
|
display: ruby;
|
||||||
|
z-index: 1;
|
||||||
|
position: sticky;
|
||||||
|
margin-top: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
Spin
|
Spin
|
||||||
----------------------------------------------------------------------------- */
|
----------------------------------------------------------------------------- */
|
||||||
@@ -1390,7 +1556,7 @@ input[readonly] {
|
|||||||
|
|
||||||
opacity: 0.8;
|
opacity: 0.8;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
z-index: 99;
|
z-index: 800;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pa_spinner {
|
.pa_spinner {
|
||||||
@@ -1403,7 +1569,7 @@ input[readonly] {
|
|||||||
padding: 15px;
|
padding: 15px;
|
||||||
width: 200px;
|
width: 200px;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
z-index: 100;
|
z-index: 801;
|
||||||
}
|
}
|
||||||
|
|
||||||
#loadingSpinner
|
#loadingSpinner
|
||||||
|
|||||||
@@ -17,6 +17,10 @@ html {
|
|||||||
background-color: #353c42;
|
background-color: #353c42;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-image: url('../img/boxed-bg-dark.png') !important;
|
||||||
|
}
|
||||||
|
|
||||||
body, .bg-yellow, .callout.callout-warning, .alert-warning, .label-warning, .modal-warning .modal-body {
|
body, .bg-yellow, .callout.callout-warning, .alert-warning, .label-warning, .modal-warning .modal-body {
|
||||||
|
|
||||||
background-color: #353c42 !important;
|
background-color: #353c42 !important;
|
||||||
|
|||||||
21
front/css/system-dark-patch-cal.css
Executable file
21
front/css/system-dark-patch-cal.css
Executable file
@@ -0,0 +1,21 @@
|
|||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
|
||||||
|
.fc-sat {
|
||||||
|
background-color: #444D56; }
|
||||||
|
.fc-sun {
|
||||||
|
background-color: #444D56; }
|
||||||
|
.fc-today {
|
||||||
|
background-color: #8D9AAC !important;
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
.fc-cell-content {
|
||||||
|
background-color: #272c30;
|
||||||
|
}
|
||||||
|
.fc-widget-header {
|
||||||
|
background-color: #353c42;
|
||||||
|
}
|
||||||
|
.fc-unthemed .fc-content, .fc-unthemed .fc-divider, .fc-unthemed .fc-list-heading td, .fc-unthemed .fc-list-view, .fc-unthemed .fc-popover, .fc-unthemed .fc-row, .fc-unthemed tbody, .fc-unthemed td, .fc-unthemed th, .fc-unthemed thead{
|
||||||
|
border-color: #353c42 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
737
front/css/system-dark-patch.css
Executable file
737
front/css/system-dark-patch.css
Executable file
@@ -0,0 +1,737 @@
|
|||||||
|
/* Pi-hole: A black hole for Internet advertisements
|
||||||
|
* (c) 2020 Pi-hole, LLC (https://pi-hole.net)
|
||||||
|
* Network-wide ad blocking via your own hardware.
|
||||||
|
*
|
||||||
|
* This file is copyright under the latest version of the EUPL.
|
||||||
|
* Please see LICENSE file for your rights under this license.
|
||||||
|
*
|
||||||
|
* The colors used in this theme has been inspired by
|
||||||
|
* https://github.com/anvyst/adminlte-skin-midnight
|
||||||
|
*
|
||||||
|
* Additional fixes For Pi.Alert UI by leiweibau */
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--datatable-bgcolor: rgba(64, 76, 88, 0.8);
|
||||||
|
}
|
||||||
|
html {
|
||||||
|
background-color: #353c42;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-image: url('../img/boxed-bg-dark.png') !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
body, .bg-yellow, .callout.callout-warning, .alert-warning, .label-warning, .modal-warning .modal-body {
|
||||||
|
|
||||||
|
background-color: #353c42 !important;
|
||||||
|
color: #bec5cb !important;
|
||||||
|
}
|
||||||
|
h4 {
|
||||||
|
color: #44def1;
|
||||||
|
}
|
||||||
|
.content-header > .breadcrumb > li > a {
|
||||||
|
color: #bec5cb;
|
||||||
|
}
|
||||||
|
.table > thead > tr > th,
|
||||||
|
.table > tbody > tr > th,
|
||||||
|
.table > tfoot > tr > th,
|
||||||
|
.table > thead > tr > td,
|
||||||
|
.table > tbody > tr > td,
|
||||||
|
.table > tfoot > tr > td {
|
||||||
|
border-top: 0;
|
||||||
|
}
|
||||||
|
.table > thead > tr.odd,
|
||||||
|
.table > tbody > tr.odd,
|
||||||
|
.table > tfoot > tr.odd {
|
||||||
|
background-color: #2a2f34;
|
||||||
|
}
|
||||||
|
.table > thead > tr.odd:hover,
|
||||||
|
.table > tbody > tr.odd:hover,
|
||||||
|
.table > tfoot > tr.odd:hover,
|
||||||
|
.table > thead > tr.even:hover,
|
||||||
|
.table > tbody > tr.even:hover,
|
||||||
|
.table > tfoot > tr.even:hover {
|
||||||
|
background-color: #1e2226;
|
||||||
|
}
|
||||||
|
.table-bordered,
|
||||||
|
.table-bordered > thead > tr > th,
|
||||||
|
.table-bordered > tbody > tr > th,
|
||||||
|
.table-bordered > tfoot > tr > th,
|
||||||
|
.table-bordered > thead > tr > td,
|
||||||
|
.table-bordered > tbody > tr > td,
|
||||||
|
.table-bordered > tfoot > tr > td {
|
||||||
|
border: 1px solid #353c42;
|
||||||
|
}
|
||||||
|
.dataTables_wrapper input[type="search"] {
|
||||||
|
border-radius: 4px;
|
||||||
|
background-color: #353c42;
|
||||||
|
border: 0;
|
||||||
|
color: #bec5cb;
|
||||||
|
}
|
||||||
|
.dataTables_paginate .pagination li > a {
|
||||||
|
background-color: #353c42;
|
||||||
|
border-color: #353c42;
|
||||||
|
}
|
||||||
|
.pagination > .disabled > a,
|
||||||
|
.pagination > .disabled > a:focus,
|
||||||
|
.pagination > .disabled > a:hover,
|
||||||
|
.pagination > .disabled > span,
|
||||||
|
.pagination > .disabled > span:focus,
|
||||||
|
.pagination > .disabled > span:hover {
|
||||||
|
cursor: not-allowed;
|
||||||
|
color: #bec5cb;
|
||||||
|
background-color: #353c42;
|
||||||
|
border-color: #353c42;
|
||||||
|
}
|
||||||
|
.pagination > li > a:focus,
|
||||||
|
.pagination > li > a:hover,
|
||||||
|
.pagination > li > span:focus,
|
||||||
|
.pagination > li > span:hover {
|
||||||
|
z-index: 2;
|
||||||
|
color: #bec5cb;
|
||||||
|
background-color: #54606b;
|
||||||
|
border-color: #54606b;
|
||||||
|
}
|
||||||
|
.wrapper,
|
||||||
|
.main-sidebar,
|
||||||
|
.left-side {
|
||||||
|
background-color: #272c30;
|
||||||
|
}
|
||||||
|
.user-panel > .info,
|
||||||
|
.user-panel > .info > a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li.header {
|
||||||
|
color: #556068;
|
||||||
|
background-color: #1e2225;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > a {
|
||||||
|
border-left: 3px solid transparent;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li:hover > a,
|
||||||
|
.sidebar-menu > li > a:focus,
|
||||||
|
.sidebar-menu > li.active > a {
|
||||||
|
color: #fff;
|
||||||
|
background-color: #22272a;
|
||||||
|
border-color: #3c8dbc;
|
||||||
|
}
|
||||||
|
.sidebar-menu > li > .treeview-menu {
|
||||||
|
margin: 0 1px;
|
||||||
|
background-color: #32393e;
|
||||||
|
}
|
||||||
|
.sidebar a {
|
||||||
|
color: #bec5cb;
|
||||||
|
}
|
||||||
|
.sidebar a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.treeview-menu > li > a {
|
||||||
|
color: #949fa8;
|
||||||
|
}
|
||||||
|
.treeview-menu > li.active > a,
|
||||||
|
.treeview-menu > li > a:hover,
|
||||||
|
.treeview-menu > li > a:focus {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-form {
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 1px solid #3e464c;
|
||||||
|
margin: 10px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"],
|
||||||
|
.sidebar-form .btn {
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: #3e464c;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
height: 35px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"] {
|
||||||
|
color: #666;
|
||||||
|
border-top-left-radius: 2px;
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
border-bottom-left-radius: 2px;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus,
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
background-color: #fff;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
.sidebar-form input[type="text"]:focus + .input-group-btn .btn {
|
||||||
|
border-left-color: #fff;
|
||||||
|
}
|
||||||
|
.sidebar-form .btn {
|
||||||
|
color: #999;
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-top-right-radius: 2px;
|
||||||
|
border-bottom-right-radius: 2px;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
.box,
|
||||||
|
.box-footer,
|
||||||
|
.info-box,
|
||||||
|
.box-comment,
|
||||||
|
.comment-text,
|
||||||
|
.comment-text .username {
|
||||||
|
color: #bec5cb;
|
||||||
|
background-color: #272c30;
|
||||||
|
}
|
||||||
|
.box-comments .box-comment {
|
||||||
|
border-bottom-color: #353c42;
|
||||||
|
}
|
||||||
|
.box-footer {
|
||||||
|
border-top: 1px solid #353c42;
|
||||||
|
}
|
||||||
|
.box-header.with-border {
|
||||||
|
border-bottom: 1px solid #353c42;
|
||||||
|
}
|
||||||
|
.box-solid,
|
||||||
|
.box {
|
||||||
|
border: 1px solid #272c30;
|
||||||
|
}
|
||||||
|
.box-solid > .box-header,
|
||||||
|
.box > .box-header {
|
||||||
|
color: #bec5cb;
|
||||||
|
}
|
||||||
|
.box-solid > .box-header .btn,
|
||||||
|
.box > .box-header .btn {
|
||||||
|
color: #bec5cb;
|
||||||
|
}
|
||||||
|
.box.box-info,
|
||||||
|
.box.box-primary,
|
||||||
|
.box.box-success,
|
||||||
|
.box.box-warning,
|
||||||
|
.box.box-danger {
|
||||||
|
border-top-width: 3px;
|
||||||
|
}
|
||||||
|
.main-header .navbar {
|
||||||
|
background-color: #272c30;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a,
|
||||||
|
.main-header .navbar .nav > li > .navbar-text {
|
||||||
|
color: #bec5cb;
|
||||||
|
max-height: 50px;
|
||||||
|
}
|
||||||
|
.main-header .navbar .nav > li > a:hover,
|
||||||
|
.main-header .navbar .nav > li > a:active,
|
||||||
|
.main-header .navbar .nav > li > a:focus,
|
||||||
|
.main-header .navbar .nav .open > a,
|
||||||
|
.main-header .navbar .nav .open > a:hover,
|
||||||
|
.main-header .navbar .nav .open > a:focus,
|
||||||
|
.main-header .navbar .nav > .active > a {
|
||||||
|
background-color: rgba(0, 0, 0, 0.1);
|
||||||
|
color: #f6f6f6;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle {
|
||||||
|
color: #bec5cb;
|
||||||
|
}
|
||||||
|
.main-header .navbar .sidebar-toggle:hover {
|
||||||
|
color: #f6f6f6;
|
||||||
|
background-color: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
.timeline li .timeline-item {
|
||||||
|
color: #bec5cb;
|
||||||
|
background-color: #272c30;
|
||||||
|
border-color: #353c42;
|
||||||
|
}
|
||||||
|
.timeline li .timeline-header {
|
||||||
|
border-bottom-color: #353c42;
|
||||||
|
}
|
||||||
|
.nav-stacked > li > a {
|
||||||
|
color: #bec5cb;
|
||||||
|
}
|
||||||
|
.nav-stacked > li > a:hover {
|
||||||
|
color: white;
|
||||||
|
background-color: #1e2226;
|
||||||
|
}
|
||||||
|
.content-wrapper,
|
||||||
|
.right-side {
|
||||||
|
background-color: #353c42;
|
||||||
|
}
|
||||||
|
.main-footer,
|
||||||
|
.nav-tabs-custom {
|
||||||
|
background-color: #272c30;
|
||||||
|
border-top-color: #353c42;
|
||||||
|
color: #bec5cb;
|
||||||
|
}
|
||||||
|
.main-footer .nav-tabs,
|
||||||
|
.nav-tabs-custom .nav-tabs {
|
||||||
|
background-color: #30383f;
|
||||||
|
border-bottom-color: #2f363b;
|
||||||
|
}
|
||||||
|
.main-footer .tab-content,
|
||||||
|
.nav-tabs-custom .tab-content {
|
||||||
|
background-color: #30383f;
|
||||||
|
}
|
||||||
|
.nav-tabs-custom > .nav-tabs {
|
||||||
|
background: rgba(64, 72, 80, 0.666);
|
||||||
|
}
|
||||||
|
.nav-tabs-custom > .nav-tabs > li {
|
||||||
|
margin-right: 1px;
|
||||||
|
color: #bec5cb;
|
||||||
|
}
|
||||||
|
.nav-tabs-custom > .nav-tabs > li.active > a,
|
||||||
|
.nav-tabs-custom > .nav-tabs > li.active:hover > a {
|
||||||
|
border-left-color: #30383f;
|
||||||
|
border-right-color: #30383f;
|
||||||
|
background-color: #30383f;
|
||||||
|
color: #bec5cb;
|
||||||
|
}
|
||||||
|
.nav-tabs-custom > .nav-tabs > li:not(.active):hover {
|
||||||
|
border-top-color: #d2d6de;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
.nav-tabs-custom > .nav-tabs > li > a {
|
||||||
|
color: #8e959b;
|
||||||
|
}
|
||||||
|
.nav-tabs-custom > .nav-tabs > li > a:focus {
|
||||||
|
color: #3c8dbc;
|
||||||
|
}
|
||||||
|
.nav-tabs-custom > .nav-tabs > li:hover > a,
|
||||||
|
.nav-tabs-custom > .nav-tabs > li.active:hover > a {
|
||||||
|
background-color: #353c42;
|
||||||
|
color: #bec5cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-group {
|
||||||
|
color: #bec5cb;
|
||||||
|
background-color: #272c30;
|
||||||
|
}
|
||||||
|
.list-group .list-group-item {
|
||||||
|
border-color: #353c42;
|
||||||
|
background-color: #272c30;
|
||||||
|
}
|
||||||
|
.input-group .input-group-addon {
|
||||||
|
border-right: 1px solid #272c30;
|
||||||
|
}
|
||||||
|
.select2 .select2-selection {
|
||||||
|
background-color: #353c42;
|
||||||
|
color: #bec5cb;
|
||||||
|
border: 1px solid #353c42;
|
||||||
|
}
|
||||||
|
.select2 .select2-selection .select2-container--default,
|
||||||
|
.select2 .select2-selection .select2-selection--single,
|
||||||
|
.select2 .select2-selection .select2-selection--multiple,
|
||||||
|
.select2 .select2-selection .select2-selection__rendered {
|
||||||
|
color: #bec5cb;
|
||||||
|
}
|
||||||
|
.select2-dropdown {
|
||||||
|
background-color: #353c42;
|
||||||
|
color: #bec5cb;
|
||||||
|
border: 1px solid #353c42;
|
||||||
|
}
|
||||||
|
.select2-dropdown .select2-search__field {
|
||||||
|
background-color: #272c30;
|
||||||
|
color: #bec5cb;
|
||||||
|
border: 1px solid #353c42;
|
||||||
|
}
|
||||||
|
.select2-container--default.select2-container--open {
|
||||||
|
background-color: #272c30;
|
||||||
|
}
|
||||||
|
|
||||||
|
.layout-boxed {
|
||||||
|
background: url("../../img/boxed-bg-dark.png") repeat fixed;
|
||||||
|
}
|
||||||
|
.not-used {
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
.not-used:hover {
|
||||||
|
background-color: #c5c5c5;
|
||||||
|
}
|
||||||
|
.used {
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
.used:hover {
|
||||||
|
background-color: #ddd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graphs-grid {
|
||||||
|
background-color: rgba(255, 255, 255, 0.2);
|
||||||
|
}
|
||||||
|
.graphs-ticks {
|
||||||
|
color: #b8c7ce;
|
||||||
|
}
|
||||||
|
.queries-permitted {
|
||||||
|
background-color: #00a65a;
|
||||||
|
}
|
||||||
|
.queries-blocked {
|
||||||
|
background-color: #999;
|
||||||
|
}
|
||||||
|
.progress {
|
||||||
|
background-color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bg-green {
|
||||||
|
background-color: #005c32 !important;
|
||||||
|
}
|
||||||
|
.bg-aqua {
|
||||||
|
background-color: #007997 !important;
|
||||||
|
}
|
||||||
|
.bg-yellow {
|
||||||
|
background-color: #b1720c !important;
|
||||||
|
}
|
||||||
|
.bg-red {
|
||||||
|
background-color: #913225 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
code,
|
||||||
|
pre {
|
||||||
|
padding: 2px 4px;
|
||||||
|
font-size: 90%;
|
||||||
|
color: #bec5cb;
|
||||||
|
background-color: #353c42;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Used in the Query Log table */
|
||||||
|
.text-green-light {
|
||||||
|
color: #5ca314 !important;
|
||||||
|
}
|
||||||
|
.text-green {
|
||||||
|
color: #00aa60 !important;
|
||||||
|
}
|
||||||
|
.text-orange {
|
||||||
|
color: #b1720c !important;
|
||||||
|
}
|
||||||
|
.text-red {
|
||||||
|
color: #bd2c19 !important;
|
||||||
|
}
|
||||||
|
.text-vivid-blue {
|
||||||
|
color: #007997 !important;
|
||||||
|
}
|
||||||
|
td.highlight {
|
||||||
|
background-color: rgba(255, 204, 0, 0.333);
|
||||||
|
}
|
||||||
|
.btn-default {
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: #3e464c;
|
||||||
|
color: #bec5cb;
|
||||||
|
border: 1px solid #353c42;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Used in debug log page */
|
||||||
|
.log-red {
|
||||||
|
color: #ff4038;
|
||||||
|
}
|
||||||
|
.log-green {
|
||||||
|
color: #4c4;
|
||||||
|
}
|
||||||
|
.log-yellow {
|
||||||
|
color: #fb0;
|
||||||
|
}
|
||||||
|
.log-blue {
|
||||||
|
color: #48f;
|
||||||
|
}
|
||||||
|
.log-purple {
|
||||||
|
color: #b8e;
|
||||||
|
}
|
||||||
|
.log-cyan {
|
||||||
|
color: #0df;
|
||||||
|
}
|
||||||
|
.log-gray {
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
#output {
|
||||||
|
border-color: #505458;
|
||||||
|
background: #272c30;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Used by the long-term pages */
|
||||||
|
.daterangepicker {
|
||||||
|
background-color: #3e464c;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid #353c42;
|
||||||
|
}
|
||||||
|
.daterangepicker .ranges li:hover {
|
||||||
|
background-color: #353c42;
|
||||||
|
}
|
||||||
|
.daterangepicker .ranges li.active {
|
||||||
|
background-color: #1e2226; /* Color also used in table pagination */
|
||||||
|
}
|
||||||
|
.daterangepicker .calendar-table {
|
||||||
|
background-color: #3e464c;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid #353c42;
|
||||||
|
}
|
||||||
|
.daterangepicker td.off,
|
||||||
|
.daterangepicker td.off.in-range,
|
||||||
|
.daterangepicker td.off.start-date,
|
||||||
|
.daterangepicker td.off.end-date {
|
||||||
|
background-color: #485158;
|
||||||
|
}
|
||||||
|
.daterangepicker td.available:hover,
|
||||||
|
.daterangepicker th.available:hover {
|
||||||
|
background-color: #1e2226;
|
||||||
|
}
|
||||||
|
.daterangepicker td.active,
|
||||||
|
.daterangepicker td.active:hover,
|
||||||
|
.daterangepicker td.in-range:hover {
|
||||||
|
background-color: #225e92;
|
||||||
|
}
|
||||||
|
.daterangepicker td.in-range {
|
||||||
|
background-color: #1e2226;
|
||||||
|
color: #bec5cb;
|
||||||
|
}
|
||||||
|
input,
|
||||||
|
select,
|
||||||
|
select.form-control,
|
||||||
|
.form-group .input-group-addon,
|
||||||
|
.input-group .input-group-addon,
|
||||||
|
.form-group input,
|
||||||
|
.input-group input,
|
||||||
|
.form-group textarea,
|
||||||
|
.input-group textarea,
|
||||||
|
.daterangepicker select.hourselect,
|
||||||
|
.daterangepicker select.minuteselect,
|
||||||
|
.daterangepicker select.secondselect,
|
||||||
|
.daterangepicker select.ampmselect,
|
||||||
|
.form-control,
|
||||||
|
div.dataTables_wrapper div.dataTables_length select {
|
||||||
|
background-color: #353c42;
|
||||||
|
color: #bec5cb;
|
||||||
|
border: 1px solid #3d444b;
|
||||||
|
}
|
||||||
|
.form-control[disabled],
|
||||||
|
.form-control[readonly],
|
||||||
|
fieldset[disabled] .form-control {
|
||||||
|
background-color: #353c42;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
.navbar-custom-menu > .navbar-nav > li > .dropdown-menu {
|
||||||
|
background-color: #4c5761;
|
||||||
|
color: #bec5cb;
|
||||||
|
border: 1px solid #171c20;
|
||||||
|
}
|
||||||
|
.table-striped > tbody > tr:nth-of-type(2n + 1) {
|
||||||
|
background-color: #2d343a;
|
||||||
|
}
|
||||||
|
.panel,
|
||||||
|
.panel-body,
|
||||||
|
.panel-default > .panel-heading {
|
||||||
|
background-color: #3e464c;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid #353c42;
|
||||||
|
color: #bec5cb;
|
||||||
|
}
|
||||||
|
.box.box-solid.box-info,
|
||||||
|
.box.box-solid.box-info > .box-header {
|
||||||
|
color: #bec5cb;
|
||||||
|
background-color: #367fa9 !important;
|
||||||
|
border: 1px solid #367fa9;
|
||||||
|
}
|
||||||
|
input[type="password"]::-webkit-credentials-auto-fill-button {
|
||||||
|
background: #bfc5ca;
|
||||||
|
}
|
||||||
|
input[type="password"]::-webkit-caps-lock-indicator {
|
||||||
|
filter: invert(100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.network-never {
|
||||||
|
background-color: #661b02;
|
||||||
|
}
|
||||||
|
.network-recent {
|
||||||
|
background-color: #114100;
|
||||||
|
}
|
||||||
|
.network-old {
|
||||||
|
background-color: #525200;
|
||||||
|
}
|
||||||
|
.network-older {
|
||||||
|
background-color: #502b00;
|
||||||
|
}
|
||||||
|
.network-gradient {
|
||||||
|
background-image: linear-gradient(to right, #114100 0%, #525200 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.icheckbox_polaris,
|
||||||
|
.icheckbox_futurico,
|
||||||
|
.icheckbox_minimal-blue {
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
.iradio_polaris,
|
||||||
|
.iradio_futurico,
|
||||||
|
.iradio_minimal-blue {
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Overlay box with spinners as shown during data collection for graphs */
|
||||||
|
.box .overlay,
|
||||||
|
.overlay-wrapper .overlay {
|
||||||
|
z-index: 50;
|
||||||
|
background-color: rgba(53, 60, 66, 0.733);
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
.box .overlay > .fa,
|
||||||
|
.overlay-wrapper .overlay > .fa,
|
||||||
|
.navbar-nav > .user-menu > .dropdown-menu > .user-body a {
|
||||||
|
color: #bec5cb !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-nav > .user-menu > .dropdown-menu > .user-footer {
|
||||||
|
background-color: #353c42bb;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-content {
|
||||||
|
background: #272c30;
|
||||||
|
}
|
||||||
|
.modal-header {
|
||||||
|
border-bottom-color: #353c42;
|
||||||
|
}
|
||||||
|
.modal-footer {
|
||||||
|
border-top-color: #353c42;
|
||||||
|
}
|
||||||
|
.close {
|
||||||
|
color: #383838;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** Fix login input visual misalignment ***/
|
||||||
|
#loginform,
|
||||||
|
#loginform input {
|
||||||
|
color: rgb(120, 127, 133);
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-options input,
|
||||||
|
.login-options [class*="icheck-"] > input:first-child + input[type="hidden"] + label::before,
|
||||||
|
.login-options [class*="icheck-"] > input:first-child + label::before {
|
||||||
|
background: none;
|
||||||
|
border-color: rgb(120, 127, 133);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** Additional fixes For Pi.Alert UI ***/
|
||||||
|
.small-box {
|
||||||
|
border-radius: 10px;
|
||||||
|
border-top: 0px;
|
||||||
|
}
|
||||||
|
.pa-small-box-aqua .inner {
|
||||||
|
background-color: rgb(45,108,133);
|
||||||
|
border-top-left-radius: 10px;
|
||||||
|
border-top-right-radius: 10px;
|
||||||
|
}
|
||||||
|
.pa-small-box-green .inner {
|
||||||
|
background-color: rgb(31,76,46);
|
||||||
|
border-top-left-radius: 10px;
|
||||||
|
border-top-right-radius: 10px;
|
||||||
|
}
|
||||||
|
.pa-small-box-yellow .inner {
|
||||||
|
background-color: rgb(151,104,37);
|
||||||
|
border-top-left-radius: 10px;
|
||||||
|
border-top-right-radius: 10px;
|
||||||
|
}
|
||||||
|
.pa-small-box-red .inner {
|
||||||
|
background-color: rgb(120,50,38);
|
||||||
|
border-top-left-radius: 10px;
|
||||||
|
border-top-right-radius: 10px;
|
||||||
|
}
|
||||||
|
.pa-small-box-gray .inner {
|
||||||
|
background-color: #777;
|
||||||
|
/* color: rgba(20,20,20,30%); */
|
||||||
|
border-top-left-radius: 10px;
|
||||||
|
border-top-right-radius: 10px;
|
||||||
|
}
|
||||||
|
.pa-small-box-gray .inner h3 {
|
||||||
|
color: #bbb;
|
||||||
|
}
|
||||||
|
.text-gray-20 {
|
||||||
|
color: rgba(220,220,220,30%);
|
||||||
|
}
|
||||||
|
.bg-gray {
|
||||||
|
background-color: #888888 !important;
|
||||||
|
}
|
||||||
|
.badge.bg-green {
|
||||||
|
background-color: #00A000 !important;
|
||||||
|
}
|
||||||
|
.badge.bg-gray {
|
||||||
|
background-color: #888 !important;
|
||||||
|
}
|
||||||
|
#txtRecord {
|
||||||
|
background-color: #353c42;
|
||||||
|
border-color: #888888;
|
||||||
|
}
|
||||||
|
.table-hover tbody tr:hover td, .table-hover tbody tr:hover th {
|
||||||
|
background-color: rgb(189,192,198);
|
||||||
|
color: #444;
|
||||||
|
}
|
||||||
|
|
||||||
|
.db_info_table_cell:nth-child(1) {background: #272c30}
|
||||||
|
.db_info_table_cell:nth-child(2) {background: #272c30}
|
||||||
|
.db_tools_table_cell_a:nth-child(1) {background: #272c30}
|
||||||
|
.db_tools_table_cell_a:nth-child(2) {background: #272c30}
|
||||||
|
.db_tools_table_cell_b:nth-child(1) {background: #272c30}
|
||||||
|
.db_tools_table_cell_b:nth-child(2) {background: #272c30}
|
||||||
|
|
||||||
|
.db_info_table {
|
||||||
|
display: table;
|
||||||
|
border-spacing: 0em;
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 15px;
|
||||||
|
width: 100%;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-tabs-custom > .nav-tabs > li:hover > a, .nav-tabs-custom > .nav-tabs > li.active:hover > a {
|
||||||
|
background-color: #272c30;
|
||||||
|
color: #bec5cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-tabs-custom > .nav-tabs > li.active > a, .nav-tabs-custom > .nav-tabs > li.active:hover > a {
|
||||||
|
border-left-color: #30383f;
|
||||||
|
border-right-color: #30383f;
|
||||||
|
background-color: #272c30;
|
||||||
|
color: #bec5cb;
|
||||||
|
}
|
||||||
|
.nav-tabs-custom > .nav-tabs {
|
||||||
|
background-color: #353c42;
|
||||||
|
}
|
||||||
|
.nav-tabs-custom .tab-content {
|
||||||
|
background-color: #272c30;
|
||||||
|
}
|
||||||
|
.top_small_box_gray_text {
|
||||||
|
color: white !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* remove white border that appears on mobile screen sizes */
|
||||||
|
.box-body {
|
||||||
|
border: 0px;
|
||||||
|
}
|
||||||
|
/* remove white border that appears on mobile screen sizes */
|
||||||
|
.table-responsive {
|
||||||
|
border: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-page {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-logo a {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-box-body {
|
||||||
|
color: #bec5cb;
|
||||||
|
background-color: #272c30;
|
||||||
|
}
|
||||||
|
/* Add border radius to bottom of the status boxes*/
|
||||||
|
.pa-small-box-footer {
|
||||||
|
border-bottom-left-radius: 10px;
|
||||||
|
border-bottom-right-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-box > .inner h3, .small-box > .inner p {
|
||||||
|
margin-bottom: 0px;
|
||||||
|
margin-left: 0px;
|
||||||
|
}
|
||||||
|
.small-box:hover .icon {
|
||||||
|
font-size: 3.74em;
|
||||||
|
}
|
||||||
|
.small-box .icon {
|
||||||
|
top: 0.01em;
|
||||||
|
font-size: 3.25em;
|
||||||
|
}
|
||||||
|
.pa_semitransparent-panel{
|
||||||
|
background-color: #000 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -100,7 +100,7 @@
|
|||||||
<div class="col-lg-12 col-sm-12 col-xs-12">
|
<div class="col-lg-12 col-sm-12 col-xs-12">
|
||||||
<!-- <div class="box-transparent"> -->
|
<!-- <div class="box-transparent"> -->
|
||||||
<div id="navDevice" class="nav-tabs-custom">
|
<div id="navDevice" class="nav-tabs-custom">
|
||||||
<ul class="nav nav-tabs" style="fon t-size:16px;">
|
<ul class="nav nav-tabs" style="font-size:16px;">
|
||||||
<li> <a id="tabDetails" href="#panDetails" data-toggle="tab"> <?= lang('DevDetail_Tab_Details');?> </a></li>
|
<li> <a id="tabDetails" href="#panDetails" data-toggle="tab"> <?= lang('DevDetail_Tab_Details');?> </a></li>
|
||||||
<li> <a id="tabTools" href="#panTools" data-toggle="tab"> <?= lang('DevDetail_Tab_Tools');?> </a></li>
|
<li> <a id="tabTools" href="#panTools" data-toggle="tab"> <?= lang('DevDetail_Tab_Tools');?> </a></li>
|
||||||
<li> <a id="tabSessions" href="#panSessions" data-toggle="tab"> <?= lang('DevDetail_Tab_Sessions');?> </a></li>
|
<li> <a id="tabSessions" href="#panSessions" data-toggle="tab"> <?= lang('DevDetail_Tab_Sessions');?> </a></li>
|
||||||
@@ -197,8 +197,8 @@
|
|||||||
</label>
|
</label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<span class="input-group-addon" id="txtIconFA"></span>
|
<span class="input-group-addon iconPreview" id="txtIconPreview" my-customid="txtIconPreview"></span>
|
||||||
<input class="form-control" id="txtIcon" type="text" value="--" readonly>
|
<input class="form-control" id="txtIcon" my-customid="txtIcon" my-customparams="txtIcon,txtIconPreview" type="text" value="--" readonly>
|
||||||
<span class="input-group-addon" title='<?= lang('DevDetail_button_AddIcon_Tooltip');?>'><i class="fa fa-square-plus pointer" onclick="askAddIcon();"></i></span>
|
<span class="input-group-addon" title='<?= lang('DevDetail_button_AddIcon_Tooltip');?>'><i class="fa fa-square-plus pointer" onclick="askAddIcon();"></i></span>
|
||||||
<span class="input-group-addon" title='<?= lang('DevDetail_button_OverwriteIcons_Tooltip');?>'><i class="fa fa-copy pointer" onclick="askOverwriteIconType();"></i></span>
|
<span class="input-group-addon" title='<?= lang('DevDetail_button_OverwriteIcons_Tooltip');?>'><i class="fa fa-copy pointer" onclick="askOverwriteIconType();"></i></span>
|
||||||
<div class="input-group-btn">
|
<div class="input-group-btn">
|
||||||
@@ -325,7 +325,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Network -->
|
<!-- Network -->
|
||||||
<h4 class="bottom-border-aqua"><?= lang('DevDetail_MainInfo_Network_Title');?><span class="networkPageHelp"> <a target="_blank" href="https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md"><i class="fa fa-circle-question"></i></a><span></h4>
|
<h4 class="bottom-border-aqua"><?= lang('DevDetail_MainInfo_Network_Title');?><span class="helpIconSmallTopRight"> <a target="_blank" href="https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md"><i class="fa fa-circle-question"></i></a><span></h4>
|
||||||
<div class="form-group" title="<?= lang('DevDetail_Network_Node_hover');?>">
|
<div class="form-group" title="<?= lang('DevDetail_Network_Node_hover');?>">
|
||||||
<label class="col-sm-3 control-label"><?= lang('DevDetail_MainInfo_Network');?></label>
|
<label class="col-sm-3 control-label"><?= lang('DevDetail_MainInfo_Network');?></label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
@@ -370,7 +370,8 @@
|
|||||||
|
|
||||||
<!-- column 3 -->
|
<!-- column 3 -->
|
||||||
<div class="col-lg-4 col-sm-6 col-xs-12">
|
<div class="col-lg-4 col-sm-6 col-xs-12">
|
||||||
<h4 class="bottom-border-aqua"><?= lang('DevDetail_EveandAl_Title');?></h4>
|
<h4 class="bottom-border-aqua"><?= lang('DevDetail_EveandAl_Title');?>
|
||||||
|
<span class="helpIconSmallTopRight"> <a target="_blank" href="https://github.com/jokob-sk/NetAlertX/blob/main/docs/NOTIFICATIONS.md"><i class="fa fa-circle-question"></i></a><span></h4>
|
||||||
<div class="box-body form-horizontal">
|
<div class="box-body form-horizontal">
|
||||||
|
|
||||||
<!-- Scan Cycle -->
|
<!-- Scan Cycle -->
|
||||||
@@ -455,7 +456,8 @@
|
|||||||
<i style="font-size: 24px;" class="text-yellow glyphicon glyphicon-random"></i>     </span>
|
<i style="font-size: 24px;" class="text-yellow glyphicon glyphicon-random"></i>     </span>
|
||||||
|
|
||||||
<a href="https://github.com/jokob-sk/NetAlertX/blob/main/docs/RANDOM_MAC.md" target="_blank" style="color: #777;">
|
<a href="https://github.com/jokob-sk/NetAlertX/blob/main/docs/RANDOM_MAC.md" target="_blank" style="color: #777;">
|
||||||
<i class="fa fa-info-circle"></i> </a>
|
<i class="fa fa-info-circle"></i>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -641,8 +643,14 @@
|
|||||||
|
|
||||||
<!-- Dark-Mode Patch -->
|
<!-- Dark-Mode Patch -->
|
||||||
<?php
|
<?php
|
||||||
if ($ENABLED_DARKMODE === True) {
|
switch ($UI_THEME) {
|
||||||
echo '<link rel="stylesheet" href="css/dark-patch-cal.css">';
|
case "Dark":
|
||||||
|
echo '<link rel="stylesheet" href="css/dark-patch-cal.css">';
|
||||||
|
break;
|
||||||
|
case "System":
|
||||||
|
echo '<link rel="stylesheet" href="css/system-dark-patch-cal.css">';
|
||||||
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|
||||||
@@ -693,7 +701,6 @@ if ($ENABLED_DARKMODE === True) {
|
|||||||
|
|
||||||
var pos = -1;
|
var pos = -1;
|
||||||
var parPeriod = 'Front_Details_Period';
|
var parPeriod = 'Front_Details_Period';
|
||||||
var parTab = 'Front_Details_Tab';
|
|
||||||
var parSessionsRows = 'Front_Details_Sessions_Rows';
|
var parSessionsRows = 'Front_Details_Sessions_Rows';
|
||||||
var parEventsRows = 'Front_Details_Events_Rows';
|
var parEventsRows = 'Front_Details_Events_Rows';
|
||||||
var parEventsHide = 'Front_Details_Events_Hide';
|
var parEventsHide = 'Front_Details_Events_Hide';
|
||||||
@@ -736,7 +743,7 @@ function main () {
|
|||||||
$('#chkHideConnectionEvents')[0].checked = eval(eventsHide == 'true');
|
$('#chkHideConnectionEvents')[0].checked = eval(eventsHide == 'true');
|
||||||
|
|
||||||
// Initialize components with parameters
|
// Initialize components with parameters
|
||||||
initializeTabs();
|
initializeTabsNew();
|
||||||
initializeiCheck();
|
initializeiCheck();
|
||||||
initializeCombos();
|
initializeCombos();
|
||||||
initializeDatatables();
|
initializeDatatables();
|
||||||
@@ -756,24 +763,13 @@ function main () {
|
|||||||
|
|
||||||
// Show device icon as it changes
|
// Show device icon as it changes
|
||||||
$('#txtIcon').on('change input', function() {
|
$('#txtIcon').on('change input', function() {
|
||||||
updateIconPreview('#txtIcon')
|
updateIconPreview(this)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
function initializeTabs () {
|
|
||||||
// Activate panel
|
|
||||||
$('.nav-tabs a[id='+ tab +']').tab('show');
|
|
||||||
|
|
||||||
// When changed save new current tab
|
|
||||||
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
|
|
||||||
setParameter (parTab, $(e.target).attr('id'));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
function initializeiCheck () {
|
function initializeiCheck () {
|
||||||
// Blue
|
// Blue
|
||||||
@@ -802,7 +798,6 @@ function initializeiCheck () {
|
|||||||
// Hide / Show Events
|
// Hide / Show Events
|
||||||
if (event.currentTarget.id == 'chkHideConnectionEvents') {
|
if (event.currentTarget.id == 'chkHideConnectionEvents') {
|
||||||
getDeviceEvents();
|
getDeviceEvents();
|
||||||
setParameter (parEventsHide, event.currentTarget.checked);
|
|
||||||
} else {
|
} else {
|
||||||
// Activate save & restore
|
// Activate save & restore
|
||||||
// activateSaveRestoreData();
|
// activateSaveRestoreData();
|
||||||
@@ -1026,25 +1021,6 @@ function initializeDatatables () {
|
|||||||
"info": "<?= lang('Events_Table_info');?>",
|
"info": "<?= lang('Events_Table_info');?>",
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Save Parameters rows & order when changed
|
|
||||||
$('#tableSessions').on( 'length.dt', function ( e, settings, len ) {
|
|
||||||
setParameter (parSessionsRows, len);
|
|
||||||
|
|
||||||
// Sync Rows in both datatables
|
|
||||||
// if ( $('#tableEvents').DataTable().page.len() != len) {
|
|
||||||
// $('#tableEvents').DataTable().page.len( len ).draw();
|
|
||||||
// }
|
|
||||||
} );
|
|
||||||
|
|
||||||
$('#tableEvents').on( 'length.dt', function ( e, settings, len ) {
|
|
||||||
setParameter (parEventsRows, len);
|
|
||||||
|
|
||||||
// Sync Rows in both datatables
|
|
||||||
// if ( $('#tableSessions').DataTable().page.len() != len) {
|
|
||||||
// $('#tableSessions').DataTable().page.len( len ).draw();
|
|
||||||
// }
|
|
||||||
} );
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -1148,7 +1124,7 @@ function initializeCalendar () {
|
|||||||
showSpinner()
|
showSpinner()
|
||||||
} else {
|
} else {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
updateIconPreview('#txtIcon')
|
updateIconPreview($('#txtIcon'))
|
||||||
}, 500);
|
}, 500);
|
||||||
|
|
||||||
hideSpinner()
|
hideSpinner()
|
||||||
@@ -1161,10 +1137,6 @@ function initializeCalendar () {
|
|||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
function periodChanged () {
|
function periodChanged () {
|
||||||
// Save Parameter Period
|
|
||||||
period = $('#period').val();
|
|
||||||
setParameter (parPeriod, period);
|
|
||||||
|
|
||||||
// Requery Device data
|
// Requery Device data
|
||||||
getDeviceData(true);
|
getDeviceData(true);
|
||||||
getSessionsPresenceEvents();
|
getSessionsPresenceEvents();
|
||||||
@@ -1324,7 +1296,7 @@ function getDeviceData (readAllData=false) {
|
|||||||
if (deviceData['dev_Favorite'] == 1) {$('#chkFavorite').iCheck('check');} else {$('#chkFavorite').iCheck('uncheck');}
|
if (deviceData['dev_Favorite'] == 1) {$('#chkFavorite').iCheck('check');} else {$('#chkFavorite').iCheck('uncheck');}
|
||||||
$('#txtGroup').val (deviceData['dev_Group']);
|
$('#txtGroup').val (deviceData['dev_Group']);
|
||||||
$('#txtLocation').val (deviceData['dev_Location']);
|
$('#txtLocation').val (deviceData['dev_Location']);
|
||||||
$('#txtComments').val (deviceData['dev_Comments']);
|
$('#txtComments').val (decodeSpecialChars(deviceData['dev_Comments']));
|
||||||
$('#txtNetworkNodeMac').val ( networkParentMacName) ;
|
$('#txtNetworkNodeMac').val ( networkParentMacName) ;
|
||||||
$('#txtNetworkNodeMac').attr ('data-mynodemac', deviceData['dev_Network_Node_MAC_ADDR']);
|
$('#txtNetworkNodeMac').attr ('data-mynodemac', deviceData['dev_Network_Node_MAC_ADDR']);
|
||||||
$('#txtNetworkPort').val (deviceData['dev_Network_Node_port']);
|
$('#txtNetworkPort').val (deviceData['dev_Network_Node_port']);
|
||||||
@@ -1457,15 +1429,15 @@ function setDeviceData (direction='', refreshCallback='') {
|
|||||||
|
|
||||||
// update data to server
|
// update data to server
|
||||||
$.get('php/server/devices.php?action=setDeviceData&mac='+ mac
|
$.get('php/server/devices.php?action=setDeviceData&mac='+ mac
|
||||||
+ '&name=' + encodeURIComponent($('#txtName').val())
|
+ '&name=' + encodeURIComponent($('#txtName').val().replace(/'/g, ""))
|
||||||
+ '&owner=' + encodeURIComponent($('#txtOwner').val())
|
+ '&owner=' + encodeURIComponent($('#txtOwner').val().replace(/'/g, ""))
|
||||||
+ '&type=' + $('#txtDeviceType').val()
|
+ '&type=' + $('#txtDeviceType').val()
|
||||||
+ '&vendor=' + encodeURIComponent($('#txtVendor').val())
|
+ '&vendor=' + encodeURIComponent($('#txtVendor').val().replace(/'/g, ""))
|
||||||
+ '&icon=' + encodeURIComponent($('#txtIcon').val())
|
+ '&icon=' + encodeURIComponent($('#txtIcon').val())
|
||||||
+ '&favorite=' + ($('#chkFavorite')[0].checked * 1)
|
+ '&favorite=' + ($('#chkFavorite')[0].checked * 1)
|
||||||
+ '&group=' + encodeURIComponent($('#txtGroup').val())
|
+ '&group=' + encodeURIComponent($('#txtGroup').val())
|
||||||
+ '&location=' + encodeURIComponent($('#txtLocation').val())
|
+ '&location=' + encodeURIComponent($('#txtLocation').val())
|
||||||
+ '&comments=' + encodeURIComponent($('#txtComments').val())
|
+ '&comments=' + encodeURIComponent(encodeSpecialChars($('#txtComments').val()))
|
||||||
+ '&networknode=' + $('#txtNetworkNodeMac').attr('data-mynodemac')
|
+ '&networknode=' + $('#txtNetworkNodeMac').attr('data-mynodemac')
|
||||||
+ '&networknodeport=' + $('#txtNetworkPort').val()
|
+ '&networknodeport=' + $('#txtNetworkPort').val()
|
||||||
+ '&ssid=' + $('#txtSSID').val()
|
+ '&ssid=' + $('#txtSSID').val()
|
||||||
@@ -1494,7 +1466,7 @@ function setDeviceData (direction='', refreshCallback='') {
|
|||||||
somethingChanged = false;
|
somethingChanged = false;
|
||||||
|
|
||||||
// refresh API
|
// refresh API
|
||||||
updateApi()
|
updateApi("devices,appevents")
|
||||||
|
|
||||||
hideSpinner()
|
hideSpinner()
|
||||||
|
|
||||||
@@ -1679,7 +1651,7 @@ function addAsBase64 () {
|
|||||||
|
|
||||||
$('#txtIcon').val(iconHtmlBase64);
|
$('#txtIcon').val(iconHtmlBase64);
|
||||||
|
|
||||||
updateIconPreview('#txtIcon')
|
updateIconPreview($('#txtIcon'))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1714,7 +1686,7 @@ function deleteDevice () {
|
|||||||
$('#panDetails :input').attr('disabled', true);
|
$('#panDetails :input').attr('disabled', true);
|
||||||
|
|
||||||
// refresh API
|
// refresh API
|
||||||
updateApi()
|
updateApi("devices,appevents")
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
@@ -1843,12 +1815,6 @@ function initTable(tableId, mac){
|
|||||||
|
|
||||||
$("#"+tableId).attr("data-mac", mac)
|
$("#"+tableId).attr("data-mac", mac)
|
||||||
|
|
||||||
// Save Parameters rows & order when changed
|
|
||||||
$('#'+tableId).on( 'length.dt', function ( e, settings, len ) {
|
|
||||||
setParameter (parSessionsRows, len);
|
|
||||||
|
|
||||||
} );
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -15,8 +15,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
require 'php/templates/header.php';
|
require 'php/templates/header.php';
|
||||||
require 'php/templates/graph.php';
|
|
||||||
|
|
||||||
|
|
||||||
// check permissions
|
// check permissions
|
||||||
$dbPath = "../db/app.db";
|
$dbPath = "../db/app.db";
|
||||||
@@ -66,19 +64,37 @@
|
|||||||
</div>
|
</div>
|
||||||
<script src="js/graph_online_history.js"></script>
|
<script src="js/graph_online_history.js"></script>
|
||||||
<script>
|
<script>
|
||||||
var pia_js_online_history_time = [<?php pia_graph_devices_data($Pia_Graph_Device_Time); ?>];
|
$.get('api/table_online_history.json?nocache=' + Date.now(), function(res) {
|
||||||
var pia_js_online_history_ondev = [<?php pia_graph_devices_data($Pia_Graph_Device_Online); ?>];
|
// Extracting data from the JSON response
|
||||||
var pia_js_online_history_dodev = [<?php pia_graph_devices_data($Pia_Graph_Device_Down); ?>];
|
var timeStamps = [];
|
||||||
var pia_js_online_history_ardev = [<?php pia_graph_devices_data($Pia_Graph_Device_Arch); ?>];
|
var onlineCounts = [];
|
||||||
|
var downCounts = [];
|
||||||
|
var offlineCounts = [];
|
||||||
|
var archivedCounts = [];
|
||||||
|
|
||||||
setTimeout(() => {
|
res.data.forEach(function(entry) {
|
||||||
pia_draw_graph_online_history(
|
var dateObj = new Date(entry.Scan_Date);
|
||||||
pia_js_online_history_time,
|
var formattedTime = dateObj.toLocaleTimeString([], {hour: '2-digit', minute: '2-digit', hour12: false});
|
||||||
pia_js_online_history_ondev,
|
|
||||||
pia_js_online_history_dodev,
|
|
||||||
pia_js_online_history_ardev);
|
|
||||||
}, 500);
|
|
||||||
|
|
||||||
|
timeStamps.push(formattedTime);
|
||||||
|
onlineCounts.push(entry.Online_Devices);
|
||||||
|
downCounts.push(entry.Down_Devices);
|
||||||
|
offlineCounts.push(entry.Offline_Devices);
|
||||||
|
archivedCounts.push(entry.Archived_Devices);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Call your presenceOverTime function after data is ready
|
||||||
|
presenceOverTime(
|
||||||
|
timeStamps,
|
||||||
|
onlineCounts,
|
||||||
|
offlineCounts,
|
||||||
|
archivedCounts,
|
||||||
|
downCounts
|
||||||
|
);
|
||||||
|
}).fail(function() {
|
||||||
|
// Handle any errors in fetching the data
|
||||||
|
console.error('Error fetching online history data.');
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- datatable ------------------------------------------------------------- -->
|
<!-- datatable ------------------------------------------------------------- -->
|
||||||
@@ -137,60 +153,59 @@
|
|||||||
<!-- page script ----------------------------------------------------------- -->
|
<!-- page script ----------------------------------------------------------- -->
|
||||||
<script>
|
<script>
|
||||||
var deviceStatus = 'all';
|
var deviceStatus = 'all';
|
||||||
var parTableRows = 'Front_Devices_Rows';
|
var tableRows = getCookie ("nax_parTableRows") == "" ? 10 : getCookie ("nax_parTableRows") ;
|
||||||
var parTableOrder = 'Front_Devices_Order';
|
var tableOrder = getCookie ("nax_parTableOrder") == "" ? [[3,'desc'], [0,'asc']] : JSON.parse(getCookie ("nax_parTableOrder")) ;
|
||||||
var tableRows = 10;
|
|
||||||
var tableOrder = [[3,'desc'], [0,'asc']];
|
|
||||||
|
|
||||||
var tableColumnHide = [];
|
var tableColumnHide = [];
|
||||||
var tableColumnOrder = [];
|
var tableColumnOrder = [];
|
||||||
var tableColumnVisible = [];
|
var tableColumnVisible = [];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Read parameters & Initialize components
|
// Read parameters & Initialize components
|
||||||
callAfterAppInitialized(main)
|
callAfterAppInitialized(main)
|
||||||
showSpinner();
|
showSpinner();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
function main () {
|
function main () {
|
||||||
|
|
||||||
//initialize the table headers in the correct order
|
showSpinner();
|
||||||
var headersDefaultOrder = [
|
|
||||||
getString('Device_TableHead_Name'),
|
//initialize the table headers in the correct order
|
||||||
getString('Device_TableHead_Owner'),
|
var availableColumns = getSettingOptions("UI_device_columns").split(",");
|
||||||
getString('Device_TableHead_Type'),
|
var headersDefaultOrder = availableColumns.map(val => getString(val));
|
||||||
getString('Device_TableHead_Icon'),
|
var selectedColumns = JSON.parse(getSetting("UI_device_columns").replace(/'/g, '"'));
|
||||||
getString('Device_TableHead_Favorite'),
|
|
||||||
getString('Device_TableHead_Group'),
|
|
||||||
getString('Device_TableHead_FirstSession'),
|
|
||||||
getString('Device_TableHead_LastSession'),
|
|
||||||
getString('Device_TableHead_LastIP'),
|
|
||||||
getString('Device_TableHead_MAC'),
|
|
||||||
getString('Device_TableHead_Status'),
|
|
||||||
getString('Device_TableHead_MAC_full'),
|
|
||||||
getString('Device_TableHead_LastIPOrder'),
|
|
||||||
getString('Device_TableHead_Rowid'),
|
|
||||||
getString('Device_TableHead_Parent_MAC'),
|
|
||||||
getString('Device_TableHead_Connected_Devices'),
|
|
||||||
getString('Device_TableHead_Location'),
|
|
||||||
getString('Device_TableHead_Vendor'),
|
|
||||||
getString('Device_TableHead_Port'),
|
|
||||||
getString('Device_TableHead_GUID'),
|
|
||||||
getString('Device_TableHead_SyncHubNodeName'),
|
|
||||||
getString('Device_TableHead_NetworkSite'),
|
|
||||||
getString('Device_TableHead_SSID')
|
|
||||||
];
|
|
||||||
|
|
||||||
// generate default order lists of given length
|
// generate default order lists of given length
|
||||||
var columnsStr = JSON.stringify(Array.from({ length: headersDefaultOrder.length }, (_, i) => i));
|
var columnsStr = JSON.stringify(Array.from({ length: headersDefaultOrder.length }, (_, i) => i));
|
||||||
tableColumnOrder = Array.from({ length: headersDefaultOrder.length }, (_, i) => i);
|
tableColumnOrder = Array.from({ length: headersDefaultOrder.length }, (_, i) => i);
|
||||||
tableColumnVisible = tableColumnOrder;
|
tableColumnVisible = [];
|
||||||
|
|
||||||
handleLoadingDialog()
|
// Initialize tableColumnVisible by including all columns from selectedColumns, preserving their order.
|
||||||
|
tableColumnVisible = selectedColumns.map(column => availableColumns.indexOf(column)).filter(index => index !== -1);
|
||||||
|
|
||||||
|
// Add any columns from availableColumns that are not in selectedColumns to the end.
|
||||||
|
const remainingColumns = availableColumns.map((column, index) => index).filter(index => !tableColumnVisible.includes(index));
|
||||||
|
|
||||||
|
// Combine both arrays.
|
||||||
|
tableColumnOrder = tableColumnVisible.concat(remainingColumns);
|
||||||
|
|
||||||
|
// Generate the full array of numbers from 0 to totalLength - 1 of tableColumnOrder
|
||||||
|
const fullArray = Array.from({ length: tableColumnOrder.length }, (_, i) => i);
|
||||||
|
|
||||||
|
// Filter out the elements already present in inputArray
|
||||||
|
const missingNumbers = fullArray.filter(num => !tableColumnVisible.includes(num));
|
||||||
|
|
||||||
|
// Concatenate the inputArray with the missingNumbers
|
||||||
|
tableColumnOrder = [...tableColumnVisible, ...missingNumbers];
|
||||||
|
|
||||||
|
// render table headers
|
||||||
|
html = '';
|
||||||
|
|
||||||
|
for(index = 0; index < tableColumnOrder.length; index++)
|
||||||
|
{
|
||||||
|
html += '<th>' + headersDefaultOrder[tableColumnOrder[index]] + '</th>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#tableDevices tr').html(html);
|
||||||
|
|
||||||
// Hide UI elements as per settings
|
// Hide UI elements as per settings
|
||||||
// setTimeout(() => {
|
// setTimeout(() => {
|
||||||
@@ -198,75 +213,12 @@ function main () {
|
|||||||
|
|
||||||
// }, 10);
|
// }, 10);
|
||||||
|
|
||||||
|
// Initialize components with parameters
|
||||||
|
initializeDatatable(getUrlAnchor('my_devices'));
|
||||||
|
|
||||||
// get from cookie if available (need to use decodeURI as saved as part of URI in PHP)
|
// check if data outdated and show spinner if so
|
||||||
cookieColumnsVisibleStr = decodeURI(getCookie("Front_Devices_Columns_Visible")).replaceAll('%2C',',')
|
handleLoadingDialog()
|
||||||
|
|
||||||
defaultValue = cookieColumnsVisibleStr == "" ? columnsStr : cookieColumnsVisibleStr;
|
|
||||||
|
|
||||||
// get visible columns
|
|
||||||
$.get('php/server/parameters.php?action=get&expireMinutes=525600&defaultValue='+defaultValue+'¶meter=Front_Devices_Columns_Visible&skipcache', function(data) {
|
|
||||||
|
|
||||||
handle_locked_DB(data)
|
|
||||||
|
|
||||||
// save which columns are in the Devices page visible
|
|
||||||
tableColumnVisible = numberArrayFromString(data);
|
|
||||||
|
|
||||||
// get from cookie if available (need to use decodeURI as saved as part of URI in PHP)
|
|
||||||
cookieColumnsOrderStr = decodeURI(getCookie("Front_Devices_Columns_Order")).replaceAll('%2C',',')
|
|
||||||
|
|
||||||
defaultValue = cookieColumnsOrderStr == "" ? columnsStr : cookieColumnsOrderStr;
|
|
||||||
|
|
||||||
// get the custom order specified by the user
|
|
||||||
$.get('php/server/parameters.php?action=get&expireMinutes=525600&defaultValue='+defaultValue+'¶meter=Front_Devices_Columns_Order&skipcache', function(data) {
|
|
||||||
|
|
||||||
handle_locked_DB(data)
|
|
||||||
|
|
||||||
// save the columns order in the Devices page
|
|
||||||
tableColumnOrder = numberArrayFromString(data);
|
|
||||||
|
|
||||||
html = '';
|
|
||||||
|
|
||||||
for(index = 0; index < tableColumnOrder.length; index++)
|
|
||||||
{
|
|
||||||
html += '<th>' + headersDefaultOrder[tableColumnOrder[index]] + '</th>';
|
|
||||||
}
|
|
||||||
|
|
||||||
$('#tableDevices tr').html(html);
|
|
||||||
|
|
||||||
// get parameter value
|
|
||||||
$.get('php/server/parameters.php?action=get&defaultValue=50¶meter='+ parTableRows, function(data) {
|
|
||||||
var result = JSON.parse(data);
|
|
||||||
|
|
||||||
result = parseInt(result, 10)
|
|
||||||
|
|
||||||
if (Number.isInteger (result) ) {
|
|
||||||
tableRows = result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get parameter value
|
|
||||||
$.get('php/server/parameters.php?action=get&defaultValue=[[3,"desc"],[0,"asc"]]¶meter='+ parTableOrder, function(data) {
|
|
||||||
var result = JSON.parse(data);
|
|
||||||
result = JSON.parse(result);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (Array.isArray (result) ) {
|
|
||||||
tableOrder = result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize components with parameters
|
|
||||||
|
|
||||||
initializeDatatable(getUrlAnchor('my_devices'));
|
|
||||||
|
|
||||||
// check if data outdated and show spinner if so
|
|
||||||
handleLoadingDialog()
|
|
||||||
|
|
||||||
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
@@ -468,6 +420,11 @@ function initializeDatatable (status) {
|
|||||||
|
|
||||||
$.get('api/table_devices.json?nocache=' + Date.now(), function(result) {
|
$.get('api/table_devices.json?nocache=' + Date.now(), function(result) {
|
||||||
|
|
||||||
|
// refresh devices cache
|
||||||
|
devicesListAll_JSON = result["data"]
|
||||||
|
devicesListAll_JSON_str = JSON.stringify(devicesListAll_JSON)
|
||||||
|
setCache('devicesListAll_JSON', devicesListAll_JSON_str)
|
||||||
|
|
||||||
// query data
|
// query data
|
||||||
getDevicesTotals(result.data);
|
getDevicesTotals(result.data);
|
||||||
|
|
||||||
@@ -501,7 +458,8 @@ function initializeDatatable (status) {
|
|||||||
item.dev_GUID || "",
|
item.dev_GUID || "",
|
||||||
item.dev_SyncHubNodeName || "",
|
item.dev_SyncHubNodeName || "",
|
||||||
item.dev_NetworkSite || "",
|
item.dev_NetworkSite || "",
|
||||||
item.dev_SSID || ""
|
item.dev_SSID || "",
|
||||||
|
item.dev_SourcePlugin || ""
|
||||||
];
|
];
|
||||||
|
|
||||||
var newRow = [];
|
var newRow = [];
|
||||||
@@ -515,10 +473,6 @@ function initializeDatatable (status) {
|
|||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// TODO displayed columns
|
|
||||||
|
|
||||||
|
|
||||||
// Check if the DataTable already exists
|
// Check if the DataTable already exists
|
||||||
if ($.fn.dataTable.isDataTable('#tableDevices')) {
|
if ($.fn.dataTable.isDataTable('#tableDevices')) {
|
||||||
// The DataTable exists, so destroy it
|
// The DataTable exists, so destroy it
|
||||||
@@ -526,12 +480,12 @@ function initializeDatatable (status) {
|
|||||||
table.clear().destroy();
|
table.clear().destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
var table=
|
var table =
|
||||||
$('#tableDevices').DataTable({
|
$('#tableDevices').DataTable({
|
||||||
'data' : dataArray["data"],
|
'data' : dataArray["data"],
|
||||||
'paging' : true,
|
'paging' : true,
|
||||||
'lengthChange' : true,
|
'lengthChange' : true,
|
||||||
'lengthMenu' : [[10, 25, 50, 100, 500, -1], [10, 25, 50, 100, 500, getString('Device_Tablelenght_all')]],
|
'lengthMenu' : [[10, 25, 50, 100, 500, 100000], [10, 25, 50, 100, 500, getString('Device_Tablelenght_all')]],
|
||||||
'searching' : true,
|
'searching' : true,
|
||||||
|
|
||||||
'ordering' : true,
|
'ordering' : true,
|
||||||
@@ -594,14 +548,32 @@ function initializeDatatable (status) {
|
|||||||
} },
|
} },
|
||||||
|
|
||||||
// IP address
|
// IP address
|
||||||
|
{targets: [mapIndx(8)],
|
||||||
|
'createdCell': function (td, cellData, rowData, row, col) {
|
||||||
|
if (!emptyArr.includes(cellData)){
|
||||||
|
$(td).html (`<span class="anonymizeIp">
|
||||||
|
<a href="http://${cellData}" class="pointer" target="_blank">
|
||||||
|
${cellData}
|
||||||
|
</a>
|
||||||
|
<a href="https://${cellData}" class="pointer" target="_blank">
|
||||||
|
<i class="fa fa-lock "></i>
|
||||||
|
</a>
|
||||||
|
<span>`);
|
||||||
|
} else {
|
||||||
|
$(td).html ('');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// IP address (ordeable)
|
||||||
{targets: [mapIndx(12)],
|
{targets: [mapIndx(12)],
|
||||||
'createdCell': function (td, cellData, rowData, row, col) {
|
'createdCell': function (td, cellData, rowData, row, col) {
|
||||||
if (!emptyArr.includes(cellData)){
|
if (!emptyArr.includes(cellData)){
|
||||||
$(td).html ('<span class="anonymizeIp">'+cellData+'</span>');
|
$(td).html (`<span class="anonymizeIp">${cellData}<span>`);
|
||||||
} else {
|
} else {
|
||||||
$(td).html ('');
|
$(td).html ('');
|
||||||
}
|
}
|
||||||
} },
|
}
|
||||||
|
},
|
||||||
|
|
||||||
// Favorite
|
// Favorite
|
||||||
{targets: [mapIndx(4)],
|
{targets: [mapIndx(4)],
|
||||||
@@ -679,11 +651,11 @@ function initializeDatatable (status) {
|
|||||||
|
|
||||||
// Save cookie Rows displayed, and Parameters rows & order
|
// Save cookie Rows displayed, and Parameters rows & order
|
||||||
$('#tableDevices').on( 'length.dt', function ( e, settings, len ) {
|
$('#tableDevices').on( 'length.dt', function ( e, settings, len ) {
|
||||||
setParameter (parTableRows, len);
|
setCookie ("nax_parTableRows", len, 129600); // save for 90 days
|
||||||
} );
|
} );
|
||||||
|
|
||||||
$('#tableDevices').on( 'order.dt', function () {
|
$('#tableDevices').on( 'order.dt', function () {
|
||||||
setParameter (parTableOrder, JSON.stringify (table.order()) );
|
setCookie ("nax_parTableOrder", JSON.stringify (table.order()), 129600); // save for 90 days
|
||||||
setCache ('devicesList', getDevicesFromTable(table) );
|
setCache ('devicesList', getDevicesFromTable(table) );
|
||||||
} );
|
} );
|
||||||
|
|
||||||
@@ -703,8 +675,6 @@ function initializeDatatable (status) {
|
|||||||
// Check if any row is selected
|
// Check if any row is selected
|
||||||
var anyRowSelected = $('#tableDevices tr.selected').length > 0;
|
var anyRowSelected = $('#tableDevices tr.selected').length > 0;
|
||||||
|
|
||||||
console.log(anyRowSelected);
|
|
||||||
|
|
||||||
// Toggle visibility of element with ID 'multiEdit'
|
// Toggle visibility of element with ID 'multiEdit'
|
||||||
$('#multiEdit').toggle(anyRowSelected);
|
$('#multiEdit').toggle(anyRowSelected);
|
||||||
}, 200);
|
}, 200);
|
||||||
|
|||||||
@@ -183,43 +183,31 @@
|
|||||||
|
|
||||||
<!-- page script ----------------------------------------------------------- -->
|
<!-- page script ----------------------------------------------------------- -->
|
||||||
<script>
|
<script>
|
||||||
var parPeriod = 'Front_Events_Period';
|
var parPeriod = 'nax_parPeriod';
|
||||||
var parTableRows = 'Front_Events_Rows';
|
var parTableRows = 'nax_parTableRows';
|
||||||
|
|
||||||
var eventsType = 'all';
|
var eventsType = 'all';
|
||||||
var period = '';
|
var period = '1 day';
|
||||||
var tableRows = 10;
|
var tableRows = 25;
|
||||||
|
|
||||||
// Read parameters & Initialize components
|
// Read parameters & Initialize components
|
||||||
main();
|
main();
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
function main () {
|
function main() {
|
||||||
// get parameter value
|
// Get parameter value from cookies instead of server
|
||||||
$.get('php/server/parameters.php?action=get&defaultValue=1 day¶meter='+ parPeriod, function(data) {
|
period = getCookie(parPeriod) === "" ? "1 day" : getCookie(parPeriod);
|
||||||
var result = JSON.parse(data);
|
$('#period').val(period);
|
||||||
if (result) {
|
|
||||||
period = result;
|
|
||||||
$('#period').val(period);
|
|
||||||
}
|
|
||||||
|
|
||||||
// get parameter value
|
tableRows = getCookie(parTableRows) === "" ? 50 : parseInt(getCookie(parTableRows), 10);
|
||||||
$.get('php/server/parameters.php?action=get&defaultValue=50¶meter='+ parTableRows, function(data) {
|
|
||||||
var result = JSON.parse(data);
|
|
||||||
result = parseInt(result, 10)
|
|
||||||
if (Number.isInteger (result) ) {
|
|
||||||
tableRows = result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize components
|
// Initialize components
|
||||||
initializeDatatable();
|
initializeDatatable();
|
||||||
|
|
||||||
// query data
|
// Query data
|
||||||
getEventsTotals();
|
getEventsTotals();
|
||||||
getEvents (eventsType);
|
getEvents(eventsType);
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -281,7 +269,7 @@ function initializeDatatable () {
|
|||||||
|
|
||||||
// Save Parameter rows when changed
|
// Save Parameter rows when changed
|
||||||
$('#tableEvents').on( 'length.dt', function ( e, settings, len ) {
|
$('#tableEvents').on( 'length.dt', function ( e, settings, len ) {
|
||||||
setParameter (parTableRows, len);
|
setCookie(parTableRows, len)
|
||||||
} );
|
} );
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -290,7 +278,8 @@ function initializeDatatable () {
|
|||||||
function periodChanged () {
|
function periodChanged () {
|
||||||
// Save Parameter Period
|
// Save Parameter Period
|
||||||
period = $('#period').val();
|
period = $('#period').val();
|
||||||
setParameter (parPeriod, period);
|
|
||||||
|
setCookie(parTableRows, period)
|
||||||
|
|
||||||
// Requery totals and events
|
// Requery totals and events
|
||||||
getEventsTotals();
|
getEventsTotals();
|
||||||
|
|||||||
@@ -3,11 +3,13 @@
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
require dirname(__FILE__).'/php/server/init.php';
|
require dirname(__FILE__).'/php/server/init.php';
|
||||||
require 'php/templates/security.php';
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
|
||||||
$CookieSaveLoginName = 'NetAlertX_SaveLogin';
|
$CookieSaveLoginName = 'NetAlertX_SaveLogin';
|
||||||
|
|
||||||
if ($Pia_WebProtection != 'true')
|
if ($nax_WebProtection != 'true')
|
||||||
{
|
{
|
||||||
header('Location: devices.php');
|
header('Location: devices.php');
|
||||||
$_SESSION["login"] = 1;
|
$_SESSION["login"] = 1;
|
||||||
@@ -24,7 +26,7 @@ if (isset ($_GET["action"]) && $_GET["action"] == 'logout')
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Password without Cookie check -> pass and set initial cookie
|
// Password without Cookie check -> pass and set initial cookie
|
||||||
if (isset ($_POST["loginpassword"]) && $Pia_Password == hash('sha256',$_POST["loginpassword"]))
|
if (isset ($_POST["loginpassword"]) && $nax_Password == hash('sha256',$_POST["loginpassword"]))
|
||||||
{
|
{
|
||||||
header('Location: devices.php');
|
header('Location: devices.php');
|
||||||
$_SESSION["login"] = 1;
|
$_SESSION["login"] = 1;
|
||||||
@@ -32,7 +34,7 @@ if (isset ($_POST["loginpassword"]) && $Pia_Password == hash('sha256',$_POST["lo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// active Session or valid cookie (cookie not extends)
|
// active Session or valid cookie (cookie not extends)
|
||||||
if (( isset ($_SESSION["login"]) && ($_SESSION["login"] == 1)) || (isset ($_COOKIE[$CookieSaveLoginName]) && $Pia_Password == $_COOKIE[$CookieSaveLoginName]))
|
if (( isset ($_SESSION["login"]) && ($_SESSION["login"] == 1)) || (isset ($_COOKIE[$CookieSaveLoginName]) && $nax_Password == $_COOKIE[$CookieSaveLoginName]))
|
||||||
{
|
{
|
||||||
header('Location: devices.php');
|
header('Location: devices.php');
|
||||||
$_SESSION["login"] = 1;
|
$_SESSION["login"] = 1;
|
||||||
@@ -40,7 +42,7 @@ if (( isset ($_SESSION["login"]) && ($_SESSION["login"] == 1)) || (isset ($_COOK
|
|||||||
}
|
}
|
||||||
|
|
||||||
$login_headline = lang('Login_Toggle_Info_headline');
|
$login_headline = lang('Login_Toggle_Info_headline');
|
||||||
$login_info = "";
|
$login_info = lang('Login_Info');
|
||||||
$login_mode = 'danger';
|
$login_mode = 'danger';
|
||||||
$login_display_mode = 'display: block;';
|
$login_display_mode = 'display: block;';
|
||||||
$login_icon = 'fa-info';
|
$login_icon = 'fa-info';
|
||||||
@@ -48,7 +50,7 @@ $login_icon = 'fa-info';
|
|||||||
// no active session, cookie not checked
|
// no active session, cookie not checked
|
||||||
if (isset ($_SESSION["login"]) == FALSE || $_SESSION["login"] != 1)
|
if (isset ($_SESSION["login"]) == FALSE || $_SESSION["login"] != 1)
|
||||||
{
|
{
|
||||||
if ($Pia_Password == '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92')
|
if ($nax_Password == '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92')
|
||||||
{
|
{
|
||||||
$login_info = lang('Login_Default_PWD');
|
$login_info = lang('Login_Default_PWD');
|
||||||
$login_mode = 'danger';
|
$login_mode = 'danger';
|
||||||
@@ -78,7 +80,7 @@ if (isset ($_SESSION["login"]) == FALSE || $_SESSION["login"] != 1)
|
|||||||
<meta http-equiv="Pragma" content="no-cache" />
|
<meta http-equiv="Pragma" content="no-cache" />
|
||||||
<meta http-equiv="Expires" content="0" />
|
<meta http-equiv="Expires" content="0" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<title>Net Alert X | Log in</title>
|
<title>NetAlert X | Log in</title>
|
||||||
<!-- Tell the browser to be responsive to screen width -->
|
<!-- Tell the browser to be responsive to screen width -->
|
||||||
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
|
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
|
||||||
<!-- Bootstrap 3.3.7 -->
|
<!-- Bootstrap 3.3.7 -->
|
||||||
@@ -91,20 +93,31 @@ if (isset ($_SESSION["login"]) == FALSE || $_SESSION["login"] != 1)
|
|||||||
<link rel="stylesheet" href="lib/AdminLTE/dist/css/AdminLTE.min.css">
|
<link rel="stylesheet" href="lib/AdminLTE/dist/css/AdminLTE.min.css">
|
||||||
<!-- iCheck -->
|
<!-- iCheck -->
|
||||||
<link rel="stylesheet" href="lib/AdminLTE/plugins/iCheck/square/blue.css">
|
<link rel="stylesheet" href="lib/AdminLTE/plugins/iCheck/square/blue.css">
|
||||||
|
<!-- Font Awesome -->
|
||||||
|
<link rel="stylesheet" href="lib/AdminLTE/bower_components/font-awesome/css/fontawesome.min.css">
|
||||||
|
<link rel="stylesheet" href="lib/AdminLTE/bower_components/font-awesome/css/solid.css">
|
||||||
|
<link rel="stylesheet" href="lib/AdminLTE/bower_components/font-awesome/css/brands.css">
|
||||||
|
<link rel="stylesheet" href="lib/AdminLTE/bower_components/font-awesome/css/v5-font-face.css">
|
||||||
|
<!-- Favicon -->
|
||||||
|
<link id="favicon" rel="icon" type="image/x-icon" href="img/NetAlertX_logo.png">
|
||||||
|
|
||||||
<!-- Dark-Mode Patch -->
|
<!-- Dark-Mode Patch -->
|
||||||
<?php
|
<?php
|
||||||
if ($ENABLED_DARKMODE === True) {
|
switch ($UI_THEME) {
|
||||||
echo '<link rel="stylesheet" href="css/dark-patch.css">';
|
case "Dark":
|
||||||
$BACKGROUND_IMAGE_PATCH='style="background-image: url(\'img/boxed-bg-dark.png\');"';
|
echo '<link rel="stylesheet" href="css/dark-patch.css">';
|
||||||
} else { $BACKGROUND_IMAGE_PATCH='style="background-image: url(\'img/background.png\');"';}
|
break;
|
||||||
|
case "System":
|
||||||
|
echo '<link rel="stylesheet" href="css/system-dark-patch.css">';
|
||||||
|
break;
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
<link rel="stylesheet" href="/css/offline-font.css">
|
<link rel="stylesheet" href="/css/offline-font.css">
|
||||||
</head>
|
</head>
|
||||||
<body class="hold-transition login-page">
|
<body class="hold-transition login-page">
|
||||||
<div class="login-box login-custom">
|
<div class="login-box login-custom">
|
||||||
<div class="login-logo">
|
<div class="login-logo">
|
||||||
<a href="/index2.php">Net <b>Alert</b><sup>x</sup></a>
|
<a href="/index2.php">Net<b>Alert</b><sup>x</sup></a>
|
||||||
</div>
|
</div>
|
||||||
<!-- /.login-logo -->
|
<!-- /.login-logo -->
|
||||||
<div class="login-box-body">
|
<div class="login-box-body">
|
||||||
@@ -140,11 +153,9 @@ if ($ENABLED_DARKMODE === True) {
|
|||||||
</div>
|
</div>
|
||||||
<!-- /.login-box-body -->
|
<!-- /.login-box-body -->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div id="myDIV" class="box-body" style="margin-top: 50px; <?php echo $login_display_mode;?>">
|
<div id="myDIV" class="box-body" style="margin-top: 50px; <?php echo $login_display_mode;?>">
|
||||||
<div class="alert alert-<?php echo $login_mode;?> alert-dismissible">
|
<div class="alert alert-<?php echo $login_mode;?> alert-dismissible">
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-hidden="true"><EFBFBD></button>
|
<button type="button" class="close" onclick="Passwordhinfo()" aria-hidden="true">X</button>
|
||||||
<h4><i class="icon fa <?php echo $login_icon;?>"></i><?php echo $login_headline;?></h4>
|
<h4><i class="icon fa <?php echo $login_icon;?>"></i><?php echo $login_headline;?></h4>
|
||||||
<p><?php echo $login_info;?></p>
|
<p><?php echo $login_info;?></p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ var timerRefreshData = ''
|
|||||||
|
|
||||||
var emptyArr = ['undefined', "", undefined, null, 'null'];
|
var emptyArr = ['undefined', "", undefined, null, 'null'];
|
||||||
var UI_LANG = "English";
|
var UI_LANG = "English";
|
||||||
const allLanguages = ["en_us", "es_es", "de_de", "fr_fr", "it_it", "ru_ru", "nb_no", "pl_pl", "zh_cn", "cs_cz"]; // needs to be same as in lang.php
|
const allLanguages = ["en_us", "es_es", "de_de", "fr_fr", "it_it", "ru_ru", "nb_no", "pl_pl", "pt_br", "tr_tr", "zh_cn", "cs_cz", "ar_ar"]; // needs to be same as in lang.php
|
||||||
var settingsJSON = {}
|
var settingsJSON = {}
|
||||||
|
|
||||||
|
|
||||||
@@ -212,7 +212,8 @@ function cacheStrings() {
|
|||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
// Create a promise for each language
|
// Create a promise for each language
|
||||||
const languagePromises = allLanguages.map((language_code) => {
|
languagesToLoad = ['en_us', getLangCode()]
|
||||||
|
const languagePromises = languagesToLoad.map((language_code) => {
|
||||||
return new Promise((resolveLang, rejectLang) => {
|
return new Promise((resolveLang, rejectLang) => {
|
||||||
// Fetch core strings and translations
|
// Fetch core strings and translations
|
||||||
|
|
||||||
@@ -267,6 +268,30 @@ function cacheStrings() {
|
|||||||
function getString(key) {
|
function getString(key) {
|
||||||
|
|
||||||
function fetchString(key) {
|
function fetchString(key) {
|
||||||
|
|
||||||
|
lang_code = getLangCode();
|
||||||
|
|
||||||
|
let result = getCache(`pia_lang_${key}_${lang_code}`, true);
|
||||||
|
|
||||||
|
if (isEmpty(result)) {
|
||||||
|
result = getCache(`pia_lang_${key}_en_us`, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isAppInitialized()) {
|
||||||
|
return fetchString(key);
|
||||||
|
} else {
|
||||||
|
callAfterAppInitialized(() => fetchString(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// Get current language ISO code
|
||||||
|
// below has to match exactly teh values in /front/php/templates/language/lang.php & /front/js/common.js
|
||||||
|
function getLangCode() {
|
||||||
|
|
||||||
UI_LANG = getSetting("UI_LANG");
|
UI_LANG = getSetting("UI_LANG");
|
||||||
|
|
||||||
let lang_code = 'en_us';
|
let lang_code = 'en_us';
|
||||||
@@ -308,22 +333,12 @@ function getString(key) {
|
|||||||
case 'Czech (cs_cz)':
|
case 'Czech (cs_cz)':
|
||||||
lang_code = 'cs_cz';
|
lang_code = 'cs_cz';
|
||||||
break;
|
break;
|
||||||
|
case 'Arabic (ar_ar)':
|
||||||
|
lang_code = 'ar_ar';
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
let result = getCache(`pia_lang_${key}_${lang_code}`, true);
|
return lang_code;
|
||||||
|
|
||||||
if (isEmpty(result)) {
|
|
||||||
result = getCache(`pia_lang_${key}_en_us`, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isAppInitialized()) {
|
|
||||||
return fetchString(key);
|
|
||||||
} else {
|
|
||||||
callAfterAppInitialized(() => fetchString(key));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -331,6 +346,8 @@ function getString(key) {
|
|||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// String utilities
|
// String utilities
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// ----------------------------------------------------
|
||||||
function jsonSyntaxHighlight(json) {
|
function jsonSyntaxHighlight(json) {
|
||||||
if (typeof json != 'string') {
|
if (typeof json != 'string') {
|
||||||
json = JSON.stringify(json, undefined, 2);
|
json = JSON.stringify(json, undefined, 2);
|
||||||
@@ -353,6 +370,7 @@ function jsonSyntaxHighlight(json) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------
|
||||||
function isValidBase64(str) {
|
function isValidBase64(str) {
|
||||||
// Base64 characters set
|
// Base64 characters set
|
||||||
var base64CharacterSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
var base64CharacterSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
||||||
@@ -362,7 +380,7 @@ function isValidBase64(str) {
|
|||||||
return invalidCharacters === '';
|
return invalidCharacters === '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------
|
||||||
function isValidJSON(jsonString) {
|
function isValidJSON(jsonString) {
|
||||||
try {
|
try {
|
||||||
JSON.parse(jsonString);
|
JSON.parse(jsonString);
|
||||||
@@ -372,6 +390,37 @@ function isValidJSON(jsonString) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------
|
||||||
|
// method to sanitize input so that HTML and other things don't break
|
||||||
|
function encodeSpecialChars(str) {
|
||||||
|
return str
|
||||||
|
.replace(/&/g, '&')
|
||||||
|
.replace(/</g, '<')
|
||||||
|
.replace(/>/g, '>')
|
||||||
|
.replace(/"/g, '"')
|
||||||
|
.replace(/'/g, ''');
|
||||||
|
}
|
||||||
|
// ----------------------------------------------------
|
||||||
|
function decodeSpecialChars(str) {
|
||||||
|
return str
|
||||||
|
.replace(/&/g, '&')
|
||||||
|
.replace(/</g, '<')
|
||||||
|
.replace(/>/g, '>')
|
||||||
|
.replace(/"/g, '"')
|
||||||
|
.replace(/'/g, '\'');
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------
|
||||||
|
// base64 conversion of UTF8 chars
|
||||||
|
function utf8ToBase64(str) {
|
||||||
|
// Convert the string to a Uint8Array using TextEncoder
|
||||||
|
const utf8Bytes = new TextEncoder().encode(str);
|
||||||
|
|
||||||
|
// Convert the Uint8Array to a base64-encoded string
|
||||||
|
return btoa(String.fromCharCode(...utf8Bytes));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// General utilities
|
// General utilities
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
@@ -399,6 +448,7 @@ function handle_locked_DB(data)
|
|||||||
showSpinner()
|
showSpinner()
|
||||||
|
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
|
console.warn("Database locked - reload")
|
||||||
location.reload();
|
location.reload();
|
||||||
}, 5000);
|
}, 5000);
|
||||||
}
|
}
|
||||||
@@ -411,29 +461,6 @@ function numberArrayFromString(data)
|
|||||||
return data.replace(/\[|\]/g, '').split(',').map(Number);
|
return data.replace(/\[|\]/g, '').split(',').map(Number);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
function setParameter (parameter, value) {
|
|
||||||
// Retry
|
|
||||||
$.get('php/server/parameters.php?action=set¶meter=' + parameter +
|
|
||||||
'&value='+ value,
|
|
||||||
function(data) {
|
|
||||||
if (data != "OK") {
|
|
||||||
// Retry
|
|
||||||
sleep (200);
|
|
||||||
$.get('php/server/parameters.php?action=set¶meter=' + parameter +
|
|
||||||
'&value='+ value,
|
|
||||||
function(data) {
|
|
||||||
if (data != "OK") {
|
|
||||||
// alert (data);
|
|
||||||
} else {
|
|
||||||
// alert ("OK. Second attempt");
|
|
||||||
};
|
|
||||||
} );
|
|
||||||
};
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
function saveData(functionName, id, value) {
|
function saveData(functionName, id, value) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
@@ -618,17 +645,11 @@ function debugTimer () {
|
|||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
function secondsSincePageLoad() {
|
function secondsSincePageLoad() {
|
||||||
// Get the current time
|
// Get the current time since the page was loaded
|
||||||
var currentTime = Date.now();
|
var timeSincePageLoad = performance.now();
|
||||||
|
|
||||||
// Get the time when the page was loaded
|
|
||||||
var pageLoadTime = performance.timeOrigin;
|
|
||||||
|
|
||||||
// Calculate the difference in milliseconds
|
|
||||||
var timeDifference = currentTime - pageLoadTime;
|
|
||||||
|
|
||||||
// Convert milliseconds to seconds
|
// Convert milliseconds to seconds
|
||||||
var secondsAgo = Math.floor(timeDifference / 1000);
|
var secondsAgo = Math.floor(timeSincePageLoad / 1000);
|
||||||
|
|
||||||
return secondsAgo;
|
return secondsAgo;
|
||||||
}
|
}
|
||||||
@@ -989,11 +1010,11 @@ function hideSpinner()
|
|||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
// Calls a backend function to add a front-end event to an execution queue
|
// Calls a backend function to add a front-end event to an execution queue
|
||||||
function updateApi()
|
function updateApi(apiEndpoints)
|
||||||
{
|
{
|
||||||
|
|
||||||
// value has to be in format event|param. e.g. run|ARPSCAN
|
// value has to be in format event|param. e.g. run|ARPSCAN
|
||||||
action = `${getGuid()}|update_api|devices,appevents`
|
action = `${getGuid()}|update_api|${apiEndpoints}`
|
||||||
|
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
@@ -1134,6 +1155,58 @@ function arraysContainSameValues(arr1, arr2) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// Hide elements on the page based on the supplied setting
|
||||||
|
function hideUIelements(settingKey) {
|
||||||
|
|
||||||
|
hiddenSectionsSetting = getSetting(settingKey)
|
||||||
|
|
||||||
|
if(hiddenSectionsSetting != "") // handle if settings not yet initialized
|
||||||
|
{
|
||||||
|
|
||||||
|
sectionsArray = createArray(hiddenSectionsSetting)
|
||||||
|
|
||||||
|
// remove spaces to get IDs
|
||||||
|
var newArray = $.map(sectionsArray, function(value) {
|
||||||
|
return value.replace(/\s/g, '');
|
||||||
|
});
|
||||||
|
|
||||||
|
$.each(newArray, function(index, hiddenSection) {
|
||||||
|
|
||||||
|
if($('#' + hiddenSection))
|
||||||
|
{
|
||||||
|
$('#' + hiddenSection).hide()
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// apply theme
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
let theme = getSetting("UI_theme");
|
||||||
|
if (theme) {
|
||||||
|
theme = theme.replace("['","").replace("']","");
|
||||||
|
// Add the theme stylesheet
|
||||||
|
setCookie("UI_theme", theme);
|
||||||
|
switch(theme) {
|
||||||
|
case "Dark":
|
||||||
|
$('head').append('<link rel="stylesheet" href="css/dark-patch.css">');
|
||||||
|
break;
|
||||||
|
case "System":
|
||||||
|
$('head').append('<link rel="stylesheet" href="css/system-dark-patch.css">');
|
||||||
|
break
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setCookie("UI_theme", "Light");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// initialize
|
// initialize
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
@@ -1144,7 +1217,7 @@ const sessionStorageKey = "myScriptExecuted_common_js";
|
|||||||
var completedCalls = []
|
var completedCalls = []
|
||||||
var completedCalls_final = ['cacheSettings', 'cacheStrings', 'cacheDevices'];
|
var completedCalls_final = ['cacheSettings', 'cacheStrings', 'cacheDevices'];
|
||||||
var completedCallsCount = 0;
|
var completedCallsCount = 0;
|
||||||
var completedCallsCount_final = allLanguages.length + 2; // number of language files + cacheDevices + cacheSettings
|
var completedCallsCount_final;
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// Clearing all the caches
|
// Clearing all the caches
|
||||||
@@ -1153,8 +1226,9 @@ function clearCache() {
|
|||||||
sessionStorage.clear();
|
sessionStorage.clear();
|
||||||
localStorage.clear();
|
localStorage.clear();
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
window.location.reload();
|
console.warn("clearChache called");
|
||||||
}, 500);
|
window.location.reload();
|
||||||
|
}, 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
@@ -1199,7 +1273,11 @@ function callAfterAppInitialized(callback) {
|
|||||||
// Check if the code has been executed before by checking sessionStorage
|
// Check if the code has been executed before by checking sessionStorage
|
||||||
function isAppInitialized() {
|
function isAppInitialized() {
|
||||||
// return arraysContainSameValues(getCache("completedCalls").split(',').filter(Boolean), completedCalls_final);
|
// return arraysContainSameValues(getCache("completedCalls").split(',').filter(Boolean), completedCalls_final);
|
||||||
return (parseInt(getCache("completedCallsCount")) == completedCallsCount_final);
|
|
||||||
|
// loading settings + 1 (or 2 language files if not english) + device cache.
|
||||||
|
completedCallsCount_final = getLangCode() == 'en_us' ? 3 : 4 ;
|
||||||
|
|
||||||
|
return (parseInt(getCache("completedCallsCount")) >= completedCallsCount_final);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define a function that will execute the code only once
|
// Define a function that will execute the code only once
|
||||||
@@ -1291,6 +1369,7 @@ setTimeout(() => {
|
|||||||
// page refresh if configured
|
// page refresh if configured
|
||||||
const refreshTime = getSetting("UI_REFRESH");
|
const refreshTime = getSetting("UI_REFRESH");
|
||||||
if (refreshTime && refreshTime !== "0" && refreshTime !== "") {
|
if (refreshTime && refreshTime !== "0" && refreshTime !== "") {
|
||||||
|
console.log("Refreshing page becasue UI_REFRESH setting enabled.");
|
||||||
newTimerRefreshData(clearCache, parseInt(refreshTime)*1000);
|
newTimerRefreshData(clearCache, parseInt(refreshTime)*1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,17 @@
|
|||||||
function pia_draw_graph_online_history(pia_js_graph_online_history_time, pia_js_graph_online_history_ondev, pia_js_graph_online_history_dodev, pia_js_graph_online_history_ardev) {
|
function presenceOverTime(
|
||||||
var xValues = pia_js_graph_online_history_time;
|
timeStamp,
|
||||||
|
onlineCount,
|
||||||
// alert("dev presence")
|
offlineCount,
|
||||||
|
archivedCount,
|
||||||
|
downCount
|
||||||
|
) {
|
||||||
|
var xValues = timeStamp;
|
||||||
|
|
||||||
// Data object for online status
|
// Data object for online status
|
||||||
onlineData = {
|
onlineData = {
|
||||||
label: 'Online',
|
label: 'Online',
|
||||||
data: pia_js_graph_online_history_ondev,
|
data: onlineCount,
|
||||||
borderColor: "rgba(0, 166, 89)",
|
borderColor: "#00000",
|
||||||
fill: true,
|
fill: true,
|
||||||
backgroundColor: "rgba(0, 166, 89, .6)",
|
backgroundColor: "rgba(0, 166, 89, .6)",
|
||||||
pointStyle: 'circle',
|
pointStyle: 'circle',
|
||||||
@@ -15,20 +19,29 @@ function pia_draw_graph_online_history(pia_js_graph_online_history_time, pia_js_
|
|||||||
pointHoverRadius: 3
|
pointHoverRadius: 3
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Data object for down status
|
||||||
|
downData = {
|
||||||
|
label: 'Down',
|
||||||
|
data: downCount,
|
||||||
|
borderColor: "#00000",
|
||||||
|
fill: true,
|
||||||
|
backgroundColor: "#dd4b39",
|
||||||
|
};
|
||||||
|
|
||||||
// Data object for offline status
|
// Data object for offline status
|
||||||
offlineData = {
|
offlineData = {
|
||||||
label: 'Offline/Down',
|
label: 'Offline',
|
||||||
data: pia_js_graph_online_history_dodev,
|
data: offlineCount,
|
||||||
borderColor: "rgba(222, 74, 56)",
|
borderColor: "#00000",
|
||||||
fill: true,
|
fill: true,
|
||||||
backgroundColor: "rgba(222, 74, 56, .6)",
|
backgroundColor: "#b2b6be",
|
||||||
};
|
};
|
||||||
|
|
||||||
// Data object for archived status
|
// Data object for archived status
|
||||||
archivedData = {
|
archivedData = {
|
||||||
label: 'Archived',
|
label: 'Archived',
|
||||||
data: pia_js_graph_online_history_ardev,
|
data: archivedCount,
|
||||||
borderColor: "rgba(220,220,220)",
|
borderColor: "#00000",
|
||||||
fill: true,
|
fill: true,
|
||||||
backgroundColor: "rgba(220,220,220, .6)",
|
backgroundColor: "rgba(220,220,220, .6)",
|
||||||
};
|
};
|
||||||
@@ -42,23 +55,27 @@ function pia_draw_graph_online_history(pia_js_graph_online_history_time, pia_js_
|
|||||||
// Check if 'online' status should be displayed
|
// Check if 'online' status should be displayed
|
||||||
if(showStats.includes("online"))
|
if(showStats.includes("online"))
|
||||||
{
|
{
|
||||||
datasets.push(onlineData); // Add onlineData to datasets array
|
datasets.push(onlineData);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if 'down' status should be displayed
|
||||||
|
if(showStats.includes("down"))
|
||||||
|
{
|
||||||
|
datasets.push(downData);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if 'offline' status should be displayed
|
// Check if 'offline' status should be displayed
|
||||||
if(showStats.includes("offline"))
|
if(showStats.includes("offline"))
|
||||||
{
|
{
|
||||||
datasets.push(offlineData); // Add offlineData to datasets array
|
datasets.push(offlineData);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if 'archived' status should be displayed
|
// Check if 'archived' status should be displayed
|
||||||
if(showStats.includes("archived"))
|
if(showStats.includes("archived"))
|
||||||
{
|
{
|
||||||
datasets.push(archivedData); // Add archivedData to datasets array
|
datasets.push(archivedData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
new Chart("OnlineChart", {
|
new Chart("OnlineChart", {
|
||||||
type: "bar",
|
type: "bar",
|
||||||
scaleIntegersOnly: true,
|
scaleIntegersOnly: true,
|
||||||
|
|||||||
@@ -295,6 +295,7 @@ function checkNotification() {
|
|||||||
console.log(response);
|
console.log(response);
|
||||||
// After marking the notification as read, check for the next one
|
// After marking the notification as read, check for the next one
|
||||||
checkNotification();
|
checkNotification();
|
||||||
|
hideSpinner();
|
||||||
},
|
},
|
||||||
error: function(xhr, status, error) {
|
error: function(xhr, status, error) {
|
||||||
console.error("Error marking notification as read:", status, error);
|
console.error("Error marking notification as read:", status, error);
|
||||||
|
|||||||
@@ -304,6 +304,54 @@ function removeAllOptions(element) {
|
|||||||
$(`#${$(element).attr("my-input-to")}`).empty();
|
$(`#${$(element).attr("my-input-to")}`).empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Add all options
|
||||||
|
function selectAll(element) {
|
||||||
|
settingsChanged();
|
||||||
|
|
||||||
|
// Get the <select> element with the class 'deviceSelector'
|
||||||
|
// var selectElement = $('.deviceSelector select');
|
||||||
|
var selectElement = $(`#${$(element).attr("my-input-to")}`);
|
||||||
|
|
||||||
|
// Iterate over each option within the select element
|
||||||
|
selectElement.find('option').each(function() {
|
||||||
|
// Mark each option as selected
|
||||||
|
$(this).prop('selected', true);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Trigger the 'change' event to notify Bootstrap Select of the changes
|
||||||
|
selectElement.trigger('change');
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// UN-Select All
|
||||||
|
function unselectAll(element) {
|
||||||
|
settingsChanged();
|
||||||
|
// Get the <select> element with the class 'deviceSelector'
|
||||||
|
// var selectElement = $('.deviceSelector select');
|
||||||
|
var selectElement = $(`#${$(element).attr("my-input-to")}`);
|
||||||
|
|
||||||
|
// Iterate over each option within the select element
|
||||||
|
selectElement.find('option').each(function() {
|
||||||
|
// Unselect each option
|
||||||
|
$(this).prop('selected', false);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Trigger the 'change' event to notify Bootstrap Select of the changes
|
||||||
|
selectElement.trigger('change');
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// Trigger change to open up the dropdown filed
|
||||||
|
function selectChange(element) {
|
||||||
|
settingsChanged();
|
||||||
|
// Get the <select> element with the class 'deviceSelector'
|
||||||
|
// var selectElement = $('.deviceSelector select');
|
||||||
|
var selectElement = $(`#${$(element).attr("my-input-to")}`);
|
||||||
|
|
||||||
|
selectElement.parent().find("input").focus().click();
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
// Function to initialize remove functionality on select options
|
// Function to initialize remove functionality on select options
|
||||||
|
|
||||||
@@ -437,8 +485,6 @@ function filterRows(inputText) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
// Event listener for input change
|
// Event listener for input change
|
||||||
$("#settingsSearch").on("input", function () {
|
$("#settingsSearch").on("input", function () {
|
||||||
@@ -456,33 +502,6 @@ setTimeout(() => {
|
|||||||
});
|
});
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
// handling events on the backend initiated by the front end END
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// ---------------------------------------------------------
|
|
||||||
// UNUSED?
|
|
||||||
function getParam(targetId, key, skipCache = false) {
|
|
||||||
skipCacheQuery = "";
|
|
||||||
|
|
||||||
if (skipCache) {
|
|
||||||
skipCacheQuery = "&skipcache";
|
|
||||||
}
|
|
||||||
|
|
||||||
// get parameter value
|
|
||||||
$.get(
|
|
||||||
"php/server/parameters.php?action=get&defaultValue=0¶meter=" +
|
|
||||||
key +
|
|
||||||
skipCacheQuery,
|
|
||||||
function (data) {
|
|
||||||
var result = data;
|
|
||||||
|
|
||||||
result = result.replaceAll('"', "");
|
|
||||||
|
|
||||||
document.getElementById(targetId).innerHTML = result.replaceAll('"', "");
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// Show/hide the metadata settings
|
// Show/hide the metadata settings
|
||||||
@@ -493,6 +512,17 @@ function toggleMetadata(element) {
|
|||||||
$(`#${id}`).toggle();
|
$(`#${id}`).toggle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// Show setting description in a modal on smaller screens
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
function showDescription(element) {
|
||||||
|
const id = $(element).attr("my-to-show");
|
||||||
|
|
||||||
|
description = $(`${id}`)[0].innerHTML
|
||||||
|
console.log(description);
|
||||||
|
showModalOK(getString("Gen_Description"), description);
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------
|
// ---------------------------------------------------------
|
||||||
// Helper methods
|
// Helper methods
|
||||||
// ---------------------------------------------------------
|
// ---------------------------------------------------------
|
||||||
@@ -568,6 +598,10 @@ function applyTransformers(val, transformers) {
|
|||||||
val = btoa(val);
|
val = btoa(val);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case "getString":
|
||||||
|
// no change
|
||||||
|
val = val;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
console.warn(`Unknown transformer: ${transformer}`);
|
console.warn(`Unknown transformer: ${transformer}`);
|
||||||
}
|
}
|
||||||
@@ -590,6 +624,10 @@ function reverseTransformers(val, transformers) {
|
|||||||
val = atob(val);
|
val = atob(val);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case "getString":
|
||||||
|
// retrieve string
|
||||||
|
val = getString(val);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
console.warn(`Unknown transformer: ${transformer}`);
|
console.warn(`Unknown transformer: ${transformer}`);
|
||||||
}
|
}
|
||||||
@@ -604,6 +642,7 @@ const handleElementOptions = (codeName, elementOptions, transformers, val) => {
|
|||||||
let inputType = "text";
|
let inputType = "text";
|
||||||
let readOnly = "";
|
let readOnly = "";
|
||||||
let isMultiSelect = false;
|
let isMultiSelect = false;
|
||||||
|
let isOrdeable = false;
|
||||||
let cssClasses = "";
|
let cssClasses = "";
|
||||||
let placeholder = "";
|
let placeholder = "";
|
||||||
let suffix = "";
|
let suffix = "";
|
||||||
@@ -612,7 +651,11 @@ const handleElementOptions = (codeName, elementOptions, transformers, val) => {
|
|||||||
let valRes = val;
|
let valRes = val;
|
||||||
let sourceIds = [];
|
let sourceIds = [];
|
||||||
let getStringKey = "";
|
let getStringKey = "";
|
||||||
let onClick = "alert('Not implemented');";
|
let onClick = "console.log('onClick - Not implemented');";
|
||||||
|
let onChange = "console.log('onChange - Not implemented');";
|
||||||
|
let customParams = "";
|
||||||
|
let customId = "";
|
||||||
|
|
||||||
|
|
||||||
elementOptions.forEach((option) => {
|
elementOptions.forEach((option) => {
|
||||||
if (option.prefillValue) {
|
if (option.prefillValue) {
|
||||||
@@ -627,6 +670,9 @@ const handleElementOptions = (codeName, elementOptions, transformers, val) => {
|
|||||||
if (option.multiple === "true") {
|
if (option.multiple === "true") {
|
||||||
isMultiSelect = true;
|
isMultiSelect = true;
|
||||||
}
|
}
|
||||||
|
if (option.ordeable === "true") {
|
||||||
|
isOrdeable = true;
|
||||||
|
}
|
||||||
if (option.editable === "true") {
|
if (option.editable === "true") {
|
||||||
editable = true;
|
editable = true;
|
||||||
}
|
}
|
||||||
@@ -653,6 +699,15 @@ const handleElementOptions = (codeName, elementOptions, transformers, val) => {
|
|||||||
if (option.onClick) {
|
if (option.onClick) {
|
||||||
onClick = option.onClick;
|
onClick = option.onClick;
|
||||||
}
|
}
|
||||||
|
if (option.onChange) {
|
||||||
|
onChange = option.onChange;
|
||||||
|
}
|
||||||
|
if (option.customParams) {
|
||||||
|
customParams = option.customParams;
|
||||||
|
}
|
||||||
|
if (option.customId) {
|
||||||
|
customId = option.customId;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (transformers.includes("sha256")) {
|
if (transformers.includes("sha256")) {
|
||||||
@@ -663,6 +718,7 @@ const handleElementOptions = (codeName, elementOptions, transformers, val) => {
|
|||||||
inputType,
|
inputType,
|
||||||
readOnly,
|
readOnly,
|
||||||
isMultiSelect,
|
isMultiSelect,
|
||||||
|
isOrdeable,
|
||||||
cssClasses,
|
cssClasses,
|
||||||
placeholder,
|
placeholder,
|
||||||
suffix,
|
suffix,
|
||||||
@@ -672,6 +728,9 @@ const handleElementOptions = (codeName, elementOptions, transformers, val) => {
|
|||||||
valRes,
|
valRes,
|
||||||
getStringKey,
|
getStringKey,
|
||||||
onClick,
|
onClick,
|
||||||
|
onChange,
|
||||||
|
customParams,
|
||||||
|
customId
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -699,7 +758,8 @@ function generateOptions(options, valuesArray, targetField, transformers, placeh
|
|||||||
selectedArray = []
|
selectedArray = []
|
||||||
cssClass = ""
|
cssClass = ""
|
||||||
|
|
||||||
// determine if options or values are used in teh listing
|
|
||||||
|
// determine if options or values are used in the listing
|
||||||
if (valuesArray.length > 0 && options.length > 0){
|
if (valuesArray.length > 0 && options.length > 0){
|
||||||
|
|
||||||
// multiselect list -> options only + selected the ones in valuesArray
|
// multiselect list -> options only + selected the ones in valuesArray
|
||||||
@@ -717,21 +777,31 @@ function generateOptions(options, valuesArray, targetField, transformers, placeh
|
|||||||
resultArray = options;
|
resultArray = options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Create a map to track the index of each item in valuesArray
|
||||||
|
const orderMap = new Map(valuesArray.map((item, index) => [item, index]));
|
||||||
|
|
||||||
|
// Sort resultArray based on the order in valuesArray
|
||||||
|
resultArray.sort((a, b) => {
|
||||||
|
const indexA = orderMap.has(a.id) ? orderMap.get(a.id) : valuesArray.length;
|
||||||
|
const indexB = orderMap.has(b.id) ? orderMap.get(b.id) : valuesArray.length;
|
||||||
|
return indexA - indexB;
|
||||||
|
});
|
||||||
|
|
||||||
resultArray.forEach(function(item) {
|
resultArray.forEach(function(item) {
|
||||||
|
let labelName = item.name;
|
||||||
|
|
||||||
labelName = item.name
|
if (labelName !== '❌None') {
|
||||||
|
labelName = reverseTransformers(labelName, transformers);
|
||||||
if(labelName != '❌None')
|
|
||||||
{
|
|
||||||
labelName = reverseTransformers(labelName, transformers)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// needs to happen always if options ued as source
|
// Always include selected if options are used as a source
|
||||||
let selected = options.length != 0 && valuesArray.includes(item.id) ? 'selected' : '';
|
let selected = options.length !== 0 && valuesArray.includes(item.id) ? 'selected' : '';
|
||||||
|
|
||||||
optionsHtml += `<option class="${cssClass}" value="${item.id}" ${selected}>${labelName}</option>`;
|
optionsHtml += `<option class="${cssClass}" value="${item.id}" ${selected}>${labelName}</option>`;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// Place the resulting HTML into the specified placeholder div
|
// Place the resulting HTML into the specified placeholder div
|
||||||
$("#" + placeholder).replaceWith(optionsHtml);
|
$("#" + placeholder).replaceWith(optionsHtml);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,56 +67,96 @@ function initDeviceSelectors(devicesListAll_JSON) {
|
|||||||
}, 10);
|
}, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Utility function to generate a random API token in the format t_<random string of specified length>
|
||||||
// -----------------------------------------------------------------------------
|
function generateApiToken(elem, length) {
|
||||||
// Hide elements on the page based on the supplied setting
|
// Retrieve and parse custom parameters from the element
|
||||||
function hideUIelements(settingKey) {
|
let params = $(elem).attr("my-customparams")?.split(',').map(param => param.trim());
|
||||||
|
if (params && params.length >= 1) {
|
||||||
hiddenSectionsSetting = getSetting(settingKey)
|
var targetElementID = params[0]; // Get the target element's ID
|
||||||
|
|
||||||
if(hiddenSectionsSetting != "") // handle if settings not yet initialized
|
|
||||||
{
|
|
||||||
|
|
||||||
sectionsArray = createArray(hiddenSectionsSetting)
|
|
||||||
|
|
||||||
// remove spaces to get IDs
|
|
||||||
var newArray = $.map(sectionsArray, function(value) {
|
|
||||||
return value.replace(/\s/g, '');
|
|
||||||
});
|
|
||||||
|
|
||||||
$.each(newArray, function(index, hiddenSection) {
|
|
||||||
|
|
||||||
if($('#' + hiddenSection))
|
|
||||||
{
|
|
||||||
$('#' + hiddenSection).hide()
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let targetElement = $('#' + targetElementID);
|
||||||
|
|
||||||
|
// Function to generate a random string of a specified length
|
||||||
|
function generateRandomString(len) {
|
||||||
|
let characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
||||||
|
let result = '';
|
||||||
|
for (let i = 0; i < len; i++) {
|
||||||
|
result += characters.charAt(Math.floor(Math.random() * characters.length));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate the token in the format t_<random string of length>
|
||||||
|
let randomToken = 't_' + generateRandomString(length);
|
||||||
|
|
||||||
|
// Set the generated token as the value of the target element
|
||||||
|
if (targetElement.length) {
|
||||||
|
targetElement.val(randomToken);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
|
||||||
// Updates the icon preview
|
// Updates the icon preview
|
||||||
function updateIconPreview (inputId) {
|
function updateIconPreview(elem) {
|
||||||
// update icon
|
// Retrieve and parse custom parameters from the element
|
||||||
iconInput = $(inputId)
|
let params = $(elem).attr("my-customparams")?.split(',').map(param => param.trim());
|
||||||
|
|
||||||
value = iconInput.val()
|
// console.log(params);
|
||||||
|
|
||||||
iconInput.on('change input', function() {
|
if (params && params.length >= 2) {
|
||||||
$('#txtIconFA').html(atob(value))
|
var inputElementID = params[0];
|
||||||
|
var targetElementID = params[1];
|
||||||
|
} else {
|
||||||
|
console.error("Invalid parameters passed to updateIconPreview function");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the input element using the inputElementID
|
||||||
|
let iconInput = $("#" + inputElementID);
|
||||||
|
|
||||||
|
if (iconInput.length === 0) {
|
||||||
|
console.error("Icon input element not found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the initial value and update the target element
|
||||||
|
let value = iconInput.val();
|
||||||
|
if (!value) {
|
||||||
|
console.error("Input value is empty or not defined");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!targetElementID) {
|
||||||
|
targetElementID = "txtIcon";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the target element exists, if not find an element with matching custom attribute
|
||||||
|
let targetElement = $('#' + targetElementID);
|
||||||
|
if (targetElement.length === 0) {
|
||||||
|
// Look for an element with my-custom-id attribute equal to targetElementID
|
||||||
|
targetElement = $('[my-customid="' + targetElementID + '"]');
|
||||||
|
if (targetElement.length === 0) {
|
||||||
|
console.error("Neither target element with ID nor element with custom attribute found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the target element with decoded base64 value
|
||||||
|
targetElement.html(atob(value));
|
||||||
|
|
||||||
|
// Add event listener to update the icon on input change
|
||||||
|
iconInput.on('change input', function () {
|
||||||
|
let newValue = $(this).val();
|
||||||
|
$('#' + targetElementID).html(atob(newValue));
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#txtIconFA').html(atob(value))
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// Generic function to copy text to clipboard
|
// Generic function to copy text to clipboard
|
||||||
function copyToClipboard(buttonElement) {
|
function copyToClipboard(buttonElement) {
|
||||||
@@ -249,6 +289,7 @@ function initSelect2() {
|
|||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
//Initialize Select2 Elements and make them sortable
|
//Initialize Select2 Elements and make them sortable
|
||||||
|
|
||||||
$(function () {
|
$(function () {
|
||||||
// Iterate over each Select2 dropdown
|
// Iterate over each Select2 dropdown
|
||||||
$('.select2').each(function() {
|
$('.select2').each(function() {
|
||||||
@@ -283,10 +324,15 @@ function initSelect2() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// try to initialize select2
|
// init select2 after dom laoded
|
||||||
setTimeout(() => {
|
window.addEventListener("load", function() {
|
||||||
initSelect2()
|
// try to initialize select2
|
||||||
}, 500);
|
setTimeout(() => {
|
||||||
|
initSelect2()
|
||||||
|
}, 1000);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
console.log("init ui_components.js")
|
console.log("init ui_components.js")
|
||||||
@@ -1034,7 +1034,7 @@ var mouse = $.widget("ui.mouse", {
|
|||||||
return this.mouseDelayMet;
|
return this.mouseDelayMet;
|
||||||
},
|
},
|
||||||
|
|
||||||
// These are placeholder methods, to be overriden by extending plugin
|
// These are placeholder methods, to be overridden by extending plugin
|
||||||
_mouseStart: function(/* event */) {},
|
_mouseStart: function(/* event */) {},
|
||||||
_mouseDrag: function(/* event */) {},
|
_mouseDrag: function(/* event */) {},
|
||||||
_mouseStop: function(/* event */) {},
|
_mouseStop: function(/* event */) {},
|
||||||
|
|||||||
@@ -11,24 +11,6 @@
|
|||||||
# cvc90 2023 https://github.com/cvc90 GNU GPLv3 #
|
# cvc90 2023 https://github.com/cvc90 GNU GPLv3 #
|
||||||
#---------------------------------------------------------------------------------#
|
#---------------------------------------------------------------------------------#
|
||||||
|
|
||||||
// Skin selector config ----------------------------------------------------
|
|
||||||
//
|
|
||||||
// For security reasons, new language files must be entered into this array.
|
|
||||||
// The files in the language directory are compared with this array and only
|
|
||||||
// then accepted.
|
|
||||||
//
|
|
||||||
$pia_installed_skins = array('skin-black-light',
|
|
||||||
'skin-black',
|
|
||||||
'skin-blue-light',
|
|
||||||
'skin-blue',
|
|
||||||
'skin-green-light',
|
|
||||||
'skin-green',
|
|
||||||
'skin-purple-light',
|
|
||||||
'skin-purple',
|
|
||||||
'skin-red-light',
|
|
||||||
'skin-red',
|
|
||||||
'skin-yellow-light',
|
|
||||||
'skin-yellow');
|
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
@@ -38,7 +20,7 @@ $pia_installed_skins = array('skin-black-light',
|
|||||||
require 'php/templates/header.php';
|
require 'php/templates/header.php';
|
||||||
?>
|
?>
|
||||||
<!-- Page ------------------------------------------------------------------ -->
|
<!-- Page ------------------------------------------------------------------ -->
|
||||||
<div class="content-wrapper">
|
<div class="content-wrapper" id="maintenancePage">
|
||||||
|
|
||||||
<!-- Content header--------------------------------------------------------- -->
|
<!-- Content header--------------------------------------------------------- -->
|
||||||
<section class="content-header">
|
<section class="content-header">
|
||||||
@@ -57,74 +39,17 @@ $pia_installed_skins = array('skin-black-light',
|
|||||||
|
|
||||||
// Size and last mod of DB ------------------------------------------------------
|
// Size and last mod of DB ------------------------------------------------------
|
||||||
|
|
||||||
$pia_db = str_replace('front', 'db', getcwd()).'/app.db';
|
$nax_db = str_replace('front', 'db', getcwd()).'/app.db';
|
||||||
$pia_db_size = number_format((filesize($pia_db) / 1000000),2,",",".") . ' MB';
|
$nax_db_size = number_format((filesize($nax_db) / 1000000),2,",",".") . ' MB';
|
||||||
$pia_db_mod = date ("F d Y H:i:s", filemtime($pia_db));
|
$nax_db_mod = date ("F d Y H:i:s", filemtime($nax_db));
|
||||||
|
|
||||||
|
|
||||||
// Count and Calc Backups -------------------------------------------------------
|
|
||||||
|
|
||||||
$Pia_Archive_Path = str_replace('front', 'db', getcwd()).'/';
|
|
||||||
$Pia_Archive_count = 0;
|
|
||||||
$Pia_Archive_diskusage = 0;
|
|
||||||
$files = glob($Pia_Archive_Path."appdb_*.zip");
|
|
||||||
if ($files){
|
|
||||||
$Pia_Archive_count = count($files);
|
|
||||||
}
|
|
||||||
foreach ($files as $result) {
|
|
||||||
$Pia_Archive_diskusage = $Pia_Archive_diskusage + filesize($result);
|
|
||||||
}
|
|
||||||
$Pia_Archive_diskusage = number_format(($Pia_Archive_diskusage / 1000000),2,",",".") . ' MB';
|
|
||||||
|
|
||||||
// Find latest Backup for restore -----------------------------------------------
|
|
||||||
|
|
||||||
$latestfiles = glob($Pia_Archive_Path."appdb_*.zip");
|
|
||||||
natsort($latestfiles);
|
|
||||||
$latestfiles = array_reverse($latestfiles,False);
|
|
||||||
|
|
||||||
$latestbackup = 'none';
|
|
||||||
$latestbackup_date = 'no backup';
|
|
||||||
|
|
||||||
if (count($latestfiles) > 0)
|
|
||||||
{
|
|
||||||
$latestbackup = $latestfiles[0];
|
|
||||||
$latestbackup_date = date ("Y-m-d H:i:s", filemtime($latestbackup));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Skin selector -----------------------------------------------------------------
|
|
||||||
|
|
||||||
if (isset($_POST['submit']) && submit && isset($_POST['skinselector_set'])) {
|
|
||||||
$pia_skin_set_dir = '../db/';
|
|
||||||
$pia_skin_selector = htmlspecialchars($_POST['skinselector']);
|
|
||||||
if (in_array($pia_skin_selector, $pia_installed_skins)) {
|
|
||||||
foreach ($pia_installed_skins as $file) {
|
|
||||||
unlink ($pia_skin_set_dir.'/setting_'.$file);
|
|
||||||
}
|
|
||||||
foreach ($pia_installed_skins as $file) {
|
|
||||||
if (file_exists($pia_skin_set_dir.'/setting_'.$file)) {
|
|
||||||
$pia_skin_error = True;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
$pia_skin_error = False;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($pia_skin_error == False) {
|
|
||||||
$testskin = fopen($pia_skin_set_dir.'setting_'.$pia_skin_selector, 'w');
|
|
||||||
$pia_skin_test = '';
|
|
||||||
echo("<meta http-equiv='refresh' content='1'>");
|
|
||||||
} else {
|
|
||||||
$pia_skin_test = '';
|
|
||||||
echo("<meta http-equiv='refresh' content='1'>");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Table sizes -----------------------------------------------------------------
|
// Table sizes -----------------------------------------------------------------
|
||||||
|
|
||||||
$tableSizesHTML = "";
|
$tableSizesHTML = "";
|
||||||
|
|
||||||
// Open a connection to the SQLite database
|
// Open a connection to the SQLite database
|
||||||
$db = new SQLite3($pia_db);
|
$db = new SQLite3($nax_db);
|
||||||
|
|
||||||
// Retrieve the table names from sqlite_master
|
// Retrieve the table names from sqlite_master
|
||||||
$query = "SELECT name FROM sqlite_master WHERE type='table'";
|
$query = "SELECT name FROM sqlite_master WHERE type='table'";
|
||||||
@@ -142,10 +67,6 @@ while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
|
|||||||
$db->close();
|
$db->close();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Language selector -----------------------------------------------------------------
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -183,13 +104,13 @@ $db->close();
|
|||||||
<div class="db_info_table_row">
|
<div class="db_info_table_row">
|
||||||
<div class="db_info_table_cell" style="min-width: 140px"><?= lang('Maintenance_database_path');?></div>
|
<div class="db_info_table_cell" style="min-width: 140px"><?= lang('Maintenance_database_path');?></div>
|
||||||
<div class="db_info_table_cell">
|
<div class="db_info_table_cell">
|
||||||
<?php echo $pia_db;?>
|
<?php echo $nax_db;?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="db_info_table_row">
|
<div class="db_info_table_row">
|
||||||
<div class="db_info_table_cell"><?= lang('Maintenance_database_size');?></div>
|
<div class="db_info_table_cell"><?= lang('Maintenance_database_size');?></div>
|
||||||
<div class="db_info_table_cell">
|
<div class="db_info_table_cell">
|
||||||
<?php echo $pia_db_size;?>
|
<?php echo $nax_db_size;?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="db_info_table_row">
|
<div class="db_info_table_row">
|
||||||
@@ -201,13 +122,7 @@ $db->close();
|
|||||||
<div class="db_info_table_row">
|
<div class="db_info_table_row">
|
||||||
<div class="db_info_table_cell"><?= lang('Maintenance_database_lastmod');?></div>
|
<div class="db_info_table_cell"><?= lang('Maintenance_database_lastmod');?></div>
|
||||||
<div class="db_info_table_cell">
|
<div class="db_info_table_cell">
|
||||||
<?php echo $pia_db_mod;?>
|
<?php echo $nax_db_mod;?>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="db_info_table_row">
|
|
||||||
<div class="db_info_table_cell"><?= lang('Maintenance_database_backup');?></div>
|
|
||||||
<div class="db_info_table_cell">
|
|
||||||
<?php echo $Pia_Archive_count.' '.lang('Maintenance_database_backup_found').' / '.lang('Maintenance_database_backup_total').': '.$Pia_Archive_diskusage;?>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -220,12 +135,6 @@ $db->close();
|
|||||||
<div class="nav-tabs-custom">
|
<div class="nav-tabs-custom">
|
||||||
<ul class="nav nav-tabs">
|
<ul class="nav nav-tabs">
|
||||||
<li class="active">
|
<li class="active">
|
||||||
<a id="tab_Settings_id" href="#tab_Settings" data-toggle="tab">
|
|
||||||
<i class="fa fa-cogs"></i>
|
|
||||||
<?= lang('Maintenance_Tools_Tab_UISettings');?>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a id="tab_DBTools_id" href="#tab_DBTools" data-toggle="tab">
|
<a id="tab_DBTools_id" href="#tab_DBTools" data-toggle="tab">
|
||||||
<i class="fa fa-toolbox"></i>
|
<i class="fa fa-toolbox"></i>
|
||||||
<?= lang('Maintenance_Tools_Tab_Tools');?>
|
<?= lang('Maintenance_Tools_Tab_Tools');?>
|
||||||
@@ -251,84 +160,7 @@ $db->close();
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
<div class="tab-pane active" id="tab_Settings">
|
<div class="tab-pane active" id="tab_DBTools">
|
||||||
<div class="db_info_table">
|
|
||||||
<div class="db_info_table_row">
|
|
||||||
<div class="db_tools_table_cell_a" style="text-align: center;">
|
|
||||||
<form method="post" action="maintenance.php">
|
|
||||||
<div style="display: inline-block; text-align: center;">
|
|
||||||
<select name="skinselector" class="form-control bg-green" style="width:160px; margin-bottom:5px;">
|
|
||||||
<option value=""><?= lang('Maintenance_themeselector_empty');?></option>
|
|
||||||
<option value="skin-black-light">black light</option>
|
|
||||||
<option value="skin-black">black</option>
|
|
||||||
<option value="skin-blue-light">blue light</option>
|
|
||||||
<option value="skin-blue">blue</option>
|
|
||||||
<option value="skin-green-light">green light</option>
|
|
||||||
<option value="skin-green">green</option>
|
|
||||||
<option value="skin-purple-light">purple light</option>
|
|
||||||
<option value="skin-purple">purple</option>
|
|
||||||
<option value="skin-red-light">red light</option>
|
|
||||||
<option value="skin-red">red</option>
|
|
||||||
<option value="skin-yellow-light">yellow light</option>
|
|
||||||
<option value="skin-yellow">yellow</option>
|
|
||||||
</select></div>
|
|
||||||
<div style="display: block;"><input type="submit" name="skinselector_set" value="<?= lang('Maintenance_themeselector_apply');?>" class="btn bg-green" style="width:160px;">
|
|
||||||
<?php // echo $pia_skin_test; ?>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
<div class="db_info_table_cell" style="padding: 10px; height:40px; text-align:left; vertical-align: middle;">
|
|
||||||
<?= lang('Maintenance_themeselector_text'); ?>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="db_info_table_row">
|
|
||||||
<div class="db_tools_table_cell_a">
|
|
||||||
<button type="button" class="btn bg-green dbtools-button" id="btnToggleDarkmode" onclick="askToggleDarkmode()"><?= lang('Maintenance_Tool_darkmode');?></button>
|
|
||||||
</div>
|
|
||||||
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_darkmode_text');?></div>
|
|
||||||
</div>
|
|
||||||
<div class="db_info_table_row">
|
|
||||||
<div class="db_tools_table_cell_a">
|
|
||||||
<div class="form-group" >
|
|
||||||
<div class="input-group" >
|
|
||||||
<select id="columnsSelect" class="form-control select2 select2-hidden-accessible" multiple="" style="width: 100%;" tabindex="-1" aria-hidden="true">
|
|
||||||
<option value="0"><?= lang('Device_TableHead_Name');?></option>
|
|
||||||
<option value="1"><?= lang('Device_TableHead_Owner');?></option>
|
|
||||||
<option value="2"><?= lang('Device_TableHead_Type');?></option>
|
|
||||||
<option value="3"><?= lang('Device_TableHead_Icon');?></option>
|
|
||||||
<option value="4"><?= lang('Device_TableHead_Favorite');?></option>
|
|
||||||
<option value="5"><?= lang('Device_TableHead_Group');?></option>
|
|
||||||
<option value="6"><?= lang('Device_TableHead_FirstSession');?></option>
|
|
||||||
<option value="7"><?= lang('Device_TableHead_LastSession');?></option>
|
|
||||||
<option value="8"><?= lang('Device_TableHead_LastIP');?></option>
|
|
||||||
<option value="9"><?= lang('Device_TableHead_MAC');?></option>
|
|
||||||
<option value="10"><?= lang('Device_TableHead_Status');?></option>
|
|
||||||
<option value="11"><?= lang('Device_TableHead_MAC_full');?></option>
|
|
||||||
<option value="12"><?= lang('Device_TableHead_LastIPOrder');?></option>
|
|
||||||
<option value="13"><?= lang('Device_TableHead_Rowid');?></option>
|
|
||||||
<option value="14"><?= lang('Device_TableHead_Parent_MAC');?></option>
|
|
||||||
<option value="15"><?= lang('Device_TableHead_Connected_Devices');?></option>
|
|
||||||
<option value="16"><?= lang('Device_TableHead_Location');?></option>
|
|
||||||
<option value="17"><?= lang('Device_TableHead_Vendor');?></option>
|
|
||||||
<option value="18"><?= lang('Device_TableHead_Port');?></option>
|
|
||||||
<option value="19"><?= lang('Device_TableHead_GUID');?></option>
|
|
||||||
<option value="20"><?= lang('Device_TableHead_SyncHubNodeName');?></option>
|
|
||||||
<option value="21"><?= lang('Device_TableHead_NetworkSite');?></option>
|
|
||||||
<option value="22"><?= lang('Device_TableHead_SSID');?></option>
|
|
||||||
</select>
|
|
||||||
<span class="input-group-addon"><i title="<?= lang('Gen_Save');?>" class="fa fa-save pointer" onclick="saveSelectedColumns();"></i></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_displayed_columns_text');?></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="tab-pane" id="tab_DBTools">
|
|
||||||
<div class="db_info_table">
|
<div class="db_info_table">
|
||||||
<div class="db_info_table_row">
|
<div class="db_info_table_row">
|
||||||
<div class="db_tools_table_cell_a" >
|
<div class="db_tools_table_cell_a" >
|
||||||
@@ -388,24 +220,6 @@ $db->close();
|
|||||||
</div>
|
</div>
|
||||||
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_ImportPastedCSV_text');?></div>
|
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_ImportPastedCSV_text');?></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="db_info_table_row">
|
|
||||||
<div class="db_tools_table_cell_a" >
|
|
||||||
<button type="button" class="btn btn-default pa-btn bg-green dbtools-button" id="btnPiaBackupDBtoArchive" onclick="askPiaBackupDBtoArchive()"><?= lang('Maintenance_Tool_backup');?></button>
|
|
||||||
</div>
|
|
||||||
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_backup_text');?></div>
|
|
||||||
</div>
|
|
||||||
<div class="db_info_table_row">
|
|
||||||
<div class="db_tools_table_cell_a" >
|
|
||||||
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnPiaRestoreDBfromArchive" onclick="askPiaRestoreDBfromArchive()"><?= lang('Maintenance_Tool_restore');?><br><?php echo $latestbackup_date;?></button>
|
|
||||||
</div>
|
|
||||||
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_restore_text');?></div>
|
|
||||||
</div>
|
|
||||||
<div class="db_info_table_row">
|
|
||||||
<div class="db_tools_table_cell_a" >
|
|
||||||
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnPiaPurgeDBBackups" onclick="askPiaPurgeDBBackups()"><?= lang('Maintenance_Tool_purgebackup');?></button>
|
|
||||||
</div>
|
|
||||||
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_purgebackup_text');?></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- ---------------------------Logging-------------------------------------------- -->
|
<!-- ---------------------------Logging-------------------------------------------- -->
|
||||||
@@ -487,7 +301,7 @@ $db->close();
|
|||||||
<script>
|
<script>
|
||||||
|
|
||||||
var emptyArr = ['undefined', "", undefined, null];
|
var emptyArr = ['undefined', "", undefined, null];
|
||||||
var selectedTab = 'tab_Settings_id';
|
var selectedTab = 'tab_DBTools_id';
|
||||||
|
|
||||||
initializeTabs();
|
initializeTabs();
|
||||||
|
|
||||||
@@ -591,51 +405,6 @@ function deleteActHistory()
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------
|
|
||||||
// Backup DB to Archive
|
|
||||||
function askPiaBackupDBtoArchive () {
|
|
||||||
// Ask
|
|
||||||
showModalWarning('<?= lang('Maintenance_Tool_backup_noti');?>', '<?= lang('Maintenance_Tool_backup_noti_text');?>',
|
|
||||||
'<?= lang('Gen_Cancel');?>', '<?= lang('Gen_Backup');?>', 'PiaBackupDBtoArchive');
|
|
||||||
}
|
|
||||||
function PiaBackupDBtoArchive()
|
|
||||||
{
|
|
||||||
// Execute
|
|
||||||
$.get('php/server/devices.php?action=PiaBackupDBtoArchive', function(msg) {
|
|
||||||
showMessage (msg);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------
|
|
||||||
// Restore DB from Archive
|
|
||||||
function askPiaRestoreDBfromArchive () {
|
|
||||||
// Ask
|
|
||||||
showModalWarning('<?= lang('Maintenance_Tool_restore_noti');?>', '<?= lang('Maintenance_Tool_restore_noti_text');?>',
|
|
||||||
'<?= lang('Gen_Cancel');?>', '<?= lang('Gen_Restore');?>', 'PiaRestoreDBfromArchive');
|
|
||||||
}
|
|
||||||
function PiaRestoreDBfromArchive()
|
|
||||||
{
|
|
||||||
// Execute
|
|
||||||
$.get('php/server/devices.php?action=PiaRestoreDBfromArchive', function(msg) {
|
|
||||||
showMessage (msg);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------
|
|
||||||
// Purge Backups
|
|
||||||
function askPiaPurgeDBBackups() {
|
|
||||||
// Ask
|
|
||||||
showModalWarning('<?= lang('Maintenance_Tool_purgebackup_noti');?>', '<?= lang('Maintenance_Tool_purgebackup_noti_text');?>',
|
|
||||||
'<?= lang('Gen_Cancel');?>', '<?= lang('Gen_Purge');?>', 'PiaPurgeDBBackups');
|
|
||||||
}
|
|
||||||
function PiaPurgeDBBackups()
|
|
||||||
{
|
|
||||||
// Execute
|
|
||||||
$.get('php/server/devices.php?action=PiaPurgeDBBackups', function(msg) {
|
|
||||||
showMessage (msg);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// -----------------------------------------------------------
|
// -----------------------------------------------------------
|
||||||
// Restart Backend Python Server
|
// Restart Backend Python Server
|
||||||
|
|
||||||
@@ -704,51 +473,18 @@ function askImportPastedCSV() {
|
|||||||
function ImportPastedCSV()
|
function ImportPastedCSV()
|
||||||
{
|
{
|
||||||
var csv = $('#modal-input-textarea').val();
|
var csv = $('#modal-input-textarea').val();
|
||||||
csvBase64 = btoa(csv)
|
|
||||||
// Execute
|
csvBase64 = utf8ToBase64(csv);
|
||||||
|
|
||||||
$.post('php/server/devices.php?action=ImportCSV', { content: csvBase64 }, function(msg) {
|
$.post('php/server/devices.php?action=ImportCSV', { content: csvBase64 }, function(msg) {
|
||||||
showMessage(msg);
|
showMessage(msg);
|
||||||
write_notification(`[Maintenance] Devices imported from pasted content`, 'info');
|
write_notification(`[Maintenance] Devices imported from pasted content`, 'info');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------
|
|
||||||
// Switch Darkmode
|
|
||||||
function askToggleDarkmode() {
|
|
||||||
// Ask
|
|
||||||
showModalWarning('<?= lang('Maintenance_Tool_darkmode_noti');?>', '<?= lang('Maintenance_Tool_darkmode_noti_text');?>',
|
|
||||||
'<?= lang('Gen_Cancel');?>', '<?= lang('Gen_Switch');?>', 'ToggleDarkmode');
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------
|
|
||||||
function ToggleDarkmode()
|
|
||||||
{
|
|
||||||
// get parameter Front_Dark_Mode_Enabled value
|
|
||||||
$.get('php/server/parameters.php?action=get&defaultValue=false&expireMinutes=525600¶meter=Front_Dark_Mode_Enabled', function(data) {
|
|
||||||
var result = JSON.parse(data);
|
|
||||||
if (result) {
|
|
||||||
darkModeEnabled = result == 'true';
|
|
||||||
|
|
||||||
// invert value
|
|
||||||
darkModeEnabled = !darkModeEnabled;
|
|
||||||
|
|
||||||
// save inverted value
|
|
||||||
$.get('php/server/parameters.php?action=set¶meter=Front_Dark_Mode_Enabled&expireMinutes=525600&value='+ darkModeEnabled,
|
|
||||||
function(data) {
|
|
||||||
if (data != "OK") {
|
|
||||||
showMessage (data);
|
|
||||||
setTimeout(function (){location.reload()}, 1000);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
showMessage (data);
|
|
||||||
};
|
|
||||||
} );
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
|
|
||||||
// Clean log file
|
// Clean log file
|
||||||
@@ -801,122 +537,56 @@ function scrollDown() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------
|
|
||||||
// Manage displayed columns
|
|
||||||
// --------------------------------------------------------
|
|
||||||
colDefaultOrder = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17'];
|
|
||||||
colDefaultOrderTxt = '[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]';
|
|
||||||
|
|
||||||
|
|
||||||
function saveSelectedColumns () {
|
|
||||||
$.get('php/server/parameters.php?action=set&expireMinutes=525600&value=['+ $('#columnsSelect').val().toString() +']¶meter=Front_Devices_Columns_Visible', function(data) {
|
|
||||||
// save full order of all columns to simplify mapping later on
|
|
||||||
|
|
||||||
colDisplayed = $('#columnsSelect').val();
|
|
||||||
|
|
||||||
colNewOrder = colDisplayed;
|
|
||||||
|
|
||||||
// append the remaining columns in the previous order
|
|
||||||
for(i = 0; i < colDefaultOrder.length; i++)
|
|
||||||
{
|
|
||||||
if(!colDisplayed.includes(colDefaultOrder[i]))
|
|
||||||
{
|
|
||||||
colNewOrder.push(colDefaultOrder[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// save the setting in the DB
|
|
||||||
$.get('php/server/parameters.php?action=set&expireMinutes=525600&value=['+ colNewOrder.toString() +']¶meter=Front_Devices_Columns_Order', function(data) {
|
|
||||||
|
|
||||||
showMessage(data);
|
|
||||||
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------
|
|
||||||
function initializeSelectedColumns () {
|
|
||||||
$.get('php/server/parameters.php?action=get&expireMinutes=525600&defaultValue='+colDefaultOrderTxt+'¶meter=Front_Devices_Columns_Visible', function(data) {
|
|
||||||
|
|
||||||
handle_locked_DB(data)
|
|
||||||
|
|
||||||
tableColumnShow = numberArrayFromString(data);
|
|
||||||
|
|
||||||
for(i=0; i < tableColumnShow.length; i++)
|
|
||||||
{
|
|
||||||
// create the option and append to Select2
|
|
||||||
var option = new Option($('#columnsSelect option[value='+tableColumnShow[i]+']').html(), tableColumnShow[i] , true, true);
|
|
||||||
|
|
||||||
$("#columnsSelect").append(option).trigger('change');
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
// General initialization
|
// General initialization
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
function initializeTabs () {
|
function initializeTabs() {
|
||||||
|
setTimeout(() => {
|
||||||
setTimeout(function() {
|
const key = "activeMaintenanceTab";
|
||||||
|
|
||||||
key = "activeMaintenanceTab"
|
|
||||||
|
|
||||||
// default selection
|
// default selection
|
||||||
selectedTab = "tab_Settings"
|
let selectedTab = "tab_DBTools_id";
|
||||||
|
|
||||||
// the #target from the url
|
|
||||||
target = window.location.hash.substr(1)
|
|
||||||
|
|
||||||
|
// the #target from the URL
|
||||||
|
let target = window.location.hash.substr(1);
|
||||||
|
|
||||||
|
console.log(selectedTab);
|
||||||
|
|
||||||
// get only the part between #...?
|
// get only the part between #...?
|
||||||
if(target.includes('?'))
|
if (target.includes('?')) {
|
||||||
{
|
target = target.split('?')[0];
|
||||||
target = target.split('?')[0]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(target);
|
|
||||||
|
|
||||||
// update cookie if target specified
|
// update cookie if target specified
|
||||||
if(target != "")
|
if (target) {
|
||||||
{
|
selectedTab = target.endsWith("_id") ? target : `${target}_id`;
|
||||||
|
setCache(key, selectedTab); // _id is added so it doesn't conflict with AdminLTE tab behavior
|
||||||
if (!selectedTab.endsWith("_id")) {
|
|
||||||
selectedTab = target + "_id";
|
|
||||||
}
|
|
||||||
|
|
||||||
setCache(key, selectedTab) // _id is added so it doesn't conflict with AdminLTE tab behavior
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the tab id from the cookie (already overriden by the target)
|
// get the tab id from the cookie (already overridden by the target)
|
||||||
if(!emptyArr.includes(getCache(key)))
|
const cachedTab = getCache(key);
|
||||||
{
|
if (cachedTab && !emptyArr.includes(cachedTab)) {
|
||||||
selectedTab = getCache(key);
|
selectedTab = cachedTab;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Activate panel
|
// Activate panel
|
||||||
$('.nav-tabs a[id='+ selectedTab +']').tab('show');
|
$('.nav-tabs a[id='+ selectedTab +']').tab('show');
|
||||||
|
|
||||||
// When changed save new current tab
|
// When changed save new current tab
|
||||||
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
|
$('a[data-toggle="tab"]').on('shown.bs.tab', (e) => {
|
||||||
setCache(key, $(e.target).attr('id'))
|
const newTabId = $(e.target).attr('id');
|
||||||
|
setCache(key, newTabId);
|
||||||
});
|
});
|
||||||
|
|
||||||
// events on tab change
|
// events on tab change
|
||||||
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
|
$('a[data-toggle="tab"]').on('shown.bs.tab', (e) => {
|
||||||
var target = $(e.target).attr("href") // activated tab
|
const newTarget = $(e.target).attr("href"); // activated tab
|
||||||
});
|
});
|
||||||
|
|
||||||
hideSpinner();
|
hideSpinner();
|
||||||
|
|
||||||
}, 50);
|
}, 50);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Logs render functionality
|
// Logs render functionality
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
@@ -936,7 +606,7 @@ function toggleAutoRefresh() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Manages thefilter application
|
// Manages the filter application on the logs
|
||||||
function applyFilter() {
|
function applyFilter() {
|
||||||
const filterText = $("#logsFilter").val().toLowerCase();
|
const filterText = $("#logsFilter").val().toLowerCase();
|
||||||
|
|
||||||
@@ -983,7 +653,6 @@ function renderLogs(customData) {
|
|||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Init
|
// Init
|
||||||
window.onload = function asyncFooter() {
|
window.onload = function asyncFooter() {
|
||||||
initializeSelectedColumns();
|
|
||||||
renderLogs();
|
renderLogs();
|
||||||
|
|
||||||
// initializeTabs();
|
// initializeTabs();
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<h3 class="box-title"><?= lang('Gen_Selected_Devices');?></h3>
|
<h3 class="box-title"><?= lang('Gen_Selected_Devices');?></h3>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="deviceSelector col-md-9" style="z-index:5"></div>
|
<div class="deviceSelector col-md-9 col-sm-12" style="z-index:5"></div>
|
||||||
|
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
<button type="button" class="btn btn-default" onclick="markAllSelected()">
|
<button type="button" class="btn btn-default" onclick="markAllSelected()">
|
||||||
@@ -101,23 +101,25 @@
|
|||||||
for (let j = i * elementsPerColumn; j < Math.min((i + 1) * elementsPerColumn, columns.length); j++) {
|
for (let j = i * elementsPerColumn; j < Math.min((i + 1) * elementsPerColumn, columns.length); j++) {
|
||||||
|
|
||||||
const setTypeObject = JSON.parse(columns[j].Type.replace(/'/g, '"'));
|
const setTypeObject = JSON.parse(columns[j].Type.replace(/'/g, '"'));
|
||||||
// console.log(setTypeObject); 🔽
|
|
||||||
// const lastElementObj = setTypeObject.elements[setTypeObject.elements.length - 1]
|
|
||||||
|
|
||||||
// get the element with the input value(s)
|
// get the element with the input value(s)
|
||||||
let elementsWithInputValue = setTypeObject.elements.filter(element => element.elementHasInputValue === 1);
|
let elements = setTypeObject.elements.filter(element => element.elementHasInputValue === 1);
|
||||||
|
|
||||||
// if none found, take last
|
// if none found, take last
|
||||||
if(elementsWithInputValue.length == 0)
|
if(elements.length == 0)
|
||||||
{
|
{
|
||||||
elementsWithInputValue = setTypeObject.elements[setTypeObject.elements.length - 1]
|
elementWithInputValue = setTypeObject.elements[setTypeObject.elements.length - 1]
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
elementWithInputValue = elements[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
const { elementType, elementOptions = [], transformers = [] } = elementsWithInputValue;
|
const { elementType, elementOptions = [], transformers = [] } = elementWithInputValue;
|
||||||
const {
|
const {
|
||||||
inputType,
|
inputType,
|
||||||
readOnly,
|
readOnly,
|
||||||
isMultiSelect,
|
isMultiSelect,
|
||||||
|
isOrdeable,
|
||||||
cssClasses,
|
cssClasses,
|
||||||
placeholder,
|
placeholder,
|
||||||
suffix,
|
suffix,
|
||||||
@@ -126,26 +128,28 @@
|
|||||||
editable,
|
editable,
|
||||||
valRes,
|
valRes,
|
||||||
getStringKey,
|
getStringKey,
|
||||||
onClick
|
onClick,
|
||||||
|
onChange,
|
||||||
|
customParams,
|
||||||
|
customId
|
||||||
} = handleElementOptions('none', elementOptions, transformers, val = "");
|
} = handleElementOptions('none', elementOptions, transformers, val = "");
|
||||||
|
|
||||||
// console.log(setTypeObject);
|
|
||||||
// console.log(inputType);
|
|
||||||
|
|
||||||
// render based on element type
|
// render based on element type
|
||||||
if (elementsWithInputValue.elementType === 'select') {
|
if (elementType === 'select') {
|
||||||
|
|
||||||
targetLocation = columns[j].Code_Name + "_generateSetOptions"
|
targetLocation = columns[j].Code_Name + "_generateSetOptions"
|
||||||
|
|
||||||
generateOptionsOrSetOptions(columns[j].Code_Name, [], targetLocation, generateOptions)
|
generateOptionsOrSetOptions(columns[j].Code_Name, [], targetLocation, generateOptions)
|
||||||
|
|
||||||
// Handle Icons as tehy need a preview
|
console.log(columns[j].Code_Name)
|
||||||
|
// Handle Icons as they need a preview
|
||||||
if(columns[j].Code_Name == 'NEWDEV_dev_Icon')
|
if(columns[j].Code_Name == 'NEWDEV_dev_Icon')
|
||||||
{
|
{
|
||||||
input = `
|
input = `
|
||||||
<span class="input-group-addon" id="txtIconFA"></span>
|
<span class="input-group-addon iconPreview" my-customid="NEWDEV_dev_Icon_preview"></span>
|
||||||
<select class="form-control"
|
<select class="form-control"
|
||||||
onChange="updateIconPreview('#NEWDEV_dev_Icon')"
|
onChange="updateIconPreview(this)"
|
||||||
|
my-customparams="NEWDEV_dev_Icon,NEWDEV_dev_Icon_preview"
|
||||||
id="${columns[j].Code_Name}"
|
id="${columns[j].Code_Name}"
|
||||||
data-my-column="${columns[j].Code_Name}"
|
data-my-column="${columns[j].Code_Name}"
|
||||||
data-my-targetColumns="${columns[j].Code_Name.replace('NEWDEV_','')}" >
|
data-my-targetColumns="${columns[j].Code_Name.replace('NEWDEV_','')}" >
|
||||||
@@ -163,7 +167,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} else if (elementsWithInputValue.elementType === 'input'){
|
} else if (elementType === 'input'){
|
||||||
|
|
||||||
// Add classes specifically for checkboxes
|
// Add classes specifically for checkboxes
|
||||||
inputType === 'checkbox' ? inputClass = 'checkbox' : inputClass = 'form-control';
|
inputType === 'checkbox' ? inputClass = 'checkbox' : inputClass = 'form-control';
|
||||||
@@ -171,6 +175,7 @@
|
|||||||
|
|
||||||
input = `<input class="${inputClass}"
|
input = `<input class="${inputClass}"
|
||||||
id="${columns[j].Code_Name}"
|
id="${columns[j].Code_Name}"
|
||||||
|
my-customid="${columns[j].Code_Name}"
|
||||||
data-my-column="${columns[j].Code_Name}"
|
data-my-column="${columns[j].Code_Name}"
|
||||||
data-my-targetColumns="${columns[j].Code_Name.replace('NEWDEV_','')}"
|
data-my-targetColumns="${columns[j].Code_Name.replace('NEWDEV_','')}"
|
||||||
type="${inputType}">`
|
type="${inputType}">`
|
||||||
@@ -300,7 +305,7 @@ function executeAction(action, whereColumnName, key, targetColumns, newTargetCol
|
|||||||
window.onbeforeunload = null;
|
window.onbeforeunload = null;
|
||||||
|
|
||||||
// update API endpoints to refresh the UI
|
// update API endpoints to refresh the UI
|
||||||
updateApi()
|
updateApi("devices,appevents")
|
||||||
|
|
||||||
write_notification(`[Multi edit] Executed "${action}" on Columns "${targetColumns}" matching "${key}"`, 'info')
|
write_notification(`[Multi edit] Executed "${action}" on Columns "${targetColumns}" matching "${key}"`, 'info')
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
<?php require 'php/templates/notification.php'; ?>
|
<?php require 'php/templates/notification.php'; ?>
|
||||||
<h1 id="pageTitle">
|
<h1 id="pageTitle">
|
||||||
<i class="fa fa-network-wired"></i> <?= lang('Network_Title');?>
|
<i class="fa fa-network-wired"></i> <?= lang('Network_Title');?>
|
||||||
<span class="networkPageHelp"> <a target="_blank" href="https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md"><i class="fa fa-circle-question"></i></a><span>
|
<span class="helpIconSmallTopRight"> <a target="_blank" href="https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md"><i class="fa fa-circle-question"></i></a><span>
|
||||||
</h1>
|
</h1>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
@@ -481,21 +481,31 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
devicesListnew = rawData["data"].map(item => { return {
|
devicesListnew = rawData["data"].map(item => {
|
||||||
"name":item[0],
|
return {
|
||||||
"type":item[2],
|
"name": item[0],
|
||||||
"icon":item[3],
|
"type": item[2],
|
||||||
"mac":item[11],
|
"icon": item[3],
|
||||||
"parentMac":item[14],
|
"mac": item[11],
|
||||||
"rowid":item[13],
|
"parentMac": item[14],
|
||||||
"status":item[10],
|
"rowid": item[13],
|
||||||
"childrenQty":item[15],
|
"status": item[10],
|
||||||
"port":item[18]
|
"childrenQty": item[15],
|
||||||
}})
|
"port": item[18]
|
||||||
|
};
|
||||||
|
}).sort((a, b) => {
|
||||||
|
// First sort by name alphabetically
|
||||||
|
const nameCompare = a.name.localeCompare(b.name);
|
||||||
|
if (nameCompare !== 0) {
|
||||||
|
return nameCompare;
|
||||||
|
}
|
||||||
|
// If names are the same, sort by port numerically
|
||||||
|
return a.port - b.port;
|
||||||
|
});
|
||||||
|
|
||||||
setCache('devicesListNew', JSON.stringify(devicesListnew))
|
setCache('devicesListNew', JSON.stringify(devicesListnew));
|
||||||
|
|
||||||
// init global variable
|
// Init global variable
|
||||||
deviceListGlobal = devicesListnew;
|
deviceListGlobal = devicesListnew;
|
||||||
|
|
||||||
|
|
||||||
@@ -525,53 +535,57 @@
|
|||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
function getChildren(node, list, path)
|
// Recursively get children nodes and build a tree
|
||||||
|
function getChildren(node, list, path, visited = [])
|
||||||
{
|
{
|
||||||
var children = [];
|
var children = [];
|
||||||
|
|
||||||
// loop thru all items and find childern...
|
|
||||||
for(var i in list)
|
|
||||||
{
|
|
||||||
//... of the current node
|
|
||||||
|
|
||||||
if(list[i].parentMac.toLowerCase() == node.mac.toLowerCase() && !hiddenMacs.includes(list[i].parentMac))
|
|
||||||
{
|
|
||||||
|
|
||||||
visibleNodesCount++
|
|
||||||
|
|
||||||
// and process them
|
|
||||||
children.push(getChildren(list[i], list, path + ((path == "") ? "" : '|') + list[i].parentMac, hiddenMacs))
|
|
||||||
|
|
||||||
|
// Check for infinite recursion by seeing if the node has been visited before
|
||||||
|
if (visited.includes(node.mac.toLowerCase())) {
|
||||||
|
console.error("Infinite recursion detected at node:", node.mac);
|
||||||
|
write_notification("[ERROR] ⚠ Infinite recursion detected. You probably have assigned the Internet node to another children node or to itself. Please open a new issue on GitHub and describe how you did it.", 'interrupt')
|
||||||
|
return { error: "Infinite recursion detected", node: node.mac };
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// note the total number of leaf nodes to calculate the font scaling
|
// Add current node to visited list
|
||||||
if(children.length == 0)
|
visited.push(node.mac.toLowerCase());
|
||||||
{
|
|
||||||
leafNodesCount++
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
parentNodesCount++
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
// Loop through all items to find children of the current node
|
||||||
name: node.name,
|
for (var i in list) {
|
||||||
path: path,
|
if (list[i].parentMac.toLowerCase() == node.mac.toLowerCase() && !hiddenMacs.includes(list[i].parentMac)) {
|
||||||
mac: node.mac,
|
|
||||||
port: node.port,
|
|
||||||
id: node.mac,
|
|
||||||
parentMac: node.parentMac,
|
|
||||||
icon: node.icon,
|
|
||||||
type: node.type,
|
|
||||||
status: node.status,
|
|
||||||
hasChildren: children.length > 0 || hiddenMacs.includes(node.mac),
|
|
||||||
hiddenChildren: hiddenMacs.includes(node.mac),
|
|
||||||
qty: children.length,
|
|
||||||
children: children
|
|
||||||
};
|
|
||||||
|
|
||||||
|
visibleNodesCount++;
|
||||||
|
|
||||||
|
// Process children recursively, passing a copy of the visited list
|
||||||
|
children.push(getChildren(list[i], list, path + ((path == "") ? "" : '|') + list[i].parentMac, visited));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Track leaf and parent node counts
|
||||||
|
if (children.length == 0) {
|
||||||
|
leafNodesCount++;
|
||||||
|
} else {
|
||||||
|
parentNodesCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
name: node.name,
|
||||||
|
path: path,
|
||||||
|
mac: node.mac,
|
||||||
|
port: node.port,
|
||||||
|
id: node.mac,
|
||||||
|
parentMac: node.parentMac,
|
||||||
|
icon: node.icon,
|
||||||
|
type: node.type,
|
||||||
|
status: node.status,
|
||||||
|
hasChildren: children.length > 0 || hiddenMacs.includes(node.mac),
|
||||||
|
hiddenChildren: hiddenMacs.includes(node.mac),
|
||||||
|
qty: children.length,
|
||||||
|
children: children
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
function getHierarchy()
|
function getHierarchy()
|
||||||
@@ -783,7 +797,7 @@
|
|||||||
setCache(key, target.replaceAll(":","_")+'_id') // _id is added so it doesn't conflict with AdminLTE tab behavior
|
setCache(key, target.replaceAll(":","_")+'_id') // _id is added so it doesn't conflict with AdminLTE tab behavior
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the tab id from the cookie (already overriden by the target)
|
// get the tab id from the cookie (already overridden by the target)
|
||||||
if(!emptyArr.includes(getCache(key)))
|
if(!emptyArr.includes(getCache(key)))
|
||||||
{
|
{
|
||||||
selectedTab = getCache(key);
|
selectedTab = getCache(key);
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
require '../server/init.php';
|
require '../server/init.php';
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
|
||||||
// Function to render the log area component
|
// Function to render the log area component
|
||||||
function renderLogArea($params) {
|
function renderLogArea($params) {
|
||||||
$fileName = isset($params['fileName']) ? $params['fileName'] : '';
|
$fileName = isset($params['fileName']) ? $params['fileName'] : '';
|
||||||
|
|||||||
@@ -1,4 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
|
||||||
function renderInfobox($params) {
|
function renderInfobox($params) {
|
||||||
$onclickEvent = isset($params['onclickEvent']) ? $params['onclickEvent'] : '';
|
$onclickEvent = isset($params['onclickEvent']) ? $params['onclickEvent'] : '';
|
||||||
$color = isset($params['color']) ? $params['color'] : '';
|
$color = isset($params['color']) ? $params['color'] : '';
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
<?php
|
|
||||||
// Cache the contents to a cache file
|
|
||||||
$cached = fopen($cachefile, 'w');
|
|
||||||
fwrite($cached, ob_get_contents());
|
|
||||||
fclose($cached);
|
|
||||||
ob_end_flush(); // Send the output to the browser
|
|
||||||
?>
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
<?php
|
|
||||||
$url = $_SERVER["SCRIPT_NAME"];
|
|
||||||
$break = Explode('/', $url);
|
|
||||||
$file = $break[count($break) - 1];
|
|
||||||
$cachefile = 'cached-'.substr_replace($file ,"",-4).'.html';
|
|
||||||
$cachetime = 18000;
|
|
||||||
|
|
||||||
// Serve from the cache if it is younger than $cachetime
|
|
||||||
if (file_exists($cachefile) && time() - $cachetime < filemtime($cachefile)) {
|
|
||||||
echo "<!-- Cached copy, generated ".date('H:i', filemtime($cachefile))." -->\n";
|
|
||||||
readfile($cachefile);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
ob_start(); // Start the output buffer
|
|
||||||
?>
|
|
||||||
@@ -13,6 +13,10 @@
|
|||||||
$DBFILE = dirname(__FILE__).'/../../../db/app.db';
|
$DBFILE = dirname(__FILE__).'/../../../db/app.db';
|
||||||
$DBFILE_LOCKED_FILE = dirname(__FILE__).'/../../../front/log/db_is_locked.log';
|
$DBFILE_LOCKED_FILE = dirname(__FILE__).'/../../../front/log/db_is_locked.log';
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
|
||||||
$db_locked = false;
|
$db_locked = false;
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -3,16 +3,18 @@
|
|||||||
// NetAlertX
|
// NetAlertX
|
||||||
// Open Source Network Guard / WIFI & LAN intrusion detector
|
// Open Source Network Guard / WIFI & LAN intrusion detector
|
||||||
//
|
//
|
||||||
// parameters.php - Front module. Server side. Manage Parameters
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
# Puche 2022+ jokob jokob@duck.com GNU GPLv3
|
# Puche 2022+ jokob jokob@duck.com GNU GPLv3
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// External files
|
// External files
|
||||||
require dirname(__FILE__).'/init.php';
|
require dirname(__FILE__).'/init.php';
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Action selector
|
// Action selector
|
||||||
|
|||||||
@@ -11,6 +11,10 @@
|
|||||||
// External files
|
// External files
|
||||||
require dirname(__FILE__).'/init.php';
|
require dirname(__FILE__).'/init.php';
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Action selector
|
// Action selector
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
@@ -424,41 +428,39 @@ function ExportCSV() {
|
|||||||
$func_result = $db->query("SELECT * FROM Devices");
|
$func_result = $db->query("SELECT * FROM Devices");
|
||||||
|
|
||||||
// prepare CSV header row
|
// prepare CSV header row
|
||||||
// header array with column names
|
|
||||||
$columns = getDevicesColumns();
|
$columns = getDevicesColumns();
|
||||||
|
|
||||||
// wrap the headers with " (quotes)
|
// wrap the headers with " (quotes)
|
||||||
$resultCSV = '"'.implode('","', $columns).'"';
|
$resultCSV = '"'.implode('","', $columns).'"'."\n";
|
||||||
|
|
||||||
//and append a new line
|
|
||||||
$resultCSV = $resultCSV."\n";
|
|
||||||
|
|
||||||
// retrieve the devices from the DB
|
// retrieve the devices from the DB
|
||||||
while ($row = $func_result -> fetchArray (SQLITE3_ASSOC)) {
|
while ($row = $func_result->fetchArray(SQLITE3_ASSOC)) {
|
||||||
|
|
||||||
// loop through columns and add values to the string
|
// loop through columns and add values to the string
|
||||||
$index = 0;
|
$index = 0;
|
||||||
foreach ($columns as $columnName) {
|
foreach ($columns as $columnName) {
|
||||||
|
// Escape special chars (e.g.quotes) inside fields by replacing them with html definitions
|
||||||
|
$fieldValue = encodeSpecialChars($row[$columnName]);
|
||||||
|
|
||||||
// add quotes around the value to prevent issues with commas in fields
|
// add quotes around the value to prevent issues with commas in fields
|
||||||
$resultCSV = $resultCSV.'"'.$row[$columnName].'"';
|
$resultCSV .= '"'.$fieldValue.'"';
|
||||||
|
|
||||||
// detect last loop - skip as no comma needed
|
// detect last loop - skip as no comma needed
|
||||||
if ($index != count($columns) - 1 )
|
if ($index != count($columns) - 1) {
|
||||||
{
|
$resultCSV .= ',';
|
||||||
$resultCSV = $resultCSV.',';
|
|
||||||
}
|
}
|
||||||
$index++;
|
$index++;
|
||||||
}
|
}
|
||||||
|
|
||||||
//$resultCSV = $resultCSV.implode(",", [$row["dev_MAC"], $row["dev_Name"]]);
|
// add a new line for the next row
|
||||||
$resultCSV = $resultCSV."\n";
|
$resultCSV .= "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
//write the built CSV string
|
//write the built CSV string
|
||||||
echo $resultCSV;
|
echo $resultCSV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Import CSV of devices
|
// Import CSV of devices
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
@@ -474,7 +476,11 @@ function ImportCSV() {
|
|||||||
if(isset ($_POST['content']) && !empty ($_POST['content']))
|
if(isset ($_POST['content']) && !empty ($_POST['content']))
|
||||||
{
|
{
|
||||||
// Decode the Base64 string
|
// Decode the Base64 string
|
||||||
$data = base64_decode($_POST['content']);
|
// $data = base64_decode($_POST['content']);
|
||||||
|
$data = base64_decode($_POST['content'], true); // The second parameter ensures safe decoding
|
||||||
|
|
||||||
|
// // Ensure the decoded data is treated as UTF-8 text
|
||||||
|
// $data = mb_convert_encoding($data, 'UTF-8', 'UTF-8');
|
||||||
|
|
||||||
} else if (file_exists($file)) { // try to get the data form the file
|
} else if (file_exists($file)) { // try to get the data form the file
|
||||||
|
|
||||||
@@ -486,6 +492,12 @@ function ImportCSV() {
|
|||||||
|
|
||||||
if($data != "")
|
if($data != "")
|
||||||
{
|
{
|
||||||
|
// data cleanup - new lines breaking the CSV
|
||||||
|
$data = preg_replace_callback('/"([^"]*)"/', function($matches) {
|
||||||
|
// Replace all \n within the quotes with a space
|
||||||
|
return str_replace("\n", " ", $matches[0]); // Replace with a space
|
||||||
|
}, $data);
|
||||||
|
|
||||||
$lines = explode("\n", $data);
|
$lines = explode("\n", $data);
|
||||||
|
|
||||||
// Get the column headers from the first line of the CSV
|
// Get the column headers from the first line of the CSV
|
||||||
@@ -608,7 +620,8 @@ function getDevicesList() {
|
|||||||
array("dev_GUID", 19, 19),
|
array("dev_GUID", 19, 19),
|
||||||
array("dev_SyncHubNodeName", 20, 20),
|
array("dev_SyncHubNodeName", 20, 20),
|
||||||
array("dev_NetworkSite", 21, 21),
|
array("dev_NetworkSite", 21, 21),
|
||||||
array("dev_SSID", 22, 22)
|
array("dev_SSID", 22, 22),
|
||||||
|
array("dev_SourcePlugin", 23, 23)
|
||||||
);
|
);
|
||||||
|
|
||||||
if($forceDefaultOrder == FALSE)
|
if($forceDefaultOrder == FALSE)
|
||||||
@@ -681,7 +694,8 @@ function getDevicesList() {
|
|||||||
handleNull($row['dev_GUID']),
|
handleNull($row['dev_GUID']),
|
||||||
handleNull($row['dev_SyncHubNodeName']),
|
handleNull($row['dev_SyncHubNodeName']),
|
||||||
handleNull($row['dev_NetworkSite']),
|
handleNull($row['dev_NetworkSite']),
|
||||||
handleNull($row['dev_SSID'])
|
handleNull($row['dev_SSID']),
|
||||||
|
handleNull($row['dev_SourcePlugin'])
|
||||||
);
|
);
|
||||||
|
|
||||||
$newOrder = array();
|
$newOrder = array();
|
||||||
|
|||||||
@@ -8,9 +8,12 @@
|
|||||||
# Puche 2021 / 2022+ jokob jokob@duck.com GNU GPLv3
|
# Puche 2021 / 2022+ jokob jokob@duck.com GNU GPLv3
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// External files
|
// External files
|
||||||
require dirname(__FILE__).'/init.php';
|
require dirname(__FILE__).'/init.php';
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Action selector
|
// Action selector
|
||||||
@@ -72,7 +75,7 @@ function getEventsTotals() {
|
|||||||
$resultJSON = getCache("getEventsTotals".$days);
|
$resultJSON = getCache("getEventsTotals".$days);
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
// one query to get all numbers, whcih is quicker than multiple queries
|
// one query to get all numbers, which is quicker than multiple queries
|
||||||
$sql = "select
|
$sql = "select
|
||||||
(SELECT Count(*) FROM Events WHERE eve_DateTime >= date('now', '".$periodDateSQL."')) as all_events,
|
(SELECT Count(*) FROM Events WHERE eve_DateTime >= date('now', '".$periodDateSQL."')) as all_events,
|
||||||
(SELECT Count(*) FROM Sessions as sessions WHERE ( ses_DateTimeConnection >= date('now', '".$periodDateSQL."') OR ses_DateTimeDisconnection >= date('now', '".$periodDateSQL."') OR ses_StillConnected = 1 )) as sessions,
|
(SELECT Count(*) FROM Sessions as sessions WHERE ( ses_DateTimeConnection >= date('now', '".$periodDateSQL."') OR ses_DateTimeDisconnection >= date('now', '".$periodDateSQL."') OR ses_StillConnected = 1 )) as sessions,
|
||||||
@@ -334,24 +337,40 @@ function getEventsCalendar() {
|
|||||||
$endDate = '"'. $_REQUEST ['end'] .'"';
|
$endDate = '"'. $_REQUEST ['end'] .'"';
|
||||||
|
|
||||||
// SQL
|
// SQL
|
||||||
$SQL = 'SELECT ses_MAC, ses_EventTypeConnection, ses_DateTimeConnection,
|
$SQL = 'SELECT SES1.ses_MAC, SES1.ses_EventTypeConnection, SES1.ses_DateTimeConnection,
|
||||||
ses_EventTypeDisconnection, ses_DateTimeDisconnection, ses_IP, ses_AdditionalInfo, ses_StillConnected,
|
SES1.ses_EventTypeDisconnection, SES1.ses_DateTimeDisconnection, SES1.ses_IP,
|
||||||
|
SES1.ses_AdditionalInfo, SES1.ses_StillConnected,
|
||||||
|
|
||||||
CASE
|
CASE
|
||||||
WHEN ses_EventTypeConnection = "<missing event>" THEN
|
WHEN SES1.ses_EventTypeConnection = "<missing event>" THEN
|
||||||
IFNULL ((SELECT MAX(ses_DateTimeDisconnection) FROM Sessions AS SES2 WHERE SES2.ses_MAC = SES1.ses_MAC AND SES2.ses_DateTimeDisconnection < SES1.ses_DateTimeDisconnection), DATETIME(ses_DateTimeDisconnection, "-1 hour"))
|
IFNULL (
|
||||||
ELSE ses_DateTimeConnection
|
(SELECT MAX(SES2.ses_DateTimeDisconnection)
|
||||||
END AS ses_DateTimeConnectionCorrected,
|
FROM Sessions AS SES2
|
||||||
|
WHERE SES2.ses_MAC = SES1.ses_MAC
|
||||||
|
AND SES2.ses_DateTimeDisconnection < SES1.ses_DateTimeDisconnection
|
||||||
|
AND SES2.ses_DateTimeDisconnection BETWEEN Date('. $startDate .') AND Date('. $endDate .')
|
||||||
|
),
|
||||||
|
DATETIME(SES1.ses_DateTimeDisconnection, "-1 hour")
|
||||||
|
)
|
||||||
|
ELSE SES1.ses_DateTimeConnection
|
||||||
|
END AS ses_DateTimeConnectionCorrected,
|
||||||
|
|
||||||
CASE
|
CASE
|
||||||
WHEN ses_EventTypeDisconnection = "<missing event>" THEN
|
WHEN SES1.ses_EventTypeDisconnection = "<missing event>" THEN
|
||||||
(SELECT MIN(ses_DateTimeConnection) FROM Sessions AS SES2 WHERE SES2.ses_MAC = SES1.ses_MAC AND SES2.ses_DateTimeConnection > SES1.ses_DateTimeConnection)
|
(SELECT MIN(SES2.ses_DateTimeConnection)
|
||||||
ELSE ses_DateTimeDisconnection
|
FROM Sessions AS SES2
|
||||||
END AS ses_DateTimeDisconnectionCorrected
|
WHERE SES2.ses_MAC = SES1.ses_MAC
|
||||||
|
AND SES2.ses_DateTimeConnection > SES1.ses_DateTimeConnection
|
||||||
|
AND SES2.ses_DateTimeConnection BETWEEN Date('. $startDate .') AND Date('. $endDate .')
|
||||||
|
)
|
||||||
|
ELSE SES1.ses_DateTimeDisconnection
|
||||||
|
END AS ses_DateTimeDisconnectionCorrected
|
||||||
|
|
||||||
|
FROM Sessions AS SES1
|
||||||
|
WHERE (SES1.ses_DateTimeConnection BETWEEN Date('. $startDate .') AND Date('. $endDate .'))
|
||||||
|
OR (SES1.ses_DateTimeDisconnection BETWEEN Date('. $startDate .') AND Date('. $endDate .'))
|
||||||
|
OR SES1.ses_StillConnected = 1';
|
||||||
|
|
||||||
FROM Sessions AS SES1
|
|
||||||
WHERE ( ses_DateTimeConnectionCorrected <= Date('. $endDate .')
|
|
||||||
AND (ses_DateTimeDisconnectionCorrected >= Date('. $startDate .') OR ses_StillConnected = 1 )) ';
|
|
||||||
$result = $db->query($SQL);
|
$result = $db->query($SQL);
|
||||||
|
|
||||||
// arrays of rows
|
// arrays of rows
|
||||||
|
|||||||
@@ -15,6 +15,10 @@
|
|||||||
// Get init.php
|
// Get init.php
|
||||||
require dirname(__FILE__).'/../server/init.php';
|
require dirname(__FILE__).'/../server/init.php';
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
|
||||||
// Perform a test with the PING command
|
// Perform a test with the PING command
|
||||||
$output = shell_exec("curl ipinfo.io");
|
$output = shell_exec("curl ipinfo.io");
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
require 'util.php';
|
require 'util.php';
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
|
||||||
$PIA_HOST_IP = $_REQUEST['scan'];
|
$PIA_HOST_IP = $_REQUEST['scan'];
|
||||||
$PIA_SCAN_MODE = $_REQUEST['mode'];
|
$PIA_SCAN_MODE = $_REQUEST['mode'];
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,11 @@
|
|||||||
// Get init.php
|
// Get init.php
|
||||||
require dirname(__FILE__).'/../server/init.php';
|
require dirname(__FILE__).'/../server/init.php';
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
|
||||||
// Get IP
|
// Get IP
|
||||||
$ip = $_GET['ip'];
|
$ip = $_GET['ip'];
|
||||||
|
|
||||||
|
|||||||
@@ -1,144 +0,0 @@
|
|||||||
<?php
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// NetAlertX
|
|
||||||
// Open Source Network Guard / WIFI & LAN intrusion detector
|
|
||||||
//
|
|
||||||
// parameters.php - Front module. Server side. Manage Parameters
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
# Puche 2021 / 2022+ jokob jokob@duck.com GNU GPLv3
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// External files
|
|
||||||
require dirname(__FILE__).'/init.php';
|
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// Action selector
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// Set maximum execution time to 15 seconds
|
|
||||||
ini_set ('max_execution_time','15');
|
|
||||||
|
|
||||||
$skipCache = FALSE;
|
|
||||||
$expireMinutes = 5;
|
|
||||||
$defaultValue = '';
|
|
||||||
|
|
||||||
|
|
||||||
if (isset ($_REQUEST['skipcache'])) {
|
|
||||||
$skipCache = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset ($_REQUEST['defaultValue'])) {
|
|
||||||
$defaultValue = $_REQUEST['defaultValue'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset ($_REQUEST['expireMinutes'])) {
|
|
||||||
$expireMinutes = $_REQUEST['expireMinutes'];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Action functions
|
|
||||||
if (isset ($_REQUEST['action']) && !empty ($_REQUEST['action'])) {
|
|
||||||
$action = $_REQUEST['action'];
|
|
||||||
switch ($action) {
|
|
||||||
case 'get': getParameter($skipCache, $defaultValue, $expireMinutes); break;
|
|
||||||
case 'set': setParameter($expireMinutes); break;
|
|
||||||
default: logServerConsole ('Action: '. $action); break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// Get Parameter Value
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
function getParameter($skipCache, $defaultValue, $expireMinutes) {
|
|
||||||
|
|
||||||
$parameter = $_REQUEST['parameter'];
|
|
||||||
$value = "";
|
|
||||||
|
|
||||||
// get the value from the cache if available
|
|
||||||
$cachedValue = getCache($parameter);
|
|
||||||
if($cachedValue != "")
|
|
||||||
{
|
|
||||||
$value = $cachedValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// query the database if no cache entry found or requesting live data (skipping cache)
|
|
||||||
if($skipCache || $value == "" )
|
|
||||||
{
|
|
||||||
global $db;
|
|
||||||
|
|
||||||
$sql = 'SELECT par_Value FROM Parameters
|
|
||||||
WHERE par_ID="'. quotes($parameter) .'"';
|
|
||||||
|
|
||||||
$result = $db->query($sql);
|
|
||||||
$row = $result -> fetchArray (SQLITE3_NUM);
|
|
||||||
|
|
||||||
if($row != NULL && count($row) == 1)
|
|
||||||
{
|
|
||||||
$value = $row[0];
|
|
||||||
} else{
|
|
||||||
$value = $defaultValue;
|
|
||||||
|
|
||||||
// Nothing found in the DB, Insert new value
|
|
||||||
insertNew($parameter, $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
// update cache
|
|
||||||
setCache($parameter, $value, $expireMinutes);
|
|
||||||
}
|
|
||||||
// return value
|
|
||||||
echo (json_encode ($value));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// Set Parameter Value
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
function setParameter($expireMinutes) {
|
|
||||||
|
|
||||||
$parameter = $_REQUEST['parameter'];
|
|
||||||
$value = $_REQUEST['value'];
|
|
||||||
|
|
||||||
global $db;
|
|
||||||
|
|
||||||
// Update value
|
|
||||||
$sql = 'UPDATE Parameters SET par_Value="'. quotes ($value) .'"
|
|
||||||
WHERE par_ID="'. quotes($parameter) .'"';
|
|
||||||
$result = $db->query($sql);
|
|
||||||
|
|
||||||
if (! $result == TRUE) {
|
|
||||||
echo "Error updating parameter\n\n$sql \n\n". $db->lastErrorMsg();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$changes = $db->changes();
|
|
||||||
if ($changes == 0) {
|
|
||||||
// Insert new value
|
|
||||||
insertNew($parameter, $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
// update cache
|
|
||||||
setCache($parameter, $value, $expireMinutes);
|
|
||||||
|
|
||||||
echo 'OK';
|
|
||||||
}
|
|
||||||
|
|
||||||
function insertNew($parameter, $value)
|
|
||||||
{
|
|
||||||
global $db;
|
|
||||||
|
|
||||||
// Insert new value
|
|
||||||
$sql = 'INSERT INTO Parameters (par_ID, par_Value)
|
|
||||||
VALUES ("'. quotes($parameter) .'",
|
|
||||||
"'. quotes($value) .'")';
|
|
||||||
$result = $db->query($sql);
|
|
||||||
|
|
||||||
if (! $result == TRUE) {
|
|
||||||
echo "Error creating parameter\n\n$sql \n\n". $db->lastErrorMsg();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
?>
|
|
||||||
@@ -1,5 +1,10 @@
|
|||||||
<?php
|
<?php
|
||||||
require dirname(__FILE__).'/../server/init.php';
|
require dirname(__FILE__).'/../server/init.php';
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
|
||||||
exec('../../../back/speedtest-cli --secure --simple', $output);
|
exec('../../../back/speedtest-cli --secure --simple', $output);
|
||||||
|
|
||||||
echo '<h4>'. lang('Speedtest_Results') .'</h4>';
|
echo '<h4>'. lang('Speedtest_Results') .'</h4>';
|
||||||
|
|||||||
@@ -15,6 +15,10 @@
|
|||||||
// Get init.php
|
// Get init.php
|
||||||
require dirname(__FILE__).'/../server/init.php';
|
require dirname(__FILE__).'/../server/init.php';
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
|
||||||
// Get IP
|
// Get IP
|
||||||
$ip = $_GET['ip'];
|
$ip = $_GET['ip'];
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,10 @@
|
|||||||
require dirname(__FILE__).'/../templates/timezone.php';
|
require dirname(__FILE__).'/../templates/timezone.php';
|
||||||
require dirname(__FILE__).'/../templates/skinUI.php';
|
require dirname(__FILE__).'/../templates/skinUI.php';
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
|
||||||
$FUNCTION = [];
|
$FUNCTION = [];
|
||||||
$SETTINGS = [];
|
$SETTINGS = [];
|
||||||
$ACTION = "";
|
$ACTION = "";
|
||||||
@@ -484,7 +488,7 @@ function getDateFromPeriod () {
|
|||||||
$days = "3650"; //10 years
|
$days = "3650"; //10 years
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$days = "1";
|
$days = "1";
|
||||||
}
|
}
|
||||||
|
|
||||||
$periodDateSQL = "-".$days." day";
|
$periodDateSQL = "-".$days." day";
|
||||||
@@ -520,6 +524,25 @@ function handleNull ($text, $default = "") {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------------------
|
||||||
|
// Encode special chars
|
||||||
|
function encodeSpecialChars($str) {
|
||||||
|
return str_replace(
|
||||||
|
['&', '<', '>', '"', "'"],
|
||||||
|
['&', '<', '>', '"', '''],
|
||||||
|
$str
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------------------
|
||||||
|
// Decode special chars
|
||||||
|
function decodeSpecialChars($str) {
|
||||||
|
return str_replace(
|
||||||
|
['&', '<', '>', '"', '''],
|
||||||
|
['&', '<', '>', '"', "'"],
|
||||||
|
$str
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------------
|
||||||
@@ -553,7 +576,8 @@ function getDevicesColumns(){
|
|||||||
"dev_GUID",
|
"dev_GUID",
|
||||||
"dev_SyncHubNodeName",
|
"dev_SyncHubNodeName",
|
||||||
"dev_NetworkSite",
|
"dev_NetworkSite",
|
||||||
"dev_SSID"
|
"dev_SSID",
|
||||||
|
"dev_SourcePlugin"
|
||||||
];
|
];
|
||||||
|
|
||||||
return $columns;
|
return $columns;
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
<!-- utils needing a DB connection -->
|
|
||||||
|
|
||||||
<?php
|
|
||||||
|
|
||||||
require dirname(__FILE__).'/init.php';
|
|
||||||
|
|
||||||
// Action functions
|
|
||||||
if (isset ($_REQUEST['key']))
|
|
||||||
{
|
|
||||||
echo lang($_REQUEST['key']);
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
|
||||||
require dirname(__FILE__).'/../templates/timezone.php';
|
require dirname(__FILE__).'/../templates/timezone.php';
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------------
|
||||||
// Check if the action parameter is set in the GET request
|
// Check if the action parameter is set in the GET request
|
||||||
if (isset($_GET['action'])) {
|
if (isset($_GET['action'])) {
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
session_start();
|
if (session_status() == PHP_SESSION_NONE) {
|
||||||
|
session_start();
|
||||||
|
}
|
||||||
|
|
||||||
$isAuthenticated = false;
|
$isAuthenticated = false;
|
||||||
|
|
||||||
@@ -17,9 +19,9 @@ $config_file = "../../../config/app.conf"; // depends on where this file is call
|
|||||||
$config_file_lines = file($config_file);
|
$config_file_lines = file($config_file);
|
||||||
$config_file_lines = array_values(preg_grep('/^SETPWD_password.*=/', $config_file_lines));
|
$config_file_lines = array_values(preg_grep('/^SETPWD_password.*=/', $config_file_lines));
|
||||||
$password_line = explode("'", $config_file_lines[0]);
|
$password_line = explode("'", $config_file_lines[0]);
|
||||||
$Pia_Password = $password_line[1];
|
$nax_Password = $password_line[1];
|
||||||
|
|
||||||
if (isset($_COOKIE[$CookieSaveLoginName]) && $Pia_Password == $_COOKIE[$CookieSaveLoginName]) {
|
if (isset($_COOKIE[$CookieSaveLoginName]) && $nax_Password == $_COOKIE[$CookieSaveLoginName]) {
|
||||||
$isAuthenticated = true;
|
$isAuthenticated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,12 @@
|
|||||||
#---------------------------------------------------------------------------------#
|
#---------------------------------------------------------------------------------#
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
<?php
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
?>
|
||||||
|
|
||||||
<!-- Main Footer -->
|
<!-- Main Footer -->
|
||||||
<footer class="main-footer">
|
<footer class="main-footer">
|
||||||
<!-- Default to the left -->
|
<!-- Default to the left -->
|
||||||
@@ -25,6 +31,7 @@
|
|||||||
| <a href="https://github.com/jokob-sk/NetAlertX/tree/main/docs#documentation-overview" target="_blank">Docs <i class="fa fa-circle-question"></i></a>
|
| <a href="https://github.com/jokob-sk/NetAlertX/tree/main/docs#documentation-overview" target="_blank">Docs <i class="fa fa-circle-question"></i></a>
|
||||||
| <a href="https://github.com/jokob-sk/NetAlertX/issues"><i class="fa-solid fa-bug"></i></a>
|
| <a href="https://github.com/jokob-sk/NetAlertX/issues"><i class="fa-solid fa-bug"></i></a>
|
||||||
| <a href="https://github.com/jokob-sk/NetAlertX/"><i class="fa-brands fa-github"></i></a>
|
| <a href="https://github.com/jokob-sk/NetAlertX/"><i class="fa-brands fa-github"></i></a>
|
||||||
|
| <a href="https://discord.gg/UQnnHNYV"><i class="fa-brands fa-discord"></i></a>
|
||||||
| <a href="mailto:jokob@duck.com?subject=NetAlertX"><i class="fa-solid fa-envelope"></i></a>
|
| <a href="mailto:jokob@duck.com?subject=NetAlertX"><i class="fa-solid fa-envelope"></i></a>
|
||||||
| <a href="https://github.com/pucherot/Pi.Alert">©</a>
|
| <a href="https://github.com/pucherot/Pi.Alert">©</a>
|
||||||
| <?= lang('Maintenance_built_on');?>: <?php include 'php/templates/build.php'; ?>
|
| <?= lang('Maintenance_built_on');?>: <?php include 'php/templates/build.php'; ?>
|
||||||
@@ -53,7 +60,7 @@
|
|||||||
<link rel="stylesheet" href="lib/AdminLTE/bower_components/select2/dist/css/select2.min.css">
|
<link rel="stylesheet" href="lib/AdminLTE/bower_components/select2/dist/css/select2.min.css">
|
||||||
|
|
||||||
<!-- NetAlertX -->
|
<!-- NetAlertX -->
|
||||||
<script src="js/handle_version.js"></script>
|
<script defer src="js/handle_version.js"></script>
|
||||||
<script src="js/ui_components.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
<script src="js/ui_components.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
global $db;
|
|
||||||
|
|
||||||
$Pia_Graph_Device_Time = array();
|
|
||||||
$Pia_Graph_Device_All = array();
|
|
||||||
$Pia_Graph_Device_Online = array();
|
|
||||||
$Pia_Graph_Device_Down = array();
|
|
||||||
$Pia_Graph_Device_Arch = array();
|
|
||||||
|
|
||||||
$statusesToShow = "'online', 'offline', 'archived'";
|
|
||||||
|
|
||||||
$statQuery = $db->query("SELECT * FROM Settings WHERE Code_Name = 'UI_PRESENCE'");
|
|
||||||
|
|
||||||
while($r = $statQuery->fetchArray(SQLITE3_ASSOC))
|
|
||||||
{
|
|
||||||
$statusesToShow = $r['Value'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$results = $db->query('SELECT * FROM Online_History ORDER BY Scan_Date DESC LIMIT 144');
|
|
||||||
|
|
||||||
while ($row = $results->fetchArray())
|
|
||||||
{
|
|
||||||
$time_raw = explode(' ', $row['Scan_Date']);
|
|
||||||
$time = explode(':', $time_raw[1]);
|
|
||||||
array_push($Pia_Graph_Device_Time, $time[0].':'.$time[1]);
|
|
||||||
|
|
||||||
// Offline
|
|
||||||
if(strpos($statusesToShow, 'offline') !== false)
|
|
||||||
{
|
|
||||||
array_push($Pia_Graph_Device_Down, $row['Down_Devices']);
|
|
||||||
}
|
|
||||||
|
|
||||||
// All
|
|
||||||
array_push($Pia_Graph_Device_All, $row['All_Devices']);
|
|
||||||
|
|
||||||
// Online
|
|
||||||
if(strpos($statusesToShow, 'online') !== false)
|
|
||||||
{
|
|
||||||
array_push($Pia_Graph_Device_Online, $row['Online_Devices']);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Archived
|
|
||||||
if(strpos($statusesToShow, 'archived') !== false)
|
|
||||||
{
|
|
||||||
array_push($Pia_Graph_Device_Arch, $row['Archived_Devices']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function pia_graph_devices_data($Pia_Graph_Array) {
|
|
||||||
$Pia_Graph_Array_rev = array_reverse($Pia_Graph_Array);
|
|
||||||
foreach ($Pia_Graph_Array_rev as $result) {
|
|
||||||
echo "'".$result."'";
|
|
||||||
echo ",";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,8 +8,10 @@
|
|||||||
#--------------------------------------------------------------------------- -->
|
#--------------------------------------------------------------------------- -->
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
require dirname(__FILE__).'/../server/init.php';
|
require dirname(__FILE__).'/../server/init.php';
|
||||||
require dirname(__FILE__).'/security.php';
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
||||||
@@ -67,14 +69,20 @@ require dirname(__FILE__).'/security.php';
|
|||||||
<link id="favicon" rel="icon" type="image/x-icon" href="img/NetAlertX_logo.png">
|
<link id="favicon" rel="icon" type="image/x-icon" href="img/NetAlertX_logo.png">
|
||||||
|
|
||||||
<!-- For better UX on Mobile Devices using the Shortcut on the Homescreen -->
|
<!-- For better UX on Mobile Devices using the Shortcut on the Homescreen -->
|
||||||
<link rel="manifest" href="img/manifest.json">
|
<link rel="manifest" href="img/manifest.json" crossorigin="use-credentials">
|
||||||
<!-- Dark-Mode Patch -->
|
<!-- Dark-Mode Patch -->
|
||||||
<?php
|
|
||||||
if ($ENABLED_DARKMODE === True) {
|
<?php
|
||||||
echo '<link rel="stylesheet" href="css/dark-patch.css">';
|
switch ($UI_THEME) {
|
||||||
$BACKGROUND_IMAGE_PATCH='style="background-image: url(\'img/boxed-bg-dark.png\');"';
|
case "Dark":
|
||||||
} else { $BACKGROUND_IMAGE_PATCH='style="background-image: url(\'img/background.png\');"';}
|
echo '<link rel="stylesheet" href="css/dark-patch.css">';
|
||||||
?>
|
break;
|
||||||
|
case "System":
|
||||||
|
echo '<link rel="stylesheet" href="css/system-dark-patch.css">';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Servertime to the right of the hostname -->
|
<!-- Servertime to the right of the hostname -->
|
||||||
@@ -110,7 +118,7 @@ if ($ENABLED_DARKMODE === True) {
|
|||||||
<!-- ----------------------------------------------------------------------- -->
|
<!-- ----------------------------------------------------------------------- -->
|
||||||
<!-- Layout Boxed Yellow -->
|
<!-- Layout Boxed Yellow -->
|
||||||
|
|
||||||
<body class="hold-transition fixed <?php echo $pia_skin_selected;?> sidebar-mini" <?php echo $BACKGROUND_IMAGE_PATCH;?> onLoad="show_pia_servertime();" >
|
<body class="hold-transition fixed <?php echo $pia_skin_selected;?> sidebar-mini" onLoad="show_pia_servertime();" >
|
||||||
<!-- Site wrapper -->
|
<!-- Site wrapper -->
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
|
|
||||||
@@ -312,9 +320,6 @@ if ($ENABLED_DARKMODE === True) {
|
|||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
<ul class="treeview-menu" style="display: <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('maintenance.php') ) ){ echo 'block'; } else {echo 'none';} ?>;">
|
<ul class="treeview-menu" style="display: <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('maintenance.php') ) ){ echo 'block'; } else {echo 'none';} ?>;">
|
||||||
<li>
|
|
||||||
<a href="maintenance.php#tab_Settings" onclick="initializeTabs()"> <?= lang("Maintenance_Tools_Tab_UISettings");?> </a>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<a href="maintenance.php#tab_DBTools" onclick="initializeTabs()"> <?= lang("Maintenance_Tools_Tab_Tools");?> </a>
|
<a href="maintenance.php#tab_DBTools" onclick="initializeTabs()"> <?= lang("Maintenance_Tools_Tab_Tools");?> </a>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
714
front/php/templates/language/ar_ar.json
Executable file
714
front/php/templates/language/ar_ar.json
Executable file
@@ -0,0 +1,714 @@
|
|||||||
|
{
|
||||||
|
"API_CUSTOM_SQL_description": "",
|
||||||
|
"API_CUSTOM_SQL_name": "",
|
||||||
|
"API_display_name": "",
|
||||||
|
"API_icon": "",
|
||||||
|
"About_Design": "",
|
||||||
|
"About_Exit": "",
|
||||||
|
"About_Title": "",
|
||||||
|
"AppEvents_DateTimeCreated": "",
|
||||||
|
"AppEvents_Extra": "",
|
||||||
|
"AppEvents_GUID": "",
|
||||||
|
"AppEvents_Helper1": "",
|
||||||
|
"AppEvents_Helper2": "",
|
||||||
|
"AppEvents_Helper3": "",
|
||||||
|
"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": "",
|
||||||
|
"BackDevDetail_Actions_Not_Registered": "",
|
||||||
|
"BackDevDetail_Actions_Title_Run": "",
|
||||||
|
"BackDevDetail_Copy_Ask": "",
|
||||||
|
"BackDevDetail_Copy_Title": "",
|
||||||
|
"BackDevDetail_Tools_WOL_error": "",
|
||||||
|
"BackDevDetail_Tools_WOL_okay": "",
|
||||||
|
"BackDevices_Arpscan_disabled": "",
|
||||||
|
"BackDevices_Arpscan_enabled": "",
|
||||||
|
"BackDevices_Backup_CopError": "",
|
||||||
|
"BackDevices_Backup_Failed": "",
|
||||||
|
"BackDevices_Backup_okay": "",
|
||||||
|
"BackDevices_DBTools_DelDevError_a": "",
|
||||||
|
"BackDevices_DBTools_DelDevError_b": "",
|
||||||
|
"BackDevices_DBTools_DelDev_a": "",
|
||||||
|
"BackDevices_DBTools_DelDev_b": "",
|
||||||
|
"BackDevices_DBTools_DelEvents": "",
|
||||||
|
"BackDevices_DBTools_DelEventsError": "",
|
||||||
|
"BackDevices_DBTools_ImportCSV": "",
|
||||||
|
"BackDevices_DBTools_ImportCSVError": "",
|
||||||
|
"BackDevices_DBTools_ImportCSVMissing": "",
|
||||||
|
"BackDevices_DBTools_Purge": "",
|
||||||
|
"BackDevices_DBTools_UpdDev": "",
|
||||||
|
"BackDevices_DBTools_UpdDevError": "",
|
||||||
|
"BackDevices_DBTools_Upgrade": "",
|
||||||
|
"BackDevices_DBTools_UpgradeError": "",
|
||||||
|
"BackDevices_Device_UpdDevError": "",
|
||||||
|
"BackDevices_Restore_CopError": "",
|
||||||
|
"BackDevices_Restore_Failed": "",
|
||||||
|
"BackDevices_Restore_okay": "",
|
||||||
|
"BackDevices_darkmode_disabled": "",
|
||||||
|
"BackDevices_darkmode_enabled": "",
|
||||||
|
"CLEAR_NEW_FLAG_description": "",
|
||||||
|
"CLEAR_NEW_FLAG_name": "",
|
||||||
|
"DAYS_TO_KEEP_EVENTS_description": "",
|
||||||
|
"DAYS_TO_KEEP_EVENTS_name": "",
|
||||||
|
"DevDetail_Copy_Device_Title": "",
|
||||||
|
"DevDetail_Copy_Device_Tooltip": "",
|
||||||
|
"DevDetail_EveandAl_AlertAllEvents": "",
|
||||||
|
"DevDetail_EveandAl_AlertDown": "",
|
||||||
|
"DevDetail_EveandAl_Archived": "",
|
||||||
|
"DevDetail_EveandAl_NewDevice": "",
|
||||||
|
"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_Loading": "",
|
||||||
|
"DevDetail_MainInfo_Comments": "",
|
||||||
|
"DevDetail_MainInfo_Favorite": "",
|
||||||
|
"DevDetail_MainInfo_Group": "",
|
||||||
|
"DevDetail_MainInfo_Location": "",
|
||||||
|
"DevDetail_MainInfo_Name": "",
|
||||||
|
"DevDetail_MainInfo_Network": "",
|
||||||
|
"DevDetail_MainInfo_Network_Port": "",
|
||||||
|
"DevDetail_MainInfo_Network_Site": "",
|
||||||
|
"DevDetail_MainInfo_Network_Title": "",
|
||||||
|
"DevDetail_MainInfo_Owner": "",
|
||||||
|
"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_Nmap_buttonDetail": "",
|
||||||
|
"DevDetail_Nmap_buttonDetail_text": "",
|
||||||
|
"DevDetail_Nmap_buttonFast": "",
|
||||||
|
"DevDetail_Nmap_buttonFast_text": "",
|
||||||
|
"DevDetail_Nmap_buttonSkipDiscovery": "",
|
||||||
|
"DevDetail_Nmap_buttonSkipDiscovery_text": "",
|
||||||
|
"DevDetail_Nmap_resultsLink": "",
|
||||||
|
"DevDetail_Owner_hover": "",
|
||||||
|
"DevDetail_Periodselect_All": "",
|
||||||
|
"DevDetail_Periodselect_LastMonth": "",
|
||||||
|
"DevDetail_Periodselect_LastWeek": "",
|
||||||
|
"DevDetail_Periodselect_LastYear": "",
|
||||||
|
"DevDetail_Periodselect_today": "",
|
||||||
|
"DevDetail_Run_Actions_Title": "",
|
||||||
|
"DevDetail_Run_Actions_Tooltip": "",
|
||||||
|
"DevDetail_SessionInfo_FirstSession": "",
|
||||||
|
"DevDetail_SessionInfo_LastIP": "",
|
||||||
|
"DevDetail_SessionInfo_LastSession": "",
|
||||||
|
"DevDetail_SessionInfo_StaticIP": "",
|
||||||
|
"DevDetail_SessionInfo_Status": "",
|
||||||
|
"DevDetail_SessionInfo_Title": "",
|
||||||
|
"DevDetail_SessionTable_Additionalinfo": "",
|
||||||
|
"DevDetail_SessionTable_Connection": "",
|
||||||
|
"DevDetail_SessionTable_Disconnection": "",
|
||||||
|
"DevDetail_SessionTable_Duration": "",
|
||||||
|
"DevDetail_SessionTable_IP": "",
|
||||||
|
"DevDetail_SessionTable_Order": "",
|
||||||
|
"DevDetail_Shortcut_CurrentStatus": "",
|
||||||
|
"DevDetail_Shortcut_DownAlerts": "",
|
||||||
|
"DevDetail_Shortcut_Presence": "",
|
||||||
|
"DevDetail_Shortcut_Sessions": "",
|
||||||
|
"DevDetail_Tab_Details": "",
|
||||||
|
"DevDetail_Tab_Events": "",
|
||||||
|
"DevDetail_Tab_EventsTableDate": "",
|
||||||
|
"DevDetail_Tab_EventsTableEvent": "",
|
||||||
|
"DevDetail_Tab_EventsTableIP": "",
|
||||||
|
"DevDetail_Tab_EventsTableInfo": "",
|
||||||
|
"DevDetail_Tab_Nmap": "",
|
||||||
|
"DevDetail_Tab_NmapEmpty": "",
|
||||||
|
"DevDetail_Tab_NmapTableExtra": "",
|
||||||
|
"DevDetail_Tab_NmapTableHeader": "",
|
||||||
|
"DevDetail_Tab_NmapTableIndex": "",
|
||||||
|
"DevDetail_Tab_NmapTablePort": "",
|
||||||
|
"DevDetail_Tab_NmapTableService": "",
|
||||||
|
"DevDetail_Tab_NmapTableState": "",
|
||||||
|
"DevDetail_Tab_NmapTableText": "",
|
||||||
|
"DevDetail_Tab_NmapTableTime": "",
|
||||||
|
"DevDetail_Tab_Plugins": "",
|
||||||
|
"DevDetail_Tab_Presence": "",
|
||||||
|
"DevDetail_Tab_Sessions": "",
|
||||||
|
"DevDetail_Tab_Tools": "",
|
||||||
|
"DevDetail_Tab_Tools_Internet_Info_Description": "",
|
||||||
|
"DevDetail_Tab_Tools_Internet_Info_Error": "",
|
||||||
|
"DevDetail_Tab_Tools_Internet_Info_Start": "",
|
||||||
|
"DevDetail_Tab_Tools_Internet_Info_Title": "",
|
||||||
|
"DevDetail_Tab_Tools_Nslookup_Description": "",
|
||||||
|
"DevDetail_Tab_Tools_Nslookup_Error": "",
|
||||||
|
"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_Traceroute_Error": "",
|
||||||
|
"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_button_AddIcon": "",
|
||||||
|
"DevDetail_button_AddIcon_Help": "",
|
||||||
|
"DevDetail_button_AddIcon_Tooltip": "",
|
||||||
|
"DevDetail_button_Delete": "",
|
||||||
|
"DevDetail_button_DeleteEvents": "",
|
||||||
|
"DevDetail_button_DeleteEvents_Warning": "",
|
||||||
|
"DevDetail_button_OverwriteIcons": "",
|
||||||
|
"DevDetail_button_OverwriteIcons_Tooltip": "",
|
||||||
|
"DevDetail_button_OverwriteIcons_Warning": "",
|
||||||
|
"DevDetail_button_Reset": "",
|
||||||
|
"DevDetail_button_Save": "",
|
||||||
|
"Device_MultiEdit": "",
|
||||||
|
"Device_MultiEdit_Backup": "",
|
||||||
|
"Device_MultiEdit_Fields": "",
|
||||||
|
"Device_MultiEdit_MassActions": "",
|
||||||
|
"Device_MultiEdit_Tooltip": "",
|
||||||
|
"Device_Searchbox": "",
|
||||||
|
"Device_Shortcut_AllDevices": "",
|
||||||
|
"Device_Shortcut_Archived": "",
|
||||||
|
"Device_Shortcut_Connected": "",
|
||||||
|
"Device_Shortcut_Devices": "",
|
||||||
|
"Device_Shortcut_DownAlerts": "",
|
||||||
|
"Device_Shortcut_DownOnly": "",
|
||||||
|
"Device_Shortcut_Favorites": "",
|
||||||
|
"Device_Shortcut_NewDevices": "",
|
||||||
|
"Device_Shortcut_OnlineChart": "",
|
||||||
|
"Device_TableHead_Connected_Devices": "",
|
||||||
|
"Device_TableHead_Favorite": "",
|
||||||
|
"Device_TableHead_FirstSession": "",
|
||||||
|
"Device_TableHead_GUID": "",
|
||||||
|
"Device_TableHead_Group": "",
|
||||||
|
"Device_TableHead_Icon": "",
|
||||||
|
"Device_TableHead_LastIP": "",
|
||||||
|
"Device_TableHead_LastIPOrder": "",
|
||||||
|
"Device_TableHead_LastSession": "",
|
||||||
|
"Device_TableHead_Location": "",
|
||||||
|
"Device_TableHead_MAC": "",
|
||||||
|
"Device_TableHead_MAC_full": "",
|
||||||
|
"Device_TableHead_Name": "",
|
||||||
|
"Device_TableHead_NetworkSite": "",
|
||||||
|
"Device_TableHead_Owner": "",
|
||||||
|
"Device_TableHead_Parent_MAC": "",
|
||||||
|
"Device_TableHead_Port": "",
|
||||||
|
"Device_TableHead_RowID": "",
|
||||||
|
"Device_TableHead_Rowid": "",
|
||||||
|
"Device_TableHead_SSID": "",
|
||||||
|
"Device_TableHead_SourcePlugin": "",
|
||||||
|
"Device_TableHead_Status": "",
|
||||||
|
"Device_TableHead_SyncHubNodeName": "",
|
||||||
|
"Device_TableHead_Type": "",
|
||||||
|
"Device_TableHead_Vendor": "",
|
||||||
|
"Device_Table_Not_Network_Device": "",
|
||||||
|
"Device_Table_info": "",
|
||||||
|
"Device_Table_nav_next": "",
|
||||||
|
"Device_Table_nav_prev": "",
|
||||||
|
"Device_Tablelenght": "",
|
||||||
|
"Device_Tablelenght_all": "",
|
||||||
|
"Device_Title": "",
|
||||||
|
"Donations_Others": "",
|
||||||
|
"Donations_Platforms": "",
|
||||||
|
"Donations_Text": "",
|
||||||
|
"Donations_Title": "",
|
||||||
|
"ENABLE_PLUGINS_description": "",
|
||||||
|
"ENABLE_PLUGINS_name": "",
|
||||||
|
"Email_display_name": "",
|
||||||
|
"Email_icon": "",
|
||||||
|
"Events_Loading": "",
|
||||||
|
"Events_Periodselect_All": "",
|
||||||
|
"Events_Periodselect_LastMonth": "",
|
||||||
|
"Events_Periodselect_LastWeek": "",
|
||||||
|
"Events_Periodselect_LastYear": "",
|
||||||
|
"Events_Periodselect_today": "",
|
||||||
|
"Events_Searchbox": "",
|
||||||
|
"Events_Shortcut_AllEvents": "",
|
||||||
|
"Events_Shortcut_DownAlerts": "",
|
||||||
|
"Events_Shortcut_Events": "",
|
||||||
|
"Events_Shortcut_MissSessions": "",
|
||||||
|
"Events_Shortcut_NewDevices": "",
|
||||||
|
"Events_Shortcut_Sessions": "",
|
||||||
|
"Events_Shortcut_VoidSessions": "",
|
||||||
|
"Events_TableHead_AdditionalInfo": "",
|
||||||
|
"Events_TableHead_Connection": "",
|
||||||
|
"Events_TableHead_Date": "",
|
||||||
|
"Events_TableHead_Device": "",
|
||||||
|
"Events_TableHead_Disconnection": "",
|
||||||
|
"Events_TableHead_Duration": "",
|
||||||
|
"Events_TableHead_DurationOrder": "",
|
||||||
|
"Events_TableHead_EventType": "",
|
||||||
|
"Events_TableHead_IP": "",
|
||||||
|
"Events_TableHead_IPOrder": "",
|
||||||
|
"Events_TableHead_Order": "",
|
||||||
|
"Events_TableHead_Owner": "",
|
||||||
|
"Events_TableHead_PendingAlert": "",
|
||||||
|
"Events_Table_info": "",
|
||||||
|
"Events_Table_nav_next": "",
|
||||||
|
"Events_Table_nav_prev": "",
|
||||||
|
"Events_Tablelenght": "",
|
||||||
|
"Events_Tablelenght_all": "",
|
||||||
|
"Events_Title": "",
|
||||||
|
"Gen_Action": "",
|
||||||
|
"Gen_Add": "",
|
||||||
|
"Gen_Add_All": "",
|
||||||
|
"Gen_All_Devices": "",
|
||||||
|
"Gen_AreYouSure": "",
|
||||||
|
"Gen_Backup": "",
|
||||||
|
"Gen_Cancel": "",
|
||||||
|
"Gen_Change": "",
|
||||||
|
"Gen_Copy": "",
|
||||||
|
"Gen_DataUpdatedUITakesTime": "",
|
||||||
|
"Gen_Delete": "",
|
||||||
|
"Gen_DeleteAll": "",
|
||||||
|
"Gen_Description": "",
|
||||||
|
"Gen_Error": "",
|
||||||
|
"Gen_Filter": "",
|
||||||
|
"Gen_Generate": "",
|
||||||
|
"Gen_LockedDB": "",
|
||||||
|
"Gen_Offline": "",
|
||||||
|
"Gen_Okay": "",
|
||||||
|
"Gen_Purge": "",
|
||||||
|
"Gen_ReadDocs": "",
|
||||||
|
"Gen_Remove_All": "",
|
||||||
|
"Gen_Remove_Last": "",
|
||||||
|
"Gen_Restore": "",
|
||||||
|
"Gen_Run": "",
|
||||||
|
"Gen_Save": "",
|
||||||
|
"Gen_Saved": "",
|
||||||
|
"Gen_Search": "",
|
||||||
|
"Gen_SelectToPreview": "",
|
||||||
|
"Gen_Selected_Devices": "",
|
||||||
|
"Gen_Switch": "",
|
||||||
|
"Gen_Upd": "",
|
||||||
|
"Gen_Upd_Fail": "",
|
||||||
|
"Gen_Update": "",
|
||||||
|
"Gen_Update_Value": "",
|
||||||
|
"Gen_Warning": "",
|
||||||
|
"Gen_Work_In_Progress": "",
|
||||||
|
"General_display_name": "",
|
||||||
|
"General_icon": "",
|
||||||
|
"HRS_TO_KEEP_NEWDEV_description": "",
|
||||||
|
"HRS_TO_KEEP_NEWDEV_name": "",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_description": "",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_name": "",
|
||||||
|
"HelpFAQ_Cat_Detail": "",
|
||||||
|
"HelpFAQ_Cat_Detail_300_head": "",
|
||||||
|
"HelpFAQ_Cat_Detail_300_text_a": "",
|
||||||
|
"HelpFAQ_Cat_Detail_300_text_b": "",
|
||||||
|
"HelpFAQ_Cat_Detail_301_head_a": "",
|
||||||
|
"HelpFAQ_Cat_Detail_301_head_b": "",
|
||||||
|
"HelpFAQ_Cat_Detail_301_text": "",
|
||||||
|
"HelpFAQ_Cat_Detail_302_head_a": "",
|
||||||
|
"HelpFAQ_Cat_Detail_302_head_b": "",
|
||||||
|
"HelpFAQ_Cat_Detail_302_text": "",
|
||||||
|
"HelpFAQ_Cat_Detail_303_head": "",
|
||||||
|
"HelpFAQ_Cat_Detail_303_text": "",
|
||||||
|
"HelpFAQ_Cat_Device_200_head": "",
|
||||||
|
"HelpFAQ_Cat_Device_200_text": "",
|
||||||
|
"HelpFAQ_Cat_General": "",
|
||||||
|
"HelpFAQ_Cat_General_100_head": "",
|
||||||
|
"HelpFAQ_Cat_General_100_text_a": "",
|
||||||
|
"HelpFAQ_Cat_General_100_text_b": "",
|
||||||
|
"HelpFAQ_Cat_General_100_text_c": "",
|
||||||
|
"HelpFAQ_Cat_General_101_head": "",
|
||||||
|
"HelpFAQ_Cat_General_101_text": "",
|
||||||
|
"HelpFAQ_Cat_General_102_head": "",
|
||||||
|
"HelpFAQ_Cat_General_102_text": "",
|
||||||
|
"HelpFAQ_Cat_General_102docker_head": "",
|
||||||
|
"HelpFAQ_Cat_General_102docker_text": "",
|
||||||
|
"HelpFAQ_Cat_General_103_head": "",
|
||||||
|
"HelpFAQ_Cat_General_103_text": "",
|
||||||
|
"HelpFAQ_Cat_Network_600_head": "",
|
||||||
|
"HelpFAQ_Cat_Network_600_text": "",
|
||||||
|
"HelpFAQ_Cat_Network_601_head": "",
|
||||||
|
"HelpFAQ_Cat_Network_601_text": "",
|
||||||
|
"HelpFAQ_Cat_Presence_400_head": "",
|
||||||
|
"HelpFAQ_Cat_Presence_400_text": "",
|
||||||
|
"HelpFAQ_Cat_Presence_401_head": "",
|
||||||
|
"HelpFAQ_Cat_Presence_401_text": "",
|
||||||
|
"HelpFAQ_Title": "",
|
||||||
|
"LOADED_PLUGINS_description": "",
|
||||||
|
"LOADED_PLUGINS_name": "",
|
||||||
|
"LOG_LEVEL_description": "",
|
||||||
|
"LOG_LEVEL_name": "",
|
||||||
|
"Loading": "",
|
||||||
|
"Login_Box": "",
|
||||||
|
"Login_Default_PWD": "",
|
||||||
|
"Login_Info": "",
|
||||||
|
"Login_Psw-box": "",
|
||||||
|
"Login_Psw_alert": "",
|
||||||
|
"Login_Psw_folder": "",
|
||||||
|
"Login_Psw_new": "",
|
||||||
|
"Login_Psw_run": "",
|
||||||
|
"Login_Remember": "",
|
||||||
|
"Login_Remember_small": "",
|
||||||
|
"Login_Submit": "",
|
||||||
|
"Login_Toggle_Alert_headline": "",
|
||||||
|
"Login_Toggle_Info": "",
|
||||||
|
"Login_Toggle_Info_headline": "",
|
||||||
|
"Maint_PurgeLog": "",
|
||||||
|
"Maint_RestartServer": "",
|
||||||
|
"Maint_Restart_Server_noti_text": "",
|
||||||
|
"Maintenance_Running_Version": "",
|
||||||
|
"Maintenance_Status": "",
|
||||||
|
"Maintenance_Title": "",
|
||||||
|
"Maintenance_Tool_ExportCSV": "",
|
||||||
|
"Maintenance_Tool_ExportCSV_noti": "",
|
||||||
|
"Maintenance_Tool_ExportCSV_noti_text": "",
|
||||||
|
"Maintenance_Tool_ExportCSV_text": "",
|
||||||
|
"Maintenance_Tool_ImportCSV": "",
|
||||||
|
"Maintenance_Tool_ImportCSV_noti": "",
|
||||||
|
"Maintenance_Tool_ImportCSV_noti_text": "",
|
||||||
|
"Maintenance_Tool_ImportCSV_text": "",
|
||||||
|
"Maintenance_Tool_ImportPastedCSV": "",
|
||||||
|
"Maintenance_Tool_ImportPastedCSV_noti_text": "",
|
||||||
|
"Maintenance_Tool_ImportPastedCSV_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_del_alldev": "",
|
||||||
|
"Maintenance_Tool_del_alldev_noti": "",
|
||||||
|
"Maintenance_Tool_del_alldev_noti_text": "",
|
||||||
|
"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_empty_macs_noti": "",
|
||||||
|
"Maintenance_Tool_del_empty_macs_noti_text": "",
|
||||||
|
"Maintenance_Tool_del_empty_macs_text": "",
|
||||||
|
"Maintenance_Tool_del_selecteddev": "",
|
||||||
|
"Maintenance_Tool_del_selecteddev_text": "",
|
||||||
|
"Maintenance_Tool_del_unknowndev": "",
|
||||||
|
"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_Tools_Tab_Settings": "",
|
||||||
|
"Maintenance_Tools_Tab_Tools": "",
|
||||||
|
"Maintenance_Tools_Tab_UISettings": "",
|
||||||
|
"Maintenance_arp_status": "",
|
||||||
|
"Maintenance_arp_status_off": "",
|
||||||
|
"Maintenance_arp_status_on": "",
|
||||||
|
"Maintenance_built_on": "",
|
||||||
|
"Maintenance_current_version": "",
|
||||||
|
"Maintenance_database_backup": "",
|
||||||
|
"Maintenance_database_backup_found": "",
|
||||||
|
"Maintenance_database_backup_total": "",
|
||||||
|
"Maintenance_database_lastmod": "",
|
||||||
|
"Maintenance_database_path": "",
|
||||||
|
"Maintenance_database_rows": "",
|
||||||
|
"Maintenance_database_size": "",
|
||||||
|
"Maintenance_lang_selector_apply": "",
|
||||||
|
"Maintenance_lang_selector_empty": "",
|
||||||
|
"Maintenance_lang_selector_lable": "",
|
||||||
|
"Maintenance_lang_selector_text": "",
|
||||||
|
"Maintenance_new_version": "",
|
||||||
|
"Maintenance_themeselector_apply": "",
|
||||||
|
"Maintenance_themeselector_empty": "",
|
||||||
|
"Maintenance_themeselector_lable": "",
|
||||||
|
"Maintenance_themeselector_text": "",
|
||||||
|
"Maintenance_version": "",
|
||||||
|
"NETWORK_DEVICE_TYPES_description": "",
|
||||||
|
"NETWORK_DEVICE_TYPES_name": "",
|
||||||
|
"Navigation_About": "",
|
||||||
|
"Navigation_Devices": "",
|
||||||
|
"Navigation_Donations": "",
|
||||||
|
"Navigation_Events": "",
|
||||||
|
"Navigation_HelpFAQ": "",
|
||||||
|
"Navigation_Integrations": "",
|
||||||
|
"Navigation_Maintenance": "",
|
||||||
|
"Navigation_Monitoring": "",
|
||||||
|
"Navigation_Network": "",
|
||||||
|
"Navigation_Notifications": "",
|
||||||
|
"Navigation_Plugins": "",
|
||||||
|
"Navigation_Presence": "",
|
||||||
|
"Navigation_Report": "",
|
||||||
|
"Navigation_Settings": "",
|
||||||
|
"Navigation_SystemInfo": "",
|
||||||
|
"Navigation_Workflows": "",
|
||||||
|
"Network_Assign": "",
|
||||||
|
"Network_Cant_Assign": "",
|
||||||
|
"Network_Configuration_Error": "",
|
||||||
|
"Network_Connected": "",
|
||||||
|
"Network_ManageAdd": "",
|
||||||
|
"Network_ManageAdd_Name": "",
|
||||||
|
"Network_ManageAdd_Name_text": "",
|
||||||
|
"Network_ManageAdd_Port": "",
|
||||||
|
"Network_ManageAdd_Port_text": "",
|
||||||
|
"Network_ManageAdd_Submit": "",
|
||||||
|
"Network_ManageAdd_Type": "",
|
||||||
|
"Network_ManageAdd_Type_text": "",
|
||||||
|
"Network_ManageAssign": "",
|
||||||
|
"Network_ManageDel": "",
|
||||||
|
"Network_ManageDel_Name": "",
|
||||||
|
"Network_ManageDel_Name_text": "",
|
||||||
|
"Network_ManageDel_Submit": "",
|
||||||
|
"Network_ManageDevices": "",
|
||||||
|
"Network_ManageEdit": "",
|
||||||
|
"Network_ManageEdit_ID": "",
|
||||||
|
"Network_ManageEdit_ID_text": "",
|
||||||
|
"Network_ManageEdit_Name": "",
|
||||||
|
"Network_ManageEdit_Name_text": "",
|
||||||
|
"Network_ManageEdit_Port": "",
|
||||||
|
"Network_ManageEdit_Port_text": "",
|
||||||
|
"Network_ManageEdit_Submit": "",
|
||||||
|
"Network_ManageEdit_Type": "",
|
||||||
|
"Network_ManageEdit_Type_text": "",
|
||||||
|
"Network_ManageLeaf": "",
|
||||||
|
"Network_ManageUnassign": "",
|
||||||
|
"Network_NoAssignedDevices": "",
|
||||||
|
"Network_NoDevices": "",
|
||||||
|
"Network_Node": "",
|
||||||
|
"Network_Node_Name": "",
|
||||||
|
"Network_Parent": "",
|
||||||
|
"Network_Root": "",
|
||||||
|
"Network_Root_Not_Configured": "",
|
||||||
|
"Network_Root_Unconfigurable": "",
|
||||||
|
"Network_Table_Hostname": "",
|
||||||
|
"Network_Table_IP": "",
|
||||||
|
"Network_Table_State": "",
|
||||||
|
"Network_Title": "",
|
||||||
|
"Network_UnassignedDevices": "",
|
||||||
|
"Notifications_All": "",
|
||||||
|
"Notifications_Mark_All_Read": "",
|
||||||
|
"PIALERT_WEB_PASSWORD_description": "",
|
||||||
|
"PIALERT_WEB_PASSWORD_name": "",
|
||||||
|
"PIALERT_WEB_PROTECTION_description": "",
|
||||||
|
"PIALERT_WEB_PROTECTION_name": "",
|
||||||
|
"PLUGINS_KEEP_HIST_description": "",
|
||||||
|
"PLUGINS_KEEP_HIST_name": "",
|
||||||
|
"Plugins_DeleteAll": "",
|
||||||
|
"Plugins_Filters_Mac": "",
|
||||||
|
"Plugins_History": "",
|
||||||
|
"Plugins_Obj_DeleteListed": "",
|
||||||
|
"Plugins_Objects": "",
|
||||||
|
"Plugins_Out_of": "",
|
||||||
|
"Plugins_Unprocessed_Events": "",
|
||||||
|
"Plugins_no_control": "",
|
||||||
|
"Presence_CalHead_day": "",
|
||||||
|
"Presence_CalHead_lang": "",
|
||||||
|
"Presence_CalHead_month": "",
|
||||||
|
"Presence_CalHead_quarter": "",
|
||||||
|
"Presence_CalHead_week": "",
|
||||||
|
"Presence_CalHead_year": "",
|
||||||
|
"Presence_CallHead_Devices": "",
|
||||||
|
"Presence_Key_OnlineNow": "",
|
||||||
|
"Presence_Key_OnlineNow_desc": "",
|
||||||
|
"Presence_Key_OnlinePast": "",
|
||||||
|
"Presence_Key_OnlinePastMiss": "",
|
||||||
|
"Presence_Key_OnlinePastMiss_desc": "",
|
||||||
|
"Presence_Key_OnlinePast_desc": "",
|
||||||
|
"Presence_Loading": "",
|
||||||
|
"Presence_Shortcut_AllDevices": "",
|
||||||
|
"Presence_Shortcut_Archived": "",
|
||||||
|
"Presence_Shortcut_Connected": "",
|
||||||
|
"Presence_Shortcut_Devices": "",
|
||||||
|
"Presence_Shortcut_DownAlerts": "",
|
||||||
|
"Presence_Shortcut_Favorites": "",
|
||||||
|
"Presence_Shortcut_NewDevices": "",
|
||||||
|
"Presence_Title": "",
|
||||||
|
"REPORT_DASHBOARD_URL_description": "",
|
||||||
|
"REPORT_DASHBOARD_URL_name": "",
|
||||||
|
"REPORT_ERROR": "",
|
||||||
|
"REPORT_MAIL_description": "",
|
||||||
|
"REPORT_MAIL_name": "",
|
||||||
|
"REPORT_TITLE": "",
|
||||||
|
"RandomMAC_hover": "",
|
||||||
|
"Reports_Sent_Log": "",
|
||||||
|
"SCAN_SUBNETS_description": "",
|
||||||
|
"SCAN_SUBNETS_name": "",
|
||||||
|
"SYSTEM_TITLE": "",
|
||||||
|
"Setting_Override": "",
|
||||||
|
"Setting_Override_Description": "",
|
||||||
|
"Settings_Metadata_Toggle": "",
|
||||||
|
"Settings_Show_Description": "",
|
||||||
|
"Settings_device_Scanners_desync": "",
|
||||||
|
"Settings_device_Scanners_desync_popup": "",
|
||||||
|
"Speedtest_Results": "",
|
||||||
|
"Systeminfo_CPU": "",
|
||||||
|
"Systeminfo_CPU_Cores": "",
|
||||||
|
"Systeminfo_CPU_Name": "",
|
||||||
|
"Systeminfo_CPU_Speed": "",
|
||||||
|
"Systeminfo_CPU_Temp": "",
|
||||||
|
"Systeminfo_CPU_Vendor": "",
|
||||||
|
"Systeminfo_Client_Resolution": "",
|
||||||
|
"Systeminfo_Client_User_Agent": "",
|
||||||
|
"Systeminfo_General": "",
|
||||||
|
"Systeminfo_General_Date": "",
|
||||||
|
"Systeminfo_General_Date2": "",
|
||||||
|
"Systeminfo_General_Full_Date": "",
|
||||||
|
"Systeminfo_General_TimeZone": "",
|
||||||
|
"Systeminfo_Memory": "",
|
||||||
|
"Systeminfo_Memory_Total_Memory": "",
|
||||||
|
"Systeminfo_Memory_Usage": "",
|
||||||
|
"Systeminfo_Memory_Usage_Percent": "",
|
||||||
|
"Systeminfo_Motherboard": "",
|
||||||
|
"Systeminfo_Motherboard_BIOS": "",
|
||||||
|
"Systeminfo_Motherboard_BIOS_Date": "",
|
||||||
|
"Systeminfo_Motherboard_BIOS_Vendor": "",
|
||||||
|
"Systeminfo_Motherboard_Manufactured": "",
|
||||||
|
"Systeminfo_Motherboard_Name": "",
|
||||||
|
"Systeminfo_Motherboard_Revision": "",
|
||||||
|
"Systeminfo_Network": "",
|
||||||
|
"Systeminfo_Network_Accept_Encoding": "",
|
||||||
|
"Systeminfo_Network_Accept_Language": "",
|
||||||
|
"Systeminfo_Network_Connection_Port": "",
|
||||||
|
"Systeminfo_Network_HTTP_Host": "",
|
||||||
|
"Systeminfo_Network_HTTP_Referer": "",
|
||||||
|
"Systeminfo_Network_HTTP_Referer_String": "",
|
||||||
|
"Systeminfo_Network_Hardware": "",
|
||||||
|
"Systeminfo_Network_Hardware_Interface_Mask": "",
|
||||||
|
"Systeminfo_Network_Hardware_Interface_Name": "",
|
||||||
|
"Systeminfo_Network_Hardware_Interface_RX": "",
|
||||||
|
"Systeminfo_Network_Hardware_Interface_TX": "",
|
||||||
|
"Systeminfo_Network_IP": "",
|
||||||
|
"Systeminfo_Network_IP_Connection": "",
|
||||||
|
"Systeminfo_Network_IP_Server": "",
|
||||||
|
"Systeminfo_Network_MIME": "",
|
||||||
|
"Systeminfo_Network_Request_Method": "",
|
||||||
|
"Systeminfo_Network_Request_Time": "",
|
||||||
|
"Systeminfo_Network_Request_URI": "",
|
||||||
|
"Systeminfo_Network_Secure_Connection": "",
|
||||||
|
"Systeminfo_Network_Secure_Connection_String": "",
|
||||||
|
"Systeminfo_Network_Server_Name": "",
|
||||||
|
"Systeminfo_Network_Server_Name_String": "",
|
||||||
|
"Systeminfo_Network_Server_Query": "",
|
||||||
|
"Systeminfo_Network_Server_Query_String": "",
|
||||||
|
"Systeminfo_Network_Server_Version": "",
|
||||||
|
"Systeminfo_Services": "",
|
||||||
|
"Systeminfo_Services_Description": "",
|
||||||
|
"Systeminfo_Services_Name": "",
|
||||||
|
"Systeminfo_Storage": "",
|
||||||
|
"Systeminfo_Storage_Device": "",
|
||||||
|
"Systeminfo_Storage_Mount": "",
|
||||||
|
"Systeminfo_Storage_Size": "",
|
||||||
|
"Systeminfo_Storage_Type": "",
|
||||||
|
"Systeminfo_Storage_Usage": "",
|
||||||
|
"Systeminfo_Storage_Usage_Free": "",
|
||||||
|
"Systeminfo_Storage_Usage_Mount": "",
|
||||||
|
"Systeminfo_Storage_Usage_Total": "",
|
||||||
|
"Systeminfo_Storage_Usage_Used": "",
|
||||||
|
"Systeminfo_System": "",
|
||||||
|
"Systeminfo_System_AVG": "",
|
||||||
|
"Systeminfo_System_Architecture": "",
|
||||||
|
"Systeminfo_System_Kernel": "",
|
||||||
|
"Systeminfo_System_OSVersion": "",
|
||||||
|
"Systeminfo_System_Running_Processes": "",
|
||||||
|
"Systeminfo_System_System": "",
|
||||||
|
"Systeminfo_System_Uname": "",
|
||||||
|
"Systeminfo_System_Uptime": "",
|
||||||
|
"Systeminfo_This_Client": "",
|
||||||
|
"Systeminfo_USB_Devices": "",
|
||||||
|
"TICKER_MIGRATE_TO_NETALERTX": "",
|
||||||
|
"TIMEZONE_description": "",
|
||||||
|
"TIMEZONE_name": "",
|
||||||
|
"UI_DEV_SECTIONS_description": "",
|
||||||
|
"UI_DEV_SECTIONS_name": "",
|
||||||
|
"UI_ICONS_description": "",
|
||||||
|
"UI_ICONS_name": "",
|
||||||
|
"UI_LANG_description": "",
|
||||||
|
"UI_LANG_name": "",
|
||||||
|
"UI_MY_DEVICES_description": "",
|
||||||
|
"UI_MY_DEVICES_name": "",
|
||||||
|
"UI_NOT_RANDOM_MAC_description": "",
|
||||||
|
"UI_NOT_RANDOM_MAC_name": "",
|
||||||
|
"UI_PRESENCE_description": "",
|
||||||
|
"UI_PRESENCE_name": "",
|
||||||
|
"UI_REFRESH_description": "",
|
||||||
|
"UI_REFRESH_name": "",
|
||||||
|
"VERSION_description": "",
|
||||||
|
"VERSION_name": "",
|
||||||
|
"devices_old": "",
|
||||||
|
"general_event_description": "",
|
||||||
|
"general_event_title": "",
|
||||||
|
"report_guid": "",
|
||||||
|
"report_guid_missing": "",
|
||||||
|
"report_select_format": "",
|
||||||
|
"report_time": "",
|
||||||
|
"run_event_icon": "",
|
||||||
|
"run_event_tooltip": "",
|
||||||
|
"settings_core_icon": "",
|
||||||
|
"settings_core_label": "",
|
||||||
|
"settings_device_scanners": "",
|
||||||
|
"settings_device_scanners_icon": "",
|
||||||
|
"settings_device_scanners_info": "",
|
||||||
|
"settings_device_scanners_label": "",
|
||||||
|
"settings_enabled": "",
|
||||||
|
"settings_enabled_icon": "",
|
||||||
|
"settings_expand_all": "",
|
||||||
|
"settings_imported": "",
|
||||||
|
"settings_imported_label": "",
|
||||||
|
"settings_missing": "",
|
||||||
|
"settings_missing_block": "",
|
||||||
|
"settings_old": "",
|
||||||
|
"settings_other_scanners": "",
|
||||||
|
"settings_other_scanners_icon": "",
|
||||||
|
"settings_other_scanners_label": "",
|
||||||
|
"settings_publishers": "",
|
||||||
|
"settings_publishers_icon": "",
|
||||||
|
"settings_publishers_info": "",
|
||||||
|
"settings_publishers_label": "",
|
||||||
|
"settings_saved": "",
|
||||||
|
"settings_system_icon": "",
|
||||||
|
"settings_system_label": "",
|
||||||
|
"settings_update_item_warning": "",
|
||||||
|
"test_event_icon": "",
|
||||||
|
"test_event_tooltip": ""
|
||||||
|
}
|
||||||
@@ -56,6 +56,8 @@
|
|||||||
"BackDevices_Restore_okay": "",
|
"BackDevices_Restore_okay": "",
|
||||||
"BackDevices_darkmode_disabled": "",
|
"BackDevices_darkmode_disabled": "",
|
||||||
"BackDevices_darkmode_enabled": "",
|
"BackDevices_darkmode_enabled": "",
|
||||||
|
"CLEAR_NEW_FLAG_description": "",
|
||||||
|
"CLEAR_NEW_FLAG_name": "",
|
||||||
"DAYS_TO_KEEP_EVENTS_description": "",
|
"DAYS_TO_KEEP_EVENTS_description": "",
|
||||||
"DAYS_TO_KEEP_EVENTS_name": "",
|
"DAYS_TO_KEEP_EVENTS_name": "",
|
||||||
"DevDetail_Copy_Device_Title": "",
|
"DevDetail_Copy_Device_Title": "",
|
||||||
@@ -215,6 +217,7 @@
|
|||||||
"Device_TableHead_RowID": "",
|
"Device_TableHead_RowID": "",
|
||||||
"Device_TableHead_Rowid": "",
|
"Device_TableHead_Rowid": "",
|
||||||
"Device_TableHead_SSID": "",
|
"Device_TableHead_SSID": "",
|
||||||
|
"Device_TableHead_SourcePlugin": "",
|
||||||
"Device_TableHead_Status": "",
|
"Device_TableHead_Status": "",
|
||||||
"Device_TableHead_SyncHubNodeName": "",
|
"Device_TableHead_SyncHubNodeName": "",
|
||||||
"Device_TableHead_Type": "",
|
"Device_TableHead_Type": "",
|
||||||
@@ -274,12 +277,15 @@
|
|||||||
"Gen_AreYouSure": "",
|
"Gen_AreYouSure": "",
|
||||||
"Gen_Backup": "",
|
"Gen_Backup": "",
|
||||||
"Gen_Cancel": "",
|
"Gen_Cancel": "",
|
||||||
|
"Gen_Change": "",
|
||||||
"Gen_Copy": "",
|
"Gen_Copy": "",
|
||||||
"Gen_DataUpdatedUITakesTime": "",
|
"Gen_DataUpdatedUITakesTime": "",
|
||||||
"Gen_Delete": "",
|
"Gen_Delete": "",
|
||||||
"Gen_DeleteAll": "",
|
"Gen_DeleteAll": "",
|
||||||
|
"Gen_Description": "",
|
||||||
"Gen_Error": "",
|
"Gen_Error": "",
|
||||||
"Gen_Filter": "",
|
"Gen_Filter": "",
|
||||||
|
"Gen_Generate": "",
|
||||||
"Gen_LockedDB": "",
|
"Gen_LockedDB": "",
|
||||||
"Gen_Offline": "",
|
"Gen_Offline": "",
|
||||||
"Gen_Okay": "",
|
"Gen_Okay": "",
|
||||||
@@ -292,6 +298,7 @@
|
|||||||
"Gen_Save": "",
|
"Gen_Save": "",
|
||||||
"Gen_Saved": "",
|
"Gen_Saved": "",
|
||||||
"Gen_Search": "",
|
"Gen_Search": "",
|
||||||
|
"Gen_SelectToPreview": "",
|
||||||
"Gen_Selected_Devices": "",
|
"Gen_Selected_Devices": "",
|
||||||
"Gen_Switch": "",
|
"Gen_Switch": "",
|
||||||
"Gen_Upd": "",
|
"Gen_Upd": "",
|
||||||
@@ -304,6 +311,8 @@
|
|||||||
"General_icon": "",
|
"General_icon": "",
|
||||||
"HRS_TO_KEEP_NEWDEV_description": "",
|
"HRS_TO_KEEP_NEWDEV_description": "",
|
||||||
"HRS_TO_KEEP_NEWDEV_name": "",
|
"HRS_TO_KEEP_NEWDEV_name": "",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_description": "",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_name": "",
|
||||||
"HelpFAQ_Cat_Detail": "",
|
"HelpFAQ_Cat_Detail": "",
|
||||||
"HelpFAQ_Cat_Detail_300_head": "",
|
"HelpFAQ_Cat_Detail_300_head": "",
|
||||||
"HelpFAQ_Cat_Detail_300_text_a": "",
|
"HelpFAQ_Cat_Detail_300_text_a": "",
|
||||||
@@ -347,6 +356,7 @@
|
|||||||
"Loading": "",
|
"Loading": "",
|
||||||
"Login_Box": "",
|
"Login_Box": "",
|
||||||
"Login_Default_PWD": "",
|
"Login_Default_PWD": "",
|
||||||
|
"Login_Info": "",
|
||||||
"Login_Psw-box": "",
|
"Login_Psw-box": "",
|
||||||
"Login_Psw_alert": "",
|
"Login_Psw_alert": "",
|
||||||
"Login_Psw_folder": "",
|
"Login_Psw_folder": "",
|
||||||
@@ -527,6 +537,7 @@
|
|||||||
"Plugins_DeleteAll": "",
|
"Plugins_DeleteAll": "",
|
||||||
"Plugins_Filters_Mac": "",
|
"Plugins_Filters_Mac": "",
|
||||||
"Plugins_History": "",
|
"Plugins_History": "",
|
||||||
|
"Plugins_Obj_DeleteListed": "",
|
||||||
"Plugins_Objects": "",
|
"Plugins_Objects": "",
|
||||||
"Plugins_Out_of": "",
|
"Plugins_Out_of": "",
|
||||||
"Plugins_Unprocessed_Events": "",
|
"Plugins_Unprocessed_Events": "",
|
||||||
@@ -538,6 +549,12 @@
|
|||||||
"Presence_CalHead_week": "",
|
"Presence_CalHead_week": "",
|
||||||
"Presence_CalHead_year": "",
|
"Presence_CalHead_year": "",
|
||||||
"Presence_CallHead_Devices": "",
|
"Presence_CallHead_Devices": "",
|
||||||
|
"Presence_Key_OnlineNow": "",
|
||||||
|
"Presence_Key_OnlineNow_desc": "",
|
||||||
|
"Presence_Key_OnlinePast": "",
|
||||||
|
"Presence_Key_OnlinePastMiss": "",
|
||||||
|
"Presence_Key_OnlinePastMiss_desc": "",
|
||||||
|
"Presence_Key_OnlinePast_desc": "",
|
||||||
"Presence_Loading": "",
|
"Presence_Loading": "",
|
||||||
"Presence_Shortcut_AllDevices": "",
|
"Presence_Shortcut_AllDevices": "",
|
||||||
"Presence_Shortcut_Archived": "",
|
"Presence_Shortcut_Archived": "",
|
||||||
@@ -556,10 +573,12 @@
|
|||||||
"RandomMAC_hover": "",
|
"RandomMAC_hover": "",
|
||||||
"Reports_Sent_Log": "",
|
"Reports_Sent_Log": "",
|
||||||
"SCAN_SUBNETS_description": "",
|
"SCAN_SUBNETS_description": "",
|
||||||
|
"SCAN_SUBNETS_name": "",
|
||||||
"SYSTEM_TITLE": "",
|
"SYSTEM_TITLE": "",
|
||||||
"Setting_Override": "",
|
"Setting_Override": "",
|
||||||
"Setting_Override_Description": "",
|
"Setting_Override_Description": "",
|
||||||
"Settings_Metadata_Toggle": "",
|
"Settings_Metadata_Toggle": "",
|
||||||
|
"Settings_Show_Description": "",
|
||||||
"Settings_device_Scanners_desync": "",
|
"Settings_device_Scanners_desync": "",
|
||||||
"Settings_device_Scanners_desync_popup": "",
|
"Settings_device_Scanners_desync_popup": "",
|
||||||
"Speedtest_Results": "",
|
"Speedtest_Results": "",
|
||||||
@@ -654,6 +673,8 @@
|
|||||||
"UI_PRESENCE_name": "",
|
"UI_PRESENCE_name": "",
|
||||||
"UI_REFRESH_description": "",
|
"UI_REFRESH_description": "",
|
||||||
"UI_REFRESH_name": "",
|
"UI_REFRESH_name": "",
|
||||||
|
"VERSION_description": "",
|
||||||
|
"VERSION_name": "",
|
||||||
"devices_old": "",
|
"devices_old": "",
|
||||||
"general_event_description": "",
|
"general_event_description": "",
|
||||||
"general_event_title": "",
|
"general_event_title": "",
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
"APPRISE_SIZE_name": "Max payload size",
|
"APPRISE_SIZE_name": "Max payload size",
|
||||||
"APPRISE_URL_description": "Apprise notification target URL. For example for Telegram it would be <code>tgram://{bot_token}/{chat_id}</code>.",
|
"APPRISE_URL_description": "Apprise notification target URL. For example for Telegram it would be <code>tgram://{bot_token}/{chat_id}</code>.",
|
||||||
"APPRISE_URL_name": "Apprise notification URL",
|
"APPRISE_URL_name": "Apprise notification URL",
|
||||||
"About_Design": "Designed for:",
|
"About_Design": "Entworfen für:",
|
||||||
"About_Exit": "Abmelden",
|
"About_Exit": "Abmelden",
|
||||||
"About_Title": "Netzwerksicherheitsscanner und Benachrichtigungsframework",
|
"About_Title": "Netzwerksicherheitsscanner und Benachrichtigungsframework",
|
||||||
"AppEvents_DateTimeCreated": "protokolliert",
|
"AppEvents_DateTimeCreated": "protokolliert",
|
||||||
@@ -27,51 +27,53 @@
|
|||||||
"AppEvents_ObjectPlugin": "Verknüpfte Plugins",
|
"AppEvents_ObjectPlugin": "Verknüpfte Plugins",
|
||||||
"AppEvents_ObjectPrimaryID": "Primär ID",
|
"AppEvents_ObjectPrimaryID": "Primär ID",
|
||||||
"AppEvents_ObjectSecondaryID": "Sekundär ID",
|
"AppEvents_ObjectSecondaryID": "Sekundär ID",
|
||||||
"AppEvents_ObjectStatus": "",
|
"AppEvents_ObjectStatus": "Status (zum Log-Zeitpunkt)",
|
||||||
"AppEvents_ObjectStatusColumn": "Statusspalte",
|
"AppEvents_ObjectStatusColumn": "Statusspalte",
|
||||||
"AppEvents_ObjectType": "Objekttyp",
|
"AppEvents_ObjectType": "Objekttyp",
|
||||||
"AppEvents_Plugin": "Plugin",
|
"AppEvents_Plugin": "Plugin",
|
||||||
"AppEvents_Type": "Typ",
|
"AppEvents_Type": "Typ",
|
||||||
"Apprise_display_name": "Apprise",
|
"Apprise_display_name": "Apprise",
|
||||||
"Apprise_icon": "<i class=\"fa fa-bullhorn\"></i>",
|
"Apprise_icon": "<i class=\"fa fa-bullhorn\"></i>",
|
||||||
"BackDevDetail_Actions_Ask_Run": "Do you want to execute the action?",
|
"BackDevDetail_Actions_Ask_Run": "Möchtest du die Aktion ausführen?",
|
||||||
"BackDevDetail_Actions_Not_Registered": "Action not registered: ",
|
"BackDevDetail_Actions_Not_Registered": "Aktion nicht registriert: ",
|
||||||
"BackDevDetail_Actions_Title_Run": "Run action",
|
"BackDevDetail_Actions_Title_Run": "Aktion ausführen",
|
||||||
"BackDevDetail_Copy_Ask": "Copy details from device from the dropdown list (Everything on this page will be overwritten)?",
|
"BackDevDetail_Copy_Ask": "Details vom Gerät aus der Dropdown-Liste kopieren (alles auf dieser Seite wird überschrieben)?",
|
||||||
"BackDevDetail_Copy_Title": "Copy details",
|
"BackDevDetail_Copy_Title": "Details kopieren",
|
||||||
"BackDevDetail_Tools_WOL_error": "Befehl wurde NICHT ausgeführt.",
|
"BackDevDetail_Tools_WOL_error": "Befehl wurde NICHT ausgeführt.",
|
||||||
"BackDevDetail_Tools_WOL_okay": "Befehl wurde ausgeführt.",
|
"BackDevDetail_Tools_WOL_okay": "Der Befehl wurde ausgeführt.",
|
||||||
"BackDevices_Arpscan_disabled": "Automatischer Arp-Scan deaktiviert.",
|
"BackDevices_Arpscan_disabled": "Arp-Scan deaktiviert",
|
||||||
"BackDevices_Arpscan_enabled": "Automatischer Arp-Scan aktiviert.",
|
"BackDevices_Arpscan_enabled": "Arp-Scan aktiviert",
|
||||||
"BackDevices_Backup_CopError": "Die originale Datenbank konnte nicht gesichert werden.",
|
"BackDevices_Backup_CopError": "Die originale Datenbank konnte nicht gesichert werden.",
|
||||||
"BackDevices_Backup_Failed": "Das Backup wurde teilweise ausgeführt. Das Archiv ist entweder leer oder nicht vorhanden.",
|
"BackDevices_Backup_Failed": "Das Backup wurde teilweise ausgeführt. Das Archiv ist entweder leer oder nicht vorhanden.",
|
||||||
"BackDevices_Backup_okay": "Das Backup wurde erfolgreich beendet.",
|
"BackDevices_Backup_okay": "Die Sicherung wurde erfolgreich mit dem neuen Archiv ausgeführt",
|
||||||
"BackDevices_DBTools_DelActHistory": "Die Anzeige der Netzwerkaktivität wurde zurückgesetzt.",
|
"BackDevices_DBTools_DelActHistory": "Die Anzeige der Netzwerkaktivität wurde zurückgesetzt.",
|
||||||
"BackDevices_DBTools_DelActHistoryError": "Fehler beim Zurücksetzen der Netzwerkaktivitätsanzeige.",
|
"BackDevices_DBTools_DelActHistoryError": "Fehler beim Zurücksetzen der Netzwerkaktivitätsanzeige.",
|
||||||
"BackDevices_DBTools_DelDevError_a": "Fehler beim Löschen des Gerätes.",
|
"BackDevices_DBTools_DelDevError_a": "Fehler beim Löschen des Gerätes",
|
||||||
"BackDevices_DBTools_DelDevError_b": "Fehler beim Löschen der Geräte.",
|
"BackDevices_DBTools_DelDevError_b": "Fehler beim Löschen der Geräte",
|
||||||
"BackDevices_DBTools_DelDev_a": "Gerät gelöscht.",
|
"BackDevices_DBTools_DelDev_a": "Gerät wurde gelöscht",
|
||||||
"BackDevices_DBTools_DelDev_b": "Geräte gelöscht.",
|
"BackDevices_DBTools_DelDev_b": "Geräte wurden gelöscht",
|
||||||
"BackDevices_DBTools_DelEvents": "Events gelöscht.",
|
"BackDevices_DBTools_DelEvents": "Events wurden gelöscht",
|
||||||
"BackDevices_DBTools_DelEventsError": "Fehler beim Löschen der Ereignisse.",
|
"BackDevices_DBTools_DelEventsError": "Fehler beim Löschen der Ereignisse",
|
||||||
"BackDevices_DBTools_ImportCSV": "Die Geräte aus der CSV-Datei wurden erfolgreich importiert.",
|
"BackDevices_DBTools_ImportCSV": "Die Geräte aus der CSV-Datei wurden erfolgreich importiert.",
|
||||||
"BackDevices_DBTools_ImportCSVError": "Die CSV-Datei konnte nicht importiert werden. Stellen Sie sicher, dass das Format korrekt ist.",
|
"BackDevices_DBTools_ImportCSVError": "Die CSV-Datei konnte nicht importiert werden. Stellen Sie sicher, dass das Format korrekt ist.",
|
||||||
"BackDevices_DBTools_ImportCSVMissing": "Die CSV-Datei konnte nicht in <b>/config/devices.csv</b> gefunden werden.",
|
"BackDevices_DBTools_ImportCSVMissing": "Die CSV-Datei konnte nicht in <b>/config/devices.csv</b> gefunden werden.",
|
||||||
"BackDevices_DBTools_Purge": "Die ältesten Backups wurden gelöscht.",
|
"BackDevices_DBTools_Purge": "Die ältesten Backups wurden gelöscht",
|
||||||
"BackDevices_DBTools_UpdDev": "Gerät erfolgreich aktualisiert.",
|
"BackDevices_DBTools_UpdDev": "Gerät wurde erfolgreich aktualisiert",
|
||||||
"BackDevices_DBTools_UpdDevError": "Fehler beim Aktualisieren des Gerätes.",
|
"BackDevices_DBTools_UpdDevError": "Fehler beim Aktualisieren des Gerätes",
|
||||||
"BackDevices_DBTools_Upgrade": "Datenbank erfolgreich aktualisiert.",
|
"BackDevices_DBTools_Upgrade": "Datenbank wurde erfolgreich aktualisiert",
|
||||||
"BackDevices_DBTools_UpgradeError": "Fehler beim Aktualisieren der Datenbank.",
|
"BackDevices_DBTools_UpgradeError": "Fehler beim Aktualisieren der Datenbank",
|
||||||
"BackDevices_Device_UpdDevError": "Konnte Geräte nicht aktualisieren, versuchen Sie es später erneut. Die Datenbank ist wahrscheinlich wegen einer laufenden Aufgabe gesperrt.",
|
"BackDevices_Device_UpdDevError": "Konnte Geräte nicht aktualisieren, versuchen Sie es später erneut. Die Datenbank ist wahrscheinlich wegen einer laufenden Aufgabe gesperrt.",
|
||||||
"BackDevices_Restore_CopError": "Die originale Datenbank konnte nicht kopiert werden.",
|
"BackDevices_Restore_CopError": "Die originale Datenbank konnte nicht kopiert werden.",
|
||||||
"BackDevices_Restore_Failed": "Die Wiederherstellung ist fehlgeschlagen. Stellen Sie das Backup manuell her.",
|
"BackDevices_Restore_Failed": "Die Wiederherstellung ist fehlgeschlagen. Stellen Sie das Backup manuell her.",
|
||||||
"BackDevices_Restore_okay": "Die Wiederherstellung wurde erfolgreich ausgeführt.",
|
"BackDevices_Restore_okay": "Die Wiederherstellung wurde erfolgreich ausgeführt.",
|
||||||
"BackDevices_darkmode_disabled": "Heller Modus aktiviert.",
|
"BackDevices_darkmode_disabled": "Heller Modus aktiviert",
|
||||||
"BackDevices_darkmode_enabled": "Dunkler Modus aktiviert.",
|
"BackDevices_darkmode_enabled": "Dunkler Modus aktiviert",
|
||||||
|
"CLEAR_NEW_FLAG_description": "",
|
||||||
|
"CLEAR_NEW_FLAG_name": "Neues Flag löschen",
|
||||||
"DAYS_TO_KEEP_EVENTS_description": "Dies ist eine Wartungseinstellung. Spezifiziert wie viele Tage Events gespeichert bleiben. Alle älteren Events werden periodisch gelöscht. Wird auch auf die Plugins History angewendet.",
|
"DAYS_TO_KEEP_EVENTS_description": "Dies ist eine Wartungseinstellung. Spezifiziert wie viele Tage Events gespeichert bleiben. Alle älteren Events werden periodisch gelöscht. Wird auch auf die Plugins History angewendet.",
|
||||||
"DAYS_TO_KEEP_EVENTS_name": "Lösche Events älter als",
|
"DAYS_TO_KEEP_EVENTS_name": "Lösche Events älter als",
|
||||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Details von Gerät kopieren",
|
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Details von Gerät kopieren",
|
||||||
"DevDetail_Copy_Device_Tooltip": "Copy details from device from the dropdown list. Everything on this page will be overwritten",
|
"DevDetail_Copy_Device_Tooltip": "Details vom Gerät aus der Dropdown-Liste kopieren. Alles auf dieser Seite wird überschrieben",
|
||||||
"DevDetail_EveandAl_AlertAllEvents": "Melde alle Ereignisse",
|
"DevDetail_EveandAl_AlertAllEvents": "Melde alle Ereignisse",
|
||||||
"DevDetail_EveandAl_AlertDown": "Melde Down",
|
"DevDetail_EveandAl_AlertDown": "Melde Down",
|
||||||
"DevDetail_EveandAl_Archived": "Archivierung",
|
"DevDetail_EveandAl_Archived": "Archivierung",
|
||||||
@@ -84,9 +86,9 @@
|
|||||||
"DevDetail_EveandAl_Skip": "pausiere wiederhol. Meldungen für",
|
"DevDetail_EveandAl_Skip": "pausiere wiederhol. Meldungen für",
|
||||||
"DevDetail_EveandAl_Title": "Ereignisse & Alarme einstellen",
|
"DevDetail_EveandAl_Title": "Ereignisse & Alarme einstellen",
|
||||||
"DevDetail_Events_CheckBox": "Blende Verbindungs-Ereignisse aus",
|
"DevDetail_Events_CheckBox": "Blende Verbindungs-Ereignisse aus",
|
||||||
"DevDetail_GoToNetworkNode": "Navigate to the Network page of the given node.",
|
"DevDetail_GoToNetworkNode": "Zur Netzwerkseite des angegebenen Knotens navigieren.",
|
||||||
"DevDetail_Icon": "Icon",
|
"DevDetail_Icon": "Icon",
|
||||||
"DevDetail_Icon_Descr": "Enter a font awesome icon name without the fa- prefix or with complete class, e.g.: fa fa-brands fa-apple.",
|
"DevDetail_Icon_Descr": "",
|
||||||
"DevDetail_Loading": "Laden ...",
|
"DevDetail_Loading": "Laden ...",
|
||||||
"DevDetail_MainInfo_Comments": "Notiz",
|
"DevDetail_MainInfo_Comments": "Notiz",
|
||||||
"DevDetail_MainInfo_Favorite": "Favorit",
|
"DevDetail_MainInfo_Favorite": "Favorit",
|
||||||
@@ -95,7 +97,7 @@
|
|||||||
"DevDetail_MainInfo_Name": "Name",
|
"DevDetail_MainInfo_Name": "Name",
|
||||||
"DevDetail_MainInfo_Network": "<i class=\"fa fa-server\"></i> Knoten (MAC)",
|
"DevDetail_MainInfo_Network": "<i class=\"fa fa-server\"></i> Knoten (MAC)",
|
||||||
"DevDetail_MainInfo_Network_Port": "<i class=\"fa fa-ethernet\"></i> Port",
|
"DevDetail_MainInfo_Network_Port": "<i class=\"fa fa-ethernet\"></i> Port",
|
||||||
"DevDetail_MainInfo_Network_Site": "",
|
"DevDetail_MainInfo_Network_Site": "Seite",
|
||||||
"DevDetail_MainInfo_Network_Title": "<i class=\"fa fa-network-wired\"></i> Network",
|
"DevDetail_MainInfo_Network_Title": "<i class=\"fa fa-network-wired\"></i> Network",
|
||||||
"DevDetail_MainInfo_Owner": "Eigen­tümer",
|
"DevDetail_MainInfo_Owner": "Eigen­tümer",
|
||||||
"DevDetail_MainInfo_SSID": "SSID",
|
"DevDetail_MainInfo_SSID": "SSID",
|
||||||
@@ -104,9 +106,9 @@
|
|||||||
"DevDetail_MainInfo_Vendor": "Hersteller",
|
"DevDetail_MainInfo_Vendor": "Hersteller",
|
||||||
"DevDetail_MainInfo_mac": "MAC",
|
"DevDetail_MainInfo_mac": "MAC",
|
||||||
"DevDetail_Network_Node_hover": "Wählen Sie das Elternnetzgerät aus, an das das aktuelle Gerät angeschlossen ist, um den Netzwerkbaum zu erstellen.",
|
"DevDetail_Network_Node_hover": "Wählen Sie das Elternnetzgerät aus, an das das aktuelle Gerät angeschlossen ist, um den Netzwerkbaum zu erstellen.",
|
||||||
"DevDetail_Network_Port_hover": "The port this device is connected to on the parent network device. If left empty a wifi icon is displayed in the Network tree.",
|
"DevDetail_Network_Port_hover": "Der Port, mit dem dieses Gerät am übergeordneten Netzwerkgerät verbunden ist. Bleibt er leer, wird ein WLAN-Symbol in der Netzwerkstruktur angezeigt.",
|
||||||
"DevDetail_Nmap_Scans": "Nmap Scans",
|
"DevDetail_Nmap_Scans": "Nmap Scans",
|
||||||
"DevDetail_Nmap_Scans_desc": "Hier kannst du manuelle NMAP Scans starten. Reguläre automatische NMAP Scans können mit dem Services & Ports (NMAP) Plugin geplant werden. Gehe zu den <a href='/settings.php' target='_blank'>Einstellungen</a> um mehr herauszufinden.",
|
"DevDetail_Nmap_Scans_desc": "Hier kannst du manuelle NMAP Scans starten. Reguläre automatische NMAP Scans können mit dem Services & Ports (NMAP) Plugin geplant werden. Gehe zu den <a href='/settings.php' target='_blank'>Einstellungen</a> um erfahren",
|
||||||
"DevDetail_Nmap_buttonDefault": "Standard Scan",
|
"DevDetail_Nmap_buttonDefault": "Standard Scan",
|
||||||
"DevDetail_Nmap_buttonDefault_text": "Standard Scan: Nmap scannt die ersten 1.000 Ports für jedes angeforderte Scan-Protokoll. Damit werden etwa 93 % der TCP-Ports und 49 % der UDP-Ports erfasst. (ca. 5-10 Sekunden)",
|
"DevDetail_Nmap_buttonDefault_text": "Standard Scan: Nmap scannt die ersten 1.000 Ports für jedes angeforderte Scan-Protokoll. Damit werden etwa 93 % der TCP-Ports und 49 % der UDP-Ports erfasst. (ca. 5-10 Sekunden)",
|
||||||
"DevDetail_Nmap_buttonDetail": "Detailierter Scan",
|
"DevDetail_Nmap_buttonDetail": "Detailierter Scan",
|
||||||
@@ -114,7 +116,7 @@
|
|||||||
"DevDetail_Nmap_buttonFast": "Schneller Scan",
|
"DevDetail_Nmap_buttonFast": "Schneller Scan",
|
||||||
"DevDetail_Nmap_buttonFast_text": "Schneller Scan: Überprüft nur die wichtigsten 100 Ports (wenige Sekunden)",
|
"DevDetail_Nmap_buttonFast_text": "Schneller Scan: Überprüft nur die wichtigsten 100 Ports (wenige Sekunden)",
|
||||||
"DevDetail_Nmap_buttonSkipDiscovery": "Ohne Erreichbarkeitsprüfung",
|
"DevDetail_Nmap_buttonSkipDiscovery": "Ohne Erreichbarkeitsprüfung",
|
||||||
"DevDetail_Nmap_buttonSkipDiscovery_text": "Ohne Erreichbarkeitsprüfung (-Pn Parameter): Standard Scan bei dem nmap annimmt, dass der Host erreichbar ist.",
|
"DevDetail_Nmap_buttonSkipDiscovery_text": "Ohne Erreichbarkeitsprüfung (-Pn Parameter): Standard Scan, bei dem nmap annimmt, dass der Host erreichbar ist",
|
||||||
"DevDetail_Nmap_resultsLink": "Nachdem ein Scan gestartet wurde, kann diese Seite verlassen werden. Resultate sind auch in der Datei <code>app_front.log</code> verfügbar.",
|
"DevDetail_Nmap_resultsLink": "Nachdem ein Scan gestartet wurde, kann diese Seite verlassen werden. Resultate sind auch in der Datei <code>app_front.log</code> verfügbar.",
|
||||||
"DevDetail_Owner_hover": "Der Eigentümer des Gerätes. Freies Textfeld.",
|
"DevDetail_Owner_hover": "Der Eigentümer des Gerätes. Freies Textfeld.",
|
||||||
"DevDetail_Periodselect_All": "Alle Infos",
|
"DevDetail_Periodselect_All": "Alle Infos",
|
||||||
@@ -135,7 +137,7 @@
|
|||||||
"DevDetail_SessionTable_Disconnection": "Trennung",
|
"DevDetail_SessionTable_Disconnection": "Trennung",
|
||||||
"DevDetail_SessionTable_Duration": "Dauer",
|
"DevDetail_SessionTable_Duration": "Dauer",
|
||||||
"DevDetail_SessionTable_IP": "IP",
|
"DevDetail_SessionTable_IP": "IP",
|
||||||
"DevDetail_SessionTable_Order": "Order",
|
"DevDetail_SessionTable_Order": "Reihenfolge",
|
||||||
"DevDetail_Shortcut_CurrentStatus": "aktueller Status",
|
"DevDetail_Shortcut_CurrentStatus": "aktueller Status",
|
||||||
"DevDetail_Shortcut_DownAlerts": "Down Meldungen",
|
"DevDetail_Shortcut_DownAlerts": "Down Meldungen",
|
||||||
"DevDetail_Shortcut_Presence": "Anwesenheit",
|
"DevDetail_Shortcut_Presence": "Anwesenheit",
|
||||||
@@ -159,12 +161,12 @@
|
|||||||
"DevDetail_Tab_Plugins": "<i class=\"fa fa-plug\"></i> Plugins",
|
"DevDetail_Tab_Plugins": "<i class=\"fa fa-plug\"></i> Plugins",
|
||||||
"DevDetail_Tab_Presence": "<i class=\"fa fa-calendar\"></i> Anwesenheit",
|
"DevDetail_Tab_Presence": "<i class=\"fa fa-calendar\"></i> Anwesenheit",
|
||||||
"DevDetail_Tab_Sessions": "<i class=\"fa fa-list-ol\"></i> Sitzungen",
|
"DevDetail_Tab_Sessions": "<i class=\"fa fa-list-ol\"></i> Sitzungen",
|
||||||
"DevDetail_Tab_Tools": "<i class=\"fa fa-screwdriver-wrench\"></i> Tools",
|
"DevDetail_Tab_Tools": "<i class=\"fa fa-screwdriver-wrench\"></i> Werkzeuge",
|
||||||
"DevDetail_Tab_Tools_Internet_Info_Description": "Das Internet-Info-Tool zeigt Informationen über die Internetverbindung an, wie z. B. IP-Adresse, Stadt, Land, Ortsvorwahl und Zeitzone.",
|
"DevDetail_Tab_Tools_Internet_Info_Description": "Das Internet-Info-Tool zeigt Informationen über die Internetverbindung an, wie z. B. IP-Adresse, Stadt, Land, Ortsvorwahl und Zeitzone.",
|
||||||
"DevDetail_Tab_Tools_Internet_Info_Error": "Es ist ein Fehler aufgetreten",
|
"DevDetail_Tab_Tools_Internet_Info_Error": "Es ist ein Fehler aufgetreten",
|
||||||
"DevDetail_Tab_Tools_Internet_Info_Start": "Internet-Info starten",
|
"DevDetail_Tab_Tools_Internet_Info_Start": "Internet-Info starten",
|
||||||
"DevDetail_Tab_Tools_Internet_Info_Title": "Internetinformationen",
|
"DevDetail_Tab_Tools_Internet_Info_Title": "Internetinformationen",
|
||||||
"DevDetail_Tab_Tools_Nslookup_Description": "Nslookup ist ein Befehlszeilentool zur Abfrage des Domain Name System (DNS). DNS ist ein System, das Domainnamen wie www.google.com in IP-Adressen wie 172.217.0.142 übersetzt. ",
|
"DevDetail_Tab_Tools_Nslookup_Description": "Nslookup ist ein Befehlszeilentool zur Abfrage des Domain Name System (DNS). DNS ist ein System, das Domainnamen wie www.google.com in IP-Adressen wie 172.217.0.142 übersetzt.",
|
||||||
"DevDetail_Tab_Tools_Nslookup_Error": "Fehler: IP-Adresse ist ungültig",
|
"DevDetail_Tab_Tools_Nslookup_Error": "Fehler: IP-Adresse ist ungültig",
|
||||||
"DevDetail_Tab_Tools_Nslookup_Start": "Nslookup starten",
|
"DevDetail_Tab_Tools_Nslookup_Start": "Nslookup starten",
|
||||||
"DevDetail_Tab_Tools_Nslookup_Title": "Nslookup",
|
"DevDetail_Tab_Tools_Nslookup_Title": "Nslookup",
|
||||||
@@ -179,24 +181,24 @@
|
|||||||
"DevDetail_Tools_WOL_noti": "Wake-on-LAN",
|
"DevDetail_Tools_WOL_noti": "Wake-on-LAN",
|
||||||
"DevDetail_Tools_WOL_noti_text": "Der Wake-on-LAN Befehl wurde and die Broadcast Adresse gesendet. Wenn sich das zu startende Gerät nicht im gleichen Subnet / VLan wie NetAlertX befindet, wird das Gerät nicht reagieren.",
|
"DevDetail_Tools_WOL_noti_text": "Der Wake-on-LAN Befehl wurde and die Broadcast Adresse gesendet. Wenn sich das zu startende Gerät nicht im gleichen Subnet / VLan wie NetAlertX befindet, wird das Gerät nicht reagieren.",
|
||||||
"DevDetail_Type_hover": "Der Type des Gerätes. If you select any of the pre-defined network devices (e.g.: AP, Firewall, Router, Switch...) they will show up in the Network tree configuration as possible parent network nodes.",
|
"DevDetail_Type_hover": "Der Type des Gerätes. If you select any of the pre-defined network devices (e.g.: AP, Firewall, Router, Switch...) they will show up in the Network tree configuration as possible parent network nodes.",
|
||||||
"DevDetail_Vendor_hover": "Vendor should be auto-detected. You can overwrite or add your custom value.",
|
"DevDetail_Vendor_hover": "Der Anbieter sollte automatisch erkannt werden. Du kannst den Wert überschreiben oder deinen eigenen Wert hinzufügen.",
|
||||||
"DevDetail_WOL_Title": "<i class=\"fa fa-power-off\"></i> Wake-on-LAN",
|
"DevDetail_WOL_Title": "<i class=\"fa fa-power-off\"></i> Wake-on-LAN",
|
||||||
"DevDetail_button_AddIcon": "Neues Symbol Hinzufügen",
|
"DevDetail_button_AddIcon": "Neues Symbol Hinzufügen",
|
||||||
"DevDetail_button_AddIcon_Help": "Füge ein HTML SVG Tag oder Font Awesome HTML Tag ein. Siehe <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">Icon Dokumentation</a> für details.",
|
"DevDetail_button_AddIcon_Help": "Füge ein HTML SVG Tag oder Font Awesome HTML Tag ein. Siehe <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">Icon Dokumentation</a> für details.",
|
||||||
"DevDetail_button_AddIcon_Tooltip": "Neues Icon zu diesem Gerät hinzufügen, welches es noch nicht im dropdown gibt.",
|
"DevDetail_button_AddIcon_Tooltip": "Neues Icon zu diesem Gerät hinzufügen, welches es noch nicht im dropdown gibt.",
|
||||||
"DevDetail_button_Delete": "Lösche Gerät",
|
"DevDetail_button_Delete": "Gerät löschen",
|
||||||
"DevDetail_button_DeleteEvents": "Lösche Events",
|
"DevDetail_button_DeleteEvents": "Ereignisse löschen",
|
||||||
"DevDetail_button_DeleteEvents_Warning": "Sind Sie sicher, dass Sie alle Ereignisse dieses Geräts löschen möchten? (dies löscht den Ereignisverlauf und die Sitzungen und könnte bei ständigen (anhaltenden) Benachrichtigungen helfen)",
|
"DevDetail_button_DeleteEvents_Warning": "Sind Sie sicher, dass Sie alle Ereignisse dieses Geräts löschen möchten? (dies löscht den Ereignisverlauf und die Sitzungen und könnte bei ständigen (anhaltenden) Benachrichtigungen helfen)",
|
||||||
"DevDetail_button_OverwriteIcons": "Overwrite Icons",
|
"DevDetail_button_OverwriteIcons": "Symbole überschreiben",
|
||||||
"DevDetail_button_OverwriteIcons_Tooltip": "Overwrite icons of all devices with the same device type",
|
"DevDetail_button_OverwriteIcons_Tooltip": "Symbole aller Geräte mit demselben Gerätetyp überschreiben",
|
||||||
"DevDetail_button_OverwriteIcons_Warning": "Are you sure you want to overwrite all icons of all devices with the same device type as the current device type?",
|
"DevDetail_button_OverwriteIcons_Warning": "Bist du sicher, dass du alle Symbole aller Geräte mit dem gleichen Gerätetyp wie dem aktuellen Gerätetyp überschreiben willst?",
|
||||||
"DevDetail_button_Reset": "Verwerfen",
|
"DevDetail_button_Reset": "Verwerfen",
|
||||||
"DevDetail_button_Save": "Speichern",
|
"DevDetail_button_Save": "Speichern",
|
||||||
"Device_MultiEdit": "Mehrfach-bearbeiten",
|
"Device_MultiEdit": "Mehrfach-bearbeiten",
|
||||||
"Device_MultiEdit_Backup": "",
|
"Device_MultiEdit_Backup": "",
|
||||||
"Device_MultiEdit_Fields": "Felder bearbeiten:",
|
"Device_MultiEdit_Fields": "Felder bearbeiten:",
|
||||||
"Device_MultiEdit_MassActions": "Massen aktionen:",
|
"Device_MultiEdit_MassActions": "Massen aktionen:",
|
||||||
"Device_MultiEdit_Tooltip": "",
|
"Device_MultiEdit_Tooltip": "Achtung! Beim Drücken werden alle Werte auf die oben ausgewählten Geräte übertragen.",
|
||||||
"Device_Searchbox": "Suche",
|
"Device_Searchbox": "Suche",
|
||||||
"Device_Shortcut_AllDevices": "Meine Geräte",
|
"Device_Shortcut_AllDevices": "Meine Geräte",
|
||||||
"Device_Shortcut_Archived": "Archiviert",
|
"Device_Shortcut_Archived": "Archiviert",
|
||||||
@@ -207,26 +209,27 @@
|
|||||||
"Device_Shortcut_Favorites": "Favoriten",
|
"Device_Shortcut_Favorites": "Favoriten",
|
||||||
"Device_Shortcut_NewDevices": "Neue Geräte",
|
"Device_Shortcut_NewDevices": "Neue Geräte",
|
||||||
"Device_Shortcut_OnlineChart": "Gerätepräsenz im Laufe der Zeit",
|
"Device_Shortcut_OnlineChart": "Gerätepräsenz im Laufe der Zeit",
|
||||||
"Device_TableHead_Connected_Devices": "Verbundene Geräte",
|
"Device_TableHead_Connected_Devices": "Verbindungen",
|
||||||
"Device_TableHead_Favorite": "Favorit",
|
"Device_TableHead_Favorite": "Favorit",
|
||||||
"Device_TableHead_FirstSession": "Erste Sitzung",
|
"Device_TableHead_FirstSession": "Erste Sitzung",
|
||||||
"Device_TableHead_GUID": "GUID",
|
"Device_TableHead_GUID": "GUID",
|
||||||
"Device_TableHead_Group": "Gruppe",
|
"Device_TableHead_Group": "Gruppe",
|
||||||
"Device_TableHead_Icon": "Icon",
|
"Device_TableHead_Icon": "Icon",
|
||||||
"Device_TableHead_LastIP": "Letzte IP",
|
"Device_TableHead_LastIP": "Letzte IP",
|
||||||
"Device_TableHead_LastIPOrder": "Last IP Order",
|
"Device_TableHead_LastIPOrder": "Letzte erhaltene IP",
|
||||||
"Device_TableHead_LastSession": "Zuletzt offline",
|
"Device_TableHead_LastSession": "Zuletzt offline",
|
||||||
"Device_TableHead_Location": "Standort",
|
"Device_TableHead_Location": "Standort",
|
||||||
"Device_TableHead_MAC": "MAC",
|
"Device_TableHead_MAC": "Zufälliger MAC",
|
||||||
"Device_TableHead_MAC_full": "Gesamte MAC",
|
"Device_TableHead_MAC_full": "Gesamte MAC",
|
||||||
"Device_TableHead_Name": "Name",
|
"Device_TableHead_Name": "Name",
|
||||||
"Device_TableHead_NetworkSite": "",
|
"Device_TableHead_NetworkSite": "Netzwerkseite",
|
||||||
"Device_TableHead_Owner": "Eigentümer",
|
"Device_TableHead_Owner": "Eigentümer",
|
||||||
"Device_TableHead_Parent_MAC": "Übergeordnete MAC",
|
"Device_TableHead_Parent_MAC": "Übergeordnete MAC",
|
||||||
"Device_TableHead_Port": "Port",
|
"Device_TableHead_Port": "Port",
|
||||||
"Device_TableHead_RowID": "Zeilen ID",
|
"Device_TableHead_RowID": "Zeilen ID",
|
||||||
"Device_TableHead_Rowid": "Zeilennummer",
|
"Device_TableHead_Rowid": "Zeilennummer",
|
||||||
"Device_TableHead_SSID": "SSID",
|
"Device_TableHead_SSID": "SSID",
|
||||||
|
"Device_TableHead_SourcePlugin": "",
|
||||||
"Device_TableHead_Status": "Status",
|
"Device_TableHead_Status": "Status",
|
||||||
"Device_TableHead_SyncHubNodeName": "Synchronisationsknoten",
|
"Device_TableHead_SyncHubNodeName": "Synchronisationsknoten",
|
||||||
"Device_TableHead_Type": "Typ",
|
"Device_TableHead_Type": "Typ",
|
||||||
@@ -238,10 +241,10 @@
|
|||||||
"Device_Tablelenght": "Zeige _MENU_ Einträge",
|
"Device_Tablelenght": "Zeige _MENU_ Einträge",
|
||||||
"Device_Tablelenght_all": "Alle",
|
"Device_Tablelenght_all": "Alle",
|
||||||
"Device_Title": "Geräte",
|
"Device_Title": "Geräte",
|
||||||
"Donations_Others": "Others",
|
"Donations_Others": "Andere",
|
||||||
"Donations_Platforms": "Sponsor platforms",
|
"Donations_Platforms": "Sponsor-Platformen",
|
||||||
"Donations_Text": "Hey 👋! </br> Thanks for clicking on this menu item 😅 </br> </br> I'm trying to collect some donations to make you better software. Also, it would help me not to get burned out. Me burning out might mean end of support for this app. Any small (recurring or not) sponsorship makes me want ot put more effort into this app. I don't want to lock features (new plugins) behind paywalls 🔐. </br> Currently, I'm waking up 2h before work so I contribute to the app a bit. If I had some recurring income I could shorten my workweek and in the remaining time fully focus on NetAlertX. You'd get more functionality, a more polished app and less bugs. </br> </br> Thanks for reading - I'm super grateful for any support ❤🙏 </br> </br> TL;DR: By supporting me you get: </br> </br> <ul><li>Regular updates to keep your data and family safe 🔄</li><li>Less bugs 🐛🔫</li><li>Better and more functionality➕</li><li>I don't get burned out 🔥🤯</li><li>Less rushed releases 💨</li><li>Better docs📚</li><li>Quicker and better support with issues 🆘</li><li>Less grumpy me 😄</li></ul> </br> 📧Email me to <a href='mailto:jokob@duck.com?subject=NetAlertX'>jokob@duck.com</a> if you want to get in touch or if I should add other sponsorship platforms. </br>",
|
"Donations_Text": "Hey 👋! </br> Thanks for clicking on this menu item 😅 </br> </br> I'm trying to collect some donations to make you better software. Also, it would help me not to get burned out. Me burning out might mean end of support for this app. Any small (recurring or not) sponsorship makes me want ot put more effort into this app. I don't want to lock features (new plugins) behind paywalls 🔐. </br> Currently, I'm waking up 2h before work so I contribute to the app a bit. If I had some recurring income I could shorten my workweek and in the remaining time fully focus on NetAlertX. You'd get more functionality, a more polished app and less bugs. </br> </br> Thanks for reading - I'm super grateful for any support ❤🙏 </br> </br> TL;DR: By supporting me you get: </br> </br> <ul><li>Regular updates to keep your data and family safe 🔄</li><li>Less bugs 🐛🔫</li><li>Better and more functionality➕</li><li>I don't get burned out 🔥🤯</li><li>Less rushed releases 💨</li><li>Better docs📚</li><li>Quicker and better support with issues 🆘</li><li>Less grumpy me 😄</li></ul> </br> 📧Email me to <a href='mailto:jokob@duck.com?subject=NetAlertX'>jokob@duck.com</a> if you want to get in touch or if I should add other sponsorship platforms. </br>",
|
||||||
"Donations_Title": "Donations",
|
"Donations_Title": "Spenden",
|
||||||
"ENABLE_PLUGINS_description": "NOTUSED Enables the <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins\">plugins</a> functionality. Loading plugins requires more hardware resources so you might want to disable them on low-powered system.",
|
"ENABLE_PLUGINS_description": "NOTUSED Enables the <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins\">plugins</a> functionality. Loading plugins requires more hardware resources so you might want to disable them on low-powered system.",
|
||||||
"ENABLE_PLUGINS_name": "NOTUSED Enable Plugins",
|
"ENABLE_PLUGINS_name": "NOTUSED Enable Plugins",
|
||||||
"Email_display_name": "Email",
|
"Email_display_name": "Email",
|
||||||
@@ -266,11 +269,11 @@
|
|||||||
"Events_TableHead_Device": "Gerät",
|
"Events_TableHead_Device": "Gerät",
|
||||||
"Events_TableHead_Disconnection": "Trennung",
|
"Events_TableHead_Disconnection": "Trennung",
|
||||||
"Events_TableHead_Duration": "Dauer",
|
"Events_TableHead_Duration": "Dauer",
|
||||||
"Events_TableHead_DurationOrder": "Duration Order",
|
"Events_TableHead_DurationOrder": "Dauer-Reihenfolge",
|
||||||
"Events_TableHead_EventType": "Ereignis Typ",
|
"Events_TableHead_EventType": "Ereignis Typ",
|
||||||
"Events_TableHead_IP": "IP",
|
"Events_TableHead_IP": "IP",
|
||||||
"Events_TableHead_IPOrder": "IP Order",
|
"Events_TableHead_IPOrder": "IP-Reihenfolge",
|
||||||
"Events_TableHead_Order": "Order",
|
"Events_TableHead_Order": "Reihenfolge",
|
||||||
"Events_TableHead_Owner": "Eigentümer",
|
"Events_TableHead_Owner": "Eigentümer",
|
||||||
"Events_TableHead_PendingAlert": "Ausstehender Alarm",
|
"Events_TableHead_PendingAlert": "Ausstehender Alarm",
|
||||||
"Events_Table_info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
|
"Events_Table_info": "Zeige _START_ bis _END_ von _TOTAL_ Einträgen",
|
||||||
@@ -286,24 +289,28 @@
|
|||||||
"Gen_AreYouSure": "Sind Sie sich sicher?",
|
"Gen_AreYouSure": "Sind Sie sich sicher?",
|
||||||
"Gen_Backup": "Sichern",
|
"Gen_Backup": "Sichern",
|
||||||
"Gen_Cancel": "Abbrechen",
|
"Gen_Cancel": "Abbrechen",
|
||||||
"Gen_Copy": "Run",
|
"Gen_Change": "Ändern",
|
||||||
"Gen_DataUpdatedUITakesTime": "OK - It may take a while for the UI to update if a scan is runnig",
|
"Gen_Copy": "Ausführen",
|
||||||
|
"Gen_DataUpdatedUITakesTime": "OK – Es kann einen Moment dauern, bis die Benutzeroberfläche aktualisiert wird, während ein Scan ausgeführt wird.",
|
||||||
"Gen_Delete": "Löschen",
|
"Gen_Delete": "Löschen",
|
||||||
"Gen_DeleteAll": "Delete all",
|
"Gen_DeleteAll": "Alles löschen",
|
||||||
|
"Gen_Description": "Beschreibung",
|
||||||
"Gen_Error": "Fehler",
|
"Gen_Error": "Fehler",
|
||||||
"Gen_Filter": "Filter",
|
"Gen_Filter": "Filter",
|
||||||
|
"Gen_Generate": "",
|
||||||
"Gen_LockedDB": "ERROR - DB eventuell gesperrt - Nutze die Konsole in den Entwickler Werkzeugen (F12) zur Überprüfung oder probiere es später erneut.",
|
"Gen_LockedDB": "ERROR - DB eventuell gesperrt - Nutze die Konsole in den Entwickler Werkzeugen (F12) zur Überprüfung oder probiere es später erneut.",
|
||||||
"Gen_Offline": "Offline",
|
"Gen_Offline": "Offline",
|
||||||
"Gen_Okay": "Ok",
|
"Gen_Okay": "Ok",
|
||||||
"Gen_Purge": "Aufräumen",
|
"Gen_Purge": "Aufräumen",
|
||||||
"Gen_ReadDocs": "Mehr in der Dokumentation",
|
"Gen_ReadDocs": "Mehr in der Dokumentation.",
|
||||||
"Gen_Remove_All": "Alle entfernen",
|
"Gen_Remove_All": "Alle entfernen",
|
||||||
"Gen_Remove_Last": "Letzte entfernen",
|
"Gen_Remove_Last": "Letzte entfernen",
|
||||||
"Gen_Restore": "Wiederherstellen",
|
"Gen_Restore": "Wiederherstellen",
|
||||||
"Gen_Run": "Run",
|
"Gen_Run": "Ausführen",
|
||||||
"Gen_Save": "Speichern",
|
"Gen_Save": "Speichern",
|
||||||
"Gen_Saved": "Gespeichert",
|
"Gen_Saved": "Gespeichert",
|
||||||
"Gen_Search": "Suchen",
|
"Gen_Search": "Suchen",
|
||||||
|
"Gen_SelectToPreview": "Zur Vorschau auswählen",
|
||||||
"Gen_Selected_Devices": "Ausgewählte Geräte:",
|
"Gen_Selected_Devices": "Ausgewählte Geräte:",
|
||||||
"Gen_Switch": "Umschalten",
|
"Gen_Switch": "Umschalten",
|
||||||
"Gen_Upd": "Aktualisierung erfolgreich",
|
"Gen_Upd": "Aktualisierung erfolgreich",
|
||||||
@@ -314,8 +321,10 @@
|
|||||||
"Gen_Work_In_Progress": "Keine Finalversion, feedback bitte unter: https://github.com/jokob-sk/NetAlertX/issues",
|
"Gen_Work_In_Progress": "Keine Finalversion, feedback bitte unter: https://github.com/jokob-sk/NetAlertX/issues",
|
||||||
"General_display_name": "Allgemein",
|
"General_display_name": "Allgemein",
|
||||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||||
"HRS_TO_KEEP_NEWDEV_description": "Dies ist eine Wartungseinstellung. Wenn aktiviert (<code>0</code> bedeutet deaktiviert), werden als <b>\"Neues Gerät\"</b> markierte Geräte gelöscht, wenn ihre <b>erste Sitzung</b> länger her ist als in dieser Einstellung angegeben. Verwenden Sie diese Einstellung, wenn Sie <b>Neue Geräte</b> nach <code>X</code> Stunden automatisch löschen wollen.",
|
"HRS_TO_KEEP_NEWDEV_description": "Dies ist eine Wartungseinstellung <b>DELETING devices</b>. Wenn aktiviert (<code>0</code> bedeutet deaktiviert), werden als <b>\"Neues Gerät\"</b> markierte Geräte gelöscht, wenn ihre <b>erste Sitzung</b> länger her ist als in dieser Einstellung angegeben. Verwenden Sie diese Einstellung, wenn Sie <b>Neue Geräte</b> nach <code>X</code> Stunden automatisch löschen wollen.",
|
||||||
"HRS_TO_KEEP_NEWDEV_name": "Neue Geräte speichern für",
|
"HRS_TO_KEEP_NEWDEV_name": "Neue Geräte löschen nach",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_description": "",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_name": "",
|
||||||
"HelpFAQ_Cat_Detail": "Detailansicht",
|
"HelpFAQ_Cat_Detail": "Detailansicht",
|
||||||
"HelpFAQ_Cat_Detail_300_head": "Was bedeutet ",
|
"HelpFAQ_Cat_Detail_300_head": "Was bedeutet ",
|
||||||
"HelpFAQ_Cat_Detail_300_text_a": "meint ein Netzwerkgerät (ein Gerät vom Typ AP, Gateway, Firewall, Hypervisor, Powerline, Switch, WLAN, PLC, Router, USB-LAN-Adapter oder Internet). Benutzerdefinierte Typen können über die <code>NETWORK_DEVICE_TYPES</code> Einstellung hinzugefügt werden.",
|
"HelpFAQ_Cat_Detail_300_text_a": "meint ein Netzwerkgerät (ein Gerät vom Typ AP, Gateway, Firewall, Hypervisor, Powerline, Switch, WLAN, PLC, Router, USB-LAN-Adapter oder Internet). Benutzerdefinierte Typen können über die <code>NETWORK_DEVICE_TYPES</code> Einstellung hinzugefügt werden.",
|
||||||
@@ -334,13 +343,13 @@
|
|||||||
"HelpFAQ_Cat_General_100_head": "Die Uhr oben rechts und die Zeiten der Events/Anwesenheit stimmen nicht überein (Zeitverschiebung).",
|
"HelpFAQ_Cat_General_100_head": "Die Uhr oben rechts und die Zeiten der Events/Anwesenheit stimmen nicht überein (Zeitverschiebung).",
|
||||||
"HelpFAQ_Cat_General_100_text_a": "Auf deinem PC ist für die PHP Umgebung folgende Zeitzone voreingestellt:",
|
"HelpFAQ_Cat_General_100_text_a": "Auf deinem PC ist für die PHP Umgebung folgende Zeitzone voreingestellt:",
|
||||||
"HelpFAQ_Cat_General_100_text_b": "Sollte dies nicht die Zeitzone sein, in der du dich aufhältst, solltest du die Zeitzone in der PHP Konfigurationsdatei anpassen. Diese findest du in diesem Verzeichnis:",
|
"HelpFAQ_Cat_General_100_text_b": "Sollte dies nicht die Zeitzone sein, in der du dich aufhältst, solltest du die Zeitzone in der PHP Konfigurationsdatei anpassen. Diese findest du in diesem Verzeichnis:",
|
||||||
"HelpFAQ_Cat_General_100_text_c": "Suche in dieser Datei nach dem Eintrag 'date.timezone', entferne ggf. das führende ';' und trage die gewünschte Zeitzone ein. Eine Liste mit den unterstützten Zeitzonen findest du hier (<a href=\"https://www.php.net/manual/de/timezones.php\" target=\"blank\">Link</a>).",
|
"HelpFAQ_Cat_General_100_text_c": "Suche in dieser Datei nach dem Eintrag 'date.timezone', entferne ggf. das führende ';' und trage die gewünschte Zeitzone ein. Eine Liste mit den unterstützten Zeitzonen findest du hier: (<a href=\"https://www.php.net/manual/de/timezones.php\" target=\"blank\">Link</a>)",
|
||||||
"HelpFAQ_Cat_General_101_head": "Mein Netzwerk scheint langsamer zu werden, Streaming ruckelt.",
|
"HelpFAQ_Cat_General_101_head": "Mein Netzwerk scheint langsamer zu werden, Streaming ruckelt.",
|
||||||
"HelpFAQ_Cat_General_101_text": "Es kann durchaus sein, das leistungsschwache Geräte mit der Art und Weise, wie NetAlertX neue Geräte im Netzwerk erkennt, an ihre Leistungsgrenzen kommen. Dies verstärkt sich noch einmal, <br/> wenn diese Geräte per WLAN mit dem Netzwerk kommunizieren. Lösungen wären hier, wenn möglich ein Wechsel auf eine Kabelverbindung oder, falls das Geräte nur einen begrenzten Zeitraum genutzt <br/> werden soll, den arp-Scan auf der Wartungsseite zu pausieren.",
|
"HelpFAQ_Cat_General_101_text": "Es kann durchaus sein, das leistungsschwache Geräte mit der Art und Weise, wie NetAlertX neue Geräte im Netzwerk erkennt, an ihre Leistungsgrenzen kommen. Dies verstärkt sich noch einmal, <br/> wenn diese Geräte per WLAN mit dem Netzwerk kommunizieren. Lösungen wären hier, wenn möglich ein Wechsel auf eine Kabelverbindung oder, falls das Geräte nur einen begrenzten Zeitraum genutzt <br/> werden soll, den arp-Scan auf der Wartungsseite zu pausieren.",
|
||||||
"HelpFAQ_Cat_General_102_head": "Ich bekomme die Meldung, dass die Datenbank schreibgeschützt (read only) ist.",
|
"HelpFAQ_Cat_General_102_head": "Ich bekomme die Meldung, dass die Datenbank schreibgeschützt (read only) ist.",
|
||||||
"HelpFAQ_Cat_General_102_text": "Prüfe im NetAlertX verzeichnis ob der Ordner der Datenbank (db) die richtigen Rechte zugewiesen bekommen hat:<br> <span class=\"text-danger help_faq_code\">drwxrwx--- 2 (dein Username) www-data</span><br> Sollte die Berechtigung nicht stimmen, kannst du sie mit folgenden Befehlen im Terminal oder der Konsole wieder setzen:<br> <span class=\"text-danger help_faq_code\"> sudo chgrp -R www-data /app/db<br> chmod -R 770 /app/db </span><br> Wenn die Datenbank danach noch immer schreibgeschützt ist, versuche eine erneute Installation, oder das Zuückspielen eines Datenbank-Backups über die Wartungsseite.",
|
"HelpFAQ_Cat_General_102_text": "Prüfe im NetAlertX verzeichnis ob der Ordner der Datenbank (db) die richtigen Rechte zugewiesen bekommen hat:<br> <span class=\"text-danger help_faq_code\">drwxrwx--- 2 (dein Username) www-data</span><br> Sollte die Berechtigung nicht stimmen, kannst du sie mit folgenden Befehlen im Terminal oder der Konsole wieder setzen:<br> <span class=\"text-danger help_faq_code\"> sudo chgrp -R www-data /app/db<br> chmod -R 770 /app/db </span><br> Wenn die Datenbank danach noch immer schreibgeschützt ist, versuche eine erneute Installation, oder das Zuückspielen eines Datenbank-Backups über die Wartungsseite.",
|
||||||
"HelpFAQ_Cat_General_102docker_head": "(🐳 Docker only) Database issues (AJAX errors, read-only, not found)",
|
"HelpFAQ_Cat_General_102docker_head": "(🐳 Docker only) Database issues (AJAX errors, read-only, not found)",
|
||||||
"HelpFAQ_Cat_General_102docker_text": "Double-check you have followed the <a href=\"https://github.com/jokob-sk/NetAlertX/tree/main/dockerfiles\">dockerfile readme (most up-to-date info)</a>. <br/> <br/> <ul data-sourcepos=\"49:4-52:146\" dir=\"auto\"> <li data-sourcepos=\"49:4-49:106\">Download the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/db/app.db\">original DB from GitHub</a>.</li> <li data-sourcepos=\"50:4-50:195\">Map the <code>app.db</code> file (<g-emoji class=\"g-emoji\" alias=\"warning\" fallback-src=\"https://github.githubassets.com/images/icons/emoji/unicode/26a0.png\">⚠</g-emoji> not folder) from above to <code>/app/db/app.db</code> (see <a href=\"https://github.com/jokob-sk/NetAlertX/tree/main/dockerfiles#-examples\">Examples</a> for details).</li><li data-sourcepos=\"51:4-51:161\">If facing issues (AJAX errors, can not write to DB, etc,) make sure permissions are set correctly, alternatively check the logs under <code>/app/front/log</code>.</li> <li data-sourcepos=\"52:4-52:146\">To solve permission issues you can also try to create a DB backup and then run a DB Restore via the <strong>Maintenance > Backup/Restore</strong> section.</li> <li data-sourcepos=\"53:4-53:228\">If the database is in read-only mode you can solve this by setting the owner and group by executing the following command on the host system: <code>docker exec netalertx chown -R www-data:www-data /app/db/app.db</code>.</li></ul>",
|
"HelpFAQ_Cat_General_102docker_text": "",
|
||||||
"HelpFAQ_Cat_General_103_head": "Die Login-Seite erscheint nicht, auch nicht nach der Passwortänderung.",
|
"HelpFAQ_Cat_General_103_head": "Die Login-Seite erscheint nicht, auch nicht nach der Passwortänderung.",
|
||||||
"HelpFAQ_Cat_General_103_text": "Neben dem Passwort, muss in der Konfigurationsdatei <span class=\"text-danger help_faq_code\">/app/config/app.conf</span> auch der Parameter <span class=\"text-danger help_faq_code\">PIALERT_WEB_PROTECTION</span> auf <span class=\"text-danger help_faq_code\">True</span> gesetzt sein.",
|
"HelpFAQ_Cat_General_103_text": "Neben dem Passwort, muss in der Konfigurationsdatei <span class=\"text-danger help_faq_code\">/app/config/app.conf</span> auch der Parameter <span class=\"text-danger help_faq_code\">PIALERT_WEB_PROTECTION</span> auf <span class=\"text-danger help_faq_code\">True</span> gesetzt sein.",
|
||||||
"HelpFAQ_Cat_Network_600_head": "Was bringt mir diese Seite?",
|
"HelpFAQ_Cat_Network_600_head": "Was bringt mir diese Seite?",
|
||||||
@@ -359,9 +368,10 @@
|
|||||||
"Loading": "Laden...",
|
"Loading": "Laden...",
|
||||||
"Login_Box": "Passwort eingeben",
|
"Login_Box": "Passwort eingeben",
|
||||||
"Login_Default_PWD": "Standardpasswort \"123456\" noch immer aktiv.",
|
"Login_Default_PWD": "Standardpasswort \"123456\" noch immer aktiv.",
|
||||||
|
"Login_Info": "",
|
||||||
"Login_Psw-box": "Passwort",
|
"Login_Psw-box": "Passwort",
|
||||||
"Login_Psw_alert": "Sicherheitshinweis!",
|
"Login_Psw_alert": "Sicherheitshinweis!",
|
||||||
"Login_Psw_folder": "im Ordner /app/config",
|
"Login_Psw_folder": "im Konfigurationsordner.",
|
||||||
"Login_Psw_new": "neues_passwort",
|
"Login_Psw_new": "neues_passwort",
|
||||||
"Login_Psw_run": "Um das Passwort zu ändern nutze:",
|
"Login_Psw_run": "Um das Passwort zu ändern nutze:",
|
||||||
"Login_Remember": "Passwort speichern",
|
"Login_Remember": "Passwort speichern",
|
||||||
@@ -401,8 +411,8 @@
|
|||||||
"Maintenance_Tool_ImportPastedCSV": "CSV-Import (Einfügen)",
|
"Maintenance_Tool_ImportPastedCSV": "CSV-Import (Einfügen)",
|
||||||
"Maintenance_Tool_ImportPastedCSV_noti_text": "",
|
"Maintenance_Tool_ImportPastedCSV_noti_text": "",
|
||||||
"Maintenance_Tool_ImportPastedCSV_text": "",
|
"Maintenance_Tool_ImportPastedCSV_text": "",
|
||||||
"Maintenance_Tool_arpscansw": "arp-Scan stoppen/starten",
|
"Maintenance_Tool_arpscansw": "ARP-Scan umschalten (ein/aus)",
|
||||||
"Maintenance_Tool_arpscansw_noti": "arp-Scan stoppen/starten",
|
"Maintenance_Tool_arpscansw_noti": "ARP-Scan ein- oder ausschalten",
|
||||||
"Maintenance_Tool_arpscansw_noti_text": "Wenn der Scan aus ist, bleibt er so lange aus bis er wieder aktiviert wird.",
|
"Maintenance_Tool_arpscansw_noti_text": "Wenn der Scan aus ist, bleibt er so lange aus bis er wieder aktiviert wird.",
|
||||||
"Maintenance_Tool_arpscansw_text": "Schaltet den arp-Scan an oder aus. Wenn der Scan aus ist, bleibt er so lange aus bis er wieder aktiviert wird. Bereits laufende Scans werden dabei nicht beendet.",
|
"Maintenance_Tool_arpscansw_text": "Schaltet den arp-Scan an oder aus. Wenn der Scan aus ist, bleibt er so lange aus bis er wieder aktiviert wird. Bereits laufende Scans werden dabei nicht beendet.",
|
||||||
"Maintenance_Tool_backup": "DB Sicherung",
|
"Maintenance_Tool_backup": "DB Sicherung",
|
||||||
@@ -427,7 +437,7 @@
|
|||||||
"Maintenance_Tool_del_allevents30_noti": "Ereignisse löschen",
|
"Maintenance_Tool_del_allevents30_noti": "Ereignisse löschen",
|
||||||
"Maintenance_Tool_del_allevents30_noti_text": "Sind Sie sich sicher, dass Sie alle Ereignisse älter als 30 Tage löschen wollen? Dies setzt die Präsenz aller Geräte zurück.",
|
"Maintenance_Tool_del_allevents30_noti_text": "Sind Sie sich sicher, dass Sie alle Ereignisse älter als 30 Tage löschen wollen? Dies setzt die Präsenz aller Geräte zurück.",
|
||||||
"Maintenance_Tool_del_allevents30_text": "Machen Sie ein Backup, bevor Sie diese Funktion nutzen. Der Vorgang kann ohne Backup nicht rückgängig gemacht werden. Alle Ereignisse älter als 30 Tage werden aus der Datenbank gelöscht. Dies setzt auch die Anwesenheit zurück. Es kann ab dem Moment zu ungültigen Sitzungen kommen. Ein Scan, während das betreffende Gerät online ist, sollte das Problem lösen.",
|
"Maintenance_Tool_del_allevents30_text": "Machen Sie ein Backup, bevor Sie diese Funktion nutzen. Der Vorgang kann ohne Backup nicht rückgängig gemacht werden. Alle Ereignisse älter als 30 Tage werden aus der Datenbank gelöscht. Dies setzt auch die Anwesenheit zurück. Es kann ab dem Moment zu ungültigen Sitzungen kommen. Ein Scan, während das betreffende Gerät online ist, sollte das Problem lösen.",
|
||||||
"Maintenance_Tool_del_allevents_noti": "Alle Ereignisse löschen",
|
"Maintenance_Tool_del_allevents_noti": "Ereignisse löschen",
|
||||||
"Maintenance_Tool_del_allevents_noti_text": "Sind Sie sicher, dass Sie alle Ereignisse aus der Datenbank löschen wollen. Dies setzt die Anwesenheit aller Geräte zurück.",
|
"Maintenance_Tool_del_allevents_noti_text": "Sind Sie sicher, dass Sie alle Ereignisse aus der Datenbank löschen wollen. Dies setzt die Anwesenheit aller Geräte zurück.",
|
||||||
"Maintenance_Tool_del_allevents_text": "Machen Sie ein Backup, bevor Sie diese Funk­tion nutzen. Der Vor­gang kann ohne Back­up nicht rück­gängig gemacht werden. Alle Ereignisse werden aus der Datenbank ge­löscht. Dies setzt auch die Anwesenheit zu­rück. Es kann ab dem Moment zu ungültigen Sitzungen kommen. Ein Scan, während das betreffende Gerät online ist, sollte das Problem lösen.",
|
"Maintenance_Tool_del_allevents_text": "Machen Sie ein Backup, bevor Sie diese Funk­tion nutzen. Der Vor­gang kann ohne Back­up nicht rück­gängig gemacht werden. Alle Ereignisse werden aus der Datenbank ge­löscht. Dies setzt auch die Anwesenheit zu­rück. Es kann ab dem Moment zu ungültigen Sitzungen kommen. Ein Scan, während das betreffende Gerät online ist, sollte das Problem lösen.",
|
||||||
"Maintenance_Tool_del_empty_macs": "Alle Geräte ohne MAC löschen",
|
"Maintenance_Tool_del_empty_macs": "Alle Geräte ohne MAC löschen",
|
||||||
@@ -440,7 +450,7 @@
|
|||||||
"Maintenance_Tool_del_unknowndev_noti": "Lösche (unknown) Geräte",
|
"Maintenance_Tool_del_unknowndev_noti": "Lösche (unknown) Geräte",
|
||||||
"Maintenance_Tool_del_unknowndev_noti_text": "Sind Sie sicher, dass Sie alle (unknown) Geräte aus der Datenbank löschen wollen?",
|
"Maintenance_Tool_del_unknowndev_noti_text": "Sind Sie sicher, dass Sie alle (unknown) Geräte aus der Datenbank löschen wollen?",
|
||||||
"Maintenance_Tool_del_unknowndev_text": "Machen Sie ein Backup, bevor Sie diese Funk­tion nutzen. Der Vor­gang kann ohne Back­up nicht rück­gängig gemacht werden. Alle Gräte mit dem Namen (unknown) werden aus der Datenbank ge­löscht.",
|
"Maintenance_Tool_del_unknowndev_text": "Machen Sie ein Backup, bevor Sie diese Funk­tion nutzen. Der Vor­gang kann ohne Back­up nicht rück­gängig gemacht werden. Alle Gräte mit dem Namen (unknown) werden aus der Datenbank ge­löscht.",
|
||||||
"Maintenance_Tool_displayed_columns_text": "Ändere die Sichtbarkeit und Anordnung der Spalten in der <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Geräte</b></a>-Seite. (Drag-and-Drop funktioniert nicht einwandfrei, ist aber verwendbar. Ich habe <a href=\"https://github.com/jokob-sk/NetAlertX/commit/94b32f0f7332879f5a7d2af05dafa2e5d5cfa5da\">3 Stunden</a> versucht das zu beheben, werde es aber nicht weiter verfolgen. Über einen PR mit einem Fix würde ich mich freuen :) ).",
|
"Maintenance_Tool_displayed_columns_text": "Ändere die Sichtbarkeit und Anordnung der Spalten in der <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Geräte</b></a>-Seite.",
|
||||||
"Maintenance_Tool_drag_me": "Zieh mich um die Anordnung der Spalten zu ändern.",
|
"Maintenance_Tool_drag_me": "Zieh mich um die Anordnung der Spalten zu ändern.",
|
||||||
"Maintenance_Tool_order_columns_text": "",
|
"Maintenance_Tool_order_columns_text": "",
|
||||||
"Maintenance_Tool_purgebackup": "Sicherungen aufräumen",
|
"Maintenance_Tool_purgebackup": "Sicherungen aufräumen",
|
||||||
@@ -452,14 +462,14 @@
|
|||||||
"Maintenance_Tool_restore_noti_text": "Sind Sie sicher, dass Sie die Datenbank aus der neusten Sicherung wiederherstellen möchten? Prüfen Sie, dass gerade keine Scans stattfinden.",
|
"Maintenance_Tool_restore_noti_text": "Sind Sie sicher, dass Sie die Datenbank aus der neusten Sicherung wiederherstellen möchten? Prüfen Sie, dass gerade keine Scans stattfinden.",
|
||||||
"Maintenance_Tool_restore_text": "Das neuste Backup kann über diese Funk­tion wiederhergestellt werden. Ältere Sicher­ungen müssen manuell wieder­hergestellt wer­den. Es empfiehlt sich eine Integritäts­prüfung nach der Wieder­her­stellung zu machen, falls die Datenbank bei der Sicherung geöffnet war.",
|
"Maintenance_Tool_restore_text": "Das neuste Backup kann über diese Funk­tion wiederhergestellt werden. Ältere Sicher­ungen müssen manuell wieder­hergestellt wer­den. Es empfiehlt sich eine Integritäts­prüfung nach der Wieder­her­stellung zu machen, falls die Datenbank bei der Sicherung geöffnet war.",
|
||||||
"Maintenance_Tool_upgrade_database_noti": "Aktualisiere Datenbank",
|
"Maintenance_Tool_upgrade_database_noti": "Aktualisiere Datenbank",
|
||||||
"Maintenance_Tool_upgrade_database_noti_text": "Machen Sie ein Backup, bevor Sie diese Funk­tion nutzen.",
|
"Maintenance_Tool_upgrade_database_noti_text": "",
|
||||||
"Maintenance_Tool_upgrade_database_text": "Mit dieser Schaltfläche wird die Datenbank aktualisiert, um das Diagramm der Netzwerkaktivitäten der letzten 12 Stunden zu aktivieren. Bitte sichern Sie Ihre Datenbank, falls Probleme auftreten.",
|
"Maintenance_Tool_upgrade_database_text": "Mit dieser Schaltfläche wird die Datenbank aktualisiert, um das Diagramm der Netzwerkaktivitäten der letzten 12 Stunden zu aktivieren. Bitte sichern Sie Ihre Datenbank, falls Probleme auftreten.",
|
||||||
"Maintenance_Tools_Tab_BackupRestore": "Sicherg. / Wiederherstellg.",
|
"Maintenance_Tools_Tab_BackupRestore": "Sichern / Wiederherstellen",
|
||||||
"Maintenance_Tools_Tab_Logging": "Logs",
|
"Maintenance_Tools_Tab_Logging": "Protokolle",
|
||||||
"Maintenance_Tools_Tab_Settings": "Einstellungen",
|
"Maintenance_Tools_Tab_Settings": "Einstellungen",
|
||||||
"Maintenance_Tools_Tab_Tools": "Werkzeuge",
|
"Maintenance_Tools_Tab_Tools": "Werkzeuge",
|
||||||
"Maintenance_Tools_Tab_UISettings": "UI Einstellungen",
|
"Maintenance_Tools_Tab_UISettings": "UI Einstellungen",
|
||||||
"Maintenance_arp_status": "Scan Status",
|
"Maintenance_arp_status": "Scan-Status",
|
||||||
"Maintenance_arp_status_off": "ist im Moment deaktiviert",
|
"Maintenance_arp_status_off": "ist im Moment deaktiviert",
|
||||||
"Maintenance_arp_status_on": "Scan(s) sind gerade aktiv",
|
"Maintenance_arp_status_on": "Scan(s) sind gerade aktiv",
|
||||||
"Maintenance_built_on": "Erstellt am",
|
"Maintenance_built_on": "Erstellt am",
|
||||||
@@ -495,7 +505,7 @@
|
|||||||
"NTFY_icon": "<i class=\"fa fa-terminal\"></i>",
|
"NTFY_icon": "<i class=\"fa fa-terminal\"></i>",
|
||||||
"Navigation_About": "Über",
|
"Navigation_About": "Über",
|
||||||
"Navigation_Devices": "Geräte",
|
"Navigation_Devices": "Geräte",
|
||||||
"Navigation_Donations": "Donations",
|
"Navigation_Donations": "Spenden",
|
||||||
"Navigation_Events": "Ereignisse",
|
"Navigation_Events": "Ereignisse",
|
||||||
"Navigation_Flows": "Flows",
|
"Navigation_Flows": "Flows",
|
||||||
"Navigation_HelpFAQ": "Hilfe / FAQ",
|
"Navigation_HelpFAQ": "Hilfe / FAQ",
|
||||||
@@ -533,7 +543,7 @@
|
|||||||
"Network_ManageEdit_ID_text": "-- Gerät wählen --",
|
"Network_ManageEdit_ID_text": "-- Gerät wählen --",
|
||||||
"Network_ManageEdit_Name": "Neuer Name",
|
"Network_ManageEdit_Name": "Neuer Name",
|
||||||
"Network_ManageEdit_Name_text": "Name ohne Sonderzeichen",
|
"Network_ManageEdit_Name_text": "Name ohne Sonderzeichen",
|
||||||
"Network_ManageEdit_Port": "Neue Portanzahl",
|
"Network_ManageEdit_Port": " Neue Portanzahl",
|
||||||
"Network_ManageEdit_Port_text": "bei WLAN oder Powerline leer lassen",
|
"Network_ManageEdit_Port_text": "bei WLAN oder Powerline leer lassen",
|
||||||
"Network_ManageEdit_Submit": "Speichern",
|
"Network_ManageEdit_Submit": "Speichern",
|
||||||
"Network_ManageEdit_Type": "Neuer Typ",
|
"Network_ManageEdit_Type": "Neuer Typ",
|
||||||
@@ -558,20 +568,21 @@
|
|||||||
"PIALERT_WEB_PASSWORD_description": "Das Standardpasswort ist <code>123456</code>. Um das Passwort zu ändern, entweder <code>/app/back/pialert-cli</code> im Container starten oder <a onclick=\"toggleAllSettings()\" href=\"#SETPWD_RUN\"><code>SETPWD_RUN</code> Set password plugin</a> nutzen.",
|
"PIALERT_WEB_PASSWORD_description": "Das Standardpasswort ist <code>123456</code>. Um das Passwort zu ändern, entweder <code>/app/back/pialert-cli</code> im Container starten oder <a onclick=\"toggleAllSettings()\" href=\"#SETPWD_RUN\"><code>SETPWD_RUN</code> Set password plugin</a> nutzen.",
|
||||||
"PIALERT_WEB_PASSWORD_name": "Login-Passwort",
|
"PIALERT_WEB_PASSWORD_name": "Login-Passwort",
|
||||||
"PIALERT_WEB_PROTECTION_description": "Ein Loginfenster wird angezeigt wenn aktiviert. Untere Beschreibung genau durchlesen falls Sie sich aus Ihrer Instanz aussperren.",
|
"PIALERT_WEB_PROTECTION_description": "Ein Loginfenster wird angezeigt wenn aktiviert. Untere Beschreibung genau durchlesen falls Sie sich aus Ihrer Instanz aussperren.",
|
||||||
"PIALERT_WEB_PROTECTION_name": "Login aktivieren",
|
"PIALERT_WEB_PROTECTION_name": "Anmeldung aktivieren",
|
||||||
"PLUGINS_KEEP_HIST_description": "Wie viele Plugin Scanresultate behalten werden (pro Plugin, nicht gerätespezifisch).",
|
"PLUGINS_KEEP_HIST_description": "Wie viele Plugin Scanresultate behalten werden (pro Plugin, nicht gerätespezifisch).",
|
||||||
"PLUGINS_KEEP_HIST_name": "Plugins Verlauf",
|
"PLUGINS_KEEP_HIST_name": "Plugins Verlauf",
|
||||||
"PUSHSAFER_TOKEN_description": "Your secret Pushsafer API key (token).",
|
"PUSHSAFER_TOKEN_description": "Your secret Pushsafer API key (token).",
|
||||||
"PUSHSAFER_TOKEN_name": "Pushsafer token",
|
"PUSHSAFER_TOKEN_name": "Pushsafer token",
|
||||||
"PUSHSAFER_display_name": "Pushsafer",
|
"PUSHSAFER_display_name": "Pushsafer",
|
||||||
"PUSHSAFER_icon": "<i class=\"fa fa-bell\"></i>",
|
"PUSHSAFER_icon": "<i class=\"fa fa-bell\"></i>",
|
||||||
"Plugins_DeleteAll": "Delete all (filters are ignored)",
|
"Plugins_DeleteAll": "Alles löschen (Filter werden ignoriert)",
|
||||||
"Plugins_Filters_Mac": "Mac Filter",
|
"Plugins_Filters_Mac": "Mac Filter",
|
||||||
"Plugins_History": "Events History",
|
"Plugins_History": "Verlauf der Ereignisse",
|
||||||
"Plugins_Objects": "Plugin Objects",
|
"Plugins_Obj_DeleteListed": "Aufgelistete Objekte löschen",
|
||||||
|
"Plugins_Objects": "Plugin-Objekte",
|
||||||
"Plugins_Out_of": "von",
|
"Plugins_Out_of": "von",
|
||||||
"Plugins_Unprocessed_Events": "Unprocessed Events",
|
"Plugins_Unprocessed_Events": "Unverarbeitete Ereignisse",
|
||||||
"Plugins_no_control": "No form control was found to render this value.",
|
"Plugins_no_control": "",
|
||||||
"Presence_CalHead_day": "Tag",
|
"Presence_CalHead_day": "Tag",
|
||||||
"Presence_CalHead_lang": "de",
|
"Presence_CalHead_lang": "de",
|
||||||
"Presence_CalHead_month": "Monat",
|
"Presence_CalHead_month": "Monat",
|
||||||
@@ -579,6 +590,12 @@
|
|||||||
"Presence_CalHead_week": "Woche",
|
"Presence_CalHead_week": "Woche",
|
||||||
"Presence_CalHead_year": "Jahr",
|
"Presence_CalHead_year": "Jahr",
|
||||||
"Presence_CallHead_Devices": "Geräte",
|
"Presence_CallHead_Devices": "Geräte",
|
||||||
|
"Presence_Key_OnlineNow": "",
|
||||||
|
"Presence_Key_OnlineNow_desc": "",
|
||||||
|
"Presence_Key_OnlinePast": "",
|
||||||
|
"Presence_Key_OnlinePastMiss": "",
|
||||||
|
"Presence_Key_OnlinePastMiss_desc": "",
|
||||||
|
"Presence_Key_OnlinePast_desc": "",
|
||||||
"Presence_Loading": "Laden...",
|
"Presence_Loading": "Laden...",
|
||||||
"Presence_Shortcut_AllDevices": "Meine Geräte",
|
"Presence_Shortcut_AllDevices": "Meine Geräte",
|
||||||
"Presence_Shortcut_Archived": "Archiviert",
|
"Presence_Shortcut_Archived": "Archiviert",
|
||||||
@@ -596,7 +613,7 @@
|
|||||||
"REPORT_FROM_description": "Notification email subject line. Some SMTP servers need this to be an email.",
|
"REPORT_FROM_description": "Notification email subject line. Some SMTP servers need this to be an email.",
|
||||||
"REPORT_FROM_name": "Email subject",
|
"REPORT_FROM_name": "Email subject",
|
||||||
"REPORT_MAIL_description": "If enabled an email is sent out with a list of changes you nove subscribed to. Please also fill out all remaining settings related to the SMTP setup below. If facing issues, set <code>LOG_LEVEL</code> to <code>debug</code> and check the <a href=\"/maintenance.php#tab_Logging\">error log</a>.",
|
"REPORT_MAIL_description": "If enabled an email is sent out with a list of changes you nove subscribed to. Please also fill out all remaining settings related to the SMTP setup below. If facing issues, set <code>LOG_LEVEL</code> to <code>debug</code> and check the <a href=\"/maintenance.php#tab_Logging\">error log</a>.",
|
||||||
"REPORT_MAIL_name": "Enable email",
|
"REPORT_MAIL_name": "E-Mail aktivieren",
|
||||||
"REPORT_MQTT_description": "Enable sending notifications via <a target=\"_blank\" href=\"https://www.home-assistant.io/integrations/mqtt/\">MQTT</a> to your Home Assistance instance.",
|
"REPORT_MQTT_description": "Enable sending notifications via <a target=\"_blank\" href=\"https://www.home-assistant.io/integrations/mqtt/\">MQTT</a> to your Home Assistance instance.",
|
||||||
"REPORT_MQTT_name": "Enable MQTT",
|
"REPORT_MQTT_name": "Enable MQTT",
|
||||||
"REPORT_NTFY_description": "Enable sending notifications via <a target=\"_blank\" href=\"https://ntfy.sh/\">NTFY</a>.",
|
"REPORT_NTFY_description": "Enable sending notifications via <a target=\"_blank\" href=\"https://ntfy.sh/\">NTFY</a>.",
|
||||||
@@ -608,9 +625,10 @@
|
|||||||
"REPORT_TO_name": "Send email to",
|
"REPORT_TO_name": "Send email to",
|
||||||
"REPORT_WEBHOOK_description": "Enable webhooks for notifications. Webhooks help you to connect to a lot of 3rd party tools, such as IFTTT, Zapier or <a href=\"https://n8n.io/\" target=\"_blank\">n8n</a> to name a few. Check out this simple <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/WEBHOOK_N8N.md\" target=\"_blank\">n8n guide here</a> to get started. If enabled, configure related settings below.",
|
"REPORT_WEBHOOK_description": "Enable webhooks for notifications. Webhooks help you to connect to a lot of 3rd party tools, such as IFTTT, Zapier or <a href=\"https://n8n.io/\" target=\"_blank\">n8n</a> to name a few. Check out this simple <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/WEBHOOK_N8N.md\" target=\"_blank\">n8n guide here</a> to get started. If enabled, configure related settings below.",
|
||||||
"REPORT_WEBHOOK_name": "Enable Webhooks",
|
"REPORT_WEBHOOK_name": "Enable Webhooks",
|
||||||
"RandomMAC_hover": "Autodetected - indicates if the device randomizes it's MAC address.",
|
"RandomMAC_hover": "Automatisch erkannt - gibt an, ob das Gerät seine MAC-Adresse zufällig ermittelt.",
|
||||||
"Reports_Sent_Log": "Protokoll gesendeter Berichte",
|
"Reports_Sent_Log": "Protokoll gesendeter Berichte",
|
||||||
"SCAN_SUBNETS_description": "",
|
"SCAN_SUBNETS_description": "",
|
||||||
|
"SCAN_SUBNETS_name": "scan Netzwerke",
|
||||||
"SMTP_FORCE_SSL_description": "Force SSL when connecting to your SMTP server.",
|
"SMTP_FORCE_SSL_description": "Force SSL when connecting to your SMTP server.",
|
||||||
"SMTP_FORCE_SSL_name": "Force SSL",
|
"SMTP_FORCE_SSL_name": "Force SSL",
|
||||||
"SMTP_PASS_description": "The SMTP server password. ",
|
"SMTP_PASS_description": "The SMTP server password. ",
|
||||||
@@ -626,9 +644,10 @@
|
|||||||
"SMTP_USER_description": "The user name used to login into the SMTP server (sometimes a full email address).",
|
"SMTP_USER_description": "The user name used to login into the SMTP server (sometimes a full email address).",
|
||||||
"SMTP_USER_name": "SMTP user",
|
"SMTP_USER_name": "SMTP user",
|
||||||
"SYSTEM_TITLE": "Systeminformationen",
|
"SYSTEM_TITLE": "Systeminformationen",
|
||||||
"Setting_Override": "Override value",
|
"Setting_Override": "Wert überschreiben",
|
||||||
"Setting_Override_Description": "Enabling this option will override an App supplied default value with the value specified above.",
|
"Setting_Override_Description": "",
|
||||||
"Settings_Metadata_Toggle": "Show/hide metadata for the given setting.",
|
"Settings_Metadata_Toggle": "Metadaten für die angegebene Einstellung anzeigen/ausblenden.",
|
||||||
|
"Settings_Show_Description": "Beschreibung der Einstellung anzeigen.",
|
||||||
"Settings_device_Scanners_desync": "⚠ Die Zeitpläne des Gerätescanners sind nicht synchronisiert.",
|
"Settings_device_Scanners_desync": "⚠ Die Zeitpläne des Gerätescanners sind nicht synchronisiert.",
|
||||||
"Settings_device_Scanners_desync_popup": "",
|
"Settings_device_Scanners_desync_popup": "",
|
||||||
"Speedtest_Results": "Ergebnisse des Geschwindigkeitstests",
|
"Speedtest_Results": "Ergebnisse des Geschwindigkeitstests",
|
||||||
@@ -712,17 +731,19 @@
|
|||||||
"UI_DEV_SECTIONS_description": "Auswählen, welche Elemente in der Geräteseite versteckt werden sollen.",
|
"UI_DEV_SECTIONS_description": "Auswählen, welche Elemente in der Geräteseite versteckt werden sollen.",
|
||||||
"UI_DEV_SECTIONS_name": "Geräteauswahl verstecken",
|
"UI_DEV_SECTIONS_name": "Geräteauswahl verstecken",
|
||||||
"UI_ICONS_description": "",
|
"UI_ICONS_description": "",
|
||||||
"UI_ICONS_name": "Vorgefertigte Icons",
|
"UI_ICONS_name": "Vordefinierte Symbole",
|
||||||
"UI_LANG_description": "Bevorzugte Oberflächensprache auswählen. Du möchtest beim Übersetzen helfen? Gerne hier: <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
|
"UI_LANG_description": "Bevorzugte Oberflächensprache auswählen. Du möchtest beim Übersetzen helfen? Gerne hier: <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
|
||||||
"UI_LANG_name": "UI Sprache",
|
"UI_LANG_name": "Sprache der Benutzeroberfläche",
|
||||||
"UI_MY_DEVICES_description": "",
|
"UI_MY_DEVICES_description": "",
|
||||||
"UI_MY_DEVICES_name": "In \"Meine Geräte\" anzeigen",
|
"UI_MY_DEVICES_name": "In \"Meine Geräte\" anzeigen",
|
||||||
"UI_NOT_RANDOM_MAC_description": "",
|
"UI_NOT_RANDOM_MAC_description": "",
|
||||||
"UI_NOT_RANDOM_MAC_name": "",
|
"UI_NOT_RANDOM_MAC_name": "Nicht als zufällig markieren",
|
||||||
"UI_PRESENCE_description": "Auswählen, welche Status im <b>Gerätepräsenz im Laufe der Zeit</b>-Diagramm in der <a href=\"/devices.php\" target=\"_blank\">Geräte</a>-Seite angzeigt werden sollen. (<code>STRG + klicken</code> zum aus-/abwählen).",
|
"UI_PRESENCE_description": "Auswählen, welche Status im <b>Gerätepräsenz im Laufe der Zeit</b>-Diagramm in der <a href=\"/devices.php\" target=\"_blank\">Geräte</a>-Seite angzeigt werden sollen.",
|
||||||
"UI_PRESENCE_name": "Anzeige im Präsenzdiagramm",
|
"UI_PRESENCE_name": "Anzeige im Präsenzdiagramm",
|
||||||
"UI_REFRESH_description": "",
|
"UI_REFRESH_description": "",
|
||||||
"UI_REFRESH_name": "Automatisch Aktualisieren",
|
"UI_REFRESH_name": "Benutzeroberfläche automatisch auffrischen",
|
||||||
|
"VERSION_description": "",
|
||||||
|
"VERSION_name": "Version oder Zeitstempel",
|
||||||
"WEBHOOK_PAYLOAD_description": "The Webhook payload data format for the <code>body</code> > <code>attachments</code> > <code>text</code> attribute in the payload json. See an example of the payload <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json\">here</a>. (e.g.: for discord use <code>text</code>)",
|
"WEBHOOK_PAYLOAD_description": "The Webhook payload data format for the <code>body</code> > <code>attachments</code> > <code>text</code> attribute in the payload json. See an example of the payload <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json\">here</a>. (e.g.: for discord use <code>text</code>)",
|
||||||
"WEBHOOK_PAYLOAD_name": "Payload type",
|
"WEBHOOK_PAYLOAD_name": "Payload type",
|
||||||
"WEBHOOK_REQUEST_METHOD_description": "The HTTP request method to be used for the webhook call.",
|
"WEBHOOK_REQUEST_METHOD_description": "The HTTP request method to be used for the webhook call.",
|
||||||
@@ -737,13 +758,13 @@
|
|||||||
"Webhooks_icon": "<i class=\"fa fa-circle-nodes\"></i>",
|
"Webhooks_icon": "<i class=\"fa fa-circle-nodes\"></i>",
|
||||||
"devices_old": "Aktualisiert...",
|
"devices_old": "Aktualisiert...",
|
||||||
"general_event_description": "Das Ereignis, das Sie ausgelöst haben, könnte eine Weile dauern, bis Hintergrundprozesse abgeschlossen sind. Die Ausführung endet, wenn die unten ausgeführte Warteschlangen abgearbeitet ist. (Siehe <a href='/maintenance.php#tab_Logging'>error log</a>, wenn Probleme auftreten.)<br/> <br/> Ausführungsschlange:",
|
"general_event_description": "Das Ereignis, das Sie ausgelöst haben, könnte eine Weile dauern, bis Hintergrundprozesse abgeschlossen sind. Die Ausführung endet, wenn die unten ausgeführte Warteschlangen abgearbeitet ist. (Siehe <a href='/maintenance.php#tab_Logging'>error log</a>, wenn Probleme auftreten.)<br/> <br/> Ausführungsschlange:",
|
||||||
"general_event_title": "Executing an ad-hoc event",
|
"general_event_title": "",
|
||||||
"report_guid": "",
|
"report_guid": "",
|
||||||
"report_guid_missing": "",
|
"report_guid_missing": "",
|
||||||
"report_select_format": "Format auswählen:",
|
"report_select_format": "Format auswählen:",
|
||||||
"report_time": "Benachrichtigungszeit:",
|
"report_time": "Benachrichtigungszeit:",
|
||||||
"run_event_icon": "fa-play",
|
"run_event_icon": "",
|
||||||
"run_event_tooltip": "Enable the setting and save your changes at first before you run it.",
|
"run_event_tooltip": "Aktiviere die Einstellung und speichere deine Änderungen, bevor du sie ausführst.",
|
||||||
"settings_core_icon": "",
|
"settings_core_icon": "",
|
||||||
"settings_core_label": "Kern",
|
"settings_core_label": "Kern",
|
||||||
"settings_device_scanners": "",
|
"settings_device_scanners": "",
|
||||||
@@ -752,23 +773,23 @@
|
|||||||
"settings_device_scanners_label": "Gerätescanner",
|
"settings_device_scanners_label": "Gerätescanner",
|
||||||
"settings_enabled": "Aktive Einstellungen",
|
"settings_enabled": "Aktive Einstellungen",
|
||||||
"settings_enabled_icon": "",
|
"settings_enabled_icon": "",
|
||||||
"settings_expand_all": "Expand all",
|
"settings_expand_all": "Alles ausklappen",
|
||||||
"settings_imported": "Last time settings were imported from the app.conf file:",
|
"settings_imported": "Die letzten Einstellungen wurden aus der Datei app.conf importiert",
|
||||||
"settings_imported_label": "Einstellungen importiert",
|
"settings_imported_label": "Einstellungen importiert",
|
||||||
"settings_missing": "",
|
"settings_missing": "",
|
||||||
"settings_missing_block": "",
|
"settings_missing_block": "",
|
||||||
"settings_old": "Importing settings and re-initializing...",
|
"settings_old": "",
|
||||||
"settings_other_scanners": "",
|
"settings_other_scanners": "",
|
||||||
"settings_other_scanners_icon": "",
|
"settings_other_scanners_icon": "",
|
||||||
"settings_other_scanners_label": "Andere Scanner",
|
"settings_other_scanners_label": "Andere Scanner",
|
||||||
"settings_publishers": "",
|
"settings_publishers": "",
|
||||||
"settings_publishers_icon": "fa-solid fa-paper-plane",
|
"settings_publishers_icon": "",
|
||||||
"settings_publishers_info": "",
|
"settings_publishers_info": "Lade mehr Veröffentlicher mit den <a href=\"/settings.php#LOADED_PLUGINS\">geladene Plugins</a>-Einstellungen",
|
||||||
"settings_publishers_label": "Veröffentlicher",
|
"settings_publishers_label": "Veröffentlicher",
|
||||||
"settings_saved": "",
|
"settings_saved": "<br/>Einstellungen gespeichert. <br/> Wird geladen... <br/><i class=\"ion ion-ios-loop-strong fa-spin fa-2x fa-fw\"></i> <br/>",
|
||||||
"settings_system_icon": "",
|
"settings_system_icon": "",
|
||||||
"settings_system_label": "System",
|
"settings_system_label": "System",
|
||||||
"settings_update_item_warning": "",
|
"settings_update_item_warning": "",
|
||||||
"test_event_icon": "fa-vial-circle-check",
|
"test_event_icon": "",
|
||||||
"test_event_tooltip": "Save your changes at first before you test your settings."
|
"test_event_tooltip": "Speichere die Änderungen, bevor Sie die Einstellungen testen."
|
||||||
}
|
}
|
||||||
@@ -56,11 +56,13 @@
|
|||||||
"BackDevices_Restore_okay": "Restore executed successfully.",
|
"BackDevices_Restore_okay": "Restore executed successfully.",
|
||||||
"BackDevices_darkmode_disabled": "Darkmode Disabled",
|
"BackDevices_darkmode_disabled": "Darkmode Disabled",
|
||||||
"BackDevices_darkmode_enabled": "Darkmode Enabled",
|
"BackDevices_darkmode_enabled": "Darkmode Enabled",
|
||||||
|
"CLEAR_NEW_FLAG_description": "If enabled (<code>0</code> is disabled), devices flagged as <b>New Device</b> will be unflagged if the time limit (specified in hours) exceeds their <b>First Session</b> time.",
|
||||||
|
"CLEAR_NEW_FLAG_name": "Clear new flag",
|
||||||
"DAYS_TO_KEEP_EVENTS_description": "This is a maintenance setting. This specifies the number of days worth of event entries that will be kept. All older events will be deleted periodically. Also applies on Plugin Events History.",
|
"DAYS_TO_KEEP_EVENTS_description": "This is a maintenance setting. This specifies the number of days worth of event entries that will be kept. All older events will be deleted periodically. Also applies on Plugin Events History.",
|
||||||
"DAYS_TO_KEEP_EVENTS_name": "Delete events older than",
|
"DAYS_TO_KEEP_EVENTS_name": "Delete events older than",
|
||||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Copy details from device",
|
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Copy details from device",
|
||||||
"DevDetail_Copy_Device_Tooltip": "Copy details from device from the dropdown list. Everything on this page will be overwritten",
|
"DevDetail_Copy_Device_Tooltip": "Copy details from device from the dropdown list. Everything on this page will be overwritten",
|
||||||
"DevDetail_EveandAl_AlertAllEvents": "Alert All Events",
|
"DevDetail_EveandAl_AlertAllEvents": "Alert Events",
|
||||||
"DevDetail_EveandAl_AlertDown": "Alert Down",
|
"DevDetail_EveandAl_AlertDown": "Alert Down",
|
||||||
"DevDetail_EveandAl_Archived": "Archived",
|
"DevDetail_EveandAl_Archived": "Archived",
|
||||||
"DevDetail_EveandAl_NewDevice": "New Device",
|
"DevDetail_EveandAl_NewDevice": "New Device",
|
||||||
@@ -215,6 +217,7 @@
|
|||||||
"Device_TableHead_RowID": "Row ID",
|
"Device_TableHead_RowID": "Row ID",
|
||||||
"Device_TableHead_Rowid": "Row ID",
|
"Device_TableHead_Rowid": "Row ID",
|
||||||
"Device_TableHead_SSID": "SSID",
|
"Device_TableHead_SSID": "SSID",
|
||||||
|
"Device_TableHead_SourcePlugin": "Source Plugin",
|
||||||
"Device_TableHead_Status": "Status",
|
"Device_TableHead_Status": "Status",
|
||||||
"Device_TableHead_SyncHubNodeName": "Sync Node",
|
"Device_TableHead_SyncHubNodeName": "Sync Node",
|
||||||
"Device_TableHead_Type": "Type",
|
"Device_TableHead_Type": "Type",
|
||||||
@@ -274,12 +277,15 @@
|
|||||||
"Gen_AreYouSure": "Are you sure?",
|
"Gen_AreYouSure": "Are you sure?",
|
||||||
"Gen_Backup": "Run Backup",
|
"Gen_Backup": "Run Backup",
|
||||||
"Gen_Cancel": "Cancel",
|
"Gen_Cancel": "Cancel",
|
||||||
|
"Gen_Change": "Change",
|
||||||
"Gen_Copy": "Run",
|
"Gen_Copy": "Run",
|
||||||
"Gen_DataUpdatedUITakesTime": "OK - It may take a while for the UI to update if a scan is running.",
|
"Gen_DataUpdatedUITakesTime": "OK - It may take a while for the UI to update if a scan is running.",
|
||||||
"Gen_Delete": "Delete",
|
"Gen_Delete": "Delete",
|
||||||
"Gen_DeleteAll": "Delete all",
|
"Gen_DeleteAll": "Delete all",
|
||||||
|
"Gen_Description": "Description",
|
||||||
"Gen_Error": "Error",
|
"Gen_Error": "Error",
|
||||||
"Gen_Filter": "Filter",
|
"Gen_Filter": "Filter",
|
||||||
|
"Gen_Generate": "Generate",
|
||||||
"Gen_LockedDB": "ERROR - DB might be locked - Check F12 Dev tools -> Console or try later.",
|
"Gen_LockedDB": "ERROR - DB might be locked - Check F12 Dev tools -> Console or try later.",
|
||||||
"Gen_Offline": "Offline",
|
"Gen_Offline": "Offline",
|
||||||
"Gen_Okay": "Ok",
|
"Gen_Okay": "Ok",
|
||||||
@@ -292,6 +298,7 @@
|
|||||||
"Gen_Save": "Save",
|
"Gen_Save": "Save",
|
||||||
"Gen_Saved": "Saved",
|
"Gen_Saved": "Saved",
|
||||||
"Gen_Search": "Search",
|
"Gen_Search": "Search",
|
||||||
|
"Gen_SelectToPreview": "Select to preview",
|
||||||
"Gen_Selected_Devices": "Selected Devices:",
|
"Gen_Selected_Devices": "Selected Devices:",
|
||||||
"Gen_Switch": "Switch",
|
"Gen_Switch": "Switch",
|
||||||
"Gen_Upd": "Updated successfully",
|
"Gen_Upd": "Updated successfully",
|
||||||
@@ -302,8 +309,10 @@
|
|||||||
"Gen_Work_In_Progress": "Work in progress, good time to feedback on https://github.com/jokob-sk/NetAlertX/issues",
|
"Gen_Work_In_Progress": "Work in progress, good time to feedback on https://github.com/jokob-sk/NetAlertX/issues",
|
||||||
"General_display_name": "General",
|
"General_display_name": "General",
|
||||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||||
"HRS_TO_KEEP_NEWDEV_description": "This is a maintenance setting. If enabled (<code>0</code> is disabled), devices marked as <b>New Device</b> will be deleted if their <b>First Session</b> time was older than the specified hours in this setting. Use this setting if you want to auto-delete <b>New Devices</b> after <code>X</code> hours.",
|
"HRS_TO_KEEP_NEWDEV_description": "This is a maintenance setting <b>DELETING devices</b>. If enabled (<code>0</code> is disabled), devices marked as <b>New Device</b> will be deleted if their <b>First Session</b> time was older than the specified hours in this setting. Use this setting if you want to auto-delete <b>New Devices</b> after <code>X</code> hours.",
|
||||||
"HRS_TO_KEEP_NEWDEV_name": "Keep new devices for",
|
"HRS_TO_KEEP_NEWDEV_name": "Delete new devices after",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_description": "This is a maintenance setting <b>DELETING devices</b>. If enabled (<code>0</code> is disabled), devices that are <b>Offline</b> and their <b>Last Offline</b> date time is older than the specified hours in this setting. Use this setting if you want to auto-delete <b>Offline Devices</b> after <code>X</code> hours being offline.",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_name": "Delete offline devices after",
|
||||||
"HelpFAQ_Cat_Detail": "Details",
|
"HelpFAQ_Cat_Detail": "Details",
|
||||||
"HelpFAQ_Cat_Detail_300_head": "What means ",
|
"HelpFAQ_Cat_Detail_300_head": "What means ",
|
||||||
"HelpFAQ_Cat_Detail_300_text_a": "means a network device (a device of the type AP, Gateway, Firewall, Hypervisor, Powerline, Switch, WLAN, PLC, Router,USB LAN Adapter, USB WIFI Adapter, or Internet). Custom types can be added via the <code>NETWORK_DEVICE_TYPES</code> setting.",
|
"HelpFAQ_Cat_Detail_300_text_a": "means a network device (a device of the type AP, Gateway, Firewall, Hypervisor, Powerline, Switch, WLAN, PLC, Router,USB LAN Adapter, USB WIFI Adapter, or Internet). Custom types can be added via the <code>NETWORK_DEVICE_TYPES</code> setting.",
|
||||||
@@ -347,6 +356,7 @@
|
|||||||
"Loading": "Loading...",
|
"Loading": "Loading...",
|
||||||
"Login_Box": "Enter your password",
|
"Login_Box": "Enter your password",
|
||||||
"Login_Default_PWD": "Default password \"123456\" is still active.",
|
"Login_Default_PWD": "Default password \"123456\" is still active.",
|
||||||
|
"Login_Info": "Passwords are set via the Set Password plugin. Check the <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">SETPWD docs</a> if you have issues logging in.",
|
||||||
"Login_Psw-box": "Password",
|
"Login_Psw-box": "Password",
|
||||||
"Login_Psw_alert": "Password Alert!",
|
"Login_Psw_alert": "Password Alert!",
|
||||||
"Login_Psw_folder": "in the config folder.",
|
"Login_Psw_folder": "in the config folder.",
|
||||||
@@ -527,6 +537,7 @@
|
|||||||
"Plugins_DeleteAll": "Delete all (filters are ignored)",
|
"Plugins_DeleteAll": "Delete all (filters are ignored)",
|
||||||
"Plugins_Filters_Mac": "Mac Filter",
|
"Plugins_Filters_Mac": "Mac Filter",
|
||||||
"Plugins_History": "Events History",
|
"Plugins_History": "Events History",
|
||||||
|
"Plugins_Obj_DeleteListed": "Delete Listed Objects",
|
||||||
"Plugins_Objects": "Plugin Objects",
|
"Plugins_Objects": "Plugin Objects",
|
||||||
"Plugins_Out_of": "out of",
|
"Plugins_Out_of": "out of",
|
||||||
"Plugins_Unprocessed_Events": "Unprocessed Events",
|
"Plugins_Unprocessed_Events": "Unprocessed Events",
|
||||||
@@ -538,6 +549,12 @@
|
|||||||
"Presence_CalHead_week": "week",
|
"Presence_CalHead_week": "week",
|
||||||
"Presence_CalHead_year": "year",
|
"Presence_CalHead_year": "year",
|
||||||
"Presence_CallHead_Devices": "Devices",
|
"Presence_CallHead_Devices": "Devices",
|
||||||
|
"Presence_Key_OnlineNow": "Now online",
|
||||||
|
"Presence_Key_OnlineNow_desc": "Device detected in the last scan as online.",
|
||||||
|
"Presence_Key_OnlinePast": "Past online",
|
||||||
|
"Presence_Key_OnlinePastMiss": "Past online (miss-match)",
|
||||||
|
"Presence_Key_OnlinePastMiss_desc": "Device online in the past, but currently offline, but the start session might be missing or has conflicting data. (might be a bug - please submit a PR if you know how to fix it - I'm a bit lost in code here)",
|
||||||
|
"Presence_Key_OnlinePast_desc": "Device online in the past, but currently offline.",
|
||||||
"Presence_Loading": "Loading...",
|
"Presence_Loading": "Loading...",
|
||||||
"Presence_Shortcut_AllDevices": "My Devices",
|
"Presence_Shortcut_AllDevices": "My Devices",
|
||||||
"Presence_Shortcut_Archived": "Archived",
|
"Presence_Shortcut_Archived": "Archived",
|
||||||
@@ -556,10 +573,12 @@
|
|||||||
"RandomMAC_hover": "Autodetected - indicates if the device randomizes it's MAC address.",
|
"RandomMAC_hover": "Autodetected - indicates if the device randomizes it's MAC address.",
|
||||||
"Reports_Sent_Log": "Sent Reports Log",
|
"Reports_Sent_Log": "Sent Reports Log",
|
||||||
"SCAN_SUBNETS_description": "Most on-network scanners (ARP-SCAN, NMAP, NSLOOKUP, DIG, PHOLUS) rely on scanning specific network interfaces and subnets. Check the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">subnets documentation</a> for help on this setting, especially VLANs, what VLANs are supported, or how to figure out the network mask and your interface. <br/> <br/> An alternative to on-network scanners is to enable some other Device scanners/importers that don't rely on NetAlert<sup>X</sup> having access to the network (UNIFI, dhcp.leases, PiHole, etc.). <br/> <br/> Note: The scan time itself depends on the number of IP addresses to check, so set this up carefully with the appropriate network mask and interface.",
|
"SCAN_SUBNETS_description": "Most on-network scanners (ARP-SCAN, NMAP, NSLOOKUP, DIG, PHOLUS) rely on scanning specific network interfaces and subnets. Check the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">subnets documentation</a> for help on this setting, especially VLANs, what VLANs are supported, or how to figure out the network mask and your interface. <br/> <br/> An alternative to on-network scanners is to enable some other Device scanners/importers that don't rely on NetAlert<sup>X</sup> having access to the network (UNIFI, dhcp.leases, PiHole, etc.). <br/> <br/> Note: The scan time itself depends on the number of IP addresses to check, so set this up carefully with the appropriate network mask and interface.",
|
||||||
|
"SCAN_SUBNETS_name": "Networks to scan",
|
||||||
"SYSTEM_TITLE": "System Information",
|
"SYSTEM_TITLE": "System Information",
|
||||||
"Setting_Override": "Override value",
|
"Setting_Override": "Override value",
|
||||||
"Setting_Override_Description": "Enabling this option will override an App supplied default value with the value specified above.",
|
"Setting_Override_Description": "Enabling this option will override an App supplied default value with the value specified above.",
|
||||||
"Settings_Metadata_Toggle": "Show/hide metadata for the given setting.",
|
"Settings_Metadata_Toggle": "Show/hide metadata for the given setting.",
|
||||||
|
"Settings_Show_Description": "Show setting description.",
|
||||||
"Settings_device_Scanners_desync": "⚠ Device scanner schedules are out-of-sync.",
|
"Settings_device_Scanners_desync": "⚠ Device scanner schedules are out-of-sync.",
|
||||||
"Settings_device_Scanners_desync_popup": "Schedules of devices scanners (<code>*_RUN_SCHD</code>) are not the same. This will result into inconsistent device online/offline notifications. Unless this is intended, please use the same schedule for all enabled <b>🔍Device scanners</b>.",
|
"Settings_device_Scanners_desync_popup": "Schedules of devices scanners (<code>*_RUN_SCHD</code>) are not the same. This will result into inconsistent device online/offline notifications. Unless this is intended, please use the same schedule for all enabled <b>🔍Device scanners</b>.",
|
||||||
"Speedtest_Results": "Speedtest Results",
|
"Speedtest_Results": "Speedtest Results",
|
||||||
@@ -646,14 +665,16 @@
|
|||||||
"UI_ICONS_name": "Pre-defined icons",
|
"UI_ICONS_name": "Pre-defined icons",
|
||||||
"UI_LANG_description": "Select the preferred UI language. Help translating or suggest languages in the online portal of <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
|
"UI_LANG_description": "Select the preferred UI language. Help translating or suggest languages in the online portal of <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
|
||||||
"UI_LANG_name": "UI Language",
|
"UI_LANG_name": "UI Language",
|
||||||
"UI_MY_DEVICES_description": "Devices of which statuses should be shown in the default <b>My Devices</b> view. (<code>CTRL + Click</code> to select/deselect)",
|
"UI_MY_DEVICES_description": "Devices of which statuses should be shown in the default <b>My Devices</b> view.",
|
||||||
"UI_MY_DEVICES_name": "Show in My Devices view",
|
"UI_MY_DEVICES_name": "Show in My Devices view",
|
||||||
"UI_NOT_RANDOM_MAC_description": "Mac prefixes which shouldn't be marked as Random devices. Enter for example <code>52</code> to exclude devices starting with <code>52:xx:xx:xx:xx:xx</code> from being marked as devices with a random MAC address.",
|
"UI_NOT_RANDOM_MAC_description": "Mac prefixes which shouldn't be marked as Random devices. Enter for example <code>52</code> to exclude devices starting with <code>52:xx:xx:xx:xx:xx</code> from being marked as devices with a random MAC address.",
|
||||||
"UI_NOT_RANDOM_MAC_name": "Don't mark as Random",
|
"UI_NOT_RANDOM_MAC_name": "Don't mark as Random",
|
||||||
"UI_PRESENCE_description": "Select what statuses should be shown in the <b>Device presence</b> chart in the <a href=\"/devices.php\" target=\"_blank\">Devices</a> page. (<code>CTRL + Click</code> to select/deselect)",
|
"UI_PRESENCE_description": "Select what statuses should be shown in the <b>Device presence</b> chart in the <a href=\"/devices.php\" target=\"_blank\">Devices</a> page.",
|
||||||
"UI_PRESENCE_name": "Show in presence chart",
|
"UI_PRESENCE_name": "Show in presence chart",
|
||||||
"UI_REFRESH_description": "Enter number of seconds after which the UI reloads. Set to <code>0</code> to disable.",
|
"UI_REFRESH_description": "Enter number of seconds after which the UI reloads. Set to <code>0</code> to disable.",
|
||||||
"UI_REFRESH_name": "Auto-refresh UI",
|
"UI_REFRESH_name": "Auto-refresh UI",
|
||||||
|
"VERSION_description": "Version or timestamp helper value to check if app was upgraded.",
|
||||||
|
"VERSION_name": "Version or timestamp",
|
||||||
"devices_old": "Refreshing...",
|
"devices_old": "Refreshing...",
|
||||||
"general_event_description": "The event you have triggered might take a while until background processes finish. The execution ended once the below execution queue empties (Check the <a href='/maintenance.php#tab_Logging'>error log</a> if you encounter issues). <br/> <br/> Execution queue:",
|
"general_event_description": "The event you have triggered might take a while until background processes finish. The execution ended once the below execution queue empties (Check the <a href='/maintenance.php#tab_Logging'>error log</a> if you encounter issues). <br/> <br/> Execution queue:",
|
||||||
"general_event_title": "Executing an ad-hoc event",
|
"general_event_title": "Executing an ad-hoc event",
|
||||||
|
|||||||
28
front/php/templates/language/es_es.json
Normal file → Executable file
28
front/php/templates/language/es_es.json
Normal file → Executable file
@@ -66,6 +66,8 @@
|
|||||||
"BackDevices_Restore_okay": "Restauración ejecutado con éxito.",
|
"BackDevices_Restore_okay": "Restauración ejecutado con éxito.",
|
||||||
"BackDevices_darkmode_disabled": "Darkmode Desactivado",
|
"BackDevices_darkmode_disabled": "Darkmode Desactivado",
|
||||||
"BackDevices_darkmode_enabled": "Darkmode Activado",
|
"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",
|
||||||
"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_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",
|
"DAYS_TO_KEEP_EVENTS_name": "Eliminar eventos anteriores a",
|
||||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Copiar detalles del dispositivo",
|
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Copiar detalles del dispositivo",
|
||||||
@@ -225,6 +227,7 @@
|
|||||||
"Device_TableHead_RowID": "Row ID",
|
"Device_TableHead_RowID": "Row ID",
|
||||||
"Device_TableHead_Rowid": "Row ID",
|
"Device_TableHead_Rowid": "Row ID",
|
||||||
"Device_TableHead_SSID": "SSID",
|
"Device_TableHead_SSID": "SSID",
|
||||||
|
"Device_TableHead_SourcePlugin": "Fuente del plugin",
|
||||||
"Device_TableHead_Status": "Situación",
|
"Device_TableHead_Status": "Situación",
|
||||||
"Device_TableHead_SyncHubNodeName": "Nodo de sincronización",
|
"Device_TableHead_SyncHubNodeName": "Nodo de sincronización",
|
||||||
"Device_TableHead_Type": "Tipo",
|
"Device_TableHead_Type": "Tipo",
|
||||||
@@ -284,12 +287,15 @@
|
|||||||
"Gen_AreYouSure": "¿Estás seguro?",
|
"Gen_AreYouSure": "¿Estás seguro?",
|
||||||
"Gen_Backup": "Ejecutar copia de seguridad",
|
"Gen_Backup": "Ejecutar copia de seguridad",
|
||||||
"Gen_Cancel": "Cancelar",
|
"Gen_Cancel": "Cancelar",
|
||||||
|
"Gen_Change": "Cambiar",
|
||||||
"Gen_Copy": "Ejecutar",
|
"Gen_Copy": "Ejecutar",
|
||||||
"Gen_DataUpdatedUITakesTime": "Correcto - La interfaz puede tardar en actualizarse si se está ejecutando un escaneo.",
|
"Gen_DataUpdatedUITakesTime": "Correcto - La interfaz puede tardar en actualizarse si se está ejecutando un escaneo.",
|
||||||
"Gen_Delete": "Eliminar",
|
"Gen_Delete": "Eliminar",
|
||||||
"Gen_DeleteAll": "Eliminar todo",
|
"Gen_DeleteAll": "Eliminar todo",
|
||||||
|
"Gen_Description": "Descripción",
|
||||||
"Gen_Error": "Error",
|
"Gen_Error": "Error",
|
||||||
"Gen_Filter": "Filtro",
|
"Gen_Filter": "Filtro",
|
||||||
|
"Gen_Generate": "Generar",
|
||||||
"Gen_LockedDB": "Fallo - La base de datos puede estar bloqueada - Pulsa F1 -> Ajustes de desarrolladores -> Consola o prueba más tarde.",
|
"Gen_LockedDB": "Fallo - La base de datos puede estar bloqueada - Pulsa F1 -> Ajustes de desarrolladores -> Consola o prueba más tarde.",
|
||||||
"Gen_Offline": "Desconectado",
|
"Gen_Offline": "Desconectado",
|
||||||
"Gen_Okay": "Aceptar",
|
"Gen_Okay": "Aceptar",
|
||||||
@@ -302,6 +308,7 @@
|
|||||||
"Gen_Save": "Guardar",
|
"Gen_Save": "Guardar",
|
||||||
"Gen_Saved": "Guardado",
|
"Gen_Saved": "Guardado",
|
||||||
"Gen_Search": "Buscar",
|
"Gen_Search": "Buscar",
|
||||||
|
"Gen_SelectToPreview": "Seleccionar para previsualizar",
|
||||||
"Gen_Selected_Devices": "Dispositivos seleccionados:",
|
"Gen_Selected_Devices": "Dispositivos seleccionados:",
|
||||||
"Gen_Switch": "Cambiar",
|
"Gen_Switch": "Cambiar",
|
||||||
"Gen_Upd": "Actualizado correctamente",
|
"Gen_Upd": "Actualizado correctamente",
|
||||||
@@ -312,8 +319,10 @@
|
|||||||
"Gen_Work_In_Progress": "Trabajo en curso, un buen momento para hacer comentarios en https://github.com/jokob-sk/NetAlertX/issues",
|
"Gen_Work_In_Progress": "Trabajo en curso, un buen momento para hacer comentarios en https://github.com/jokob-sk/NetAlertX/issues",
|
||||||
"General_display_name": "General",
|
"General_display_name": "General",
|
||||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||||
"HRS_TO_KEEP_NEWDEV_description": "Esta es una configuración de mantenimiento. Si está habilitado (<code>0</code> está deshabilitado), los dispositivos marcados como <b>Nuevo dispositivo</b> se eliminarán si su <b>Primera sesión</b> el tiempo era anterior a las horas especificadas en esta configuración. Utilice esta configuración si desea eliminar automáticamente <b>Nuevos dispositivos</b> después de <code>X</code> horas.",
|
"HRS_TO_KEEP_NEWDEV_description": "Se trata de una configuración de mantenimiento <b>BORRAR dispositivos</b>. Si está activado (<code>0</code> está desactivado), los dispositivos marcados como <b>Nuevo dispositivo</b> se eliminarán si su fecha de <b>primera sesión</b> es anterior a las horas especificadas en este ajuste. Use este ajuste si desea eliminar automáticamente <b>Nuevos dispositivos</b> después de <code>X</code> horas.",
|
||||||
"HRS_TO_KEEP_NEWDEV_name": "Guardar nuevos dispositivos para",
|
"HRS_TO_KEEP_NEWDEV_name": "Eliminar nuevos dispositivos después",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_description": "Se trata de una configuración de mantenimiento <b>BORRAR dispositivos</b>. Si está activado (<code>0</code> está desactivado), los dispositivos que están <b>sin conexión</b> y su fecha de <b>última conexión</b> son anteriores a las horas especificadas en este ajuste. Use este ajuste si desea eliminar automáticamente <b>los dispositivos sin conexión</b> después de que el <code>X</code> horas esté sin conexión.",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_name": "Borrar dispositivos sin conexión después de",
|
||||||
"HelpFAQ_Cat_Detail": "Detalles",
|
"HelpFAQ_Cat_Detail": "Detalles",
|
||||||
"HelpFAQ_Cat_Detail_300_head": "¿Qué significa? ",
|
"HelpFAQ_Cat_Detail_300_head": "¿Qué significa? ",
|
||||||
"HelpFAQ_Cat_Detail_300_text_a": "significa un dispositivo de red (un dispositivo del tipo AP, Gateway, Firewall, Hypervisor, Powerline, Switch, WLAN, PLC, Router,Adaptador LAN USB, Adaptador WIFI USB o Internet). Los tipos personalizados pueden añadirse mediante el ajuste <code>NETWORK_DEVICE_TYPES</code>.",
|
"HelpFAQ_Cat_Detail_300_text_a": "significa un dispositivo de red (un dispositivo del tipo AP, Gateway, Firewall, Hypervisor, Powerline, Switch, WLAN, PLC, Router,Adaptador LAN USB, Adaptador WIFI USB o Internet). Los tipos personalizados pueden añadirse mediante el ajuste <code>NETWORK_DEVICE_TYPES</code>.",
|
||||||
@@ -357,6 +366,7 @@
|
|||||||
"Loading": "Cargando...",
|
"Loading": "Cargando...",
|
||||||
"Login_Box": "Ingrese su contraseña",
|
"Login_Box": "Ingrese su contraseña",
|
||||||
"Login_Default_PWD": "La contraseña por defecto \"123456\" sigue activa.",
|
"Login_Default_PWD": "La contraseña por defecto \"123456\" sigue activa.",
|
||||||
|
"Login_Info": "Las contraseñas se establecen a través del plugin Establecer contraseña. Compruebe la <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">documentación SETPWD</a> si tiene problemas para iniciar sesión.",
|
||||||
"Login_Psw-box": "Contraseña",
|
"Login_Psw-box": "Contraseña",
|
||||||
"Login_Psw_alert": "¡Alerta de Contraseña!",
|
"Login_Psw_alert": "¡Alerta de Contraseña!",
|
||||||
"Login_Psw_folder": "en la carpeta config.",
|
"Login_Psw_folder": "en la carpeta config.",
|
||||||
@@ -566,6 +576,7 @@
|
|||||||
"Plugins_DeleteAll": "Eliminar todo (se ignoran los filtros)",
|
"Plugins_DeleteAll": "Eliminar todo (se ignoran los filtros)",
|
||||||
"Plugins_Filters_Mac": "Filtro MAC",
|
"Plugins_Filters_Mac": "Filtro MAC",
|
||||||
"Plugins_History": "Historial de eventos",
|
"Plugins_History": "Historial de eventos",
|
||||||
|
"Plugins_Obj_DeleteListed": "Eliminar objetos enumerados",
|
||||||
"Plugins_Objects": "Objetos del Plugin",
|
"Plugins_Objects": "Objetos del Plugin",
|
||||||
"Plugins_Out_of": "de",
|
"Plugins_Out_of": "de",
|
||||||
"Plugins_Unprocessed_Events": "Eventos sin procesar",
|
"Plugins_Unprocessed_Events": "Eventos sin procesar",
|
||||||
@@ -577,6 +588,12 @@
|
|||||||
"Presence_CalHead_week": "semana",
|
"Presence_CalHead_week": "semana",
|
||||||
"Presence_CalHead_year": "año",
|
"Presence_CalHead_year": "año",
|
||||||
"Presence_CallHead_Devices": "Dispositivos",
|
"Presence_CallHead_Devices": "Dispositivos",
|
||||||
|
"Presence_Key_OnlineNow": "En línea",
|
||||||
|
"Presence_Key_OnlineNow_desc": "Dispositivo detectado en el último escaneo como conectado.",
|
||||||
|
"Presence_Key_OnlinePast": "Anterior en línea",
|
||||||
|
"Presence_Key_OnlinePastMiss": "Anterior en línea (miss-match)",
|
||||||
|
"Presence_Key_OnlinePastMiss_desc": "Dispositivo en línea en el pasado, pero actualmente desconectado, pero la sesión de inicio podría estar faltando o tiene datos conflictivos. (Puede ser un error - por favor envíe un PR si sabe cómo solucionarlo - estoy un poco perdido en código)",
|
||||||
|
"Presence_Key_OnlinePast_desc": "Dispositivo en línea en el pasado, pero actualmente no conectado.",
|
||||||
"Presence_Loading": "Cargando...",
|
"Presence_Loading": "Cargando...",
|
||||||
"Presence_Shortcut_AllDevices": "Mis dispositivos",
|
"Presence_Shortcut_AllDevices": "Mis dispositivos",
|
||||||
"Presence_Shortcut_Archived": "Archivado(s)",
|
"Presence_Shortcut_Archived": "Archivado(s)",
|
||||||
@@ -628,6 +645,7 @@
|
|||||||
"Setting_Override": "Sobreescribir el valor",
|
"Setting_Override": "Sobreescribir el valor",
|
||||||
"Setting_Override_Description": "Habilitar esta opción anulará un valor predeterminado proporcionado por la aplicación con el valor especificado anteriormente.",
|
"Setting_Override_Description": "Habilitar esta opción anulará un valor predeterminado proporcionado por la aplicación con el valor especificado anteriormente.",
|
||||||
"Settings_Metadata_Toggle": "Mostrar/ocultar los metadatos de la configuración.",
|
"Settings_Metadata_Toggle": "Mostrar/ocultar los metadatos de la configuración.",
|
||||||
|
"Settings_Show_Description": "Mostrar descripción de la configuración.",
|
||||||
"Settings_Title": "<i class=\"fa fa-cog\"> Configuración</i>",
|
"Settings_Title": "<i class=\"fa fa-cog\"> Configuración</i>",
|
||||||
"Settings_device_Scanners_desync": "⚠ Los horarios del escáner de los dispositivos no están sincronizados.",
|
"Settings_device_Scanners_desync": "⚠ Los horarios del escáner de los dispositivos no están sincronizados.",
|
||||||
"Settings_device_Scanners_desync_popup": "Los horarios de escáneres de dispositivos (<code> *_RUN_SCHD</code> ) no son lo mismo. Esto resultará en notificaciones inconsistentes del dispositivo en línea/fuera de línea. A menos que sea así, utilice el mismo horario para todos los habilitados.<b> 🔍Escáneres de dispositivos</b> .",
|
"Settings_device_Scanners_desync_popup": "Los horarios de escáneres de dispositivos (<code> *_RUN_SCHD</code> ) no son lo mismo. Esto resultará en notificaciones inconsistentes del dispositivo en línea/fuera de línea. A menos que sea así, utilice el mismo horario para todos los habilitados.<b> 🔍Escáneres de dispositivos</b> .",
|
||||||
@@ -715,14 +733,16 @@
|
|||||||
"UI_ICONS_name": "Iconos predefinidos",
|
"UI_ICONS_name": "Iconos predefinidos",
|
||||||
"UI_LANG_description": "Seleccione el idioma preferido para la interfaz de usuario. Ayude a traducir o sugiera idiomas en el portal en línea de <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
|
"UI_LANG_description": "Seleccione el idioma preferido para la interfaz de usuario. Ayude a traducir o sugiera idiomas en el portal en línea de <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
|
||||||
"UI_LANG_name": "Idioma de interfaz",
|
"UI_LANG_name": "Idioma de interfaz",
|
||||||
"UI_MY_DEVICES_description": "Dispositivos cuyos estados deben mostrarse en la vista por defecto <b>Mis dispositivos</b>. (<code>CTRL + Click</code> para seleccionar/deseleccionar)",
|
"UI_MY_DEVICES_description": "Dispositivos cuyos estados deben mostrarse en la vista por defecto <b>Mis dispositivos</b>.",
|
||||||
"UI_MY_DEVICES_name": "Mostrar en Mis dispositivos",
|
"UI_MY_DEVICES_name": "Mostrar en Mis dispositivos",
|
||||||
"UI_NOT_RANDOM_MAC_description": "Prefijos Mac que no deberían marcarse como dispositivos aleatorios. Introduzca por ejemplo <code>52</code> para excluir los dispositivos que empiecen por <code>52:xx:xx:xx:xx</code> para ser marcados como dispositivos con una dirección MAC aleatoria.",
|
"UI_NOT_RANDOM_MAC_description": "Prefijos Mac que no deberían marcarse como dispositivos aleatorios. Introduzca por ejemplo <code>52</code> para excluir los dispositivos que empiecen por <code>52:xx:xx:xx:xx</code> para ser marcados como dispositivos con una dirección MAC aleatoria.",
|
||||||
"UI_NOT_RANDOM_MAC_name": "No marcar como aleatoria",
|
"UI_NOT_RANDOM_MAC_name": "No marcar como aleatoria",
|
||||||
"UI_PRESENCE_description": "Elige que estados del dispositivo deben mostrarse en la gráfica de <b>Presencia del dispositivo a lo largo del tiempo</b> de la página de <a href=\"/devices.php\" target=\"_blank\">Dispositivos</a>. (<code>CTRL + Clic</code> para seleccionar / deseleccionar)",
|
"UI_PRESENCE_description": "Elige que estados del dispositivo deben mostrarse en la gráfica de <b>Presencia del dispositivo a lo largo del tiempo</b> de la página de <a href=\"/devices.php\" target=\"_blank\">Dispositivos</a>.",
|
||||||
"UI_PRESENCE_name": "Mostrar en el gráfico de presencia",
|
"UI_PRESENCE_name": "Mostrar en el gráfico de presencia",
|
||||||
"UI_REFRESH_description": "Ingrese el número de segundos después de los cuales se recarga la interfaz de usuario. Ajustado a <code> 0 </code> para desactivar.",
|
"UI_REFRESH_description": "Ingrese el número de segundos después de los cuales se recarga la interfaz de usuario. Ajustado a <code> 0 </code> para desactivar.",
|
||||||
"UI_REFRESH_name": "Actualización automática de la interfaz de usuario",
|
"UI_REFRESH_name": "Actualización automática de la interfaz de usuario",
|
||||||
|
"VERSION_description": "Valor de ayuda de versión o marca de tiempo para comprobar si la aplicación se ha actualizado.",
|
||||||
|
"VERSION_name": "Versión o marca de tiempo",
|
||||||
"WEBHOOK_PAYLOAD_description": "El formato de datos de carga de Webhook para el atributo <code>body</code> > <code>attachments</code> > <code>text</code> en el json de carga. Vea un ejemplo de la carga <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json\">aquí</a>. (por ejemplo: para discord use <code>text</code>)",
|
"WEBHOOK_PAYLOAD_description": "El formato de datos de carga de Webhook para el atributo <code>body</code> > <code>attachments</code> > <code>text</code> en el json de carga. Vea un ejemplo de la carga <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/front/report_templates/webhook_json_sample.json\">aquí</a>. (por ejemplo: para discord use <code>text</code>)",
|
||||||
"WEBHOOK_PAYLOAD_name": "Tipo de carga",
|
"WEBHOOK_PAYLOAD_name": "Tipo de carga",
|
||||||
"WEBHOOK_REQUEST_METHOD_description": "El método de solicitud HTTP que se utilizará para la llamada de webhook.",
|
"WEBHOOK_REQUEST_METHOD_description": "El método de solicitud HTTP que se utilizará para la llamada de webhook.",
|
||||||
|
|||||||
475
front/php/templates/language/fr_fr.json
Normal file → Executable file
475
front/php/templates/language/fr_fr.json
Normal file → Executable file
@@ -4,7 +4,7 @@
|
|||||||
"API_display_name": "API",
|
"API_display_name": "API",
|
||||||
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
|
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
|
||||||
"About_Design": "Conçu pour :",
|
"About_Design": "Conçu pour :",
|
||||||
"About_Exit": "Déconnexion",
|
"About_Exit": "Se déconnecter",
|
||||||
"About_Title": "Analyse de la sécurité du réseau et cadre de notification",
|
"About_Title": "Analyse de la sécurité du réseau et cadre de notification",
|
||||||
"AppEvents_DateTimeCreated": "Connecté",
|
"AppEvents_DateTimeCreated": "Connecté",
|
||||||
"AppEvents_Extra": "Extra",
|
"AppEvents_Extra": "Extra",
|
||||||
@@ -56,11 +56,13 @@
|
|||||||
"BackDevices_Restore_okay": "Restauration exécutée avec succès.",
|
"BackDevices_Restore_okay": "Restauration exécutée avec succès.",
|
||||||
"BackDevices_darkmode_disabled": "Mode sombre désactivé",
|
"BackDevices_darkmode_disabled": "Mode sombre désactivé",
|
||||||
"BackDevices_darkmode_enabled": "Mode sombre activé",
|
"BackDevices_darkmode_enabled": "Mode sombre activé",
|
||||||
|
"CLEAR_NEW_FLAG_description": "Si activé (<code>0</code> est désactivé), les appareils marqués comme <b>Nouvel appareil</b> seront démarqués si la limite de temps (spécifiée en heures) dépasse la durée de <b>Première Session</b>.",
|
||||||
|
"CLEAR_NEW_FLAG_name": "Supprime le nouveau drapeau",
|
||||||
"DAYS_TO_KEEP_EVENTS_description": "Il s'agit d'un paramètre de maintenance. Il indique le nombre de jours pendant lesquels les entrées d'événements seront conservées. Tous les événements plus anciens seront supprimés périodiquement. S'applique également à l'historique des événements du plugin.",
|
"DAYS_TO_KEEP_EVENTS_description": "Il s'agit d'un paramètre de maintenance. Il indique le nombre de jours pendant lesquels les entrées d'événements seront conservées. Tous les événements plus anciens seront supprimés périodiquement. S'applique également à l'historique des événements du plugin.",
|
||||||
"DAYS_TO_KEEP_EVENTS_name": "Supprimer les événements plus anciens que",
|
"DAYS_TO_KEEP_EVENTS_name": "Supprimer les événements plus anciens que",
|
||||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Copier les détails de l'appareil",
|
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Copier les détails de l'appareil",
|
||||||
"DevDetail_Copy_Device_Tooltip": "Copier les détails de l'appareil dans la liste déroulante. Tout ce qui se trouve sur cette page sera remplacé",
|
"DevDetail_Copy_Device_Tooltip": "Copier les détails de l'appareil dans la liste déroulante. Tout ce qui se trouve sur cette page sera remplacé",
|
||||||
"DevDetail_EveandAl_AlertAllEvents": "Alerter de tous les événements",
|
"DevDetail_EveandAl_AlertAllEvents": "Alerter les événements",
|
||||||
"DevDetail_EveandAl_AlertDown": "Alerte de panne",
|
"DevDetail_EveandAl_AlertDown": "Alerte de panne",
|
||||||
"DevDetail_EveandAl_Archived": "Archivés",
|
"DevDetail_EveandAl_Archived": "Archivés",
|
||||||
"DevDetail_EveandAl_NewDevice": "Nouvel appareil",
|
"DevDetail_EveandAl_NewDevice": "Nouvel appareil",
|
||||||
@@ -72,9 +74,9 @@
|
|||||||
"DevDetail_EveandAl_Skip": "Passer les notifications répétées durant",
|
"DevDetail_EveandAl_Skip": "Passer les notifications répétées durant",
|
||||||
"DevDetail_EveandAl_Title": "<i class=\"fa fa-bolt\"></i> Configuration des événements & Alertes",
|
"DevDetail_EveandAl_Title": "<i class=\"fa fa-bolt\"></i> Configuration des événements & Alertes",
|
||||||
"DevDetail_Events_CheckBox": "Masquer les événements de connexion",
|
"DevDetail_Events_CheckBox": "Masquer les événements de connexion",
|
||||||
"DevDetail_GoToNetworkNode": "Naviguer à la page Réseau pour le noeud sélectionné",
|
"DevDetail_GoToNetworkNode": "Naviguer à la page Réseau pour le nœud sélectionné.",
|
||||||
"DevDetail_Icon": "Icône",
|
"DevDetail_Icon": "Icône",
|
||||||
"DevDetail_Icon_Descr": "Renseigner le nom d'une icône Font Awesome sans le préfixe fa- ou la classe complète ; par ex. fa fa-brands fa-apple.",
|
"DevDetail_Icon_Descr": "Renseigner le nom d'une icône Font Awesome sans le préfixe fa- ou la classe complète, par ex. fa fa-brands fa-apple.",
|
||||||
"DevDetail_Loading": "Chargement…",
|
"DevDetail_Loading": "Chargement…",
|
||||||
"DevDetail_MainInfo_Comments": "Observations",
|
"DevDetail_MainInfo_Comments": "Observations",
|
||||||
"DevDetail_MainInfo_Favorite": "Favori",
|
"DevDetail_MainInfo_Favorite": "Favori",
|
||||||
@@ -91,12 +93,12 @@
|
|||||||
"DevDetail_MainInfo_Type": "Type",
|
"DevDetail_MainInfo_Type": "Type",
|
||||||
"DevDetail_MainInfo_Vendor": "Fabricant",
|
"DevDetail_MainInfo_Vendor": "Fabricant",
|
||||||
"DevDetail_MainInfo_mac": "MAC",
|
"DevDetail_MainInfo_mac": "MAC",
|
||||||
"DevDetail_Network_Node_hover": "Sélectionner l'appareil du réseau principal auquel cet appareil est connecté afin de compléter l'arbre Réseau.",
|
"DevDetail_Network_Node_hover": "Sélectionner l'appareil du réseau principal auquel cet appareil est connecté afin de compléter l'arborescence du Réseau.",
|
||||||
"DevDetail_Network_Port_hover": "Le port auquel cet appareil est connecté sur l'appareil du réseau principal. Si vide, une icône Wifi est affichée dans l'arbre Réseau.",
|
"DevDetail_Network_Port_hover": "Le port auquel cet appareil est connecté sur l'appareil du réseau principal. Si vide, une icône Wifi est affichée dans l'arborescence du Réseau.",
|
||||||
"DevDetail_Nmap_Scans": "Scans NMAP manuels",
|
"DevDetail_Nmap_Scans": "Scans manuels via Nmap",
|
||||||
"DevDetail_Nmap_Scans_desc": "Vous pouvez lancer des scans NMAP manuels. Vous pouvez aussi programmer des sans réguliers via le plugin Services & Ports (NMAP). Aller dans les <a href='/settings.php' target='_blank'>Paramètres</a> pour plus de details",
|
"DevDetail_Nmap_Scans_desc": "Vous pouvez lancer des scans NMAP manuels. Vous pouvez aussi programmer des sans réguliers via le plugin Services & Ports (NMAP). Aller dans les <a href='/settings.php' target='_blank'>Paramètres</a> pour plus de details",
|
||||||
"DevDetail_Nmap_buttonDefault": "Scan par défaut",
|
"DevDetail_Nmap_buttonDefault": "Scan par défaut",
|
||||||
"DevDetail_Nmap_buttonDefault_text": "Scan par défaut : NMAP scanne les 1 000 premiers ports pour chaque demande de scan de protocole. Cela couvre environ 93% des ports TCP et 49% des ports UDP (environ 5 secondes).",
|
"DevDetail_Nmap_buttonDefault_text": "Scan par défaut : NMAP scanne les 1 000 premiers ports pour chaque demande de scan de protocole. Cela couvre environ 93% des ports TCP et 49% des ports UDP (environ 5 secondes)",
|
||||||
"DevDetail_Nmap_buttonDetail": "Scan détaillé",
|
"DevDetail_Nmap_buttonDetail": "Scan détaillé",
|
||||||
"DevDetail_Nmap_buttonDetail_text": "Scan détaillé : scan par défaut avec la détection de système d'exploitation, la détection de version, l'analyse de script et le traceroute (jusqu'à 30 secondes ou plus)",
|
"DevDetail_Nmap_buttonDetail_text": "Scan détaillé : scan par défaut avec la détection de système d'exploitation, la détection de version, l'analyse de script et le traceroute (jusqu'à 30 secondes ou plus)",
|
||||||
"DevDetail_Nmap_buttonFast": "Scan rapide",
|
"DevDetail_Nmap_buttonFast": "Scan rapide",
|
||||||
@@ -137,7 +139,7 @@
|
|||||||
"DevDetail_Tab_Nmap": "<i class=\"fa fa-ethernet\"></i> NMAP",
|
"DevDetail_Tab_Nmap": "<i class=\"fa fa-ethernet\"></i> NMAP",
|
||||||
"DevDetail_Tab_NmapEmpty": "Aucun port détecté par NMAP sur cet appareil.",
|
"DevDetail_Tab_NmapEmpty": "Aucun port détecté par NMAP sur cet appareil.",
|
||||||
"DevDetail_Tab_NmapTableExtra": "Extra",
|
"DevDetail_Tab_NmapTableExtra": "Extra",
|
||||||
"DevDetail_Tab_NmapTableHeader": "Résultats des scans programmés",
|
"DevDetail_Tab_NmapTableHeader": "Résultats du scan programmé",
|
||||||
"DevDetail_Tab_NmapTableIndex": "Index",
|
"DevDetail_Tab_NmapTableIndex": "Index",
|
||||||
"DevDetail_Tab_NmapTablePort": "Port",
|
"DevDetail_Tab_NmapTablePort": "Port",
|
||||||
"DevDetail_Tab_NmapTableService": "Service",
|
"DevDetail_Tab_NmapTableService": "Service",
|
||||||
@@ -159,18 +161,18 @@
|
|||||||
"DevDetail_Tab_Tools_Speedtest_Description": "L'outil Speedtest de test de débit mesure la vitesse de la connexion descendante, montante, et de la latence de la connexion Internet.",
|
"DevDetail_Tab_Tools_Speedtest_Description": "L'outil Speedtest de test de débit mesure la vitesse de la connexion descendante, montante, et de la latence de la connexion Internet.",
|
||||||
"DevDetail_Tab_Tools_Speedtest_Start": "Démarrer le test de débit",
|
"DevDetail_Tab_Tools_Speedtest_Start": "Démarrer le test de débit",
|
||||||
"DevDetail_Tab_Tools_Speedtest_Title": "Test de débit en ligne",
|
"DevDetail_Tab_Tools_Speedtest_Title": "Test de débit en ligne",
|
||||||
"DevDetail_Tab_Tools_Traceroute_Description": "",
|
"DevDetail_Tab_Tools_Traceroute_Description": "Traceroute est une commande de diagnostic réseau utilisée pour suivre/tracer la route réseau utilisée par un paquet de données d'un hôte vers un autre.<br><br>Cette commande utilise ICMP (Internet Control Message Protocol) pour envoyer des paquets via les nœuds intermédiaires du réseau, chaque noeud intermédiaire répondant avec un paquet time-out ICMP (TTL timed out).<br><br>La commande affiche en retour l'adresse IP de chaque noeud intermédiaire de la route .<br><br>La commande Traceroute peut être utilisé pour diagnostiquer des problèmes réseau, comme des ralentissements, des pertes de paquets et des routes bloquées.<br><br>Elle peut aussi être utilisée pour identifier l'emplacement d'un nœud intermédiaire du réseau.",
|
||||||
"DevDetail_Tab_Tools_Traceroute_Error": "Erreur : l'adresse IP n'est pas valide",
|
"DevDetail_Tab_Tools_Traceroute_Error": "Erreur : l'adresse IP n'est pas valide",
|
||||||
"DevDetail_Tab_Tools_Traceroute_Start": "Lancer Traceroute",
|
"DevDetail_Tab_Tools_Traceroute_Start": "Lancer Traceroute",
|
||||||
"DevDetail_Tab_Tools_Traceroute_Title": "Traceroute",
|
"DevDetail_Tab_Tools_Traceroute_Title": "Traceroute",
|
||||||
"DevDetail_Tools_WOL": "Envoyer une commande WoL à ",
|
"DevDetail_Tools_WOL": "Envoyer une commande WoL à ",
|
||||||
"DevDetail_Tools_WOL_noti": "Wake-on-LAN",
|
"DevDetail_Tools_WOL_noti": "Wake-on-LAN",
|
||||||
"DevDetail_Tools_WOL_noti_text": "La commande Wake-on-LAN (WoL) est envoyé à l'adresse de broadcasting. Si la cible n'est pas dans le sous-réseau / VLAN de NetAlertX, l'appareil cible ne répondra pas.",
|
"DevDetail_Tools_WOL_noti_text": "La commande Wake-on-LAN (WoL) est envoyé à l'adresse de broadcasting. Si la cible n'est pas dans le sous-réseau / VLAN de NetAlertX, l'appareil cible ne répondra pas.",
|
||||||
"DevDetail_Type_hover": "Le type d'appareil. Si vous sélectionnez un appareil réseau prédéfini (ex. AP, Firewall, Routeur, Switch...), ils apparaitront dans la configuration de l'arbre Réseau comme nœud de réseau principal potentiel.",
|
"DevDetail_Type_hover": "Le type d'appareil. Si vous sélectionnez un appareil réseau prédéfini (ex. AP, Firewall, Routeur, Switch...), ils apparaitront dans la configuration de l'arborescence du Réseau comme nœud de réseau principal potentiel.",
|
||||||
"DevDetail_Vendor_hover": "Le fabricant est détecté automatiquement. Vous pouvez changer la valeur ou ajouter une valeur libre.",
|
"DevDetail_Vendor_hover": "Le fabricant est détecté automatiquement. Vous pouvez changer la valeur ou ajouter une valeur libre.",
|
||||||
"DevDetail_WOL_Title": "<i class=\"fa fa-power-off\"></i> Wake-on-LAN",
|
"DevDetail_WOL_Title": "<i class=\"fa fa-power-off\"></i> Wake-on-LAN",
|
||||||
"DevDetail_button_AddIcon": "Ajouter une nouvelle icône",
|
"DevDetail_button_AddIcon": "Ajouter une nouvelle icône",
|
||||||
"DevDetail_button_AddIcon_Help": "",
|
"DevDetail_button_AddIcon_Help": "Coller l'emplacement HTML d'un SVG, ou d'une icône Font Awesome. Plus d'informations dans la <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">Documentation des icônes</a>.",
|
||||||
"DevDetail_button_AddIcon_Tooltip": "Ajouter une nouvelle icône, non encore disponible dans la liste déroulante, pour cet appareil.",
|
"DevDetail_button_AddIcon_Tooltip": "Ajouter une nouvelle icône, non encore disponible dans la liste déroulante, pour cet appareil.",
|
||||||
"DevDetail_button_Delete": "Supprimer l'appareil",
|
"DevDetail_button_Delete": "Supprimer l'appareil",
|
||||||
"DevDetail_button_DeleteEvents": "Supprimer les événements",
|
"DevDetail_button_DeleteEvents": "Supprimer les événements",
|
||||||
@@ -181,7 +183,7 @@
|
|||||||
"DevDetail_button_Reset": "Réinitialiser les modifications",
|
"DevDetail_button_Reset": "Réinitialiser les modifications",
|
||||||
"DevDetail_button_Save": "Enregistrer",
|
"DevDetail_button_Save": "Enregistrer",
|
||||||
"Device_MultiEdit": "Édition multiple",
|
"Device_MultiEdit": "Édition multiple",
|
||||||
"Device_MultiEdit_Backup": "",
|
"Device_MultiEdit_Backup": "Attention, renseigner des valeurs non cohérentes ci-dessous peut bloquer votre paramétrage. Veillez à faire une sauvegarde de votre base de données ou de la configuration de vos appareils en premier lieu (<a href=\"php/server/devices.php?action=ExportCSV\">clisuer ici pour la télécharger <i class=\"fa-solid fa-download fa-bounce\"></i></a>). Renseignez-vous sur comment remettre les appareils depuis ce fichier via la <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\"_blank\">documentation des sauvegardes</a>.",
|
||||||
"Device_MultiEdit_Fields": "Champs modifiables :",
|
"Device_MultiEdit_Fields": "Champs modifiables :",
|
||||||
"Device_MultiEdit_MassActions": "Actions en masse :",
|
"Device_MultiEdit_MassActions": "Actions en masse :",
|
||||||
"Device_MultiEdit_Tooltip": "Attention. Ceci va appliquer la valeur de gauche à tous les appareils sélectionnés au-dessus.",
|
"Device_MultiEdit_Tooltip": "Attention. Ceci va appliquer la valeur de gauche à tous les appareils sélectionnés au-dessus.",
|
||||||
@@ -215,6 +217,7 @@
|
|||||||
"Device_TableHead_RowID": "ID de colonne",
|
"Device_TableHead_RowID": "ID de colonne",
|
||||||
"Device_TableHead_Rowid": "ID de colonne",
|
"Device_TableHead_Rowid": "ID de colonne",
|
||||||
"Device_TableHead_SSID": "SSID",
|
"Device_TableHead_SSID": "SSID",
|
||||||
|
"Device_TableHead_SourcePlugin": "Source du plugin",
|
||||||
"Device_TableHead_Status": "État",
|
"Device_TableHead_Status": "État",
|
||||||
"Device_TableHead_SyncHubNodeName": "Noeud de synchro",
|
"Device_TableHead_SyncHubNodeName": "Noeud de synchro",
|
||||||
"Device_TableHead_Type": "Type",
|
"Device_TableHead_Type": "Type",
|
||||||
@@ -223,12 +226,12 @@
|
|||||||
"Device_Table_info": "Affiche de _START_ à _END_ sur _TOTAL_ entrées",
|
"Device_Table_info": "Affiche de _START_ à _END_ sur _TOTAL_ entrées",
|
||||||
"Device_Table_nav_next": "Suivant",
|
"Device_Table_nav_next": "Suivant",
|
||||||
"Device_Table_nav_prev": "Précédent",
|
"Device_Table_nav_prev": "Précédent",
|
||||||
"Device_Tablelenght": "Afficher _MENU_ entrées",
|
"Device_Tablelenght": "Afficher les entrées _MENU_",
|
||||||
"Device_Tablelenght_all": "Tous",
|
"Device_Tablelenght_all": "Tous",
|
||||||
"Device_Title": "Appareils",
|
"Device_Title": "Appareils",
|
||||||
"Donations_Others": "Autres",
|
"Donations_Others": "Autres",
|
||||||
"Donations_Platforms": "Plateformes de sponsoring",
|
"Donations_Platforms": "Plateformes de sponsoring",
|
||||||
"Donations_Text": "Coucou 👋! </br> Merci d'avoir cliqué ici 😅 </br> </br> J'essaie de récolter des donations pour vous faire un meilleur produit. En plus, ça m'aide à éviter le burn-out pour développer cette application plus longtemps. Toute subvention (régulière ou non) me donne envie de poursuivre le développement de cette application.</br> J'aimerais réduire mon activité principale pour me concentrer plus longuement à NetAlertX. Vous auriez plus de fonctionnalités, une application mieux finie et avec moins de bugs.</br> </br> Merci de votre lecture - je vous suis reconnaissant pour votre soutien ❤🙏 </br> </br> Version courte : en me soutenant, vous aurez : </br> </br> <ul><li>Des mises à jour régulières pour protéger vos données personnelles et familiales 🔄</li><li>Moins de bugs 🐛🔫</li><li>Des fonctionnalités plus riches et plus nombreuses ➕</li><li>Je ne me retrouve pas en burn-out 🔥🤯</li><li>Des versions moins à la va-vite 💨</li><li>une meilleure documentation <20></li><li>Un support meilleur et plus réactif en cas de problème 🆘</li></ul> </br> 📧Envoyez-moi un courriel à <a href='mailto:jokob@duck.com?subject=NetAlertX'>jokob@duck.com</a> si vous voulez mebcontacter ou du je peux ajouter une autre plateforme de soutien. </br>",
|
"Donations_Text": "Coucou 👋 ! </br> Merci d'avoir cliqué ici 😅 </br> </br> J'essaie de récolter des donations pour vous faire un meilleur produit. En plus, ça m'aide à éviter le burn-out pour développer cette application plus longtemps. Toute subvention (régulière ou non) me donne envie de poursuivre le développement de cette application.</br> J'aimerais réduire mon activité principale pour me concentrer plus longuement à NetAlertX. Vous auriez plus de fonctionnalités, une application mieux finie et avec moins de bugs.</br> </br> Merci de votre lecture - je vous suis reconnaissant pour votre soutien ❤🙏 </br> </br> Version courte : en me soutenant, vous aurez : </br> </br> <ul><li>Des mises à jour régulières pour protéger vos données personnelles et familiales 🔄</li><li>Moins de bugs 🐛🔫</li><li>Des fonctionnalités plus riches et plus nombreuses ➕</li><li>Je ne me retrouve pas en burn-out 🔥🤯</li><li>Des versions moins à la va-vite 💨</li><li>une meilleure documentation <20></li><li>Un support meilleur et plus réactif en cas de problème 🆘</li></ul> </br> 📧Envoyez-moi un courriel à <a href='mailto :jokob@duck.com ?subject=NetAlertX'>jokob@duck.com</a> si vous voulez me contacter ou du je peux ajouter une autre plateforme de soutien. </br>",
|
||||||
"Donations_Title": "Dons",
|
"Donations_Title": "Dons",
|
||||||
"ENABLE_PLUGINS_description": "Active les fonctionnalités des <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins\">Plugins</a>. Charger des plugins nécessite plus de ressources, il est recommandé de les désactiver sur des systèmes de faible puissance.",
|
"ENABLE_PLUGINS_description": "Active les fonctionnalités des <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins\">Plugins</a>. Charger des plugins nécessite plus de ressources, il est recommandé de les désactiver sur des systèmes de faible puissance.",
|
||||||
"ENABLE_PLUGINS_name": "Activer les Plugins",
|
"ENABLE_PLUGINS_name": "Activer les Plugins",
|
||||||
@@ -274,12 +277,15 @@
|
|||||||
"Gen_AreYouSure": "Êtes-vous sûr ?",
|
"Gen_AreYouSure": "Êtes-vous sûr ?",
|
||||||
"Gen_Backup": "Lancer la sauvegarde",
|
"Gen_Backup": "Lancer la sauvegarde",
|
||||||
"Gen_Cancel": "Annuler",
|
"Gen_Cancel": "Annuler",
|
||||||
|
"Gen_Change": "Changement",
|
||||||
"Gen_Copy": "Lancer",
|
"Gen_Copy": "Lancer",
|
||||||
"Gen_DataUpdatedUITakesTime": "OK - cela peut prendre du temps à l'interface pour se mettre à jour si un scan est en cours.",
|
"Gen_DataUpdatedUITakesTime": "OK - cela peut prendre du temps à l'interface pour se mettre à jour si un scan est en cours.",
|
||||||
"Gen_Delete": "Supprimer",
|
"Gen_Delete": "Supprimer",
|
||||||
"Gen_DeleteAll": "Supprimer tous",
|
"Gen_DeleteAll": "Supprimer tous",
|
||||||
|
"Gen_Description": "Description",
|
||||||
"Gen_Error": "Erreur",
|
"Gen_Error": "Erreur",
|
||||||
"Gen_Filter": "Filtrer",
|
"Gen_Filter": "Filtrer",
|
||||||
|
"Gen_Generate": "Générer",
|
||||||
"Gen_LockedDB": "Erreur - La base de données est peut-être verrouillée - Vérifier avec les outils de dév via F12 -> Console ou essayer plus tard.",
|
"Gen_LockedDB": "Erreur - La base de données est peut-être verrouillée - Vérifier avec les outils de dév via F12 -> Console ou essayer plus tard.",
|
||||||
"Gen_Offline": "Hors ligne",
|
"Gen_Offline": "Hors ligne",
|
||||||
"Gen_Okay": "OK",
|
"Gen_Okay": "OK",
|
||||||
@@ -292,6 +298,7 @@
|
|||||||
"Gen_Save": "Enregistrer",
|
"Gen_Save": "Enregistrer",
|
||||||
"Gen_Saved": "Enregistré",
|
"Gen_Saved": "Enregistré",
|
||||||
"Gen_Search": "Recherche",
|
"Gen_Search": "Recherche",
|
||||||
|
"Gen_SelectToPreview": "Sélectionnez pour prévisualiser",
|
||||||
"Gen_Selected_Devices": "Appareils sélectionnés :",
|
"Gen_Selected_Devices": "Appareils sélectionnés :",
|
||||||
"Gen_Switch": "Basculer",
|
"Gen_Switch": "Basculer",
|
||||||
"Gen_Upd": "Mise à jour réussie",
|
"Gen_Upd": "Mise à jour réussie",
|
||||||
@@ -302,13 +309,15 @@
|
|||||||
"Gen_Work_In_Progress": "Travaux en cours, c'est le bon moment pour faire un retour via la liste d'anomalies sur Github https://github.com/jokob-sk/NetAlertX/issues",
|
"Gen_Work_In_Progress": "Travaux en cours, c'est le bon moment pour faire un retour via la liste d'anomalies sur Github https://github.com/jokob-sk/NetAlertX/issues",
|
||||||
"General_display_name": "Général",
|
"General_display_name": "Général",
|
||||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||||
"HRS_TO_KEEP_NEWDEV_description": "Paramétrage de maintenance. S'il est activé (<code>0</code> s'il est désactivé), les appareils marqués comme <b>Nouvel appareil</b> seront supprimés si leur durée depuis la <b>première session</b> est plus ancienne que le nombre d'heures paramétré. Utilisez ce paramétrage si vous voulez supprimer automatiquement les <b>Nouveaux appareils</b> après <code>X</code> heures.",
|
"HRS_TO_KEEP_NEWDEV_description": "Paramètre de maintenance. S'il est activé (<code>0</code> s'il est désactivé), les appareils marqués comme <b>Nouvel appareil</b> seront supprimés si leur durée depuis la <b>première session</b> est plus ancienne que le nombre d'heures paramétré. Utilisez ce paramétrage si vous voulez supprimer automatiquement les <b>Nouveaux appareils</b> après <code>X</code> heures.",
|
||||||
"HRS_TO_KEEP_NEWDEV_name": "",
|
"HRS_TO_KEEP_NEWDEV_name": "Supprimer les nouveaux appareils après",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_description": "Il s'agit d'un paramètre de maintenance <b>SUPPRIMER des appareils</b>. Si cette option est activée (<code>0</code> est désactivé), les appareils qui sont <b>Hors ligne</b> et dont la <b>dernière heure hors ligne</b> est plus ancienne que les heures spécifiées dans ce paramètre. Utilisez ce paramètre si vous souhaitez supprimer automatiquement <b>Appareils hors ligne</b> après <code>X</code> heures de déconnexion.",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_name": "Supprimez les appareils hors ligne après",
|
||||||
"HelpFAQ_Cat_Detail": "Détails",
|
"HelpFAQ_Cat_Detail": "Détails",
|
||||||
"HelpFAQ_Cat_Detail_300_head": "",
|
"HelpFAQ_Cat_Detail_300_head": "Que signifie ",
|
||||||
"HelpFAQ_Cat_Detail_300_text_a": "",
|
"HelpFAQ_Cat_Detail_300_text_a": "signifie que cela représente un équipement réseau (Access Point, Gateway, Firewall, Hyperviseur, Powerline, Switch, WLAN, CPL, adaptateur Ethernet USB, adaptateur Wifi USB, Internet). Les types d'appareils personnalisés peuvent être ajoutés via le paramètre <code>NETWORK_DEVICE_TYPES</code>.",
|
||||||
"HelpFAQ_Cat_Detail_300_text_b": "désigne le numéro de port auquel l'appareil modifié est connecté à cet appareil réseau. Lire <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\">ce guide</a> pour plus d'infos.",
|
"HelpFAQ_Cat_Detail_300_text_b": "désigne le numéro de port auquel l'appareil modifié est connecté à cet appareil réseau. Lire <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\">ce guide</a> pour plus d'infos.",
|
||||||
"HelpFAQ_Cat_Detail_301_head_a": "",
|
"HelpFAQ_Cat_Detail_301_head_a": "Quand le scan se lance-t-il ? À ",
|
||||||
"HelpFAQ_Cat_Detail_301_head_b": " indique 1 min mais le graphique affiche des intervalles de 5 min.",
|
"HelpFAQ_Cat_Detail_301_head_b": " indique 1 min mais le graphique affiche des intervalles de 5 min.",
|
||||||
"HelpFAQ_Cat_Detail_301_text": "L'intervalle de temps entre les scans est défini par les \"Cronjob\", défini à 5 min par défaut. L'indication \"1min\" fait référence à la durée attendue du scan. En fonction de la configuration réseau, cette durée peut varier. Pour modifier le cronjob, vous pouvez utiliser la commande suivante dans un terminal : <span class=\"text-danger help_faq_code\">crontab -e</span> et changer cet intervalle.",
|
"HelpFAQ_Cat_Detail_301_text": "L'intervalle de temps entre les scans est défini par les \"Cronjob\", défini à 5 min par défaut. L'indication \"1min\" fait référence à la durée attendue du scan. En fonction de la configuration réseau, cette durée peut varier. Pour modifier le cronjob, vous pouvez utiliser la commande suivante dans un terminal : <span class=\"text-danger help_faq_code\">crontab -e</span> et changer cet intervalle.",
|
||||||
"HelpFAQ_Cat_Detail_302_head_a": "Que signifie ",
|
"HelpFAQ_Cat_Detail_302_head_a": "Que signifie ",
|
||||||
@@ -317,42 +326,43 @@
|
|||||||
"HelpFAQ_Cat_Detail_303_head": "Qu'est-ce que NMAP et à quoi cela sert-il ?",
|
"HelpFAQ_Cat_Detail_303_head": "Qu'est-ce que NMAP et à quoi cela sert-il ?",
|
||||||
"HelpFAQ_Cat_Detail_303_text": "NMAP est un scanner réseau aux multiples possibilités.<br>Quand un nouvel appareil apparaît dans la liste, vous avez la possibilité d'avoir des informations détaillées sur l'appareil avec un scan NMAP.",
|
"HelpFAQ_Cat_Detail_303_text": "NMAP est un scanner réseau aux multiples possibilités.<br>Quand un nouvel appareil apparaît dans la liste, vous avez la possibilité d'avoir des informations détaillées sur l'appareil avec un scan NMAP.",
|
||||||
"HelpFAQ_Cat_Device_200_head": "J'ai des appareils dans ma liste, que je ne connais pas. Après les avoir supprimés, ils réapparaissent toujours.",
|
"HelpFAQ_Cat_Device_200_head": "J'ai des appareils dans ma liste, que je ne connais pas. Après les avoir supprimés, ils réapparaissent toujours.",
|
||||||
"HelpFAQ_Cat_Device_200_text": "",
|
"HelpFAQ_Cat_Device_200_text": "Si vous utilisez Pi-hole, sachez que NetAlertX peut récupérer les informations depuis Pi-hole. Pour cela, mettez en pause NetAlertX, allez dans les paramètres de Pi-hole, et supprimez les baux DHCP si nécessaire. Ensuite, toujours dans Pi-hole, allez dans Outils -> Réseau pour voir si vous pouvez identifier les hôtes réguliers. Si c'est le cas, supprimez-les de même. Vous pouvez alors réactiver NetAlertX. Maintenant, les appareils ne devraient plus apparaître.",
|
||||||
"HelpFAQ_Cat_General": "Général",
|
"HelpFAQ_Cat_General": "Général",
|
||||||
"HelpFAQ_Cat_General_100_head": "L'horloge en haut à droite et les heures des événements/présence ne sont pas correctes (décalage horaire).",
|
"HelpFAQ_Cat_General_100_head": "L'horloge en haut à droite et les heures des événements/présence ne sont pas correctes (décalage horaire).",
|
||||||
"HelpFAQ_Cat_General_100_text_a": "",
|
"HelpFAQ_Cat_General_100_text_a": "Sur votre appareil, le fuseau horaire suivant est défini dans votre environnement PHP :",
|
||||||
"HelpFAQ_Cat_General_100_text_b": "",
|
"HelpFAQ_Cat_General_100_text_b": "Si cela ne correspond pas à votre fuseau horaire, vous devriez le changer dans le fichier de configuration PHP. Vous pouvez le trouver dans le répertoire :",
|
||||||
"HelpFAQ_Cat_General_100_text_c": "",
|
"HelpFAQ_Cat_General_100_text_c": "Chercher dans ce fichier l'élément \"date.timezone\", supprimer du nécessaire le \";\" en début de ligne et renseigner le fuseau horaire voulu. Une liste des fuseaux horaires supportés est présente ici (<a href=\"https://www.php.net/manual/en/timezones.php\" target=\"blank\">Lien</a>)",
|
||||||
"HelpFAQ_Cat_General_101_head": "",
|
"HelpFAQ_Cat_General_101_head": "Mon réseau semble être ralenti, le streaming \"se fige\".",
|
||||||
"HelpFAQ_Cat_General_101_text": "",
|
"HelpFAQ_Cat_General_101_text": "Les appareils à performance limitée peuvent atteindre leurs limited avec la manière dont NetAlertX détecte les nouveaux appareils sur le réseau. Cela est amplifié si les appareils communiquent via un LWAN. Une solution dans ce cas est de passer sur une connexion filaire si possible, ou, si l'appareil est utilisé temporairement, d'utiliser un scan ARP, puis de mettre en pause le scan ARP sur la page de maintenance.",
|
||||||
"HelpFAQ_Cat_General_102_head": "",
|
"HelpFAQ_Cat_General_102_head": "Un message m'indique que la base de données est en lecture seule.",
|
||||||
"HelpFAQ_Cat_General_102_text": "",
|
"HelpFAQ_Cat_General_102_text": "Vérifiez dans le répertoire de NetAlertX si la base de données (db) possède les bonnes permissions :<br> <span class=\"text-danger help_faq_code\">drwxrwx--- 2 (votre nom d'utilisateur) www-data</span><br> Si la permission n'est pas correcte, vous pouvez la modifier en passant les commandes suivantes dans le terminal :<br> <span class=\"text-danger help_faq_code\">sudo chgrp -R www-data /app/db<br>chmod -R 770 /app/db</span><br>Si la base de données est encore en lecture seule, tentez de la réinstaller ou de restaurer une sauvegarde de la base à partir de la page de maintenance.",
|
||||||
"HelpFAQ_Cat_General_102docker_head": "Erreur de base de données (erreurs AJAX, lecture seule, non trouvé)",
|
"HelpFAQ_Cat_General_102docker_head": "Erreur de base de données (erreurs AJAX, lecture seule, non trouvé)",
|
||||||
"HelpFAQ_Cat_General_102docker_text": "",
|
"HelpFAQ_Cat_General_102docker_text": "Vérifiez avec attention que vous avez suivi les instructions dans le <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/dockerfiles\">lisez-moi (readme) Docker (contient les infos les plus récentes)</a>. <br/> <br/> <ul data-sourcepos=\"49:4-52:146\" dir=\"auto\"><li data-sourcepos=\"49:4-49:106\"> Télécharger la <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/db/app.db\">base de données originelle depuis GitHub</a>.</li><li data-sourcepos=\"50:4-50:195\">Relier le fichier <code>app.db</code> (<g-emoji class=\"g-emoji\" alias=\"warning\" fallback-src=\"https://github.githubassets.com/images/icons/emoji/unicode/26a0.png\">⚠</g-emoji> pas le dossier) au-dessus avec <code>/app/db/app.db</code> (plus de détails dans les <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/dockerfiles#-examples\">Exemples</a>).</li><li data-sourcepos=\"51:4-51:161\">. Si vous rencontrez des erreurs (erreurs Ajax, impossible d'écrire dans la base, etc.), vérifiez que les permissions sont correctement définies, éventuellement regarder dans les blogs présents dans <code>/app/front/log</code>.</li><li data-sourcepos=\"52:4-52:146\">. Pour résoudre les problèmes de permission, vous pouvez aussi essayer de créer une sauvegarde de la base de données et lancer une restauration via la section <strong>Maintenance > Sauvegarde/Restauration</strong>.</li><li data-sourcepos=\"53:4-53:228\">Si la base de données est en lecture seule, vous pouvez résoudre cela en définissant le propriétaire et le groupe en lançant la commande suivante depuis le système hôte : <code>docker exec netalertx chown -R www-data:www-data /app/db/app.db</code>.</li></ul>",
|
||||||
"HelpFAQ_Cat_General_103_head": "La page d'authentification n'apparaît pas, même après avoir changé le mot de passe.",
|
"HelpFAQ_Cat_General_103_head": "La page d'authentification n'apparaît pas, même après avoir changé le mot de passe.",
|
||||||
"HelpFAQ_Cat_General_103_text": "",
|
"HelpFAQ_Cat_General_103_text": "En plus du mot de passe, le fichier de configuration doit contenir <span class=\"text-danger help_faq_code\">/app/config/app.conf</span>. De plus, le paramètre <span class=\"text-danger help_faq_code\">PIALERT_WEB_PROTECTION</span> doit être à la valeur<span class=\"text-danger help_faq_code\">True</span>.",
|
||||||
"HelpFAQ_Cat_Network_600_head": "A quoi sert cette page ?",
|
"HelpFAQ_Cat_Network_600_head": "A quoi sert cette page ?",
|
||||||
"HelpFAQ_Cat_Network_600_text": "",
|
"HelpFAQ_Cat_Network_600_text": "Cette page offre la possibilité de définir le paramétrage des appareils du réseau. Pour cela, vous pouvez créer un ou plusieurs switchs, WLANs, routeurs, etc. ; leur indiquer un numéro de port si nécessaire et leur assigner des appareils déjà détectés. Cette assignation est faite dans la vue détaillée de l'appareil à assigner. Cela permet de rapidement identifier quel hôte est connecté à quel port, et s'il est en ligne. Plus d'informations dans <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\">ce guide</a>.",
|
||||||
"HelpFAQ_Cat_Network_601_head": "Y a-t-il d'autre documentation ?",
|
"HelpFAQ_Cat_Network_601_head": "Y a-t-il d'autre documentation ?",
|
||||||
"HelpFAQ_Cat_Network_601_text": "Oui ! Consulter <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/\">tous les documents</a> pour plus d'infos.",
|
"HelpFAQ_Cat_Network_601_text": "Oui ! Consulter <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/\">tous les documents</a> pour plus d'infos.",
|
||||||
"HelpFAQ_Cat_Presence_400_head": "Les appareils apparaissent avec un symbole jaune et le message \"événement manquant\".",
|
"HelpFAQ_Cat_Presence_400_head": "Les appareils apparaissent avec un symbole jaune et le message \"événement manquant\".",
|
||||||
"HelpFAQ_Cat_Presence_400_text": "Si cela arrive, vous pouvez supprimer tous les événements de l'appareil en question (vue détaillée). Une autre possibilité est d'allumer l'appareil et d'attendre que NetAlertX le détecte comme \"en ligne\" lors du prochain scan ; puis éteindre l'appareil à nouveau. NetAlertX devrait alors afficher normalement son état dans la base lors du prochain scan.",
|
"HelpFAQ_Cat_Presence_400_text": "Si cela arrive, vous pouvez supprimer tous les événements de l'appareil en question (vue détaillée). Une autre possibilité est d'allumer l'appareil et d'attendre que NetAlertX le détecte comme \"en ligne\" lors du prochain scan ; puis éteindre l'appareil à nouveau. NetAlertX devrait alors afficher normalement son état dans la base lors du prochain scan.",
|
||||||
"HelpFAQ_Cat_Presence_401_head": "Un appareil est affiché comme présent bien qu'il soit \"Hors ligne\".",
|
"HelpFAQ_Cat_Presence_401_head": "Un appareil est affiché comme présent bien qu'il soit \"Hors ligne\".",
|
||||||
"HelpFAQ_Cat_Presence_401_text": "",
|
"HelpFAQ_Cat_Presence_401_text": "Si cela arrive, vous avez la possibilité de supprimer les événements pour les appareils concernés (vue détaillée). Vous pouvez aussi allumer l'appareil, attendre que NetAlertX le détecte comme en ligne, puis simplement éteindre l'appareil à nouveau. NetAlertX devait maintenant correctement détecter l'état de l'appareil lors du prochain scan.",
|
||||||
"HelpFAQ_Title": "Aide / FAQ",
|
"HelpFAQ_Title": "Aide / FAQ",
|
||||||
"LOADED_PLUGINS_description": "",
|
"LOADED_PLUGINS_description": "Affiche les plugins chargés. Ajouter des plugins peut ralentir l'application. Obtenez plus d'informations dur quels plugins dont à activer, ou les options de scan dans la <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins#readme\">documentation des plugins</a>. Décharger des plugins leur fait perdre leurs paramètres. Seuls les plugins <code>désactivés</code> peuvent être déchargés.",
|
||||||
"LOADED_PLUGINS_name": "",
|
"LOADED_PLUGINS_name": "Plugins chargés",
|
||||||
"LOG_LEVEL_description": "",
|
"LOG_LEVEL_description": "Ce paramètre active une journalisation dans les logs plus verbeuse. Cela est utile pour identifier les événements écrivant dans la base de données.",
|
||||||
"LOG_LEVEL_name": "",
|
"LOG_LEVEL_name": "Afficher des journaux de log additionnels",
|
||||||
"Loading": "Chargement...",
|
"Loading": "Chargement...",
|
||||||
"Login_Box": "Saisir votre mot de passe",
|
"Login_Box": "Saisir votre mot de passe",
|
||||||
"Login_Default_PWD": "Le mot de passe par défaut \"123456\" est encore actif.",
|
"Login_Default_PWD": "Le mot de passe par défaut \"123456\" est encore actif.",
|
||||||
|
"Login_Info": "Les mots de passe sont définis via le plugin Set Password. Vérifiez la <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">documentation de SETPWD</a> si vous rencontrez des difficultés à vous identifier.",
|
||||||
"Login_Psw-box": "Mot de passe",
|
"Login_Psw-box": "Mot de passe",
|
||||||
"Login_Psw_alert": "Alerte de mot de passe !",
|
"Login_Psw_alert": "Alerte de mot de passe !",
|
||||||
"Login_Psw_folder": "dans le dossier de configuration.",
|
"Login_Psw_folder": "dans le dossier de configuration.",
|
||||||
"Login_Psw_new": "nouveau mot de passe",
|
"Login_Psw_new": "nouveau mot de passe",
|
||||||
"Login_Psw_run": "Pour changer le mot de passe, lancer :",
|
"Login_Psw_run": "Pour changer le mot de passe, lancer :",
|
||||||
"Login_Remember": "",
|
"Login_Remember": "Se rappeler",
|
||||||
"Login_Remember_small": "(valide durant 7 jours)",
|
"Login_Remember_small": "(valide durant 7 jours)",
|
||||||
"Login_Submit": "Se connecter",
|
"Login_Submit": "Se connecter",
|
||||||
"Login_Toggle_Alert_headline": "Alerte de mot de passe !",
|
"Login_Toggle_Alert_headline": "Alerte de mot de passe !",
|
||||||
@@ -370,72 +380,72 @@
|
|||||||
"Maintenance_Tool_ExportCSV_text": "Génère un fichier CSV (valeurs séparées par des virgules), contenant la liste des appareils, dont les liens entre nœuds Réseaux et les appareils connectés. Vous pouvez aussi lancer cet export depuis l'URL <code>votre URL de NetAlertX/php/server/devices.php?action=ExportCSV</code> ou en activant le plugin <a href=\"settings.php#CSVBCKP_header\">CSV Backup</a>.",
|
"Maintenance_Tool_ExportCSV_text": "Génère un fichier CSV (valeurs séparées par des virgules), contenant la liste des appareils, dont les liens entre nœuds Réseaux et les appareils connectés. Vous pouvez aussi lancer cet export depuis l'URL <code>votre URL de NetAlertX/php/server/devices.php?action=ExportCSV</code> ou en activant le plugin <a href=\"settings.php#CSVBCKP_header\">CSV Backup</a>.",
|
||||||
"Maintenance_Tool_ImportCSV": "Import CSV",
|
"Maintenance_Tool_ImportCSV": "Import CSV",
|
||||||
"Maintenance_Tool_ImportCSV_noti": "Import CSV",
|
"Maintenance_Tool_ImportCSV_noti": "Import CSV",
|
||||||
"Maintenance_Tool_ImportCSV_noti_text": "Êtes-vous sûr de vouloir importer le fichier CSV ? Cela écrasera complètement les appareils de votre base de données.",
|
"Maintenance_Tool_ImportCSV_noti_text": "Êtes-vous sûr de vouloir importer le fichier CSV ? Cela <b>écrasera</b> complètement les appareils de votre base de données.",
|
||||||
"Maintenance_Tool_ImportCSV_text": "",
|
"Maintenance_Tool_ImportCSV_text": "Avant d'utiliser cette fonctionnalité, il est recommandé de faire une sauvegarde. La fonctionnalité importe un fichier CSV (valeurs séparées par des virgules) contenant la liste des appareils, dont les liens réseau entre les nœuds du réseau et ces appareils. Pour cela, placer un fichier CSV nommé <b>devices.csv</b> dans votre répertoire <b>/config</b>.",
|
||||||
"Maintenance_Tool_ImportPastedCSV": "",
|
"Maintenance_Tool_ImportPastedCSV": "Import CSV (coller)",
|
||||||
"Maintenance_Tool_ImportPastedCSV_noti_text": "",
|
"Maintenance_Tool_ImportPastedCSV_noti_text": "Êtes-vous sûr de vouloir importer les CSV copié ? Cela va complètement <b>remplacer</b> les appareils de votre base de données.",
|
||||||
"Maintenance_Tool_ImportPastedCSV_text": "",
|
"Maintenance_Tool_ImportPastedCSV_text": "Avant d'utiliser cette fonctionnalité, il est recommandé de faire une sauvegarde. Importe un fichier CSV (valeurs séparées par des virgules) contenant la liste des appareils, dont les liens réseaux entre les nœuds du réseau et les appareils connectés.",
|
||||||
"Maintenance_Tool_arpscansw": "Basculer l'arp-Scan (activé/désactivé)",
|
"Maintenance_Tool_arpscansw": "Basculer l'arp-Scan (activé/désactivé)",
|
||||||
"Maintenance_Tool_arpscansw_noti": "Activer ou désactiver l'arp-Scan",
|
"Maintenance_Tool_arpscansw_noti": "Activer ou désactiver l'arp-Scan",
|
||||||
"Maintenance_Tool_arpscansw_noti_text": "Une fois le scan désactivé, il reste désactivé jusqu'à ce qu'il soit réactivé.",
|
"Maintenance_Tool_arpscansw_noti_text": "Une fois le scan désactivé, il reste désactivé jusqu'à ce qu'il soit réactivé.",
|
||||||
"Maintenance_Tool_arpscansw_text": "",
|
"Maintenance_Tool_arpscansw_text": "Bascule entre le scan ARP activé ou désactivé. Quand le scan est désactivé, il le reste jusqu'à ce qu'il soit activé à nouveau. Les scans en cours ne sont pas annulés.",
|
||||||
"Maintenance_Tool_backup": "",
|
"Maintenance_Tool_backup": "Sauvegarde de la base de données",
|
||||||
"Maintenance_Tool_backup_noti": "",
|
"Maintenance_Tool_backup_noti": "Sauvegarde de base de données",
|
||||||
"Maintenance_Tool_backup_noti_text": "",
|
"Maintenance_Tool_backup_noti_text": "Êtes-vous sûr de vouloir lancer la sauvegarde de la base de données ? Assurez-vous de ne pas avoir de scan en cours.",
|
||||||
"Maintenance_Tool_backup_text": "",
|
"Maintenance_Tool_backup_text": "Les sauvegardes de base de données sont situées dans le répertoire de la base de données, soir forme d'archive ZIP, nommé selon la date de création. Il n'y a pas de limite de nombre de sauvegarde.",
|
||||||
"Maintenance_Tool_check_visible": "",
|
"Maintenance_Tool_check_visible": "Décocher pour masquer la colonne.",
|
||||||
"Maintenance_Tool_darkmode": "",
|
"Maintenance_Tool_darkmode": "Basculer de mode (clair/sombre)",
|
||||||
"Maintenance_Tool_darkmode_noti": "",
|
"Maintenance_Tool_darkmode_noti": "Basculer de mode",
|
||||||
"Maintenance_Tool_darkmode_noti_text": "",
|
"Maintenance_Tool_darkmode_noti_text": "Après le changement de thème, la page tente de se rafraîchir pour activer le changement. Si besoin, le cache doit être supprimé.",
|
||||||
"Maintenance_Tool_darkmode_text": "",
|
"Maintenance_Tool_darkmode_text": "Bascule entre le mode sombre et clair. Si la bascule ne fonctionne pas correctement, essayez de vider le cache de votre navigateur. Le changement s'effectue côté serveur, donc il s'applique à tous les appareils utilisant l'interface.",
|
||||||
"Maintenance_Tool_del_ActHistory": "",
|
"Maintenance_Tool_del_ActHistory": "Suppression de l'activité réseau",
|
||||||
"Maintenance_Tool_del_ActHistory_noti": "",
|
"Maintenance_Tool_del_ActHistory_noti": "Supprimer l'activité réseau",
|
||||||
"Maintenance_Tool_del_ActHistory_noti_text": "",
|
"Maintenance_Tool_del_ActHistory_noti_text": "Êtes-vous sûr de vouloir supprimer l'activité réseau ?",
|
||||||
"Maintenance_Tool_del_ActHistory_text": "",
|
"Maintenance_Tool_del_ActHistory_text": "Le graphique d'activité réseau est remis à zéro. Cela ne modifie pas les événements.",
|
||||||
"Maintenance_Tool_del_alldev": "",
|
"Maintenance_Tool_del_alldev": "Supprimer tous les appareils",
|
||||||
"Maintenance_Tool_del_alldev_noti": "",
|
"Maintenance_Tool_del_alldev_noti": "Supprimer l'appareil",
|
||||||
"Maintenance_Tool_del_alldev_noti_text": "",
|
"Maintenance_Tool_del_alldev_noti_text": "Êtes-vous sûr de vouloir supprimer tous les appareils ?",
|
||||||
"Maintenance_Tool_del_alldev_text": "Avant d'utiliser cette fonction, veuillez effectuer une sauvegarde. La suppression ne peut pas être annulée. Tous les appareils seront supprimés de la base de données.",
|
"Maintenance_Tool_del_alldev_text": "Avant d'utiliser cette fonction, veuillez effectuer une sauvegarde. La suppression ne peut pas être annulée. Tous les appareils seront supprimés de la base de données.",
|
||||||
"Maintenance_Tool_del_allevents": "",
|
"Maintenance_Tool_del_allevents": "Supprimer les événements (réinitialiser la présence)",
|
||||||
"Maintenance_Tool_del_allevents30": "",
|
"Maintenance_Tool_del_allevents30": "Supprimer tous les événements de plus de 30 jours",
|
||||||
"Maintenance_Tool_del_allevents30_noti": "",
|
"Maintenance_Tool_del_allevents30_noti": "Supprimer les événements",
|
||||||
"Maintenance_Tool_del_allevents30_noti_text": "",
|
"Maintenance_Tool_del_allevents30_noti_text": "Êtes-vous sûr de vouloir supprimer tous les événements de plus de 30 jours ? Cela réinitialise la présence de tous les appareils.",
|
||||||
"Maintenance_Tool_del_allevents30_text": "Avant d'utiliser cette fonction, veuillez effectuer une sauvegarde. La suppression ne peut pas être annulée. Tous les événements datant de plus de 30 jours dans la base de données seront supprimés. À ce moment-là, la présence de tous les appareils sera réinitialisée. Cela peut conduire à des sessions invalides. Cela signifie que les appareils sont affichés comme « présent » bien qu'ils soient hors ligne. Un scan pendant que l'appareil en question est en ligne résout le problème.",
|
"Maintenance_Tool_del_allevents30_text": "Avant d'utiliser cette fonction, veuillez effectuer une sauvegarde. La suppression ne peut pas être annulée. Tous les événements datant de plus de 30 jours dans la base de données seront supprimés. À ce moment-là, la présence de tous les appareils sera réinitialisée. Cela peut conduire à des sessions invalides. Cela signifie que les appareils sont affichés comme « présent » bien qu'ils soient hors ligne. Un scan pendant que l'appareil en question est en ligne résout le problème.",
|
||||||
"Maintenance_Tool_del_allevents_noti": "",
|
"Maintenance_Tool_del_allevents_noti": "Supprimer les événements",
|
||||||
"Maintenance_Tool_del_allevents_noti_text": "",
|
"Maintenance_Tool_del_allevents_noti_text": "Êtes-vous sûr de vouloir supprimer tous les événements ? Cela réinitialise la présence de tous les appareils.",
|
||||||
"Maintenance_Tool_del_allevents_text": "Avant d'utiliser cette fonction, veuillez effectuer une sauvegarde. La suppression ne peut pas être annulée. Tous les événements de la base de données seront supprimés. À ce moment-là, la présence de tous les appareils sera réinitialisée. Cela peut conduire à des sessions invalides. Cela signifie que les appareils sont affichés comme « présent » bien qu'ils soient hors ligne. Un scan pendant que l'appareil en question est en ligne résout le problème.",
|
"Maintenance_Tool_del_allevents_text": "Avant d'utiliser cette fonction, veuillez effectuer une sauvegarde. La suppression ne peut pas être annulée. Tous les événements de la base de données seront supprimés. À ce moment-là, la présence de tous les appareils sera réinitialisée. Cela peut conduire à des sessions invalides. Cela signifie que les appareils sont affichés comme « présent » bien qu'ils soient hors ligne. Un scan pendant que l'appareil en question est en ligne résout le problème.",
|
||||||
"Maintenance_Tool_del_empty_macs": "",
|
"Maintenance_Tool_del_empty_macs": "Supprimer les appareils avec une adresse MAC vide",
|
||||||
"Maintenance_Tool_del_empty_macs_noti": "",
|
"Maintenance_Tool_del_empty_macs_noti": "Supprimer les appareils",
|
||||||
"Maintenance_Tool_del_empty_macs_noti_text": "",
|
"Maintenance_Tool_del_empty_macs_noti_text": "Êtes-vous sûr de vouloir supprimer tous les appareils avec une adresse MAC vide ? <br>(Vous pourriez préférer les archiver)",
|
||||||
"Maintenance_Tool_del_empty_macs_text": "Avant d'utiliser cette fonction, veuillez effectuer une sauvegarde. La suppression ne peut pas être annulée. Tous les appareils sans MAC seront supprimés de la base de données.",
|
"Maintenance_Tool_del_empty_macs_text": "Avant d'utiliser cette fonction, veuillez effectuer une sauvegarde. La suppression ne peut pas être annulée. Tous les appareils sans MAC seront supprimés de la base de données.",
|
||||||
"Maintenance_Tool_del_selecteddev": "",
|
"Maintenance_Tool_del_selecteddev": "Supprimer les appareils sélectionnés",
|
||||||
"Maintenance_Tool_del_selecteddev_text": "",
|
"Maintenance_Tool_del_selecteddev_text": "Avant d'utiliser cette fonctionnalité, il est recommandé de faire une sauvegarde. Cette suppression est définitive. Les appareils sélectionnés seront supprimés de la base de données.",
|
||||||
"Maintenance_Tool_del_unknowndev": "",
|
"Maintenance_Tool_del_unknowndev": "Supprimer les appareils inconnus",
|
||||||
"Maintenance_Tool_del_unknowndev_noti": "",
|
"Maintenance_Tool_del_unknowndev_noti": "Supprimer les appareils inconnus",
|
||||||
"Maintenance_Tool_del_unknowndev_noti_text": "",
|
"Maintenance_Tool_del_unknowndev_noti_text": "Êtes-vous sûr de vouloir supprimer tous les appareils inconnus et sans nom trouvé ?",
|
||||||
"Maintenance_Tool_del_unknowndev_text": "Avant d'utiliser cette fonction, veuillez effectuer une sauvegarde. La suppression ne peut pas être annulée. Tous les appareils nommés (inconnus) seront supprimés de la base de données.",
|
"Maintenance_Tool_del_unknowndev_text": "Avant d'utiliser cette fonction, veuillez effectuer une sauvegarde. La suppression ne peut pas être annulée. Tous les appareils nommés (inconnus) seront supprimés de la base de données.",
|
||||||
"Maintenance_Tool_displayed_columns_text": "",
|
"Maintenance_Tool_displayed_columns_text": "Changer la visibilité et l'ordre des colonnes dans la page <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i>appareils</b></a> page.",
|
||||||
"Maintenance_Tool_drag_me": "",
|
"Maintenance_Tool_drag_me": "Déplacez-moi pour réordonner les colonnes.",
|
||||||
"Maintenance_Tool_order_columns_text": "",
|
"Maintenance_Tool_order_columns_text": "Maintenance_Tool_order_columns_text",
|
||||||
"Maintenance_Tool_purgebackup": "",
|
"Maintenance_Tool_purgebackup": "Supprimer les sauvegardes",
|
||||||
"Maintenance_Tool_purgebackup_noti": "",
|
"Maintenance_Tool_purgebackup_noti": "Supprimer les sauvegardes",
|
||||||
"Maintenance_Tool_purgebackup_noti_text": "",
|
"Maintenance_Tool_purgebackup_noti_text": "Êtes-vous sûr de vouloir supprimer toutes les sauvegardes sauf les 3 dernières ?",
|
||||||
"Maintenance_Tool_purgebackup_text": "",
|
"Maintenance_Tool_purgebackup_text": "A l'exception des 3 dernières sauvegardes, toutes les autres sauvegardes seront supprimées.",
|
||||||
"Maintenance_Tool_restore": "",
|
"Maintenance_Tool_restore": "Restauration de la base de données",
|
||||||
"Maintenance_Tool_restore_noti": "",
|
"Maintenance_Tool_restore_noti": "Restauration de la base de données",
|
||||||
"Maintenance_Tool_restore_noti_text": "",
|
"Maintenance_Tool_restore_noti_text": "Êtes-vous sûr de vouloir lancer la restauration de la base données ? Assurez-vous qu'aucun scan ne soit en cours.",
|
||||||
"Maintenance_Tool_restore_text": "",
|
"Maintenance_Tool_restore_text": "La dernière sauvegarde peut être restaurée à l'aide du bouton, mais les sauvegardes plus anciennes ne peuvent être restaurées que manuellement. Après la restauration, faites un contrôle d'intégrité de la base de donnes par sécurité, au cas où elle était en cours d'ecriture lorsque la sauvegarde a été réalisée.",
|
||||||
"Maintenance_Tool_upgrade_database_noti": "",
|
"Maintenance_Tool_upgrade_database_noti": "Mise à jour de la base de données",
|
||||||
"Maintenance_Tool_upgrade_database_noti_text": "",
|
"Maintenance_Tool_upgrade_database_noti_text": "Êtes-vous sûr de vouloir mettre à jour la base de données ?<br>(il peut être préférable de l'archiver)",
|
||||||
"Maintenance_Tool_upgrade_database_text": "",
|
"Maintenance_Tool_upgrade_database_text": "Ce bouton va mettre à jour la base de données pour activer le graphique de l'activité réseau sur les 12 dernières heures. Veillez à faire une sauvegarde de la base de données en cas de problème.",
|
||||||
"Maintenance_Tools_Tab_BackupRestore": "",
|
"Maintenance_Tools_Tab_BackupRestore": "Sauvegarde / Restauration",
|
||||||
"Maintenance_Tools_Tab_Logging": "Journaux",
|
"Maintenance_Tools_Tab_Logging": "Journaux",
|
||||||
"Maintenance_Tools_Tab_Settings": "Paramètres",
|
"Maintenance_Tools_Tab_Settings": "Paramètres",
|
||||||
"Maintenance_Tools_Tab_Tools": "Outils",
|
"Maintenance_Tools_Tab_Tools": "Outils",
|
||||||
"Maintenance_Tools_Tab_UISettings": "Paramètres de l'interface",
|
"Maintenance_Tools_Tab_UISettings": "Paramètres de l'interface",
|
||||||
"Maintenance_arp_status": "",
|
"Maintenance_arp_status": "État du scan",
|
||||||
"Maintenance_arp_status_off": "est actuellement désactivé",
|
"Maintenance_arp_status_off": "est actuellement désactivé",
|
||||||
"Maintenance_arp_status_on": "",
|
"Maintenance_arp_status_on": "scan(s) actuellement en cours",
|
||||||
"Maintenance_built_on": "Construit sur",
|
"Maintenance_built_on": "Construit sur",
|
||||||
"Maintenance_current_version": "Vous êtes à jour. Découvrez sur quoi <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">je travaille</a>.",
|
"Maintenance_current_version": "Vous êtes à jour. Découvrez sur quoi <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">je travaille</a>.",
|
||||||
"Maintenance_database_backup": "Sauvegardes de base de données",
|
"Maintenance_database_backup": "Sauvegardes de base de données",
|
||||||
@@ -443,101 +453,108 @@
|
|||||||
"Maintenance_database_backup_total": "utilisation totale du disque",
|
"Maintenance_database_backup_total": "utilisation totale du disque",
|
||||||
"Maintenance_database_lastmod": "Dernière modification",
|
"Maintenance_database_lastmod": "Dernière modification",
|
||||||
"Maintenance_database_path": "Chemin de la base de données",
|
"Maintenance_database_path": "Chemin de la base de données",
|
||||||
"Maintenance_database_rows": "",
|
"Maintenance_database_rows": "Table (Colonnes)",
|
||||||
"Maintenance_database_size": "",
|
"Maintenance_database_size": "Taille de la base de données",
|
||||||
"Maintenance_lang_selector_apply": "Appliquer",
|
"Maintenance_lang_selector_apply": "Appliquer",
|
||||||
"Maintenance_lang_selector_empty": "",
|
"Maintenance_lang_selector_empty": "Choix de la langue",
|
||||||
"Maintenance_lang_selector_lable": "",
|
"Maintenance_lang_selector_lable": "Sélectionner une langue",
|
||||||
"Maintenance_lang_selector_text": "",
|
"Maintenance_lang_selector_text": "Le changement est effectué côté client, cela ne concerne donc que le navigateur actuel.",
|
||||||
"Maintenance_new_version": "",
|
"Maintenance_new_version": "🆕 Une nouvelle version est disponible. Consulter les <a href=\"https://github.com/jokob-sk/NetAlertX/releases\" target=\"_blank\">notes de version</a>.",
|
||||||
"Maintenance_themeselector_apply": "Appliquer",
|
"Maintenance_themeselector_apply": "Appliquer",
|
||||||
"Maintenance_themeselector_empty": "",
|
"Maintenance_themeselector_empty": "Choisir un thème",
|
||||||
"Maintenance_themeselector_lable": "",
|
"Maintenance_themeselector_lable": "Sélectionner un thème",
|
||||||
"Maintenance_themeselector_text": "",
|
"Maintenance_themeselector_text": "Le changement s'effectue côté serveur, il s'applique donc à tous les appareils connectés à l'interface graphique.",
|
||||||
"Maintenance_version": "",
|
"Maintenance_version": "Mises à jour de l'application",
|
||||||
"NETWORK_DEVICE_TYPES_description": "",
|
"NETWORK_DEVICE_TYPES_description": "Les types d'appareils autorisés à verre utilisés comme appareils réseau dans la vue Réseau. Le type d'appareils doit être identique au paramètre <code>Type</code> d'un appareil dans le détail des appareils. Ne pas supprimer de valeurs, seulement en ajouter de nouvelles.",
|
||||||
"NETWORK_DEVICE_TYPES_name": "",
|
"NETWORK_DEVICE_TYPES_name": "Type d'appareil réseau",
|
||||||
"Navigation_About": "À propos",
|
"Navigation_About": "À propos",
|
||||||
"Navigation_Devices": "Appareils",
|
"Navigation_Devices": "Appareils",
|
||||||
"Navigation_Donations": "Dons",
|
"Navigation_Donations": "Dons",
|
||||||
"Navigation_Events": "Évènements",
|
"Navigation_Events": "Évènements",
|
||||||
"Navigation_HelpFAQ": "Aide / FAQ",
|
"Navigation_HelpFAQ": "Aide / FAQ",
|
||||||
"Navigation_Integrations": "",
|
"Navigation_Integrations": "Intégrations",
|
||||||
"Navigation_Maintenance": "",
|
"Navigation_Maintenance": "Maintenance",
|
||||||
"Navigation_Monitoring": "Surveillance",
|
"Navigation_Monitoring": "Surveillance",
|
||||||
"Navigation_Network": "Réseau",
|
"Navigation_Network": "Réseau",
|
||||||
"Navigation_Notifications": "",
|
"Navigation_Notifications": "Notifications",
|
||||||
"Navigation_Plugins": "Greffons",
|
"Navigation_Plugins": "Greffons",
|
||||||
"Navigation_Presence": "Présence",
|
"Navigation_Presence": "Présence",
|
||||||
"Navigation_Report": "",
|
"Navigation_Report": "Rapports transmis",
|
||||||
"Navigation_Settings": "Paramètres",
|
"Navigation_Settings": "Paramètres",
|
||||||
"Navigation_SystemInfo": "Infos système",
|
"Navigation_SystemInfo": "Infos système",
|
||||||
"Navigation_Workflows": "Flux de travail",
|
"Navigation_Workflows": "Flux de travail",
|
||||||
"Network_Assign": "",
|
"Network_Assign": "Se connecter à ce <i class=\"fa fa-server\"></i> nœud réseau",
|
||||||
"Network_Cant_Assign": "",
|
"Network_Cant_Assign": "Impossible d'assigner le noeud racine Internet comme enfant d'un noeud.",
|
||||||
"Network_Configuration_Error": "",
|
"Network_Configuration_Error": "Erreur de configuration",
|
||||||
"Network_Connected": "Appareils connectés",
|
"Network_Connected": "Appareils connectés",
|
||||||
"Network_ManageAdd": "",
|
"Network_ManageAdd": "Ajouter un appareil",
|
||||||
"Network_ManageAdd_Name": "",
|
"Network_ManageAdd_Name": "Nom de l'appareil",
|
||||||
"Network_ManageAdd_Name_text": "",
|
"Network_ManageAdd_Name_text": "Nom sans caractère spécial",
|
||||||
"Network_ManageAdd_Port": "",
|
"Network_ManageAdd_Port": "Nombre de ports",
|
||||||
"Network_ManageAdd_Port_text": "",
|
"Network_ManageAdd_Port_text": "laisser vide pour le wifi et le courant porteur (CPL)",
|
||||||
"Network_ManageAdd_Submit": "",
|
"Network_ManageAdd_Submit": "Ajouter un appareil",
|
||||||
"Network_ManageAdd_Type": "",
|
"Network_ManageAdd_Type": "Type d'appareil",
|
||||||
"Network_ManageAdd_Type_text": "",
|
"Network_ManageAdd_Type_text": "-- Selectionner un type --",
|
||||||
"Network_ManageAssign": "Assigner",
|
"Network_ManageAssign": "Assigner",
|
||||||
"Network_ManageDel": "",
|
"Network_ManageDel": "Supprimer un appareil",
|
||||||
"Network_ManageDel_Name": "",
|
"Network_ManageDel_Name": "Appareil à supprimer",
|
||||||
"Network_ManageDel_Name_text": "",
|
"Network_ManageDel_Name_text": "-- Selectionner un appareil --",
|
||||||
"Network_ManageDel_Submit": "Supprimer",
|
"Network_ManageDel_Submit": "Supprimer",
|
||||||
"Network_ManageDevices": "",
|
"Network_ManageDevices": "Gérer les appareils",
|
||||||
"Network_ManageEdit": "",
|
"Network_ManageEdit": "Mettre à jour un appareil",
|
||||||
"Network_ManageEdit_ID": "",
|
"Network_ManageEdit_ID": "Appareil à mettre à jour",
|
||||||
"Network_ManageEdit_ID_text": "",
|
"Network_ManageEdit_ID_text": "-- Sélectionner l'appareil à modifier --",
|
||||||
"Network_ManageEdit_Name": "",
|
"Network_ManageEdit_Name": "Nouveau nom de l'appareil",
|
||||||
"Network_ManageEdit_Name_text": "",
|
"Network_ManageEdit_Name_text": "Nom sans caractère spécial",
|
||||||
"Network_ManageEdit_Port": "",
|
"Network_ManageEdit_Port": " Nouveau nombre de ports",
|
||||||
"Network_ManageEdit_Port_text": "",
|
"Network_ManageEdit_Port_text": "laisser vide pour le wifi et le courant porteur (CPL)",
|
||||||
"Network_ManageEdit_Submit": "",
|
"Network_ManageEdit_Submit": "Enregistrer les changements",
|
||||||
"Network_ManageEdit_Type": "",
|
"Network_ManageEdit_Type": "Type du nouvel appareil",
|
||||||
"Network_ManageEdit_Type_text": "",
|
"Network_ManageEdit_Type_text": "-- Sélectionner le type --",
|
||||||
"Network_ManageLeaf": "",
|
"Network_ManageLeaf": "Gérer l'assignation",
|
||||||
"Network_ManageUnassign": "",
|
"Network_ManageUnassign": "Désassigner",
|
||||||
"Network_NoAssignedDevices": "",
|
"Network_NoAssignedDevices": "Ce nœud réseau ne contient pas d'appareils assignés. Vous pouvez en assigner un ci-dessous, ou en allant dans l'onglet <b><i class=\"fa fa-info-circle\"></i> Détails</b> d'un appareil depuis le menu <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Appareils</b></a>, et assigner cet équipement à un <b><i class=\"fa fa-server\"></i> Nœud (MAC)</b> réseau et à un <b><i class=\"fa fa-ethernet\"></i>Port</b>.",
|
||||||
"Network_NoDevices": "",
|
"Network_NoDevices": "Pas d'appareil à configurer",
|
||||||
"Network_Node": "",
|
"Network_Node": "Nœud réseau",
|
||||||
"Network_Node_Name": "",
|
"Network_Node_Name": "Nom du nœud",
|
||||||
"Network_Parent": "",
|
"Network_Parent": "Appareil du réseau principal",
|
||||||
"Network_Root": "",
|
"Network_Root": "Noeud racine",
|
||||||
"Network_Root_Not_Configured": "",
|
"Network_Root_Not_Configured": "Pour commencer la configuration de cet écran, sélectionner un type d'appareil réseau, par exemple une <b>Gateway</b>, dans le champ <b>Type</b> de <a href=\"deviceDetails.php?mac=Internet\">l'appareil racine pour Internet</a> <br/><br/> Plus d'informations dans le guide <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank\">Comment configurer votre page Réseau</a>",
|
||||||
"Network_Root_Unconfigurable": "",
|
"Network_Root_Unconfigurable": "Racine non configurable",
|
||||||
"Network_Table_Hostname": "Nom de hôte",
|
"Network_Table_Hostname": "Nom de hôte",
|
||||||
"Network_Table_IP": "IP",
|
"Network_Table_IP": "IP",
|
||||||
"Network_Table_State": "État",
|
"Network_Table_State": "État",
|
||||||
"Network_Title": "",
|
"Network_Title": "Vue générale du réseau",
|
||||||
"Network_UnassignedDevices": "",
|
"Network_UnassignedDevices": "Appareils non assignés",
|
||||||
"Notifications_All": "",
|
"Notifications_All": "Toutes les notifications",
|
||||||
"Notifications_Mark_All_Read": "",
|
"Notifications_Mark_All_Read": "Tout marquer comme lu",
|
||||||
"PIALERT_WEB_PASSWORD_description": "",
|
"PIALERT_WEB_PASSWORD_description": "Le mot de passe par défaut est <code>123456</code>. Pour changer ce mot de passe, lancez depuis le container <code>/app/back/pialert-cli</code> ou utilisez le <a onclick=\"toggleAllSettings()\" href=\"#SETPWD_RUN\"><code>SETPWD_RUN</code>Plugin de définition de mot de passe (Set password)</a>.",
|
||||||
"PIALERT_WEB_PASSWORD_name": "",
|
"PIALERT_WEB_PASSWORD_name": "Mot de passe de connexion",
|
||||||
"PIALERT_WEB_PROTECTION_description": "",
|
"PIALERT_WEB_PROTECTION_description": "Quand activé, une fenêtre de connexion est affichée. Lisez attentivement ci-dessous dans le cas où vous ne pourriez plus vous connecter à votre instance.",
|
||||||
"PIALERT_WEB_PROTECTION_name": "",
|
"PIALERT_WEB_PROTECTION_name": "Activer la connexion par login",
|
||||||
"PLUGINS_KEEP_HIST_description": "",
|
"PLUGINS_KEEP_HIST_description": "Combien d'entrées de résultats de scan doivent être conservés dans l'historique des plugins (par plugin, pas par appareil).",
|
||||||
"PLUGINS_KEEP_HIST_name": "",
|
"PLUGINS_KEEP_HIST_name": "Historique des plugins",
|
||||||
"Plugins_DeleteAll": "",
|
"Plugins_DeleteAll": "Tout supprimer (ne prend pas en compte les filtres)",
|
||||||
"Plugins_Filters_Mac": "",
|
"Plugins_Filters_Mac": "Filtrer par MAC",
|
||||||
"Plugins_History": "",
|
"Plugins_History": "Historique des événements",
|
||||||
"Plugins_Objects": "",
|
"Plugins_Obj_DeleteListed": "Effacer les objets listés",
|
||||||
"Plugins_Out_of": "",
|
"Plugins_Objects": "Objets des plugins",
|
||||||
|
"Plugins_Out_of": "sur",
|
||||||
"Plugins_Unprocessed_Events": "Événements non traités",
|
"Plugins_Unprocessed_Events": "Événements non traités",
|
||||||
"Plugins_no_control": "",
|
"Plugins_no_control": "Pas de formulaire trouvé pour afficher cette valeur.",
|
||||||
"Presence_CalHead_day": "jour",
|
"Presence_CalHead_day": "jour",
|
||||||
"Presence_CalHead_lang": "",
|
"Presence_CalHead_lang": "fr-fr",
|
||||||
"Presence_CalHead_month": "mois",
|
"Presence_CalHead_month": "mois",
|
||||||
"Presence_CalHead_quarter": "trimestre",
|
"Presence_CalHead_quarter": "trimestre",
|
||||||
"Presence_CalHead_week": "semaine",
|
"Presence_CalHead_week": "semaine",
|
||||||
"Presence_CalHead_year": "année",
|
"Presence_CalHead_year": "année",
|
||||||
"Presence_CallHead_Devices": "Appareils",
|
"Presence_CallHead_Devices": "Appareils",
|
||||||
|
"Presence_Key_OnlineNow": "Maintenant en ligne",
|
||||||
|
"Presence_Key_OnlineNow_desc": "Appareil détecté comme étant en ligne lors de la dernière analyse.",
|
||||||
|
"Presence_Key_OnlinePast": "Passé en ligne",
|
||||||
|
"Presence_Key_OnlinePastMiss": "Passé en ligne (correspondance manquée)",
|
||||||
|
"Presence_Key_OnlinePastMiss_desc": "Appareil en ligne dans le passé, mais actuellement hors ligne, mais la session de démarrage pourrait être manquante ou avoir des données contradictoires. (il s'agit peut-être d'un bogue - veuillez soumettre un PR si vous savez comment le corriger - je suis un peu perdu dans le code ici)",
|
||||||
|
"Presence_Key_OnlinePast_desc": "Appareil en ligne dans le passé, mais actuellement hors ligne.",
|
||||||
"Presence_Loading": "Chargement …",
|
"Presence_Loading": "Chargement …",
|
||||||
"Presence_Shortcut_AllDevices": "Mes appareils",
|
"Presence_Shortcut_AllDevices": "Mes appareils",
|
||||||
"Presence_Shortcut_Archived": "Archivés",
|
"Presence_Shortcut_Archived": "Archivés",
|
||||||
@@ -545,24 +562,26 @@
|
|||||||
"Presence_Shortcut_Devices": "Appareils",
|
"Presence_Shortcut_Devices": "Appareils",
|
||||||
"Presence_Shortcut_DownAlerts": "Alertes de panne",
|
"Presence_Shortcut_DownAlerts": "Alertes de panne",
|
||||||
"Presence_Shortcut_Favorites": "Favoris",
|
"Presence_Shortcut_Favorites": "Favoris",
|
||||||
"Presence_Shortcut_NewDevices": "",
|
"Presence_Shortcut_NewDevices": "Nouveaux appareils",
|
||||||
"Presence_Title": "",
|
"Presence_Title": "Présence par appareil",
|
||||||
"REPORT_DASHBOARD_URL_description": "",
|
"REPORT_DASHBOARD_URL_description": "Cette URL est utilisée comme base pour générer les liens des rapports HTML (par ex. les courriels). Renseignez l'adresse complète, commençant par <code>http://</code> et incluznt le numero de port (sans slash <code>/</code> à la fin).",
|
||||||
"REPORT_DASHBOARD_URL_name": "",
|
"REPORT_DASHBOARD_URL_name": "URL de NetAlertX",
|
||||||
"REPORT_ERROR": "",
|
"REPORT_ERROR": "La page que vous cherchez est temporairement indisponible. Merci de réessayer dans quelques secondes",
|
||||||
"REPORT_MAIL_description": "",
|
"REPORT_MAIL_description": "Si activé, un courriel est envoyé, avec la liste des changements pour lesquels on a souscrit. Cela nécessite de renseigner les paramètres associés au paramétrage SMTP plus bas. Si vous rencontrez des problèmes, positionnez le <code>LOG_LEVEL</code> au niveau <code>debug</code> et vérifiez les <a href=\"/maintenance.php#tab_Logging\">journaux d'erreurs</a>.",
|
||||||
"REPORT_MAIL_name": "",
|
"REPORT_MAIL_name": "Activer les courriels",
|
||||||
"REPORT_TITLE": "",
|
"REPORT_TITLE": "Rapport",
|
||||||
"RandomMAC_hover": "",
|
"RandomMAC_hover": "Détecté automatiquement - indique si l'appareil dispose d'une adresse MAC générée aléatoirement.",
|
||||||
"Reports_Sent_Log": "",
|
"Reports_Sent_Log": "Rapports de log transmis",
|
||||||
"SCAN_SUBNETS_description": "",
|
"SCAN_SUBNETS_description": "La plupart des scanners sur le réseau (scan ARP, NMAP, Nslookup, DIG, Pholud) se base sur le scan d'une partie spécifique des interfaces réseau ou de sous-réseau. Consulter la <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">documentation des sous-réseaux</a> pour plus d'aide sur ce paramètre, notamment pour des VLAN, lesquels sont supportés ou sur comment identifier le masque réseau et votre interface réseau. <br/> <br/> Une alternative à ces scanner sur le réseau et d'activer d'autres scanners d'appareils ou des importe, qui ne dépendent pas du fait de laisser NetAlert<sup>X</sup> accéder au réseau (Unifié, baux DHCP, Pi-hole, etc.).<br/><br/> Remarque : la durée du scan en lui-même dépend du nombre d'adresses IP à scanner, renseignez donc soigneusement avec le bon masque réseau et la bonne interface réseau.",
|
||||||
|
"SCAN_SUBNETS_name": "Réseaux à scanner",
|
||||||
"SYSTEM_TITLE": "Informations système",
|
"SYSTEM_TITLE": "Informations système",
|
||||||
"Setting_Override": "",
|
"Setting_Override": "Remplacer la valeur",
|
||||||
"Setting_Override_Description": "",
|
"Setting_Override_Description": "Activer cette option va remplacer la valeur fournie par défaut par une application par la valeur renseignée au-dessus.",
|
||||||
"Settings_Metadata_Toggle": "",
|
"Settings_Metadata_Toggle": "Afficher/masquer les méta données pour le paramètre sélectionné.",
|
||||||
"Settings_device_Scanners_desync": "",
|
"Settings_Show_Description": "Montrer la description de la configuration.",
|
||||||
"Settings_device_Scanners_desync_popup": "",
|
"Settings_device_Scanners_desync": "⚠ La planification des différents scanners d'appareils est désynchronisée.",
|
||||||
"Speedtest_Results": "",
|
"Settings_device_Scanners_desync_popup": "La planification des scanners (<code>*_RUN_SCHD</code>) n'est pas identique entre scanners. Cela va entraîner des notifications en ligne/hors-ligne non cohérentes. À moins que cela soit attendu, utilisez la même planification pour tous les <b>🔍scanners d'appareils</b> activés.",
|
||||||
|
"Speedtest_Results": "Résultats du test de débit",
|
||||||
"Systeminfo_CPU": "Processeur",
|
"Systeminfo_CPU": "Processeur",
|
||||||
"Systeminfo_CPU_Cores": "Cœurs de processeur :",
|
"Systeminfo_CPU_Cores": "Cœurs de processeur :",
|
||||||
"Systeminfo_CPU_Name": "Nom du processeur :",
|
"Systeminfo_CPU_Name": "Nom du processeur :",
|
||||||
@@ -578,7 +597,7 @@
|
|||||||
"Systeminfo_General_TimeZone": "Fuseau horaire :",
|
"Systeminfo_General_TimeZone": "Fuseau horaire :",
|
||||||
"Systeminfo_Memory": "Mémoire",
|
"Systeminfo_Memory": "Mémoire",
|
||||||
"Systeminfo_Memory_Total_Memory": "Mémoire totale :",
|
"Systeminfo_Memory_Total_Memory": "Mémoire totale :",
|
||||||
"Systeminfo_Memory_Usage": "Utilisation de la mémoire:",
|
"Systeminfo_Memory_Usage": "Utilisation de la mémoire :",
|
||||||
"Systeminfo_Memory_Usage_Percent": "% de la mémoire :",
|
"Systeminfo_Memory_Usage_Percent": "% de la mémoire :",
|
||||||
"Systeminfo_Motherboard": "Carte mère",
|
"Systeminfo_Motherboard": "Carte mère",
|
||||||
"Systeminfo_Motherboard_BIOS": "BIOS :",
|
"Systeminfo_Motherboard_BIOS": "BIOS :",
|
||||||
@@ -595,10 +614,10 @@
|
|||||||
"Systeminfo_Network_HTTP_Referer": "Référent HTTP :",
|
"Systeminfo_Network_HTTP_Referer": "Référent HTTP :",
|
||||||
"Systeminfo_Network_HTTP_Referer_String": "Pas de référent HTTP",
|
"Systeminfo_Network_HTTP_Referer_String": "Pas de référent HTTP",
|
||||||
"Systeminfo_Network_Hardware": "Matériel réseau",
|
"Systeminfo_Network_Hardware": "Matériel réseau",
|
||||||
"Systeminfo_Network_Hardware_Interface_Mask": "",
|
"Systeminfo_Network_Hardware_Interface_Mask": "Masque réseau",
|
||||||
"Systeminfo_Network_Hardware_Interface_Name": "",
|
"Systeminfo_Network_Hardware_Interface_Name": "Nom de l'interface réseau",
|
||||||
"Systeminfo_Network_Hardware_Interface_RX": "",
|
"Systeminfo_Network_Hardware_Interface_RX": "Reçu",
|
||||||
"Systeminfo_Network_Hardware_Interface_TX": "",
|
"Systeminfo_Network_Hardware_Interface_TX": "Émis",
|
||||||
"Systeminfo_Network_IP": "IP Internet :",
|
"Systeminfo_Network_IP": "IP Internet :",
|
||||||
"Systeminfo_Network_IP_Connection": "Connexion IP :",
|
"Systeminfo_Network_IP_Connection": "Connexion IP :",
|
||||||
"Systeminfo_Network_IP_Server": "IP du serveur :",
|
"Systeminfo_Network_IP_Server": "IP du serveur :",
|
||||||
@@ -607,7 +626,7 @@
|
|||||||
"Systeminfo_Network_Request_Time": "Heure de la demande :",
|
"Systeminfo_Network_Request_Time": "Heure de la demande :",
|
||||||
"Systeminfo_Network_Request_URI": "URI de la demande :",
|
"Systeminfo_Network_Request_URI": "URI de la demande :",
|
||||||
"Systeminfo_Network_Secure_Connection": "Connexion sécurisée :",
|
"Systeminfo_Network_Secure_Connection": "Connexion sécurisée :",
|
||||||
"Systeminfo_Network_Secure_Connection_String": "",
|
"Systeminfo_Network_Secure_Connection_String": "Non (HTTP)",
|
||||||
"Systeminfo_Network_Server_Name": "Nom du serveur :",
|
"Systeminfo_Network_Server_Name": "Nom du serveur :",
|
||||||
"Systeminfo_Network_Server_Name_String": "Nom du serveur introuvable",
|
"Systeminfo_Network_Server_Name_String": "Nom du serveur introuvable",
|
||||||
"Systeminfo_Network_Server_Query": "Requête du serveur :",
|
"Systeminfo_Network_Server_Query": "Requête du serveur :",
|
||||||
@@ -621,73 +640,75 @@
|
|||||||
"Systeminfo_Storage_Mount": "Point de montage :",
|
"Systeminfo_Storage_Mount": "Point de montage :",
|
||||||
"Systeminfo_Storage_Size": "Taille :",
|
"Systeminfo_Storage_Size": "Taille :",
|
||||||
"Systeminfo_Storage_Type": "Type :",
|
"Systeminfo_Storage_Type": "Type :",
|
||||||
"Systeminfo_Storage_Usage": "",
|
"Systeminfo_Storage_Usage": "Utilisation du stockage",
|
||||||
"Systeminfo_Storage_Usage_Free": "Libre :",
|
"Systeminfo_Storage_Usage_Free": "Libre :",
|
||||||
"Systeminfo_Storage_Usage_Mount": "",
|
"Systeminfo_Storage_Usage_Mount": "Point de montage :",
|
||||||
"Systeminfo_Storage_Usage_Total": "Total :",
|
"Systeminfo_Storage_Usage_Total": "Total :",
|
||||||
"Systeminfo_Storage_Usage_Used": "Utilisé :",
|
"Systeminfo_Storage_Usage_Used": "Utilisé :",
|
||||||
"Systeminfo_System": "Système",
|
"Systeminfo_System": "Système",
|
||||||
"Systeminfo_System_AVG": "",
|
"Systeminfo_System_AVG": "Charge moyenne :",
|
||||||
"Systeminfo_System_Architecture": "Architecture :",
|
"Systeminfo_System_Architecture": "Architecture :",
|
||||||
"Systeminfo_System_Kernel": "Noyau :",
|
"Systeminfo_System_Kernel": "Noyau :",
|
||||||
"Systeminfo_System_OSVersion": "",
|
"Systeminfo_System_OSVersion": "Système d'exploitation :",
|
||||||
"Systeminfo_System_Running_Processes": "Processus en cours :",
|
"Systeminfo_System_Running_Processes": "Processus en cours :",
|
||||||
"Systeminfo_System_System": "Système :",
|
"Systeminfo_System_System": "Système :",
|
||||||
"Systeminfo_System_Uname": "",
|
"Systeminfo_System_Uname": "Uname :",
|
||||||
"Systeminfo_System_Uptime": "",
|
"Systeminfo_System_Uptime": "Durée d'activité :",
|
||||||
"Systeminfo_This_Client": "",
|
"Systeminfo_This_Client": "Ce client",
|
||||||
"Systeminfo_USB_Devices": "",
|
"Systeminfo_USB_Devices": "Appareils USB",
|
||||||
"TICKER_MIGRATE_TO_NETALERTX": "",
|
"TICKER_MIGRATE_TO_NETALERTX": "⚠ Emplacement de point de montage obsolète détecté. Suivez <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/MIGRATION.md\" target=\"_blank\">ce guide</a> pour migrer vers les nouveaux dossiers <code>/app/config</code> and <code>/app/db</code> et le container <code>netalertx</code>.",
|
||||||
"TIMEZONE_description": "",
|
"TIMEZONE_description": "Fuseau horaire pour afficher correctement les statistiques. Trouvez votre fuseau horaire <a target=\"_blank\" href=\"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\" rel=\"nofollow\">ici</a>.",
|
||||||
"TIMEZONE_name": "",
|
"TIMEZONE_name": "Fuseau horaire",
|
||||||
"UI_DEV_SECTIONS_description": "",
|
"UI_DEV_SECTIONS_description": "Slecetionnez quels éléments de l'interface graphique masquer dans les pages des appareils.",
|
||||||
"UI_DEV_SECTIONS_name": "",
|
"UI_DEV_SECTIONS_name": "Masquer des sections pour les appareils",
|
||||||
"UI_ICONS_description": "",
|
"UI_ICONS_description": "Une liste d'icônes prédéfinies. Attention, la manière recommandée d'ajouter des icônes est décrite dans la <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">documentation des icônes</a>. Vous pouvez ajouter un lien HTML encodé en base 64 vers un SVG ou une étiquette d'icône Font Awesome.",
|
||||||
"UI_ICONS_name": "",
|
"UI_ICONS_name": "Icones prédéfinies",
|
||||||
"UI_LANG_description": "Sélectionnez votre langue préféré de l’interface. Aidez à traduire ou suggérez des langues dans le portail en ligne de <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
|
"UI_LANG_description": "Sélectionnez votre langue préféré de l’interface. Aidez à traduire ou suggérez des langues dans le portail en ligne de <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
|
||||||
"UI_LANG_name": "",
|
"UI_LANG_name": "Langue de l'interface graphique",
|
||||||
"UI_MY_DEVICES_description": "",
|
"UI_MY_DEVICES_description": "Les états autorisant les appareils à être affichés par défaut dans la vue <b>Mes appareils</b>.",
|
||||||
"UI_MY_DEVICES_name": "",
|
"UI_MY_DEVICES_name": "Afficher dans la vue de mes appareils",
|
||||||
"UI_NOT_RANDOM_MAC_description": "",
|
"UI_NOT_RANDOM_MAC_description": "Les préfixes d'adresses MAC à ne pas considérer comme généré aléatoirement pour les appareils. Renseignez par exemple <code>52</code> pour que les appareils commençant par <code>52:xx:xx:xx:xx:xx</code> ne soient pas considérés comme disposant d'une adresse MAC aléatoire.",
|
||||||
"UI_NOT_RANDOM_MAC_name": "Ne pas marquer comme aléatoire",
|
"UI_NOT_RANDOM_MAC_name": "Ne pas marquer comme aléatoire",
|
||||||
"UI_PRESENCE_description": "",
|
"UI_PRESENCE_description": "Sélectionner les états qui doivent être affichés dans le graphique de <b>Présence des appareils</b> de la page <a href=\"/devices.php\" target=\"_blank\">Appareils</a>.",
|
||||||
"UI_PRESENCE_name": "",
|
"UI_PRESENCE_name": "Afficher dans le graphique de présence",
|
||||||
"UI_REFRESH_description": "",
|
"UI_REFRESH_description": "Renseignez le nombre de secondes après lequel rafraîchir l'interface graphique. Renseignez <code>0</code> pour désactiver.",
|
||||||
"UI_REFRESH_name": "",
|
"UI_REFRESH_name": "Rafraîchir automatiquement l'interface graphique",
|
||||||
"devices_old": "",
|
"VERSION_description": "Valeur de la version ou du timestamp d'aide à vérifier si l'application a été mise à jour.",
|
||||||
"general_event_description": "",
|
"VERSION_name": "Version ou Timestamp",
|
||||||
"general_event_title": "",
|
"devices_old": "Rafraichissement...",
|
||||||
"report_guid": "",
|
"general_event_description": "L'événement que vous avez lancé peut prendre du temps avant que les tâches de fond ne soit terminées. La durée d'exécution finira une fois que la file d'exécution ci-dessous sera vide (consulter les <a href='/maintenance.php#tab_Logging'>journaux d'erreur</a> si vous rencontrez des erreurs). <br/> <br/> File d'exécution :",
|
||||||
"report_guid_missing": "",
|
"general_event_title": "Lancement d'un événement sur mesure",
|
||||||
"report_select_format": "",
|
"report_guid": "GUID de la notification :",
|
||||||
"report_time": "",
|
"report_guid_missing": "La notification associée n'a pas été trouvée. Un petit délai existe entre l'envoi d'une notification et sa disponibilité réelle pour affichage. Rafraichissez la page et votre cache après quelques secondes. Il est aussi possible que la notification sélectionnée ait été supprimée durant une opération de maintenance, comme renseigné dans le paramètre <code>DBCLNP_NOTIFI_HIST</code>. <br/> <br/> La dernière notification est affichée à sa place. La notification manquante dispose du GUID suivant :",
|
||||||
"run_event_icon": "",
|
"report_select_format": "Sélectionner un format :",
|
||||||
"run_event_tooltip": "",
|
"report_time": "Heure de la notification :",
|
||||||
"settings_core_icon": "",
|
"run_event_icon": "fa-play",
|
||||||
"settings_core_label": "",
|
"run_event_tooltip": "Activez le paramètre et enregistrez vos changements avant de le lancer.",
|
||||||
"settings_device_scanners": "",
|
"settings_core_icon": "fa-solid fa-gem",
|
||||||
"settings_device_scanners_icon": "",
|
"settings_core_label": "Principal",
|
||||||
"settings_device_scanners_info": "",
|
"settings_device_scanners": "Les scanners d'appareils utilisés pour découvrir des appareils, qui écrivent dans la table CurrentScan (scan actuel) de la base de données.",
|
||||||
|
"settings_device_scanners_icon": "fa-solid fa-magnifying-glass-plus",
|
||||||
|
"settings_device_scanners_info": "Chargez plus de scanners d'appareils avec le paramètre <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a>",
|
||||||
"settings_device_scanners_label": "Scanners d'appareils",
|
"settings_device_scanners_label": "Scanners d'appareils",
|
||||||
"settings_enabled": "Paramètres activés",
|
"settings_enabled": "Paramètres activés",
|
||||||
"settings_enabled_icon": "",
|
"settings_enabled_icon": "fa-solid fa-toggle-on",
|
||||||
"settings_expand_all": "Tout développer",
|
"settings_expand_all": "Tout développer",
|
||||||
"settings_imported": "",
|
"settings_imported": "Dernier import des paramètres depuis le fichier app.conf",
|
||||||
"settings_imported_label": "Paramètres importés",
|
"settings_imported_label": "Paramètres importés",
|
||||||
"settings_missing": "",
|
"settings_missing": "Tous les paramètres n'ont pas été chargés ! La base de données est trop sollicitée, ou bien la séquence de démarrage de l'application est trop lourde. Cliquez sur le bouton de rafraîchissement 🔄 en haut.",
|
||||||
"settings_missing_block": "",
|
"settings_missing_block": "Erreur : les paramètres ne sont pas correctement chargés. Cliquer sur le bouton de rafraîchissement 🔄 en haut ; sinon, vous pouvez vérifier les journaux du navigateur pour plus de détails (F12).",
|
||||||
"settings_old": "Importation des paramètres et réinitialisation...",
|
"settings_old": "Importation des paramètres et réinitialisation...",
|
||||||
"settings_other_scanners": "",
|
"settings_other_scanners": "Autres plugins activés, hors scanners d'appareils.",
|
||||||
"settings_other_scanners_icon": "fa-solid fa-recycle",
|
"settings_other_scanners_icon": "fa-solid fa-recycle",
|
||||||
"settings_other_scanners_label": "Autres scanners",
|
"settings_other_scanners_label": "Autres scanners",
|
||||||
"settings_publishers": "",
|
"settings_publishers": "Activer les passerelles de publication de notifications, qui enverront une notification en fonction de vos paramètres renseignés.",
|
||||||
"settings_publishers_icon": "fa-solid fa-paper-plane",
|
"settings_publishers_icon": "fa-solid fa-paper-plane",
|
||||||
"settings_publishers_info": "",
|
"settings_publishers_info": "Charger plus de passerelles de publication avec le paramètre <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a>",
|
||||||
"settings_publishers_label": "Éditeurs",
|
"settings_publishers_label": "Passerelles de publication",
|
||||||
"settings_saved": "<br/>Paramètres enregistrés. <br/> Rechargement... <br/><i class=\"ion ion-ios-loop-strong fa-spin fa-2x fa-fw\"></i> <br/>",
|
"settings_saved": "<br/>Paramètres enregistrés. <br/> Rechargement... <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_icon": "fa-solid fa-gear",
|
||||||
"settings_system_label": "Système",
|
"settings_system_label": "Système",
|
||||||
"settings_update_item_warning": "",
|
"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_icon": "fa-vial-circle-check",
|
||||||
"test_event_tooltip": "Enregistrer d'abord vos modifications avant de tester vôtre paramétrage."
|
"test_event_tooltip": "Enregistrer d'abord vos modifications avant de tester vôtre paramétrage."
|
||||||
}
|
}
|
||||||
@@ -56,11 +56,13 @@
|
|||||||
"BackDevices_Restore_okay": "Ripristino eseguito correttamente.",
|
"BackDevices_Restore_okay": "Ripristino eseguito correttamente.",
|
||||||
"BackDevices_darkmode_disabled": "Modalità scura disabilitata",
|
"BackDevices_darkmode_disabled": "Modalità scura disabilitata",
|
||||||
"BackDevices_darkmode_enabled": "Modalità scura abilitata",
|
"BackDevices_darkmode_enabled": "Modalità scura abilitata",
|
||||||
|
"CLEAR_NEW_FLAG_description": "Se abilitato (<code>0</code> è disabilitato), i dispositivi contrassegnati come <b>Nuovo dispositivo</b> verranno deselezionati se il limite di tempo (specificato in ore) supera il tempo della <b>Prima sessione</b>.",
|
||||||
|
"CLEAR_NEW_FLAG_name": "Cancella nuova bandiera",
|
||||||
"DAYS_TO_KEEP_EVENTS_description": "Questa è un'impostazione di manutenzione. Specifica il numero di giorni delle voci degli eventi che verranno conservati. Tutti gli eventi più vecchi verranno eliminati periodicamente. Si applica anche alla cronologia degli eventi del plugin (Plugin Events History).",
|
"DAYS_TO_KEEP_EVENTS_description": "Questa è un'impostazione di manutenzione. Specifica il numero di giorni delle voci degli eventi che verranno conservati. Tutti gli eventi più vecchi verranno eliminati periodicamente. Si applica anche alla cronologia degli eventi del plugin (Plugin Events History).",
|
||||||
"DAYS_TO_KEEP_EVENTS_name": "Elimina eventi più vecchi di",
|
"DAYS_TO_KEEP_EVENTS_name": "Elimina eventi più vecchi di",
|
||||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Copia dettagli dal dispositivo",
|
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Copia dettagli dal dispositivo",
|
||||||
"DevDetail_Copy_Device_Tooltip": "Copia i dettagli dal dispositivo dall'elenco a discesa. Tutto in questa pagina verrà sovrascritto",
|
"DevDetail_Copy_Device_Tooltip": "Copia i dettagli dal dispositivo dall'elenco a discesa. Tutto in questa pagina verrà sovrascritto",
|
||||||
"DevDetail_EveandAl_AlertAllEvents": "Notifica tutti gli eventi",
|
"DevDetail_EveandAl_AlertAllEvents": "Notifica eventi",
|
||||||
"DevDetail_EveandAl_AlertDown": "Avviso disconnessione",
|
"DevDetail_EveandAl_AlertDown": "Avviso disconnessione",
|
||||||
"DevDetail_EveandAl_Archived": "Archiviato",
|
"DevDetail_EveandAl_Archived": "Archiviato",
|
||||||
"DevDetail_EveandAl_NewDevice": "Nuovo dispositivo",
|
"DevDetail_EveandAl_NewDevice": "Nuovo dispositivo",
|
||||||
@@ -215,6 +217,7 @@
|
|||||||
"Device_TableHead_RowID": "ID riga",
|
"Device_TableHead_RowID": "ID riga",
|
||||||
"Device_TableHead_Rowid": "ID riga",
|
"Device_TableHead_Rowid": "ID riga",
|
||||||
"Device_TableHead_SSID": "SSID",
|
"Device_TableHead_SSID": "SSID",
|
||||||
|
"Device_TableHead_SourcePlugin": "Plugin sorgente",
|
||||||
"Device_TableHead_Status": "Stato",
|
"Device_TableHead_Status": "Stato",
|
||||||
"Device_TableHead_SyncHubNodeName": "Sincronizza nodo",
|
"Device_TableHead_SyncHubNodeName": "Sincronizza nodo",
|
||||||
"Device_TableHead_Type": "Tipo",
|
"Device_TableHead_Type": "Tipo",
|
||||||
@@ -274,12 +277,15 @@
|
|||||||
"Gen_AreYouSure": "Sei sicuro?",
|
"Gen_AreYouSure": "Sei sicuro?",
|
||||||
"Gen_Backup": "Esegui backup",
|
"Gen_Backup": "Esegui backup",
|
||||||
"Gen_Cancel": "Annulla",
|
"Gen_Cancel": "Annulla",
|
||||||
|
"Gen_Change": "Modifica",
|
||||||
"Gen_Copy": "Esegui",
|
"Gen_Copy": "Esegui",
|
||||||
"Gen_DataUpdatedUITakesTime": "OK: l'aggiornamento dell'interfaccia utente potrebbe richiedere del tempo se è in esecuzione una scansione.",
|
"Gen_DataUpdatedUITakesTime": "OK: l'aggiornamento dell'interfaccia utente potrebbe richiedere del tempo se è in esecuzione una scansione.",
|
||||||
"Gen_Delete": "Elimina",
|
"Gen_Delete": "Elimina",
|
||||||
"Gen_DeleteAll": "Elimina tutti",
|
"Gen_DeleteAll": "Elimina tutti",
|
||||||
|
"Gen_Description": "Descrizione",
|
||||||
"Gen_Error": "Errore",
|
"Gen_Error": "Errore",
|
||||||
"Gen_Filter": "Filtro",
|
"Gen_Filter": "Filtro",
|
||||||
|
"Gen_Generate": "Genera",
|
||||||
"Gen_LockedDB": "ERRORE: il DB potrebbe essere bloccato, controlla F12 Strumenti di sviluppo -> Console o riprova più tardi.",
|
"Gen_LockedDB": "ERRORE: il DB potrebbe essere bloccato, controlla F12 Strumenti di sviluppo -> Console o riprova più tardi.",
|
||||||
"Gen_Offline": "Offline",
|
"Gen_Offline": "Offline",
|
||||||
"Gen_Okay": "Ok",
|
"Gen_Okay": "Ok",
|
||||||
@@ -292,6 +298,7 @@
|
|||||||
"Gen_Save": "Salva",
|
"Gen_Save": "Salva",
|
||||||
"Gen_Saved": "Salvato",
|
"Gen_Saved": "Salvato",
|
||||||
"Gen_Search": "Cerca",
|
"Gen_Search": "Cerca",
|
||||||
|
"Gen_SelectToPreview": "Seleziona per anteprima",
|
||||||
"Gen_Selected_Devices": "Dispositivi selezionati:",
|
"Gen_Selected_Devices": "Dispositivi selezionati:",
|
||||||
"Gen_Switch": "Cambia",
|
"Gen_Switch": "Cambia",
|
||||||
"Gen_Upd": "Aggiornato correttamente",
|
"Gen_Upd": "Aggiornato correttamente",
|
||||||
@@ -302,8 +309,10 @@
|
|||||||
"Gen_Work_In_Progress": "Lavori in corso, è quindi un buon momento per un feedback su https://github.com/jokob-sk/NetAlertX/issues",
|
"Gen_Work_In_Progress": "Lavori in corso, è quindi un buon momento per un feedback su https://github.com/jokob-sk/NetAlertX/issues",
|
||||||
"General_display_name": "Generale",
|
"General_display_name": "Generale",
|
||||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||||
"HRS_TO_KEEP_NEWDEV_description": "Questa è un'opzione di manutenzione. Se abilitata (<code>0</code> è disabilitata), tutti i dispositivi marcati con <b>Nuovo dispositivo</b> verranno eliminati se l'orario della <b>Prima sessione</b> è precedente all'orario di questa impostazione. Usa questa impostazione se vuoi eliminare automaticamente i <b>Nuovi dispositivi</b> dopo <code>X</code> ore.",
|
"HRS_TO_KEEP_NEWDEV_description": "Questa è un'impostazione di manutenzione <b>ELIMINAZIONE dispositivi</b>. Se abilitata (<code>0</code> è disabilitata), tutti i dispositivi marcati con <b>Nuovo dispositivo</b> verranno eliminati se l'orario della <b>Prima sessione</b> è precedente all'orario di questa impostazione. Usa questa impostazione se vuoi eliminare automaticamente i <b>Nuovi dispositivi</b> dopo <code>X</code> ore.",
|
||||||
"HRS_TO_KEEP_NEWDEV_name": "Mantieni nuovi dispositivi per",
|
"HRS_TO_KEEP_NEWDEV_name": "Elimina nuovi dispositivi dopo",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_description": "Questa è un'impostazione di manutenzione <b>ELIMINAZIONE dispositivi</b>. Se abilitata (<code>0</code> è disabilitata), i dispositivi che sono <b>Offline</b> e la loro data e ora <b>Ultima offline</b> sono più vecchi delle ore specificate in questa impostazione. Usa questa impostazione se vuoi eliminare automaticamente <b>Dispositivi offline</b> dopo <code>X</code> ore trascorse offline.",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_name": "Elimina dispositivi offline dopo",
|
||||||
"HelpFAQ_Cat_Detail": "Dettagli",
|
"HelpFAQ_Cat_Detail": "Dettagli",
|
||||||
"HelpFAQ_Cat_Detail_300_head": "Cosa significa ",
|
"HelpFAQ_Cat_Detail_300_head": "Cosa significa ",
|
||||||
"HelpFAQ_Cat_Detail_300_text_a": "indica un dispositivo di rete (un dispositivo di tipo AP, Gateway, Firewall, Hypervisor, Powerline, Switch, WLAN, PLC, Router, USB LAN Adapter, USB WIFI Adapter, o Internet). Tipi personalizzati possono essere aggiunti attraverso l'impostazione <code>NETWORK_DEVICE_TYPES</code>.",
|
"HelpFAQ_Cat_Detail_300_text_a": "indica un dispositivo di rete (un dispositivo di tipo AP, Gateway, Firewall, Hypervisor, Powerline, Switch, WLAN, PLC, Router, USB LAN Adapter, USB WIFI Adapter, o Internet). Tipi personalizzati possono essere aggiunti attraverso l'impostazione <code>NETWORK_DEVICE_TYPES</code>.",
|
||||||
@@ -347,6 +356,7 @@
|
|||||||
"Loading": "Caricamento...",
|
"Loading": "Caricamento...",
|
||||||
"Login_Box": "Inserisci la tua password",
|
"Login_Box": "Inserisci la tua password",
|
||||||
"Login_Default_PWD": "La password predefinita \"123456\" è ancora attiva.",
|
"Login_Default_PWD": "La password predefinita \"123456\" è ancora attiva.",
|
||||||
|
"Login_Info": "Le password vengono impostate tramite il plugin Set Password. Controlla la <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">documentazione SETPWD</a> se riscontri problemi di accesso.",
|
||||||
"Login_Psw-box": "Password",
|
"Login_Psw-box": "Password",
|
||||||
"Login_Psw_alert": "Avviso password!",
|
"Login_Psw_alert": "Avviso password!",
|
||||||
"Login_Psw_folder": "nella cartella di configurazione.",
|
"Login_Psw_folder": "nella cartella di configurazione.",
|
||||||
@@ -527,6 +537,7 @@
|
|||||||
"Plugins_DeleteAll": "Elimina tutti (i filtri vengono ignorati)",
|
"Plugins_DeleteAll": "Elimina tutti (i filtri vengono ignorati)",
|
||||||
"Plugins_Filters_Mac": "Filtro MAC",
|
"Plugins_Filters_Mac": "Filtro MAC",
|
||||||
"Plugins_History": "Storico eventi",
|
"Plugins_History": "Storico eventi",
|
||||||
|
"Plugins_Obj_DeleteListed": "Elimina oggetti elencati",
|
||||||
"Plugins_Objects": "Oggetti plugin",
|
"Plugins_Objects": "Oggetti plugin",
|
||||||
"Plugins_Out_of": "fuori da",
|
"Plugins_Out_of": "fuori da",
|
||||||
"Plugins_Unprocessed_Events": "Eventi non processati",
|
"Plugins_Unprocessed_Events": "Eventi non processati",
|
||||||
@@ -538,6 +549,12 @@
|
|||||||
"Presence_CalHead_week": "settimana",
|
"Presence_CalHead_week": "settimana",
|
||||||
"Presence_CalHead_year": "anno",
|
"Presence_CalHead_year": "anno",
|
||||||
"Presence_CallHead_Devices": "Dispositivi",
|
"Presence_CallHead_Devices": "Dispositivi",
|
||||||
|
"Presence_Key_OnlineNow": "Online adesso",
|
||||||
|
"Presence_Key_OnlineNow_desc": "Dispositivo rilevato durante l'ultima scansione come online.",
|
||||||
|
"Presence_Key_OnlinePast": "Online in passato",
|
||||||
|
"Presence_Key_OnlinePastMiss": "Online in passato (non corrispondente)",
|
||||||
|
"Presence_Key_OnlinePastMiss_desc": "Dispositivo online in passato, ma attualmente offline, ma la sessione di avvio potrebbe essere mancante o presentare dati in conflitto. (potrebbe trattarsi di un bug: invia una PR se sai come risolverlo, sono un po' perso nel codice qui)",
|
||||||
|
"Presence_Key_OnlinePast_desc": "Dispositivo online in passato, ma attualmente offline.",
|
||||||
"Presence_Loading": "Caricamento...",
|
"Presence_Loading": "Caricamento...",
|
||||||
"Presence_Shortcut_AllDevices": "Miei dispositivi",
|
"Presence_Shortcut_AllDevices": "Miei dispositivi",
|
||||||
"Presence_Shortcut_Archived": "Archiviati",
|
"Presence_Shortcut_Archived": "Archiviati",
|
||||||
@@ -556,10 +573,12 @@
|
|||||||
"RandomMAC_hover": "Rilevato automaticamente: indica se il dispositivo genera il suo indirizzo MAC casualmente.",
|
"RandomMAC_hover": "Rilevato automaticamente: indica se il dispositivo genera il suo indirizzo MAC casualmente.",
|
||||||
"Reports_Sent_Log": "Log rapporti inviati",
|
"Reports_Sent_Log": "Log rapporti inviati",
|
||||||
"SCAN_SUBNETS_description": "La maggior parte degli scanner di rete (ARP-SCAN, NMAP, NSLOOKUP, DIG, PHOLUS) si basano sulla scansione di interfacce di rete e sottoreti specifiche. Consulta la <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">documentazione sulle sottoreti</a> per assistenza su questa impostazione, in particolare VLAN, quali VLAN sono supportate o come individuare la maschera di rete e l'interfaccia. <br/> <br/> Un'alternativa agli scanner in rete è abilitare altri scanner/importatori di dispositivi che non si affidano a NetAlert<sup>X</sup> che hanno accesso alla rete (UNIFI, dhcp.leases , PiHole, ecc.). <br/> <br/> Nota: il tempo di scansione stesso dipende dal numero di indirizzi IP da controllare, quindi impostalo attentamente con la maschera di rete e l'interfaccia appropriate.",
|
"SCAN_SUBNETS_description": "La maggior parte degli scanner di rete (ARP-SCAN, NMAP, NSLOOKUP, DIG, PHOLUS) si basano sulla scansione di interfacce di rete e sottoreti specifiche. Consulta la <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">documentazione sulle sottoreti</a> per assistenza su questa impostazione, in particolare VLAN, quali VLAN sono supportate o come individuare la maschera di rete e l'interfaccia. <br/> <br/> Un'alternativa agli scanner in rete è abilitare altri scanner/importatori di dispositivi che non si affidano a NetAlert<sup>X</sup> che hanno accesso alla rete (UNIFI, dhcp.leases , PiHole, ecc.). <br/> <br/> Nota: il tempo di scansione stesso dipende dal numero di indirizzi IP da controllare, quindi impostalo attentamente con la maschera di rete e l'interfaccia appropriate.",
|
||||||
|
"SCAN_SUBNETS_name": "Reti da scansionare",
|
||||||
"SYSTEM_TITLE": "Informazioni sistema",
|
"SYSTEM_TITLE": "Informazioni sistema",
|
||||||
"Setting_Override": "Sovrascrivi valore",
|
"Setting_Override": "Sovrascrivi valore",
|
||||||
"Setting_Override_Description": "L'abilitazione di questa opzione sovrascriverà il valore predefinito fornito dall'app con il valore specificato sopra.",
|
"Setting_Override_Description": "L'abilitazione di questa opzione sovrascriverà il valore predefinito fornito dall'app con il valore specificato sopra.",
|
||||||
"Settings_Metadata_Toggle": "Mostra/nascondi i metadati per l'impostazione specificata.",
|
"Settings_Metadata_Toggle": "Mostra/nascondi i metadati per l'impostazione specificata.",
|
||||||
|
"Settings_Show_Description": "Mostra descrizione dell'impostazione.",
|
||||||
"Settings_device_Scanners_desync": "⚠ Le pianificazioni dello scanner del dispositivo non sono sincronizzate.",
|
"Settings_device_Scanners_desync": "⚠ Le pianificazioni dello scanner del dispositivo non sono sincronizzate.",
|
||||||
"Settings_device_Scanners_desync_popup": "Gli orari degli scanner dei dispositivi (<code>*_RUN_SCHD</code>) non sono gli stessi. Questo comporterà notifiche online/offline incoerenti del dispositivo. A meno che ciò non sia previsto, utilizza la stessa pianificazione per tutti gli <b>🔍Scanner dispositivi</b> abilitati.",
|
"Settings_device_Scanners_desync_popup": "Gli orari degli scanner dei dispositivi (<code>*_RUN_SCHD</code>) non sono gli stessi. Questo comporterà notifiche online/offline incoerenti del dispositivo. A meno che ciò non sia previsto, utilizza la stessa pianificazione per tutti gli <b>🔍Scanner dispositivi</b> abilitati.",
|
||||||
"Speedtest_Results": "Risultati test di velocità",
|
"Speedtest_Results": "Risultati test di velocità",
|
||||||
@@ -646,14 +665,16 @@
|
|||||||
"UI_ICONS_name": "Icone predefinite",
|
"UI_ICONS_name": "Icone predefinite",
|
||||||
"UI_LANG_description": "Seleziona la lingua preferita dell'interfaccia utente. Aiuta nella traduzione o suggerisci una nuova lingua sul portale online di <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
|
"UI_LANG_description": "Seleziona la lingua preferita dell'interfaccia utente. Aiuta nella traduzione o suggerisci una nuova lingua sul portale online di <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
|
||||||
"UI_LANG_name": "Lingua UI",
|
"UI_LANG_name": "Lingua UI",
|
||||||
"UI_MY_DEVICES_description": "Dispositivi i cui stati devono essere visualizzati nella visualizzazione predefinita <b>Miei dispositivi</b>. (<code>CTRL + clic</code> per selezionare/deselezionare)",
|
"UI_MY_DEVICES_description": "Dispositivi i cui stati devono essere visualizzati nella visualizzazione predefinita <b>Miei dispositivi</b>.",
|
||||||
"UI_MY_DEVICES_name": "Mostra nella vista Miei dispositivi",
|
"UI_MY_DEVICES_name": "Mostra nella vista Miei dispositivi",
|
||||||
"UI_NOT_RANDOM_MAC_description": "Prefissi MAC che non devono essere contrassegnati come dispositivi casuali. Inserisci ad esempio <code>52</code> per escludere i dispositivi che iniziano con <code>52:xx:xx:xx:xx:xx</code> dall'essere contrassegnati come dispositivi con un indirizzo MAC casuale.",
|
"UI_NOT_RANDOM_MAC_description": "Prefissi MAC che non devono essere contrassegnati come dispositivi casuali. Inserisci ad esempio <code>52</code> per escludere i dispositivi che iniziano con <code>52:xx:xx:xx:xx:xx</code> dall'essere contrassegnati come dispositivi con un indirizzo MAC casuale.",
|
||||||
"UI_NOT_RANDOM_MAC_name": "Non segnalare come casuale",
|
"UI_NOT_RANDOM_MAC_name": "Non segnalare come casuale",
|
||||||
"UI_PRESENCE_description": "Seleziona quali stati devono essere mostrati nel grafico <b>Presenza dispositivo</b> nella pagina <a href=\"/devices.php\" target=\"_blank\">Dispositivi</a>. (<code>CTRL + clic</code> per selezionare/deselezionare)",
|
"UI_PRESENCE_description": "Seleziona quali stati devono essere mostrati nel grafico <b>Presenza dispositivo</b> nella pagina <a href=\"/devices.php\" target=\"_blank\">Dispositivi</a>.",
|
||||||
"UI_PRESENCE_name": "Mostra nel grafico delle presenze",
|
"UI_PRESENCE_name": "Mostra nel grafico delle presenze",
|
||||||
"UI_REFRESH_description": "Inserisci il numero di secondi dopo il quale la UI si ricarica. Imposta a <code>0</code> per disabilitare.",
|
"UI_REFRESH_description": "Inserisci il numero di secondi dopo il quale la UI si ricarica. Imposta a <code>0</code> per disabilitare.",
|
||||||
"UI_REFRESH_name": "Aggiorna automaticamente la UI",
|
"UI_REFRESH_name": "Aggiorna automaticamente la UI",
|
||||||
|
"VERSION_description": "Valore di supporto della versione o della marca temporale per verificare se l'app è stata aggiornata.",
|
||||||
|
"VERSION_name": "Versione o marca temporale",
|
||||||
"devices_old": "Aggiornamento...",
|
"devices_old": "Aggiornamento...",
|
||||||
"general_event_description": "L'evento che hai attivato potrebbe richiedere del tempo prima che i processi in background vengano completati. L'esecuzione è terminata una volta che la coda di esecuzione sottostante si è svuotata (controlla il <a href='/maintenance.php#tab_Logging'>log degli errori</a> se riscontri problemi). <br/> <br/> Coda di esecuzione:",
|
"general_event_description": "L'evento che hai attivato potrebbe richiedere del tempo prima che i processi in background vengano completati. L'esecuzione è terminata una volta che la coda di esecuzione sottostante si è svuotata (controlla il <a href='/maintenance.php#tab_Logging'>log degli errori</a> se riscontri problemi). <br/> <br/> Coda di esecuzione:",
|
||||||
"general_event_title": "Esecuzione di un evento ad-hoc",
|
"general_event_title": "Esecuzione di un evento ad-hoc",
|
||||||
|
|||||||
@@ -5,11 +5,14 @@
|
|||||||
// ###################################
|
// ###################################
|
||||||
|
|
||||||
$defaultLang = "en_us";
|
$defaultLang = "en_us";
|
||||||
$allLanguages = ["en_us","es_es","de_de", "nb_no", "pl_pl", "pt_br", "ru_ru", "fr_fr", "it_it", "zh_cn", "cs_cz"];
|
$allLanguages = ["en_us", "es_es", "de_de", "fr_fr", "it_it", "ru_ru", "nb_no", "pl_pl", "pt_br", "tr_tr", "zh_cn", "cs_cz", "ar_ar"];
|
||||||
|
|
||||||
|
|
||||||
global $db;
|
global $db;
|
||||||
|
|
||||||
$result = $db->querySingle("SELECT Value FROM Settings WHERE Code_Name = 'UI_LANG'");
|
$result = $db->querySingle("SELECT Value FROM Settings WHERE Code_Name = 'UI_LANG'");
|
||||||
|
|
||||||
|
// below has to match exactly teh values in /front/php/templates/language/lang.php & /front/js/common.js
|
||||||
switch($result){
|
switch($result){
|
||||||
case 'Spanish': $pia_lang_selected = 'es_es'; break;
|
case 'Spanish': $pia_lang_selected = 'es_es'; break;
|
||||||
case 'German': $pia_lang_selected = 'de_de'; break;
|
case 'German': $pia_lang_selected = 'de_de'; break;
|
||||||
@@ -22,13 +25,12 @@ switch($result){
|
|||||||
case 'French': $pia_lang_selected = 'fr_fr'; break;
|
case 'French': $pia_lang_selected = 'fr_fr'; break;
|
||||||
case 'Chinese (zh_cn)': $pia_lang_selected = 'zh_cn'; break;
|
case 'Chinese (zh_cn)': $pia_lang_selected = 'zh_cn'; break;
|
||||||
case 'Czech (cs_cz)': $pia_lang_selected = 'cs_cz'; break;
|
case 'Czech (cs_cz)': $pia_lang_selected = 'cs_cz'; break;
|
||||||
|
case 'Arabic (ar_ar)': $pia_lang_selected = 'ar_ar'; break;
|
||||||
default: $pia_lang_selected = 'en_us'; break;
|
default: $pia_lang_selected = 'en_us'; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($pia_lang_selected) == FALSE or (strlen($pia_lang_selected) == 0)) {$pia_lang_selected = $defaultLang;}
|
if (isset($pia_lang_selected) == FALSE or (strlen($pia_lang_selected) == 0)) {$pia_lang_selected = $defaultLang;}
|
||||||
|
|
||||||
require dirname(__FILE__).'/../skinUI.php';
|
|
||||||
|
|
||||||
$result = $db->query("SELECT * FROM Plugins_Language_Strings");
|
$result = $db->query("SELECT * FROM Plugins_Language_Strings");
|
||||||
$strings = array();
|
$strings = array();
|
||||||
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
|
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
|
||||||
|
|||||||
@@ -33,6 +33,6 @@ def merge_translations(main_file, other_files):
|
|||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
current_path = os.path.dirname(os.path.abspath(__file__))
|
current_path = os.path.dirname(os.path.abspath(__file__))
|
||||||
# language codes can be found here: http://www.lingoes.net/en/translator/langcode.htm
|
# language codes can be found here: http://www.lingoes.net/en/translator/langcode.htm
|
||||||
json_files = ["en_us.json", "de_de.json", "es_es.json", "fr_fr.json", "nb_no.json", "ru_ru.json", "it_it.json", "pt_br.json", "pl_pl.json", "zh_cn.json", "tr_tr.json", "cs_cz.json"]
|
json_files = ["en_us.json", "de_de.json", "es_es.json", "fr_fr.json", "nb_no.json", "ru_ru.json", "it_it.json", "pt_br.json", "pl_pl.json", "zh_cn.json", "tr_tr.json", "cs_cz.json", "ar_ar.json"]
|
||||||
file_paths = [os.path.join(current_path, file) for file in json_files]
|
file_paths = [os.path.join(current_path, file) for file in json_files]
|
||||||
merge_translations(file_paths[0], file_paths[1:])
|
merge_translations(file_paths[0], file_paths[1:])
|
||||||
|
|||||||
@@ -56,6 +56,8 @@
|
|||||||
"BackDevices_Restore_okay": "Gjenoppretting utført.",
|
"BackDevices_Restore_okay": "Gjenoppretting utført.",
|
||||||
"BackDevices_darkmode_disabled": "Mørk modus Deaktivert",
|
"BackDevices_darkmode_disabled": "Mørk modus Deaktivert",
|
||||||
"BackDevices_darkmode_enabled": "Mørk modus Aktivert",
|
"BackDevices_darkmode_enabled": "Mørk modus Aktivert",
|
||||||
|
"CLEAR_NEW_FLAG_description": "",
|
||||||
|
"CLEAR_NEW_FLAG_name": "",
|
||||||
"DAYS_TO_KEEP_EVENTS_description": "Dette er en vedlikeholdsinnstilling. Dette spesifiserer antall dager verdt med hendelsesoppføringer som vil beholdes. Alle eldre hendelser vil bli slettet med jevne mellomrom. Gjelder også for plugin-hendelseshistorikk.",
|
"DAYS_TO_KEEP_EVENTS_description": "Dette er en vedlikeholdsinnstilling. Dette spesifiserer antall dager verdt med hendelsesoppføringer som vil beholdes. Alle eldre hendelser vil bli slettet med jevne mellomrom. Gjelder også for plugin-hendelseshistorikk.",
|
||||||
"DAYS_TO_KEEP_EVENTS_name": "Slett hendelser eldre enn",
|
"DAYS_TO_KEEP_EVENTS_name": "Slett hendelser eldre enn",
|
||||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Kopier detaljer fra enhet",
|
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Kopier detaljer fra enhet",
|
||||||
@@ -215,6 +217,7 @@
|
|||||||
"Device_TableHead_RowID": "Rad ID",
|
"Device_TableHead_RowID": "Rad ID",
|
||||||
"Device_TableHead_Rowid": "Rad ID",
|
"Device_TableHead_Rowid": "Rad ID",
|
||||||
"Device_TableHead_SSID": "",
|
"Device_TableHead_SSID": "",
|
||||||
|
"Device_TableHead_SourcePlugin": "",
|
||||||
"Device_TableHead_Status": "Status",
|
"Device_TableHead_Status": "Status",
|
||||||
"Device_TableHead_SyncHubNodeName": "Synkroniser Node",
|
"Device_TableHead_SyncHubNodeName": "Synkroniser Node",
|
||||||
"Device_TableHead_Type": "Type",
|
"Device_TableHead_Type": "Type",
|
||||||
@@ -274,12 +277,15 @@
|
|||||||
"Gen_AreYouSure": "Er du sikker?",
|
"Gen_AreYouSure": "Er du sikker?",
|
||||||
"Gen_Backup": "Kjør sikkerhetskopiering",
|
"Gen_Backup": "Kjør sikkerhetskopiering",
|
||||||
"Gen_Cancel": "Avbryt",
|
"Gen_Cancel": "Avbryt",
|
||||||
|
"Gen_Change": "",
|
||||||
"Gen_Copy": "Kjør",
|
"Gen_Copy": "Kjør",
|
||||||
"Gen_DataUpdatedUITakesTime": "OK - Det kan ta litt tid før brukergrensesnittet oppdateres hvis en skanning kjøres.",
|
"Gen_DataUpdatedUITakesTime": "OK - Det kan ta litt tid før brukergrensesnittet oppdateres hvis en skanning kjøres.",
|
||||||
"Gen_Delete": "Slett",
|
"Gen_Delete": "Slett",
|
||||||
"Gen_DeleteAll": "Slett alle",
|
"Gen_DeleteAll": "Slett alle",
|
||||||
|
"Gen_Description": "",
|
||||||
"Gen_Error": "Feil",
|
"Gen_Error": "Feil",
|
||||||
"Gen_Filter": "Filter",
|
"Gen_Filter": "Filter",
|
||||||
|
"Gen_Generate": "",
|
||||||
"Gen_LockedDB": "FEIL - DB kan være låst - Sjekk F12 Dev tools -> Konsoll eller prøv senere.",
|
"Gen_LockedDB": "FEIL - DB kan være låst - Sjekk F12 Dev tools -> Konsoll eller prøv senere.",
|
||||||
"Gen_Offline": "Frakoblet",
|
"Gen_Offline": "Frakoblet",
|
||||||
"Gen_Okay": "Ok",
|
"Gen_Okay": "Ok",
|
||||||
@@ -292,6 +298,7 @@
|
|||||||
"Gen_Save": "Lagre",
|
"Gen_Save": "Lagre",
|
||||||
"Gen_Saved": "Lagret",
|
"Gen_Saved": "Lagret",
|
||||||
"Gen_Search": "Søk",
|
"Gen_Search": "Søk",
|
||||||
|
"Gen_SelectToPreview": "",
|
||||||
"Gen_Selected_Devices": "Valgte Enheter:",
|
"Gen_Selected_Devices": "Valgte Enheter:",
|
||||||
"Gen_Switch": "Bytt",
|
"Gen_Switch": "Bytt",
|
||||||
"Gen_Upd": "Oppdatering vellykket",
|
"Gen_Upd": "Oppdatering vellykket",
|
||||||
@@ -304,6 +311,8 @@
|
|||||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||||
"HRS_TO_KEEP_NEWDEV_description": "Dette er en vedlikeholdsinnstilling. Hvis aktivert (<code>0</code> er deaktivert), vil enheter merket som <b>Ny Enhet</b> bli slettet hvis tiden deres for <b>Første økt</b> var eldre enn de angitte timene i denne innstilling. Bruk denne innstillingen hvis du vil automatisk slette <b>Nye Enheter</b> etter <code>X</code> timer.",
|
"HRS_TO_KEEP_NEWDEV_description": "Dette er en vedlikeholdsinnstilling. Hvis aktivert (<code>0</code> er deaktivert), vil enheter merket som <b>Ny Enhet</b> bli slettet hvis tiden deres for <b>Første økt</b> var eldre enn de angitte timene i denne innstilling. Bruk denne innstillingen hvis du vil automatisk slette <b>Nye Enheter</b> etter <code>X</code> timer.",
|
||||||
"HRS_TO_KEEP_NEWDEV_name": "Behold nye enheter for",
|
"HRS_TO_KEEP_NEWDEV_name": "Behold nye enheter for",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_description": "",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_name": "",
|
||||||
"HelpFAQ_Cat_Detail": "Detaljer",
|
"HelpFAQ_Cat_Detail": "Detaljer",
|
||||||
"HelpFAQ_Cat_Detail_300_head": "Hva betyr ",
|
"HelpFAQ_Cat_Detail_300_head": "Hva betyr ",
|
||||||
"HelpFAQ_Cat_Detail_300_text_a": "betyr en nettverksenhet (en enhet av typen AP, Gateway, Brannmur, Hypervisor, Powerline, Switch, WLAN, PLS, ruter, USB LAN-adapter, USB WIFI-adapter eller Internett). Egendefinerte typer kan legges til via <code>NETWORK_DEVICE_TYPES</code>-innstillingen.",
|
"HelpFAQ_Cat_Detail_300_text_a": "betyr en nettverksenhet (en enhet av typen AP, Gateway, Brannmur, Hypervisor, Powerline, Switch, WLAN, PLS, ruter, USB LAN-adapter, USB WIFI-adapter eller Internett). Egendefinerte typer kan legges til via <code>NETWORK_DEVICE_TYPES</code>-innstillingen.",
|
||||||
@@ -347,6 +356,7 @@
|
|||||||
"Loading": "Laster...",
|
"Loading": "Laster...",
|
||||||
"Login_Box": "Skriv inn passordet ditt",
|
"Login_Box": "Skriv inn passordet ditt",
|
||||||
"Login_Default_PWD": "Standard passordet \"123456\" er fortsatt aktivt.",
|
"Login_Default_PWD": "Standard passordet \"123456\" er fortsatt aktivt.",
|
||||||
|
"Login_Info": "",
|
||||||
"Login_Psw-box": "Passord",
|
"Login_Psw-box": "Passord",
|
||||||
"Login_Psw_alert": "Passord varsling!",
|
"Login_Psw_alert": "Passord varsling!",
|
||||||
"Login_Psw_folder": "i config-mappen.",
|
"Login_Psw_folder": "i config-mappen.",
|
||||||
@@ -527,6 +537,7 @@
|
|||||||
"Plugins_DeleteAll": "Slett alle (filtre blir ignorert)",
|
"Plugins_DeleteAll": "Slett alle (filtre blir ignorert)",
|
||||||
"Plugins_Filters_Mac": "Mac filter",
|
"Plugins_Filters_Mac": "Mac filter",
|
||||||
"Plugins_History": "Hendelses historikk",
|
"Plugins_History": "Hendelses historikk",
|
||||||
|
"Plugins_Obj_DeleteListed": "",
|
||||||
"Plugins_Objects": "Plugin-objekter",
|
"Plugins_Objects": "Plugin-objekter",
|
||||||
"Plugins_Out_of": "ut av",
|
"Plugins_Out_of": "ut av",
|
||||||
"Plugins_Unprocessed_Events": "Uprosesserte hendelser",
|
"Plugins_Unprocessed_Events": "Uprosesserte hendelser",
|
||||||
@@ -538,6 +549,12 @@
|
|||||||
"Presence_CalHead_week": "uke",
|
"Presence_CalHead_week": "uke",
|
||||||
"Presence_CalHead_year": "år",
|
"Presence_CalHead_year": "år",
|
||||||
"Presence_CallHead_Devices": "Enheter",
|
"Presence_CallHead_Devices": "Enheter",
|
||||||
|
"Presence_Key_OnlineNow": "",
|
||||||
|
"Presence_Key_OnlineNow_desc": "",
|
||||||
|
"Presence_Key_OnlinePast": "",
|
||||||
|
"Presence_Key_OnlinePastMiss": "",
|
||||||
|
"Presence_Key_OnlinePastMiss_desc": "",
|
||||||
|
"Presence_Key_OnlinePast_desc": "",
|
||||||
"Presence_Loading": "Laster...",
|
"Presence_Loading": "Laster...",
|
||||||
"Presence_Shortcut_AllDevices": "Mine enheter",
|
"Presence_Shortcut_AllDevices": "Mine enheter",
|
||||||
"Presence_Shortcut_Archived": "Arkivert",
|
"Presence_Shortcut_Archived": "Arkivert",
|
||||||
@@ -556,10 +573,12 @@
|
|||||||
"RandomMAC_hover": "Autodetektert - indikerer om enheten randomiserer MAC-adressen sin.",
|
"RandomMAC_hover": "Autodetektert - indikerer om enheten randomiserer MAC-adressen sin.",
|
||||||
"Reports_Sent_Log": "Sendte rapport logger",
|
"Reports_Sent_Log": "Sendte rapport logger",
|
||||||
"SCAN_SUBNETS_description": "De fleste skannere på nettet (ARP-Scan, NMAP, NSlookup, Dig, Pholus) er avhengige av å skanne spesifikke nettverksgrensesnitt og undernett. Sjekk <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">subnett dokumentasjonen</a> for hjelp på denne innstillingen, spesielt VLAN-er, hvilke VLAN-er som støttes, eller hvordan du kan finne ut nettverksmasken og grensesnittet ditt. <br/> <br/> Et alternativ til skannere på nettet er å aktivere noen andre enhetsskannere/importører som ikke er avhengige av Netalert<sup>X</sup> med tilgang til nettverket (UniFi, DHCP-Leaser, Pihole, osv.). <br/> <br/> Merk: Selve skanningstiden avhenger av antall IP -adresser som skal sjekkes, så sett dette opp nøye med riktig nettverksmaske og grensesnitt.",
|
"SCAN_SUBNETS_description": "De fleste skannere på nettet (ARP-Scan, NMAP, NSlookup, Dig, Pholus) er avhengige av å skanne spesifikke nettverksgrensesnitt og undernett. Sjekk <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">subnett dokumentasjonen</a> for hjelp på denne innstillingen, spesielt VLAN-er, hvilke VLAN-er som støttes, eller hvordan du kan finne ut nettverksmasken og grensesnittet ditt. <br/> <br/> Et alternativ til skannere på nettet er å aktivere noen andre enhetsskannere/importører som ikke er avhengige av Netalert<sup>X</sup> med tilgang til nettverket (UniFi, DHCP-Leaser, Pihole, osv.). <br/> <br/> Merk: Selve skanningstiden avhenger av antall IP -adresser som skal sjekkes, så sett dette opp nøye med riktig nettverksmaske og grensesnitt.",
|
||||||
|
"SCAN_SUBNETS_name": "",
|
||||||
"SYSTEM_TITLE": "Systeminformasjon",
|
"SYSTEM_TITLE": "Systeminformasjon",
|
||||||
"Setting_Override": "Overstyr verdi",
|
"Setting_Override": "Overstyr verdi",
|
||||||
"Setting_Override_Description": "Aktivering av dette alternativet vil overstyre en App som leveres standard-verdi med verdien som er spesifisert ovenfor.",
|
"Setting_Override_Description": "Aktivering av dette alternativet vil overstyre en App som leveres standard-verdi med verdien som er spesifisert ovenfor.",
|
||||||
"Settings_Metadata_Toggle": "Vis/skjul metadata for den gitte innstillingen.",
|
"Settings_Metadata_Toggle": "Vis/skjul metadata for den gitte innstillingen.",
|
||||||
|
"Settings_Show_Description": "",
|
||||||
"Settings_device_Scanners_desync": "⚠ Enhetsskanning tidsplan er ikke synkronisert lenger.",
|
"Settings_device_Scanners_desync": "⚠ Enhetsskanning tidsplan er ikke synkronisert lenger.",
|
||||||
"Settings_device_Scanners_desync_popup": "Tidsplanene for enhetsskanning (<code>*_RUN_SCHD</code>) er ikke de samme. Dette vil føre til inkonsekvent enhet på online/offline varsler. Med mindre dette er ment, kan du bruke den samme tidsplanen for alle aktiverte <b> 🔍Enhets-skannere</b>.",
|
"Settings_device_Scanners_desync_popup": "Tidsplanene for enhetsskanning (<code>*_RUN_SCHD</code>) er ikke de samme. Dette vil føre til inkonsekvent enhet på online/offline varsler. Med mindre dette er ment, kan du bruke den samme tidsplanen for alle aktiverte <b> 🔍Enhets-skannere</b>.",
|
||||||
"Speedtest_Results": "Speedtest resultater",
|
"Speedtest_Results": "Speedtest resultater",
|
||||||
@@ -654,6 +673,8 @@
|
|||||||
"UI_PRESENCE_name": "Vis i tilstedeværelse-diagrammet",
|
"UI_PRESENCE_name": "Vis i tilstedeværelse-diagrammet",
|
||||||
"UI_REFRESH_description": "Skriv inn antall sekunder før UI laster inn på nytt. Sett til <code>0</code> for å deaktivere.",
|
"UI_REFRESH_description": "Skriv inn antall sekunder før UI laster inn på nytt. Sett til <code>0</code> for å deaktivere.",
|
||||||
"UI_REFRESH_name": "Oppdater UI automatisk",
|
"UI_REFRESH_name": "Oppdater UI automatisk",
|
||||||
|
"VERSION_description": "",
|
||||||
|
"VERSION_name": "",
|
||||||
"devices_old": "Oppdaterer...",
|
"devices_old": "Oppdaterer...",
|
||||||
"general_event_description": "Hendelsen du har utløst kan ta en stund til før bakgrunnsprosesser er ferdig. Utførelsen ble avsluttet når utførelseskøen nedenfor tømmes (sjekk <a href='/maintenance.php#tab_Logging'>Feillogg</a> Hvis du møter problemer). <br/> <br/> Utførelseskø:",
|
"general_event_description": "Hendelsen du har utløst kan ta en stund til før bakgrunnsprosesser er ferdig. Utførelsen ble avsluttet når utførelseskøen nedenfor tømmes (sjekk <a href='/maintenance.php#tab_Logging'>Feillogg</a> Hvis du møter problemer). <br/> <br/> Utførelseskø:",
|
||||||
"general_event_title": "Utfører en ad-hoc hendelse",
|
"general_event_title": "Utfører en ad-hoc hendelse",
|
||||||
|
|||||||
@@ -56,6 +56,8 @@
|
|||||||
"BackDevices_Restore_okay": "Przywracanie wykonane z sukcesem.",
|
"BackDevices_Restore_okay": "Przywracanie wykonane z sukcesem.",
|
||||||
"BackDevices_darkmode_disabled": "Tryb ciemny Wyłączony",
|
"BackDevices_darkmode_disabled": "Tryb ciemny Wyłączony",
|
||||||
"BackDevices_darkmode_enabled": "Tryb ciemny Włączony",
|
"BackDevices_darkmode_enabled": "Tryb ciemny Włączony",
|
||||||
|
"CLEAR_NEW_FLAG_description": "",
|
||||||
|
"CLEAR_NEW_FLAG_name": "",
|
||||||
"DAYS_TO_KEEP_EVENTS_description": "To jest ustawienie konserwacji. Określa ile dni mają być utrzymywane wpisy wydarzeń. Wszystkie starsze wpisy wydarzeń zostaną usunięte okresowo. Dotyczy także Historii Wydarzeń Pluginów.",
|
"DAYS_TO_KEEP_EVENTS_description": "To jest ustawienie konserwacji. Określa ile dni mają być utrzymywane wpisy wydarzeń. Wszystkie starsze wpisy wydarzeń zostaną usunięte okresowo. Dotyczy także Historii Wydarzeń Pluginów.",
|
||||||
"DAYS_TO_KEEP_EVENTS_name": "Usuń wydarzenia starsze niż",
|
"DAYS_TO_KEEP_EVENTS_name": "Usuń wydarzenia starsze niż",
|
||||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i>Kopiuj opis z urządzenia",
|
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i>Kopiuj opis z urządzenia",
|
||||||
@@ -215,6 +217,7 @@
|
|||||||
"Device_TableHead_RowID": "ID wiersza",
|
"Device_TableHead_RowID": "ID wiersza",
|
||||||
"Device_TableHead_Rowid": "ID wiersza",
|
"Device_TableHead_Rowid": "ID wiersza",
|
||||||
"Device_TableHead_SSID": "SSID",
|
"Device_TableHead_SSID": "SSID",
|
||||||
|
"Device_TableHead_SourcePlugin": "",
|
||||||
"Device_TableHead_Status": "Status",
|
"Device_TableHead_Status": "Status",
|
||||||
"Device_TableHead_SyncHubNodeName": "Węzeł Synchronizacji",
|
"Device_TableHead_SyncHubNodeName": "Węzeł Synchronizacji",
|
||||||
"Device_TableHead_Type": "Typ",
|
"Device_TableHead_Type": "Typ",
|
||||||
@@ -274,12 +277,15 @@
|
|||||||
"Gen_AreYouSure": "Jesteś pewien?",
|
"Gen_AreYouSure": "Jesteś pewien?",
|
||||||
"Gen_Backup": "Wykonaj Kopie Zapasową",
|
"Gen_Backup": "Wykonaj Kopie Zapasową",
|
||||||
"Gen_Cancel": "Anuluj",
|
"Gen_Cancel": "Anuluj",
|
||||||
|
"Gen_Change": "",
|
||||||
"Gen_Copy": "Wykonaj",
|
"Gen_Copy": "Wykonaj",
|
||||||
"Gen_DataUpdatedUITakesTime": "OK - Aktualizacja UI może chwile potrwać jeżeli wykonywany jest skan.",
|
"Gen_DataUpdatedUITakesTime": "OK - Aktualizacja UI może chwile potrwać jeżeli wykonywany jest skan.",
|
||||||
"Gen_Delete": "Usuń",
|
"Gen_Delete": "Usuń",
|
||||||
"Gen_DeleteAll": "Usuń wszystko",
|
"Gen_DeleteAll": "Usuń wszystko",
|
||||||
|
"Gen_Description": "",
|
||||||
"Gen_Error": "Błąd",
|
"Gen_Error": "Błąd",
|
||||||
"Gen_Filter": "Filtr",
|
"Gen_Filter": "Filtr",
|
||||||
|
"Gen_Generate": "",
|
||||||
"Gen_LockedDB": "BŁĄD - BAZA DANYCH może być zablokowana - Sprawdź F12 narzędzia dewelopera -> Konsola lub spróbuj ponownie później.",
|
"Gen_LockedDB": "BŁĄD - BAZA DANYCH może być zablokowana - Sprawdź F12 narzędzia dewelopera -> Konsola lub spróbuj ponownie później.",
|
||||||
"Gen_Offline": "Wyłączone",
|
"Gen_Offline": "Wyłączone",
|
||||||
"Gen_Okay": "Ok",
|
"Gen_Okay": "Ok",
|
||||||
@@ -292,6 +298,7 @@
|
|||||||
"Gen_Save": "Zapisz",
|
"Gen_Save": "Zapisz",
|
||||||
"Gen_Saved": "Zapisano",
|
"Gen_Saved": "Zapisano",
|
||||||
"Gen_Search": "Szukaj",
|
"Gen_Search": "Szukaj",
|
||||||
|
"Gen_SelectToPreview": "",
|
||||||
"Gen_Selected_Devices": "Wybierz Urządzenia:",
|
"Gen_Selected_Devices": "Wybierz Urządzenia:",
|
||||||
"Gen_Switch": "Switch",
|
"Gen_Switch": "Switch",
|
||||||
"Gen_Upd": "Zaktualizowane poprawnie",
|
"Gen_Upd": "Zaktualizowane poprawnie",
|
||||||
@@ -304,6 +311,8 @@
|
|||||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||||
"HRS_TO_KEEP_NEWDEV_description": "To jest ustawienie konserwacyjne. Jeżeli uruchomione (<code>0</code> jest wyłączone), urządzenie oznaczone jako <b>Nowe Urządzenie</b> zostanie usunięte jeżeli czas <b>Pierwszej Sesji</b> jest starszy niż godzina podana w tym ustawieniu. Uzyj tego ustawienia jeżeli chcesz automatycznie usuwać <b>Nowe Urządzenia</b> po <code>X</code> godzinach.",
|
"HRS_TO_KEEP_NEWDEV_description": "To jest ustawienie konserwacyjne. Jeżeli uruchomione (<code>0</code> jest wyłączone), urządzenie oznaczone jako <b>Nowe Urządzenie</b> zostanie usunięte jeżeli czas <b>Pierwszej Sesji</b> jest starszy niż godzina podana w tym ustawieniu. Uzyj tego ustawienia jeżeli chcesz automatycznie usuwać <b>Nowe Urządzenia</b> po <code>X</code> godzinach.",
|
||||||
"HRS_TO_KEEP_NEWDEV_name": "Trzymaj nowe urządzenia przez",
|
"HRS_TO_KEEP_NEWDEV_name": "Trzymaj nowe urządzenia przez",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_description": "",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_name": "",
|
||||||
"HelpFAQ_Cat_Detail": "Szczegóły",
|
"HelpFAQ_Cat_Detail": "Szczegóły",
|
||||||
"HelpFAQ_Cat_Detail_300_head": "Co oznacza ",
|
"HelpFAQ_Cat_Detail_300_head": "Co oznacza ",
|
||||||
"HelpFAQ_Cat_Detail_300_text_a": "oznacza urządzenie sieciowe (urządzenie typu AP, Gateway, Zapora sieciowa, Hypervisor, Powerline, Switch, WLAN, PLC, Ruter, Adapter USB LAN, Adapter USB WIFI, oraz Internet). Własny typ może zostać dodany poprzez ustawienie <code>NETWORK_DEVICE_TYPE</code>.",
|
"HelpFAQ_Cat_Detail_300_text_a": "oznacza urządzenie sieciowe (urządzenie typu AP, Gateway, Zapora sieciowa, Hypervisor, Powerline, Switch, WLAN, PLC, Ruter, Adapter USB LAN, Adapter USB WIFI, oraz Internet). Własny typ może zostać dodany poprzez ustawienie <code>NETWORK_DEVICE_TYPE</code>.",
|
||||||
@@ -347,6 +356,7 @@
|
|||||||
"Loading": "Wczytywanie...",
|
"Loading": "Wczytywanie...",
|
||||||
"Login_Box": "Wprowadź hasło",
|
"Login_Box": "Wprowadź hasło",
|
||||||
"Login_Default_PWD": "Podstawowe hasło \"123456\" jest aktywne.",
|
"Login_Default_PWD": "Podstawowe hasło \"123456\" jest aktywne.",
|
||||||
|
"Login_Info": "",
|
||||||
"Login_Psw-box": "Hasło",
|
"Login_Psw-box": "Hasło",
|
||||||
"Login_Psw_alert": "Alert HASŁA!",
|
"Login_Psw_alert": "Alert HASŁA!",
|
||||||
"Login_Psw_folder": "w folderze konfiguracji.",
|
"Login_Psw_folder": "w folderze konfiguracji.",
|
||||||
@@ -527,6 +537,7 @@
|
|||||||
"Plugins_DeleteAll": "Usuń wszystkie (filtry są ignorowane)",
|
"Plugins_DeleteAll": "Usuń wszystkie (filtry są ignorowane)",
|
||||||
"Plugins_Filters_Mac": "Filtr MAC",
|
"Plugins_Filters_Mac": "Filtr MAC",
|
||||||
"Plugins_History": "Historia Wydarzeń",
|
"Plugins_History": "Historia Wydarzeń",
|
||||||
|
"Plugins_Obj_DeleteListed": "",
|
||||||
"Plugins_Objects": "Obiekty Wtyczek",
|
"Plugins_Objects": "Obiekty Wtyczek",
|
||||||
"Plugins_Out_of": "brakujące",
|
"Plugins_Out_of": "brakujące",
|
||||||
"Plugins_Unprocessed_Events": "Nieprzeprocesowane Wydarzenia",
|
"Plugins_Unprocessed_Events": "Nieprzeprocesowane Wydarzenia",
|
||||||
@@ -538,6 +549,12 @@
|
|||||||
"Presence_CalHead_week": "tydzień",
|
"Presence_CalHead_week": "tydzień",
|
||||||
"Presence_CalHead_year": "rok",
|
"Presence_CalHead_year": "rok",
|
||||||
"Presence_CallHead_Devices": "Urządzenia",
|
"Presence_CallHead_Devices": "Urządzenia",
|
||||||
|
"Presence_Key_OnlineNow": "",
|
||||||
|
"Presence_Key_OnlineNow_desc": "",
|
||||||
|
"Presence_Key_OnlinePast": "",
|
||||||
|
"Presence_Key_OnlinePastMiss": "",
|
||||||
|
"Presence_Key_OnlinePastMiss_desc": "",
|
||||||
|
"Presence_Key_OnlinePast_desc": "",
|
||||||
"Presence_Loading": "Wczytywanie...",
|
"Presence_Loading": "Wczytywanie...",
|
||||||
"Presence_Shortcut_AllDevices": "Moje Urządzenia",
|
"Presence_Shortcut_AllDevices": "Moje Urządzenia",
|
||||||
"Presence_Shortcut_Archived": "Zarchiwizowane",
|
"Presence_Shortcut_Archived": "Zarchiwizowane",
|
||||||
@@ -556,10 +573,12 @@
|
|||||||
"RandomMAC_hover": "Auto wykrywanie - oznacza czy urządzenie randomizuje swój adres MAC.",
|
"RandomMAC_hover": "Auto wykrywanie - oznacza czy urządzenie randomizuje swój adres MAC.",
|
||||||
"Reports_Sent_Log": "Wyślij zgłoszenie logów",
|
"Reports_Sent_Log": "Wyślij zgłoszenie logów",
|
||||||
"SCAN_SUBNETS_description": "Większość skanerów sieciowych (ARP-SCAN, NMAP, NSLOOKUP, DIG, PHOLUS) opiera się na konkretnych interfejsach sieciowych oraz podsieci. Sprawdź <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\"> dokumentacji podsieci</a> jeżeli potrzebujesz pomocy w ustawieniach, a szczególnie z VLAN'ami, jakie VLAN'y są wspierane oraz jak rozgryźć maskę podsieci twojego interfejsu.<br/><br/> Alternatywą do skanerów sieciowych jest uruchomienie innego Skanera Urządzeń/Importera który nie polega by NetAlert<sup>X</sup> miał dostęp do sieci (UNIFI, dhcp.leases, PiHole, itp.).<br/><br/> Notatka: Czas skanu zależy od liczby adresów IP do sprawdzenia, więc ustaw go tak by skanował odpowiedni interfejs i maskę sieciową.",
|
"SCAN_SUBNETS_description": "Większość skanerów sieciowych (ARP-SCAN, NMAP, NSLOOKUP, DIG, PHOLUS) opiera się na konkretnych interfejsach sieciowych oraz podsieci. Sprawdź <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\"> dokumentacji podsieci</a> jeżeli potrzebujesz pomocy w ustawieniach, a szczególnie z VLAN'ami, jakie VLAN'y są wspierane oraz jak rozgryźć maskę podsieci twojego interfejsu.<br/><br/> Alternatywą do skanerów sieciowych jest uruchomienie innego Skanera Urządzeń/Importera który nie polega by NetAlert<sup>X</sup> miał dostęp do sieci (UNIFI, dhcp.leases, PiHole, itp.).<br/><br/> Notatka: Czas skanu zależy od liczby adresów IP do sprawdzenia, więc ustaw go tak by skanował odpowiedni interfejs i maskę sieciową.",
|
||||||
|
"SCAN_SUBNETS_name": "",
|
||||||
"SYSTEM_TITLE": "Informacje o Systemie",
|
"SYSTEM_TITLE": "Informacje o Systemie",
|
||||||
"Setting_Override": "Nadpisz wartość",
|
"Setting_Override": "Nadpisz wartość",
|
||||||
"Setting_Override_Description": "Włączanie tej opcji nadpisze podstawową wartość na wartość podaną powyżej.",
|
"Setting_Override_Description": "Włączanie tej opcji nadpisze podstawową wartość na wartość podaną powyżej.",
|
||||||
"Settings_Metadata_Toggle": "Pokaż/Ukryj metadane dla podanego ustawienia.",
|
"Settings_Metadata_Toggle": "Pokaż/Ukryj metadane dla podanego ustawienia.",
|
||||||
|
"Settings_Show_Description": "",
|
||||||
"Settings_device_Scanners_desync": "⚠ Harmonogramy skanowania urządzeń są niesynchronizowane.",
|
"Settings_device_Scanners_desync": "⚠ Harmonogramy skanowania urządzeń są niesynchronizowane.",
|
||||||
"Settings_device_Scanners_desync_popup": "Harmonogramy skanowania urządzeń (<code>*_RUN_SCHD</code>) nie są takie same. Powodować to będzie nierównomierne powiadomienia o urządzeniach włączynych/wyłączonych. Jeżeli nie jest to zamierzone to proszę włączyć ten sam harmonogram dla wszyskich <b>🔍Skanerów Urządzeń</b>.",
|
"Settings_device_Scanners_desync_popup": "Harmonogramy skanowania urządzeń (<code>*_RUN_SCHD</code>) nie są takie same. Powodować to będzie nierównomierne powiadomienia o urządzeniach włączynych/wyłączonych. Jeżeli nie jest to zamierzone to proszę włączyć ten sam harmonogram dla wszyskich <b>🔍Skanerów Urządzeń</b>.",
|
||||||
"Speedtest_Results": "Wyniki Testu Prędkości",
|
"Speedtest_Results": "Wyniki Testu Prędkości",
|
||||||
@@ -654,6 +673,8 @@
|
|||||||
"UI_PRESENCE_name": "Pokaż w tabeli obecności",
|
"UI_PRESENCE_name": "Pokaż w tabeli obecności",
|
||||||
"UI_REFRESH_description": "Wprowadź liczbę sekund po której UI ma się przeładować. Ustaw na <code>0</code> by wyłączyć.",
|
"UI_REFRESH_description": "Wprowadź liczbę sekund po której UI ma się przeładować. Ustaw na <code>0</code> by wyłączyć.",
|
||||||
"UI_REFRESH_name": "Automatycznie odświeżaj UI",
|
"UI_REFRESH_name": "Automatycznie odświeżaj UI",
|
||||||
|
"VERSION_description": "",
|
||||||
|
"VERSION_name": "",
|
||||||
"devices_old": "Odświeżanie...",
|
"devices_old": "Odświeżanie...",
|
||||||
"general_event_description": "Wydarzenie które wyzwoliłeś może chwilę zająć dopóki procesy w tle nie zakończą się. Wykonanie zakończy się kiedy kolejka się opróżni (Sprawdź <a href='/maintenance.php#tab_Logging'>logi błędów</a> jeżeli napotkasz błędy).<br/><br/> Kolejka wykonywania:",
|
"general_event_description": "Wydarzenie które wyzwoliłeś może chwilę zająć dopóki procesy w tle nie zakończą się. Wykonanie zakończy się kiedy kolejka się opróżni (Sprawdź <a href='/maintenance.php#tab_Logging'>logi błędów</a> jeżeli napotkasz błędy).<br/><br/> Kolejka wykonywania:",
|
||||||
"general_event_title": "Wykonywanie wydarzeń ad-hoc",
|
"general_event_title": "Wykonywanie wydarzeń ad-hoc",
|
||||||
|
|||||||
@@ -56,6 +56,8 @@
|
|||||||
"BackDevices_Restore_okay": "Restauração executada com sucesso.",
|
"BackDevices_Restore_okay": "Restauração executada com sucesso.",
|
||||||
"BackDevices_darkmode_disabled": "Modo Noturno Desabilitado",
|
"BackDevices_darkmode_disabled": "Modo Noturno Desabilitado",
|
||||||
"BackDevices_darkmode_enabled": "Modo Noturno Habilitado",
|
"BackDevices_darkmode_enabled": "Modo Noturno Habilitado",
|
||||||
|
"CLEAR_NEW_FLAG_description": "",
|
||||||
|
"CLEAR_NEW_FLAG_name": "",
|
||||||
"DAYS_TO_KEEP_EVENTS_description": "Esta é uma definição de manutenção. Especifica o número de dias de entradas de eventos que serão mantidas. Todos os eventos mais antigos serão eliminados periodicamente. Também se aplica ao Histórico de eventos do plug-in.",
|
"DAYS_TO_KEEP_EVENTS_description": "Esta é uma definição de manutenção. Especifica o número de dias de entradas de eventos que serão mantidas. Todos os eventos mais antigos serão eliminados periodicamente. Também se aplica ao Histórico de eventos do plug-in.",
|
||||||
"DAYS_TO_KEEP_EVENTS_name": "Excluir eventos mais antigos que",
|
"DAYS_TO_KEEP_EVENTS_name": "Excluir eventos mais antigos que",
|
||||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Copiar detalhes do dispositivo",
|
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Copiar detalhes do dispositivo",
|
||||||
@@ -215,6 +217,7 @@
|
|||||||
"Device_TableHead_RowID": "ID da linha",
|
"Device_TableHead_RowID": "ID da linha",
|
||||||
"Device_TableHead_Rowid": "ID da linha",
|
"Device_TableHead_Rowid": "ID da linha",
|
||||||
"Device_TableHead_SSID": "SSID",
|
"Device_TableHead_SSID": "SSID",
|
||||||
|
"Device_TableHead_SourcePlugin": "",
|
||||||
"Device_TableHead_Status": "Status",
|
"Device_TableHead_Status": "Status",
|
||||||
"Device_TableHead_SyncHubNodeName": "Nó de sincronização",
|
"Device_TableHead_SyncHubNodeName": "Nó de sincronização",
|
||||||
"Device_TableHead_Type": "Tipo",
|
"Device_TableHead_Type": "Tipo",
|
||||||
@@ -274,12 +277,15 @@
|
|||||||
"Gen_AreYouSure": "Tem certeza?",
|
"Gen_AreYouSure": "Tem certeza?",
|
||||||
"Gen_Backup": "Executar backup",
|
"Gen_Backup": "Executar backup",
|
||||||
"Gen_Cancel": "Cancelar",
|
"Gen_Cancel": "Cancelar",
|
||||||
|
"Gen_Change": "",
|
||||||
"Gen_Copy": "Executar",
|
"Gen_Copy": "Executar",
|
||||||
"Gen_DataUpdatedUITakesTime": "OK - Pode levar um tempo para a interface do usuário ser atualizada se uma verificação estiver em execução.",
|
"Gen_DataUpdatedUITakesTime": "OK - Pode levar um tempo para a interface do usuário ser atualizada se uma verificação estiver em execução.",
|
||||||
"Gen_Delete": "Excluir",
|
"Gen_Delete": "Excluir",
|
||||||
"Gen_DeleteAll": "Excluir todos",
|
"Gen_DeleteAll": "Excluir todos",
|
||||||
|
"Gen_Description": "",
|
||||||
"Gen_Error": "Erro",
|
"Gen_Error": "Erro",
|
||||||
"Gen_Filter": "Filtro",
|
"Gen_Filter": "Filtro",
|
||||||
|
"Gen_Generate": "",
|
||||||
"Gen_LockedDB": "ERRO - O banco de dados pode estar bloqueado - Verifique F12 Ferramentas de desenvolvimento -> Console ou tente mais tarde.",
|
"Gen_LockedDB": "ERRO - O banco de dados pode estar bloqueado - Verifique F12 Ferramentas de desenvolvimento -> Console ou tente mais tarde.",
|
||||||
"Gen_Offline": "Offline",
|
"Gen_Offline": "Offline",
|
||||||
"Gen_Okay": "Ok",
|
"Gen_Okay": "Ok",
|
||||||
@@ -292,6 +298,7 @@
|
|||||||
"Gen_Save": "Salvar",
|
"Gen_Save": "Salvar",
|
||||||
"Gen_Saved": "Salvo",
|
"Gen_Saved": "Salvo",
|
||||||
"Gen_Search": "Procurar",
|
"Gen_Search": "Procurar",
|
||||||
|
"Gen_SelectToPreview": "",
|
||||||
"Gen_Selected_Devices": "Dispositivos selecionados:",
|
"Gen_Selected_Devices": "Dispositivos selecionados:",
|
||||||
"Gen_Switch": "Trocar",
|
"Gen_Switch": "Trocar",
|
||||||
"Gen_Upd": "Atualizado com sucesso",
|
"Gen_Upd": "Atualizado com sucesso",
|
||||||
@@ -304,6 +311,8 @@
|
|||||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||||
"HRS_TO_KEEP_NEWDEV_description": "Esta é uma configuração de manutenção. Se habilitada (<code>0</code> is disabled), dispositivos marcados como <b>Novo Dispositivo</b> serão excluídos se o tempo de <b>Primeira Sessão</b> for mais antigo que as horas especificadas nesta configuração. Use esta configuração se quiser excluir automaticamente <b>Novos Dispositivos</b> após <code>X</code> horas.",
|
"HRS_TO_KEEP_NEWDEV_description": "Esta é uma configuração de manutenção. Se habilitada (<code>0</code> is disabled), dispositivos marcados como <b>Novo Dispositivo</b> serão excluídos se o tempo de <b>Primeira Sessão</b> for mais antigo que as horas especificadas nesta configuração. Use esta configuração se quiser excluir automaticamente <b>Novos Dispositivos</b> após <code>X</code> horas.",
|
||||||
"HRS_TO_KEEP_NEWDEV_name": "Manter novos dispositivos por",
|
"HRS_TO_KEEP_NEWDEV_name": "Manter novos dispositivos por",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_description": "",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_name": "",
|
||||||
"HelpFAQ_Cat_Detail": "Detalhes",
|
"HelpFAQ_Cat_Detail": "Detalhes",
|
||||||
"HelpFAQ_Cat_Detail_300_head": "O que significa ",
|
"HelpFAQ_Cat_Detail_300_head": "O que significa ",
|
||||||
"HelpFAQ_Cat_Detail_300_text_a": "Significa um dispositivo de rede (um dispositivo do tipo AP, Gateway, Firewall, Hypervisor, Powerline, Switch, WLAN, PLC, Roteador, Adaptador LAN USB, Adaptador Wi-Fi USB ou Internet). Tipos personalizados podem ser adicionados através da configuração <code>NETWORK_DEVICE_TYPES</code>.",
|
"HelpFAQ_Cat_Detail_300_text_a": "Significa um dispositivo de rede (um dispositivo do tipo AP, Gateway, Firewall, Hypervisor, Powerline, Switch, WLAN, PLC, Roteador, Adaptador LAN USB, Adaptador Wi-Fi USB ou Internet). Tipos personalizados podem ser adicionados através da configuração <code>NETWORK_DEVICE_TYPES</code>.",
|
||||||
@@ -347,6 +356,7 @@
|
|||||||
"Loading": "",
|
"Loading": "",
|
||||||
"Login_Box": "",
|
"Login_Box": "",
|
||||||
"Login_Default_PWD": "",
|
"Login_Default_PWD": "",
|
||||||
|
"Login_Info": "",
|
||||||
"Login_Psw-box": "",
|
"Login_Psw-box": "",
|
||||||
"Login_Psw_alert": "",
|
"Login_Psw_alert": "",
|
||||||
"Login_Psw_folder": "",
|
"Login_Psw_folder": "",
|
||||||
@@ -527,6 +537,7 @@
|
|||||||
"Plugins_DeleteAll": "",
|
"Plugins_DeleteAll": "",
|
||||||
"Plugins_Filters_Mac": "",
|
"Plugins_Filters_Mac": "",
|
||||||
"Plugins_History": "",
|
"Plugins_History": "",
|
||||||
|
"Plugins_Obj_DeleteListed": "",
|
||||||
"Plugins_Objects": "",
|
"Plugins_Objects": "",
|
||||||
"Plugins_Out_of": "",
|
"Plugins_Out_of": "",
|
||||||
"Plugins_Unprocessed_Events": "",
|
"Plugins_Unprocessed_Events": "",
|
||||||
@@ -538,6 +549,12 @@
|
|||||||
"Presence_CalHead_week": "",
|
"Presence_CalHead_week": "",
|
||||||
"Presence_CalHead_year": "",
|
"Presence_CalHead_year": "",
|
||||||
"Presence_CallHead_Devices": "",
|
"Presence_CallHead_Devices": "",
|
||||||
|
"Presence_Key_OnlineNow": "",
|
||||||
|
"Presence_Key_OnlineNow_desc": "",
|
||||||
|
"Presence_Key_OnlinePast": "",
|
||||||
|
"Presence_Key_OnlinePastMiss": "",
|
||||||
|
"Presence_Key_OnlinePastMiss_desc": "",
|
||||||
|
"Presence_Key_OnlinePast_desc": "",
|
||||||
"Presence_Loading": "",
|
"Presence_Loading": "",
|
||||||
"Presence_Shortcut_AllDevices": "",
|
"Presence_Shortcut_AllDevices": "",
|
||||||
"Presence_Shortcut_Archived": "",
|
"Presence_Shortcut_Archived": "",
|
||||||
@@ -556,10 +573,12 @@
|
|||||||
"RandomMAC_hover": "",
|
"RandomMAC_hover": "",
|
||||||
"Reports_Sent_Log": "",
|
"Reports_Sent_Log": "",
|
||||||
"SCAN_SUBNETS_description": "",
|
"SCAN_SUBNETS_description": "",
|
||||||
|
"SCAN_SUBNETS_name": "",
|
||||||
"SYSTEM_TITLE": "",
|
"SYSTEM_TITLE": "",
|
||||||
"Setting_Override": "",
|
"Setting_Override": "",
|
||||||
"Setting_Override_Description": "",
|
"Setting_Override_Description": "",
|
||||||
"Settings_Metadata_Toggle": "",
|
"Settings_Metadata_Toggle": "",
|
||||||
|
"Settings_Show_Description": "",
|
||||||
"Settings_device_Scanners_desync": "",
|
"Settings_device_Scanners_desync": "",
|
||||||
"Settings_device_Scanners_desync_popup": "",
|
"Settings_device_Scanners_desync_popup": "",
|
||||||
"Speedtest_Results": "",
|
"Speedtest_Results": "",
|
||||||
@@ -654,6 +673,8 @@
|
|||||||
"UI_PRESENCE_name": "",
|
"UI_PRESENCE_name": "",
|
||||||
"UI_REFRESH_description": "",
|
"UI_REFRESH_description": "",
|
||||||
"UI_REFRESH_name": "",
|
"UI_REFRESH_name": "",
|
||||||
|
"VERSION_description": "",
|
||||||
|
"VERSION_name": "",
|
||||||
"devices_old": "",
|
"devices_old": "",
|
||||||
"general_event_description": "",
|
"general_event_description": "",
|
||||||
"general_event_title": "",
|
"general_event_title": "",
|
||||||
|
|||||||
@@ -56,6 +56,8 @@
|
|||||||
"BackDevices_Restore_okay": "Восстановление выполнено успешно.",
|
"BackDevices_Restore_okay": "Восстановление выполнено успешно.",
|
||||||
"BackDevices_darkmode_disabled": "Темный режим отключен",
|
"BackDevices_darkmode_disabled": "Темный режим отключен",
|
||||||
"BackDevices_darkmode_enabled": "Темный режим включен",
|
"BackDevices_darkmode_enabled": "Темный режим включен",
|
||||||
|
"CLEAR_NEW_FLAG_description": "Если этот параметр включен (<code>0</code> отключен), устройства, помеченные как <b>Новое устройство</b>, станут неотмеченными, если лимит времени, указанный в часах, превышает время их <b>первой сессии</b>.",
|
||||||
|
"CLEAR_NEW_FLAG_name": "Удалить новый флаг",
|
||||||
"DAYS_TO_KEEP_EVENTS_description": "Это настройка обслуживания. Здесь указывается количество дней, в течение которых будут храниться записи о событиях. Все старые события будут периодически удаляться. Также применимо к истории событий плагина.",
|
"DAYS_TO_KEEP_EVENTS_description": "Это настройка обслуживания. Здесь указывается количество дней, в течение которых будут храниться записи о событиях. Все старые события будут периодически удаляться. Также применимо к истории событий плагина.",
|
||||||
"DAYS_TO_KEEP_EVENTS_name": "Удалить события старше",
|
"DAYS_TO_KEEP_EVENTS_name": "Удалить события старше",
|
||||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Скопировать данные с устройства",
|
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Скопировать данные с устройства",
|
||||||
@@ -69,7 +71,7 @@
|
|||||||
"DevDetail_EveandAl_ScanCycle": "Сканировать устройство",
|
"DevDetail_EveandAl_ScanCycle": "Сканировать устройство",
|
||||||
"DevDetail_EveandAl_ScanCycle_a": "Сканировать Устройство",
|
"DevDetail_EveandAl_ScanCycle_a": "Сканировать Устройство",
|
||||||
"DevDetail_EveandAl_ScanCycle_z": "Не сканировать устройство",
|
"DevDetail_EveandAl_ScanCycle_z": "Не сканировать устройство",
|
||||||
"DevDetail_EveandAl_Skip": "Пропустить повторные уведомления для",
|
"DevDetail_EveandAl_Skip": "Пропустить повторные уведомления",
|
||||||
"DevDetail_EveandAl_Title": "<i class=\"fa fa-bolt\"></i> Конфигурация событий и оповещений",
|
"DevDetail_EveandAl_Title": "<i class=\"fa fa-bolt\"></i> Конфигурация событий и оповещений",
|
||||||
"DevDetail_Events_CheckBox": "Скрыть события подключения",
|
"DevDetail_Events_CheckBox": "Скрыть события подключения",
|
||||||
"DevDetail_GoToNetworkNode": "Перейти на страницу Сеть данного узла.",
|
"DevDetail_GoToNetworkNode": "Перейти на страницу Сеть данного узла.",
|
||||||
@@ -114,7 +116,7 @@
|
|||||||
"DevDetail_Run_Actions_Tooltip": "Выполнить действие на текущем устройстве из раскрывающегося списка.",
|
"DevDetail_Run_Actions_Tooltip": "Выполнить действие на текущем устройстве из раскрывающегося списка.",
|
||||||
"DevDetail_SessionInfo_FirstSession": "Первый сеанс",
|
"DevDetail_SessionInfo_FirstSession": "Первый сеанс",
|
||||||
"DevDetail_SessionInfo_LastIP": "Последний IP",
|
"DevDetail_SessionInfo_LastIP": "Последний IP",
|
||||||
"DevDetail_SessionInfo_LastSession": "Последние в оффлайн",
|
"DevDetail_SessionInfo_LastSession": "Последний оффлайн",
|
||||||
"DevDetail_SessionInfo_StaticIP": "Статический IP",
|
"DevDetail_SessionInfo_StaticIP": "Статический IP",
|
||||||
"DevDetail_SessionInfo_Status": "Статус",
|
"DevDetail_SessionInfo_Status": "Статус",
|
||||||
"DevDetail_SessionInfo_Title": "<i class=\"fa fa-calendar\"></i> Информация о сеансе",
|
"DevDetail_SessionInfo_Title": "<i class=\"fa fa-calendar\"></i> Информация о сеансе",
|
||||||
@@ -194,7 +196,7 @@
|
|||||||
"Device_Shortcut_DownOnly": "Выключены",
|
"Device_Shortcut_DownOnly": "Выключены",
|
||||||
"Device_Shortcut_Favorites": "Избранные",
|
"Device_Shortcut_Favorites": "Избранные",
|
||||||
"Device_Shortcut_NewDevices": "Новые устройства",
|
"Device_Shortcut_NewDevices": "Новые устройства",
|
||||||
"Device_Shortcut_OnlineChart": "Присутствие устройства",
|
"Device_Shortcut_OnlineChart": "Присутствие устройств",
|
||||||
"Device_TableHead_Connected_Devices": "Соединения",
|
"Device_TableHead_Connected_Devices": "Соединения",
|
||||||
"Device_TableHead_Favorite": "Избранное",
|
"Device_TableHead_Favorite": "Избранное",
|
||||||
"Device_TableHead_FirstSession": "Первый сеанс",
|
"Device_TableHead_FirstSession": "Первый сеанс",
|
||||||
@@ -208,13 +210,14 @@
|
|||||||
"Device_TableHead_MAC": "Случайный MAC-адрес",
|
"Device_TableHead_MAC": "Случайный MAC-адрес",
|
||||||
"Device_TableHead_MAC_full": "Полный MAC-адрес",
|
"Device_TableHead_MAC_full": "Полный MAC-адрес",
|
||||||
"Device_TableHead_Name": "Имя",
|
"Device_TableHead_Name": "Имя",
|
||||||
"Device_TableHead_NetworkSite": "Сайт сети",
|
"Device_TableHead_NetworkSite": "Сайт устройства",
|
||||||
"Device_TableHead_Owner": "Владелец",
|
"Device_TableHead_Owner": "Владелец",
|
||||||
"Device_TableHead_Parent_MAC": "MAC род. узла",
|
"Device_TableHead_Parent_MAC": "MAC род. узла",
|
||||||
"Device_TableHead_Port": "Порт",
|
"Device_TableHead_Port": "Порт",
|
||||||
"Device_TableHead_RowID": "ID строки",
|
"Device_TableHead_RowID": "ID строки",
|
||||||
"Device_TableHead_Rowid": "ID строки",
|
"Device_TableHead_Rowid": "ID строки",
|
||||||
"Device_TableHead_SSID": "SSID",
|
"Device_TableHead_SSID": "SSID",
|
||||||
|
"Device_TableHead_SourcePlugin": "",
|
||||||
"Device_TableHead_Status": "Статус",
|
"Device_TableHead_Status": "Статус",
|
||||||
"Device_TableHead_SyncHubNodeName": "Узел синхронизации",
|
"Device_TableHead_SyncHubNodeName": "Узел синхронизации",
|
||||||
"Device_TableHead_Type": "Тип",
|
"Device_TableHead_Type": "Тип",
|
||||||
@@ -274,12 +277,15 @@
|
|||||||
"Gen_AreYouSure": "Вы уверены?",
|
"Gen_AreYouSure": "Вы уверены?",
|
||||||
"Gen_Backup": "Запустить резервное копирование",
|
"Gen_Backup": "Запустить резервное копирование",
|
||||||
"Gen_Cancel": "Отмена",
|
"Gen_Cancel": "Отмена",
|
||||||
|
"Gen_Change": "Изменить",
|
||||||
"Gen_Copy": "Запустить",
|
"Gen_Copy": "Запустить",
|
||||||
"Gen_DataUpdatedUITakesTime": "ОК - Обновление UI может занять некоторое время, если сканирование выполняется.",
|
"Gen_DataUpdatedUITakesTime": "ОК - Обновление UI может занять некоторое время, если сканирование выполняется.",
|
||||||
"Gen_Delete": "Удалить",
|
"Gen_Delete": "Удалить",
|
||||||
"Gen_DeleteAll": "Удалить все",
|
"Gen_DeleteAll": "Удалить все",
|
||||||
|
"Gen_Description": "Описание",
|
||||||
"Gen_Error": "Ошибка",
|
"Gen_Error": "Ошибка",
|
||||||
"Gen_Filter": "Фильтр",
|
"Gen_Filter": "Фильтр",
|
||||||
|
"Gen_Generate": "",
|
||||||
"Gen_LockedDB": "ОШИБКА - Возможно, база данных заблокирована. Проверьте инструменты разработчика F12 -> Консоль или повторите попытку позже.",
|
"Gen_LockedDB": "ОШИБКА - Возможно, база данных заблокирована. Проверьте инструменты разработчика F12 -> Консоль или повторите попытку позже.",
|
||||||
"Gen_Offline": "Оффлайн",
|
"Gen_Offline": "Оффлайн",
|
||||||
"Gen_Okay": "OK",
|
"Gen_Okay": "OK",
|
||||||
@@ -292,6 +298,7 @@
|
|||||||
"Gen_Save": "Сохранить",
|
"Gen_Save": "Сохранить",
|
||||||
"Gen_Saved": "Сохранено",
|
"Gen_Saved": "Сохранено",
|
||||||
"Gen_Search": "Поиск",
|
"Gen_Search": "Поиск",
|
||||||
|
"Gen_SelectToPreview": "Выберите для предварительного просмотра",
|
||||||
"Gen_Selected_Devices": "Выбранные устройства:",
|
"Gen_Selected_Devices": "Выбранные устройства:",
|
||||||
"Gen_Switch": "Переключить",
|
"Gen_Switch": "Переключить",
|
||||||
"Gen_Upd": "Успешное обновление",
|
"Gen_Upd": "Успешное обновление",
|
||||||
@@ -302,8 +309,10 @@
|
|||||||
"Gen_Work_In_Progress": "Работа продолжается, самое время оставить отзыв на https://github.com/jokob-sk/NetAlertX/issues",
|
"Gen_Work_In_Progress": "Работа продолжается, самое время оставить отзыв на https://github.com/jokob-sk/NetAlertX/issues",
|
||||||
"General_display_name": "Главное",
|
"General_display_name": "Главное",
|
||||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||||
"HRS_TO_KEEP_NEWDEV_description": "Это настройка обслуживания. Если этот параметр включен (<code>0</code> отключен), устройства, помеченные как <b>Новое устройство</b>, будут удалены, если время их <b>Первого сеанса</b> было старше указанных в этой настройке часов. Используйте этот параметр, если вы хотите автоматически удалять <b>Новые устройства</b> через <code>X</code> часов.",
|
"HRS_TO_KEEP_NEWDEV_description": "Это настройка обслуживания <b>УДАЛЕНИЕ устройств</b>. Если этот параметр включен (<code>0</code> отключен), устройства, помеченные как <b>Новое устройство</b>, будут удалены, если время их <b>Первого сеанса</b> было старше указанных в этой настройке часов. Используйте этот параметр, если вы хотите автоматически удалять <b>Новые устройства</b> через <code>X</code> часов.",
|
||||||
"HRS_TO_KEEP_NEWDEV_name": "Хранить новые устройства в течение",
|
"HRS_TO_KEEP_NEWDEV_name": "Удалить новые устройства после",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_description": "",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_name": "",
|
||||||
"HelpFAQ_Cat_Detail": "Подробности",
|
"HelpFAQ_Cat_Detail": "Подробности",
|
||||||
"HelpFAQ_Cat_Detail_300_head": "Что значит ",
|
"HelpFAQ_Cat_Detail_300_head": "Что значит ",
|
||||||
"HelpFAQ_Cat_Detail_300_text_a": "означает сетевое устройство (типа AP, шлюз, межсетевой экран, гипервизор, Powerline, коммутатор, WLAN, PLC, маршрутизатор, USB-адаптер локальной сети, USB-адаптер Wi-Fi или Интернет). Пользовательские типы можно добавить с помощью параметра <code>NETWORK_DEVICE_TYPES</code>.",
|
"HelpFAQ_Cat_Detail_300_text_a": "означает сетевое устройство (типа AP, шлюз, межсетевой экран, гипервизор, Powerline, коммутатор, WLAN, PLC, маршрутизатор, USB-адаптер локальной сети, USB-адаптер Wi-Fi или Интернет). Пользовательские типы можно добавить с помощью параметра <code>NETWORK_DEVICE_TYPES</code>.",
|
||||||
@@ -347,6 +356,7 @@
|
|||||||
"Loading": "Загрузка...",
|
"Loading": "Загрузка...",
|
||||||
"Login_Box": "Введите пароль",
|
"Login_Box": "Введите пароль",
|
||||||
"Login_Default_PWD": "Пароль по умолчанию «123456» все еще активен.",
|
"Login_Default_PWD": "Пароль по умолчанию «123456» все еще активен.",
|
||||||
|
"Login_Info": "Пароли устанавливаются через плагин Set Password. Если у вас возникли проблемы со входом в систему, проверьте <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">SEPWD документацию</a>.",
|
||||||
"Login_Psw-box": "Пароль",
|
"Login_Psw-box": "Пароль",
|
||||||
"Login_Psw_alert": "Предупреждение о пароле!",
|
"Login_Psw_alert": "Предупреждение о пароле!",
|
||||||
"Login_Psw_folder": "в папке конфигурации.",
|
"Login_Psw_folder": "в папке конфигурации.",
|
||||||
@@ -358,7 +368,7 @@
|
|||||||
"Login_Toggle_Alert_headline": "Предупреждение о пароле!",
|
"Login_Toggle_Alert_headline": "Предупреждение о пароле!",
|
||||||
"Login_Toggle_Info": "Информация о пароле",
|
"Login_Toggle_Info": "Информация о пароле",
|
||||||
"Login_Toggle_Info_headline": "Информация о пароле",
|
"Login_Toggle_Info_headline": "Информация о пароле",
|
||||||
"Maint_PurgeLog": "Журнал очистки",
|
"Maint_PurgeLog": "Очистить журнал",
|
||||||
"Maint_RestartServer": "Перезапустить сервер",
|
"Maint_RestartServer": "Перезапустить сервер",
|
||||||
"Maint_Restart_Server_noti_text": "Вы уверены, что хотите перезапустить внутренний сервер? Это может привести к несогласованности работы приложения. Сначала создайте резервную копию настроек. <br/> <br/> Примечание: Это может занять несколько минут.",
|
"Maint_Restart_Server_noti_text": "Вы уверены, что хотите перезапустить внутренний сервер? Это может привести к несогласованности работы приложения. Сначала создайте резервную копию настроек. <br/> <br/> Примечание: Это может занять несколько минут.",
|
||||||
"Maintenance_Running_Version": "Установленная версия",
|
"Maintenance_Running_Version": "Установленная версия",
|
||||||
@@ -396,7 +406,7 @@
|
|||||||
"Maintenance_Tool_del_alldev_noti": "Удалить устройства",
|
"Maintenance_Tool_del_alldev_noti": "Удалить устройства",
|
||||||
"Maintenance_Tool_del_alldev_noti_text": "Вы уверены, что хотите удалить все устройства?",
|
"Maintenance_Tool_del_alldev_noti_text": "Вы уверены, что хотите удалить все устройства?",
|
||||||
"Maintenance_Tool_del_alldev_text": "Прежде чем использовать эту функцию, сделайте резервную копию. Удаление невозможно отменить. Все устройства будут удалены из базы данных.",
|
"Maintenance_Tool_del_alldev_text": "Прежде чем использовать эту функцию, сделайте резервную копию. Удаление невозможно отменить. Все устройства будут удалены из базы данных.",
|
||||||
"Maintenance_Tool_del_allevents": "Удалить события (Сбросить присутствие)",
|
"Maintenance_Tool_del_allevents": "Удалить события (Сброс присутствия)",
|
||||||
"Maintenance_Tool_del_allevents30": "Удалить все события старше 30 дней",
|
"Maintenance_Tool_del_allevents30": "Удалить все события старше 30 дней",
|
||||||
"Maintenance_Tool_del_allevents30_noti": "Удалить события",
|
"Maintenance_Tool_del_allevents30_noti": "Удалить события",
|
||||||
"Maintenance_Tool_del_allevents30_noti_text": "Вы уверены, что хотите удалить все события старше 30 дней? Это сбрасывает состояние присутствия всех устройств.",
|
"Maintenance_Tool_del_allevents30_noti_text": "Вы уверены, что хотите удалить все события старше 30 дней? Это сбрасывает состояние присутствия всех устройств.",
|
||||||
@@ -404,19 +414,19 @@
|
|||||||
"Maintenance_Tool_del_allevents_noti": "Удалить события",
|
"Maintenance_Tool_del_allevents_noti": "Удалить события",
|
||||||
"Maintenance_Tool_del_allevents_noti_text": "Вы уверены, что хотите удалить все события? Это сбрасывает состояние присутствия всех устройств.",
|
"Maintenance_Tool_del_allevents_noti_text": "Вы уверены, что хотите удалить все события? Это сбрасывает состояние присутствия всех устройств.",
|
||||||
"Maintenance_Tool_del_allevents_text": "Прежде чем использовать эту функцию, сделайте резервную копию. Удаление невозможно отменить. Все события в базе данных будут удалены. В этот момент присутствие всех устройств будет сброшено. Это может привести к недействительным сеансам. Это означает, что устройства отображаются как «присутствующие», хотя они находятся в автономном режиме. Сканирование, когда рассматриваемое устройство находится в сети, решает проблему.",
|
"Maintenance_Tool_del_allevents_text": "Прежде чем использовать эту функцию, сделайте резервную копию. Удаление невозможно отменить. Все события в базе данных будут удалены. В этот момент присутствие всех устройств будет сброшено. Это может привести к недействительным сеансам. Это означает, что устройства отображаются как «присутствующие», хотя они находятся в автономном режиме. Сканирование, когда рассматриваемое устройство находится в сети, решает проблему.",
|
||||||
"Maintenance_Tool_del_empty_macs": "Удалить устройства с пустыми MAC-адресами",
|
"Maintenance_Tool_del_empty_macs": "Удалить устройства с пустыми MAC",
|
||||||
"Maintenance_Tool_del_empty_macs_noti": "Удалить устройства",
|
"Maintenance_Tool_del_empty_macs_noti": "Удалить устройства",
|
||||||
"Maintenance_Tool_del_empty_macs_noti_text": "Вы уверены, что хотите удалить все устройства с пустыми MAC-адресами?<br>(возможно, вы предпочитаете заархивировать их)",
|
"Maintenance_Tool_del_empty_macs_noti_text": "Вы уверены, что хотите удалить все устройства с пустыми MAC-адресами?<br>(возможно, вы предпочитаете заархивировать их)",
|
||||||
"Maintenance_Tool_del_empty_macs_text": "Прежде чем использовать эту функцию, сделайте резервную копию. Удаление невозможно отменить. Все устройства без MAC-адресов будут удалены из базы данных.",
|
"Maintenance_Tool_del_empty_macs_text": "Прежде чем использовать эту функцию, сделайте резервную копию. Удаление невозможно отменить. Все устройства без MAC-адресов будут удалены из базы данных.",
|
||||||
"Maintenance_Tool_del_selecteddev": "Удалить выбранные устройства",
|
"Maintenance_Tool_del_selecteddev": "Удалить выбранные устройства",
|
||||||
"Maintenance_Tool_del_selecteddev_text": "Прежде чем использовать эту функцию, сделайте резервную копию. Удаление невозможно отменить. Выбранные устройства будут удалены из базы данных.",
|
"Maintenance_Tool_del_selecteddev_text": "Прежде чем использовать эту функцию, сделайте резервную копию. Удаление невозможно отменить. Выбранные устройства будут удалены из базы данных.",
|
||||||
"Maintenance_Tool_del_unknowndev": "Удалить (неизвестные) устройства",
|
"Maintenance_Tool_del_unknowndev": "Удалить неизвестные устройства",
|
||||||
"Maintenance_Tool_del_unknowndev_noti": "Удалить (неизвестные) устройства",
|
"Maintenance_Tool_del_unknowndev_noti": "Удалить (неизвестные) устройства",
|
||||||
"Maintenance_Tool_del_unknowndev_noti_text": "Вы уверены, что хотите удалить все (неизвестные) и (имя не найдено) устройства?",
|
"Maintenance_Tool_del_unknowndev_noti_text": "Вы уверены, что хотите удалить все (неизвестные) и (имя не найдено) устройства?",
|
||||||
"Maintenance_Tool_del_unknowndev_text": "Прежде чем использовать эту функцию, сделайте резервную копию. Удаление невозможно отменить. Все названные устройства (неизвестные) будут удалены из базы данных.",
|
"Maintenance_Tool_del_unknowndev_text": "Прежде чем использовать эту функцию, сделайте резервную копию. Удаление невозможно отменить. Все названные устройства (неизвестные) будут удалены из базы данных.",
|
||||||
"Maintenance_Tool_displayed_columns_text": "Измените видимость и порядок столбцов на странице <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Устройства</b></a>.",
|
"Maintenance_Tool_displayed_columns_text": "Измените видимость и порядок столбцов на странице <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Устройства</b></a>.",
|
||||||
"Maintenance_Tool_drag_me": "Перетащите элемент, чтобы изменить порядок столбцов.",
|
"Maintenance_Tool_drag_me": "Перетащите элемент, чтобы изменить порядок столбцов.",
|
||||||
"Maintenance_Tool_order_columns_text": "",
|
"Maintenance_Tool_order_columns_text": "Maintenance_Tool_order_columns_text",
|
||||||
"Maintenance_Tool_purgebackup": "Очистить резервные копии",
|
"Maintenance_Tool_purgebackup": "Очистить резервные копии",
|
||||||
"Maintenance_Tool_purgebackup_noti": "Очистить резервные копии",
|
"Maintenance_Tool_purgebackup_noti": "Очистить резервные копии",
|
||||||
"Maintenance_Tool_purgebackup_noti_text": "Вы уверены, что хотите удалить все резервные копии, кроме трех последних?",
|
"Maintenance_Tool_purgebackup_noti_text": "Вы уверены, что хотите удалить все резервные копии, кроме трех последних?",
|
||||||
@@ -469,7 +479,7 @@
|
|||||||
"Navigation_Notifications": "Уведомления",
|
"Navigation_Notifications": "Уведомления",
|
||||||
"Navigation_Plugins": "Плагины",
|
"Navigation_Plugins": "Плагины",
|
||||||
"Navigation_Presence": "Присутствие",
|
"Navigation_Presence": "Присутствие",
|
||||||
"Navigation_Report": "Отправить отчеты",
|
"Navigation_Report": "Отчеты",
|
||||||
"Navigation_Settings": "Настройки",
|
"Navigation_Settings": "Настройки",
|
||||||
"Navigation_SystemInfo": "О системе",
|
"Navigation_SystemInfo": "О системе",
|
||||||
"Navigation_Workflows": "Рабочие процессы",
|
"Navigation_Workflows": "Рабочие процессы",
|
||||||
@@ -527,6 +537,7 @@
|
|||||||
"Plugins_DeleteAll": "Удалить все (фильтры игнорируются)",
|
"Plugins_DeleteAll": "Удалить все (фильтры игнорируются)",
|
||||||
"Plugins_Filters_Mac": "Фильтр MAC-адреса",
|
"Plugins_Filters_Mac": "Фильтр MAC-адреса",
|
||||||
"Plugins_History": "История событий",
|
"Plugins_History": "История событий",
|
||||||
|
"Plugins_Obj_DeleteListed": "Удалить перечисленные объекты",
|
||||||
"Plugins_Objects": "Объекты плагина",
|
"Plugins_Objects": "Объекты плагина",
|
||||||
"Plugins_Out_of": "из",
|
"Plugins_Out_of": "из",
|
||||||
"Plugins_Unprocessed_Events": "Необработанные события",
|
"Plugins_Unprocessed_Events": "Необработанные события",
|
||||||
@@ -538,6 +549,12 @@
|
|||||||
"Presence_CalHead_week": "неделя",
|
"Presence_CalHead_week": "неделя",
|
||||||
"Presence_CalHead_year": "год",
|
"Presence_CalHead_year": "год",
|
||||||
"Presence_CallHead_Devices": "Устройства",
|
"Presence_CallHead_Devices": "Устройства",
|
||||||
|
"Presence_Key_OnlineNow": "",
|
||||||
|
"Presence_Key_OnlineNow_desc": "",
|
||||||
|
"Presence_Key_OnlinePast": "",
|
||||||
|
"Presence_Key_OnlinePastMiss": "",
|
||||||
|
"Presence_Key_OnlinePastMiss_desc": "",
|
||||||
|
"Presence_Key_OnlinePast_desc": "",
|
||||||
"Presence_Loading": "Загрузка...",
|
"Presence_Loading": "Загрузка...",
|
||||||
"Presence_Shortcut_AllDevices": "Мои устройства",
|
"Presence_Shortcut_AllDevices": "Мои устройства",
|
||||||
"Presence_Shortcut_Archived": "Архив",
|
"Presence_Shortcut_Archived": "Архив",
|
||||||
@@ -554,12 +571,14 @@
|
|||||||
"REPORT_MAIL_name": "Включить эл. почту",
|
"REPORT_MAIL_name": "Включить эл. почту",
|
||||||
"REPORT_TITLE": "Отчет",
|
"REPORT_TITLE": "Отчет",
|
||||||
"RandomMAC_hover": "Автоматически обнаружено — указывает, рандомизирует ли устройство свой MAC-адрес.",
|
"RandomMAC_hover": "Автоматически обнаружено — указывает, рандомизирует ли устройство свой MAC-адрес.",
|
||||||
"Reports_Sent_Log": "Отправить журнал логов",
|
"Reports_Sent_Log": "Отправленные уведомления",
|
||||||
"SCAN_SUBNETS_description": "Большинство сетевых сканеров (ARP-SCAN, NMAP, NSLOOKUP, DIG, PHOLUS) полагаются на сканирование определенных сетевых интерфейсов и подсетей. Дополнительную информацию по этому параметру можно найти в <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">документации по подсетям</a>, особенно VLAN, какие VLAN поддерживаются или как разобраться в маске сети и своем интерфейсе. <br/> <br/> Альтернативой сетевым сканерам является включение некоторых других сканеров/импортеров устройств, которые не полагаются на NetAlert<sup>X</sup>, имеющий доступ к сети (UNIFI, dhcp.leases , PiHole и др.). <br/> <br/> Примечание. Само время сканирования зависит от количества проверяемых IP-адресов, поэтому тщательно настройте его, указав соответствующую маску сети и интерфейс.",
|
"SCAN_SUBNETS_description": "Большинство сетевых сканеров (ARP-SCAN, NMAP, NSLOOKUP, DIG, PHOLUS) полагаются на сканирование определенных сетевых интерфейсов и подсетей. Дополнительную информацию по этому параметру можно найти в <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">документации по подсетям</a>, особенно VLAN, какие VLAN поддерживаются или как разобраться в маске сети и своем интерфейсе. <br/> <br/> Альтернативой сетевым сканерам является включение некоторых других сканеров/импортеров устройств, которые не полагаются на NetAlert<sup>X</sup>, имеющий доступ к сети (UNIFI, dhcp.leases , PiHole и др.). <br/> <br/> Примечание. Само время сканирования зависит от количества проверяемых IP-адресов, поэтому тщательно настройте его, указав соответствующую маску сети и интерфейс.",
|
||||||
|
"SCAN_SUBNETS_name": "Сети для сканирования",
|
||||||
"SYSTEM_TITLE": "Системная информация",
|
"SYSTEM_TITLE": "Системная информация",
|
||||||
"Setting_Override": "Переопределить значение",
|
"Setting_Override": "Переопределить значение",
|
||||||
"Setting_Override_Description": "Включение этой опции приведет к переопределению значения по умолчанию, предоставленного приложением, на значение, указанное выше.",
|
"Setting_Override_Description": "Включение этой опции приведет к переопределению значения по умолчанию, предоставленного приложением, на значение, указанное выше.",
|
||||||
"Settings_Metadata_Toggle": "Показать/скрыть метаданные для данного параметра.",
|
"Settings_Metadata_Toggle": "Показать/скрыть метаданные для данного параметра.",
|
||||||
|
"Settings_Show_Description": "Показать описание настройки.",
|
||||||
"Settings_device_Scanners_desync": "⚠ Расписания сканера устройств не синхронизированы.",
|
"Settings_device_Scanners_desync": "⚠ Расписания сканера устройств не синхронизированы.",
|
||||||
"Settings_device_Scanners_desync_popup": "Расписания сканеров устройств (<code>*_RUN_SCHD</code>) не совпадают. Это приведет к несогласованным онлайн/оффлайн уведомлениям устройства. Если это не предусмотрено, используйте одно и то же расписание для всех включенных <b>🔍Сканеров устройств</b>.",
|
"Settings_device_Scanners_desync_popup": "Расписания сканеров устройств (<code>*_RUN_SCHD</code>) не совпадают. Это приведет к несогласованным онлайн/оффлайн уведомлениям устройства. Если это не предусмотрено, используйте одно и то же расписание для всех включенных <b>🔍Сканеров устройств</b>.",
|
||||||
"Speedtest_Results": "Результаты теста скорости",
|
"Speedtest_Results": "Результаты теста скорости",
|
||||||
@@ -646,18 +665,20 @@
|
|||||||
"UI_ICONS_name": "Предопределенные значки",
|
"UI_ICONS_name": "Предопределенные значки",
|
||||||
"UI_LANG_description": "Выберите предпочтительный язык пользовательского интерфейса. Помогите перевести или предложите языки на онлайн-портале <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
|
"UI_LANG_description": "Выберите предпочтительный язык пользовательского интерфейса. Помогите перевести или предложите языки на онлайн-портале <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
|
||||||
"UI_LANG_name": "Язык интерфейса",
|
"UI_LANG_name": "Язык интерфейса",
|
||||||
"UI_MY_DEVICES_description": "Устройства, статусы которых должны отображаться в <b>Мои устройства</b> по умолчанию. (<code>CTRL + Click</code>, чтобы выбрать/отменить выбор)",
|
"UI_MY_DEVICES_description": "Устройства, статусы которых должны отображаться в стандартном представлении <b>Мои устройства</b>.",
|
||||||
"UI_MY_DEVICES_name": "Показать в «Мои устройства»",
|
"UI_MY_DEVICES_name": "Показать в «Мои устройства»",
|
||||||
"UI_NOT_RANDOM_MAC_description": "Префиксы Mac, которые не следует помечать как случайные устройства. Введите, например, <code>52</code>, чтобы исключить устройства, начинающиеся с <code>52:xx:xx:xx:xx:xx</code>, из метки как устройства со случайным MAC-адресом.",
|
"UI_NOT_RANDOM_MAC_description": "Префиксы Mac, которые не следует помечать как случайные устройства. Введите, например, <code>52</code>, чтобы исключить устройства, начинающиеся с <code>52:xx:xx:xx:xx:xx</code>, из метки как устройства со случайным MAC-адресом.",
|
||||||
"UI_NOT_RANDOM_MAC_name": "Не отмечать как случайные",
|
"UI_NOT_RANDOM_MAC_name": "Не отмечать как случайные",
|
||||||
"UI_PRESENCE_description": "Выберите, какие статусы должны отображаться на диаграмме <b>Присутствие устройства</b> · · на странице <a href=\"/devices.php\" target=\"_blank\">Устройства</a>. (<code>CTRL + Click</code>, чтобы выбрать/отменить выбор)",
|
"UI_PRESENCE_description": "Выберите, какие статусы должны отображаться в диаграмме <b>Присутствие устройств</b>- на странице <a href=\"/devices.php\" target=\"_blank\">Устройства</a>.",
|
||||||
"UI_PRESENCE_name": "Показать в диаграмме присутствия",
|
"UI_PRESENCE_name": "Показать в диаграмме присутствия",
|
||||||
"UI_REFRESH_description": "Введите количество секунд, по истечении которых пользовательский интерфейс перезагружается. Установите значение <code>0</code>, чтобы отключить.",
|
"UI_REFRESH_description": "Введите количество секунд, по истечении которых пользовательский интерфейс перезагружается. Установите значение <code>0</code>, чтобы отключить.",
|
||||||
"UI_REFRESH_name": "Автоматическое обновление интерфейса",
|
"UI_REFRESH_name": "Автоматическое обновление интерфейса",
|
||||||
|
"VERSION_description": "Вспомогательное значение версии или метки времени, позволяющее проверить, было ли приложение обновлено.",
|
||||||
|
"VERSION_name": "Версия или временная метка",
|
||||||
"devices_old": "Актуализируется...",
|
"devices_old": "Актуализируется...",
|
||||||
"general_event_description": "Событие, которое вы инициировали, может занять некоторое время, прежде чем фоновые процессы завершатся. Выполнение завершится, как только очередь выполнения, указанная ниже, опустеет (Проверьте <a href='/maintenance.php#tab_Logging'>журнал ошибок</a> при возникновении проблем). <br/> <br/>· · Очередь выполнения:",
|
"general_event_description": "Событие, которое вы инициировали, может занять некоторое время, прежде чем фоновые процессы завершатся. Выполнение завершится, как только очередь выполнения, указанная ниже, опустеет (Проверьте <a href='/maintenance.php#tab_Logging'>журнал ошибок</a> при возникновении проблем). <br/> <br/>· · Очередь выполнения:",
|
||||||
"general_event_title": "Выполнение специального события",
|
"general_event_title": "Выполнение специального события",
|
||||||
"report_guid": "Руководство по уведомлениям:",
|
"report_guid": "Идентификатор уведомления:",
|
||||||
"report_guid_missing": "Связанное уведомление не найдено. Между недавно отправленными уведомлениями и их доступностью существует небольшая задержка. Обновите страницу и кэшируйте ее через несколько секунд. Также возможно, что выбранное уведомление было удалено во время обслуживания, как указано в настройке <code>DBCLNP_NOTIFI_HIST</code>. <br/> <br/>Вместо этого отображается последнее уведомление. Отсутствующее уведомление имеет следующий GUID:",
|
"report_guid_missing": "Связанное уведомление не найдено. Между недавно отправленными уведомлениями и их доступностью существует небольшая задержка. Обновите страницу и кэшируйте ее через несколько секунд. Также возможно, что выбранное уведомление было удалено во время обслуживания, как указано в настройке <code>DBCLNP_NOTIFI_HIST</code>. <br/> <br/>Вместо этого отображается последнее уведомление. Отсутствующее уведомление имеет следующий GUID:",
|
||||||
"report_select_format": "Выбрать формат:",
|
"report_select_format": "Выбрать формат:",
|
||||||
"report_time": "Время уведомления:",
|
"report_time": "Время уведомления:",
|
||||||
|
|||||||
@@ -56,6 +56,8 @@
|
|||||||
"BackDevices_Restore_okay": "",
|
"BackDevices_Restore_okay": "",
|
||||||
"BackDevices_darkmode_disabled": "",
|
"BackDevices_darkmode_disabled": "",
|
||||||
"BackDevices_darkmode_enabled": "",
|
"BackDevices_darkmode_enabled": "",
|
||||||
|
"CLEAR_NEW_FLAG_description": "",
|
||||||
|
"CLEAR_NEW_FLAG_name": "",
|
||||||
"DAYS_TO_KEEP_EVENTS_description": "",
|
"DAYS_TO_KEEP_EVENTS_description": "",
|
||||||
"DAYS_TO_KEEP_EVENTS_name": "",
|
"DAYS_TO_KEEP_EVENTS_name": "",
|
||||||
"DevDetail_Copy_Device_Title": "",
|
"DevDetail_Copy_Device_Title": "",
|
||||||
@@ -215,6 +217,7 @@
|
|||||||
"Device_TableHead_RowID": "",
|
"Device_TableHead_RowID": "",
|
||||||
"Device_TableHead_Rowid": "",
|
"Device_TableHead_Rowid": "",
|
||||||
"Device_TableHead_SSID": "",
|
"Device_TableHead_SSID": "",
|
||||||
|
"Device_TableHead_SourcePlugin": "",
|
||||||
"Device_TableHead_Status": "Durum",
|
"Device_TableHead_Status": "Durum",
|
||||||
"Device_TableHead_SyncHubNodeName": "",
|
"Device_TableHead_SyncHubNodeName": "",
|
||||||
"Device_TableHead_Type": "",
|
"Device_TableHead_Type": "",
|
||||||
@@ -274,12 +277,15 @@
|
|||||||
"Gen_AreYouSure": "Emin misiniz?",
|
"Gen_AreYouSure": "Emin misiniz?",
|
||||||
"Gen_Backup": "",
|
"Gen_Backup": "",
|
||||||
"Gen_Cancel": "İptal",
|
"Gen_Cancel": "İptal",
|
||||||
|
"Gen_Change": "",
|
||||||
"Gen_Copy": "Çalıştır",
|
"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_Delete": "Sil",
|
||||||
"Gen_DeleteAll": "Tümünü sil",
|
"Gen_DeleteAll": "Tümünü sil",
|
||||||
|
"Gen_Description": "",
|
||||||
"Gen_Error": "Hata",
|
"Gen_Error": "Hata",
|
||||||
"Gen_Filter": "Filtre",
|
"Gen_Filter": "Filtre",
|
||||||
|
"Gen_Generate": "",
|
||||||
"Gen_LockedDB": "",
|
"Gen_LockedDB": "",
|
||||||
"Gen_Offline": "Çevrimdışı",
|
"Gen_Offline": "Çevrimdışı",
|
||||||
"Gen_Okay": "Tamam",
|
"Gen_Okay": "Tamam",
|
||||||
@@ -292,6 +298,7 @@
|
|||||||
"Gen_Save": "Kaydet",
|
"Gen_Save": "Kaydet",
|
||||||
"Gen_Saved": "Kaydedildi",
|
"Gen_Saved": "Kaydedildi",
|
||||||
"Gen_Search": "",
|
"Gen_Search": "",
|
||||||
|
"Gen_SelectToPreview": "",
|
||||||
"Gen_Selected_Devices": "Seçilmiş Cihazlar:",
|
"Gen_Selected_Devices": "Seçilmiş Cihazlar:",
|
||||||
"Gen_Switch": "",
|
"Gen_Switch": "",
|
||||||
"Gen_Upd": "Başarılı bir şekilde güncellendi",
|
"Gen_Upd": "Başarılı bir şekilde güncellendi",
|
||||||
@@ -304,6 +311,8 @@
|
|||||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||||
"HRS_TO_KEEP_NEWDEV_description": "",
|
"HRS_TO_KEEP_NEWDEV_description": "",
|
||||||
"HRS_TO_KEEP_NEWDEV_name": "",
|
"HRS_TO_KEEP_NEWDEV_name": "",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_description": "",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_name": "",
|
||||||
"HelpFAQ_Cat_Detail": "Detaylar",
|
"HelpFAQ_Cat_Detail": "Detaylar",
|
||||||
"HelpFAQ_Cat_Detail_300_head": "",
|
"HelpFAQ_Cat_Detail_300_head": "",
|
||||||
"HelpFAQ_Cat_Detail_300_text_a": "",
|
"HelpFAQ_Cat_Detail_300_text_a": "",
|
||||||
@@ -347,6 +356,7 @@
|
|||||||
"Loading": "Yükleniyor...",
|
"Loading": "Yükleniyor...",
|
||||||
"Login_Box": "Şifrenizi giriniz",
|
"Login_Box": "Şifrenizi giriniz",
|
||||||
"Login_Default_PWD": "Varsayılan şifre \"123456\" hâlâ aktif.",
|
"Login_Default_PWD": "Varsayılan şifre \"123456\" hâlâ aktif.",
|
||||||
|
"Login_Info": "",
|
||||||
"Login_Psw-box": "Şİfre",
|
"Login_Psw-box": "Şİfre",
|
||||||
"Login_Psw_alert": "",
|
"Login_Psw_alert": "",
|
||||||
"Login_Psw_folder": "",
|
"Login_Psw_folder": "",
|
||||||
@@ -527,6 +537,7 @@
|
|||||||
"Plugins_DeleteAll": "",
|
"Plugins_DeleteAll": "",
|
||||||
"Plugins_Filters_Mac": "",
|
"Plugins_Filters_Mac": "",
|
||||||
"Plugins_History": "",
|
"Plugins_History": "",
|
||||||
|
"Plugins_Obj_DeleteListed": "",
|
||||||
"Plugins_Objects": "",
|
"Plugins_Objects": "",
|
||||||
"Plugins_Out_of": "",
|
"Plugins_Out_of": "",
|
||||||
"Plugins_Unprocessed_Events": "",
|
"Plugins_Unprocessed_Events": "",
|
||||||
@@ -538,6 +549,12 @@
|
|||||||
"Presence_CalHead_week": "hafta",
|
"Presence_CalHead_week": "hafta",
|
||||||
"Presence_CalHead_year": "yıl",
|
"Presence_CalHead_year": "yıl",
|
||||||
"Presence_CallHead_Devices": "Cihazlar",
|
"Presence_CallHead_Devices": "Cihazlar",
|
||||||
|
"Presence_Key_OnlineNow": "",
|
||||||
|
"Presence_Key_OnlineNow_desc": "",
|
||||||
|
"Presence_Key_OnlinePast": "",
|
||||||
|
"Presence_Key_OnlinePastMiss": "",
|
||||||
|
"Presence_Key_OnlinePastMiss_desc": "",
|
||||||
|
"Presence_Key_OnlinePast_desc": "",
|
||||||
"Presence_Loading": "Yükleniyor...",
|
"Presence_Loading": "Yükleniyor...",
|
||||||
"Presence_Shortcut_AllDevices": "Cihazlarım",
|
"Presence_Shortcut_AllDevices": "Cihazlarım",
|
||||||
"Presence_Shortcut_Archived": "",
|
"Presence_Shortcut_Archived": "",
|
||||||
@@ -556,10 +573,12 @@
|
|||||||
"RandomMAC_hover": "",
|
"RandomMAC_hover": "",
|
||||||
"Reports_Sent_Log": "",
|
"Reports_Sent_Log": "",
|
||||||
"SCAN_SUBNETS_description": "",
|
"SCAN_SUBNETS_description": "",
|
||||||
|
"SCAN_SUBNETS_name": "",
|
||||||
"SYSTEM_TITLE": "",
|
"SYSTEM_TITLE": "",
|
||||||
"Setting_Override": "",
|
"Setting_Override": "",
|
||||||
"Setting_Override_Description": "",
|
"Setting_Override_Description": "",
|
||||||
"Settings_Metadata_Toggle": "",
|
"Settings_Metadata_Toggle": "",
|
||||||
|
"Settings_Show_Description": "",
|
||||||
"Settings_device_Scanners_desync": "",
|
"Settings_device_Scanners_desync": "",
|
||||||
"Settings_device_Scanners_desync_popup": "",
|
"Settings_device_Scanners_desync_popup": "",
|
||||||
"Speedtest_Results": "",
|
"Speedtest_Results": "",
|
||||||
@@ -654,6 +673,8 @@
|
|||||||
"UI_PRESENCE_name": "",
|
"UI_PRESENCE_name": "",
|
||||||
"UI_REFRESH_description": "",
|
"UI_REFRESH_description": "",
|
||||||
"UI_REFRESH_name": "",
|
"UI_REFRESH_name": "",
|
||||||
|
"VERSION_description": "",
|
||||||
|
"VERSION_name": "",
|
||||||
"devices_old": "Yenileniyor...",
|
"devices_old": "Yenileniyor...",
|
||||||
"general_event_description": "",
|
"general_event_description": "",
|
||||||
"general_event_title": "",
|
"general_event_title": "",
|
||||||
|
|||||||
@@ -56,6 +56,8 @@
|
|||||||
"BackDevices_Restore_okay": "已成功恢复。",
|
"BackDevices_Restore_okay": "已成功恢复。",
|
||||||
"BackDevices_darkmode_disabled": "暗黑模式已禁用",
|
"BackDevices_darkmode_disabled": "暗黑模式已禁用",
|
||||||
"BackDevices_darkmode_enabled": "已启用暗黑模式",
|
"BackDevices_darkmode_enabled": "已启用暗黑模式",
|
||||||
|
"CLEAR_NEW_FLAG_description": "",
|
||||||
|
"CLEAR_NEW_FLAG_name": "",
|
||||||
"DAYS_TO_KEEP_EVENTS_description": "这是维护设置。它指定将保留的事件条目的天数。所有较旧的事件将被定期删除。也适用于插件事件历史记录。",
|
"DAYS_TO_KEEP_EVENTS_description": "这是维护设置。它指定将保留的事件条目的天数。所有较旧的事件将被定期删除。也适用于插件事件历史记录。",
|
||||||
"DAYS_TO_KEEP_EVENTS_name": "删除早于",
|
"DAYS_TO_KEEP_EVENTS_name": "删除早于",
|
||||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> 从设备复制详细信息",
|
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> 从设备复制详细信息",
|
||||||
@@ -215,6 +217,7 @@
|
|||||||
"Device_TableHead_RowID": "排行",
|
"Device_TableHead_RowID": "排行",
|
||||||
"Device_TableHead_Rowid": "排行",
|
"Device_TableHead_Rowid": "排行",
|
||||||
"Device_TableHead_SSID": "SSID",
|
"Device_TableHead_SSID": "SSID",
|
||||||
|
"Device_TableHead_SourcePlugin": "",
|
||||||
"Device_TableHead_Status": "状态",
|
"Device_TableHead_Status": "状态",
|
||||||
"Device_TableHead_SyncHubNodeName": "同步节点",
|
"Device_TableHead_SyncHubNodeName": "同步节点",
|
||||||
"Device_TableHead_Type": "类型",
|
"Device_TableHead_Type": "类型",
|
||||||
@@ -274,12 +277,15 @@
|
|||||||
"Gen_AreYouSure": "你确定吗?",
|
"Gen_AreYouSure": "你确定吗?",
|
||||||
"Gen_Backup": "运行备份",
|
"Gen_Backup": "运行备份",
|
||||||
"Gen_Cancel": "取消",
|
"Gen_Cancel": "取消",
|
||||||
|
"Gen_Change": "",
|
||||||
"Gen_Copy": "运行",
|
"Gen_Copy": "运行",
|
||||||
"Gen_DataUpdatedUITakesTime": "好的 - 如果扫描正在运行,UI 可能需要一段时间才能更新。",
|
"Gen_DataUpdatedUITakesTime": "好的 - 如果扫描正在运行,UI 可能需要一段时间才能更新。",
|
||||||
"Gen_Delete": "删除",
|
"Gen_Delete": "删除",
|
||||||
"Gen_DeleteAll": "全部删除",
|
"Gen_DeleteAll": "全部删除",
|
||||||
|
"Gen_Description": "",
|
||||||
"Gen_Error": "错误",
|
"Gen_Error": "错误",
|
||||||
"Gen_Filter": "筛选",
|
"Gen_Filter": "筛选",
|
||||||
|
"Gen_Generate": "",
|
||||||
"Gen_LockedDB": "错误 - DB 可能被锁定 - 检查 F12 开发工具 -> 控制台或稍后重试。",
|
"Gen_LockedDB": "错误 - DB 可能被锁定 - 检查 F12 开发工具 -> 控制台或稍后重试。",
|
||||||
"Gen_Offline": "离线",
|
"Gen_Offline": "离线",
|
||||||
"Gen_Okay": "Ok",
|
"Gen_Okay": "Ok",
|
||||||
@@ -292,6 +298,7 @@
|
|||||||
"Gen_Save": "保存",
|
"Gen_Save": "保存",
|
||||||
"Gen_Saved": "已保存",
|
"Gen_Saved": "已保存",
|
||||||
"Gen_Search": "搜索",
|
"Gen_Search": "搜索",
|
||||||
|
"Gen_SelectToPreview": "",
|
||||||
"Gen_Selected_Devices": "选定的设备:",
|
"Gen_Selected_Devices": "选定的设备:",
|
||||||
"Gen_Switch": "交换",
|
"Gen_Switch": "交换",
|
||||||
"Gen_Upd": "已成功更新",
|
"Gen_Upd": "已成功更新",
|
||||||
@@ -304,6 +311,8 @@
|
|||||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||||
"HRS_TO_KEEP_NEWDEV_description": "这是一项维护设置。如果启用(<code>0</code> 为禁用),则标记为<b>新设备</b>的设备(如果其<b>首次会话</b>时间早于此设置中指定的小时数)将被删除。如果您想在 <code>X</code> 小时后自动删除<b>新设备</b>,请使用此设置。",
|
"HRS_TO_KEEP_NEWDEV_description": "这是一项维护设置。如果启用(<code>0</code> 为禁用),则标记为<b>新设备</b>的设备(如果其<b>首次会话</b>时间早于此设置中指定的小时数)将被删除。如果您想在 <code>X</code> 小时后自动删除<b>新设备</b>,请使用此设置。",
|
||||||
"HRS_TO_KEEP_NEWDEV_name": "保留新设备",
|
"HRS_TO_KEEP_NEWDEV_name": "保留新设备",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_description": "",
|
||||||
|
"HRS_TO_KEEP_OFFDEV_name": "",
|
||||||
"HelpFAQ_Cat_Detail": "详细",
|
"HelpFAQ_Cat_Detail": "详细",
|
||||||
"HelpFAQ_Cat_Detail_300_head": "含义 ",
|
"HelpFAQ_Cat_Detail_300_head": "含义 ",
|
||||||
"HelpFAQ_Cat_Detail_300_text_a": "表示网络设备(AP、网关、防火墙、虚拟机管理程序、电力线、交换机、WLAN、PLC、路由器、USB LAN 适配器、USB WIFI 适配器或 Internet 类型的设备)。可以通过 <code>NETWORK_DEVICE_TYPES</code> 设置添加自定义类型。",
|
"HelpFAQ_Cat_Detail_300_text_a": "表示网络设备(AP、网关、防火墙、虚拟机管理程序、电力线、交换机、WLAN、PLC、路由器、USB LAN 适配器、USB WIFI 适配器或 Internet 类型的设备)。可以通过 <code>NETWORK_DEVICE_TYPES</code> 设置添加自定义类型。",
|
||||||
@@ -347,6 +356,7 @@
|
|||||||
"Loading": "加载中...",
|
"Loading": "加载中...",
|
||||||
"Login_Box": "输入密码",
|
"Login_Box": "输入密码",
|
||||||
"Login_Default_PWD": "默认密码“123456”仍然有效。",
|
"Login_Default_PWD": "默认密码“123456”仍然有效。",
|
||||||
|
"Login_Info": "",
|
||||||
"Login_Psw-box": "密码",
|
"Login_Psw-box": "密码",
|
||||||
"Login_Psw_alert": "密码警报!",
|
"Login_Psw_alert": "密码警报!",
|
||||||
"Login_Psw_folder": "在配置文件夹中。",
|
"Login_Psw_folder": "在配置文件夹中。",
|
||||||
@@ -527,6 +537,7 @@
|
|||||||
"Plugins_DeleteAll": "全部删除(忽略过滤器)",
|
"Plugins_DeleteAll": "全部删除(忽略过滤器)",
|
||||||
"Plugins_Filters_Mac": "Mac 过滤器",
|
"Plugins_Filters_Mac": "Mac 过滤器",
|
||||||
"Plugins_History": "事件历史",
|
"Plugins_History": "事件历史",
|
||||||
|
"Plugins_Obj_DeleteListed": "",
|
||||||
"Plugins_Objects": "插件对象",
|
"Plugins_Objects": "插件对象",
|
||||||
"Plugins_Out_of": "",
|
"Plugins_Out_of": "",
|
||||||
"Plugins_Unprocessed_Events": "未处理的事件",
|
"Plugins_Unprocessed_Events": "未处理的事件",
|
||||||
@@ -538,6 +549,12 @@
|
|||||||
"Presence_CalHead_week": "星期",
|
"Presence_CalHead_week": "星期",
|
||||||
"Presence_CalHead_year": "年",
|
"Presence_CalHead_year": "年",
|
||||||
"Presence_CallHead_Devices": "设备",
|
"Presence_CallHead_Devices": "设备",
|
||||||
|
"Presence_Key_OnlineNow": "",
|
||||||
|
"Presence_Key_OnlineNow_desc": "",
|
||||||
|
"Presence_Key_OnlinePast": "",
|
||||||
|
"Presence_Key_OnlinePastMiss": "",
|
||||||
|
"Presence_Key_OnlinePastMiss_desc": "",
|
||||||
|
"Presence_Key_OnlinePast_desc": "",
|
||||||
"Presence_Loading": "加载中...",
|
"Presence_Loading": "加载中...",
|
||||||
"Presence_Shortcut_AllDevices": "我的设备",
|
"Presence_Shortcut_AllDevices": "我的设备",
|
||||||
"Presence_Shortcut_Archived": "已归档",
|
"Presence_Shortcut_Archived": "已归档",
|
||||||
@@ -556,10 +573,12 @@
|
|||||||
"RandomMAC_hover": "自动检测 - 表示设备是否随机化其 MAC 地址。",
|
"RandomMAC_hover": "自动检测 - 表示设备是否随机化其 MAC 地址。",
|
||||||
"Reports_Sent_Log": "已发送报告日志",
|
"Reports_Sent_Log": "已发送报告日志",
|
||||||
"SCAN_SUBNETS_description": "大多数网络扫描器(ARP-SCAN、NMAP、NSLOOKUP、DIG、PHOLUS)依赖于扫描特定的网络接口和子网。查看<a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">子网文档</a>以获取有关此设置的帮助,尤其是 VLAN、支持哪些 VLAN,或者如何确定网络掩码和接口。<br/> <br/> 网络扫描器的替代方法是启用一些其他不依赖于 NetAlert<sup>X</sup> 访问网络的设备扫描器/导入器(UNIFI、dhcp.leases、PiHole 等)。<br/> <br/> 注意:扫描时间本身取决于要检查的 IP 地址数量,因此请使用适当的网络掩码和接口仔细设置。",
|
"SCAN_SUBNETS_description": "大多数网络扫描器(ARP-SCAN、NMAP、NSLOOKUP、DIG、PHOLUS)依赖于扫描特定的网络接口和子网。查看<a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">子网文档</a>以获取有关此设置的帮助,尤其是 VLAN、支持哪些 VLAN,或者如何确定网络掩码和接口。<br/> <br/> 网络扫描器的替代方法是启用一些其他不依赖于 NetAlert<sup>X</sup> 访问网络的设备扫描器/导入器(UNIFI、dhcp.leases、PiHole 等)。<br/> <br/> 注意:扫描时间本身取决于要检查的 IP 地址数量,因此请使用适当的网络掩码和接口仔细设置。",
|
||||||
|
"SCAN_SUBNETS_name": "",
|
||||||
"SYSTEM_TITLE": "系统信息",
|
"SYSTEM_TITLE": "系统信息",
|
||||||
"Setting_Override": "覆盖值",
|
"Setting_Override": "覆盖值",
|
||||||
"Setting_Override_Description": "启用此选项将用上面指定的值覆盖应用程序提供的默认值。",
|
"Setting_Override_Description": "启用此选项将用上面指定的值覆盖应用程序提供的默认值。",
|
||||||
"Settings_Metadata_Toggle": "显示/隐藏给定设置的元数据。",
|
"Settings_Metadata_Toggle": "显示/隐藏给定设置的元数据。",
|
||||||
|
"Settings_Show_Description": "",
|
||||||
"Settings_device_Scanners_desync": "⚠ 设备扫描计划不同步。",
|
"Settings_device_Scanners_desync": "⚠ 设备扫描计划不同步。",
|
||||||
"Settings_device_Scanners_desync_popup": "设备扫描 (<code>*_RUN_SCHD</code>) 的时间表并不相同。这将导致设备在线/离线通知不一致。除非有意为之,否则请对所有启用的 <b>🔍设备扫描</b> 使用相同的时间表。",
|
"Settings_device_Scanners_desync_popup": "设备扫描 (<code>*_RUN_SCHD</code>) 的时间表并不相同。这将导致设备在线/离线通知不一致。除非有意为之,否则请对所有启用的 <b>🔍设备扫描</b> 使用相同的时间表。",
|
||||||
"Speedtest_Results": "Speedtest 结果",
|
"Speedtest_Results": "Speedtest 结果",
|
||||||
@@ -654,6 +673,8 @@
|
|||||||
"UI_PRESENCE_name": "在存在图表中显示",
|
"UI_PRESENCE_name": "在存在图表中显示",
|
||||||
"UI_REFRESH_description": "输入界面重新加载的秒数。设置为 <code>0</code> 可禁用。",
|
"UI_REFRESH_description": "输入界面重新加载的秒数。设置为 <code>0</code> 可禁用。",
|
||||||
"UI_REFRESH_name": "自动刷新界面",
|
"UI_REFRESH_name": "自动刷新界面",
|
||||||
|
"VERSION_description": "",
|
||||||
|
"VERSION_name": "",
|
||||||
"devices_old": "刷新中...",
|
"devices_old": "刷新中...",
|
||||||
"general_event_description": "您触发的事件可能需要一段时间才能完成后台进程。一旦以下执行队列清空,执行就会结束(如果遇到问题,请检查<a href='/maintenance.php#tab_Logging'>错误日志</a>)。<br/> <br/> 执行队列:",
|
"general_event_description": "您触发的事件可能需要一段时间才能完成后台进程。一旦以下执行队列清空,执行就会结束(如果遇到问题,请检查<a href='/maintenance.php#tab_Logging'>错误日志</a>)。<br/> <br/> 执行队列:",
|
||||||
"general_event_title": "执行自组织网络事件",
|
"general_event_title": "执行自组织网络事件",
|
||||||
|
|||||||
@@ -1,4 +1,10 @@
|
|||||||
<?php require 'php/templates/notification.php'; ?>
|
<?php
|
||||||
|
|
||||||
|
require 'php/templates/notification.php';
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
?>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
|
|||||||
@@ -1,67 +1,83 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
$url = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
|
// Constants
|
||||||
$isLogonPage = FALSE;
|
define('CONFIG_PATH', $_SERVER['DOCUMENT_ROOT'] . "/../config/app.conf");
|
||||||
|
define('COOKIE_SAVE_LOGIN_NAME', "NetAlertX_SaveLogin");
|
||||||
|
|
||||||
$CookieSaveLoginName = "NetAlertX_SaveLogin";
|
// Utility Functions
|
||||||
|
function getConfigLine($pattern, $config_lines) {
|
||||||
|
$matches = preg_grep($pattern, $config_lines);
|
||||||
if (strpos($url,'index.php') !== false) {
|
return !empty($matches) ? explode("=", array_values($matches)[0]) : null;
|
||||||
$isLogonPage = TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
session_start();
|
function getConfigValue($pattern, $config_lines, $delimiter = "'") {
|
||||||
|
$line = preg_grep($pattern, $config_lines);
|
||||||
|
return !empty($line) ? explode($delimiter, array_values($line)[0])[1] : '';
|
||||||
|
}
|
||||||
|
|
||||||
if(array_search('action', $_REQUEST) != FALSE)
|
function redirect($url) {
|
||||||
{
|
header("Location: $url");
|
||||||
if ($_REQUEST['action'] == 'logout') {
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialization
|
||||||
|
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https://' : 'http://';
|
||||||
|
$url = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
|
||||||
|
|
||||||
|
// Parse the URL and extract the path component
|
||||||
|
// error_log("-------------");
|
||||||
|
$parsedUrl = parse_url($url, PHP_URL_PATH);
|
||||||
|
|
||||||
|
// Normalize the path: treat '/' (root) and '/index.php' as equivalent
|
||||||
|
$isLogonPage = ($parsedUrl === '/' || $parsedUrl === '/index.php');
|
||||||
|
|
||||||
|
$authHeader = apache_request_headers()['Authorization'] ?? '';
|
||||||
|
$sessionLogin = isset($_SESSION['login']) ? $_SESSION['login'] : 0;
|
||||||
|
|
||||||
|
// Start session if not already started
|
||||||
|
if (session_status() == PHP_SESSION_NONE) {
|
||||||
|
session_start();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle logout
|
||||||
|
if (!empty($_REQUEST['action']) && $_REQUEST['action'] == 'logout') {
|
||||||
session_destroy();
|
session_destroy();
|
||||||
setcookie($CookieSaveLoginName, "", time() - 3600);
|
setcookie(COOKIE_SAVE_LOGIN_NAME, "", time() - 3600);
|
||||||
header('Location: index.php');
|
redirect('index.php');
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ##################################################
|
// Load configuration
|
||||||
// ## Login Processing start
|
if (!file_exists(CONFIG_PATH)) {
|
||||||
// ##################################################
|
die("Configuration file not found.");
|
||||||
$config_file = "../config/app.conf";
|
}
|
||||||
$config_file_lines = file($config_file);
|
$configLines = file(CONFIG_PATH);
|
||||||
$CookieSaveLoginName = "NetAlertX_SaveLogin";
|
|
||||||
|
|
||||||
// ###################################
|
// Handle web protection and password
|
||||||
// ## SETPWD_enable_password FALSE
|
$nax_WebProtection = strtolower(trim(getConfigLine('/^SETPWD_enable_password.*=/', $configLines)[1] ?? 'false'));
|
||||||
// ###################################
|
$nax_Password = getConfigValue('/^SETPWD_password.*=/', $configLines);
|
||||||
|
$api_token = getConfigValue('/^SYNC_api_token.*=/', $configLines, "'");
|
||||||
|
|
||||||
$config_file_lines_bypass = array_values(preg_grep('/^SETPWD_enable_password.*=/', $config_file_lines));
|
$expectedToken = 'Bearer ' . $api_token;
|
||||||
$protection_line = explode("=", $config_file_lines_bypass[0]);
|
|
||||||
$Pia_WebProtection = strtolower(trim($protection_line[1]));
|
|
||||||
|
|
||||||
// ###################################
|
// Authentication Handling
|
||||||
// ## SETPWD_enable_password TRUE
|
if ($nax_WebProtection == 'true') {
|
||||||
// ###################################
|
if ($authHeader === $expectedToken) {
|
||||||
|
$_SESSION['login'] = 1; // User authenticated with bearer token
|
||||||
$config_file_lines = array_values(preg_grep('/^SETPWD_password.*=/', $config_file_lines));
|
} elseif (!empty($authHeader)) {
|
||||||
$password_line = explode("'", $config_file_lines[0]);
|
echo "[Security] Incorrect Bearer Token";
|
||||||
$Pia_Password = $password_line[1];
|
|
||||||
|
|
||||||
// active Session or valid cookie (cookie not extends)
|
|
||||||
if($Pia_WebProtection == 'true')
|
|
||||||
{
|
|
||||||
if(isset ($_SESSION["login"]) == FALSE )
|
|
||||||
{
|
|
||||||
$_SESSION["login"] = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ($_SESSION["login"] == 1) || $isLogonPage || (( isset($_COOKIE[$CookieSaveLoginName]) && $Pia_Password == $_COOKIE[$CookieSaveLoginName ])))
|
// Safely check if the session login exists before checking its value
|
||||||
{
|
$isLoggedIn = isset($_SESSION['login']) && $_SESSION['login'] == 1;
|
||||||
//Logged in or stay on this page if we are on the index.php already
|
|
||||||
|
|
||||||
} else
|
// Determine if the user should be redirected
|
||||||
{
|
if ($isLoggedIn || $isLogonPage || (isset($_COOKIE[COOKIE_SAVE_LOGIN_NAME]) && $nax_Password == $_COOKIE[COOKIE_SAVE_LOGIN_NAME])) {
|
||||||
// we need to redirect
|
// Logged in or stay on this page if we are on the index.php already
|
||||||
header('Location: index.php');
|
} else {
|
||||||
|
// We need to redirect
|
||||||
|
redirect('/index.php');
|
||||||
|
exit; // exit is needed to prevent authentication bypass
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
@@ -4,18 +4,15 @@
|
|||||||
// ## GUI settings processing start
|
// ## GUI settings processing start
|
||||||
// ###################################
|
// ###################################
|
||||||
|
|
||||||
if( isset($_COOKIE['Front_Dark_Mode_Enabled']))
|
if( isset($_COOKIE['UI_theme']))
|
||||||
{
|
{
|
||||||
$ENABLED_DARKMODE = $_COOKIE['Front_Dark_Mode_Enabled'] == "true";
|
$UI_THEME = $_COOKIE['UI_theme'];
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
$ENABLED_DARKMODE = False;
|
$UI_THEME = "Light";
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (glob("/app/db/setting_skin*") as $filename) {
|
$pia_skin_selected = 'skin-blue';
|
||||||
$pia_skin_selected = str_replace('setting_','',basename($filename));
|
|
||||||
}
|
|
||||||
if (isset($pia_skin_selected) == FALSE or (strlen($pia_skin_selected) == 0)) {$pia_skin_selected = 'skin-blue';}
|
|
||||||
|
|
||||||
// ###################################
|
// ###################################
|
||||||
// ## GUI settings processing end
|
// ## GUI settings processing end
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#---------------------------------------------------------------------------------#
|
#---------------------------------------------------------------------------------#
|
||||||
|
|
||||||
$filename = "/app/.VERSION";
|
$filename = "/app/.VERSION";
|
||||||
|
|
||||||
if(file_exists($filename)) {
|
if(file_exists($filename)) {
|
||||||
$fileContents = file_get_contents($filename);
|
$fileContents = file_get_contents($filename);
|
||||||
if(trim($fileContents) === 'Dev') {
|
if(trim($fileContents) === 'Dev') {
|
||||||
@@ -23,4 +24,5 @@ if(file_exists($filename)) {
|
|||||||
else {
|
else {
|
||||||
echo date('H:i:s') . " - N/A";
|
echo date('H:i:s') . " - N/A";
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
?>
|
?>
|
||||||
|
|
||||||
<!-- Page ------------------------------------------------------------------ -->
|
<!-- Page ------------------------------------------------------------------ -->
|
||||||
<div class="content-wrapper">
|
<div class="content-wrapper integrations-plugins">
|
||||||
|
|
||||||
<!-- Content header--------------------------------------------------------- -->
|
<!-- Content header--------------------------------------------------------- -->
|
||||||
<section class="content-header">
|
<section class="content-header">
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# 🔌 Plugins
|
# 🔌 Plugins
|
||||||
|
|
||||||
NetAlertX supports additional plugins to extend its functionality, each with its own settings and options. Plugins can be loaded via the General -> `LOADED_PLUGINS` setting by using Ctrl + Click. For custom plugin development, refer to the [Plugin development guide](/docs/PLUGINS_DEV.md).
|
NetAlertX supports additional plugins to extend its functionality, each with its own settings and options. Plugins can be loaded via the General -> `LOADED_PLUGINS` setting. For custom plugin development, refer to the [Plugin development guide](/docs/PLUGINS_DEV.md).
|
||||||
|
|
||||||
>[!NOTE]
|
>[!NOTE]
|
||||||
> Please check this [Plugins debugging guide](https://github.com/jokob-sk/NetAlertX/blob/main/docs/DEBUG_PLUGINS.md) and the corresponding Plugin documentation in the below table if you are facing issues.
|
> Please check this [Plugins debugging guide](https://github.com/jokob-sk/NetAlertX/blob/main/docs/DEBUG_PLUGINS.md) and the corresponding Plugin documentation in the below table if you are facing issues.
|
||||||
@@ -8,15 +8,14 @@ NetAlertX supports additional plugins to extend its functionality, each with its
|
|||||||
## ⚡ Quick start
|
## ⚡ Quick start
|
||||||
|
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> You can load additional Plugins via the General -> `LOADED_PLUGINS` setting. Use `Ctrl + Click` to select/deselect.
|
> You can load additional Plugins via the General -> `LOADED_PLUGINS` setting.
|
||||||
|
|
||||||
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)
|
||||||
1. 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.
|
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.
|
||||||
1. Setup your [Network topology diagram](/docs/NETWORK_TREE.md)
|
3. Setup your [Network topology diagram](/docs/NETWORK_TREE.md)
|
||||||
1. Fine-tune [Notifications](/docs/NOTIFICATIONS.md)
|
4. Fine-tune [Notifications](/docs/NOTIFICATIONS.md)
|
||||||
1. [Backup your setup](/docs/BACKUPS.md)
|
5. [Backup your setup](/docs/BACKUPS.md)
|
||||||
1. Contribute and [Create custom plugins](/docs/PLUGINS_DEV.md)
|
6. Contribute and [Create custom plugins](/docs/PLUGINS_DEV.md)
|
||||||
1. Consider [donating](https://github.com/jokob-sk/NetAlertX?tab=readme-ov-file#-sponsors) to keep me going
|
|
||||||
|
|
||||||
|
|
||||||
## 📑 Available Plugins
|
## 📑 Available Plugins
|
||||||
@@ -28,6 +27,7 @@ Device-detecting plugins insert values into the `CurrentScan` database table. T
|
|||||||
|---------------|---------|--------------------------------------------|----------|----------|--------------------|---------------------------------------------------------------|
|
|---------------|---------|--------------------------------------------|----------|----------|--------------------|---------------------------------------------------------------|
|
||||||
| `APPRISE` | ▶️ | Apprise notification proxy | | | Script | [_publisher_apprise](/front/plugins/_publisher_apprise/) |
|
| `APPRISE` | ▶️ | Apprise notification proxy | | | Script | [_publisher_apprise](/front/plugins/_publisher_apprise/) |
|
||||||
| `ARPSCAN` | 🔍 | ARP-scan on current network | | | Script | [arp_scan](/front/plugins/arp_scan/) |
|
| `ARPSCAN` | 🔍 | ARP-scan on current network | | | Script | [arp_scan](/front/plugins/arp_scan/) |
|
||||||
|
| `AVAHISCAN` | ♻ | Avahi (mDNS-based) name resolution | | | Script | [avahi_scan](/front/plugins/avahi_scan/) |
|
||||||
| `CSVBCKP` | ⚙ | CSV devices backup | | | Script | [csv_backup](/front/plugins/csv_backup/) |
|
| `CSVBCKP` | ⚙ | CSV devices backup | | | Script | [csv_backup](/front/plugins/csv_backup/) |
|
||||||
| `DBCLNP` | ⚙ | Database cleanup | | Yes* | Script | [db_cleanup](/front/plugins/db_cleanup/) |
|
| `DBCLNP` | ⚙ | Database cleanup | | Yes* | Script | [db_cleanup](/front/plugins/db_cleanup/) |
|
||||||
| `DDNS` | ⚙ | DDNS update | | | Script | [ddns_update](/front/plugins/ddns_update/) |
|
| `DDNS` | ⚙ | DDNS update | | | Script | [ddns_update](/front/plugins/ddns_update/) |
|
||||||
@@ -53,6 +53,7 @@ Device-detecting plugins insert values into the `CurrentScan` database table. T
|
|||||||
| `SMTP` | ▶️ | Email notifications | | | Script | [_publisher_email](/front/plugins/_publisher_email/) |
|
| `SMTP` | ▶️ | Email notifications | | | Script | [_publisher_email](/front/plugins/_publisher_email/) |
|
||||||
| `SNMPDSC` | 🔍/📥 | SNMP device import & sync | | | Script | [snmp_discovery](/front/plugins/snmp_discovery/) |
|
| `SNMPDSC` | 🔍/📥 | SNMP device import & sync | | | Script | [snmp_discovery](/front/plugins/snmp_discovery/) |
|
||||||
| `SYNC` | 🔍/⚙/📥| Sync & import from NetAlertX instances | 🖧 🔄 | | Script | [sync](/front/plugins/sync/) |
|
| `SYNC` | 🔍/⚙/📥| Sync & import from NetAlertX instances | 🖧 🔄 | | Script | [sync](/front/plugins/sync/) |
|
||||||
|
| `TELEGRAM` | ▶️ | Telegram notifications | | | Script | [_publisher_telegram](/front/plugins/_publisher_telegram/) |
|
||||||
| `UNDIS` | 🔍/📥 | Create dummy devices | | | Script | [undiscoverables](/front/plugins/undiscoverables/) |
|
| `UNDIS` | 🔍/📥 | Create dummy devices | | | Script | [undiscoverables](/front/plugins/undiscoverables/) |
|
||||||
| `UNFIMP` | 🔍/📥 | UniFi device import & sync | 🖧 | | Script | [unifi_import](/front/plugins/unifi_import/) |
|
| `UNFIMP` | 🔍/📥 | UniFi device import & sync | 🖧 | | Script | [unifi_import](/front/plugins/unifi_import/) |
|
||||||
| `VNDRPDT` | ⚙ | Vendor database update | | | Script | [vendor_update](/front/plugins/vendor_update/) |
|
| `VNDRPDT` | ⚙ | Vendor database update | | | Script | [vendor_update](/front/plugins/vendor_update/) |
|
||||||
@@ -69,13 +70,13 @@ Device-detecting plugins insert values into the `CurrentScan` database table. T
|
|||||||
## Plugin types
|
## Plugin types
|
||||||
|
|
||||||
|
|
||||||
| Plugin type | Icon | Description | When to run | Required | Data source [?](/docs/PLUGINS_DEV.md) |
|
| Plugin type | Icon | Description | When to run | Required | Data source [?](/docs/PLUGINS_DEV.md) |
|
||||||
|---------------|------|---------------------------------------------------------------|--------------------------|----|---------|
|
|---------------|------|----------------------------------------------------------------|--------------------------|----|---------|
|
||||||
| publisher | ▶️ | Sending notifications to services. | `on_notification` | ✖ | Script |
|
| publisher | ▶️ | Sending notifications to services. | `on_notification` | ✖ | Script |
|
||||||
| dev scanner | 🔍 | Create devices in the app, usually scanning the current network. | `schedule` | ✖ | Script / SQLite DB |
|
| dev scanner | 🔍 | Create devices in the app, manages online/offline device status. | `schedule` | ✖ | Script / SQLite DB |
|
||||||
| importer | 📥 | Importing devices from another service. | `schedule` | ✖ | Script / SQLite DB |
|
| importer | 📥 | Importing devices from another service. | `schedule` | ✖ | Script / SQLite DB |
|
||||||
| system | ⚙ | Providing core system functionality. | `schedule` / always on | ✖/✔ | Script / Template |
|
| system | ⚙ | Providing core system functionality. | `schedule` / always on | ✖/✔ | Script / Template |
|
||||||
| other | ♻ | Other scanners, e.g. for name resolution | misc | ✖ | Script / Template |
|
| other | ♻ | Other scanners, e.g. for name resolution | misc | ✖ | Script / Template |
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
|
|||||||
@@ -259,9 +259,13 @@
|
|||||||
"function": "CMD",
|
"function": "CMD",
|
||||||
"type": {
|
"type": {
|
||||||
"dataType": "string",
|
"dataType": "string",
|
||||||
"element": "input",
|
"elements": [
|
||||||
"elementOptions": ["readonly"],
|
{
|
||||||
"transformers": []
|
"elementType": "input",
|
||||||
|
"elementOptions": [{ "readonly": "true" }],
|
||||||
|
"transformers": []
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"default_value": "python3 /app/front/plugins/<plugin folder>/rename_me.py",
|
"default_value": "python3 /app/front/plugins/<plugin folder>/rename_me.py",
|
||||||
"options": [],
|
"options": [],
|
||||||
@@ -309,6 +313,21 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"database_column_definitions": [
|
"database_column_definitions": [
|
||||||
|
{
|
||||||
|
"column": "Index",
|
||||||
|
"css_classes": "col-sm-2",
|
||||||
|
"show": true,
|
||||||
|
"type": "none",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Index"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"column": "Object_PrimaryID",
|
"column": "Object_PrimaryID",
|
||||||
"mapped_to_column": "cur_MAC",
|
"mapped_to_column": "cur_MAC",
|
||||||
|
|||||||
@@ -33,19 +33,15 @@
|
|||||||
{
|
{
|
||||||
"column": "Index",
|
"column": "Index",
|
||||||
"css_classes": "col-sm-2",
|
"css_classes": "col-sm-2",
|
||||||
"show": false,
|
"show": true,
|
||||||
"type": "label",
|
"type": "none",
|
||||||
"default_value": "",
|
"default_value": "",
|
||||||
"options": [],
|
"options": [],
|
||||||
"localized": ["name"],
|
"localized": ["name"],
|
||||||
"name": [
|
"name": [
|
||||||
{
|
{
|
||||||
"language_code": "en_us",
|
"language_code": "en_us",
|
||||||
"string": "N/A"
|
"string": "Index"
|
||||||
},
|
|
||||||
{
|
|
||||||
"language_code": "es_es",
|
|
||||||
"string": "N/A"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -104,7 +100,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"column": "DateTimeCreated",
|
"column": "DateTimeCreated",
|
||||||
"css_classes": "col-sm-2",
|
"css_classes": "col-sm-3",
|
||||||
"show": true,
|
"show": true,
|
||||||
"type": "label",
|
"type": "label",
|
||||||
"default_value": "",
|
"default_value": "",
|
||||||
@@ -145,7 +141,7 @@
|
|||||||
"options": [
|
"options": [
|
||||||
{
|
{
|
||||||
"type": "eval",
|
"type": "eval",
|
||||||
"param": "`<a href='/report.php?guid=${value}'>${value}</a>`"
|
"param": "`<a href='/report.php?guid=${value}'>Link</a>`"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"localized": ["name"],
|
"localized": ["name"],
|
||||||
|
|||||||
@@ -33,19 +33,15 @@
|
|||||||
{
|
{
|
||||||
"column": "Index",
|
"column": "Index",
|
||||||
"css_classes": "col-sm-2",
|
"css_classes": "col-sm-2",
|
||||||
"show": false,
|
"show": true,
|
||||||
"type": "label",
|
"type": "none",
|
||||||
"default_value": "",
|
"default_value": "",
|
||||||
"options": [],
|
"options": [],
|
||||||
"localized": ["name"],
|
"localized": ["name"],
|
||||||
"name": [
|
"name": [
|
||||||
{
|
{
|
||||||
"language_code": "en_us",
|
"language_code": "en_us",
|
||||||
"string": "N/A"
|
"string": "Index"
|
||||||
},
|
|
||||||
{
|
|
||||||
"language_code": "es_es",
|
|
||||||
"string": "N/A"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ def send(pHTML, pText):
|
|||||||
mylog('debug', [f'[{pluginName}] SMTP_REPORT_TO: {hide_email(str(get_setting_value("SMTP_REPORT_TO")))} SMTP_USER: {hide_email(str(get_setting_value("SMTP_USER")))}'])
|
mylog('debug', [f'[{pluginName}] SMTP_REPORT_TO: {hide_email(str(get_setting_value("SMTP_REPORT_TO")))} SMTP_USER: {hide_email(str(get_setting_value("SMTP_USER")))}'])
|
||||||
|
|
||||||
|
|
||||||
subject, from_email, to_email, message_html, message_text = sanitize_email_content('Net AlertX Report', get_setting_value("SMTP_REPORT_FROM"), get_setting_value("SMTP_REPORT_TO"), pHTML, pText)
|
subject, from_email, to_email, message_html, message_text = sanitize_email_content('NetAlertX Report', get_setting_value("SMTP_REPORT_FROM"), get_setting_value("SMTP_REPORT_TO"), pHTML, pText)
|
||||||
|
|
||||||
# Compose email
|
# Compose email
|
||||||
msg = MIMEMultipart('alternative')
|
msg = MIMEMultipart('alternative')
|
||||||
|
|||||||
BIN
front/plugins/_publisher_mqtt/Deleting_MQTT_Plugin_Objects.png
Executable file
BIN
front/plugins/_publisher_mqtt/Deleting_MQTT_Plugin_Objects.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 142 KiB |
@@ -7,9 +7,31 @@
|
|||||||
- Go to settings and fill in relevant details. There are 2 types of "devices" generated and sent to the broker. A generic overview device that contains online/down/archived device stats and then the actual devices detected by the application.
|
- Go to settings and fill in relevant details. There are 2 types of "devices" generated and sent to the broker. A generic overview device that contains online/down/archived device stats and then the actual devices detected by the application.
|
||||||
|
|
||||||
|
|
||||||
|
## Forcing an update
|
||||||
|
|
||||||
|
In order to speed up the processing, device configs are only pushed to the broker if a change occurs. The plugin compares the previous data with the current device state, and the following fields are checked:
|
||||||
|
|
||||||
|
- icon
|
||||||
|
- device name
|
||||||
|
- mac
|
||||||
|
|
||||||
|
You can force an update of all devices by deleting plugin objects of the MQTT plugin. For example, navigate to:
|
||||||
|
|
||||||
|
`Device -> Plugins -> MQTT -> Delete all`
|
||||||
|
|
||||||
|
Filters will be ignored, and this will delete all objects associated with the plugin. The next time the MQTT plugin is processed, all data is re-sent to the broker.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Please note the online/offline state of the device is always updated based on the scan result and if it changed from the previous value.
|
||||||
|
|
||||||
|
|
||||||
# Sample Payloads
|
# Sample Payloads
|
||||||
|
|
||||||
|
|
||||||
|
>[!WARNING]
|
||||||
|
> Please check your Home Assistant MQTT broker debug info for the most up-to-date data and format as the below might be outdated.
|
||||||
|
|
||||||
## Overview device
|
## Overview device
|
||||||
|
|
||||||
The below payloads apply to the device showing overall online/down/archived stats. You can toggle them on/off with the `SEND_STATS` setting.
|
The below payloads apply to the device showing overall online/down/archived stats. You can toggle them on/off with the `SEND_STATS` setting.
|
||||||
@@ -179,8 +201,6 @@ Payload:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
>[!WARNING]
|
|
||||||
> Please check your Home Assistant MQTT broker debug info for the most up-to-date data nad format as the above might be outdated.
|
|
||||||
|
|
||||||
|
|
||||||
## Implementation Notes
|
## Implementation Notes
|
||||||
|
|||||||
@@ -5,6 +5,15 @@
|
|||||||
"enabled": true,
|
"enabled": true,
|
||||||
"data_source": "script",
|
"data_source": "script",
|
||||||
"show_ui": true,
|
"show_ui": true,
|
||||||
|
"data_filters": [
|
||||||
|
{
|
||||||
|
"compare_column": "Watched_Value4",
|
||||||
|
"compare_operator": "==",
|
||||||
|
"compare_field_id": "txtMacFilter",
|
||||||
|
"compare_js_template": "'{value}'.toString()",
|
||||||
|
"compare_use_quotes": true
|
||||||
|
}
|
||||||
|
],
|
||||||
"localized": ["display_name", "description", "icon"],
|
"localized": ["display_name", "description", "icon"],
|
||||||
"display_name": [
|
"display_name": [
|
||||||
{
|
{
|
||||||
@@ -40,19 +49,15 @@
|
|||||||
{
|
{
|
||||||
"column": "Index",
|
"column": "Index",
|
||||||
"css_classes": "col-sm-2",
|
"css_classes": "col-sm-2",
|
||||||
"show": false,
|
"show": true,
|
||||||
"type": "label",
|
"type": "none",
|
||||||
"default_value": "",
|
"default_value": "",
|
||||||
"options": [],
|
"options": [],
|
||||||
"localized": ["name"],
|
"localized": ["name"],
|
||||||
"name": [
|
"name": [
|
||||||
{
|
{
|
||||||
"language_code": "en_us",
|
"language_code": "en_us",
|
||||||
"string": "N/A"
|
"string": "Index"
|
||||||
},
|
|
||||||
{
|
|
||||||
"language_code": "es_es",
|
|
||||||
"string": "N/A"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -647,7 +652,7 @@
|
|||||||
"description": [
|
"description": [
|
||||||
{
|
{
|
||||||
"language_code": "en_us",
|
"language_code": "en_us",
|
||||||
"string": "The root path of the stats overview sensor. Inserted into the <code>system-sensors/sensor/{DEVICE_ID}/state</code> topic."
|
"string": "The root path of the stats overview sensor. Inserted into the <code>{MQTT_topic_root}/sensor/{MQTT_DEVICE_ID}/state</code> topic."
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -703,6 +708,30 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"function": "topic_root",
|
||||||
|
"type": {
|
||||||
|
"dataType": "string",
|
||||||
|
"elements": [
|
||||||
|
{ "elementType": "input", "elementOptions": [], "transformers": [] }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": "system-sensors",
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name", "description"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "MQTT topic root"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "The topic root of the devices sensors. Inserted into the <code>{MQTT_topic_root}/sensor/{MQTT_DEVICE_ID}/state</code> topic."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"function": "DEVICES_SQL",
|
"function": "DEVICES_SQL",
|
||||||
"type": {
|
"type": {
|
||||||
@@ -767,8 +796,8 @@
|
|||||||
{ "elementType": "select", "elementOptions": [], "transformers": [] }
|
{ "elementType": "select", "elementOptions": [], "transformers": [] }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"default_value": 1,
|
"default_value": 5,
|
||||||
"options": [1, 2],
|
"options": [3, 5],
|
||||||
"localized": ["name", "description"],
|
"localized": ["name", "description"],
|
||||||
"name": [
|
"name": [
|
||||||
{
|
{
|
||||||
@@ -779,7 +808,7 @@
|
|||||||
"description": [
|
"description": [
|
||||||
{
|
{
|
||||||
"language_code": "en_us",
|
"language_code": "en_us",
|
||||||
"string": "Paho MQTT API version. Depends on the MQTT <a href=\"https://eclipse.dev/paho/files/paho.mqtt.python/html/index.html#callbacks\" target=\"_blank\">version supported by the MQTT broker</a>. Usually set to <code>1</code>."
|
"string": "MQTT Protocol version. Depends on the MQTT broker</a>. Usually set to <code>5</code>, or <code>3</code> for backwards compatibility."
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import sys
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import time
|
import time
|
||||||
import re
|
import re
|
||||||
|
import unicodedata
|
||||||
import paho.mqtt.client as mqtt
|
import paho.mqtt.client as mqtt
|
||||||
# from paho.mqtt import client as mqtt_client
|
# from paho.mqtt import client as mqtt_client
|
||||||
# from paho.mqtt import CallbackAPIVersion as mqtt_CallbackAPIVersion
|
# from paho.mqtt import CallbackAPIVersion as mqtt_CallbackAPIVersion
|
||||||
@@ -26,7 +27,7 @@ from const import apiPath, confFileName
|
|||||||
from plugin_utils import getPluginObject
|
from plugin_utils import getPluginObject
|
||||||
from plugin_helper import Plugin_Objects
|
from plugin_helper import Plugin_Objects
|
||||||
from logger import mylog, append_line_to_file
|
from logger import mylog, append_line_to_file
|
||||||
from helper import timeNowTZ, get_setting_value, bytes_to_string, sanitize_string
|
from helper import timeNowTZ, get_setting_value, bytes_to_string, sanitize_string, normalize_string
|
||||||
from notification import Notification_obj
|
from notification import Notification_obj
|
||||||
from database import DB, get_device_stats
|
from database import DB, get_device_stats
|
||||||
from pytz import timezone
|
from pytz import timezone
|
||||||
@@ -37,7 +38,6 @@ conf.tz = timezone(get_setting_value('TIMEZONE'))
|
|||||||
CUR_PATH = str(pathlib.Path(__file__).parent.resolve())
|
CUR_PATH = str(pathlib.Path(__file__).parent.resolve())
|
||||||
RESULT_FILE = os.path.join(CUR_PATH, 'last_result.log')
|
RESULT_FILE = os.path.join(CUR_PATH, 'last_result.log')
|
||||||
|
|
||||||
|
|
||||||
# Initialize the Plugin obj output file
|
# Initialize the Plugin obj output file
|
||||||
plugin_objects = Plugin_Objects(RESULT_FILE)
|
plugin_objects = Plugin_Objects(RESULT_FILE)
|
||||||
# Create an MD5 hash object
|
# Create an MD5 hash object
|
||||||
@@ -46,10 +46,10 @@ md5_hash = hashlib.md5()
|
|||||||
pluginName = 'MQTT'
|
pluginName = 'MQTT'
|
||||||
|
|
||||||
# globals
|
# globals
|
||||||
|
|
||||||
mqtt_sensors = []
|
mqtt_sensors = []
|
||||||
mqtt_connected_to_broker = False
|
mqtt_connected_to_broker = False
|
||||||
mqtt_client = None # mqtt client
|
mqtt_client = None # mqtt client
|
||||||
|
topic_root = get_setting_value('MQTT_topic_root')
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|
||||||
@@ -86,111 +86,144 @@ def check_config():
|
|||||||
# Sensor configs are tracking which sensors in NetAlertX exist and if a config has changed
|
# Sensor configs are tracking which sensors in NetAlertX exist and if a config has changed
|
||||||
class sensor_config:
|
class sensor_config:
|
||||||
def __init__(self, deviceId, deviceName, sensorType, sensorName, icon, mac):
|
def __init__(self, deviceId, deviceName, sensorType, sensorName, icon, mac):
|
||||||
|
"""
|
||||||
|
Initialize the sensor_config object with provided parameters. Sets up sensor configuration
|
||||||
|
and generates necessary MQTT topics and messages based on the sensor type.
|
||||||
|
"""
|
||||||
|
# Assign initial attributes
|
||||||
self.deviceId = deviceId
|
self.deviceId = deviceId
|
||||||
self.deviceName = deviceName
|
self.deviceName = deviceName
|
||||||
self.sensorType = sensorType
|
self.sensorType = sensorType
|
||||||
self.sensorName = sensorName
|
self.sensorName = sensorName
|
||||||
self.icon = icon
|
self.icon = icon
|
||||||
self.mac = mac
|
self.mac = mac
|
||||||
|
self.model = deviceName
|
||||||
|
self.hash = ''
|
||||||
self.state_topic = ''
|
self.state_topic = ''
|
||||||
self.json_attr_topic = ''
|
self.json_attr_topic = ''
|
||||||
self.topic = ''
|
self.topic = ''
|
||||||
self.message = ''
|
self.message = {} # Initialize message as an empty dictionary
|
||||||
self.unique_id = ''
|
self.unique_id = ''
|
||||||
|
|
||||||
# binary sensor only sensor
|
# Call helper functions to initialize the message, generate a hash, and handle plugin object
|
||||||
if self.sensorType == 'binary_sensor' or self.sensorType == 'sensor':
|
self.initialize_message()
|
||||||
|
self.generate_hash()
|
||||||
|
self.handle_plugin_object()
|
||||||
|
|
||||||
|
def initialize_message(self):
|
||||||
|
"""
|
||||||
|
Initialize the MQTT message payload based on the sensor type. This method handles sensors of types:
|
||||||
|
- 'timestamp'
|
||||||
|
- 'binary_sensor'
|
||||||
|
- 'sensor'
|
||||||
|
- 'device_tracker'
|
||||||
|
"""
|
||||||
|
# Ensure self.message is initialized as a dictionary if not already done
|
||||||
|
if not isinstance(self.message, dict):
|
||||||
|
self.message = {}
|
||||||
|
|
||||||
|
# Handle sensors with a 'timestamp' device class
|
||||||
|
if self.sensorName in ['last_connection', 'first_connection']:
|
||||||
|
self.message.update({
|
||||||
|
"device_class": "timestamp"
|
||||||
|
})
|
||||||
|
|
||||||
|
# Handle 'binary_sensor' or 'sensor' types
|
||||||
|
if self.sensorType in ['binary_sensor', 'sensor']:
|
||||||
self.topic = f'homeassistant/{self.sensorType}/{self.deviceId}/{self.sensorName}/config'
|
self.topic = f'homeassistant/{self.sensorType}/{self.deviceId}/{self.sensorName}/config'
|
||||||
self.state_topic = f'system-sensors/{self.sensorType}/{self.deviceId}/state'
|
self.state_topic = f'{topic_root}/{self.sensorType}/{self.deviceId}/state'
|
||||||
self.unique_id = self.deviceId+'_sensor_'+self.sensorName
|
self.unique_id = f'{self.deviceId}_sensor_{self.sensorName}'
|
||||||
|
|
||||||
self.message = {
|
# Update the message dictionary, expanding it without overwriting
|
||||||
"name" : self.sensorName,
|
self.message.update({
|
||||||
"state_topic" : self.state_topic,
|
"name": self.sensorName,
|
||||||
"value_template" : "{{value_json."+self.sensorName+"}}",
|
"state_topic": self.state_topic,
|
||||||
"unique_id" : self.unique_id,
|
"value_template": f"{{{{value_json.{self.sensorName}}}}}",
|
||||||
"device":
|
"unique_id": self.unique_id,
|
||||||
{
|
"device": {
|
||||||
"identifiers" : [self.deviceId+"_sensor"],
|
"identifiers": [f"{self.deviceId}_sensor"],
|
||||||
"manufacturer" : "NetAlertX",
|
"manufacturer": "NetAlertX",
|
||||||
"name" : self.deviceName
|
"name": self.deviceName
|
||||||
},
|
},
|
||||||
"icon": f'mdi:{self.icon}'
|
"icon": f'mdi:{self.icon}'
|
||||||
}
|
})
|
||||||
|
|
||||||
|
|
||||||
|
# Handle 'device_tracker' sensor type
|
||||||
elif self.sensorType == 'device_tracker':
|
elif self.sensorType == 'device_tracker':
|
||||||
|
|
||||||
self.topic = f'homeassistant/device_tracker/{self.deviceId}/config'
|
self.topic = f'homeassistant/device_tracker/{self.deviceId}/config'
|
||||||
self.state_topic = f'system-sensors/device_tracker/{self.deviceId}/state'
|
self.state_topic = f'{topic_root}/device_tracker/{self.deviceId}/state'
|
||||||
self.json_attr_topic = f'system-sensors/device_tracker/{self.deviceId}/attributes'
|
self.json_attr_topic = f'{topic_root}/device_tracker/{self.deviceId}/attributes'
|
||||||
self.unique_id = f'{self.deviceId}_{self.sensorType}_{self.sensorName}'
|
self.unique_id = f'{self.deviceId}_{self.sensorType}_{self.sensorName}'
|
||||||
|
|
||||||
payload_home = 'home'
|
# Construct the message dictionary for device_tracker
|
||||||
payload_away = 'away'
|
self.message = {
|
||||||
|
"state_topic": self.state_topic,
|
||||||
|
"json_attributes_topic": self.json_attr_topic,
|
||||||
|
"name": self.sensorName,
|
||||||
|
"payload_home": 'home',
|
||||||
|
"payload_not_home": 'away',
|
||||||
|
"unique_id": self.unique_id,
|
||||||
|
"icon": f'mdi:{self.icon}',
|
||||||
|
"device": {
|
||||||
|
"identifiers": [f"{self.deviceId}_sensor", self.unique_id],
|
||||||
|
"manufacturer": "NetAlertX",
|
||||||
|
"model": self.model or "Unknown", # Use model if available, else set to 'Unknown'
|
||||||
|
"name": self.deviceName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
self.message = {
|
def generate_hash(self):
|
||||||
"state_topic": self.state_topic,
|
"""
|
||||||
"json_attributes_topic": self.json_attr_topic,
|
Generate an MD5 hash based on the combined string of deviceId, deviceName, sensorType, sensorName, and icon.
|
||||||
"name": self.sensorName,
|
This hash will uniquely identify the sensor configuration.
|
||||||
"payload_home": payload_home,
|
"""
|
||||||
"payload_not_home": payload_away,
|
# Concatenate all relevant attributes into a single string
|
||||||
"unique_id" : self.unique_id,
|
input_string = f"{self.deviceId}{self.deviceName}{self.sensorType}{self.sensorName}{self.icon}"
|
||||||
"icon": f'mdi:{self.icon}',
|
md5_hash = hashlib.md5() # Initialize the MD5 hash object
|
||||||
"device":
|
md5_hash.update(input_string.encode('utf-8')) # Update hash with input string
|
||||||
{
|
self.hash = md5_hash.hexdigest() # Store the hex representation of the hash
|
||||||
"identifiers" : [self.deviceId+"_sensor", self.unique_id],
|
|
||||||
"manufacturer" : "NetAlertX",
|
|
||||||
"name" : self.deviceName
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
# Define your input string
|
def handle_plugin_object(self):
|
||||||
input_string = str(self.deviceId) + str(self.deviceName) + str(self.sensorType) + str(self.sensorName) + str(self.icon)
|
"""
|
||||||
|
Fetch the plugin object from the system based on the generated hash. If the object exists, it logs that the sensor is
|
||||||
|
already known. If not, it marks the sensor as new and logs relevant information.
|
||||||
|
"""
|
||||||
|
# Retrieve the plugin object based on the sensor's hash
|
||||||
|
plugObj = getPluginObject({"Plugin": "MQTT", "Watched_Value3": self.hash})
|
||||||
|
|
||||||
# Hash the input string and convert the hash to a string
|
# Check if the plugin object is new
|
||||||
# Update the hash object with the bytes of the input string
|
if not plugObj:
|
||||||
md5_hash.update(input_string.encode('utf-8'))
|
|
||||||
|
|
||||||
# Get the hexadecimal representation of the MD5 hash
|
|
||||||
md5_hash_hex = md5_hash.hexdigest()
|
|
||||||
hash_value = str(md5_hash_hex)
|
|
||||||
|
|
||||||
self.hash = hash_value
|
|
||||||
|
|
||||||
plugObj = getPluginObject({"Plugin":"MQTT", "Watched_Value3":hash_value})
|
|
||||||
|
|
||||||
# mylog('verbose', [f"[{pluginName}] Previous plugin object entry: {json.dumps(plugObj)}"])
|
|
||||||
|
|
||||||
if plugObj == {}:
|
|
||||||
self.isNew = True
|
self.isNew = True
|
||||||
mylog('verbose', [f"[{pluginName}] New sensor entry name : {self.deviceName}"])
|
mylog('verbose', [f"[{pluginName}] New sensor entry (name|mac|hash) : ({self.deviceName}|{self.mac}|{self.hash}"])
|
||||||
mylog('verbose', [f"[{pluginName}] New sensor entry mac : {self.mac}"])
|
|
||||||
mylog('verbose', [f"[{pluginName}] New sensor entry hash_value : {hash_value}"])
|
|
||||||
else:
|
else:
|
||||||
device_name = plugObj.get("Watched_Value1", "Unknown")
|
device_name = plugObj.get("Watched_Value1", "Unknown")
|
||||||
mylog('verbose', [f"[{pluginName}] Existing, skip Device Name : {device_name}"])
|
mylog('verbose', [f"[{pluginName}] Existing, skip Device Name: {device_name}"])
|
||||||
self.isNew = False
|
self.isNew = False
|
||||||
|
|
||||||
|
# Store the sensor configuration in global plugin_objects
|
||||||
|
self.store_plugin_object()
|
||||||
|
|
||||||
# Log sensor
|
def store_plugin_object(self):
|
||||||
|
"""
|
||||||
|
Store the sensor configuration in the global plugin_objects, which tracks sensors based on a unique combination
|
||||||
|
of attributes including deviceId, sensorName, hash, and MAC.
|
||||||
|
"""
|
||||||
global plugin_objects
|
global plugin_objects
|
||||||
|
|
||||||
if mac == '':
|
# Add the sensor to the global plugin_objects
|
||||||
mac = "N/A"
|
|
||||||
|
|
||||||
plugin_objects.add_object(
|
plugin_objects.add_object(
|
||||||
primaryId = deviceId,
|
primaryId=self.deviceId,
|
||||||
secondaryId = sensorName,
|
secondaryId=self.sensorName,
|
||||||
watched1 = deviceName,
|
watched1=self.deviceName,
|
||||||
watched2 = sensorType,
|
watched2=self.sensorType,
|
||||||
watched3 = hash_value,
|
watched3=self.hash,
|
||||||
watched4 = mac,
|
watched4=self.mac,
|
||||||
extra = input_string,
|
extra=f"{self.deviceId}{self.deviceName}{self.sensorType}{self.sensorName}{self.icon}",
|
||||||
foreignKey = mac
|
foreignKey=self.mac
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
|
|
||||||
def publish_mqtt(mqtt_client, topic, message):
|
def publish_mqtt(mqtt_client, topic, message):
|
||||||
@@ -272,41 +305,88 @@ def create_sensor(mqtt_client, deviceId, deviceName, sensorType, sensorName, ico
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
def mqtt_create_client():
|
def mqtt_create_client():
|
||||||
def on_disconnect(mqtt_client, userdata, reason_code):
|
|
||||||
|
# attempt reconnections on failure, ref https://www.emqx.com/en/blog/how-to-use-mqtt-in-python
|
||||||
|
FIRST_RECONNECT_DELAY = 1
|
||||||
|
RECONNECT_RATE = 2
|
||||||
|
MAX_RECONNECT_COUNT = 12
|
||||||
|
MAX_RECONNECT_DELAY = 60
|
||||||
|
|
||||||
|
mytransport = 'tcp' # or 'websockets'
|
||||||
|
|
||||||
|
def on_disconnect(mqtt_client, userdata, rc):
|
||||||
|
|
||||||
global mqtt_connected_to_broker
|
global mqtt_connected_to_broker
|
||||||
|
|
||||||
|
mylog('verbose', [f"[{pluginName}] Connection terminated, reason_code: {rc}"])
|
||||||
|
reconnect_count, reconnect_delay = 0, FIRST_RECONNECT_DELAY
|
||||||
|
while reconnect_count < MAX_RECONNECT_COUNT:
|
||||||
|
mylog('verbose', [f"[{pluginName}] Reconnecting in {reconnect_delay} seconds..."])
|
||||||
|
time.sleep(reconnect_delay)
|
||||||
|
|
||||||
|
try:
|
||||||
|
mqtt_client.reconnect()
|
||||||
|
mqtt_connected_to_broker = True # Signal connection
|
||||||
|
mylog('verbose', [f"[{pluginName}] Reconnected successfully"])
|
||||||
|
return
|
||||||
|
except Exception as err:
|
||||||
|
mylog('verbose', [f"[{pluginName}] {err} Reconnect failed. Retrying..."])
|
||||||
|
pass
|
||||||
|
|
||||||
|
reconnect_delay *= RECONNECT_RATE
|
||||||
|
reconnect_delay = min(reconnect_delay, MAX_RECONNECT_DELAY)
|
||||||
|
reconnect_count += 1
|
||||||
|
|
||||||
mqtt_connected_to_broker = False
|
mqtt_connected_to_broker = False
|
||||||
|
|
||||||
# not sure is below line is correct / necessary
|
|
||||||
# client = mqtt_create_client()
|
|
||||||
|
|
||||||
def on_connect(mqtt_client, userdata, flags, reason_code):
|
def on_connect(mqtt_client, userdata, flags, rc, properties):
|
||||||
|
|
||||||
global mqtt_connected_to_broker
|
global mqtt_connected_to_broker
|
||||||
|
|
||||||
if reason_code == 0:
|
# REF: Good docu on reason codes: https://www.emqx.com/en/blog/mqtt5-new-features-reason-code-and-ack
|
||||||
|
if rc == 0:
|
||||||
mylog('verbose', [f"[{pluginName}] Connected to broker"])
|
mylog('verbose', [f"[{pluginName}] Connected to broker"])
|
||||||
mqtt_connected_to_broker = True # Signal connection
|
mqtt_connected_to_broker = True # Signal connection
|
||||||
else:
|
else:
|
||||||
mylog('verbose', [f"[{pluginName}] Connection failed, reason_code: {reason_code}"])
|
mylog('verbose', [f"[{pluginName}] Connection failed, reason_code: {rc}"])
|
||||||
mqtt_connected_to_broker = False
|
mqtt_connected_to_broker = False
|
||||||
|
|
||||||
|
|
||||||
global mqtt_client
|
global mqtt_client
|
||||||
|
global mqtt_connected_to_broker
|
||||||
|
|
||||||
if get_setting_value('MQTT_VERSION') == 1:
|
# Paho will be soon not supporting V1 anymore, so this really should not be a user choice to start with
|
||||||
mqtt_client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION1)
|
# This code now uses V2 by default
|
||||||
|
# Ref: https://eclipse.dev/paho/files/paho.mqtt.python/html/migrations.html
|
||||||
|
|
||||||
|
if get_setting_value('MQTT_VERSION') == 3:
|
||||||
|
version = mqtt.MQTTv311
|
||||||
else:
|
else:
|
||||||
mqtt_client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
|
version = mqtt.MQTTv5
|
||||||
|
|
||||||
|
# we now hardcode the client id into here.
|
||||||
|
# TODO: Add config ffor client id
|
||||||
|
mqtt_client = mqtt.Client(
|
||||||
|
client_id='netalertx',
|
||||||
|
callback_api_version = mqtt.CallbackAPIVersion.VERSION2,
|
||||||
|
transport=mytransport,
|
||||||
|
protocol=version)
|
||||||
|
mqtt_client.on_connect = on_connect
|
||||||
|
mqtt_client.on_disconnect = on_disconnect
|
||||||
|
|
||||||
if get_setting_value('MQTT_TLS'):
|
if get_setting_value('MQTT_TLS'):
|
||||||
mqtt_client.tls_set()
|
mqtt_client.tls_set()
|
||||||
|
|
||||||
mqtt_client.username_pw_set(get_setting_value('MQTT_USER'), get_setting_value('MQTT_PASSWORD'))
|
mqtt_client.username_pw_set(username = get_setting_value('MQTT_USER'), password = get_setting_value('MQTT_PASSWORD'))
|
||||||
mqtt_client.on_connect = on_connect
|
err_code = mqtt_client.connect(host = get_setting_value('MQTT_BROKER'), port = get_setting_value('MQTT_PORT'))
|
||||||
mqtt_client.on_disconnect = on_disconnect
|
if (err_code == mqtt.MQTT_ERR_SUCCESS):
|
||||||
mqtt_client.connect(get_setting_value('MQTT_BROKER'), get_setting_value('MQTT_PORT'))
|
# We (prematurely) set the connection state to connected
|
||||||
|
# the callback may be delayed
|
||||||
|
mqtt_connected_to_broker = True
|
||||||
|
# the client connects but connect callbacks will be called async and there may be a waiting time
|
||||||
|
# Mosquitto works straight away
|
||||||
|
# EMQX has a delay and does not update in loop below, so we cannot rely on it, we wait 1 sec
|
||||||
|
time.sleep(1)
|
||||||
mqtt_client.loop_start()
|
mqtt_client.loop_start()
|
||||||
|
|
||||||
return mqtt_client
|
return mqtt_client
|
||||||
@@ -335,7 +415,7 @@ def mqtt_start(db):
|
|||||||
row = get_device_stats(db)
|
row = get_device_stats(db)
|
||||||
|
|
||||||
# Publish (wrap into {} and remove last ',' from above)
|
# Publish (wrap into {} and remove last ',' from above)
|
||||||
publish_mqtt(mqtt_client, f"system-sensors/sensor/{deviceId}/state",
|
publish_mqtt(mqtt_client, f"{topic_root}/sensor/{deviceId}/state",
|
||||||
{
|
{
|
||||||
"online": row[0],
|
"online": row[0],
|
||||||
"down": row[1],
|
"down": row[1],
|
||||||
@@ -362,12 +442,15 @@ def mqtt_start(db):
|
|||||||
|
|
||||||
for device in devices:
|
for device in devices:
|
||||||
|
|
||||||
# debug statement
|
# # debug statement START 🔻
|
||||||
# if 'Moto' in device["dev_Name"]:
|
# if 'Moto' not in device["dev_Name"]:
|
||||||
|
# continue
|
||||||
|
# # debug statement END 🔺
|
||||||
|
|
||||||
# Create devices in Home Assistant - send config messages
|
# Create devices in Home Assistant - send config messages
|
||||||
deviceId = 'mac_' + device["dev_MAC"].replace(" ", "").replace(":", "_").lower()
|
deviceId = 'mac_' + device["dev_MAC"].replace(" ", "").replace(":", "_").lower()
|
||||||
devDisplayName = re.sub('[^a-zA-Z0-9-_\\s]', '', device["dev_Name"])
|
# Normalize the string and remove unwanted characters
|
||||||
|
devDisplayName = re.sub('[^a-zA-Z0-9-_\\s]', '', normalize_string(device["dev_Name"]))
|
||||||
|
|
||||||
sensorConfig = create_sensor(mqtt_client, deviceId, devDisplayName, 'sensor', 'last_ip', 'ip-network', device["dev_MAC"])
|
sensorConfig = create_sensor(mqtt_client, deviceId, devDisplayName, 'sensor', 'last_ip', 'ip-network', device["dev_MAC"])
|
||||||
sensorConfig = create_sensor(mqtt_client, deviceId, devDisplayName, 'sensor', 'mac_address', 'folder-key-network', device["dev_MAC"])
|
sensorConfig = create_sensor(mqtt_client, deviceId, devDisplayName, 'sensor', 'mac_address', 'folder-key-network', device["dev_MAC"])
|
||||||
@@ -376,14 +459,15 @@ def mqtt_start(db):
|
|||||||
sensorConfig = create_sensor(mqtt_client, deviceId, devDisplayName, 'sensor', 'first_connection', 'calendar-start', device["dev_MAC"])
|
sensorConfig = create_sensor(mqtt_client, deviceId, devDisplayName, 'sensor', 'first_connection', 'calendar-start', device["dev_MAC"])
|
||||||
sensorConfig = create_sensor(mqtt_client, deviceId, devDisplayName, 'sensor', 'last_connection', 'calendar-end', device["dev_MAC"])
|
sensorConfig = create_sensor(mqtt_client, deviceId, devDisplayName, 'sensor', 'last_connection', 'calendar-end', device["dev_MAC"])
|
||||||
|
|
||||||
|
|
||||||
devJson = {
|
devJson = {
|
||||||
"last_ip": device["dev_LastIP"],
|
"last_ip": device["dev_LastIP"],
|
||||||
"is_new": str(device["dev_NewDevice"]),
|
"is_new": str(device["dev_NewDevice"]),
|
||||||
"vendor": sanitize_string(device["dev_Vendor"]),
|
"vendor": sanitize_string(device["dev_Vendor"]),
|
||||||
"mac_address": str(device["dev_MAC"]),
|
"mac_address": str(device["dev_MAC"]),
|
||||||
"last_connection": str(device["dev_LastConnection"]),
|
"model": devDisplayName,
|
||||||
"first_connection": str(device["dev_FirstConnection"])
|
"last_connection": prepTimeStamp(str(device["dev_LastConnection"])),
|
||||||
}
|
"first_connection": prepTimeStamp(str(device["dev_FirstConnection"])) }
|
||||||
|
|
||||||
# bulk update device sensors in home assistant
|
# bulk update device sensors in home assistant
|
||||||
publish_mqtt(mqtt_client, sensorConfig.state_topic, devJson)
|
publish_mqtt(mqtt_client, sensorConfig.state_topic, devJson)
|
||||||
@@ -433,8 +517,24 @@ def to_binary_sensor(input):
|
|||||||
result = "ON"
|
result = "ON"
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
# -------------------------------------
|
||||||
|
# Convert to format that is interpretable by Home Assistant
|
||||||
|
def prepTimeStamp(datetime_str):
|
||||||
|
try:
|
||||||
|
# Attempt to parse the input string to ensure it's a valid datetime
|
||||||
|
parsed_datetime = datetime.fromisoformat(datetime_str)
|
||||||
|
|
||||||
|
# If the parsed datetime is naive (i.e., does not contain timezone info), add UTC timezone
|
||||||
|
if parsed_datetime.tzinfo is None:
|
||||||
|
parsed_datetime = parsed_datetime.replace(tzinfo=conf.tz)
|
||||||
|
|
||||||
|
except ValueError:
|
||||||
|
mylog('verbose', [f"[{pluginName}] Timestamp conversion failed of string '{datetime_str}'"])
|
||||||
|
# Use the current time if the input format is invalid
|
||||||
|
parsed_datetime = timeNowTZ() # Assuming this function returns the current time with timezone
|
||||||
|
|
||||||
|
# Convert to the required format with 'T' between date and time and ensure the timezone is included
|
||||||
|
return parsed_datetime.isoformat() # This will include the timezone offset
|
||||||
|
|
||||||
# -------------INIT---------------------
|
# -------------INIT---------------------
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
@@ -33,19 +33,15 @@
|
|||||||
{
|
{
|
||||||
"column": "Index",
|
"column": "Index",
|
||||||
"css_classes": "col-sm-2",
|
"css_classes": "col-sm-2",
|
||||||
"show": false,
|
"show": true,
|
||||||
"type": "label",
|
"type": "none",
|
||||||
"default_value": "",
|
"default_value": "",
|
||||||
"options": [],
|
"options": [],
|
||||||
"localized": ["name"],
|
"localized": ["name"],
|
||||||
"name": [
|
"name": [
|
||||||
{
|
{
|
||||||
"language_code": "en_us",
|
"language_code": "en_us",
|
||||||
"string": "N/A"
|
"string": "Index"
|
||||||
},
|
|
||||||
{
|
|
||||||
"language_code": "es_es",
|
|
||||||
"string": "N/A"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -33,19 +33,15 @@
|
|||||||
{
|
{
|
||||||
"column": "Index",
|
"column": "Index",
|
||||||
"css_classes": "col-sm-2",
|
"css_classes": "col-sm-2",
|
||||||
"show": false,
|
"show": true,
|
||||||
"type": "label",
|
"type": "none",
|
||||||
"default_value": "",
|
"default_value": "",
|
||||||
"options": [],
|
"options": [],
|
||||||
"localized": ["name"],
|
"localized": ["name"],
|
||||||
"name": [
|
"name": [
|
||||||
{
|
{
|
||||||
"language_code": "en_us",
|
"language_code": "en_us",
|
||||||
"string": "N/A"
|
"string": "Index"
|
||||||
},
|
|
||||||
{
|
|
||||||
"language_code": "es_es",
|
|
||||||
"string": "N/A"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -33,19 +33,15 @@
|
|||||||
{
|
{
|
||||||
"column": "Index",
|
"column": "Index",
|
||||||
"css_classes": "col-sm-2",
|
"css_classes": "col-sm-2",
|
||||||
"show": false,
|
"show": true,
|
||||||
"type": "label",
|
"type": "none",
|
||||||
"default_value": "",
|
"default_value": "",
|
||||||
"options": [],
|
"options": [],
|
||||||
"localized": ["name"],
|
"localized": ["name"],
|
||||||
"name": [
|
"name": [
|
||||||
{
|
{
|
||||||
"language_code": "en_us",
|
"language_code": "en_us",
|
||||||
"string": "N/A"
|
"string": "Index"
|
||||||
},
|
|
||||||
{
|
|
||||||
"language_code": "es_es",
|
|
||||||
"string": "N/A"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
12
front/plugins/_publisher_telegram/README.md
Executable file
12
front/plugins/_publisher_telegram/README.md
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
## Overview
|
||||||
|
|
||||||
|
You can send notifications via Telegram
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
You need Telegram bot to send notifications
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
- Go to settings and fill in relevant details.
|
||||||
|
|
||||||
|
Made by [@doctorixx](https://github.com/doctorixx) 🙏
|
||||||
466
front/plugins/_publisher_telegram/config.json
Executable file
466
front/plugins/_publisher_telegram/config.json
Executable file
@@ -0,0 +1,466 @@
|
|||||||
|
{
|
||||||
|
"code_name": "_publisher_telegram",
|
||||||
|
"unique_prefix": "TELEGRAM",
|
||||||
|
"plugin_type": "publisher",
|
||||||
|
"enabled": true,
|
||||||
|
"data_source": "script",
|
||||||
|
"show_ui": true,
|
||||||
|
"localized": ["display_name", "description", "icon"],
|
||||||
|
"display_name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Telegram publisher"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"icon": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "<i class=\"fa-solid fa-bullhorn\"></i>"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "A plugin to publish a notification via Telegram."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"params": [],
|
||||||
|
"database_column_definitions": [
|
||||||
|
{
|
||||||
|
"column": "Index",
|
||||||
|
"css_classes": "col-sm-2",
|
||||||
|
"show": true,
|
||||||
|
"type": "none",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Index"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "Plugin",
|
||||||
|
"css_classes": "col-sm-2",
|
||||||
|
"show": false,
|
||||||
|
"type": "label",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "N/A"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "N/A"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "Object_PrimaryID",
|
||||||
|
"css_classes": "col-sm-2",
|
||||||
|
"show": false,
|
||||||
|
"type": "url",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "N/A"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "Object_SecondaryID",
|
||||||
|
"css_classes": "col-sm-2",
|
||||||
|
"show": false,
|
||||||
|
"type": "label",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "N/A"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "N/A"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "DateTimeCreated",
|
||||||
|
"css_classes": "col-sm-2",
|
||||||
|
"show": true,
|
||||||
|
"type": "label",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Sent when"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "DateTimeChanged",
|
||||||
|
"css_classes": "col-sm-2",
|
||||||
|
"show": false,
|
||||||
|
"type": "label",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Changed"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "Cambiado"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "Watched_Value1",
|
||||||
|
"css_classes": "col-sm-2",
|
||||||
|
"show": true,
|
||||||
|
"type": "eval",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"type": "eval",
|
||||||
|
"param": "`<a href='/report.php?guid=${value}'>${value}</a>`"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"localized": ["name"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Notification GUID"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "Watched_Value2",
|
||||||
|
"css_classes": "col-sm-8",
|
||||||
|
"show": true,
|
||||||
|
"type": "textarea_readonly",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Result"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "Watched_Value3",
|
||||||
|
"css_classes": "col-sm-2",
|
||||||
|
"show": false,
|
||||||
|
"type": "label",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "N/A"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "N/A"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "Watched_Value4",
|
||||||
|
"css_classes": "col-sm-2",
|
||||||
|
"show": false,
|
||||||
|
"type": "label",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "N/A"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "N/A"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "UserData",
|
||||||
|
"css_classes": "col-sm-2",
|
||||||
|
"show": false,
|
||||||
|
"type": "textbox_save",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Comments"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "Comentarios"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "Status",
|
||||||
|
"css_classes": "col-sm-1",
|
||||||
|
"show": false,
|
||||||
|
"type": "replace",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"equals": "watched-not-changed",
|
||||||
|
"replacement": "<div style='text-align:center'><i class='fa-solid fa-square-check'></i><div></div>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"equals": "watched-changed",
|
||||||
|
"replacement": "<div style='text-align:center'><i class='fa-solid fa-triangle-exclamation'></i></div>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"equals": "new",
|
||||||
|
"replacement": "<div style='text-align:center'><i class='fa-solid fa-circle-plus'></i></div>"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"equals": "missing-in-last-scan",
|
||||||
|
"replacement": "<div style='text-align:center'><i class='fa-solid fa-question'></i></div>"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"localized": ["name"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Status"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "Estado"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "Extra",
|
||||||
|
"css_classes": "col-sm-3",
|
||||||
|
"show": false,
|
||||||
|
"type": "label",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Extra"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "Extra"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"settings": [
|
||||||
|
{
|
||||||
|
"function": "RUN",
|
||||||
|
"events": ["test"],
|
||||||
|
"type": {
|
||||||
|
"dataType": "string",
|
||||||
|
"elements": [
|
||||||
|
{ "elementType": "select", "elementOptions": [], "transformers": [] }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": "disabled",
|
||||||
|
"options": ["disabled", "on_notification"],
|
||||||
|
"localized": ["name", "description"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "When to run"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "Cuando ejecuta"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Enable sending notifications via a Telegram messanger"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "CMD",
|
||||||
|
"type": {
|
||||||
|
"dataType": "string",
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"elementType": "input",
|
||||||
|
"elementOptions": [{ "readonly": "true" }],
|
||||||
|
"transformers": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": "python3 /app/front/plugins/_publisher_telegram/tg.py",
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name", "description"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Command"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "Comando"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Command to run"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "Comando a ejecutar"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "RUN_TIMEOUT",
|
||||||
|
"type": {
|
||||||
|
"dataType": "integer",
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"elementType": "input",
|
||||||
|
"elementOptions": [{ "type": "number" }],
|
||||||
|
"transformers": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": 10,
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name", "description"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Run timeout"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "Tiempo de espera de ejecución"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "de_de",
|
||||||
|
"string": "Wartezeit"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "Tiempo máximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "HOST",
|
||||||
|
"type": {
|
||||||
|
"dataType": "string",
|
||||||
|
"elements": [
|
||||||
|
{ "elementType": "input", "elementOptions": [], "transformers": [] }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name", "description"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Telegram chat id"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Telegram chat id. If you want to send messages to user, paste user id (Example: <code>1234123412</code>)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "URL",
|
||||||
|
"type": {
|
||||||
|
"dataType": "string",
|
||||||
|
"elements": [
|
||||||
|
{ "elementType": "input", "elementOptions": [], "transformers": [] }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name", "description"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Telegram bot token"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Telegram bot token. You cat get at from <a target=\"_blank\" href=\"https://t.me/BotFather\">BotFather</a>"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "SIZE",
|
||||||
|
"type": {
|
||||||
|
"dataType": "integer",
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"elementType": "input",
|
||||||
|
"elementOptions": [{ "type": "number" }],
|
||||||
|
"transformers": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": 1024,
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name", "description"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Max payload size"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "Tamaño máximo de carga útil"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "The maximum size of the payload as number of characters in the passed string. If above limit, it will be truncated and a <code>(text was truncated)</code> message is appended."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
124
front/plugins/_publisher_telegram/tg.py
Executable file
124
front/plugins/_publisher_telegram/tg.py
Executable file
@@ -0,0 +1,124 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import json
|
||||||
|
import subprocess
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
import pathlib
|
||||||
|
import sys
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
# Register NetAlertX directories
|
||||||
|
INSTALL_PATH = "/app"
|
||||||
|
sys.path.extend([f"{INSTALL_PATH}/front/plugins", f"{INSTALL_PATH}/server"])
|
||||||
|
|
||||||
|
import conf
|
||||||
|
from const import confFileName
|
||||||
|
from plugin_helper import Plugin_Objects
|
||||||
|
from logger import mylog, append_line_to_file
|
||||||
|
from helper import timeNowTZ, get_setting_value
|
||||||
|
from notification import Notification_obj
|
||||||
|
from database import DB
|
||||||
|
from pytz import timezone
|
||||||
|
|
||||||
|
# Make sure the TIMEZONE for logging is correct
|
||||||
|
conf.tz = timezone(get_setting_value('TIMEZONE'))
|
||||||
|
|
||||||
|
CUR_PATH = str(pathlib.Path(__file__).parent.resolve())
|
||||||
|
RESULT_FILE = os.path.join(CUR_PATH, 'last_result.log')
|
||||||
|
|
||||||
|
pluginName = 'TELEGRAM'
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
mylog('verbose', [f'[{pluginName}](publisher) In script'])
|
||||||
|
|
||||||
|
# Check if basic config settings supplied
|
||||||
|
if check_config() == False:
|
||||||
|
mylog('none', [
|
||||||
|
f'[{pluginName}] ⚠ ERROR: Publisher notification gateway not set up correctly. Check your {confFileName} {pluginName}_* variables.'])
|
||||||
|
return
|
||||||
|
|
||||||
|
# Create a database connection
|
||||||
|
db = DB() # instance of class DB
|
||||||
|
db.open()
|
||||||
|
|
||||||
|
# Initialize the Plugin obj output file
|
||||||
|
plugin_objects = Plugin_Objects(RESULT_FILE)
|
||||||
|
|
||||||
|
# Create a Notification_obj instance
|
||||||
|
notifications = Notification_obj(db)
|
||||||
|
|
||||||
|
# Retrieve new notifications
|
||||||
|
new_notifications = notifications.getNew()
|
||||||
|
|
||||||
|
# Process the new notifications (see the Notifications DB table for structure or check the /api/table_notifications.json endpoint)
|
||||||
|
for notification in new_notifications:
|
||||||
|
# Send notification
|
||||||
|
result = send(notification["Text"])
|
||||||
|
|
||||||
|
# Log result
|
||||||
|
plugin_objects.add_object(
|
||||||
|
primaryId=pluginName,
|
||||||
|
secondaryId=timeNowTZ(),
|
||||||
|
watched1=notification["GUID"],
|
||||||
|
watched2=result,
|
||||||
|
watched3='null',
|
||||||
|
watched4='null',
|
||||||
|
extra='null',
|
||||||
|
foreignKey=notification["GUID"]
|
||||||
|
)
|
||||||
|
|
||||||
|
plugin_objects.write_result_file()
|
||||||
|
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------------
|
||||||
|
def check_config():
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------------
|
||||||
|
def send(text):
|
||||||
|
# limit = 1024 * 1024 # 1MB limit (1024 bytes * 1024 bytes = 1MB)
|
||||||
|
limit = get_setting_value('TELEGRAM_SIZE')
|
||||||
|
|
||||||
|
if len(text) > limit:
|
||||||
|
payloadData = text[:limit] + " (text was truncated)"
|
||||||
|
else:
|
||||||
|
payloadData = text
|
||||||
|
|
||||||
|
try:
|
||||||
|
# try runnning a subprocess
|
||||||
|
|
||||||
|
req = """curl --location 'https://api.telegram.org/bot%s/sendMessage' \\
|
||||||
|
--header 'Content-Type: application/json' \\
|
||||||
|
--data '{
|
||||||
|
"chat_id": "%s",
|
||||||
|
"text": "%s",
|
||||||
|
"disable_notification": false
|
||||||
|
}'""" % (get_setting_value('TELEGRAM_URL'), get_setting_value('TELEGRAM_HOST'), payloadData)
|
||||||
|
|
||||||
|
mylog('debug', [req])
|
||||||
|
|
||||||
|
p = subprocess.Popen(req, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
|
||||||
|
stdout, stderr = p.communicate()
|
||||||
|
|
||||||
|
# write stdout and stderr into .log files for debugging if needed
|
||||||
|
# Log the stdout and stderr
|
||||||
|
mylog('debug', [stdout, stderr])
|
||||||
|
|
||||||
|
# log result
|
||||||
|
result = stdout
|
||||||
|
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
# An error occurred, handle it
|
||||||
|
mylog('none', [e.output])
|
||||||
|
|
||||||
|
# log result
|
||||||
|
result = e.output
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main())
|
||||||
BIN
front/plugins/_publisher_webhook/Discord_Config.png
Executable file
BIN
front/plugins/_publisher_webhook/Discord_Config.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 108 KiB |
@@ -6,3 +6,7 @@ A plugin to publish a notification via the Webhook gateway. Webhooks help you to
|
|||||||
|
|
||||||
- Go to settings and fill in relevant details.
|
- Go to settings and fill in relevant details.
|
||||||
|
|
||||||
|
#### Sample Discord Setup
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user