mirror of
https://github.com/jokob-sk/NetAlertX.git
synced 2025-12-07 09:36:05 -08:00
Compare commits
128 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
645a4e68f0 | ||
|
|
9007658e40 | ||
|
|
316cb9ca57 | ||
|
|
bfddccddec | ||
|
|
77f46417a9 | ||
|
|
d5c0f898df | ||
|
|
28e403356b | ||
|
|
07546bc7df | ||
|
|
bf054dfc3f | ||
|
|
78b3228159 | ||
|
|
6fc73aa2eb | ||
|
|
9537de7361 | ||
|
|
059cc4a162 | ||
|
|
72d7996315 | ||
|
|
ecbbcba6aa | ||
|
|
427c0f9d80 | ||
|
|
1524bbd23c | ||
|
|
ea080dde8c | ||
|
|
45be8a0dbb | ||
|
|
a0166f58e9 | ||
|
|
296525f390 | ||
|
|
9040591ae7 | ||
|
|
95fd7435d2 | ||
|
|
0a58cca5c3 | ||
|
|
71686aeab5 | ||
|
|
152729724c | ||
|
|
e347454802 | ||
|
|
0b6071a272 | ||
|
|
5d761e8687 | ||
|
|
9435cd3081 | ||
|
|
ef725103aa | ||
|
|
7568071ce8 | ||
|
|
96f90fa5c9 | ||
|
|
323ca5a8a9 | ||
|
|
09549b1922 | ||
|
|
09339b9b6d | ||
|
|
1fb46add24 | ||
|
|
1dcca191d9 | ||
|
|
584fdb7734 | ||
|
|
525b05db5a | ||
|
|
5d8561818f | ||
|
|
d3d019b487 | ||
|
|
2fbbf220fb | ||
|
|
dbfb49d03d | ||
|
|
c52a615720 | ||
|
|
51365f82b8 | ||
|
|
0e02b1beec | ||
|
|
cc9b08ad04 | ||
|
|
aad1bcede3 | ||
|
|
aa28fe2b0e | ||
|
|
c9a297b72a | ||
|
|
e0cff6b81a | ||
|
|
6262f874a3 | ||
|
|
eb81d0a1e3 | ||
|
|
f4d13f3fb6 | ||
|
|
1dbfa7dc0a | ||
|
|
c6fbf0dd0e | ||
|
|
ab0d4fe259 | ||
|
|
ecf6c1848d | ||
|
|
8647bf2699 | ||
|
|
87b114604c | ||
|
|
fbbe4dc64b | ||
|
|
1a78810691 | ||
|
|
f45717cee4 | ||
|
|
31e358280c | ||
|
|
444333d44f | ||
|
|
4d85c77738 | ||
|
|
d26d6c8b0b | ||
|
|
944619af81 | ||
|
|
1332b73a92 | ||
|
|
c11deeb57f | ||
|
|
294518b146 | ||
|
|
b5be221aec | ||
|
|
8ab3945871 | ||
|
|
73732a7d0c | ||
|
|
5599bbdf31 | ||
|
|
2a085f5703 | ||
|
|
2943da7c07 | ||
|
|
e1e4a1da07 | ||
|
|
8bb9328201 | ||
|
|
9d54273947 | ||
|
|
141ba5d6c1 | ||
|
|
ebd514e278 | ||
|
|
aa1468af34 | ||
|
|
003732c20d | ||
|
|
d762e2b6ae | ||
|
|
c7cb69c914 | ||
|
|
663e5539c8 | ||
|
|
52b130d812 | ||
|
|
788f23b955 | ||
|
|
047f6a1ed2 | ||
|
|
a8fad6ac74 | ||
|
|
3ed406021c | ||
|
|
f600398353 | ||
|
|
3af04246d0 | ||
|
|
95d7856978 | ||
|
|
fd10379c7f | ||
|
|
fe776a1443 | ||
|
|
81842b8521 | ||
|
|
dc7ff4c94d | ||
|
|
c13df2e0c8 | ||
|
|
0846c3914a | ||
|
|
5a2616800f | ||
|
|
9cef7848c5 | ||
|
|
b14345f390 | ||
|
|
b0f1f581dc | ||
|
|
e97a63b814 | ||
|
|
45afc4ee1f | ||
|
|
ec0b1d18ca | ||
|
|
07b0cfdd7b | ||
|
|
44408c8cfc | ||
|
|
01d3d0523e | ||
|
|
436669173b | ||
|
|
003fc557cd | ||
|
|
c1b5a2684b | ||
|
|
2b6cc1f8c7 | ||
|
|
820dc023e8 | ||
|
|
a0544368fb | ||
|
|
f2c6778574 | ||
|
|
62dffc4ac3 | ||
|
|
847fefcc46 | ||
|
|
47680fc64e | ||
|
|
277cfd3a03 | ||
|
|
6ffceee3ca | ||
|
|
fd00db7886 | ||
|
|
c86aa276b9 | ||
|
|
dc36709297 | ||
|
|
b63fb6c966 |
@@ -12,10 +12,11 @@ ENV PATH="/opt/venv/bin:$PATH"
|
||||
|
||||
COPY . ${INSTALL_DIR}/
|
||||
|
||||
RUN pip install requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet \
|
||||
|
||||
RUN pip install requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython \
|
||||
&& bash -c "find ${INSTALL_DIR} -type d -exec chmod 750 {} \;" \
|
||||
&& bash -c "find ${INSTALL_DIR} -type f -exec chmod 640 {} \;" \
|
||||
&& bash -c "find ${INSTALL_DIR} -type f \( -name '*.sh' -o -name '*.py' -o -name 'pialert-cli' -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
|
||||
FROM alpine:3.19 as runner
|
||||
@@ -37,7 +38,7 @@ ENV S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0
|
||||
|
||||
RUN apk update --no-cache \
|
||||
&& 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 net-tools net-snmp-tools bind-tools awake ca-certificates \
|
||||
&& apk add --no-cache curl arp-scan iproute2 iproute2-ss nmap nmap-scripts traceroute net-tools net-snmp-tools bind-tools awake ca-certificates \
|
||||
&& apk add --no-cache sqlite php82 php82-fpm php82-cgi php82-curl php82-sqlite3 php82-session \
|
||||
&& apk add --no-cache python3 nginx \
|
||||
&& ln -s /usr/bin/awake /usr/bin/wakeonlan \
|
||||
|
||||
@@ -32,7 +32,7 @@ COPY --chmod=775 --chown=${USER_ID}:${USER_GID} . ${INSTALL_DIR}/
|
||||
RUN apt-get install -y \
|
||||
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 \
|
||||
python3 iproute2 nmap python3-pip zip systemctl usbutils traceroute
|
||||
python3 iproute2 nmap python3-pip zip systemctl usbutils traceroute
|
||||
|
||||
# Alternate dependencies
|
||||
RUN apt-get install nginx nginx-core mtr php-fpm php8.2-fpm php-cli php8.2 php8.2-sqlite3 -y
|
||||
@@ -41,7 +41,8 @@ RUN phpenmod -v 8.2 sqlite3
|
||||
# Setup virtual python environment and use pip3 to install packages
|
||||
RUN apt-get install -y python3-venv
|
||||
RUN python3 -m venv myenv
|
||||
RUN /bin/bash -c "source myenv/bin/activate && update-alternatives --install /usr/bin/python python /usr/bin/python3 10 && pip3 install requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet"
|
||||
|
||||
RUN /bin/bash -c "source myenv/bin/activate && update-alternatives --install /usr/bin/python python /usr/bin/python3 10 && pip3 install requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython"
|
||||
|
||||
# Create a buildtimestamp.txt to later check if a new version was released
|
||||
RUN date +%s > ${INSTALL_DIR}/front/buildtimestamp.txt
|
||||
|
||||
@@ -47,7 +47,7 @@ Get visibility of what's going on on your WIFI/LAN network. Schedule scans for d
|
||||
|
||||
| Features | Details |
|
||||
|-------------|-------------|
|
||||
| 🔍 | The app scans your network for, **New devices**, **New connections** (re-connections), **Disconnections**, **"Always Connected" devices down**, Devices **IP changes** and **Internet IP address changes**. Discovery & scan methods include: **arp-scan**. **Pi-hole - DB import**, **Pi-hole - DHCP leases import**, **Generic DHCP leases import**. **UNIFI controller import**, **SNMP-enabled router import**. Check the [Plugins](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins#readme) docs for more info on individual scans. |
|
||||
| 🔍 | The app scans your network for, **New devices**, **New connections** (re-connections), **Disconnections**, **"Always Connected" devices down**, Devices **IP changes** and **Internet IP address changes**. Discovery & scan methods include: **arp-scan**, **Pi-hole - DB import**, **Pi-hole - DHCP leases import**, **Generic DHCP leases import**. **UNIFI controller import**, **SNMP-enabled router import**. Check the [Plugins](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins#readme) docs for more info on individual scans. |
|
||||
|📧 | Send notifications to more than 80+ services, including Telegram via [Apprise](https://hub.docker.com/r/caronc/apprise), or use [Pushsafer](https://www.pushsafer.com/), [Pushover](https://www.pushover.net/), or [NTFY](https://ntfy.sh/). |
|
||||
|🧩 | Feed your data and device changes into [Home Assistant](https://github.com/jokob-sk/NetAlertX/blob/main/docs/HOME_ASSISTANT.md), read [API endpoints](https://github.com/jokob-sk/NetAlertX/blob/main/docs/API.md), or use [Webhooks](https://github.com/jokob-sk/NetAlertX/blob/main/docs/WEBHOOK_N8N.md) to setup custom automation flows. |
|
||||
|➕ | Build your own scanners with the [Plugin system](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins#readme) |
|
||||
@@ -81,7 +81,7 @@ Thank you to all the wonderful people who are sponsoring this project.
|
||||
<!-- SPONSORS-LIST DO NOT MODIFY BELOW -->
|
||||
| All Sponsors |
|
||||
|---|
|
||||
| [Tony Hanratty](https://github.com/thanratty) |
|
||||
| [ENgraver666](https://github.com/ENgraver666) |
|
||||
|
||||
<!-- SPONSORS-LIST DO NOT MODIFY ABOVE -->
|
||||
|
||||
|
||||
@@ -21,8 +21,6 @@
|
||||
SCAN_SUBNETS=['192.168.1.0/24 --interface=eth1']
|
||||
|
||||
TIMEZONE='Europe/Berlin'
|
||||
PIALERT_WEB_PROTECTION=False
|
||||
PIALERT_WEB_PASSWORD='8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92'
|
||||
DAYS_TO_KEEP_EVENTS=90
|
||||
# Used for generating links in emails. Make sure not to add a trailing slash!
|
||||
REPORT_DASHBOARD_URL='http://netalertx'
|
||||
|
||||
125
back/pialert-cli
125
back/pialert-cli
@@ -1,125 +0,0 @@
|
||||
#!/bin/bash
|
||||
SCRIPT=$(readlink -f $0)
|
||||
SCRIPTPATH=$(dirname $SCRIPT)
|
||||
CONFFILENAME="app.conf"
|
||||
SETTING_NAME_TOGGLE="PIALERT_WEB_PROTECTION"
|
||||
SETTING_NAME_PWD="PIALERT_WEB_PASSWORD"
|
||||
PIA_CONF_FILE=${SCRIPTPATH}'/../config/${CONFFILENAME}'
|
||||
|
||||
case $1 in
|
||||
|
||||
help)
|
||||
echo "pialert-cli v0.1 (https://github.com/leiweibau/Pi.Alert)"
|
||||
echo "Usage: pialert-cli <command>"
|
||||
echo ""
|
||||
echo "The is a list of supported commands:"
|
||||
echo ""
|
||||
echo " set_login - Sets the parameter $SETTING_NAME_TOGGLE in the config file to TRUE"
|
||||
echo " - If the parameter is not present, it will be created. Additionally the"
|
||||
echo " default password '123456' is set."
|
||||
echo ""
|
||||
echo " unset_login - Sets the parameter $SETTING_NAME_TOGGLE in the config file to FALSE"
|
||||
echo " - If the parameter is not present, it will be created. Additionally the"
|
||||
echo " default password '123456' is set."
|
||||
echo ""
|
||||
echo " set_password <password> - Sets the new password as a hashed value."
|
||||
echo " - If the $SETTING_NAME_TOGGLE parameter does not exist yet, it will be"
|
||||
echo " created and set to 'True' (login enabled)"
|
||||
echo ""
|
||||
echo " set_autopassword - Sets a new random password as a hashed value and show it plaintext in"
|
||||
echo " the console."
|
||||
echo " - If the $SETTING_NAME_TOGGLE parameter does not exist yet, it will be"
|
||||
echo " created and set to 'True' (login enabled)"
|
||||
echo ""
|
||||
echo ""
|
||||
echo ""
|
||||
;;
|
||||
|
||||
set_login)
|
||||
## Check if $SETTING_NAME_TOGGLE exists
|
||||
CHECK_PROT=$(grep "$SETTING_NAME_TOGGLE" $PIA_CONF_FILE | wc -l)
|
||||
if [ $CHECK_PROT -eq 0 ]
|
||||
then
|
||||
## Create $SETTING_NAME_TOGGLE and enable it
|
||||
sed -i "/^VENDORS_DB.*/a $SETTING_NAME_TOGGLE = True" $PIA_CONF_FILE
|
||||
sed -i "/^$SETTING_NAME_TOGGLE.*/a $SETTING_NAME_PWD = '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92'" $PIA_CONF_FILE
|
||||
else
|
||||
## Switch $SETTING_NAME_TOGGLE to enable
|
||||
sed -i "/$SETTING_NAME_TOGGLE/c\$SETTING_NAME_TOGGLE = True" $PIA_CONF_FILE
|
||||
fi
|
||||
echo "Login is now enabled"
|
||||
;;
|
||||
|
||||
unset_login)
|
||||
## Check if $SETTING_NAME_TOGGLE exists
|
||||
CHECK_PROT=$(grep "$SETTING_NAME_TOGGLE" $PIA_CONF_FILE | wc -l)
|
||||
if [ $CHECK_PROT -eq 0 ]
|
||||
then
|
||||
## Create $SETTING_NAME_TOGGLE and disable it
|
||||
sed -i "/^VENDORS_DB.*/a $SETTING_NAME_TOGGLE = False" $PIA_CONF_FILE
|
||||
sed -i "/^$SETTING_NAME_TOGGLE.*/a $SETTING_NAME_PWD = '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92'" $PIA_CONF_FILE
|
||||
else
|
||||
## Switch $SETTING_NAME_TOGGLE to disable
|
||||
sed -i "/$SETTING_NAME_TOGGLE/c\$SETTING_NAME_TOGGLE = False" $PIA_CONF_FILE
|
||||
fi
|
||||
echo "Login is now disabled"
|
||||
;;
|
||||
|
||||
set_password)
|
||||
PIA_PASS=$2
|
||||
## Check if $SETTING_NAME_TOGGLE exists
|
||||
CHECK_PROT=$(grep "$SETTING_NAME_TOGGLE" $PIA_CONF_FILE | wc -l)
|
||||
if [ $CHECK_PROT -eq 0 ]
|
||||
then
|
||||
## Create $SETTING_NAME_TOGGLE and enable it
|
||||
sed -i "/^VENDORS_DB.*/a $SETTING_NAME_TOGGLE = True" $PIA_CONF_FILE
|
||||
fi
|
||||
## Prepare Hash
|
||||
PIA_PASS_HASH=$(echo -n $PIA_PASS | sha256sum | awk '{print $1}')
|
||||
echo " The hashed password is:"
|
||||
echo " $PIA_PASS_HASH"
|
||||
## Check if the password parameter is set
|
||||
CHECK_PWD=$(grep "$SETTING_NAME_PWD" $PIA_CONF_FILE | wc -l)
|
||||
if [ $CHECK_PWD -eq 0 ]
|
||||
then
|
||||
sed -i "/^$SETTING_NAME_TOGGLE.*/a $SETTING_NAME_PWD = '$PIA_PASS_HASH'" $PIA_CONF_FILE
|
||||
else
|
||||
sed -i "/$SETTING_NAME_PWD/c\$SETTING_NAME_PWD = '$PIA_PASS_HASH'" $PIA_CONF_FILE
|
||||
fi
|
||||
echo ""
|
||||
echo "The new password is set"
|
||||
;;
|
||||
|
||||
set_autopassword)
|
||||
## Check if $SETTING_NAME_TOGGLE exists
|
||||
CHECK_PROT=$(grep "$SETTING_NAME_TOGGLE" $PIA_CONF_FILE | wc -l)
|
||||
if [ $CHECK_PROT -eq 0 ]
|
||||
then
|
||||
## Create $SETTING_NAME_TOGGLE and enable it
|
||||
sed -i "/^VENDORS_DB.*/a $SETTING_NAME_TOGGLE = True" $PIA_CONF_FILE
|
||||
fi
|
||||
## Create autopassword
|
||||
PIA_AUTOPASS=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1)
|
||||
echo " The password is: $PIA_AUTOPASS"
|
||||
## Prepare Hash
|
||||
PIA_AUTOPASS_HASH=$(echo -n $PIA_AUTOPASS | sha256sum | awk '{print $1}')
|
||||
echo " The hashed password is:"
|
||||
echo " $PIA_AUTOPASS_HASH"
|
||||
## Check if the password parameter is set
|
||||
CHECK_PWD=$(grep "$SETTING_NAME_PWD" $PIA_CONF_FILE | wc -l)
|
||||
if [ $CHECK_PWD -eq 0 ]
|
||||
then
|
||||
## Create password parameter
|
||||
sed -i "/^$SETTING_NAME_TOGGLE.*/a $SETTING_NAME_PWD = '$PIA_AUTOPASS_HASH'" $PIA_CONF_FILE
|
||||
else
|
||||
## Overwrite password parameter
|
||||
sed -i "/$SETTING_NAME_PWD/c\$SETTING_NAME_PWD = '$PIA_AUTOPASS_HASH'" $PIA_CONF_FILE
|
||||
fi
|
||||
echo ""
|
||||
echo "The new password is set"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "pialert-cli v0.1 (https://github.com/leiweibau/Pi.Alert)"
|
||||
echo "Use \"pialert-cli help\" for a list of supported commands."
|
||||
esac
|
||||
@@ -12,56 +12,31 @@
|
||||
# ----------------------------------------------------------------------
|
||||
# Main directories to update:
|
||||
# /usr/share/arp-scan
|
||||
# /usr/share/ieee-data
|
||||
# /var/lib/ieee-data
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
echo "---------------------------------------------------------"
|
||||
echo "[INSTALL] Run update_vendors.sh"
|
||||
echo "---------------------------------------------------------"
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
echo Updating... /usr/share/ieee-data/
|
||||
cd /usr/share/ieee-data/ || { echo "could not enter /usr/share/ieee-data directory"; exit 1; }
|
||||
|
||||
sudo mkdir -p 2_backup
|
||||
sudo cp -- *.txt 2_backup
|
||||
sudo cp -- *.csv 2_backup
|
||||
echo ""
|
||||
echo Download Start
|
||||
echo ""
|
||||
sudo curl "$1" -LO https://standards-oui.ieee.org/oui28/mam.csv \
|
||||
-LO https://standards-oui.ieee.org/oui28/mam.csv \
|
||||
-LO https://standards-oui.ieee.org/oui28/mam.txt \
|
||||
-LO https://standards-oui.ieee.org/oui36/oui36.csv \
|
||||
-LO https://standards-oui.ieee.org/oui36/oui36.txt \
|
||||
-LO https://standards-oui.ieee.org/oui/oui.csv \
|
||||
-LO https://standards-oui.ieee.org/oui/oui.txt
|
||||
echo ""
|
||||
echo Download Finished
|
||||
DL_DIR=/usr/share/arp-scan
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
echo ""
|
||||
echo Updating... /usr/share/arp-scan/
|
||||
cd /usr/share/arp-scan || { echo "could not enter /usr/share/arp-scan directory"; exit 1; }
|
||||
echo Updating... $DL_DIR
|
||||
cd $DL_DIR || { echo "could not enter $DL_DIR directory"; exit 1; }
|
||||
|
||||
sudo mkdir -p 2_backup
|
||||
sudo cp -- *.txt 2_backup
|
||||
# Define the URL of the IEEE OUI file
|
||||
IEEE_OUI_URL="http://standards-oui.ieee.org/oui/oui.txt"
|
||||
|
||||
# Update from /usb/lib/ieee-data
|
||||
sudo get-iab -v
|
||||
sudo get-oui -v
|
||||
# Download the file using wget
|
||||
wget "$IEEE_OUI_URL" -O ieee-oui_dl.txt
|
||||
|
||||
# make files readable
|
||||
sudo chmod +r /usr/share/arp-scan/ieee-oui.txt
|
||||
# Filter lines containing "(base 16)" and remove the "(base 16)" string
|
||||
grep "(base 16)" ieee-oui_dl.txt | sed 's/ *(base 16)//' > ieee-oui_new.txt
|
||||
|
||||
# Update from ieee website
|
||||
# sudo get-iab -v -u http://standards-oui.ieee.org/iab/iab.txt
|
||||
# sudo get-oui -v -u http://standards-oui.ieee.org/oui/oui.txt
|
||||
# Combine ieee-oui_new.txt and ieee-oui.txt, and extract unique MAC start values along with vendor names
|
||||
|
||||
# Update from ieee website develop
|
||||
# sudo get-iab -v -u http://standards.ieee.org/develop/regauth/iab/iab.txt
|
||||
# sudo get-oui -v -u http://standards.ieee.org/develop/regauth/oui/oui.txt
|
||||
cat ieee-oui.txt ieee-oui_new.txt >> ieee-oui_all.txt
|
||||
sort ieee-oui_all.txt > ieee-oui_all_sort.txt
|
||||
awk '{$1=$1; print}' ieee-oui_all_sort.txt | sort -u > ieee-oui_all_filtered.txt
|
||||
|
||||
# Update from Sanitized oui (linuxnet.ca)
|
||||
# sudo get-oui -v -u https://linuxnet.ca/ieee/oui.txt
|
||||
|
||||
|
||||
@@ -12,11 +12,9 @@ services:
|
||||
# restart: unless-stopped
|
||||
volumes:
|
||||
# - ${APP_DATA_LOCATION}/netalertx_dev/config:/app/config
|
||||
# - ${APP_DATA_LOCATION}/netalertx/config:/app/config
|
||||
- ${APP_DATA_LOCATION}/netalertx/config:/home/pi/pialert/config
|
||||
- ${APP_DATA_LOCATION}/netalertx/config:/app/config
|
||||
# - ${APP_DATA_LOCATION}/netalertx_dev/db:/app/db
|
||||
# - ${APP_DATA_LOCATION}/netalertx/db:/app/db
|
||||
- ${APP_DATA_LOCATION}/netalertx/db:/home/pi/pialert/db
|
||||
- ${APP_DATA_LOCATION}/netalertx/db:/app/db
|
||||
# (optional) useful for debugging if you have issues setting up the container
|
||||
# - ${LOGS_LOCATION}:/app/front/log
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -33,7 +31,7 @@ services:
|
||||
- ${DEV_LOCATION}/front/css:/app/front/css
|
||||
- ${DEV_LOCATION}/front/img:/app/front/img
|
||||
- ${DEV_LOCATION}/back/update_vendors.sh:/app/back/update_vendors.sh
|
||||
- ${DEV_LOCATION}/front/lib/AdminLTE:/app/front/lib/AdminLTE
|
||||
- ${DEV_LOCATION}/front/lib:/app/front/lib
|
||||
- ${DEV_LOCATION}/front/js:/app/front/js
|
||||
- ${DEV_LOCATION}/install/start.debian.sh:/app/install/start.debian.sh
|
||||
- ${DEV_LOCATION}/install/user-mapping.debian.sh:/app/install/user-mapping.debian.sh
|
||||
|
||||
@@ -9,11 +9,8 @@
|
||||
| 🐳 [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) |
|
||||
|----------------------|----------------------| ----------------------| ----------------------|
|
||||
|
||||
<a href="https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/devices_split.png" target="_blank">
|
||||
<img src="https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/devices_split.png" width="300px" />
|
||||
</a>
|
||||
<a href="https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/network.png" target="_blank">
|
||||
<img src="https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/network.png" width="300px" />
|
||||
<a href="https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/GENERAL/github_social_image.jpg" target="_blank">
|
||||
<img src="https://raw.githubusercontent.com/jokob-sk/NetAlertX/main/docs/img/GENERAL/github_social_image.jpg" width="1000px" />
|
||||
</a>
|
||||
|
||||
> [!NOTE]
|
||||
@@ -21,7 +18,8 @@
|
||||
|
||||
## 📕 Basic Usage
|
||||
|
||||
- You will have to run the container on the `host` network, e.g:
|
||||
> [!WARNING]
|
||||
> You will have to run the container on the `host` network.
|
||||
|
||||
```yaml
|
||||
docker run -d --rm --network=host \
|
||||
@@ -66,26 +64,16 @@ docker run -d --rm --network=host \
|
||||
- You can modify [app.conf](https://github.com/jokob-sk/NetAlertX/tree/main/config) directly, if needed.
|
||||
- If unavailable, the app generates a default `app.conf` and `app.db` file on the first run.
|
||||
|
||||
#### Important settings
|
||||
### ⚙ Important settings
|
||||
|
||||
These are the most important settings to get at least some output in your Devices screen. Usually, only one approach is used, but you should be able to combine these approaches.
|
||||
These are the most important settings to get at least some output in your Devices screen. Usually, only one approach is used, but you can combine these approaches.
|
||||
|
||||
##### For arp-scan: ARPSCAN_RUN, SCAN_SUBNETS
|
||||
| Scan method | Setting | Description |
|
||||
| :------------- | :------------- | :-------------|
|
||||
| arp-scan, nmap-scan | `SCAN_SUBNETS` | See the documentation on how [to setup SUBNETS, VLANs & limitations](https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md) |
|
||||
| PiHole | `PIHOLE_RUN` | There are 2 approaches how to get PiHole devices imported. Via the PiHole import (`PIHOLE`) plugin or DHCP leases (`DHCPLSS`) plugin. The `PIHOLE` plugin requires you to map the PiHole database, as mentioned above. |
|
||||
| dhcp.leases | `DHCPLSS_RUN` | You need to map `:/etc/myfiles/dhcp.leases` in the `docker-compose.yml` file if you enable this setting. This path has to be matched with a corresponding `DHCPLSS_paths_to_check` setting entry (check the [DHCPLSS plugin readme](https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/dhcp_leases#overview) for details). |
|
||||
|
||||
- ❗ To use the arp-scan method, you need to set the `SCAN_SUBNETS` variable. See the documentation on how [to setup SUBNETS, VLANs & limitations](https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md)
|
||||
|
||||
##### For pihole: PIHOLE_RUN, DHCPLSS_RUN
|
||||
|
||||
There are 2 approaches how to get PiHole devices imported. Via the PiHole import (PIHOLE) plugin or DHCP leases (DHCPLSS) plugin.
|
||||
|
||||
**PiHole (Device sync)**
|
||||
|
||||
* `PIHOLE_RUN`: You need to map `:/etc/pihole/pihole-FTL.db` in the `docker-compose.yml` file if you enable this setting.
|
||||
|
||||
**DHCP Leases (Device import)**
|
||||
|
||||
* `DHCPLSS_RUN`: You need to map `:/etc/pihole/dhcp.leases` in the `docker-compose.yml` file if you enable this setting.
|
||||
* The above setting has to be matched with a corresponding `DHCPLSS_paths_to_check` setting entry (the path in the container must contain `pihole` as PiHole uses a different format of the `dhcp.leases` file).
|
||||
|
||||
> [!NOTE]
|
||||
> It's recommended to use the same schedule interval for all plugins responsible for discovering new devices.
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
# Migration form PiAlert to NetAlertX
|
||||
|
||||
> [!WARNING]
|
||||
> Follow this guide only after you you downloaded and started NetAlert X at least once after previously using the PiAlert image.
|
||||
|
||||
> [!TIP]
|
||||
> In short: The application will auto-migrate the database, config, and all device information. A ticker message on top will be displayed until you update your docker mount points. Even so, it's always good to have a [backup strategy](https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md) in place.
|
||||
|
||||
@@ -22,7 +25,19 @@ The migration should be pretty straightforward. The application installation fol
|
||||
> [!NOTE]
|
||||
> The application uses symlinks linking the old db and config locations to the new ones, so data loss should not occur. [Backup strategies](https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md) are still recommended to backup your setup.
|
||||
|
||||
In summary, docker file mount locations in your `docker-compose.yml` or docker run command have changed. Examples follow.
|
||||
In summary:
|
||||
|
||||
1. Docker file mount locations in your `docker-compose.yml` or docker run command have changed.
|
||||
2. Backup your current config and database (optional `devices.csv` to have a backup)
|
||||
3. Rename them to `app.db` `app.conf`
|
||||
4. Update the volume mappings in your `docker-compose.yaml`
|
||||
5. Place the renamed files into the above locations.
|
||||
|
||||
|
||||
> [!TIP]
|
||||
> If you have troubles accessing past backups, config or database files you can copy them into the newly mapped directories, for example by running this command in the container: `cp -r /app/config /home/pi/pialert/config/old_backup_files`. This should create a folder in the `config` directory called `old_backup_files` conatining all the files in that location. Another approach is to map the old location and the new one at the same time to copy things over.
|
||||
|
||||
Examples follow.
|
||||
|
||||
|
||||
## Example 1: Mapping folders
|
||||
|
||||
53
docs/NOTIFICATIONS.md
Executable file
53
docs/NOTIFICATIONS.md
Executable file
@@ -0,0 +1,53 @@
|
||||
# Notifications 📧
|
||||
|
||||
There are 4 ways how to influence notifications:
|
||||
|
||||
1. On the device itself
|
||||
2. On the settings of the plugin
|
||||
3. Globally
|
||||
4. Ignoring devices
|
||||
|
||||
> [!NOTE]
|
||||
> 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 💻
|
||||
|
||||

|
||||
|
||||
There are 4 settings on the device for influencing notifications. You can:
|
||||
|
||||
1. Completely disable the scanning of the device
|
||||
2. **Alert all events**, connections, disconnections, IP changes (noisy, usually not recommended)
|
||||
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.
|
||||
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 🔌
|
||||
|
||||

|
||||
|
||||
On almost all plugins there are 2 core settings, `<plugin>_WATCH` and `<plugin>_REPORT_ON`.
|
||||
|
||||
1. `<plugin>_WATCH` specifies the columns which the app should watch. If watched columns change the device state is considered changed. This changed status is then used to decide to send out notifications based on the `<plugin>_REPORT_ON` setting.
|
||||
2. `<plugin>_REPORT_ON` let's you specify on which events the app should notify you. This is related to the `<plugin>_WATCH` setting. So if you select `watched-changed` and in `<plugin>_WATCH` you only select `Watched_Value1`, then a notification is triggered if `Watched_Value1` is changed from the previous value, but no notification is send if `Watched_Value2` changes.
|
||||
|
||||
## Global settings ⚙
|
||||
|
||||

|
||||
|
||||
In the Notification Processing section, 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.
|
||||
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.
|
||||
4. A filter to allow you to set device-specific exceptions to generated Events.
|
||||
|
||||
## Ignoring devices 🔕
|
||||
|
||||

|
||||
|
||||
You can completely ignore detected devices globally. This could be because your instance detects docker containers, you want to ignore devices from a specific manufacturer via MAC rules or you want to ignore devices on a specific IP range.
|
||||
|
||||
1. Ignored MACs (`NEWDEV_ignored_MACs`) - List of MACs to ignore.
|
||||
2. Ignored IPs (`NEWDEV_ignored_MACs`) - List of IPs to ignore.
|
||||
@@ -30,6 +30,7 @@ There is also an in-app Help / FAQ section that should be answering frequently a
|
||||
- [Subnets and VLANs configuration for arp-scan](/docs/SUBNETS.md)
|
||||
- [SMTP server config](/docs/SMTP.md)
|
||||
- [Custom Icon configuration and support](/docs/ICONS.md)
|
||||
- [Notifications](/docs/NOTIFICATIONS.md)
|
||||
- [Better name resolution with Reverse DNS](/docs/REVERSE_DNS.md)
|
||||
- [Network treemap configuration](/docs/NETWORK_TREE.md)
|
||||
- [Backups](/docs/BACKUPS.md)
|
||||
|
||||
@@ -11,9 +11,9 @@ You need to specify the network interface and the network mask. You can also con
|
||||
> 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.
|
||||
> 
|
||||
|
||||
* Examples for one and two subnets (❗ Note the `['...', '...']` format):
|
||||
* Examples for one and two subnets (❗ Note the `['...','...']` format):
|
||||
* 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']`
|
||||
|
||||
|
||||
## Explanation
|
||||
|
||||
BIN
docs/img/GENERAL/github_social_image.jpg
Executable file
BIN
docs/img/GENERAL/github_social_image.jpg
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 292 KiB |
BIN
docs/img/NOTIFICATIONS/Device-notification-settings.png
Executable file
BIN
docs/img/NOTIFICATIONS/Device-notification-settings.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 110 KiB |
BIN
docs/img/NOTIFICATIONS/Global-notification-settings.png
Executable file
BIN
docs/img/NOTIFICATIONS/Global-notification-settings.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 70 KiB |
BIN
docs/img/NOTIFICATIONS/NEWDEV_ignores.png
Executable file
BIN
docs/img/NOTIFICATIONS/NEWDEV_ignores.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 58 KiB |
BIN
docs/img/NOTIFICATIONS/Plugin-notification-settings.png
Executable file
BIN
docs/img/NOTIFICATIONS/Plugin-notification-settings.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 122 KiB |
BIN
docs/img/NOTIFICATIONS/Schedules_out-of-sync.png
Executable file
BIN
docs/img/NOTIFICATIONS/Schedules_out-of-sync.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 45 KiB |
@@ -718,6 +718,11 @@ height: 50px;
|
||||
}
|
||||
}
|
||||
|
||||
.settingswrap
|
||||
{
|
||||
margin-bottom: 100px;
|
||||
}
|
||||
|
||||
.settingswrap .metadata
|
||||
{
|
||||
display: none;
|
||||
@@ -728,6 +733,11 @@ height: 50px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.padding-bottom
|
||||
{
|
||||
padding-bottom: 100px;
|
||||
}
|
||||
|
||||
.settings-group
|
||||
{
|
||||
font-size: 20px;
|
||||
@@ -820,7 +830,28 @@ height: 50px;
|
||||
|
||||
#settingsPage .overview-setting-value{
|
||||
display:unset;
|
||||
|
||||
}
|
||||
|
||||
.overview-setting-value-wrap
|
||||
{
|
||||
padding-left: 1px;
|
||||
text-overflow: clip ;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#settingsPage .small-box
|
||||
{
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
#settingsPage .small-box .inner
|
||||
{
|
||||
padding-left: 0px;
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
#settingsPage .panel-title{
|
||||
/* display: inline-block; */
|
||||
/* width: 120px; */
|
||||
@@ -829,6 +860,17 @@ height: 50px;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.padding-5px
|
||||
{
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.text-overflow-hidden
|
||||
{
|
||||
overflow: hidden;
|
||||
text-overflow: clip;
|
||||
}
|
||||
|
||||
|
||||
.settings_content {
|
||||
padding: 10px;
|
||||
@@ -875,6 +917,79 @@ input[readonly] {
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.interactable-option:hover::before {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.interactable-option::before {
|
||||
content: '1x 📝 | 2x 🚮';
|
||||
position: sticky;
|
||||
right: 0px;
|
||||
top: 0;
|
||||
color: white;
|
||||
float: right;
|
||||
background-color: rgb(0, 0, 0);
|
||||
transition: opacity 0.5s;
|
||||
opacity: 0.1;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.interactable-option:hover {
|
||||
transition: background-color 2s;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.settingsImportedTimestamp
|
||||
{
|
||||
padding: 25px;
|
||||
}
|
||||
|
||||
.settingsSearchWrap
|
||||
{
|
||||
padding:10px;
|
||||
}
|
||||
|
||||
.settings-sticky-bottom-section {
|
||||
position: fixed;
|
||||
z-index: 999;
|
||||
background-color: #5B5B66;
|
||||
/* opacity: 0.8; */
|
||||
bottom: 30px;
|
||||
border-radius: 5px;
|
||||
margin:1px;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: inherit;
|
||||
width: 87%;
|
||||
}
|
||||
|
||||
.settings-sticky-bottom-section:hover {
|
||||
border-color: #258744;
|
||||
}
|
||||
|
||||
.clear-filter
|
||||
{
|
||||
opacity: 0.5;
|
||||
cursor: pointer;
|
||||
width: 14px;
|
||||
position: absolute;
|
||||
right: -6px;
|
||||
top: 6px;
|
||||
|
||||
}
|
||||
|
||||
.clear-filter:hover
|
||||
{
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.saveSettingsWrapper button
|
||||
{
|
||||
width:70%;
|
||||
margin-top:20px;
|
||||
margin-left:15%;
|
||||
margin-bottom:20px;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------- */
|
||||
/* Devices page */
|
||||
@@ -942,11 +1057,23 @@ input[readonly] {
|
||||
height: 1.5em !important;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------- */
|
||||
/* MODAL popups */
|
||||
/* ----------------------------------------------------------------- */
|
||||
|
||||
#modal-input-textarea
|
||||
{
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.modal-field-input
|
||||
{
|
||||
margin: 4%;
|
||||
width: 92%;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------- */
|
||||
/* NETWORK page */
|
||||
|
||||
@@ -17,9 +17,10 @@ html {
|
||||
background-color: #353c42;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #353c42;
|
||||
color: #bec5cb;
|
||||
body, .bg-yellow, .callout.callout-warning, .alert-warning, .label-warning, .modal-warning .modal-body {
|
||||
|
||||
background-color: #353c42 !important;
|
||||
color: #bec5cb !important;
|
||||
}
|
||||
h4 {
|
||||
color: #44def1;
|
||||
|
||||
@@ -627,8 +627,8 @@
|
||||
<script src="lib/AdminLTE/bower_components/fullcalendar/dist/fullcalendar.min.js"></script>
|
||||
<script src="lib/AdminLTE/bower_components/fullcalendar/dist/locale-all.js"></script>
|
||||
<!-- ----------------------------------------------------------------------- -->
|
||||
<script src="js/ui_components.js"></script>
|
||||
<script src="js/db_methods.js"></script>
|
||||
|
||||
<script src="js/db_methods.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
||||
<!-- ----------------------------------------------------------------------- -->
|
||||
|
||||
<!-- Dark-Mode Patch -->
|
||||
@@ -1443,15 +1443,15 @@ function setDeviceData (direction='', refreshCallback='') {
|
||||
|
||||
// update data to server
|
||||
$.get('php/server/devices.php?action=setDeviceData&mac='+ mac
|
||||
+ '&name=' + $('#txtName').val()
|
||||
+ '&owner=' + $('#txtOwner').val()
|
||||
+ '&name=' + encodeURIComponent($('#txtName').val())
|
||||
+ '&owner=' + encodeURIComponent($('#txtOwner').val())
|
||||
+ '&type=' + $('#txtDeviceType').val()
|
||||
+ '&vendor=' + $('#txtVendor').val()
|
||||
+ '&vendor=' + encodeURIComponent($('#txtVendor').val())
|
||||
+ '&icon=' + encodeURIComponent($('#txtIcon').val())
|
||||
+ '&favorite=' + ($('#chkFavorite')[0].checked * 1)
|
||||
+ '&group=' + $('#txtGroup').val()
|
||||
+ '&location=' + $('#txtLocation').val()
|
||||
+ '&comments=' + $('#txtComments').val()
|
||||
+ '&group=' + encodeURIComponent($('#txtGroup').val())
|
||||
+ '&location=' + encodeURIComponent($('#txtLocation').val())
|
||||
+ '&comments=' + encodeURIComponent($('#txtComments').val())
|
||||
+ '&networknode=' + $('#txtNetworkNodeMac').attr('data-mynodemac')
|
||||
+ '&networknodeport=' + $('#txtNetworkPort').val()
|
||||
+ '&staticIP=' + ($('#chkStaticIP')[0].checked * 1)
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
checkPermissions([$dbPath, $confPath]);
|
||||
?>
|
||||
|
||||
<script src="js/ui_components.js"></script>
|
||||
|
||||
<!-- Page ------------------------------------------------------------------ -->
|
||||
<div class="content-wrapper">
|
||||
@@ -127,7 +126,7 @@
|
||||
</div>
|
||||
<div class="box-body">
|
||||
<div class="chart">
|
||||
<script src="lib/AdminLTE/bower_components/chart.js/Chart.js"></script>
|
||||
<script src="lib/AdminLTE/bower_components/chart.js/Chart.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
||||
<canvas id="OnlineChart" style="width:100%; height: 150px; margin-bottom: 15px;"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
@@ -251,7 +250,11 @@ function main () {
|
||||
handleLoadingDialog()
|
||||
|
||||
// Hide UI elements as per settings
|
||||
hideUIelements("UI_DEV_SECTIONS")
|
||||
// setTimeout(() => {
|
||||
hideUIelements("UI_DEV_SECTIONS")
|
||||
|
||||
// }, 10);
|
||||
|
||||
|
||||
// get from cookie if available (need to use decodeURI as saved as part of URI in PHP)
|
||||
cookieColumnsVisibleStr = decodeURI(getCookie("Front_Devices_Columns_Visible")).replaceAll('%2C',',')
|
||||
|
||||
@@ -78,7 +78,7 @@ if (isset ($_SESSION["login"]) == FALSE || $_SESSION["login"] != 1)
|
||||
<meta http-equiv="Pragma" content="no-cache" />
|
||||
<meta http-equiv="Expires" content="0" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<title>Pi-Alert | Log in</title>
|
||||
<title>Net Alert X | Log in</title>
|
||||
<!-- 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">
|
||||
<!-- Bootstrap 3.3.7 -->
|
||||
@@ -147,7 +147,6 @@ if ($ENABLED_DARKMODE === True) {
|
||||
<button type="button" class="close" data-dismiss="alert" aria-hidden="true"><3E></button>
|
||||
<h4><i class="icon fa <?php echo $login_icon;?>"></i><?php echo $login_headline;?></h4>
|
||||
<p><?php echo $login_info;?></p>
|
||||
<p><?= lang('Login_Psw_run');?><br><span style="border: solid 1px yellow; padding: 2px;"> /app/back/pialert-cli set_password <?= lang('Login_Psw_new');?></span><br><?= lang('Login_Psw_folder');?></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
var timerRefreshData = ''
|
||||
var modalCallbackFunction = '';
|
||||
|
||||
var emptyArr = ['undefined', "", undefined, null, 'null'];
|
||||
var UI_LANG = "English";
|
||||
var settingsJSON = {}
|
||||
@@ -201,7 +201,7 @@ function cacheStrings()
|
||||
if(!getCache('completedCalls').includes('cacheStrings'))
|
||||
{
|
||||
// handle core strings and translations
|
||||
var allLanguages = ["en_us", "es_es", "de_de", "fr_fr", "it_it", "ru_ru", "nb_no"]; // needs to be same as in lang.php
|
||||
var allLanguages = ["en_us", "es_es", "de_de", "fr_fr", "it_it", "ru_ru", "nb_no", "pl_pl", "zh_cn"]; // needs to be same as in lang.php
|
||||
|
||||
allLanguages.forEach(function (language_code) {
|
||||
$.get(`php/templates/language/${language_code}.json?nocache=${Date.now()}`, function (res) {
|
||||
@@ -230,7 +230,7 @@ function cacheStrings()
|
||||
// Get translated language string
|
||||
function getString (key) {
|
||||
|
||||
// handle initial laod to make sure everything is set-up and cached
|
||||
// handle initial load to make sure everything is set-up and cached
|
||||
handleFirstLoad(getString)
|
||||
|
||||
UI_LANG = getSetting("UI_LANG");
|
||||
@@ -254,12 +254,21 @@ function getString (key) {
|
||||
case 'Norwegian':
|
||||
lang_code = 'nb_no';
|
||||
break;
|
||||
case 'Polish':
|
||||
lang_code = 'pl_pl';
|
||||
break;
|
||||
case 'Portuguese (Brazil)':
|
||||
lang_code = 'pt_br';
|
||||
break;
|
||||
case 'Italian':
|
||||
lang_code = 'it_it';
|
||||
break;
|
||||
case 'Russian':
|
||||
lang_code = 'ru_ru';
|
||||
break;
|
||||
case 'Chinese (zh_cn)':
|
||||
lang_code = 'zh_cn';
|
||||
break;
|
||||
}
|
||||
result = getCache(`pia_lang_${key}_${lang_code}`, true);
|
||||
|
||||
@@ -272,162 +281,7 @@ function getString (key) {
|
||||
return result;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Modal dialog handling
|
||||
// -----------------------------------------------------------------------------
|
||||
function showModalOK (title, message, callbackFunction) {
|
||||
showModalOk (title, message, callbackFunction)
|
||||
}
|
||||
function showModalOk (title, message, callbackFunction) {
|
||||
// set captions
|
||||
$('#modal-ok-title').html (title);
|
||||
$('#modal-ok-message').html (message);
|
||||
|
||||
if(callbackFunction!= null)
|
||||
{
|
||||
$("#modal-ok-OK").click(function()
|
||||
{
|
||||
callbackFunction()
|
||||
});
|
||||
}
|
||||
|
||||
// Show modal
|
||||
$('#modal-ok').modal('show');
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function showModalDefault (title, message, btnCancel, btnOK, callbackFunction) {
|
||||
// set captions
|
||||
$('#modal-default-title').html (title);
|
||||
$('#modal-default-message').html (message);
|
||||
$('#modal-default-cancel').html (btnCancel);
|
||||
$('#modal-default-OK').html (btnOK);
|
||||
modalCallbackFunction = callbackFunction;
|
||||
|
||||
// Show modal
|
||||
$('#modal-default').modal('show');
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
function showModalDefaultStrParam (title, message, btnCancel, btnOK, callbackFunction, param='') {
|
||||
// set captions
|
||||
$('#modal-str-title').html (title);
|
||||
$('#modal-str-message').html (message);
|
||||
$('#modal-str-cancel').html (btnCancel);
|
||||
$('#modal-str-OK').html (btnOK);
|
||||
$("#modal-str-OK").off("click"); //remove existing handlers
|
||||
$('#modal-str-OK').on('click', function (){
|
||||
$('#modal-str').modal('hide');
|
||||
callbackFunction(param)
|
||||
})
|
||||
|
||||
// Show modal
|
||||
$('#modal-str').modal('show');
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function showModalWarning (title, message, btnCancel=getString('Gen_Cancel'), btnOK=getString('Gen_Okay'), callbackFunction=null) {
|
||||
// set captions
|
||||
$('#modal-warning-title').html (title);
|
||||
$('#modal-warning-message').html (message);
|
||||
$('#modal-warning-cancel').html (btnCancel);
|
||||
$('#modal-warning-OK').html (btnOK);
|
||||
|
||||
if ( callbackFunction != null)
|
||||
{
|
||||
modalCallbackFunction = callbackFunction;
|
||||
}
|
||||
|
||||
// Show modal
|
||||
$('#modal-warning').modal('show');
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function showModalInput (title, message, btnCancel=getString('Gen_Cancel'), btnOK=getString('Gen_Okay'), callbackFunction=null) {
|
||||
// set captions
|
||||
$('#modal-input-title').html (title);
|
||||
$('#modal-input-message').html (message);
|
||||
$('#modal-input-cancel').html (btnCancel);
|
||||
$('#modal-input-OK').html (btnOK);
|
||||
|
||||
if ( callbackFunction != null)
|
||||
{
|
||||
modalCallbackFunction = callbackFunction;
|
||||
}
|
||||
|
||||
// Show modal
|
||||
$('#modal-input').modal('show');
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function modalDefaultOK () {
|
||||
// Hide modal
|
||||
$('#modal-default').modal('hide');
|
||||
|
||||
// timer to execute function
|
||||
window.setTimeout( function() {
|
||||
window[modalCallbackFunction]();
|
||||
}, 100);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function modalDefaultInput () {
|
||||
// Hide modal
|
||||
$('#modal-input').modal('hide');
|
||||
|
||||
// timer to execute function
|
||||
window.setTimeout( function() {
|
||||
window[modalCallbackFunction]();
|
||||
}, 100);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function modalWarningOK () {
|
||||
// Hide modal
|
||||
$('#modal-warning').modal('hide');
|
||||
|
||||
// timer to execute function
|
||||
window.setTimeout( function() {
|
||||
window[modalCallbackFunction]();
|
||||
}, 100);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function showMessage (textMessage="") {
|
||||
if (textMessage.toLowerCase().includes("error") ) {
|
||||
// show error
|
||||
alert (textMessage);
|
||||
} else {
|
||||
// show temporal notification
|
||||
$("#alert-message").html (textMessage);
|
||||
$("#notification").fadeIn(1, function () {
|
||||
window.setTimeout( function() {
|
||||
$("#notification").fadeOut(500)
|
||||
}, 3000);
|
||||
} );
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function showTickerAnnouncement(textMessage = "") {
|
||||
if (textMessage.toLowerCase().includes("error")) {
|
||||
// show error
|
||||
alert(textMessage);
|
||||
} else {
|
||||
// show permanent notification
|
||||
$("#ticker-message").html(textMessage);
|
||||
$("#tickerAnnouncement").removeClass("myhidden");
|
||||
// Move the tickerAnnouncement element to ticker_announcement_plc
|
||||
$("#tickerAnnouncement").appendTo("#ticker_announcement_plc");
|
||||
|
||||
// var $ticker = $('#tickerAnnouncement');
|
||||
// var $tickerMessage = $('#ticker-message');
|
||||
|
||||
// Clone the ticker message to create continuous scrolling effect
|
||||
// $tickerMessage.clone().appendTo($ticker);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
@@ -709,6 +563,22 @@ function debugTimer () {
|
||||
$('#pageTitle').html (new Date().getSeconds());
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function secondsSincePageLoad() {
|
||||
// Get the current time
|
||||
var currentTime = Date.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
|
||||
var secondsAgo = Math.floor(timeDifference / 1000);
|
||||
|
||||
return secondsAgo;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Open url in new tab
|
||||
@@ -1013,6 +883,15 @@ function getGuid() {
|
||||
// -----------------------------------------------------------------------------
|
||||
function showSpinner(stringKey='Loading')
|
||||
{
|
||||
|
||||
if(stringKey == "")
|
||||
{
|
||||
text = ''
|
||||
} else
|
||||
{
|
||||
text = getString(stringKey)
|
||||
}
|
||||
|
||||
if($("#loadingSpinner").length)
|
||||
{
|
||||
$("#loadingSpinner").show();
|
||||
@@ -1024,7 +903,7 @@ function showSpinner(stringKey='Loading')
|
||||
<div class="pa_semitransparent-panel"></div>
|
||||
<div class="panel panel-default pa_spinner">
|
||||
<table>
|
||||
<td width="130px" align="middle">${getString(stringKey)}</td>
|
||||
<td width="130px" align="middle">${text}</td>
|
||||
<td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></td>
|
||||
</table>
|
||||
</div>
|
||||
@@ -1183,155 +1062,129 @@ function arraysContainSameValues(arr1, arr2) {
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
// Define a unique key for storing the flag in sessionStorage
|
||||
var sessionStorageKey = "myScriptExecuted_common_js";
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Clearing all the caches
|
||||
function clearCache()
|
||||
{
|
||||
showSpinner()
|
||||
resetInitializedFlag()
|
||||
window.location.reload()
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function resetInitializedFlag()
|
||||
{
|
||||
// Clear local storage
|
||||
localStorage.clear();
|
||||
// Set the flag in sessionStorage to indicate that the code and cahce needs to be reloaded
|
||||
sessionStorage.setItem(sessionStorageKey, "false");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// check if cache needs to be refreshed because of setting changes
|
||||
$.get('api/app_state.json?nocache=' + Date.now(), function(appState) {
|
||||
|
||||
console.log(appState["settingsImported"]*1000)
|
||||
|
||||
importedMiliseconds = parseInt((appState["settingsImported"]*1000));
|
||||
|
||||
lastReloaded = parseInt(sessionStorage.getItem(sessionStorageKey + '_time'));
|
||||
|
||||
if(importedMiliseconds > lastReloaded)
|
||||
{
|
||||
console.log("Cache needs to be refreshed because of setting changes");
|
||||
setTimeout(() => {
|
||||
resetInitializedFlag()
|
||||
location.reload();
|
||||
|
||||
}, 500);
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Display spinner and reload page if not yet initialized
|
||||
function handleFirstLoad(callback)
|
||||
{
|
||||
if(!app_common_init)
|
||||
{
|
||||
setTimeout(function() {
|
||||
|
||||
callback();
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Check if the code has been executed before by checking sessionStorage
|
||||
var app_common_init = sessionStorage.getItem(sessionStorageKey) === "true";
|
||||
const sessionStorageKey = "myScriptExecuted_common_js";
|
||||
var completedCalls = []
|
||||
var completedCalls_final = ['cacheSettings', 'cacheStrings', 'cacheDevices'];
|
||||
|
||||
// Define a function that will execute the code only once
|
||||
function executeOnce() {
|
||||
// -----------------------------------------------------------------------------
|
||||
// Clearing all the caches
|
||||
function clearCache() {
|
||||
showSpinner();
|
||||
sessionStorage.clear();
|
||||
localStorage.clear();
|
||||
window.location.reload();
|
||||
}
|
||||
|
||||
if (!arraysContainSameValues(getCache(completedCalls), completedCalls_final)) {
|
||||
// -----------------------------------------------------------------------------
|
||||
// Function to check if cache needs to be refreshed because of setting changes
|
||||
function checkSettingChanges() {
|
||||
$.get('api/app_state.json?nocache=' + Date.now(), function(appState) {
|
||||
const importedMilliseconds = parseInt(appState["settingsImported"] * 1000);
|
||||
const lastReloaded = parseInt(sessionStorage.getItem(sessionStorageKey + '_time'));
|
||||
|
||||
showSpinner()
|
||||
|
||||
// Use cache to keep track of completed AJAX calls
|
||||
var tmp_completedCalls = getCache("completedCalls")
|
||||
|
||||
// initialize from cache if values present
|
||||
if(tmp_completedCalls != "")
|
||||
{
|
||||
completedCalls = tmp_completedCalls.split(',');
|
||||
if (importedMilliseconds > lastReloaded) {
|
||||
console.log("Cache needs to be refreshed because of setting changes");
|
||||
setTimeout(() => {
|
||||
clearCache();
|
||||
}, 500);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// cache everything in the right order
|
||||
cacheStrings()
|
||||
.then(cacheSettings)
|
||||
.then(cacheDevices)
|
||||
.then(() => {
|
||||
// All callbacks have completed
|
||||
console.log("✅ All AJAX callbacks have completed");
|
||||
// location.reload()
|
||||
onAllCallsComplete();
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Error:", error);
|
||||
});
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Display spinner and reload page if not yet initialized
|
||||
async function handleFirstLoad(callback) {
|
||||
if (!isAppInitialized()) {
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
callback();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Check if the code has been executed before by checking sessionStorage
|
||||
function isAppInitialized() {
|
||||
return arraysContainSameValues(getCache("completedCalls").split(',').filter(Boolean), completedCalls_final);
|
||||
}
|
||||
|
||||
// Define a function that will execute the code only once
|
||||
async function executeOnce() {
|
||||
showSpinner();
|
||||
|
||||
if (!isAppInitialized()) {
|
||||
try {
|
||||
await cacheStrings();
|
||||
await cacheSettings();
|
||||
await cacheDevices();
|
||||
console.log("✅ All AJAX callbacks have completed");
|
||||
onAllCallsComplete();
|
||||
} catch (error) {
|
||||
console.error("Error:", error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Function to handle successful completion of an AJAX call
|
||||
const handleSuccess = (callName) => {
|
||||
console.log(`AJAX call successful: ${callName} `);
|
||||
// store completed call
|
||||
completedCalls.push(callName)
|
||||
|
||||
setCache('completedCalls', mergeUniqueArrays(getCache('completedCalls').split(','), [callName]))
|
||||
|
||||
console.log(`AJAX call successful: ${callName}`);
|
||||
completedCalls.push(callName);
|
||||
setCache('completedCalls', mergeUniqueArrays(getCache('completedCalls').split(','), [callName]));
|
||||
};
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Function to handle failure of an AJAX call
|
||||
const handleFailure = (callName, callback) => {
|
||||
// Handle AJAX call failure here
|
||||
console.error(`AJAX call ${callName} failed`);
|
||||
|
||||
// try until successful
|
||||
// callback()
|
||||
// Implement retry logic here if needed
|
||||
};
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Function to execute when all AJAX calls have completed
|
||||
const onAllCallsComplete = () => {
|
||||
|
||||
// Merge local completedCalls with completedCalls_cached array - ensure uniqueness
|
||||
// if cache contains values, merge those two arrays
|
||||
completedCalls = mergeUniqueArrays(getCache('completedCalls').split(','), completedCalls)
|
||||
|
||||
// Update cache with merged completedCalls
|
||||
completedCalls = mergeUniqueArrays(getCache('completedCalls').split(','), completedCalls);
|
||||
setCache('completedCalls', completedCalls);
|
||||
|
||||
// Set the flag in sessionStorage to indicate that the code has been executed
|
||||
// and save time when last time the page was initialized
|
||||
sessionStorage.setItem(sessionStorageKey, "true");
|
||||
const millisecondsNow = Date.now();
|
||||
sessionStorage.setItem(sessionStorageKey + '_time', millisecondsNow);
|
||||
// Check if all necessary strings are initialized
|
||||
if (areAllStringsInitialized()) {
|
||||
sessionStorage.setItem(sessionStorageKey, "true");
|
||||
const millisecondsNow = Date.now();
|
||||
sessionStorage.setItem(sessionStorageKey + '_time', millisecondsNow);
|
||||
|
||||
console.log('✔ Cache intialized');
|
||||
console.log('✔ Cache initialized');
|
||||
} else {
|
||||
// If not all strings are initialized, retry initialization
|
||||
console.log('❌ Not all strings are initialized. Retrying...');
|
||||
executeOnce();
|
||||
return;
|
||||
}
|
||||
|
||||
// Call any other initialization functions here if needed
|
||||
|
||||
// No need for location.reload() here
|
||||
};
|
||||
|
||||
// Function to check if all necessary strings are initialized
|
||||
const areAllStringsInitialized = () => {
|
||||
// Implement logic to check if all necessary strings are initialized
|
||||
// Return true if all strings are initialized, false otherwise
|
||||
return getString('UI_LANG') != ""
|
||||
};
|
||||
|
||||
// Call the function to execute the code
|
||||
executeOnce();
|
||||
|
||||
// Set timer for page refresh if configured
|
||||
// Set timer for regular checks
|
||||
setTimeout(() => {
|
||||
|
||||
// page refresh if configured
|
||||
const refreshTime = getSetting("UI_REFRESH");
|
||||
if (refreshTime && refreshTime !== "0" && refreshTime !== "") {
|
||||
newTimerRefreshData(clearCache, parseInt(refreshTime)*1000);
|
||||
}
|
||||
|
||||
// Check if page needs to refresh due to setting changes
|
||||
checkSettingChanges()
|
||||
|
||||
}, 10000);
|
||||
|
||||
|
||||
@@ -1342,3 +1195,4 @@ console.log("init common.js");
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
235
front/js/modal.js
Executable file
235
front/js/modal.js
Executable file
@@ -0,0 +1,235 @@
|
||||
// -----------------------------------------------------------------------------
|
||||
// Modal dialog handling
|
||||
// -----------------------------------------------------------------------------
|
||||
var modalCallbackFunction = "";
|
||||
|
||||
function showModalOK(title, message, callbackFunction) {
|
||||
showModalOk(title, message, callbackFunction);
|
||||
}
|
||||
function showModalOk(title, message, callbackFunction) {
|
||||
// set captions
|
||||
$("#modal-ok-title").html(title);
|
||||
$("#modal-ok-message").html(message);
|
||||
|
||||
if (callbackFunction != null) {
|
||||
$("#modal-ok-OK").click(function () {
|
||||
callbackFunction();
|
||||
});
|
||||
}
|
||||
|
||||
// Show modal
|
||||
$("#modal-ok").modal("show");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function showModalDefault(title, message, btnCancel, btnOK, callbackFunction) {
|
||||
// set captions
|
||||
$("#modal-default-title").html(title);
|
||||
$("#modal-default-message").html(message);
|
||||
$("#modal-default-cancel").html(btnCancel);
|
||||
$("#modal-default-OK").html(btnOK);
|
||||
modalCallbackFunction = callbackFunction;
|
||||
|
||||
// Show modal
|
||||
$("#modal-default").modal("show");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
function showModalDefaultStrParam(
|
||||
title,
|
||||
message,
|
||||
btnCancel,
|
||||
btnOK,
|
||||
callbackFunction,
|
||||
param = ""
|
||||
) {
|
||||
// set captions
|
||||
$("#modal-str-title").html(title);
|
||||
$("#modal-str-message").html(message);
|
||||
$("#modal-str-cancel").html(btnCancel);
|
||||
$("#modal-str-OK").html(btnOK);
|
||||
$("#modal-str-OK").off("click"); //remove existing handlers
|
||||
$("#modal-str-OK").on("click", function () {
|
||||
$("#modal-str").modal("hide");
|
||||
callbackFunction(param);
|
||||
});
|
||||
|
||||
// Show modal
|
||||
$("#modal-str").modal("show");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function showModalWarning(
|
||||
title,
|
||||
message,
|
||||
btnCancel = getString("Gen_Cancel"),
|
||||
btnOK = getString("Gen_Okay"),
|
||||
callbackFunction = null
|
||||
) {
|
||||
// set captions
|
||||
$("#modal-warning-title").html(title);
|
||||
$("#modal-warning-message").html(message);
|
||||
$("#modal-warning-cancel").html(btnCancel);
|
||||
$("#modal-warning-OK").html(btnOK);
|
||||
|
||||
if (callbackFunction != null) {
|
||||
modalCallbackFunction = callbackFunction;
|
||||
}
|
||||
|
||||
// Show modal
|
||||
$("#modal-warning").modal("show");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function showModalInput(
|
||||
title,
|
||||
message,
|
||||
btnCancel = getString("Gen_Cancel"),
|
||||
btnOK = getString("Gen_Okay"),
|
||||
callbackFunction = null
|
||||
) {
|
||||
prefix = "modal-input";
|
||||
|
||||
// set captions
|
||||
$(`#${prefix}-title`).html(title);
|
||||
$(`#${prefix}-message`).html(message);
|
||||
$(`#${prefix}-cancel`).html(btnCancel);
|
||||
$(`#${prefix}-OK`).html(btnOK);
|
||||
|
||||
if (callbackFunction != null) {
|
||||
modalCallbackFunction = callbackFunction;
|
||||
}
|
||||
|
||||
// Show modal
|
||||
$(`#${prefix}`).modal("show");
|
||||
|
||||
setTimeout(function () {
|
||||
$(`#${prefix}-textarea`).focus();
|
||||
}, 500);
|
||||
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function showModalFieldInput(
|
||||
title,
|
||||
message,
|
||||
btnCancel = getString("Gen_Cancel"),
|
||||
btnOK = getString("Gen_Okay"),
|
||||
curValue = "",
|
||||
callbackFunction = null
|
||||
) {
|
||||
// set captions
|
||||
prefix = "modal-field-input";
|
||||
|
||||
$(`#${prefix}-title`).html(title);
|
||||
$(`#${prefix}-message`).html(message);
|
||||
$(`#${prefix}-cancel`).html(btnCancel);
|
||||
$(`#${prefix}-OK`).html(btnOK);
|
||||
|
||||
if (callbackFunction != null) {
|
||||
modalCallbackFunction = callbackFunction;
|
||||
}
|
||||
|
||||
$(`#${prefix}-field`).val(curValue);
|
||||
|
||||
setTimeout(function () {
|
||||
$(`#${prefix}-field`).focus();
|
||||
}, 500);
|
||||
|
||||
// Show modal
|
||||
$(`#${prefix}`).modal("show");
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function modalDefaultOK() {
|
||||
// Hide modal
|
||||
$("#modal-default").modal("hide");
|
||||
|
||||
// timer to execute function
|
||||
window.setTimeout(function () {
|
||||
window[modalCallbackFunction]();
|
||||
}, 100);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function modalDefaultInput() {
|
||||
// Hide modal
|
||||
$("#modal-input").modal("hide");
|
||||
|
||||
// timer to execute function
|
||||
window.setTimeout(function () {
|
||||
window[modalCallbackFunction]();
|
||||
}, 100);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function modalDefaultFieldInput() {
|
||||
// Hide modal
|
||||
$("#modal-field-input").modal("hide");
|
||||
|
||||
// timer to execute function
|
||||
window.setTimeout(function () {
|
||||
modalCallbackFunction();
|
||||
}, 100);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function modalWarningOK() {
|
||||
// Hide modal
|
||||
$("#modal-warning").modal("hide");
|
||||
|
||||
// timer to execute function
|
||||
window.setTimeout(function () {
|
||||
window[modalCallbackFunction]();
|
||||
}, 100);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function showMessage(textMessage = "") {
|
||||
if (textMessage.toLowerCase().includes("error")) {
|
||||
// show error
|
||||
alert(textMessage);
|
||||
} else {
|
||||
// show temporal notification
|
||||
$("#alert-message").html(textMessage);
|
||||
$("#notification").fadeIn(1, function () {
|
||||
window.setTimeout(function () {
|
||||
$("#notification").fadeOut(500);
|
||||
}, 3000);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function showTickerAnnouncement(textMessage = "") {
|
||||
if (textMessage.toLowerCase().includes("error")) {
|
||||
// show error
|
||||
alert(textMessage);
|
||||
} else {
|
||||
// show permanent notification
|
||||
$("#ticker-message").html(textMessage);
|
||||
$("#tickerAnnouncement").removeClass("myhidden");
|
||||
// Move the tickerAnnouncement element to ticker_announcement_plc
|
||||
$("#tickerAnnouncement").appendTo("#ticker_announcement_plc");
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Keyboard bindings
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
$(document).ready(function () {
|
||||
$(document).on("keydown", function (event) {
|
||||
// ESC key is pressed
|
||||
if (event.keyCode === 27) {
|
||||
// Trigger modal dismissal
|
||||
$(".modal").modal("hide");
|
||||
}
|
||||
|
||||
// Enter key is pressed
|
||||
if (event.keyCode === 13) {
|
||||
$(".modal:visible").find(".btn-modal-submit").click(); // Trigger the click event of the OK button in visible modals
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -71,26 +71,27 @@
|
||||
includeSettings.forEach((set) => {
|
||||
|
||||
includeSettings_html += `
|
||||
<a href="#${prefix + '_' + set}" onclick="toggleAllSettings()">
|
||||
<div class="overview-setting-value pointer" title="${prefix + '_' + set}">
|
||||
<code>${getSetting(prefix + '_' + set)}</code>
|
||||
</div>
|
||||
</a>
|
||||
<div class="col-sm-6 overview-setting-value-wrap">
|
||||
<a href="#${prefix + '_' + set}" onclick="toggleAllSettings()">
|
||||
<div class="overview-setting-value pointer" title="${prefix + '_' + set}">
|
||||
<code>${getSetting(prefix + '_' + set)}</code>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
`
|
||||
|
||||
});
|
||||
|
||||
html += `
|
||||
<div class="col-sm-4 ">
|
||||
<div class="small-box bg-green " >
|
||||
<div class="inner ">
|
||||
<a href="#${prefix}_header" onclick="toggleAllSettings('open')">
|
||||
<h5 class="card-title">
|
||||
<b>${getString(prefix+"_display_name")}</b>
|
||||
</h5>
|
||||
</a>
|
||||
${includeSettings_html}
|
||||
</div>
|
||||
<div class="col-sm-4 padding-5px">
|
||||
<div class="small-box bg-green col-sm-12 " >
|
||||
<div class="inner col-sm-12">
|
||||
<a href="#${prefix}_header" onclick="toggleAllSettings('open')">
|
||||
<h5 class="card-title">
|
||||
<b>${getString(prefix+"_display_name")}</b>
|
||||
</h5>
|
||||
</a>
|
||||
${includeSettings_html}
|
||||
</div>
|
||||
<a href="#${prefix}_header" onclick="toggleAllSettings('open')">
|
||||
<div class="icon"> ${getString(prefix+"_icon")} </div>
|
||||
</a>
|
||||
@@ -124,8 +125,7 @@
|
||||
if(allOpen == false || openOrClose == 'open')
|
||||
{
|
||||
// open all
|
||||
$('div[data-myid="collapsible"]').each(function(){$(this).attr('class', 'panel-collapse collapse in')})
|
||||
$('div[data-myid="collapsible"]').each(function(){$(this).attr('style', 'height:inherit')})
|
||||
openAllSettings()
|
||||
$('#toggleSettings').attr('class', $('#toggleSettings').attr('class').replace(openIcon, closeIcon))
|
||||
|
||||
}
|
||||
@@ -137,6 +137,11 @@
|
||||
|
||||
}
|
||||
|
||||
function openAllSettings() {
|
||||
$('div[data-myid="collapsible"]').each(function(){$(this).attr('class', 'panel-collapse collapse in')})
|
||||
$('div[data-myid="collapsible"]').each(function(){$(this).attr('style', 'height:inherit')})
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Checks if all schedules are the same
|
||||
@@ -165,6 +170,148 @@
|
||||
return true; // Return true if no schedules are found
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Checks if value is already encoded
|
||||
function isSHA256(value) {
|
||||
// Check if the value is a string and has a length of 64 characters
|
||||
if (typeof value === "string" && value.length === 64) {
|
||||
// Check if the value contains only hexadecimal characters
|
||||
return /^[0-9a-fA-F]+$/.test(value);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Manipulating Editable List options
|
||||
// -------------------------------------------------------------------
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Function to remove an item from the select element
|
||||
function removeOptionItem(option) {
|
||||
settingsChanged();
|
||||
option.remove();
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Update value of an item from the select element
|
||||
function updateOptionItem(option, value) {
|
||||
settingsChanged();
|
||||
option.html(value);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Remove all options
|
||||
function removeAllOptions(element)
|
||||
{
|
||||
settingsChanged();
|
||||
$(`#${$(element).attr('my-input')}`).empty();
|
||||
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Function to initialize remove functionality on select options
|
||||
|
||||
// Counter to track number of clicks
|
||||
let clickCounter = 0;
|
||||
|
||||
// Function to initialize list interaction options
|
||||
function initListInteractionOptions(selectorId) {
|
||||
// Select all options within the specified selector
|
||||
const $options = $(`#${selectorId} option`);
|
||||
|
||||
// Add class to make options interactable
|
||||
$options.addClass('interactable-option');
|
||||
|
||||
// Attach click event listener to options
|
||||
$options.on('click', function() {
|
||||
const $option = $(this);
|
||||
|
||||
console.log('aaa');
|
||||
|
||||
// Increment click counter
|
||||
clickCounter++;
|
||||
|
||||
// Delay to capture multiple clicks
|
||||
setTimeout(() => {
|
||||
// Perform action based on click count
|
||||
if (clickCounter === 1) {
|
||||
// Single-click action
|
||||
showModalFieldInput(
|
||||
`<i class="fa-regular fa-pen-to-square"></i> ${getString('Gen_Update_Value')}`,
|
||||
getString('settings_update_item_warning'),
|
||||
getString('Gen_Cancel'),
|
||||
getString('Gen_Update'),
|
||||
$option.html(),
|
||||
function() {
|
||||
updateOptionItem($option, $(`#modal-field-input-field`).val())
|
||||
}
|
||||
);
|
||||
} else if (clickCounter === 2) {
|
||||
// Double-click action
|
||||
removeOptionItem($option);
|
||||
}
|
||||
|
||||
// Reset click counter
|
||||
clickCounter = 0;
|
||||
}, 300); // Adjust delay as needed
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Function to filter rows based on input text
|
||||
function filterRows(inputText) {
|
||||
|
||||
if(!inputText)
|
||||
{
|
||||
inputText = ''
|
||||
}
|
||||
|
||||
$('.table_row').each(function() {
|
||||
// Check if the row id ends with '__metadata'
|
||||
var idAttribute = $(this).attr('id');
|
||||
if (idAttribute && idAttribute.endsWith('__metadata')) {
|
||||
$(this).hide(); // Hide the row if it ends with '__metadata'
|
||||
return; // Skip to the next iteration
|
||||
}
|
||||
|
||||
var description = $(this).find('.setting_description').text().toLowerCase();
|
||||
var codeName = $(this).find('.setting_name code').text().toLowerCase();
|
||||
if (description.includes(inputText.toLowerCase()) || codeName.includes(inputText.toLowerCase())) {
|
||||
$(this).show(); // Show the row if it matches the input text
|
||||
} else {
|
||||
$(this).hide(); // Hide the row if it doesn't match the input text
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
|
||||
// Event listener for input change
|
||||
$('#settingsSearch').on('input', function() {
|
||||
var searchText = $(this).val();
|
||||
// hide the setting overview dashboard
|
||||
$('#settingsOverview').collapse('hide');
|
||||
|
||||
filterRows(searchText);
|
||||
});
|
||||
|
||||
// Event listener for input focus
|
||||
// var firstFocus = true;
|
||||
$('#settingsSearch').on('focus', function() {
|
||||
openAllSettings()
|
||||
});
|
||||
|
||||
|
||||
|
||||
}, 1000);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -13,13 +13,13 @@
|
||||
// -----------------------------------------------------------------------------
|
||||
function initDeviceSelectors() {
|
||||
|
||||
console.log(devicesList)
|
||||
// console.log(devicesList)
|
||||
// Retrieve device list from session variable
|
||||
var devicesListAll_JSON = getCache('devicesListAll_JSON');
|
||||
|
||||
var devicesList = JSON.parse(devicesListAll_JSON);
|
||||
|
||||
console.log(devicesList);
|
||||
// console.log(devicesList);
|
||||
|
||||
|
||||
// Check if both device list exists
|
||||
@@ -78,35 +78,8 @@ function initDeviceSelectors() {
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------
|
||||
//Initialize Select2 Elements and make them sortable
|
||||
|
||||
$(function () {
|
||||
// Iterate over each Select2 dropdown
|
||||
$('.select2').each(function() {
|
||||
var selectEl = $(this).select2();
|
||||
|
||||
// Apply sortable functionality to the dropdown's dropdown-container
|
||||
selectEl.next().children().children().children().sortable({
|
||||
containment: 'parent',
|
||||
update: function () {
|
||||
var sortedValues = $(this).children().map(function() {
|
||||
return $(this).attr('title');
|
||||
}).get();
|
||||
|
||||
var sortedOptions = selectEl.find('option').sort(function(a, b) {
|
||||
return sortedValues.indexOf($(a).text()) - sortedValues.indexOf($(b).text());
|
||||
});
|
||||
|
||||
// Replace all options in selectEl
|
||||
selectEl.empty().append(sortedOptions);
|
||||
|
||||
// Trigger change event on Select2
|
||||
selectEl.trigger('change');
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
@@ -281,6 +254,43 @@ function updateIconPreview (inputId) {
|
||||
// initialize
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
initDeviceSelectors();
|
||||
|
||||
setTimeout(() => {
|
||||
|
||||
initDeviceSelectors();
|
||||
|
||||
|
||||
// --------------------------------------------------------
|
||||
//Initialize Select2 Elements and make them sortable
|
||||
|
||||
$(function () {
|
||||
// Iterate over each Select2 dropdown
|
||||
$('.select2').each(function() {
|
||||
var selectEl = $(this).select2();
|
||||
|
||||
// Apply sortable functionality to the dropdown's dropdown-container
|
||||
selectEl.next().children().children().children().sortable({
|
||||
containment: 'parent',
|
||||
update: function () {
|
||||
var sortedValues = $(this).children().map(function() {
|
||||
return $(this).attr('title');
|
||||
}).get();
|
||||
|
||||
var sortedOptions = selectEl.find('option').sort(function(a, b) {
|
||||
return sortedValues.indexOf($(a).text()) - sortedValues.indexOf($(b).text());
|
||||
});
|
||||
|
||||
// Replace all options in selectEl
|
||||
selectEl.empty().append(sortedOptions);
|
||||
|
||||
// Trigger change event on Select2
|
||||
selectEl.trigger('change');
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
}, 500);
|
||||
|
||||
|
||||
console.log("init ui_components.js")
|
||||
1
front/lib/crypto/crypto-js.min.js
vendored
Executable file
1
front/lib/crypto/crypto-js.min.js
vendored
Executable file
File diff suppressed because one or more lines are too long
@@ -327,37 +327,37 @@ $db->close();
|
||||
<div class="tab-pane" id="tab_DBTools">
|
||||
<div class="db_info_table">
|
||||
<div class="db_info_table_row">
|
||||
<div class="db_tools_table_cell_a" style="">
|
||||
<div class="db_tools_table_cell_a" >
|
||||
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnDeleteMAC" onclick="askDeleteDevicesWithEmptyMACs()"><?= lang('Maintenance_Tool_del_empty_macs');?></button>
|
||||
</div>
|
||||
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_del_empty_macs_text');?></div>
|
||||
</div>
|
||||
<div class="db_info_table_row">
|
||||
<div class="db_tools_table_cell_a" style="">
|
||||
<div class="db_tools_table_cell_a" >
|
||||
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnDeleteMAC" onclick="askDeleteAllDevices()"><?= lang('Maintenance_Tool_del_alldev');?></button>
|
||||
</div>
|
||||
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_del_alldev_text');?></div>
|
||||
</div>
|
||||
<div class="db_info_table_row">
|
||||
<div class="db_tools_table_cell_a" style="">
|
||||
<div class="db_tools_table_cell_a" >
|
||||
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnDeleteUnknown" onclick="askDeleteUnknown()"><?= lang('Maintenance_Tool_del_unknowndev');?></button>
|
||||
</div>
|
||||
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_del_unknowndev_text');?></div>
|
||||
</div>
|
||||
<div class="db_info_table_row">
|
||||
<div class="db_tools_table_cell_a" style="">
|
||||
<div class="db_tools_table_cell_a" >
|
||||
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnDeleteEvents" onclick="askDeleteEvents()"><?= lang('Maintenance_Tool_del_allevents');?></button>
|
||||
</div>
|
||||
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_del_allevents_text');?></div>
|
||||
</div>
|
||||
<div class="db_info_table_row">
|
||||
<div class="db_tools_table_cell_a" style="">
|
||||
<div class="db_tools_table_cell_a" >
|
||||
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnDeleteEvents30" onclick="askDeleteEvents30()"><?= lang('Maintenance_Tool_del_allevents30');?></button>
|
||||
</div>
|
||||
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_del_allevents30_text');?></div>
|
||||
</div>
|
||||
<div class="db_info_table_row">
|
||||
<div class="db_tools_table_cell_a" style="">
|
||||
<div class="db_tools_table_cell_a" >
|
||||
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnDeleteActHistory" onclick="askDeleteActHistory()"><?= lang('Maintenance_Tool_del_ActHistory');?></button>
|
||||
</div>
|
||||
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_del_ActHistory_text');?></div>
|
||||
@@ -367,31 +367,31 @@ $db->close();
|
||||
<div class="tab-pane" id="tab_BackupRestore">
|
||||
<div class="db_info_table">
|
||||
<div class="db_info_table_row">
|
||||
<div class="db_tools_table_cell_a" style="">
|
||||
<div class="db_tools_table_cell_a" >
|
||||
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red 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" style="">
|
||||
<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" style="">
|
||||
<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 class="db_info_table_row">
|
||||
<div class="db_tools_table_cell_a" style="">
|
||||
<div class="db_tools_table_cell_a" >
|
||||
<button type="button" class="btn btn-default pa-btn bg-green dbtools-button" id="btnExportCSV" onclick="askExportCSV()"><?= lang('Maintenance_Tool_ExportCSV');?></button>
|
||||
</div>
|
||||
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_ExportCSV_text');?></div>
|
||||
</div>
|
||||
<div class="db_info_table_row">
|
||||
<div class="db_tools_table_cell_a" style="">
|
||||
<div class="db_tools_table_cell_a" >
|
||||
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnImportCSV" onclick="askImportCSV()"><?= lang('Maintenance_Tool_ImportCSV');?></button>
|
||||
</div>
|
||||
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_ImportCSV_text');?></div>
|
||||
@@ -922,8 +922,10 @@ function initializeTabs () {
|
||||
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
|
||||
var target = $(e.target).attr("href") // activated tab
|
||||
});
|
||||
|
||||
hideSpinner();
|
||||
|
||||
}, 50);
|
||||
}, 50);
|
||||
|
||||
}
|
||||
|
||||
@@ -948,8 +950,6 @@ window.onload = function asyncFooter()
|
||||
|
||||
</script>
|
||||
|
||||
<link rel="stylesheet" href="lib/AdminLTE/bower_components/select2/dist/css/select2.min.css">
|
||||
<script src="lib/AdminLTE/bower_components/select2/dist/js/select2.full.min.js"></script>
|
||||
<script src="lib/AdminLTE/bower_components/jquery-ui/jquery-ui.min.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,25 +3,33 @@
|
||||
|
||||
|
||||
<div class="col-md-12">
|
||||
<div class="callout callout-warning">
|
||||
<h4><?= lang('Gen_Warning');?></h4>
|
||||
|
||||
<p><?= lang('Device_MultiEdit_Backup');?></p>
|
||||
</div>
|
||||
<div class="box box-default">
|
||||
|
||||
<div class="box-header">
|
||||
|
||||
<h3 class="box-title"><?= lang('Gen_Selected_Devices');?></h3>
|
||||
|
||||
</div>
|
||||
<div class="deviceSelector"></div>
|
||||
</div>
|
||||
<div class="deviceSelector col-md-9" style="z-index:5"></div>
|
||||
|
||||
<div class="callout callout-warning">
|
||||
<h4><?= lang('Gen_Warning');?></h4>
|
||||
|
||||
<p><?= lang('Device_MultiEdit_Backup');?></p>
|
||||
<div class="col-md-3">
|
||||
<button type="button" class="btn btn-default" onclick="markAllSelected()">
|
||||
<i class="fa-solid fa-circle-check"></i> <?= lang('Gen_Add_All');?>
|
||||
</button>
|
||||
<button type="button" class="btn btn-default" onclick="markAllNotSelected()">
|
||||
<i class="fa-solid fa-circle-xmark"></i> <?= lang('Gen_Remove_All');?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="col-md-12">
|
||||
<div class="box box-default">
|
||||
|
||||
@@ -65,7 +73,9 @@
|
||||
// Get plugin and settings data from API endpoints
|
||||
function getData(){
|
||||
|
||||
$.get('api/table_settings.json?nocache=' + Date.now(), function(res) {
|
||||
// some race condition, need to implement delay
|
||||
setTimeout(() => {
|
||||
$.get('api/table_settings.json?nocache=' + Date.now(), function(res) {
|
||||
|
||||
settingsData = res["data"];
|
||||
|
||||
@@ -181,6 +191,9 @@
|
||||
|
||||
|
||||
})
|
||||
|
||||
}, 500);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -190,6 +203,39 @@
|
||||
return $('.deviceSelector select').val().join(',');
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Select All
|
||||
function markAllSelected() {
|
||||
// Get the <select> element with the class 'deviceSelector'
|
||||
var selectElement = $('.deviceSelector select');
|
||||
|
||||
// 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 markAllNotSelected() {
|
||||
// Get the <select> element with the class 'deviceSelector'
|
||||
var selectElement = $('.deviceSelector select');
|
||||
|
||||
// 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');
|
||||
}
|
||||
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Update specified field over the specified DB column and selected entry(ies)
|
||||
@@ -210,7 +256,7 @@
|
||||
columnValue = inputElement.is(':checked') ? 1 : 0;
|
||||
} else {
|
||||
// For other input types (like textboxes), simply retrieve their values
|
||||
columnValue = inputElement.val();
|
||||
columnValue = encodeURIComponent(inputElement.val());
|
||||
}
|
||||
|
||||
var targetColumns = inputElement.attr('data-my-targetColumns');
|
||||
@@ -279,8 +325,8 @@ getData();
|
||||
</script>
|
||||
|
||||
<!-- ----------------------------------------------------------------------- -->
|
||||
<script src="js/ui_components.js"></script>
|
||||
<script src="js/db_methods.js"></script>
|
||||
|
||||
<script src="js/db_methods.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
||||
<!-- ----------------------------------------------------------------------- -->
|
||||
|
||||
|
||||
|
||||
@@ -328,7 +328,7 @@ function saveSettings()
|
||||
$settingValue = $setting[3];
|
||||
|
||||
if ($group == $settingGroup) {
|
||||
if ($settingType == 'text' || $settingType == 'password' || $settingType == 'readonly' || $settingType == 'text.select') {
|
||||
if ($settingType == 'text' || $settingType == 'password' || $settingType == 'password.SHA256' || $settingType == 'readonly' || $settingType == 'text.select') {
|
||||
$val = encode_single_quotes($settingValue);
|
||||
$txt .= $settingKey . "='" . $val . "'\n";
|
||||
} elseif ($settingType == 'integer' || $settingType == 'integer.select') {
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
<!-- To the right -->
|
||||
<div class="pull-right no-hidden-xs">
|
||||
| <a href="https://github.com/jokob-sk/NetAlertX/tree/main/docs" 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/"><i class="fa-brands fa-github"></i></a>
|
||||
| <a href="mailto:jokob@duck.com?subject=NetAlertX"><i class="fa-solid fa-envelope"></i></a>
|
||||
@@ -41,23 +41,24 @@
|
||||
<!-- ./wrapper -->
|
||||
|
||||
<!-- Bootstrap 3.3.7 -->
|
||||
<script src="lib/AdminLTE/bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
|
||||
<script src="lib/AdminLTE/bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
|
||||
|
||||
<!-- jQuery UI -->
|
||||
<script src="lib/AdminLTE/bower_components/jquery-ui/jquery-ui.min.js"></script>
|
||||
|
||||
<!-- AdminLTE App -->
|
||||
<script src="lib/AdminLTE/dist/js/adminlte.min.js"></script>
|
||||
<script src="lib/AdminLTE/dist/js/adminlte.min.js"></script>
|
||||
|
||||
<!-- Optionally, you can add Slimscroll and FastClick plugins.
|
||||
Both of these plugins are recommended to enhance the
|
||||
user experience. -->
|
||||
<!-- Select2 CSS -->
|
||||
<link rel="stylesheet" href="lib/AdminLTE/bower_components/select2/dist/css/select2.min.css">
|
||||
|
||||
<!-- SlimScroll -->
|
||||
<!-- <script src="lib/AdminLTE/bower_components/jquery-slimscroll/jquery.slimscroll.min.js"></script> -->
|
||||
<!-- FastClick -->
|
||||
<!-- <script src="lib/AdminLTE/bower_components/fastclick/lib/fastclick.js"></script> -->
|
||||
<!-- NetAlertX -->
|
||||
<script src="js/handle_version.js"></script>
|
||||
<script src="js/ui_components.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
||||
|
||||
<!-- NetAlertX -------------------------------------------------------------- -->
|
||||
<!-- Select2 JavaScript -->
|
||||
<script src="lib/AdminLTE/bower_components/select2/dist/js/select2.full.min.js" defer></script>
|
||||
|
||||
<script src="js/handle_version.js"></script>
|
||||
|
||||
<?php
|
||||
require 'migrationCheck.php';
|
||||
|
||||
@@ -30,7 +30,8 @@ require dirname(__FILE__).'/security.php';
|
||||
<!-- jQuery 3 -->
|
||||
<script src="lib/AdminLTE/bower_components/jquery/dist/jquery.min.js"></script>
|
||||
|
||||
<script src="js/common.js"></script>
|
||||
<script src="js/common.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
||||
<script src="js/modal.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
||||
|
||||
<!-- Bootstrap 3.3.7 -->
|
||||
<link rel="stylesheet" href="lib/AdminLTE/bower_components/bootstrap/dist/css/bootstrap.min.css">
|
||||
|
||||
@@ -25,13 +25,13 @@
|
||||
"AppEvents_ObjectIsArchived": "Ist archiviert (Zum Protokoll Zeitpunkt)",
|
||||
"AppEvents_ObjectIsNew": "Ist neu (Zum Protokoll Zeitpunkt)",
|
||||
"AppEvents_ObjectPlugin": "Verkn\u00fcpfte Plugins",
|
||||
"AppEvents_ObjectPrimaryID": "",
|
||||
"AppEvents_ObjectSecondaryID": "",
|
||||
"AppEvents_ObjectPrimaryID": "Prim\u00e4r ID",
|
||||
"AppEvents_ObjectSecondaryID": "Sekund\u00e4r ID",
|
||||
"AppEvents_ObjectStatus": "",
|
||||
"AppEvents_ObjectStatusColumn": "",
|
||||
"AppEvents_ObjectType": "",
|
||||
"AppEvents_Plugin": "",
|
||||
"AppEvents_Type": "",
|
||||
"AppEvents_ObjectType": "Objekttyp",
|
||||
"AppEvents_Plugin": "Plugin",
|
||||
"AppEvents_Type": "Typ",
|
||||
"Apprise_display_name": "Apprise",
|
||||
"Apprise_icon": "<i class=\"fa fa-bullhorn\"></i>",
|
||||
"BackDevDetail_Actions_Ask_Run": "Do you want to execute the action?",
|
||||
@@ -50,9 +50,9 @@
|
||||
"BackDevices_DBTools_DelActHistoryError": "Fehler beim Zur\u00fccksetzen der Netzwerkaktivit\u00e4tsanzeige.",
|
||||
"BackDevices_DBTools_DelDevError_a": "Fehler beim L\u00f6schen des Ger\u00e4tes.",
|
||||
"BackDevices_DBTools_DelDevError_b": "Fehler beim L\u00f6schen der Ger\u00e4te.",
|
||||
"BackDevices_DBTools_DelDev_a": "Ger\u00e4t erfolgreich gel\u00f6scht.",
|
||||
"BackDevices_DBTools_DelDev_b": "Ger\u00e4te erfolgreich gel\u00f6scht.",
|
||||
"BackDevices_DBTools_DelEvents": "Events erfolgreich gel\u00f6scht.",
|
||||
"BackDevices_DBTools_DelDev_a": "Ger\u00e4t gel\u00f6scht.",
|
||||
"BackDevices_DBTools_DelDev_b": "Ger\u00e4te gel\u00f6scht.",
|
||||
"BackDevices_DBTools_DelEvents": "Events gel\u00f6scht.",
|
||||
"BackDevices_DBTools_DelEventsError": "Fehler beim L\u00f6schen der Ereignisse.",
|
||||
"BackDevices_DBTools_ImportCSV": "Die Ger\u00e4te 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.",
|
||||
@@ -175,13 +175,13 @@
|
||||
"DevDetail_Tab_Tools_Traceroute_Title": "Traceroute",
|
||||
"DevDetail_Tools_WOL": "Sende Wol Befehl an ",
|
||||
"DevDetail_Tools_WOL_noti": "Wake-on-LAN",
|
||||
"DevDetail_Tools_WOL_noti_text": "Der Wake-on-LAN Befehl wurd and die Broadcast Adresse gesendet. Wenn sich das zu startende Ger\u00e4t nicht im gleichen Subnet/vlan wie Pi.Alert befindet, wird das Ger\u00e4t nicht reagieren.",
|
||||
"DevDetail_Tools_WOL_noti_text": "Der Wake-on-LAN Befehl wurde and die Broadcast Adresse gesendet. Wenn sich das zu startende Ger\u00e4t nicht im gleichen Subnet / VLan wie NetAlertX befindet, wird das Ger\u00e4t nicht reagieren.",
|
||||
"DevDetail_Type_hover": "Der Type des Ger\u00e4tes. 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_WOL_Title": "<i class=\"fa fa-power-off\"></i> Wake-on-LAN",
|
||||
"DevDetail_button_AddIcon": "",
|
||||
"DevDetail_button_AddIcon_Help": "",
|
||||
"DevDetail_button_AddIcon_Tooltip": "",
|
||||
"DevDetail_button_AddIcon": "Neues Symbol Hinzuf\u00fcgen",
|
||||
"DevDetail_button_AddIcon_Help": "F\u00fcge 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\u00fcr details.",
|
||||
"DevDetail_button_AddIcon_Tooltip": "Neues Icon zu diesem Ger\u00e4t hinzuf\u00fcgen, welches es noch nicht im dropdown gibt.",
|
||||
"DevDetail_button_Delete": "L\u00f6sche Ger\u00e4t",
|
||||
"DevDetail_button_DeleteEvents": "L\u00f6sche Events",
|
||||
"DevDetail_button_DeleteEvents_Warning": "Sind Sie sicher, dass Sie alle Ereignisse dieses Ger\u00e4ts l\u00f6schen m\u00f6chten? (dies l\u00f6scht den Ereignisverlauf und die Sitzungen und k\u00f6nnte bei st\u00e4ndigen (anhaltenden) Benachrichtigungen helfen)",
|
||||
@@ -190,18 +190,18 @@
|
||||
"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_Reset": "Verwerfen",
|
||||
"DevDetail_button_Save": "Speichern",
|
||||
"Device_MultiEdit": "",
|
||||
"Device_MultiEdit": "Mehrfach-bearbeiten",
|
||||
"Device_MultiEdit_Backup": "",
|
||||
"Device_MultiEdit_Fields": "",
|
||||
"Device_MultiEdit_MassActions": "",
|
||||
"Device_MultiEdit_Fields": "Felder bearbeiten:",
|
||||
"Device_MultiEdit_MassActions": "Massen aktionen:",
|
||||
"Device_MultiEdit_Tooltip": "",
|
||||
"Device_Searchbox": "Suche",
|
||||
"Device_Shortcut_AllDevices": "Alle Ger\u00e4te",
|
||||
"Device_Shortcut_AllDevices": "Meine Ger\u00e4te",
|
||||
"Device_Shortcut_Archived": "Archiviert",
|
||||
"Device_Shortcut_Connected": "Verbunden",
|
||||
"Device_Shortcut_Devices": "Ger\u00e4te",
|
||||
"Device_Shortcut_DownAlerts": "Down Meldungen",
|
||||
"Device_Shortcut_DownOnly": "",
|
||||
"Device_Shortcut_DownAlerts": "Offline & Nicht erreichbar",
|
||||
"Device_Shortcut_DownOnly": "Offline",
|
||||
"Device_Shortcut_Favorites": "Favoriten",
|
||||
"Device_Shortcut_NewDevices": "Neue Ger\u00e4te",
|
||||
"Device_Shortcut_OnlineChart": "Ger\u00e4tepr\u00e4senz im Laufe der Zeit",
|
||||
@@ -220,7 +220,7 @@
|
||||
"Device_TableHead_Owner": "Eigent\u00fcmer",
|
||||
"Device_TableHead_Parent_MAC": "\u00dcbergeordnete MAC",
|
||||
"Device_TableHead_Port": "Port",
|
||||
"Device_TableHead_RowID": "",
|
||||
"Device_TableHead_RowID": "Zeilen ID",
|
||||
"Device_TableHead_Rowid": "Zeilennummer",
|
||||
"Device_TableHead_Status": "Status",
|
||||
"Device_TableHead_Type": "Typ",
|
||||
@@ -273,6 +273,8 @@
|
||||
"Events_Tablelenght_all": "Alle",
|
||||
"Events_Title": "Ereignisse",
|
||||
"Gen_Action": "Action",
|
||||
"Gen_Add": "",
|
||||
"Gen_Add_All": "",
|
||||
"Gen_AreYouSure": "Sind Sie sich sicher?",
|
||||
"Gen_Backup": "Sichern",
|
||||
"Gen_Cancel": "Abbrechen",
|
||||
@@ -280,21 +282,27 @@
|
||||
"Gen_DataUpdatedUITakesTime": "OK - It may take a while for the UI to update if a scan is runnig",
|
||||
"Gen_Delete": "L\u00f6schen",
|
||||
"Gen_DeleteAll": "Delete all",
|
||||
"Gen_Error": "",
|
||||
"Gen_Error": "Fehler",
|
||||
"Gen_Filter": "",
|
||||
"Gen_LockedDB": "ERROR - DB eventuell gesperrt - Nutze die Konsole in den Entwickler Werkzeugen (F12) zur \u00dcberpr\u00fcfung oder probiere es sp\u00e4ter erneut.",
|
||||
"Gen_Okay": "Ok",
|
||||
"Gen_Purge": "Aufr\u00e4umen",
|
||||
"Gen_ReadDocs": "Mehr in der Dokumentation",
|
||||
"Gen_Remove_All": "",
|
||||
"Gen_Remove_Last": "",
|
||||
"Gen_Restore": "Wiederherstellen",
|
||||
"Gen_Run": "Run",
|
||||
"Gen_Save": "Speichern",
|
||||
"Gen_Saved": "Gespeichert",
|
||||
"Gen_Selected_Devices": "",
|
||||
"Gen_Search": "",
|
||||
"Gen_Selected_Devices": "Ausgew\u00e4hlte Ger\u00e4te:",
|
||||
"Gen_Switch": "Umschalten",
|
||||
"Gen_Upd": "Aktualisierung erfolgreich",
|
||||
"Gen_Upd_Fail": "Aktualisierung fehlgeschlagen",
|
||||
"Gen_Warning": "",
|
||||
"Gen_Work_In_Progress": "",
|
||||
"Gen_Update": "",
|
||||
"Gen_Update_Value": "",
|
||||
"Gen_Warning": "Warnung",
|
||||
"Gen_Work_In_Progress": "Keine Finalversion, feedback bitte unter: https://github.com/jokob-sk/NetAlertX/issues",
|
||||
"General_display_name": "Allgemein",
|
||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||
"HRS_TO_KEEP_NEWDEV_description": "Dies ist eine Wartungseinstellung. Ger\u00e4te markiert als <b>Neues Ger\u00e4t</b> werden gel\u00f6scht, wenn ihre <b>Erste Sitzung</b> l\u00e4nger her ist als die angegebenen Stunden in dieser Einstellung. <code>0</code> deaktiviert diese Funktion. Nutzen Sie diese Einstellung, um <b>Neue Ger\u00e4te</b> automatisch nach <code>X</code> Stunden zu l\u00f6schen.",
|
||||
@@ -302,17 +310,17 @@
|
||||
"HelpFAQ_Cat_Detail": "Detailansicht",
|
||||
"HelpFAQ_Cat_Detail_300_head": "Was bedeutet ",
|
||||
"HelpFAQ_Cat_Detail_300_text_a": "meint ein Netzwerkger\u00e4t (welches den typ AP, Gateway, Firewall, Hypervisor, Powerline, Switch, WLAN, PLC, Router,USB LAN Adapter, USB WIFI Adapter, or Internet eingestellt hat)",
|
||||
"HelpFAQ_Cat_Detail_300_text_b": "bezeichnet die Anschlussnummer/Portnummer, an der das gerade bearbeitete Ger\u00e4t mit diesem Netzwerkger\u00e4t verbunden ist.",
|
||||
"HelpFAQ_Cat_Detail_300_text_b": "bezeichnet die Anschlussnummer/Portnummer, an der das gerade bearbeitete Ger\u00e4t mit diesem Netzwerkger\u00e4t verbunden ist. Siehe <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\">diese Dokumentation</a> f\u00fcr mehr informationen.",
|
||||
"HelpFAQ_Cat_Detail_301_head_a": "Wann wird nun gescannt? Bei ",
|
||||
"HelpFAQ_Cat_Detail_301_head_b": " steht 1min aber der Graph zeigt 5min - Abst\u00e4nde an.",
|
||||
"HelpFAQ_Cat_Detail_301_text": "Den zeitlichen Abstand zwischen den Scans legt der \"Cronjob\" fest, welcher standardm\u00e4\u00dfig auf 5min eingestellt ist. Die Benennung \"1min\" bezieht sich auf die zu erwartende Dauer des Scans. Abh\u00e4ngig vor der Netzwerkkonfiguration kann diese Zeitangabe variieren. Um den Cronjob zu bearbeiten, kannst du im Terminal/der Konsole <span class=\"text-danger help_faq_code\">crontab -e</span> eingeben und den Intervall \u00e4ndern.",
|
||||
"HelpFAQ_Cat_Detail_302_head_a": "Was bedeutet ",
|
||||
"HelpFAQ_Cat_Detail_302_head_b": " und warum kann ich das nicht ausw\u00e4hlen?",
|
||||
"HelpFAQ_Cat_Detail_302_text": "Einige moderne Ger\u00e4te generieren aus Datenschutzgr\u00fcnden zuf\u00e4llige MAC-Adressen, die keinem Hersteller mehr zugeordnet werden k\u00f6nnen und welche sich mit jeder neuen Verbindung \u00e4ndern. Pi.Alert erkennt, ob es sich um eine solche zuf\u00e4llige MAC-Adresse handelt und aktiviert dieses \"Feld\" automatisch. Um das Verhalten abzustellen, musst du in deinem Endger\u00e4t schauen, wie du die MAC-Adressen-Generierung deaktivierst.",
|
||||
"HelpFAQ_Cat_Detail_302_text": "Einige moderne Ger\u00e4te generieren aus Datenschutzgr\u00fcnden zuf\u00e4llige MAC-Adressen, die keinem Hersteller mehr zugeordnet werden k\u00f6nnen und welche sich mit jeder neuen Verbindung \u00e4ndern. NetAlertX erkennt, ob es sich um eine solche zuf\u00e4llige MAC-Adresse handelt und aktiviert dieses \"Feld\" automatisch. Um das Verhalten abzustellen, musst du in deinem Endger\u00e4t schauen, wie du die MAC-Adressen-Generierung deaktivierst.",
|
||||
"HelpFAQ_Cat_Detail_303_head": "Was ist Nmap und wozu dient es?",
|
||||
"HelpFAQ_Cat_Detail_303_text": "Nmap ist ein Netzwerkscanner mit vielf\u00e4ltigen M\u00f6glichkeiten.<br> Wenn ein neues Ger\u00e4t in deiner Liste auftaucht, hast du die M\u00f6glichkeit \u00fcber den Nmap-Scan genauere Informationen \u00fcber das Ger\u00e4t zu erhalten.",
|
||||
"HelpFAQ_Cat_Device_200_head": "Ich habe, mir nicht bekannte, Ger\u00e4te in meiner Liste. Nach dem L\u00f6schen tauchen diese immer wieder auf.",
|
||||
"HelpFAQ_Cat_Device_200_text": "Wenn du Pi-hole verwendest, beachte bitte, dass Pi.Alert Informationen von Pi-hole abruft. Pausiere Pi.Alert, gehe in Pi-hole auf die Settings-Seite und l\u00f6sche ggf. die betreffende DHCP-Lease. Anschlie\u00dfend schaue, ebenfalls in Pi-hole, unter Tools -> Network, ob sich dort die immer wiederkehrenden Hosts finden lassen. Wenn ja, l\u00f6sche diese dort ebenfalls. Nun kannst du Pi.Alert wieder starten. Jetzt sollte das Ger\u00e4t/die Ger\u00e4te nicht mehr auftauchen.",
|
||||
"HelpFAQ_Cat_Device_200_text": "Wenn du Pi-hole verwendest, beachte bitte, dass NetAlertX Informationen von Pi-hole abruft. Pausiere NetAlertX, gehe in Pi-hole auf die Settings-Seite und l\u00f6sche ggf. die betreffende DHCP-Lease. Anschlie\u00dfend schaue, ebenfalls in Pi-hole, unter Tools -> Network, ob sich dort die immer wiederkehrenden Hosts finden lassen. Wenn ja, l\u00f6sche diese dort ebenfalls. Nun kannst du NetAlertX wieder starten. Jetzt sollte das Ger\u00e4t/die Ger\u00e4te nicht mehr auftauchen.",
|
||||
"HelpFAQ_Cat_General": "Allgemein",
|
||||
"HelpFAQ_Cat_General_100_head": "Die Uhr oben rechts und die Zeiten der Events/Anwesenheit stimmen nicht \u00fcberein (Zeitverschiebung).",
|
||||
"HelpFAQ_Cat_General_100_text_a": "Auf deinem PC ist f\u00fcr die PHP Umgebung folgende Zeitzone voreingestellt:",
|
||||
@@ -327,7 +335,7 @@
|
||||
"HelpFAQ_Cat_General_103_head": "Die Login-Seite erscheint nicht, auch nicht nach der Passwort\u00e4nderung.",
|
||||
"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_text": "Diese Seite soll dir die M\u00f6glichkeit bieten, die Belegung deiner Netzwerkger\u00e4te abzubilden. Dazu kannst du einen oder mehrere Switches, WLANs, Router, etc. erstellen, sie ggf. mit einer Portanzahl versehen und bereits erkannte Ger\u00e4te diesen zuordnen. Diese Zuordnung erfolgt in der Detailansicht, des zuzuordnenden Ger\u00e4tes. So ist es dir m\u00f6glich, schnell festzustellen an welchem Port ein Host angeschlossen und ob er online ist.",
|
||||
"HelpFAQ_Cat_Network_600_text": "Diese Seite soll dir die M\u00f6glichkeit bieten, die Belegung deiner Netzwerkger\u00e4te abzubilden. Dazu kannst du einen oder mehrere Switches, WLANs, Router, etc. erstellen, sie ggf. mit einer Portanzahl versehen und bereits erkannte Ger\u00e4te diesen zuordnen. Diese Zuordnung erfolgt in der Detailansicht, des zuzuordnenden Ger\u00e4tes. So ist es dir m\u00f6glich, schnell festzustellen an welchem Port ein Host angeschlossen und ob er online ist. Siehe <a target=\"_blank\" href=\"https://github.com/jokob-sk/Pi.NetAlertX/blob/main/docs/NETWORK_TREE.md\">diese Dokumentation </a> f\u00fcr mehr Infos.",
|
||||
"HelpFAQ_Cat_Network_601_head": "Gibt es mehr Dokumentation?",
|
||||
"HelpFAQ_Cat_Network_601_text": "Ja, gibt es! Siehe <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/\">alle Dokumentationen</a> f\u00fcr mehr Infos.",
|
||||
"HelpFAQ_Cat_Presence_400_head": "Ger\u00e4te werden mit einer gelben Markierung und dem Hinweis \"missing Event\" angezeigt.",
|
||||
@@ -409,7 +417,7 @@
|
||||
"Maintenance_Tool_del_empty_macs_noti": "Ger\u00e4te l\u00f6schen",
|
||||
"Maintenance_Tool_del_empty_macs_noti_text": "Sind Sie sicher, dass Sie alle Ger\u00e4te ohne MAC-Adresse l\u00f6schen wollen?<br>(Vielleicht bevorzugen Sie eine Archivierung)",
|
||||
"Maintenance_Tool_del_empty_macs_text": "Machen Sie ein Backup, bevor Sie diese Funk­tion nutzen. Der Vor­gang kann ohne Back­up nicht r\u00fcck­g\u00e4ngig gemacht werden. Alle Ge\u00e4te ohne MAC-Adresse werden aus der Datenbank ge­l\u00f6scht.",
|
||||
"Maintenance_Tool_del_selecteddev": "",
|
||||
"Maintenance_Tool_del_selecteddev": "Ausgew\u00e4hlte Ger\u00e4te l\u00f6schen",
|
||||
"Maintenance_Tool_del_selecteddev_text": "",
|
||||
"Maintenance_Tool_del_unknowndev": "L\u00f6schen der (unknown) Ger\u00e4te",
|
||||
"Maintenance_Tool_del_unknowndev_noti": "L\u00f6sche (unknown) Ger\u00e4te",
|
||||
@@ -474,19 +482,19 @@
|
||||
"Navigation_Events": "Ereignisse",
|
||||
"Navigation_Flows": "Flows",
|
||||
"Navigation_HelpFAQ": "Hilfe / FAQ",
|
||||
"Navigation_Integrations": "",
|
||||
"Navigation_Integrations": "Integrationen",
|
||||
"Navigation_Maintenance": "Wartung",
|
||||
"Navigation_Monitoring": "",
|
||||
"Navigation_Monitoring": "\u00dcberwachung",
|
||||
"Navigation_Network": "Netzwerk",
|
||||
"Navigation_Plugins": "Plugins",
|
||||
"Navigation_Presence": "Anwesenheit",
|
||||
"Navigation_Report": "Bericht",
|
||||
"Navigation_Settings": "Einstellungen",
|
||||
"Navigation_SystemInfo": "Systeminfo",
|
||||
"Navigation_Workflows": "",
|
||||
"Navigation_Workflows": "Arbeitsabl\u00e4ufe",
|
||||
"Network_Assign": "Zum obigen <i class=\"fa fa-server\"></i> Netzwerkknoten zuweisen",
|
||||
"Network_Cant_Assign": "Internet-Wurzelknoten kann nicht als \u00e4u\u00dferer Kindknoten zugewiesen werden.",
|
||||
"Network_Configuration_Error": "",
|
||||
"Network_Configuration_Error": "Konfigurationsfehler",
|
||||
"Network_Connected": "Verbundene Ger\u00e4te",
|
||||
"Network_ManageAdd": "Ger\u00e4t hinzuf\u00fcgen",
|
||||
"Network_ManageAdd_Name": "Name des Ger\u00e4tes",
|
||||
@@ -515,7 +523,7 @@
|
||||
"Network_ManageLeaf": "Zuweisungen verwalten",
|
||||
"Network_ManageUnassign": "Zuweisung aufheben",
|
||||
"Network_NoAssignedDevices": "Dieser Netzwerkknoten hat keine zugewiesenen Ger\u00e4te (Kindknoten). Weise eins von unten zu oder gehe in den <b><i class=\"fa fa-info-circle\"></i> Details</b> Tab eines Ger\u00e4tes in <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Ger\u00e4te</b></a>, und weise dort das Ger\u00e4t einem <b><i class=\"fa fa-server\"></i> Netzwerk Knoten</b> und einem <b><i class=\"fa fa-ethernet\"></i> Netzwerk Knoten Port</b> zu.",
|
||||
"Network_NoDevices": "",
|
||||
"Network_NoDevices": "Keine Ger\u00e4te zum konfigurieren",
|
||||
"Network_Node": "Netzwerkknoten",
|
||||
"Network_Node_Name": "Knotenname",
|
||||
"Network_Parent": "\u00dcbergeordnetes Netzwerkger\u00e4t",
|
||||
@@ -552,7 +560,7 @@
|
||||
"Presence_CalHead_year": "Jahr",
|
||||
"Presence_CallHead_Devices": "Ger\u00e4te",
|
||||
"Presence_Loading": "Laden...",
|
||||
"Presence_Shortcut_AllDevices": "Alle Ger\u00e4te",
|
||||
"Presence_Shortcut_AllDevices": "Meine Ger\u00e4te",
|
||||
"Presence_Shortcut_Archived": "Archiviert",
|
||||
"Presence_Shortcut_Connected": "Verbunden",
|
||||
"Presence_Shortcut_Devices": "Ger\u00e4te",
|
||||
@@ -635,10 +643,10 @@
|
||||
"Systeminfo_Network_HTTP_Referer": "HTTP-Referer:",
|
||||
"Systeminfo_Network_HTTP_Referer_String": "Kein HTTP-Referer",
|
||||
"Systeminfo_Network_Hardware": "Netzwerk Hardware",
|
||||
"Systeminfo_Network_Hardware_Interface_Mask": "",
|
||||
"Systeminfo_Network_Hardware_Interface_Name": "",
|
||||
"Systeminfo_Network_Hardware_Interface_RX": "",
|
||||
"Systeminfo_Network_Hardware_Interface_TX": "",
|
||||
"Systeminfo_Network_Hardware_Interface_Mask": "Netzwerkmaske",
|
||||
"Systeminfo_Network_Hardware_Interface_Name": "Interfacename",
|
||||
"Systeminfo_Network_Hardware_Interface_RX": "Empfangen",
|
||||
"Systeminfo_Network_Hardware_Interface_TX": "Gesendet",
|
||||
"Systeminfo_Network_IP": "IP Internet:",
|
||||
"Systeminfo_Network_IP_Connection": "IP-Verbindung:",
|
||||
"Systeminfo_Network_IP_Server": "Server-IP:",
|
||||
@@ -680,20 +688,20 @@
|
||||
"TICKER_MIGRATE_TO_NETALERTX": "",
|
||||
"TIMEZONE_description": "Zeitzone um Statistiken korrekt darzustellen. Finde deine Zeitzone <a target=\"_blank\" href=\"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\" rel=\"nofollow\">hier</a>.",
|
||||
"TIMEZONE_name": "Zeitzone",
|
||||
"UI_DEV_SECTIONS_description": "",
|
||||
"UI_DEV_SECTIONS_name": "",
|
||||
"UI_DEV_SECTIONS_description": "Ausw\u00e4hlen, welche Elemente in der Ger\u00e4teseite versteckt werden sollen.",
|
||||
"UI_DEV_SECTIONS_name": "Ger\u00e4teauswahl verstecken",
|
||||
"UI_ICONS_description": "",
|
||||
"UI_ICONS_name": "",
|
||||
"UI_LANG_description": "Bevorzugte Oberfl\u00e4chensprache ausw\u00e4hlen.",
|
||||
"UI_ICONS_name": "Vorgefertigte Icons",
|
||||
"UI_LANG_description": "Bevorzugte Oberfl\u00e4chensprache ausw\u00e4hlen. Du m\u00f6chtest beim \u00dcbersetzen helfen? Gerne hier: <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
|
||||
"UI_LANG_name": "UI Sprache",
|
||||
"UI_MY_DEVICES_description": "",
|
||||
"UI_MY_DEVICES_name": "",
|
||||
"UI_MY_DEVICES_name": "In \"Meine Ger\u00e4te\" anzeigen",
|
||||
"UI_NOT_RANDOM_MAC_description": "",
|
||||
"UI_NOT_RANDOM_MAC_name": "",
|
||||
"UI_PRESENCE_description": "Ausw\u00e4hlen, welche Status im <b>Ger\u00e4tepr\u00e4senz im Laufe der Zeit</b>-Diagramm in der <a href=\"/devices.php\" target=\"_blank\">Ger\u00e4te</a>-Seite angzeigt werden sollen. (<code>STRG + klicken</code> zum aus-/abw\u00e4hlen).",
|
||||
"UI_PRESENCE_name": "Anzeige im Pr\u00e4senzdiagramm",
|
||||
"UI_REFRESH_description": "",
|
||||
"UI_REFRESH_name": "",
|
||||
"UI_REFRESH_name": "Automatisch Aktualisieren",
|
||||
"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_REQUEST_METHOD_description": "The HTTP request method to be used for the webhook call.",
|
||||
@@ -706,37 +714,38 @@
|
||||
"WEBHOOK_URL_name": "Target URL",
|
||||
"Webhooks_display_name": "Webhooks",
|
||||
"Webhooks_icon": "<i class=\"fa fa-circle-nodes\"></i>",
|
||||
"devices_old": "",
|
||||
"devices_old": "Aktualisiert...",
|
||||
"general_event_description": " The event you have triggered might take a while until background processes finish. The execution ended once you see <code>finished</code> below. Check the <a href='/maintenance.php#tab_Logging'>error log</a> if you didn not get the expected result. <br/> <br/> Status: ",
|
||||
"general_event_title": "Executing an ad-hoc event",
|
||||
"report_guid": "",
|
||||
"report_guid_missing": "",
|
||||
"report_select_format": "",
|
||||
"report_time": "",
|
||||
"report_select_format": "Format ausw\u00e4hlen:",
|
||||
"report_time": "Benachrichtigungszeit:",
|
||||
"run_event_icon": "fa-play",
|
||||
"run_event_tooltip": "Enable the setting and save your changes at first before you run it.",
|
||||
"settings_core_icon": "",
|
||||
"settings_core_icon": "fa-solid fa-gem",
|
||||
"settings_core_label": "",
|
||||
"settings_device_scanners": "",
|
||||
"settings_device_scanners_icon": "",
|
||||
"settings_device_scanners_label": "",
|
||||
"settings_enabled": "",
|
||||
"settings_enabled_icon": "",
|
||||
"settings_device_scanners_icon": "fa-solid fa-magnifying-glass-plus",
|
||||
"settings_device_scanners_label": "Ger\u00e4tescanner",
|
||||
"settings_enabled": "Aktive Einstellungen",
|
||||
"settings_enabled_icon": "fa-solid fa-toggle-on",
|
||||
"settings_expand_all": "Expand all",
|
||||
"settings_imported": "Last time settings were imported from the app.conf file:",
|
||||
"settings_imported_label": "",
|
||||
"settings_imported_label": "Einstellungen importiert",
|
||||
"settings_missing": "Not all settings loaded, refresh the page! This is probably caused by a high load on the database or app startup sequence.",
|
||||
"settings_missing_block": "You can not save your settings without specifying all setting keys. Refresh the page. This is probably caused by a high load on the database.",
|
||||
"settings_old": "Importing settings and re-initializing...",
|
||||
"settings_other_scanners": "",
|
||||
"settings_other_scanners_icon": "",
|
||||
"settings_other_scanners_label": "",
|
||||
"settings_other_scanners_icon": "fa-solid fa-recycle",
|
||||
"settings_other_scanners_label": "Andere Scanner",
|
||||
"settings_publishers": "",
|
||||
"settings_publishers_icon": "",
|
||||
"settings_publishers_label": "",
|
||||
"settings_publishers_icon": "fa-solid fa-comment-dots",
|
||||
"settings_publishers_label": "Ver\u00f6ffentlicher",
|
||||
"settings_saved": "<br/>Settings saved to the <code>app.conf</code> file.<br/><br/>A time-stamped backup of the previous file created. <br/><br/> Reloading...<br/>",
|
||||
"settings_system_icon": "",
|
||||
"settings_system_label": "",
|
||||
"settings_system_icon": "fa-solid fa-gear",
|
||||
"settings_system_label": "System",
|
||||
"settings_update_item_warning": "",
|
||||
"test_event_icon": "fa-vial-circle-check",
|
||||
"test_event_tooltip": "Save your changes at first before you test your settings."
|
||||
}
|
||||
@@ -261,6 +261,8 @@
|
||||
"Events_Tablelenght_all": "All",
|
||||
"Events_Title": "Events",
|
||||
"Gen_Action": "Action",
|
||||
"Gen_Add": "Add",
|
||||
"Gen_Add_All": "Add all",
|
||||
"Gen_AreYouSure": "Are you sure?",
|
||||
"Gen_Backup": "Run Backup",
|
||||
"Gen_Cancel": "Cancel",
|
||||
@@ -269,18 +271,24 @@
|
||||
"Gen_Delete": "Delete",
|
||||
"Gen_DeleteAll": "Delete all",
|
||||
"Gen_Error": "Error",
|
||||
"Gen_Filter": "Filter",
|
||||
"Gen_LockedDB": "ERROR - DB might be locked - Check F12 Dev tools -> Console or try later.",
|
||||
"Gen_Okay": "Ok",
|
||||
"Gen_Purge": "Purge",
|
||||
"Gen_ReadDocs": "Read more in the docs.",
|
||||
"Gen_Remove_All": "Remove all",
|
||||
"Gen_Remove_Last": "Remove last",
|
||||
"Gen_Restore": "Run Restore",
|
||||
"Gen_Run": "Run",
|
||||
"Gen_Save": "Save",
|
||||
"Gen_Saved": "Saved",
|
||||
"Gen_Search": "Search",
|
||||
"Gen_Selected_Devices": "Selected Devices:",
|
||||
"Gen_Switch": "Switch",
|
||||
"Gen_Upd": "Updated successfully",
|
||||
"Gen_Upd_Fail": "Update failed",
|
||||
"Gen_Update": "Update",
|
||||
"Gen_Update_Value": "Update Value",
|
||||
"Gen_Warning": "Warning",
|
||||
"Gen_Work_In_Progress": "Work in progress, good time to feedback on https://github.com/jokob-sk/NetAlertX/issues",
|
||||
"General_display_name": "General",
|
||||
@@ -391,7 +399,7 @@
|
||||
"Maintenance_Tool_del_unknowndev_text": "Before using this function, please make a backup. The deletion cannot be undone. All devices named (unknown) will be deleted from the database.",
|
||||
"Maintenance_Tool_displayed_columns_text": "Change the visibility and order of the columns in the <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Devices</b></a> page.",
|
||||
"Maintenance_Tool_drag_me": "Drag me to reorder columns.",
|
||||
"Maintenance_Tool_order_columns_text": "",
|
||||
"Maintenance_Tool_order_columns_text": "Maintenance_Tool_order_columns_text",
|
||||
"Maintenance_Tool_purgebackup": "Purge Backups",
|
||||
"Maintenance_Tool_purgebackup_noti": "Purge Backups",
|
||||
"Maintenance_Tool_purgebackup_noti_text": "Are you sure you want to delete all backups except the last 3?",
|
||||
@@ -526,7 +534,7 @@
|
||||
"REPORT_MAIL_name": "Enable email",
|
||||
"REPORT_TITLE": "Report",
|
||||
"RandomMAC_hover": "Autodetected - indicates if the device randomizes it's MAC address.",
|
||||
"SCAN_SUBNETS_description": "Arp-scan is a command-line tool that uses the ARP protocol to discover and fingerprint IP hosts on the local network. An alternative to ARP scan is to enable some other Device scanners. The arp-scan time itself depends on the number of IP addresses to check so set this up carefully with the appropriate network mask and interface. Check the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">subnets documentation</a> for help on setting up VLANs, what VLANs are supported, or how to figure out the network mask and your 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.",
|
||||
"SYSTEM_TITLE": "System Information",
|
||||
"Setting_Override": "Override value",
|
||||
"Setting_Override_Description": "Enabling this option will override an App supplied default value with the value specified above.",
|
||||
@@ -656,6 +664,7 @@
|
||||
"settings_saved": "<br/>Settings saved to the <code>app.conf</code> file.<br/><br/>A time-stamped backup of the previous file created. <br/><br/> Reloading...<br/>",
|
||||
"settings_system_icon": "fa-solid fa-gear",
|
||||
"settings_system_label": "System",
|
||||
"settings_update_item_warning": "Update the value below. Be careful to follow the previous format. <b>Validation is not performed.</b>",
|
||||
"test_event_icon": "fa-vial-circle-check",
|
||||
"test_event_tooltip": "Save your changes at first before you test your settings."
|
||||
}
|
||||
609
front/php/templates/language/es_es.json
Normal file → Executable file
609
front/php/templates/language/es_es.json
Normal file → Executable file
File diff suppressed because it is too large
Load Diff
@@ -261,6 +261,8 @@
|
||||
"Events_Tablelenght_all": "",
|
||||
"Events_Title": "\u00c9v\u00e8nements",
|
||||
"Gen_Action": "Action",
|
||||
"Gen_Add": "",
|
||||
"Gen_Add_All": "",
|
||||
"Gen_AreYouSure": "",
|
||||
"Gen_Backup": "",
|
||||
"Gen_Cancel": "Annuler",
|
||||
@@ -269,18 +271,24 @@
|
||||
"Gen_Delete": "Supprimer",
|
||||
"Gen_DeleteAll": "",
|
||||
"Gen_Error": "Erreur",
|
||||
"Gen_Filter": "",
|
||||
"Gen_LockedDB": "",
|
||||
"Gen_Okay": "OK",
|
||||
"Gen_Purge": "Purger",
|
||||
"Gen_ReadDocs": "",
|
||||
"Gen_Remove_All": "",
|
||||
"Gen_Remove_Last": "",
|
||||
"Gen_Restore": "",
|
||||
"Gen_Run": "Lancer",
|
||||
"Gen_Save": "Enregistrer",
|
||||
"Gen_Saved": "Enregistr\u00e9",
|
||||
"Gen_Search": "",
|
||||
"Gen_Selected_Devices": "",
|
||||
"Gen_Switch": "Basculer",
|
||||
"Gen_Upd": "",
|
||||
"Gen_Upd_Fail": "",
|
||||
"Gen_Update": "",
|
||||
"Gen_Update_Value": "",
|
||||
"Gen_Warning": "Avertissement",
|
||||
"Gen_Work_In_Progress": "",
|
||||
"General_display_name": "G\u00e9n\u00e9ral",
|
||||
@@ -656,6 +664,7 @@
|
||||
"settings_saved": "",
|
||||
"settings_system_icon": "",
|
||||
"settings_system_label": "Syst\u00e8me",
|
||||
"settings_update_item_warning": "",
|
||||
"test_event_icon": "",
|
||||
"test_event_tooltip": ""
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5,7 +5,7 @@
|
||||
// ###################################
|
||||
|
||||
$defaultLang = "en_us";
|
||||
$allLanguages = ["en_us","es_es","de_de", "nb_no", "ru_ru", "fr_fr", "it_it"];
|
||||
$allLanguages = ["en_us","es_es","de_de", "nb_no", "pl_pl", "pt_br", "ru_ru", "fr_fr", "it_it", "zh_cn"];
|
||||
|
||||
global $db;
|
||||
|
||||
@@ -14,9 +14,12 @@ switch($result){
|
||||
case 'Spanish': $pia_lang_selected = 'es_es'; break;
|
||||
case 'German': $pia_lang_selected = 'de_de'; break;
|
||||
case 'Norwegian': $pia_lang_selected = 'nb_no'; break;
|
||||
case 'Polish': $pia_lang_selected = 'pl_pl'; break;
|
||||
case 'Portuguese (Brazil)': $pia_lang_selected = 'pt_br'; break;
|
||||
case 'Italian': $pia_lang_selected = 'it_it'; break;
|
||||
case 'Russian': $pia_lang_selected = 'ru_ru'; break;
|
||||
case 'French': $pia_lang_selected = 'fr_fr'; break;
|
||||
case 'Chinese (zh_cn)': $pia_lang_selected = 'zh_cn'; break;
|
||||
default: $pia_lang_selected = 'en_us'; break;
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,6 @@ def merge_translations(main_file, other_files):
|
||||
|
||||
if __name__ == "__main__":
|
||||
current_path = os.path.dirname(os.path.abspath(__file__))
|
||||
json_files = ["en_us.json", "de_de.json", "es_es.json", "fr_fr.json", "nb_no.json", "ru_ru.json", "it_it.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"]
|
||||
file_paths = [os.path.join(current_path, file) for file in json_files]
|
||||
merge_translations(file_paths[0], file_paths[1:])
|
||||
|
||||
@@ -261,6 +261,8 @@
|
||||
"Events_Tablelenght_all": "",
|
||||
"Events_Title": "",
|
||||
"Gen_Action": "",
|
||||
"Gen_Add": "",
|
||||
"Gen_Add_All": "",
|
||||
"Gen_AreYouSure": "",
|
||||
"Gen_Backup": "",
|
||||
"Gen_Cancel": "",
|
||||
@@ -269,18 +271,24 @@
|
||||
"Gen_Delete": "",
|
||||
"Gen_DeleteAll": "",
|
||||
"Gen_Error": "",
|
||||
"Gen_Filter": "",
|
||||
"Gen_LockedDB": "",
|
||||
"Gen_Okay": "",
|
||||
"Gen_Purge": "",
|
||||
"Gen_ReadDocs": "",
|
||||
"Gen_Remove_All": "",
|
||||
"Gen_Remove_Last": "",
|
||||
"Gen_Restore": "",
|
||||
"Gen_Run": "",
|
||||
"Gen_Save": "",
|
||||
"Gen_Saved": "",
|
||||
"Gen_Search": "",
|
||||
"Gen_Selected_Devices": "",
|
||||
"Gen_Switch": "",
|
||||
"Gen_Upd": "",
|
||||
"Gen_Upd_Fail": "",
|
||||
"Gen_Update": "",
|
||||
"Gen_Update_Value": "",
|
||||
"Gen_Warning": "",
|
||||
"Gen_Work_In_Progress": "",
|
||||
"General_display_name": "",
|
||||
@@ -656,6 +664,7 @@
|
||||
"settings_saved": "",
|
||||
"settings_system_icon": "",
|
||||
"settings_system_label": "",
|
||||
"settings_update_item_warning": "",
|
||||
"test_event_icon": "",
|
||||
"test_event_tooltip": ""
|
||||
}
|
||||
670
front/php/templates/language/pl_pl.json
Executable file
670
front/php/templates/language/pl_pl.json
Executable file
@@ -0,0 +1,670 @@
|
||||
{
|
||||
"API_CUSTOM_SQL_description": "Mo\u017cesz okre\u015bli\u0107 w\u0142asne zapytanie SQL kt\u00f3re b\u0119dzie generowa\u0142o plik JSON i udost\u0119pni\u0107 je poprzez plik typu endpoint <a href=\"/api/table_custom_endpoint.json\" target=\"_blank\"><code>table_custom_endpoint.json</code> </a>.",
|
||||
"API_CUSTOM_SQL_name": "W\u0142asny endpoint",
|
||||
"API_display_name": "API",
|
||||
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
|
||||
"About_Design": "Zaprojektowany by:",
|
||||
"About_Exit": "Wyloguj",
|
||||
"About_Title": "Skaner bezpiecze\u0144stwa sieciowego i framwork powiadomie\u0144",
|
||||
"AppEvents_DateTimeCreated": "Zalogowany",
|
||||
"AppEvents_Extra": "Ekstra",
|
||||
"AppEvents_GUID": "Aplikacja GUID wydarze\u0144",
|
||||
"AppEvents_Helper1": "Pomocnik 1",
|
||||
"AppEvents_Helper2": "Pomocnik 2",
|
||||
"AppEvents_Helper3": "Pomocnik 3",
|
||||
"AppEvents_ObjectForeignKey": "Klucz obcy",
|
||||
"AppEvents_ObjectIndex": "Indeks",
|
||||
"AppEvents_ObjectIsArchived": "Zarchiwizowany (od czasu logu)",
|
||||
"AppEvents_ObjectIsNew": "Nowy (od czasu log\u00f3w)",
|
||||
"AppEvents_ObjectPlugin": "Po\u0142\u0105czony plugin",
|
||||
"AppEvents_ObjectPrimaryID": "Podstawowe ID",
|
||||
"AppEvents_ObjectSecondaryID": "Drugorz\u0119dne ID",
|
||||
"AppEvents_ObjectStatus": "Status (od czasu log\u00f3w)",
|
||||
"AppEvents_ObjectStatusColumn": "Kolumna statusu",
|
||||
"AppEvents_ObjectType": "Typ objektu",
|
||||
"AppEvents_Plugin": "Plugin",
|
||||
"AppEvents_Type": "Typ",
|
||||
"BackDevDetail_Actions_Ask_Run": "Czy chcesz wykona\u0107 akcj\u0119?",
|
||||
"BackDevDetail_Actions_Not_Registered": "Akcja nie zarejestrowana: ",
|
||||
"BackDevDetail_Actions_Title_Run": "Wykonaj akcj\u0119",
|
||||
"BackDevDetail_Copy_Ask": "Skopiuj opis z urz\u0105dzenia z listy rozwijanej (Wszystko na tej stronie zostanie nadpisane)?",
|
||||
"BackDevDetail_Copy_Title": "Skopiuj opis",
|
||||
"BackDevDetail_Tools_WOL_error": "Komenda NIE zosta\u0142a wykonana.",
|
||||
"BackDevDetail_Tools_WOL_okay": "Komenda zosta\u0142a wykonana.",
|
||||
"BackDevices_Arpscan_disabled": "Skan Arp Wy\u0142\u0105czony",
|
||||
"BackDevices_Arpscan_enabled": "Skan Arp W\u0142\u0105czony",
|
||||
"BackDevices_Backup_CopError": "Oryginalna baza danych nie zosta\u0142a zapisana.",
|
||||
"BackDevices_Backup_Failed": "Cz\u0119\u015bciowo poprawnie wykonana kopia zapasowa. Archiwum nie mog\u0142o zosta\u0107 utworzone lub jest puste.",
|
||||
"BackDevices_Backup_okay": "Kopia zapasowa wykonana poprawnie z nowym archiwum",
|
||||
"BackDevices_DBTools_DelDevError_a": "B\u0142\u0105d usuwania Urz\u0105dzenia",
|
||||
"BackDevices_DBTools_DelDevError_b": "B\u0142\u0105d usuwania Urz\u0105dze\u0144",
|
||||
"BackDevices_DBTools_DelDev_a": "Urz\u0105dzenie usuni\u0119te",
|
||||
"BackDevices_DBTools_DelDev_b": "Urz\u0105dzenia usuni\u0119te",
|
||||
"BackDevices_DBTools_DelEvents": "Wydarzenie usuni\u0119te",
|
||||
"BackDevices_DBTools_DelEventsError": "B\u0142\u0105d usuwania Wydarze\u0144",
|
||||
"BackDevices_DBTools_ImportCSV": "Urz\u0105dzenia z pliku CSV zosta\u0142y zaimportowane poprawnie.",
|
||||
"BackDevices_DBTools_ImportCSVError": "Plik CSV nie m\u00f3g\u0142 zosta\u0107 zaimportowany. Upewnij si\u0119 \u017ce format jest poprawny.",
|
||||
"BackDevices_DBTools_ImportCSVMissing": "Plik CSV nie zosta\u0142 znaleziony w <b>/config/devices.csv.</b>",
|
||||
"BackDevices_DBTools_Purge": "Najstarsza kopia zapasowa zosta\u0142a usuni\u0119ta",
|
||||
"BackDevices_DBTools_UpdDev": "Urz\u0105dzenie zaktualizowane poprawnie",
|
||||
"BackDevices_DBTools_UpdDevError": "B\u0142\u0105d aktualizacji urz\u0105dzenia",
|
||||
"BackDevices_DBTools_Upgrade": "Baza danych zaktualizowana",
|
||||
"BackDevices_DBTools_UpgradeError": "Aktualizacja bazy danych nie powiod\u0142a si\u0119",
|
||||
"BackDevices_Device_UpdDevError": "B\u0142\u0105d aktualizacji urz\u0105dze\u0144, spr\u00f3buj ponownie p\u00f3\u017aniej. Mo\u017cliwe \u017ce baza danych jest zablokowana przez trwaj\u0105ce zadania.",
|
||||
"BackDevices_Restore_CopError": "Oryginalna baza danych nie mo\u017ce zosta\u0107 zapisana.",
|
||||
"BackDevices_Restore_Failed": "Nie udane przywracanie. Przywr\u00f3\u0107 baz\u0119 danych r\u0119cznie.",
|
||||
"BackDevices_Restore_okay": "Przywracanie wykonane z sukcesem.",
|
||||
"BackDevices_darkmode_disabled": "Tryb ciemny Wy\u0142\u0105czony",
|
||||
"BackDevices_darkmode_enabled": "Tryb ciemny W\u0142\u0105czony",
|
||||
"DAYS_TO_KEEP_EVENTS_description": "To jest ustawienie konserwacji. Okre\u015bla ile dni maj\u0105 by\u0107 utrzymywane wpisy wydarze\u0144. Wszystkie starsze wpisy wydarze\u0144 zostan\u0105 usuni\u0119te okresowo. Dotyczy tak\u017ce Historii Wydarze\u0144 Plugin\u00f3w.",
|
||||
"DAYS_TO_KEEP_EVENTS_name": "Usu\u0144 wydarzenia starsze ni\u017c",
|
||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i>Kopiuj opis z urz\u0105dzenia",
|
||||
"DevDetail_Copy_Device_Tooltip": "Kopiuj opis z urz\u0105dzenia z listy rozwijanej. Wszystko na tej stronie zostanie nadpisane",
|
||||
"DevDetail_EveandAl_AlertAllEvents": "Powiadamiaj o wszystkich wydarzeniach",
|
||||
"DevDetail_EveandAl_AlertDown": "Wy\u0142\u0105cz powiadomienia",
|
||||
"DevDetail_EveandAl_Archived": "Zarchiwizowane",
|
||||
"DevDetail_EveandAl_NewDevice": "Nowe Urz\u0105dzenie",
|
||||
"DevDetail_EveandAl_NewDevice_Tooltip": "Pokarze Nowy status dla urz\u0105dzenia i doda do listy kiedy filtr Nowe Urz\u0105dzenie jest aktywne. Nie wp\u0142ywa na powiadomienia.",
|
||||
"DevDetail_EveandAl_RandomMAC": "Losowy MAC",
|
||||
"DevDetail_EveandAl_ScanCycle": "Skanuj urz\u0105dzenie",
|
||||
"DevDetail_EveandAl_ScanCycle_a": "Skanuj Urz\u0105dzenie",
|
||||
"DevDetail_EveandAl_ScanCycle_z": "Nie skanuj Urz\u0105dzenia",
|
||||
"DevDetail_EveandAl_Skip": "Pomi\u0144 powtarzaj\u0105ce si\u0119 powiadomienia przez",
|
||||
"DevDetail_EveandAl_Title": "<i class=\"fa fa-bolt\"></i> Konfiguracja powiadomie\u0144 i alert\u00f3w",
|
||||
"DevDetail_Events_CheckBox": "Ukryj wydarzenia po\u0142\u0105cze\u0144",
|
||||
"DevDetail_GoToNetworkNode": "Przenie\u015b do strony Sie\u0107 danego w\u0119z\u0142a.",
|
||||
"DevDetail_Icon": "Ikona",
|
||||
"DevDetail_Icon_Descr": "Wprowad\u017a nazw\u0119 ikone z font awesome bez przedroska fa- oraz pe\u0142n\u0105 klase, np fa fa-brands fa-apple.",
|
||||
"DevDetail_Loading": "Wczytywanie...",
|
||||
"DevDetail_MainInfo_Comments": "Komentarze",
|
||||
"DevDetail_MainInfo_Favorite": "Ulubione",
|
||||
"DevDetail_MainInfo_Group": "Grupa",
|
||||
"DevDetail_MainInfo_Location": "Lokalizacja",
|
||||
"DevDetail_MainInfo_Name": "Nazwa",
|
||||
"DevDetail_MainInfo_Network": "<i class=\"fa fa-server\"></i> W\u0119ze\u0142 (MAC)",
|
||||
"DevDetail_MainInfo_Network_Port": "<i class=\"fa fa-ethernet\"></i> Port",
|
||||
"DevDetail_MainInfo_Network_Title": "<i class=\"fa fa-network-wired\"></i> Sie\u0107",
|
||||
"DevDetail_MainInfo_Owner": "W\u0142a\u015bciciel",
|
||||
"DevDetail_MainInfo_Title": "<i class=\"fa fa-pencil\"></i> G\u0142\u00f3wne informacje",
|
||||
"DevDetail_MainInfo_Type": "Typ",
|
||||
"DevDetail_MainInfo_Vendor": "Dostawca",
|
||||
"DevDetail_MainInfo_mac": "MAC",
|
||||
"DevDetail_Network_Node_hover": "Wybierz sieciowe urz\u0105dzenie rodzica do kt\u00f3rego urz\u0105dzenia jest aktualnie pod\u0142\u0105czone by wype\u0142ni\u0107 Drzewo Sieci.",
|
||||
"DevDetail_Network_Port_hover": "Port na kt\u00f3rym urz\u0105dzenie jest pod\u0142\u0105czone do urz\u0105dzenia sieciowego rodzica. Je\u017celi b\u0119dzie puste ikona wifi zostanie wy\u015bwietlona w Drzewku Sieci.",
|
||||
"DevDetail_Nmap_Scans": "R\u0119czny Skan Nmap",
|
||||
"DevDetail_Nmap_Scans_desc": "Tutaj mo\u017cesz r\u0119cznie wykona\u0107 skany NMAP. Mo\u017cesz tak\u017ce zaplanowa\u0107 automatyczne regularne skanowanie NMAP poprzez plug Us\u0142ugi i Porty (NMAP). Udaj si\u0119 do <a href='/settings.php' target='_blank'>Ustawie\u0144</a> by dowiedzie\u0107 si\u0119 wi\u0119cej",
|
||||
"DevDetail_Nmap_buttonDefault": "Podstawowy Skan",
|
||||
"DevDetail_Nmap_buttonDefault_text": "Podstawowy Skan: Nmap skanuje 1000 pierwszych port\u00f3w z u\u017cyciem wszystkich za\u017c\u0105danych protoko\u0142\u00f3w. \u0141apie oko\u0142o 93% port\u00f3w TCP i 49% port\u00f3w UDP. (oko\u0142o 5 sekund)",
|
||||
"DevDetail_Nmap_buttonDetail": "Skan Szczeg\u00f3\u0142owy",
|
||||
"DevDetail_Nmap_buttonDetail_text": "Skan Szczeg\u00f3\u0142owy: Podstawowy skan z w\u0142\u0105czon\u0105 detekcj\u0105 OS, detekcj\u0105 wersji, skrypt skanuj\u0105cy oraz traceroute (do 30 sekund lub wi\u0119cej)",
|
||||
"DevDetail_Nmap_buttonFast": "Szybki Skan",
|
||||
"DevDetail_Nmap_buttonFast_text": "Szybki Skan: Skanuje mniej port\u00f3w (100) ni\u017c skan podstawowy (kilka sekund)",
|
||||
"DevDetail_Nmap_buttonSkipDiscovery": "Pomi\u0144 wykrywanie hosta",
|
||||
"DevDetail_Nmap_buttonSkipDiscovery_text": "Pomi\u0144 wykrywanie hosta (opcja -Pn): Podstawowy skan bez wykrywania hosta",
|
||||
"DevDetail_Nmap_resultsLink": "Mo\u017cesz opu\u015bci\u0107 t\u0105 stron\u0119 po w\u0142\u0105czeniu skanu. Wyniki b\u0119d\u0105 dost\u0119pne w pliku <code>app_front.log</code>.",
|
||||
"DevDetail_Owner_hover": "Kto jest w\u0142a\u015bcicielem urz\u0105dzenia. Dowolny tekst.",
|
||||
"DevDetail_Periodselect_All": "Wszystkie informacje",
|
||||
"DevDetail_Periodselect_LastMonth": "Ostatni Miesi\u0105c",
|
||||
"DevDetail_Periodselect_LastWeek": "Ostatni Tydzie\u0144",
|
||||
"DevDetail_Periodselect_LastYear": "Ostatni Rok",
|
||||
"DevDetail_Periodselect_today": "Dzisiaj",
|
||||
"DevDetail_Run_Actions_Title": "<i class=\"fa fa-play\"></i>Wykonaj akcj\u0119 na urz\u0105dzeniu",
|
||||
"DevDetail_Run_Actions_Tooltip": "Wykonaj akcje na tym urz\u0105dzeniu z listy rozwijanej.",
|
||||
"DevDetail_SessionInfo_FirstSession": "Pierwsza Sesja",
|
||||
"DevDetail_SessionInfo_LastIP": "Ostatnie IP",
|
||||
"DevDetail_SessionInfo_LastSession": "Ostatnia Sesja",
|
||||
"DevDetail_SessionInfo_StaticIP": "Statyczne IP",
|
||||
"DevDetail_SessionInfo_Status": "Status",
|
||||
"DevDetail_SessionInfo_Title": "<i class=\"fa fa-calendar\"></i>Informacje o Sesji",
|
||||
"DevDetail_SessionTable_Additionalinfo": "Dodatkowe Informacje",
|
||||
"DevDetail_SessionTable_Connection": "Po\u0142\u0105czenie",
|
||||
"DevDetail_SessionTable_Disconnection": "Roz\u0142\u0105czenie",
|
||||
"DevDetail_SessionTable_Duration": "Okres",
|
||||
"DevDetail_SessionTable_IP": "IP",
|
||||
"DevDetail_SessionTable_Order": "Kolejno\u015b\u0107",
|
||||
"DevDetail_Shortcut_CurrentStatus": "Aktualny Status",
|
||||
"DevDetail_Shortcut_DownAlerts": "Alert roz\u0142\u0105czenia",
|
||||
"DevDetail_Shortcut_Presence": "Obecno\u015b\u0107",
|
||||
"DevDetail_Shortcut_Sessions": "Sesje",
|
||||
"DevDetail_Tab_Details": "<i class=\"fa fa-info-circle\"></i>Szczeg\u00f3\u0142y",
|
||||
"DevDetail_Tab_Events": "<i class=\"fa fa-bolt\"></i>Wydarzenia",
|
||||
"DevDetail_Tab_EventsTableDate": "Data",
|
||||
"DevDetail_Tab_EventsTableEvent": "Typ wydarzenia",
|
||||
"DevDetail_Tab_EventsTableIP": "IP",
|
||||
"DevDetail_Tab_EventsTableInfo": "Dodatkowe info",
|
||||
"DevDetail_Tab_Nmap": "<i class=\"fa fa-ethernet\"></i>Nmap",
|
||||
"DevDetail_Tab_NmapEmpty": "Nie wykryto port\u00f3w za pomoc\u0105 Nmap na urz\u0105dzeniu.",
|
||||
"DevDetail_Tab_NmapTableExtra": "Ekstra",
|
||||
"DevDetail_Tab_NmapTableHeader": "Wyniki zaplanowanego skanu",
|
||||
"DevDetail_Tab_NmapTableIndex": "Indeks",
|
||||
"DevDetail_Tab_NmapTablePort": "Port",
|
||||
"DevDetail_Tab_NmapTableService": "Us\u0142uga",
|
||||
"DevDetail_Tab_NmapTableState": "Stan",
|
||||
"DevDetail_Tab_NmapTableText": "Ustaw harmonogram w <a href=\"/settings.php#NMAP_ACTIVE\">Ustawieniach</a>",
|
||||
"DevDetail_Tab_NmapTableTime": "Czas",
|
||||
"DevDetail_Tab_Plugins": "<i class=\"fa fa-plug\"></i>Pluginy",
|
||||
"DevDetail_Tab_Presence": "<i class=\"fa fa-calendar\"></i> Obecno\u015b\u0107",
|
||||
"DevDetail_Tab_Sessions": "<i class=\"fa fa-list-ol\"></i> Sesje",
|
||||
"DevDetail_Tab_Tools": "<i class=\"fa fa-screwdriver-wrench\"></i> Narz\u0119dzia",
|
||||
"DevDetail_Tab_Tools_Internet_Info_Description": "Narz\u0119dzie informacji o Internecie wy\u015bwietla informacj\u0119 o po\u0142\u0105czeniu z Internetem, takie jak adres IP, miasto, pa\u0144stwo, kod pocztowy i strefa czasowa.",
|
||||
"DevDetail_Tab_Tools_Internet_Info_Error": "Wyst\u0105pi\u0142 b\u0142\u0105d",
|
||||
"DevDetail_Tab_Tools_Internet_Info_Start": "Rozpocznij Informacje o Internecie",
|
||||
"DevDetail_Tab_Tools_Internet_Info_Title": "Internet Info",
|
||||
"DevDetail_Tab_Tools_Nslookup_Description": "Nslookup to narz\u0119dzie konsoli u\u017cywane do zapyta\u0144 Systemu Nazw Domenowych (DNS). DNS to system t\u0142umaczenia nazw domen, takich jak www.google.com na adres IP, taki jak 172.217.0.142.",
|
||||
"DevDetail_Tab_Tools_Nslookup_Error": "B\u0142\u0105d: adres IP nie jest poprawny",
|
||||
"DevDetail_Tab_Tools_Nslookup_Start": "Rozpocznij Nslookup",
|
||||
"DevDetail_Tab_Tools_Nslookup_Title": "Nslookup",
|
||||
"DevDetail_Tab_Tools_Speedtest_Description": "Narz\u0119dzie SpeedTest mierzy pr\u0119dko\u015b\u0107 pobierania, wysy\u0142ania oraz op\u00f3\u017anienie po\u0142\u0105czenia internetowego.",
|
||||
"DevDetail_Tab_Tools_Speedtest_Start": "W\u0142\u0105cz SpeedTest",
|
||||
"DevDetail_Tab_Tools_Speedtest_Title": "Online SpeedTest",
|
||||
"DevDetail_Tab_Tools_Traceroute_Description": "Traceroute to sieciowa komenda diagnostyczna s\u0142u\u017c\u0105ca do \u015bledzenia trasy kt\u00f3r\u0105 pakiety przechodz\u0105 z jednego hosta do drugiego.<br><br>Komenda u\u017cywa internetowego protoko\u0142u komunikat\u00f3w kontrolnych (Internet Control Message Protocol - ICMP) do wys\u0142ania pakiet\u00f3w do w\u0119z\u0142\u00f3w po\u015brednich trasy, ka\u017cdy w\u0119ze\u0142 po\u015bredni odpowiada pakietem ICMP time-out (TTL timed out).<br><br>Dane wyj\u015bciowe komendy traceroute wy\u015bwietlaj\u0105 adres IP ka\u017cdego w\u0119z\u0142a po\u015bredniego trasy.<br><br>Komenda traceroute mo\u017ce s\u0142u\u017cy\u0107 do diagnostyki problem\u00f3w sieci, takich jak op\u00f3\u017anienia, utraty pakiet\u00f3w czy zablokowane trasy.<br><br>Mo\u017ce by\u0107 tak\u017ce u\u017cywany do identyfikacji lokalizacji w\u0119z\u0142a po\u015bredniego w sieci.",
|
||||
"DevDetail_Tab_Tools_Traceroute_Error": "B\u0142\u0105d: adres IP jest niepoprawny",
|
||||
"DevDetail_Tab_Tools_Traceroute_Start": "Rozpocznij Treceroute",
|
||||
"DevDetail_Tab_Tools_Traceroute_Title": "Traceroute",
|
||||
"DevDetail_Tools_WOL": "Wy\u015blij komende WoL do ",
|
||||
"DevDetail_Tools_WOL_noti": "Wake-on-LAN",
|
||||
"DevDetail_Tools_WOL_noti_text": "Komenda Wake-on-LAN zostaje wys\u0142ana na adres rozg\u0142oszeniowy. Je\u017celi celem nie jest podsie\u0107/VLAN NetAlertX, urz\u0105dzenie docelowe nie odpowie.",
|
||||
"DevDetail_Type_hover": "Typ urz\u0105dzenia. Je\u017celi zaznaczysz dowolne predefiniowane urz\u0105dzenie sieciowe (np: AP, Zapora sieciowa, Ruter, Switch...) poka\u017c\u0105 si\u0119 w Drzewku Sieci do skonfigurowania jako rodzice w\u0119z\u0142\u00f3w sieciowych.",
|
||||
"DevDetail_Vendor_hover": "Dostawca powinien by\u0107 automatycznie wykrywany. Mo\u017cesz nadpisa\u0107 lub doda\u0107 w\u0142asn\u0105 warto\u015b\u0107.",
|
||||
"DevDetail_WOL_Title": "<i class=\"fa fa-power-off\"></i>Wake-on-LAN",
|
||||
"DevDetail_button_AddIcon": "Dodaj now\u0105 Ikon\u0119",
|
||||
"DevDetail_button_AddIcon_Help": "Wklej tag html SVG lub tag html ikony Font Awesome. Przeczytaj <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">dokumentacje Ikon</a> po wi\u0119cej szczeg\u00f3\u0142\u00f3w.",
|
||||
"DevDetail_button_AddIcon_Tooltip": "Dodaj now\u0105 Ikon\u0119 kt\u00f3ra nie jest dost\u0119pna w menu rozwijanym do urz\u0105dzenia.",
|
||||
"DevDetail_button_Delete": "Usu\u0144 Urz\u0105dzenie",
|
||||
"DevDetail_button_DeleteEvents": "Usu\u0144 Wydarzenia",
|
||||
"DevDetail_button_DeleteEvents_Warning": "Jeste\u015b pewien, \u017ce chcesz usun\u0105\u0107 wszystkie Wydarzenia tego urz\u0105dzenia?<br><br>(wyczy\u015bci to <b>Histori\u0119 Wydarze\u0144</b> i <b>Sesje</b> i mo\u017ce pom\u00f3c ze sta\u0142ymi powiadomieniami)",
|
||||
"DevDetail_button_OverwriteIcons": "Nadpisz Ikony",
|
||||
"DevDetail_button_OverwriteIcons_Tooltip": "Nadpisz ikony dla urz\u0105dze\u0144 o tym samym typie",
|
||||
"DevDetail_button_OverwriteIcons_Warning": "Czy na pewno chcesz nadpisa\u0107 wszystkie ikony dla urz\u0105dze\u0144 o tym samym typie co to urz\u0105dzenie?",
|
||||
"DevDetail_button_Reset": "Zresetuj Zmiany",
|
||||
"DevDetail_button_Save": "Zapisz",
|
||||
"Device_MultiEdit": "Multi-edycja",
|
||||
"Device_MultiEdit_Backup": "Ostro\u017cnie, wprowadzenie b\u0142\u0119dnych warto\u015bci poni\u017cej mo\u017ce zepsu\u0107 konfiguracje. Najpierw wykonaj kopie zapasow\u0105 bazy danych lub konfiguracji Urz\u0105dze\u0144 (<a href=\"php/server/devices.php?action=ExportCSV\">kliknij aby pobra\u0107<i class=\"fa-solid fa-download fa-bounce\"></i></a>). Przeczytaj jak odzyska\u0107 Urz\u0105dzenia z tego pliku w <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\"_blank\">Dokumentacji Kopii Zapasowej</a>.",
|
||||
"Device_MultiEdit_Fields": "Edytuj pola:",
|
||||
"Device_MultiEdit_MassActions": "Akcja masowa:",
|
||||
"Device_MultiEdit_Tooltip": "Ostro\u017cnie. Klikaj\u0105c to zastosuj\u0105 si\u0119 warto\u015bci po lewej stronie do wszystkich wybranych powy\u017cej urz\u0105dze\u0144.",
|
||||
"Device_Searchbox": "Szukaj",
|
||||
"Device_Shortcut_AllDevices": "Moje Urz\u0105dzenia",
|
||||
"Device_Shortcut_Archived": "Zarchiwizowane",
|
||||
"Device_Shortcut_Connected": "Po\u0142\u0105czone",
|
||||
"Device_Shortcut_Devices": "Urz\u0105dzenia",
|
||||
"Device_Shortcut_DownAlerts": "Wy\u0142\u0105czone & Offline",
|
||||
"Device_Shortcut_DownOnly": "Wy\u0142\u0105czone",
|
||||
"Device_Shortcut_Favorites": "Ulubione",
|
||||
"Device_Shortcut_NewDevices": "Nowe Urz\u0105dzenia",
|
||||
"Device_Shortcut_OnlineChart": "Obecno\u015b\u0107 urz\u0105dzenia",
|
||||
"Device_TableHead_Connected_Devices": "Po\u0142\u0105czenia",
|
||||
"Device_TableHead_Favorite": "Ulubione",
|
||||
"Device_TableHead_FirstSession": "Pierwsza Sesja",
|
||||
"Device_TableHead_Group": "Grupa",
|
||||
"Device_TableHead_Icon": "Ikona",
|
||||
"Device_TableHead_LastIP": "Ostatnie IP",
|
||||
"Device_TableHead_LastIPOrder": "Kolejno\u015b\u0107 Ostatnich IP",
|
||||
"Device_TableHead_LastSession": "Ostatnia Sesja",
|
||||
"Device_TableHead_Location": "Lokalizacja",
|
||||
"Device_TableHead_MAC": "Losowy MAC",
|
||||
"Device_TableHead_MAC_full": "Pe\u0142en MAC",
|
||||
"Device_TableHead_Name": "Nazwa",
|
||||
"Device_TableHead_Owner": "W\u0142a\u015bciciel",
|
||||
"Device_TableHead_Parent_MAC": "MAC rodzica w\u0119z\u0142a",
|
||||
"Device_TableHead_Port": "Port",
|
||||
"Device_TableHead_RowID": "ID wiersza",
|
||||
"Device_TableHead_Rowid": "ID wiersza",
|
||||
"Device_TableHead_Status": "Status",
|
||||
"Device_TableHead_Type": "Typ",
|
||||
"Device_TableHead_Vendor": "Dostawca",
|
||||
"Device_Table_Not_Network_Device": "Nie skonfigurowane jako urz\u0105dzenie sieciowe",
|
||||
"Device_Table_info": "Pokazuje_od_POCZ\u0104TKU_do_KO\u0143CA_WSZYSKICH_wpis\u00f3w",
|
||||
"Device_Table_nav_next": "Nast\u0119pny",
|
||||
"Device_Table_nav_prev": "Poprzedni",
|
||||
"Device_Tablelenght": "Poka\u017c_wpisy_MENU",
|
||||
"Device_Tablelenght_all": "Wszystkie",
|
||||
"Device_Title": "Urz\u0105dzenia",
|
||||
"Donations_Others": "Reszta",
|
||||
"Donations_Platforms": "Platforma Sponsora",
|
||||
"Donations_Text": "Cze\u015b\u0107 \ud83d\udc4b! </br> Dzi\u0119kuje \u017ce klikn\u0105\u0142e\u015b w to menu \ud83d\ude05 </br> </br> Pr\u00f3buje zebra\u0107 troch\u0119 donacji by ulepszy\u0107 to oprogramowanie. Tak\u017ce pomaga mi to si\u0119 nie wypali\u0107 bym dalej m\u00f3g\u0142 wspiera\u0107 to narz\u0119dzie. Ka\u017cdy ma\u0142y (powtarzaj\u0105cy si\u0119 lub nie) sponsoring sprawia \u017ce chce wk\u0142ada\u0107 wi\u0119cej pracy w t\u0105 aplikacj\u0119. </br> Chcia\u0142bym skr\u00f3\u0107 m\u00f3j tydzie\u0144 pracy i w wolnym czasie skupi\u0107 si\u0119 nad NetAlertX. Dostawaliby\u015bcie wi\u0119cej funkcjonalno\u015bci i bardziej wypolerowane, posiadaj\u0105ce mniej b\u0142\u0119d\u00f3w wydania. </br> </br> Dzi\u0119kuj\u0119 \u017ce to przeczyta\u0142e\u015b - Jestem wdzi\u0119czny za pomoc \u2764\ud83d\ude4f</br> </br> TL;DR: Wspieraj\u0105c mnie otrzymujesz: </br> </br> <ul><li> Regularne aktualizacje by zapewni\u0107 twoim danym i rodzinie bezpiecze\u0144stwo \ud83d\udd04 </li><li>Mniej b\u0142\u0119d\u00f3w (bug\u00f3w) \ud83d\udc1b\ud83d\udd2b</li><li>Wi\u0119cej i lepsze funkcjonalno\u015bci\u2795</li><li>Ja si\u0119 nie wypale\ud83d\udd25\ud83e\udd2f</li><li>Mniej wypchane na si\u0142\u0119 wydania\ud83d\udca8</li><li>Lepsza dokumentacja\ud83d\udcda</li><li>Szybsza i lepsza pomoc w problemach\ud83c\udd98</li></ul> </br>\ud83d\udce7Napisz E-mail do mnie na<a href='mailto:jokob@duck.com?subject=NetAlertX'>jokob@duck.com</a> je\u017celi chcesz nawi\u0105za\u0107 kontakt albo czy powinien doda\u0107 kolejn\u0105 platform\u0119 z sponsoringiem.</br>",
|
||||
"Donations_Title": "Dotacje",
|
||||
"ENABLE_PLUGINS_description": "W\u0142\u0105cza funkcjonalno\u015b\u0107 <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins\">plugin\u00f3w</a>. Uruchomienie plugin\u00f3w wymaga wi\u0119cej zasob\u00f3w sprz\u0119tu wi\u0119cej mo\u017cesz chcie\u0107 to wy\u0142\u0105czy\u0107 dla systemu o niskich parametrach.",
|
||||
"ENABLE_PLUGINS_name": "W\u0142\u0105cz Pluginy",
|
||||
"Email_display_name": "Email",
|
||||
"Email_icon": "<i class=\"fa fa-at\"></i>",
|
||||
"Events_Loading": "Wczytywanie...",
|
||||
"Events_Periodselect_All": "Wszystkie Informacje",
|
||||
"Events_Periodselect_LastMonth": "Ostatni Miesi\u0105c",
|
||||
"Events_Periodselect_LastWeek": "Ostatni Tydzie\u0144",
|
||||
"Events_Periodselect_LastYear": "Ostatni Rok",
|
||||
"Events_Periodselect_today": "Dzisiaj",
|
||||
"Events_Searchbox": "Szukaj",
|
||||
"Events_Shortcut_AllEvents": "Wszystkie Wydarzenia",
|
||||
"Events_Shortcut_DownAlerts": "Alerty o roz\u0142\u0105czeniu",
|
||||
"Events_Shortcut_Events": "Wydarzenia",
|
||||
"Events_Shortcut_MissSessions": "Brakuj\u0105ce Sesje",
|
||||
"Events_Shortcut_NewDevices": "Nowe Urz\u0105dzenia",
|
||||
"Events_Shortcut_Sessions": "Sesje",
|
||||
"Events_Shortcut_VoidSessions": "Uniewa\u017cnione sesje",
|
||||
"Events_TableHead_AdditionalInfo": "Dodatkowe Info",
|
||||
"Events_TableHead_Connection": "Po\u0142\u0105czenie",
|
||||
"Events_TableHead_Date": "Data",
|
||||
"Events_TableHead_Device": "Urz\u0105dzenie",
|
||||
"Events_TableHead_Disconnection": "Roz\u0142\u0105czenie",
|
||||
"Events_TableHead_Duration": "Okres",
|
||||
"Events_TableHead_DurationOrder": "Kolejno\u015b\u0107 Okresu",
|
||||
"Events_TableHead_EventType": "Typ Wydarzenia",
|
||||
"Events_TableHead_IP": "IP",
|
||||
"Events_TableHead_IPOrder": "Kolejno\u015b\u0107 IP",
|
||||
"Events_TableHead_Order": "Kolejno\u015b\u0107",
|
||||
"Events_TableHead_Owner": "W\u0142a\u015bciciel",
|
||||
"Events_Table_info": "",
|
||||
"Events_Table_nav_next": "Nast\u0119pna",
|
||||
"Events_Table_nav_prev": "Poprzednia",
|
||||
"Events_Tablelenght": "",
|
||||
"Events_Tablelenght_all": "Wszystko",
|
||||
"Events_Title": "Wydarzenia",
|
||||
"Gen_Action": "Akcja",
|
||||
"Gen_Add": "Dodaj",
|
||||
"Gen_Add_All": "Dodaj wszystko",
|
||||
"Gen_AreYouSure": "Jeste\u015b pewien?",
|
||||
"Gen_Backup": "Wykonaj Kopie Zapasow\u0105",
|
||||
"Gen_Cancel": "Anuluj",
|
||||
"Gen_Copy": "Wykonaj",
|
||||
"Gen_DataUpdatedUITakesTime": "OK - Aktualizacja UI mo\u017ce chwile potrwa\u0107 je\u017celi wykonywany jest skan.",
|
||||
"Gen_Delete": "Usu\u0144",
|
||||
"Gen_DeleteAll": "Usu\u0144 wszystko",
|
||||
"Gen_Error": "B\u0142\u0105d",
|
||||
"Gen_Filter": "Filtr",
|
||||
"Gen_LockedDB": "B\u0141\u0104D - BAZA DANYCH mo\u017ce by\u0107 zablokowana - Sprawd\u017a F12 narz\u0119dzia dewelopera -> Konsola lub spr\u00f3buj ponownie p\u00f3\u017aniej.",
|
||||
"Gen_Okay": "Ok",
|
||||
"Gen_Purge": "Wyczy\u015b\u0107",
|
||||
"Gen_ReadDocs": "Przeczytaj wi\u0119cej w dokumentacji.",
|
||||
"Gen_Remove_All": "Usu\u0144 wszystko",
|
||||
"Gen_Remove_Last": "Usu\u0144 ostatnie",
|
||||
"Gen_Restore": "Wykonaj Przywracanie",
|
||||
"Gen_Run": "Wykonaj",
|
||||
"Gen_Save": "Zapisz",
|
||||
"Gen_Saved": "Zapisano",
|
||||
"Gen_Search": "Szukaj",
|
||||
"Gen_Selected_Devices": "Wybierz Urz\u0105dzenia:",
|
||||
"Gen_Switch": "Switch",
|
||||
"Gen_Upd": "Zaktualizowane poprawnie",
|
||||
"Gen_Upd_Fail": "Aktualizacja nie powiod\u0142a si\u0119",
|
||||
"Gen_Update": "Aktualizuj",
|
||||
"Gen_Update_Value": "Aktualizuj Warto\u015b\u0107",
|
||||
"Gen_Warning": "Uwaga",
|
||||
"Gen_Work_In_Progress": "Praca w toku, dobry czas na feedback https://github.com/jokob-sk/NetAlertX/issues",
|
||||
"General_display_name": "Og\u00f3lne",
|
||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||
"HRS_TO_KEEP_NEWDEV_description": "To jest ustawienie konserwacyjne. Je\u017celi uruchomione (<code>0</code> jest wy\u0142\u0105czone), urz\u0105dzenie oznaczone jako <b>Nowe Urz\u0105dzenie</b> zostanie usuni\u0119te je\u017celi czas <b>Pierwszej Sesji</b> jest starszy ni\u017c godzina podana w tym ustawieniu. Uzyj tego ustawienia je\u017celi chcesz automatycznie usuwa\u0107 <b>Nowe Urz\u0105dzenia</b> po <code>X</code> godzinach.",
|
||||
"HRS_TO_KEEP_NEWDEV_name": "Trzymaj nowe urz\u0105dzenia przez",
|
||||
"HelpFAQ_Cat_Detail": "Szczeg\u00f3\u0142y",
|
||||
"HelpFAQ_Cat_Detail_300_head": "Co oznacza ",
|
||||
"HelpFAQ_Cat_Detail_300_text_a": "oznacza urz\u0105dzenie sieciowe (urz\u0105dzenie typu AP, Gateway, Zapora sieciowa, Hypervisor, Powerline, Switch, WLAN, PLC, Ruter, Adapter USB LAN, Adapter USB WIFI, oraz Internet). W\u0142asny typ mo\u017ce zosta\u0107 dodany poprzez ustawienie <code>NETWORK_DEVICE_TYPE</code>.",
|
||||
"HelpFAQ_Cat_Detail_300_text_b": "wyznacza numer portu gdzie aktualne urz\u0105dzenie jest pod\u0142\u0105czone do urz\u0105dzenia sieciowego. Przeczytaj <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\">ten przewodnik</a>po wi\u0119cej informacji.",
|
||||
"HelpFAQ_Cat_Detail_301_head_a": "Kiedy b\u0119dzie teraz skanowanie? ",
|
||||
"HelpFAQ_Cat_Detail_301_head_b": " m\u00f3wi \u017ce 1min ale graf pokazuje interwa\u0142 5 minutowy.",
|
||||
"HelpFAQ_Cat_Detail_301_text": "Interwa\u0142 czasowy mi\u0119dzy skanowanie jest okre\u015blany przez \"Cronjob\", kt\u00f3ry jest podstawowo ustawiony na 5 min. Okre\u015blenie \"1min\" odnosi si\u0119 do oczekiwanego czasu skanowania. Zale\u017cnie od konfiguracji sieci ten czas mo\u017ce si\u0119 r\u00f3\u017cni\u0107. By edytowa\u0107 cronjob, mo\u017cesz u\u017cy\u0107 nast\u0119puj\u0105cej komendy w konsoli <span class=\"text-danger help_faq_code\">crontab -e</span> i zmieni\u0107 interwa\u0142.",
|
||||
"HelpFAQ_Cat_Detail_302_head_a": "Co oznacza ",
|
||||
"HelpFAQ_Cat_Detail_302_head_b": "i czemu nie mo\u017cna tego zaznaczy\u0107?",
|
||||
"HelpFAQ_Cat_Detail_302_text": "Niekt\u00f3re nowoczesne urz\u0105dzenia generuj\u0105 losowy adres MAC z powod\u00f3w prywatno\u015bci, kt\u00f3re nie mog\u0105 by\u0107 przypisane do \u017cadnego producenta i mo\u017ce si\u0119 zmienia\u0107 co nowe po\u0142\u0105czenie. NetAlertX wykrywa czy adres MAC jest losowy i automatycznie aktywuje te \"pole\". By wy\u0142\u0105czy\u0107 takie zachowanie musisz sprawdzi\u0107 jak wy\u0142\u0105czy\u0107 w swoim urz\u0105dzeniu losowe generowanie adresu MAC.",
|
||||
"HelpFAQ_Cat_Detail_303_head": "Co to jest Nmap i do czego s\u0142u\u017cy?",
|
||||
"HelpFAQ_Cat_Detail_303_text": "Nmap jest skanerem sieci z wieloma mo\u017cliwo\u015bciami. <br> Kiedy urz\u0105dzenie pojawia si\u0119 na twojej li\u015bcie, masz mo\u017cliwo\u015b\u0107 zebra\u0107 wi\u0119cej informacji o urz\u0105dzeniu poprzez skan Nmap.",
|
||||
"HelpFAQ_Cat_Device_200_head": "Posiadam na swojej li\u015bcie urz\u0105dzenia o kt\u00f3rych nie wiem. Po usuni\u0119ciu ich znowu si\u0119 pojawiaj\u0105.",
|
||||
"HelpFAQ_Cat_Device_200_text": "Je\u017celi u\u017cywasz Pi-hole, zanotuj \u017ce NetAlertX otrzymuje informacje ze Pi-hole. Zatrzymaj NetAlertX, porzejdz do strony ustawie\u0144 Pi-Hole i usu\u0144 niepotrzebne dzier\u017cawy DHCP je\u017celi to konieczne. Nast\u0119pnie, tak\u017ce w Pi-hole, pod ustawieniami Narz\u0119dzia -> Sie\u0107 (Tools -> Network) sprawd\u017a czy widzisz powracaj\u0105ce urz\u0105dzenia. Je\u017celi tak to usu\u0144 je tak\u017ce. Teraz mo\u017cesz uruchomi\u0107 NetAlertX ponownie. Teraz urzadzenie(a) nie powinny si\u0119 ju\u017c pojawiac.",
|
||||
"HelpFAQ_Cat_General": "Og\u00f3lne",
|
||||
"HelpFAQ_Cat_General_100_head": "Zegar po prawej na g\u00f3rze i czas wydarze\u0144/obecno\u015bci nie jest poprawny (r\u00f3\u017cni\u0105cy si\u0119 czas).",
|
||||
"HelpFAQ_Cat_General_100_text_a": "Na twoim komputerze strefa czasowa jest ustawiona na \u015brodowisko PHP:",
|
||||
"HelpFAQ_Cat_General_100_text_b": "Je\u017celi nie jest to strefa czasowa w kt\u00f3rej jeste\u015b, powiniene\u015b zmieni\u0107 stref\u0119 czasow\u0105 w pliku konfiguracyjnym PHP. Mo\u017cesz znale\u017a\u0107 ten plik w folderze:",
|
||||
"HelpFAQ_Cat_General_100_text_c": "Przeszukaj plik w poszukiwaniu wpisu \"date.timezone\", i usu\u0144 \";\" je\u017celi jest to konieczne oraz wprowad\u017a po\u017c\u0105dan\u0105 stref\u0119 czasow\u0105. Lista wpieranych stref czasowych znajdziesz tutaj (<a href=\"https://www.php.net/manual/en/timezones.php\" target=\"blank\">Link</a>)",
|
||||
"HelpFAQ_Cat_General_101_head": "Moja sie\u0107 chyba zwolni\u0142a, ogl\u0105danie film\u00f3w \"zawiesza si\u0119\".",
|
||||
"HelpFAQ_Cat_General_101_text": "Mo\u017cliwe \u017ce wolne urz\u0105dzenia osi\u0105gn\u0119\u0142y sw\u00f3j limit wydajno\u015bci ze wzgl\u0119du na spos\u00f3b w jaki NetAlerX wykrywa nowe urz\u0105dzenia w sieci. Jest to jeszcze bardziej spot\u0119gowane, je\u017celi te urz\u0105dzenia komunikuj\u0105 si\u0119 za pomoc\u0105 sieci WLAN (bezprzewodowej). Rozwi\u0105zaniem b\u0119dzie zmiana na sie\u0107 przewodow\u0105 je\u017celi to mo\u017cliwe lub je\u017celi urz\u0105dzenie jest u\u017cywane przez kr\u00f3tki czas, to lepiej u\u017cy\u0107 skanu ARP. Zatrzymaj skan ARP w karcie Konserwacja.",
|
||||
"HelpFAQ_Cat_General_102_head": "Dostaje wiadomo\u015b\u0107 \u017ce baza danych jest tylko do odczytu.",
|
||||
"HelpFAQ_Cat_General_102_text": "Sprawd\u017a w folderze NetAlertX czy folder bazy danych (db) ma przypisany poprawne uprawnienia: <br><span class=\"text-danger help_faq_code\">drwxrwx---2 (twoja nazwa u\u017cytkownika) www-data</span><br> Je\u017celi uprawnienia s\u0105 niepoprawne mo\u017cesz ustawi\u0107 je za pomoc\u0105 komendy w konsoli lub terminalu: <br> <span class=\"text-danger help_faq_code\">sudo chgrp -R www-data /app/db<br>chmod -R 770 /app/db</span><br> Je\u017celi baza danych dalej jest tylko do odczytu spr\u00f3buj przeinstalowa\u0107 albo przywr\u00f3ci\u0107 baz\u0119 danych z kopii zapasowej w karcie Konserwacji.",
|
||||
"HelpFAQ_Cat_General_102docker_head": "B\u0142\u0119dy bazy danych (AJAX errors, read-only, not found)",
|
||||
"HelpFAQ_Cat_General_102docker_text": "Sprawd\u017a jeszcze raz <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/dockerfiles\">dockerfile readme (naj\u015bwie\u017csze informacje)</a>.<br/><br/><ul data-sourcepos=\"49:4-52:146\" dir=\"auto\">Pobierz<a target=\"_blank\"href=\"https://github.com/jokob-sk/NetAlertX/blob/main/db/app.db\">oryginaln\u0105 baz\u0119 danych z GitHub</a>.</li><li data-sourcepos=\"50:4-50:195\">Zmapuj plik <code>app.db</code>(<g-emoji class=\"g-emoji\" alias=\"warning\" fallback-src=\"https://github.githubassets.com/images/icons/emoji/unicode/26a0.png\">\u26a0</g-emoji> nie folder) z \u015bcie\u017cki do <code>/app/db/app.db</code> (sprawd\u017a<a target=\"_blank\"href=\"https://github.com/jokob-sk/NetAlertX/tree/main/dockerfiles#-examples\">Przyk\u0142ady</a> by dowiedzie\u0107 si\u0119 wi\u0119cej).</li><li data-sourcepos=\"51:4-51:161\">Je\u017celi napotka\u0142e\u015b b\u0142\u0119dy (AJAX errors, can not write to DB, itp) upewnij sie \u017ce uprawnienia s\u0105 poprawne lub sprawd\u017a plik log\u00f3w w <code>/app/front/log</code>.</li><li data-sourcepos=\"52:4-52:146\">By naprawi\u0107 problemy spr\u00f3buj wykona\u0107 kopie zapasow\u0105 bazy danych i ja przywr\u00f3\u0107 za pomoc\u0105 sekcji <strong>Konserwacja> Kopia Zapasowa/Przywracanie</strong>.</li><li data-sourcepos=\"53:4-53:228\">Je\u017celi baza danych jest w trybie tylko do odczytu (read-only mode) mo\u017cesz to rozwi\u0105za\u0107 ustawiaj\u0105c w\u0142a\u015bciciela i grup\u0119 poprzez zastosowanie nast\u0119puj\u0105cej komendy w ho\u015bcie systemu: <code>docker exec netalertx chown -R www-data:www-data /app/db/app.db</code>.</li></ul>",
|
||||
"HelpFAQ_Cat_General_103_head": "Strona logowania nie pojawia si\u0119, nawet po zmianie has\u0142a.",
|
||||
"HelpFAQ_Cat_General_103_text": "Opr\u00f3cz zmiany has\u0142a, plik konfiguracji musi zawiera\u0107 <span class=\"text-danger help_faq_code\">/app/config/app.conf</span> oraz parametr <span class=\"text-danger help_faq_code\">PIALERT_WEB_PROTECTION</span> musi by\u0107 ustawiony na <span class=\"text-danger help_faq_code\">True</span>.",
|
||||
"HelpFAQ_Cat_Network_600_head": "Po co jest ta strona?",
|
||||
"HelpFAQ_Cat_Network_600_text": "Ta strona powinna zapewni\u0107 ci mo\u017cliwo\u015b\u0107 przypisania twoich urz\u0105dze\u0144 sieciowych. W tym celu mo\u017cesz tworzy\u0107 jeden lub wi\u0119cej switch'y, ruter\u00f3w itp, ustawi\u0107 im numery port\u00f3w je\u017celi to konieczne oraz przypisa\u0107 do nich ju\u017c wykryte urz\u0105dzenia. Przypisanie jest mo\u017cliwe w widoku szczeg\u00f3\u0142owym urz\u0105dzenia do przypisania. Dzi\u0119ki temu mo\u017cna szybko okre\u015bli\u0107, do kt\u00f3rego portu pod\u0142\u0105czony jest host i czy jest on online. Przeczytaj ten <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\">poradnik</a> po wi\u0119cej informacji.",
|
||||
"HelpFAQ_Cat_Network_601_head": "Czy jest te\u017c inna dokumentacja?",
|
||||
"HelpFAQ_Cat_Network_601_text": "Tak, istnieje! Sprawd\u017a <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/\"> wszystkie dokumentacje </a>po wi\u0119cej informacji.",
|
||||
"HelpFAQ_Cat_Presence_400_head": "Urz\u0105dzenia s\u0105 wy\u015bwietlane z \u017c\u00f3\u0142tym oznaczeniem i notatk\u0105 \"brakuje wydarzenia\".",
|
||||
"HelpFAQ_Cat_Presence_400_text": "Je\u017celi tak si\u0119 dzieje, masz mo\u017cliwo\u015b\u0107 usuni\u0119cia wydarzenia na danym urz\u0105dzenia (widok szczeg\u00f3\u0142owy). Kolejna mo\u017cliwo\u015b\u0107 to w\u0142\u0105czenie urz\u0105dzenia i oczekiwanie a\u017c NetAlertX wykryje urz\u0105dzenie jako \"online\" przy kolejnym skanowaniu, a nast\u0119pnie wy\u0142\u0105czenia ponownie urz\u0105dzenia. Teraz NetAlertX powinien poprawnie zanotowa\u0107 stan urz\u0105dzenia w bazie danych przy kolejnym skanowaniu.",
|
||||
"HelpFAQ_Cat_Presence_401_head": "Urz\u0105dzenie jest wy\u015bwietlane jako dost\u0119pne imo i\u017c jest \"Offline\".",
|
||||
"HelpFAQ_Cat_Presence_401_text": "Je\u017celi tak si\u0119 dzieje, to masz mo\u017cliwo\u015b\u0107 usuni\u0119cia wydarzenia na danym urz\u0105dzenia (widok szczeg\u00f3\u0142owy). Kolejna mo\u017cliwo\u015b\u0107 to w\u0142\u0105czenie urz\u0105dzenia i oczekiwanie a\u017c NetAlertX wykryje urz\u0105dzenie jako \"online\" przy kolejnym skanowaniu, a nast\u0119pnie wy\u0142\u0105czenia ponownie urz\u0105dzenia. Teraz NetAlertX powinien poprawnie zanotowa\u0107 stan urz\u0105dzenia w bazie danych przy kolejnym skanowaniu.",
|
||||
"HelpFAQ_Title": "Pomoc / FAQ",
|
||||
"LOG_LEVEL_description": "To ustawienie uruchomi bardziej dok\u0142adnie logi. U\u017cyteczne do debugowania powiadomie\u0144 czekaj\u0105cych w bazie danych.",
|
||||
"LOG_LEVEL_name": "Pokarz dodatkowe logi",
|
||||
"Loading": "Wczytywanie...",
|
||||
"Login_Box": "Wprowad\u017a has\u0142o",
|
||||
"Login_Default_PWD": "Podstawowe has\u0142o \"123456\" jest aktywne.",
|
||||
"Login_Psw-box": "Has\u0142o",
|
||||
"Login_Psw_alert": "Alert HAS\u0141A!",
|
||||
"Login_Psw_folder": "w folderze konfiguracji.",
|
||||
"Login_Psw_new": "nowe_has\u0142o",
|
||||
"Login_Psw_run": "By zmieni\u0107 has\u0142o wprowad\u017a:",
|
||||
"Login_Remember": "Zapami\u0119taj",
|
||||
"Login_Remember_small": "(aktualny przez 7 dni)",
|
||||
"Login_Submit": "Zaloguj",
|
||||
"Login_Toggle_Alert_headline": "Alert Has\u0142a!",
|
||||
"Login_Toggle_Info": "Informacje o ha\u015ble",
|
||||
"Login_Toggle_Info_headline": "Informacje o ha\u015ble",
|
||||
"Maintenance_Running_Version": "Zainstalowana wersja",
|
||||
"Maintenance_Status": "Status",
|
||||
"Maintenance_Title": "Narz\u0119dzia konserwacyjne",
|
||||
"Maintenance_Tool_ExportCSV": "Eksport CSV",
|
||||
"Maintenance_Tool_ExportCSV_noti": "Eksport CSV",
|
||||
"Maintenance_Tool_ExportCSV_noti_text": "Jeste\u015b pewien, \u017ce chcesz wygenerowa\u0107 plik CSV?",
|
||||
"Maintenance_Tool_ExportCSV_text": "Wygeneruj plik CSV (warto\u015bci oddzielone przecinkami) zawieraj\u0105cy list\u0119 Urz\u0105dze\u0144 zawieraj\u0105c\u0105 relacj\u0119 sieciow\u0105 miedzy W\u0119z\u0142ami Sieciowymi oraz po\u0142\u0105czone urz\u0105dzenia. Mo\u017cesz tak\u017ce wywo\u0142a\u0107 t\u0105 akcje wchodz\u0105c w ten link <code>your NetAlertX url/php/server/devices.php?action=ExportCSV</code> lub w\u0142\u0105czaj\u0105c plugin<a href=\"settings.php#CSVBCKP_header\">Kopia Zapasowa CSV</a>.",
|
||||
"Maintenance_Tool_ImportCSV": "Import CSV",
|
||||
"Maintenance_Tool_ImportCSV_noti": "Import CSV",
|
||||
"Maintenance_Tool_ImportCSV_noti_text": "Jeste\u015b pewien \u017ce chcesz zaimportowa\u0107 plik CSV? Nadpisze to wszystkie urz\u0105dzenie w bazie danych.",
|
||||
"Maintenance_Tool_ImportCSV_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_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": "",
|
||||
"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_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_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": "",
|
||||
"SCAN_SUBNETS_description": "",
|
||||
"SYSTEM_TITLE": "",
|
||||
"Setting_Override": "",
|
||||
"Setting_Override_Description": "",
|
||||
"Settings_Metadata_Toggle": "",
|
||||
"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": "",
|
||||
"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_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_label": "",
|
||||
"settings_saved": "",
|
||||
"settings_system_icon": "",
|
||||
"settings_system_label": "",
|
||||
"settings_update_item_warning": "",
|
||||
"test_event_icon": "",
|
||||
"test_event_tooltip": ""
|
||||
}
|
||||
670
front/php/templates/language/pt_br.json
Executable file
670
front/php/templates/language/pt_br.json
Executable file
@@ -0,0 +1,670 @@
|
||||
{
|
||||
"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": "",
|
||||
"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_Title": "",
|
||||
"DevDetail_MainInfo_Owner": "",
|
||||
"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_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_Owner": "",
|
||||
"Device_TableHead_Parent_MAC": "",
|
||||
"Device_TableHead_Port": "",
|
||||
"Device_TableHead_RowID": "",
|
||||
"Device_TableHead_Rowid": "",
|
||||
"Device_TableHead_Status": "",
|
||||
"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_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_AreYouSure": "",
|
||||
"Gen_Backup": "",
|
||||
"Gen_Cancel": "",
|
||||
"Gen_Copy": "",
|
||||
"Gen_DataUpdatedUITakesTime": "",
|
||||
"Gen_Delete": "",
|
||||
"Gen_DeleteAll": "",
|
||||
"Gen_Error": "",
|
||||
"Gen_Filter": "",
|
||||
"Gen_LockedDB": "",
|
||||
"Gen_Okay": "",
|
||||
"Gen_Purge": "",
|
||||
"Gen_ReadDocs": "",
|
||||
"Gen_Remove_All": "",
|
||||
"Gen_Remove_Last": "",
|
||||
"Gen_Restore": "",
|
||||
"Gen_Run": "",
|
||||
"Gen_Save": "",
|
||||
"Gen_Saved": "",
|
||||
"Gen_Search": "",
|
||||
"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": "",
|
||||
"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": "",
|
||||
"LOG_LEVEL_description": "",
|
||||
"LOG_LEVEL_name": "",
|
||||
"Loading": "",
|
||||
"Login_Box": "",
|
||||
"Login_Default_PWD": "",
|
||||
"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": "",
|
||||
"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_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_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": "",
|
||||
"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_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_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": "",
|
||||
"SCAN_SUBNETS_description": "",
|
||||
"SYSTEM_TITLE": "",
|
||||
"Setting_Override": "",
|
||||
"Setting_Override_Description": "",
|
||||
"Settings_Metadata_Toggle": "",
|
||||
"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": "",
|
||||
"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_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_label": "",
|
||||
"settings_saved": "",
|
||||
"settings_system_icon": "",
|
||||
"settings_system_label": "",
|
||||
"settings_update_item_warning": "",
|
||||
"test_event_icon": "",
|
||||
"test_event_tooltip": ""
|
||||
}
|
||||
1265
front/php/templates/language/ru_ru.json
Normal file → Executable file
1265
front/php/templates/language/ru_ru.json
Normal file → Executable file
File diff suppressed because one or more lines are too long
670
front/php/templates/language/zh_cn.json
Executable file
670
front/php/templates/language/zh_cn.json
Executable file
@@ -0,0 +1,670 @@
|
||||
{
|
||||
"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": "",
|
||||
"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_Title": "",
|
||||
"DevDetail_MainInfo_Owner": "",
|
||||
"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": "WoL唤醒 ",
|
||||
"DevDetail_Tools_WOL_noti": "局域网唤醒",
|
||||
"DevDetail_Tools_WOL_noti_text": "将唤醒命令被发送到广播地址。如果目标不在 NetAlertX 的子网/VLAN 中,目标设备将不会响应。",
|
||||
"DevDetail_Type_hover": "设备的类型。您选择任意预定义的网络设备(例如:AP、防火墙、路由器、交换机...),它们将作为可能的父网络节点显示在网络树配置中。",
|
||||
"DevDetail_Vendor_hover": "自动检测生产厂家。但你可以自定义.",
|
||||
"DevDetail_WOL_Title": "<i class=\"fa fa-power-off\"></i> 局域网唤醒",
|
||||
"DevDetail_button_AddIcon": "添加图标",
|
||||
"DevDetail_button_AddIcon_Help": "粘贴 SVG html 标签或 Font Awesome html 标签图标。阅读 <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">Icons docs</a> 了解详情.",
|
||||
"DevDetail_button_AddIcon_Tooltip": "Add a new Icon to this device that is not yet available in the dropdown.",
|
||||
"DevDetail_button_Delete": "删除设备",
|
||||
"DevDetail_button_DeleteEvents": "删除事件",
|
||||
"DevDetail_button_DeleteEvents_Warning": "您确定要删除此设备的所有事件吗?<br><br>(this will clear the <b>Events history</b> and the <b>Sessions</b> and might help with constant (persistent) notifications)",
|
||||
"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_Group": "组",
|
||||
"Device_TableHead_Icon": "图标",
|
||||
"Device_TableHead_LastIP": "IP",
|
||||
"Device_TableHead_LastIPOrder": "",
|
||||
"Device_TableHead_LastSession": "离开",
|
||||
"Device_TableHead_Location": "地点",
|
||||
"Device_TableHead_MAC": "随机 MAC",
|
||||
"Device_TableHead_MAC_full": "MAC",
|
||||
"Device_TableHead_Name": "名字",
|
||||
"Device_TableHead_Owner": "所有者",
|
||||
"Device_TableHead_Parent_MAC": "父节点",
|
||||
"Device_TableHead_Port": "端口",
|
||||
"Device_TableHead_RowID": "排行",
|
||||
"Device_TableHead_Rowid": "排行",
|
||||
"Device_TableHead_Status": "状态",
|
||||
"Device_TableHead_Type": "类型",
|
||||
"Device_TableHead_Vendor": "制造商",
|
||||
"Device_Table_Not_Network_Device": "",
|
||||
"Device_Table_info": "",
|
||||
"Device_Table_nav_next": "下一页",
|
||||
"Device_Table_nav_prev": "上一页",
|
||||
"Device_Tablelenght": "显示 _MENU_ 页",
|
||||
"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_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_AreYouSure": "",
|
||||
"Gen_Backup": "",
|
||||
"Gen_Cancel": "",
|
||||
"Gen_Copy": "",
|
||||
"Gen_DataUpdatedUITakesTime": "",
|
||||
"Gen_Delete": "",
|
||||
"Gen_DeleteAll": "",
|
||||
"Gen_Error": "",
|
||||
"Gen_Filter": "",
|
||||
"Gen_LockedDB": "",
|
||||
"Gen_Okay": "",
|
||||
"Gen_Purge": "",
|
||||
"Gen_ReadDocs": "",
|
||||
"Gen_Remove_All": "",
|
||||
"Gen_Remove_Last": "",
|
||||
"Gen_Restore": "",
|
||||
"Gen_Run": "",
|
||||
"Gen_Save": "",
|
||||
"Gen_Saved": "",
|
||||
"Gen_Search": "",
|
||||
"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": "",
|
||||
"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": "",
|
||||
"LOG_LEVEL_description": "",
|
||||
"LOG_LEVEL_name": "",
|
||||
"Loading": "",
|
||||
"Login_Box": "",
|
||||
"Login_Default_PWD": "",
|
||||
"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": "",
|
||||
"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_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_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": "",
|
||||
"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_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_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": "",
|
||||
"SCAN_SUBNETS_description": "",
|
||||
"SYSTEM_TITLE": "",
|
||||
"Setting_Override": "",
|
||||
"Setting_Override_Description": "",
|
||||
"Settings_Metadata_Toggle": "",
|
||||
"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": "",
|
||||
"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_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_label": "",
|
||||
"settings_saved": "",
|
||||
"settings_system_icon": "",
|
||||
"settings_system_label": "",
|
||||
"settings_update_item_warning": "",
|
||||
"test_event_icon": "",
|
||||
"test_event_tooltip": ""
|
||||
}
|
||||
@@ -12,15 +12,15 @@
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
|
||||
<div class="modal-header" >
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 id="modal-ok-title" class="modal-title"> Modal Default Title </h4>
|
||||
</div>
|
||||
|
||||
<div id="modal-ok-message" class="modal-body"> Modal Default message </div>
|
||||
|
||||
<div class="modal-footer">
|
||||
<button id="modal-ok-OK" type="button" class="btn btn-primary" style="min-width: 80px;" data-dismiss="modal"> OK </button>
|
||||
<div class="modal-footer">
|
||||
<button id="modal-ok-OK" type="button" class="btn btn-primary btn-modal-submit" style="min-width: 80px;" data-dismiss="modal"> OK </button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.modal-content -->
|
||||
@@ -33,7 +33,7 @@
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
|
||||
<div class="modal-header" >
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 id="modal-default-title" class="modal-title"> Modal Default Title </h4>
|
||||
</div>
|
||||
@@ -41,8 +41,8 @@
|
||||
<div id="modal-default-message" class="modal-body"> Modal Default message </div>
|
||||
|
||||
<div class="modal-footer">
|
||||
<button id="modal-default-cancel" type="button" class="btn btn-default pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
|
||||
<button id="modal-default-OK" type="button" class="btn btn-primary" style="min-width: 80px;" onclick="modalDefaultOK()"> OK </button>
|
||||
<button id="modal-default-cancel" type="button" class="btn btn-default pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
|
||||
<button id="modal-default-OK" type="button" class="btn btn-primary btn-modal-submit" style="min-width: 80px;" onclick="modalDefaultOK()"> OK </button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.modal-content -->
|
||||
@@ -55,7 +55,7 @@
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
|
||||
<div class="modal-header" >
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 id="modal-str-title" class="modal-title"> Modal Default Title </h4>
|
||||
</div>
|
||||
@@ -63,15 +63,15 @@
|
||||
<div id="modal-str-message" class="modal-body"> Modal Default message </div>
|
||||
|
||||
<div class="modal-footer">
|
||||
<button id="modal-str-cancel" type="button" class="btn btn-default pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
|
||||
<button id="modal-str-OK" type="button" class="btn btn-primary" style="min-width: 80px;" > OK </button>
|
||||
<button id="modal-str-cancel" type="button" class="btn btn-default pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
|
||||
<button id="modal-str-OK" type="button" class="btn btn-primary btn-modal-submit" style="min-width: 80px;"> OK </button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.modal-content -->
|
||||
</div>
|
||||
<!-- /.modal-dialog -->
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<!-- Modal warning -->
|
||||
<div class="modal modal-warning fade" id="modal-warning" style="display: none;">
|
||||
@@ -86,15 +86,15 @@
|
||||
<div id="modal-warning-message" class="modal-body"> Modal message </div>
|
||||
|
||||
<div class="modal-footer">
|
||||
<button id="modal-warning-cancel" type="button" class="btn btn-outline pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
|
||||
<button id="modal-warning-OK" type="button" class="btn btn-outline" style="min-width: 80px;" onclick="modalWarningOK()"> OK </button>
|
||||
<button id="modal-warning-cancel" type="button" class="btn btn-outline pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
|
||||
<button id="modal-warning-OK" type="button" class="btn btn-outline btn-modal-submit" style="min-width: 80px;" onclick="modalWarningOK()"> OK </button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Modal input -->
|
||||
<!-- Modal textarea input -->
|
||||
<div class="modal modal-warning fade" id="modal-input" style="display: none;">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
@@ -106,11 +106,39 @@
|
||||
|
||||
<div id="modal-input-message" class="modal-body"> Modal message </div>
|
||||
|
||||
<textarea id="modal-input-textarea" class="logs" cols="30" rows="3" wrap='off' ></textarea>
|
||||
<textarea id="modal-input-textarea" class="logs" cols="30" rows="3" wrap='off' autofocus ></textarea>
|
||||
|
||||
<div class="modal-footer">
|
||||
<button id="modal-input-cancel" type="button" class="btn btn-outline pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
|
||||
<button id="modal-input-OK" type="button" class="btn btn-outline" style="min-width: 80px;" onclick="modalDefaultInput()"> OK </button>
|
||||
<button id="modal-input-cancel" type="button" class="btn btn-outline pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
|
||||
<button id="modal-input-OK" type="button" class="btn btn-outline btn-modal-submit" style="min-width: 80px;" onclick="modalDefaultInput()"> OK </button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Modal field input -->
|
||||
<div class="modal modal-warning fade" id="modal-field-input" style="display: none;">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 id="modal-field-input-title" class="modal-title"> Modal Title </h4>
|
||||
</div>
|
||||
|
||||
<div id="modal-field-input-message" class="modal-body"> Modal message </div>
|
||||
|
||||
<input id="modal-field-input-field" class="modal-field-input" type="text" onfocus="this.value = this.value;" autofocus ></input>
|
||||
|
||||
<div class="modal-footer">
|
||||
<button id="modal-field-input-cancel" type="button" class="btn btn-outline pull-left" style="min-width: 80px;" data-dismiss="modal">
|
||||
Cancel
|
||||
</button>
|
||||
<button id="modal-field-input-OK" type="button" class="btn btn-outline btn-modal-submit" style="min-width: 80px;" onclick="modalDefaultFieldInput()">
|
||||
OK
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -128,5 +156,4 @@
|
||||
<!-- Sticky Announcement -->
|
||||
<div id="tickerAnnouncement" class="ticker_announcement myhidden">
|
||||
<div id="ticker-message"> Announcement message </div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -29,18 +29,18 @@ $config_file_lines = file($config_file);
|
||||
$CookieSaveLoginName = "NetAlertX_SaveLogin";
|
||||
|
||||
// ###################################
|
||||
// ## PIALERT_WEB_PROTECTION FALSE
|
||||
// ## SETPWD_enable_password FALSE
|
||||
// ###################################
|
||||
|
||||
$config_file_lines_bypass = array_values(preg_grep('/^PIALERT_WEB_PROTECTION.*=/', $config_file_lines));
|
||||
$config_file_lines_bypass = array_values(preg_grep('/^SETPWD_enable_password.*=/', $config_file_lines));
|
||||
$protection_line = explode("=", $config_file_lines_bypass[0]);
|
||||
$Pia_WebProtection = strtolower(trim($protection_line[1]));
|
||||
|
||||
// ###################################
|
||||
// ## PIALERT_WEB_PROTECTION TRUE
|
||||
// ## SETPWD_enable_password TRUE
|
||||
// ###################################
|
||||
|
||||
$config_file_lines = array_values(preg_grep('/^PIALERT_WEB_PASSWORD.*=/', $config_file_lines));
|
||||
$config_file_lines = array_values(preg_grep('/^SETPWD_password.*=/', $config_file_lines));
|
||||
$password_line = explode("'", $config_file_lines[0]);
|
||||
$Pia_Password = $password_line[1];
|
||||
|
||||
|
||||
@@ -11,11 +11,16 @@
|
||||
# cvc90 2023 https://github.com/cvc90 GNU GPLv3 #
|
||||
#---------------------------------------------------------------------------------#
|
||||
|
||||
$filename = "/app/.VERSION";
|
||||
if(file_exists($filename)) {
|
||||
echo file_get_contents($filename);
|
||||
$filename = "/app/.VERSION";
|
||||
if(file_exists($filename)) {
|
||||
$fileContents = file_get_contents($filename);
|
||||
if(trim($fileContents) === 'Dev') {
|
||||
echo date('H:i:s') . " - " . $fileContents;
|
||||
} else {
|
||||
echo $fileContents;
|
||||
}
|
||||
else{
|
||||
echo "File not found";
|
||||
}
|
||||
}
|
||||
else {
|
||||
echo date('H:i:s') . " - N/A";
|
||||
}
|
||||
?>
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
> Community translations of this file (might be out-of-date): <a href="https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/README_ES.md">Spanish(<img src="https://github.com/lipis/flag-icons/blob/main/flags/4x3/es.svg" alt="README_ES.md" style="height: 16px !important;width: 20px !important;padding-inline:3px !important;">)</a>, <a href="https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/README_DE.md">German(<img src="https://github.com/lipis/flag-icons/blob/main/flags/4x3/de.svg" alt="README_DE.md" style="height: 16px !important;width: 20px !important;padding-inline:3px !important;">)</a>
|
||||
|
||||
# 📚 Docs for individual plugins
|
||||
|
||||
>[!NOTE]
|
||||
@@ -29,7 +27,7 @@
|
||||
| | Yes | PIHOLE | External SQLite DB | 🔍dev scanner | 📚[pihole_scan](/front/plugins/pihole_scan/) |
|
||||
| | | PUSHSAFER | Script | 💬 publisher | 📚[_publisher_pushsafer](/front/plugins/_publisher_pushsafer/) |
|
||||
| | | PUSHOVER | Script | 💬 publisher | 📚[_pushover_pushsafer](/front/plugins/_publisher_pushover/) |
|
||||
| | | SETPWD | Script | ⚙ system | 📚[set_password](/front/plugins/set_password/) |
|
||||
| Yes | | SETPWD | Template | ⚙ system | 📚[set_password](/front/plugins/set_password/) |
|
||||
| | | SMTP | Script | 💬 publisher | 📚[_publisher_email](/front/plugins/_publisher_email/) |
|
||||
| | Yes | SNMPDSC | Script | 🔍dev scanner | 📚[snmp_discovery](/front/plugins/snmp_discovery/) |
|
||||
| | Yes** | UNDIS | Script | ♻ other | 📚[undiscoverables](/front/plugins/undiscoverables/) |
|
||||
|
||||
@@ -1,8 +1,200 @@
|
||||
## Overview
|
||||
# Overview
|
||||
|
||||
- Feed your data and device changes into [Home Assistant](https://github.com/jokob-sk/NetAlertX/blob/main/docs/HOME_ASSISTANT.md) via the MQTT Mosquito broker.
|
||||
- Feed your data and device changes into [Home Assistant](https://github.com/jokob-sk/NetAlertX/blob/main/docs/HOME_ASSISTANT.md) via the MQTT Mosquito broker (other brokers might work as well).
|
||||
|
||||
### Usage
|
||||
# Usage
|
||||
|
||||
- Go to settings and fill in relevant details.
|
||||
- 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.
|
||||
|
||||
|
||||
|
||||
# Sample Payloads
|
||||
|
||||
## 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.
|
||||
|
||||
### MQTT discovery data:
|
||||
|
||||
>[!NOTE]
|
||||
> You can replace the `netalertx` string of the below topic via the `DEVICE_ID` setting.
|
||||
|
||||
Topic: `homeassistant/sensor/netalertx/online/config`
|
||||
|
||||
|
||||
>[!NOTE]
|
||||
> You can replace the `"name": "NetAlertX"` string of the below payload via the `DEVICE_NAME` setting.
|
||||
|
||||
Payload:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "online",
|
||||
"state_topic": "system-sensors/sensor/netalertx/state",
|
||||
"value_template": "{{value_json.online}}",
|
||||
"unique_id": "netalertx_sensor_online",
|
||||
"device": {
|
||||
"identifiers": [
|
||||
"netalertx_sensor"
|
||||
],
|
||||
"manufacturer": "NetAlertX",
|
||||
"name": "NetAlertX"
|
||||
},
|
||||
"icon": "mdi:wifi-check",
|
||||
"platform": "mqtt"
|
||||
}
|
||||
```
|
||||
|
||||
### MQTT config data sample:
|
||||
|
||||
>[!NOTE]
|
||||
> You can replace the `netalertx` string of the below topic via the `DEVICE_ID` setting.
|
||||
|
||||
Topic: `homeassistant/sensor/netalertx/all/config`
|
||||
|
||||
Payload:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "all",
|
||||
"state_topic": "system-sensors/sensor/netalertx/state",
|
||||
"value_template": "{{value_json.all}}",
|
||||
"unique_id": "netalertx_sensor_all",
|
||||
"device": {
|
||||
"identifiers": [
|
||||
"netalertx_sensor"
|
||||
],
|
||||
"manufacturer": "NetAlertX",
|
||||
"name": "NetAlertX"
|
||||
},
|
||||
"icon": "mdi:wifi",
|
||||
"platform": "mqtt"
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
### MQTT state data:
|
||||
|
||||
>[!NOTE]
|
||||
> You can replace the `netalertx` string of the below topic via the `DEVICE_ID` setting.
|
||||
|
||||
Topic: `system-sensors/sensor/netalertx/state`
|
||||
|
||||
Payload:
|
||||
|
||||
```json
|
||||
{
|
||||
"online": 30,
|
||||
"down": 36,
|
||||
"all": 66,
|
||||
"archived": 0,
|
||||
"new": 0,
|
||||
"unknown": 0
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## Individual devices
|
||||
|
||||
The below payloads apply to individual devices. Every device discovered by the application will generate the below messages. You can toggle them on/off with the `SEND_DEVICES` setting.
|
||||
|
||||
### MQTT discovery data:
|
||||
|
||||
Topic: `homeassistant/sensor/mac_44_ef_44_ef_44_ef/last_ip/config`
|
||||
|
||||
Payload:
|
||||
|
||||
```json
|
||||
|
||||
{
|
||||
"name": "last_ip",
|
||||
"state_topic": "system-sensors/sensor/mac_44_ef_44_ef_44_ef/state",
|
||||
"value_template": "{{value_json.last_ip}}",
|
||||
"unique_id": "mac_44_ef_44_ef_44_ef_sensor_last_ip",
|
||||
"device": {
|
||||
"identifiers": [
|
||||
"mac_44_ef_44_ef_44_ef_sensor"
|
||||
],
|
||||
"manufacturer": "NetAlertX",
|
||||
"name": "Camera - E1"
|
||||
},
|
||||
"icon": "mdi:ip-network",
|
||||
"platform": "mqtt"
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
### MQTT state data:
|
||||
|
||||
Topic: `system-sensors/sensor/mac_44_ef_44_ef_44_ef/state`
|
||||
|
||||
Payload:
|
||||
|
||||
```json
|
||||
{
|
||||
"last_ip": "192.168.1.33",
|
||||
"is_new": "0",
|
||||
"vendor": "None",
|
||||
"mac_address": "44:ef:44:ef:44:ef"
|
||||
}
|
||||
```
|
||||
|
||||
### Transmitted message examples:
|
||||
|
||||
Topic: `homeassistant/binary_sensor/mac_44_ef_44_ef_44_ef/is_present/`
|
||||
|
||||
Payload:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "is_present",
|
||||
"state_topic": "system-sensors/binary_sensor/mac_44_ef_44_ef_44_ef/state",
|
||||
"value_template": "{{value_json.is_present}}",
|
||||
"unique_id": "mac_44_ef_44_ef_44_ef_sensor_is_present",
|
||||
"device": {
|
||||
"identifiers": [
|
||||
"mac_44_ef_44_ef_44_ef_sensor"
|
||||
],
|
||||
"manufacturer": "NetAlertX",
|
||||
"name": "Camera - E1"
|
||||
},
|
||||
"icon": "mdi:wifi",
|
||||
"platform": "mqtt"
|
||||
}
|
||||
```
|
||||
|
||||
Topic: `system-sensors/binary_sensor/mac_44_ef_44_ef_44_ef/state`
|
||||
|
||||
Payload:
|
||||
|
||||
```json
|
||||
{
|
||||
"is_present": "OFF"
|
||||
}
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"is_present": "ON"
|
||||
}
|
||||
```
|
||||
|
||||
>[!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
|
||||
|
||||
The first run will take a while, subsequent should be much faster because new sensors don't have to be created anymore. If the first sync times out, try to increase the timeout setting (default: 10s per device). A bit of background:
|
||||
|
||||
1. The app keeps a hash of the sensors. The hash includes:
|
||||
- deviceId: Unique identifier for the device associated with the sensor.
|
||||
- deviceName: Name of the device.
|
||||
- sensorType: Type of sensor.
|
||||
- sensorName: Name of the sensor.
|
||||
- icon: Icon associated with the sensor.
|
||||
2. This hash is compared to existing MQTT plugin object hashes, which can be found under Integrations > Plugins > MQTT (Plugin objects tab) > Hash
|
||||
3. If the hash is not found, a new device/device state is assumed and the device is sent to the broker
|
||||
|
||||
|
||||
The state is managed differently, the state of the sensor is not included in the hash. This might be improved upon in later releases.
|
||||
|
||||
@@ -332,7 +332,7 @@
|
||||
{
|
||||
"function": "RUN_TIMEOUT",
|
||||
"type": "integer",
|
||||
"default_value": 10,
|
||||
"default_value": 20,
|
||||
"options": [],
|
||||
"localized": ["name", "description"],
|
||||
"name" : [{
|
||||
@@ -448,6 +448,88 @@
|
||||
"string" : "Contraseña utilizada para iniciar sesión en su instancia de agente de MQTT."
|
||||
}]
|
||||
},
|
||||
{
|
||||
"function": "SEND_STATS",
|
||||
"type": "boolean",
|
||||
"default_value":true,
|
||||
"options": [],
|
||||
"localized": ["name", "description"],
|
||||
"name" : [{
|
||||
"language_code":"en_us",
|
||||
"string" : "Send stats"
|
||||
}
|
||||
],
|
||||
"description": [{
|
||||
"language_code":"en_us",
|
||||
"string" : "Check to send overal device stats, such as number of Online and Offline devices."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "DEVICE_ID",
|
||||
"type": "text",
|
||||
"default_value": "netalertx",
|
||||
"options": [],
|
||||
"localized": ["name", "description"],
|
||||
"name" : [{
|
||||
"language_code": "en_us",
|
||||
"string" : "Device ID"
|
||||
}],
|
||||
"description": [{
|
||||
"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."
|
||||
}]
|
||||
},
|
||||
{
|
||||
"function": "DEVICE_NAME",
|
||||
"type": "text",
|
||||
"default_value": "NetAlertX",
|
||||
"options": [],
|
||||
"localized": ["name", "description"],
|
||||
"name" : [{
|
||||
"language_code": "en_us",
|
||||
"string" : "Device name"
|
||||
}],
|
||||
"description": [{
|
||||
"language_code": "en_us",
|
||||
"string" : "The name used for the stats overview device."
|
||||
}]
|
||||
},
|
||||
{
|
||||
"function": "SEND_DEVICES",
|
||||
"type": "boolean",
|
||||
"default_value":true,
|
||||
"options": [],
|
||||
"localized": ["name", "description"],
|
||||
"name" : [{
|
||||
"language_code":"en_us",
|
||||
"string" : "Send devices"
|
||||
}
|
||||
],
|
||||
"description": [{
|
||||
"language_code":"en_us",
|
||||
"string" : "Check to send individual devices to the broker with details, such as <code>is_new</code>, <code>is_present</code>, or <code>mac_address</code> of the devices."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "PRESENCE_SENSOR_TYPE",
|
||||
"events": [],
|
||||
"type": "text.select",
|
||||
"default_value":"binary_sensor",
|
||||
"options": ["binary_sensor", "device_tracker" ],
|
||||
"localized": ["name", "description"],
|
||||
"name" :[{
|
||||
"language_code": "en_us",
|
||||
"string" : "Presence Sensor Type"
|
||||
}],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string" : "The type of the sensor that should be generated for the <code>is_present</code> sensor. Inserted into the <code>homeassistant/{PRESENCE_SENSOR_TYPE}/mac_44_ef_44_ef_44_ef/is_present/</code> topic. See the <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/_publisher_mqtt/README.md#usage\">Plugin readme</a> for details."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "QOS",
|
||||
"type": "integer.select",
|
||||
@@ -508,40 +590,6 @@
|
||||
"language_code": "es_es",
|
||||
"string" : "Un pequeño truco: retrase la adición a la cola en caso de que el proceso se reinicie y los procesos de publicación anteriores se anulen (se necesitan ~<code>2</code>s para actualizar la configuración de un sensor en el intermediario). Probado con <code>2</code>-<code>3</code> segundos de retraso. Este retraso solo se aplica cuando se crean dispositivos (durante el primer bucle de notificación). No afecta los escaneos o notificaciones posteriores."
|
||||
}]
|
||||
},
|
||||
{
|
||||
"function": "SEND_STATS",
|
||||
"type": "boolean",
|
||||
"default_value":true,
|
||||
"options": [],
|
||||
"localized": ["name", "description"],
|
||||
"name" : [{
|
||||
"language_code":"en_us",
|
||||
"string" : "Send stats"
|
||||
}
|
||||
],
|
||||
"description": [{
|
||||
"language_code":"en_us",
|
||||
"string" : "Check to send overal device stats, such as number of Online and Offline devices."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "SEND_DEVICES",
|
||||
"type": "boolean",
|
||||
"default_value":true,
|
||||
"options": [],
|
||||
"localized": ["name", "description"],
|
||||
"name" : [{
|
||||
"language_code":"en_us",
|
||||
"string" : "Send devices"
|
||||
}
|
||||
],
|
||||
"description": [{
|
||||
"language_code":"en_us",
|
||||
"string" : "Check to send individual devices to the broker with details, such as <code>is_new</code>, <code>is_present</code>, or <code>mac_address</code> of the devices."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -106,10 +106,12 @@ class sensor_config:
|
||||
|
||||
if plugObj == {}:
|
||||
self.isNew = True
|
||||
mylog('verbose', [f"[{pluginName}] New sensor entry name : {deviceName}"])
|
||||
mylog('verbose', [f"[{pluginName}] New sensor entry mac : {mac}"])
|
||||
mylog('verbose', [f"[{pluginName}] New sensor entry input_string : {input_string}"])
|
||||
mylog('verbose', [f"[{pluginName}] New sensor entry hash_value : {hash_value}"])
|
||||
else:
|
||||
device_name = plugObj.get("Watched_Value1", "Unknown")
|
||||
mylog('verbose', [f"[{pluginName}] Existing, skip Device Name : {device_name}"])
|
||||
self.isNew = False
|
||||
|
||||
|
||||
@@ -171,11 +173,8 @@ def publish_mqtt(mqtt_client, topic, message):
|
||||
return True
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
def create_generic_device(mqtt_client):
|
||||
|
||||
deviceName = 'NetAlertX'
|
||||
deviceId = 'netalertx'
|
||||
|
||||
def create_generic_device(mqtt_client, deviceId, deviceName):
|
||||
|
||||
create_sensor(mqtt_client, deviceId, deviceName, 'sensor', 'online', 'wifi-check')
|
||||
create_sensor(mqtt_client, deviceId, deviceName, 'sensor', 'down', 'wifi-cancel')
|
||||
create_sensor(mqtt_client, deviceId, deviceName, 'sensor', 'all', 'wifi')
|
||||
@@ -277,19 +276,24 @@ def mqtt_start(db):
|
||||
if mqtt_connected_to_broker == False:
|
||||
mqtt_connected_to_broker = True
|
||||
mqtt_client = mqtt_create_client()
|
||||
|
||||
|
||||
deviceName = get_setting_value('MQTT_DEVICE_NAME')
|
||||
deviceId = get_setting_value('MQTT_DEVICE_ID')
|
||||
presenceSenType = get_setting_value('PRESENCE_SENSOR_TYPE')
|
||||
|
||||
# General stats
|
||||
|
||||
# Create a generic device for overal stats
|
||||
if get_setting_value('MQTT_SEND_STATS') == True:
|
||||
# Create a new device representing overall stats
|
||||
create_generic_device(mqtt_client)
|
||||
create_generic_device(mqtt_client, deviceId, deviceName)
|
||||
|
||||
# Get the data
|
||||
row = get_device_stats(db)
|
||||
|
||||
# Publish (wrap into {} and remove last ',' from above)
|
||||
publish_mqtt(mqtt_client, "system-sensors/sensor/netalertx/state",
|
||||
publish_mqtt(mqtt_client, f"system-sensors/sensor/{deviceId}/state",
|
||||
{
|
||||
"online": row[0],
|
||||
"down": row[1],
|
||||
@@ -321,7 +325,7 @@ def mqtt_start(db):
|
||||
deviceNameDisplay = re.sub('[^a-zA-Z0-9-_\s]', '', device["dev_Name"])
|
||||
|
||||
create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'last_ip', 'ip-network', device["dev_MAC"])
|
||||
create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'binary_sensor', 'is_present', 'wifi', device["dev_MAC"])
|
||||
create_sensor(mqtt_client, deviceId, deviceNameDisplay, presenceSenType, 'is_present', 'wifi', device["dev_MAC"])
|
||||
create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'mac_address', 'folder-key-network', device["dev_MAC"])
|
||||
create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'is_new', 'bell-alert-outline', device["dev_MAC"])
|
||||
create_sensor(mqtt_client, deviceId, deviceNameDisplay, 'sensor', 'vendor', 'cog', device["dev_MAC"])
|
||||
@@ -337,7 +341,7 @@ def mqtt_start(db):
|
||||
}
|
||||
)
|
||||
|
||||
publish_mqtt(mqtt_client, 'system-sensors/binary_sensor/'+deviceId+'/state',
|
||||
publish_mqtt(mqtt_client, f'system-sensors/{presenceSenType}/{deviceId}/state',
|
||||
{
|
||||
"is_present": to_binary_sensor(str(device["dev_PresentLastScan"]))
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
## Overview
|
||||
|
||||
Arp-scan is a command-line tool that uses the ARP protocol to discover and fingerprint IP hosts on the local network. An alternative to ARP scan is to enable the `PIHOLE_RUN` PiHole integration settings. The arp-scan (and other Network-scan plugin times using the `SCAN_SUBNETS` setting) time depends on the number of IP addresses to check so set this up carefully with the appropriate network mask and interface. Check the [subnets documentation](https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md) for help on setting up VLANs, what VLANs are supported, or how to figure out the network mask and your interface.
|
||||
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.
|
||||
|
||||
### Usage
|
||||
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Specify when your Network-discovery scan will run. Typical setting would be <code>schedule</code> and then you specify a cron-like schedule in the <a href=\"#ARPSCAN_RUN_SCHD\"><code>ARPSCAN_RUN_SCHD</code>setting</a>. ⚠ Use the same schedule if you have multiple <i class=\"fa-solid fa-magnifying-glass-plus\"></i> Device scanners enabled."
|
||||
"string": "Specify when your Network-discovery scan will run. Typical setting would be <code>schedule</code> and then you specify a cron-like schedule in the <a href=\"#ARPSCAN_RUN_SCHD\"><code>ARPSCAN_RUN_SCHD</code>setting</a>. ⚠ Use the same schedule if you have multiple <i class=\"fa-solid fa-magnifying-glass-plus\"></i> Device scanners enabled. <br/><br/> Depends on the <a onclick=\"toggleAllSettings()\" href=\"#SCAN_SUBNETS\"><code>SCAN_SUBNETS</code> setting</a>."
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
|
||||
@@ -1,15 +1,3 @@
|
||||
### Community translations of this file
|
||||
|
||||
<a href="https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/csv_backup/README_ES.md">
|
||||
<img src="https://github.com/lipis/flag-icons/blob/main/flags/4x3/es.svg" alt="README_ES.md" style="height: 20px !important;width: 20px !important;">
|
||||
Spanish (Spain)
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://github.com/jokob-sk/NetAlertX/blob/main/front/plugins/csv_backup/README_DE.md">
|
||||
<img src="https://github.com/lipis/flag-icons/blob/main/flags/4x3/de.svg" alt="README_DE.md" style="height: 20px !important;width: 20px !important;">
|
||||
German (Germany)
|
||||
</a>
|
||||
|
||||
## Overview
|
||||
|
||||
Plugin generating CSV backups of your Devices database table, including the network mappings. Can be used for importing your setup via the Maintenance > Backup / Restore > CSV Import feature (See also: [Devices Bulk Editing](https://github.com/jokob-sk/NetAlertX/blob/main/docs/DEVICES_BULK_EDITING.md)).
|
||||
|
||||
@@ -6,6 +6,8 @@ A plugin allowing for importing devices from DHCP.leases files.
|
||||
|
||||
- Specify full paths of all `dhcp.leases` files you want to import and watch in the `DHCPLSS_paths_to_check`setting.
|
||||
- Map the paths specified in the `DHCPLSS_paths_to_check`setting in your `docker-compose.yml` file.
|
||||
- If you are using pihole or dnsmasq dhcp.leases, include `pihole` or `dnsmasq` into the mapping path respectively, check the below example for details
|
||||
|
||||
|
||||
#### Example:
|
||||
|
||||
@@ -18,20 +20,47 @@ A plugin allowing for importing devices from DHCP.leases files.
|
||||
# mapping different dhcp.leases files
|
||||
- /first/location/dhcp.leases:/mnt/dhcp1.leases
|
||||
- /second/location/dhcp.leases:/mnt/dhcp2.leases
|
||||
- /third/location/dhcp.leases:/etc/pihole/dhcp.leases # a pihole specific dhcp.leases file
|
||||
- /fourth/location/dhcp.leases:/etc/dnsmasq/dhcp.leases # a dnsmasq specific dhcp.leases file
|
||||
...
|
||||
```
|
||||
|
||||
`DHCPLSS_paths_to_check` Setting:
|
||||
The `DHCPLSS_paths_to_check` setting should then contain the following:
|
||||
|
||||
```python
|
||||
DHCPLSS_paths_to_check = ['/mnt/dhcp1.leases','/mnt/dhcp2.leases']
|
||||
DHCPLSS_paths_to_check = ['/mnt/dhcp1.leases','/mnt/dhcp2.leases','/etc/pihole/dhcp.leases','/etc/dnsmasq/dhcp.leases']
|
||||
```
|
||||
|
||||
### Notes
|
||||
|
||||
- No specific configuration needed.
|
||||
No specific configuration is needed. This plugin supports `dhcp.leases` file(s) in the following formats:
|
||||
|
||||
1. PiHole
|
||||
2. Dnsmasq
|
||||
3. Generic format
|
||||
|
||||
#### pihole format
|
||||
|
||||
Example File Format: _(not all lines are required)_
|
||||
|
||||
```
|
||||
TBC
|
||||
```
|
||||
|
||||
#### dnsmasq format
|
||||
|
||||
`[Lease expiry time] [mac address] [ip address] [hostname] [client id, if known]`
|
||||
|
||||
Example File Format: _(not all lines are required)_
|
||||
|
||||
```
|
||||
1715932537 01:5c:5c:5c:5c:5c:5c 192.168.1.115 ryans-laptop 01:5c:5c:5c:5c:5c:5c
|
||||
```
|
||||
|
||||
> Note, only `[mac address] [ip address] [hostname]` are captured
|
||||
|
||||
#### Generic format
|
||||
|
||||
- This plugin expects the dhcp.leases file(s) to be in the format of **dhcpd.leases** that is different to the format that PiHole uses.
|
||||
[dhcpd.leases(5) - Linux man page]( https://linux.die.net/man/5/dhcpd.leases#:~:text=This%20database%20is%20a%20free,file%20is%20the%20current%20one.)
|
||||
|
||||
Example File Format: _(not all lines are required)_
|
||||
@@ -50,4 +79,4 @@ lease 192.168.79.15 {
|
||||
option agent.remote-id c0:a8:9:5;
|
||||
client-hostname "android-8182e21c852776e7";
|
||||
}
|
||||
```
|
||||
```
|
||||
@@ -56,6 +56,7 @@ def get_entries(path, plugin_objects):
|
||||
# Use the detected encoding
|
||||
encoding = result['encoding']
|
||||
|
||||
# Order: MAC, IP, IsActive, NAME, Hardware
|
||||
# Handle pihole-specific dhcp.leases files
|
||||
if 'pihole' in path:
|
||||
with open(path, 'r', encoding=encoding, errors='replace') as f:
|
||||
@@ -72,6 +73,24 @@ def get_entries(path, plugin_objects):
|
||||
extra = handleEmpty(path),
|
||||
foreignKey = handleEmpty(row[1])
|
||||
)
|
||||
elif 'dnsmasq' in path:
|
||||
# [Lease expiry time] [mac address] [ip address] [hostname] [client id, if known]
|
||||
# e.g.
|
||||
# 1715932537 01:5c:5c:5c:5c:5c:5c 192.168.1.115 ryans-laptop 01:5c:5c:5c:5c:5c:5c
|
||||
with open(path, 'r', encoding=encoding, errors='replace') as f:
|
||||
for line in f:
|
||||
row = line.rstrip().split()
|
||||
if len(row) > 3:
|
||||
plugin_objects.add_object(
|
||||
primaryId = handleEmpty(row[1]),
|
||||
secondaryId = handleEmpty(row[2]),
|
||||
watched1 = handleEmpty('True'),
|
||||
watched2 = handleEmpty(row[3]),
|
||||
watched3 = '',
|
||||
watched4 = handleEmpty('True'),
|
||||
extra = handleEmpty(path),
|
||||
foreignKey = handleEmpty(row[1])
|
||||
)
|
||||
else:
|
||||
# Handle generic dhcp.leases files
|
||||
leases = DhcpLeases(path)
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
## Overview
|
||||
|
||||
Plugin to run regular Internet connectivity and IP checks.
|
||||
Plugin to run regular Internet connectivity and IP checks. Change the [dig utility](https://linux.die.net/man/1/dig) arguments if you have issues resolving your Internet IP. Arguments are added at the end of the following command: `dig +short`. Tested with:
|
||||
|
||||
- `@ns1.google.com -t txt o-o.myaddr.l.google.com`
|
||||
- `-4 myip.opendns.com @resolver1.opendns.com`
|
||||
|
||||
### Usage
|
||||
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Change the <a href=\"https://linux.die.net/man/1/dig\" target=\"_blank\">dig utility</a> arguments if you have issues resolving your Internet IP. Arguments are added at the end of the following command: <code>dig +short </code>."
|
||||
"string": "Change the <a href=\"https://linux.die.net/man/1/dig\" target=\"_blank\">dig utility</a> arguments if you have issues resolving your Internet IP. Arguments are added at the end of the following command: <code>dig +short </code>. Tested with: <br/> <ul> <li><code>@ns1.google.com -t txt o-o.myaddr.l.google.com</code></li><li> <code>-4 myip.opendns.com @resolver1.opendns.com</code></li></ul>"
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
|
||||
@@ -605,6 +605,25 @@
|
||||
"string": "The icon associated with the device. Check the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">documentation on icons</a> for more details."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "LESS_NAME_CLEANUP",
|
||||
"type": "integer.checkbox",
|
||||
"default_value": 0,
|
||||
"options": [],
|
||||
"localized": ["name", "description"],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Less Name Cleanup"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Check to start using the new code for cleaning device names. Removes all labels starting with underscore and removes network domain and search list."
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"required": [
|
||||
@@ -627,10 +646,9 @@
|
||||
"dev_Archived",
|
||||
"dev_Network_Node_MAC_ADDR",
|
||||
"dev_Network_Node_port",
|
||||
"dev_Icon"
|
||||
"dev_Icon",
|
||||
"LESS_NAME_CLEANUP"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
|
||||
|
||||
|
||||
14
front/plugins/nmap_dev_scan/README.md
Executable file
14
front/plugins/nmap_dev_scan/README.md
Executable file
@@ -0,0 +1,14 @@
|
||||
## Overview
|
||||
|
||||
NMAP-scan is a command-line tool to discover and fingerprint IP hosts on the local network. The NMAP-scan (and other Network-scan plugin times using the `SCAN_SUBNETS` setting) time depends on the number of IP addresses to check so set this up carefully with the appropriate network mask and interface. Check the [subnets documentation](https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md) for help on setting up VLANs, what VLANs are supported, or how to figure out the network mask and your interface.
|
||||
|
||||
### Usage
|
||||
|
||||
- Go to settings and set the `SCAN_SUBNETS` setting as per [subnets documentation](https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md).
|
||||
- Enable the plugin by changing the RUN parameter from disabled to your preferred run time (usually: `schedule`).
|
||||
- Specify the schedule in the `NMAPDEV_RUN_SCHD` setting
|
||||
- Adjust the timeout if needed in the `NMAPDEV_RUN_TIMEOUT` setting
|
||||
- Review remaining settings
|
||||
- SAVE
|
||||
- Wait for the next scan to finish
|
||||
|
||||
560
front/plugins/nmap_dev_scan/config.json
Executable file
560
front/plugins/nmap_dev_scan/config.json
Executable file
@@ -0,0 +1,560 @@
|
||||
{
|
||||
"code_name": "nmap_dev_scan",
|
||||
"unique_prefix": "NMAPDEV",
|
||||
"plugin_type": "device_scanner",
|
||||
"enabled": true,
|
||||
"data_source": "script",
|
||||
"mapped_to_table": "CurrentScan",
|
||||
"data_filters": [
|
||||
{
|
||||
"compare_column": "Object_PrimaryID",
|
||||
"compare_operator": "==",
|
||||
"compare_field_id": "txtMacFilter",
|
||||
"compare_js_template": "'{value}'.toString()",
|
||||
"compare_use_quotes": true
|
||||
}
|
||||
],
|
||||
"show_ui": true,
|
||||
"localized": [
|
||||
"display_name",
|
||||
"description",
|
||||
"icon"
|
||||
],
|
||||
"display_name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "NMAP Device discovery"
|
||||
}
|
||||
],
|
||||
"icon": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "<i class=\"fa-solid fa-search\"></i>"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "This plugin is to execute an NMAP scan for device discovery on the local network"
|
||||
}
|
||||
],
|
||||
"params": [
|
||||
{
|
||||
"name": "subnets",
|
||||
"type": "setting",
|
||||
"value": "SCAN_SUBNETS",
|
||||
"base64": true
|
||||
}
|
||||
],
|
||||
"settings": [
|
||||
{
|
||||
"function": "RUN",
|
||||
"type": "text.select",
|
||||
"default_value": "disabled",
|
||||
"options": [
|
||||
"disabled",
|
||||
"once",
|
||||
"schedule",
|
||||
"always_after_scan",
|
||||
"on_new_device"
|
||||
],
|
||||
"localized": [
|
||||
"name",
|
||||
"description"
|
||||
],
|
||||
"events": [
|
||||
"run"
|
||||
],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "When to run"
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "Cuando ejecutar"
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "Wann ausführen"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Specify when your Network-discovery scan will run. Typical setting would be <code>schedule</code> and then you specify a cron-like schedule in the <a href=\"#NMAPDEV_RUN_SCHD\"><code>NMAPDEV_RUN_SCHD</code>setting</a>. ⚠ Use the same schedule if you have multiple <i class=\"fa-solid fa-magnifying-glass-plus\"></i> Device scanners enabled.<br/><br/> Depends on the <a onclick=\"toggleAllSettings()\" href=\"#SCAN_SUBNETS\"><code>SCAN_SUBNETS</code> setting</a>."
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "Especifique cuándo se ejecutará su análisis de descubrimiento de red. La configuración típica sería <code>schedule</code> y luego se especifica una programación similar a cron en la configuración <a href=\"#NMAPDEV_RUN_SCHD\"><code>NMAPDEV_RUN_SCHD</code></a> "
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "Auswählen wann der Netzwerkscan laufen soll. Typischerweise wird <code>schedule</code> ausgewählt und ein cron-Intervall in der <a href=\"#NMAPDEV_RUN_SCHD\"><code>NMAPDEV_RUN_SCHD</code>Einstellung</a> gesetzt."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "CMD",
|
||||
"type": "readonly",
|
||||
"default_value": "python3 /app/front/plugins/nmap_dev_scan/nmap_dev.py ",
|
||||
"options": [],
|
||||
"localized": [
|
||||
"name",
|
||||
"description"
|
||||
],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Command"
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "Comando"
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "Befehl"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Command to run. This should not be changed"
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "Comando para ejecutar. Esto no debe ser cambiado"
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "Auszuführender Befehl. Dieser sollte nicht geändert werden"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "RUN_TIMEOUT",
|
||||
"type": "integer",
|
||||
"default_value": 300,
|
||||
"options": [],
|
||||
"localized": [
|
||||
"name",
|
||||
"description"
|
||||
],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Run timeout"
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "Tiempo límite de ejecución"
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "Zeitlimit"
|
||||
}
|
||||
],
|
||||
"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, se cancela el script."
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "Maximale Zeit in Sekunden, die auf den Abschluss des Skripts gewartet werden soll. Bei Überschreitung dieser Zeit wird das Skript abgebrochen."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "RUN_SCHD",
|
||||
"type": "text",
|
||||
"default_value": "*/5 * * * *",
|
||||
"options": [],
|
||||
"localized": [
|
||||
"name",
|
||||
"description"
|
||||
],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Schedule"
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "Schedule"
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "Zeitplan"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Only enabled if you select <code>schedule</code> in the <a href=\"#NMAPDEV_RUN\"><code>NMAPDEV_RUN</code> setting</a>. Make sure you enter the schedule in the correct cron-like format (e.g. validate at <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). For example entering <code>*/3 * * * *</code> will run the scan every 3 minutes. Will be run NEXT time the time passes. <br/> It's recommended to use the same schedule interval for all plugins responsible for discovering new devices."
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "Solo está habilitado si selecciona <code>schedule</code> en la configuración <a href=\"#NMAPDEV_RUN\"><code>NMAPDEV_RUN</code></a>. Asegúrese de ingresar la programación en el formato similar a cron correcto (por ejemplo, valide en <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a>). Por ejemplo, ingresar <code>*/3 * * * *</code> ejecutará el escaneo cada 3 minutos. Se ejecutará la PRÓXIMA vez que pase el tiempo. <br/> Se recomienda utilizar el mismo intervalo de programación para todos los complementos que analizan su red."
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "Nur aktiv, wenn <code>schedule</code> in der <a href=\"#NMAPDEV_RUN\"><code>NMAPDEV_RUN</code> Einstellung</a> ausgewählt wurde. Sichergehen, dass das Intervall in einem korrekten cron-ähnlichen Format angegeben wurde (z.B. auf <a href=\"https://crontab.guru/\" target=\"_blank\">crontab.guru</a> testen). <code>*/3 * * * *</code> würde den Scan alle 3 Minuten starten. Wird erst beim NÄCHSTEN Intervall ausgeführt. <br/>Es wird empfohlen, das Intervall aller Plugins, welche nach neuen Geräten suchen, auf den gleichen Wert zu setzen."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "WATCH",
|
||||
"type": "text.multiselect",
|
||||
"default_value": [
|
||||
],
|
||||
"options": [
|
||||
"Watched_Value1",
|
||||
"Watched_Value2",
|
||||
"Watched_Value3",
|
||||
"Watched_Value4"
|
||||
],
|
||||
"localized": [
|
||||
"name",
|
||||
"description"
|
||||
],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Watched"
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "Watched"
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "Überwacht"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Send a notification if selected values change. Use <code>CTRL + Click</code> to select/deselect. <ul> <li><code>Watched_Value1</code> is Name</li><li><code>Watched_Value2</code> is Vendor</li><li><code>Watched_Value3</code> is Interface </li><li><code>Watched_Value4</code> is N/A </li></ul>"
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "Envía una notificación si los valores seleccionados cambian. Utilice <code>CTRL + clic</code> para seleccionar/deseleccionar. <ul> <li><code>Valor_observado1</code> es Name</li><li><code>Valor_observado2</code> es Proveedor</li><li><code>Valor_observado3</code> es Interfaz </li><li><code>Valor_observado4</code> es N/A </li></ul>"
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "Sende eine Benachrichtigung, wenn ein ausgwählter Wert sich ändert. <code>STRG + klicken</code> zum aus-/abwählen. <ul> <li><code>Watched_Value1</code> ist der Namen</li><li><code>Watched_Value2</code> ist der Hersteller</li><li><code>Watched_Value3</code> ist das Interface </li><li><code>Watched_Value4</code> ist nicht in Verwendung </li></ul>"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "REPORT_ON",
|
||||
"type": "text.multiselect",
|
||||
"default_value": [
|
||||
"new"
|
||||
],
|
||||
"options": [
|
||||
"new",
|
||||
"watched-changed",
|
||||
"watched-not-changed",
|
||||
"missing-in-last-scan"
|
||||
],
|
||||
"localized": [
|
||||
"name",
|
||||
"description"
|
||||
],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Report on"
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "Informar sobre"
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "Benachrichtige wenn"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "When should notification be sent out."
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "Cuándo debe enviarse una notificación."
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "Wann Benachrichtigungen gesendet werden sollen."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "ARGS",
|
||||
"type": "text",
|
||||
"default_value": "sudo nmap -sn -PR -oX - ",
|
||||
"options": [],
|
||||
"localized": [
|
||||
"name",
|
||||
"description"
|
||||
],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Arguments"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Arguments to run nmap-scan with. Recommended and tested only with the setting: <br/> <code>sudo nmap -sn -PR -oX - </code>. <br/><br/> Note: The plugin attaches the interface and network mask, for example <code> -e eth1 192.168.1.0/24</code> and performs a separate scan for each interface specified in the <a onclick=\"toggleAllSettings()\" href=\"#SCAN_SUBNETS\"><code>SCAN_SUBNETS</code> setting</a>."
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"database_column_definitions": [
|
||||
{
|
||||
"column": "Object_PrimaryID",
|
||||
"mapped_to_column": "cur_MAC",
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"type": "device_name_mac",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
"localized": [
|
||||
"name"
|
||||
],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "MAC"
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "MAC"
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "MAC"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"column": "Object_SecondaryID",
|
||||
"mapped_to_column": "cur_IP",
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"type": "device_ip",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
"localized": [
|
||||
"name"
|
||||
],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "IP"
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "IP"
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "IP"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"column": "Watched_Value1",
|
||||
"mapped_to_column": "cur_Name",
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
"localized": [
|
||||
"name"
|
||||
],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Name"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"column": "Watched_Value2",
|
||||
"mapped_to_column": "cur_Vendor",
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
"localized": [
|
||||
"name"
|
||||
],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Vendor"
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "Proveedor"
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "Hersteller"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"column": "Watched_Value3",
|
||||
"mapped_to_column": "cur_LastQuery",
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"type": "label",
|
||||
"default_value":"",
|
||||
"options": [],
|
||||
"localized": ["name"],
|
||||
"name":[{
|
||||
"language_code":"en_us",
|
||||
"string" : "Interface"
|
||||
},
|
||||
{
|
||||
"language_code":"es_es",
|
||||
"string" : "Interfaz"
|
||||
}]
|
||||
},
|
||||
{
|
||||
"column": "Dummy",
|
||||
"mapped_to_column": "cur_ScanMethod",
|
||||
"mapped_to_column_data": {
|
||||
"value": "nmap-dev-scan"
|
||||
},
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
"localized": [
|
||||
"name"
|
||||
],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Scan method"
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "Método de escaneo"
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "Scanmethode"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"column": "DateTimeCreated",
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
"localized": [
|
||||
"name"
|
||||
],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Created"
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "Creado"
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "Erstellt"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"column": "DateTimeChanged",
|
||||
"css_classes": "col-sm-2",
|
||||
"show": true,
|
||||
"type": "label",
|
||||
"default_value": "",
|
||||
"options": [],
|
||||
"localized": [
|
||||
"name"
|
||||
],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Changed"
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "Cambiado"
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "Geändert"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"column": "Status",
|
||||
"css_classes": "col-sm-1",
|
||||
"show": true,
|
||||
"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"
|
||||
},
|
||||
{
|
||||
"language_code": "de_de",
|
||||
"string": "Status"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
182
front/plugins/nmap_dev_scan/nmap_dev.py
Executable file
182
front/plugins/nmap_dev_scan/nmap_dev.py
Executable file
@@ -0,0 +1,182 @@
|
||||
#!/usr/bin/env python
|
||||
# test script by running:
|
||||
# tbc
|
||||
|
||||
import os
|
||||
import pathlib
|
||||
import argparse
|
||||
import subprocess
|
||||
import sys
|
||||
import hashlib
|
||||
import csv
|
||||
import sqlite3
|
||||
import re
|
||||
import nmap
|
||||
from io import StringIO
|
||||
from datetime import datetime
|
||||
|
||||
# Register NetAlertX directories
|
||||
INSTALL_PATH="/app"
|
||||
sys.path.extend([f"{INSTALL_PATH}/front/plugins", f"{INSTALL_PATH}/server"])
|
||||
|
||||
from plugin_helper import Plugin_Object, Plugin_Objects, decodeBase64
|
||||
from logger import mylog, append_line_to_file
|
||||
from helper import timeNowTZ, get_setting_value, extract_between_strings, extract_ip_addresses, extract_mac_addresses
|
||||
from const import logPath, applicationPath, fullDbPath
|
||||
from database import DB
|
||||
from device import Device_obj
|
||||
|
||||
|
||||
CUR_PATH = str(pathlib.Path(__file__).parent.resolve())
|
||||
LOG_FILE = os.path.join(CUR_PATH, 'script.log')
|
||||
RESULT_FILE = os.path.join(CUR_PATH, 'last_result.log')
|
||||
|
||||
pluginName = 'NMAPDEV'
|
||||
|
||||
def main():
|
||||
|
||||
mylog('verbose', [f'[{pluginName}] In script'])
|
||||
|
||||
# Create a database connection
|
||||
db = DB() # instance of class DB
|
||||
db.open()
|
||||
|
||||
|
||||
timeout = get_setting_value('NMAPDEV_RUN_TIMEOUT')
|
||||
subnets = get_setting_value('SCAN_SUBNETS')
|
||||
|
||||
mylog('verbose', [f'[{pluginName}] subnets: ', subnets])
|
||||
|
||||
|
||||
# Initialize the Plugin obj output file
|
||||
plugin_objects = Plugin_Objects(RESULT_FILE)
|
||||
|
||||
unique_devices = execute_scan(subnets, timeout)
|
||||
|
||||
mylog('verbose', [f'[{pluginName}] Devices found: {len(unique_devices)}'])
|
||||
|
||||
for device in unique_devices:
|
||||
|
||||
plugin_objects.add_object(
|
||||
# "MAC", "IP", "Name", "Vendor", "Interface"
|
||||
primaryId = device['mac'].lower(),
|
||||
secondaryId = device['ip'],
|
||||
watched1 = device['name'],
|
||||
watched2 = device['vendor'],
|
||||
watched3 = device['interface'],
|
||||
watched4 = '',
|
||||
extra = '',
|
||||
foreignKey = device['mac'])
|
||||
|
||||
plugin_objects.write_result_file()
|
||||
|
||||
|
||||
mylog('verbose', [f'[{pluginName}] Script finished'])
|
||||
|
||||
return 0
|
||||
|
||||
#===============================================================================
|
||||
# Execute scan
|
||||
#===============================================================================
|
||||
def execute_scan(subnets_list, timeout):
|
||||
devices_list = []
|
||||
|
||||
for interface in subnets_list:
|
||||
nmap_output = execute_scan_on_interface(interface, timeout)
|
||||
|
||||
mylog('verbose', [f"[{pluginName}] nmap_output: ", nmap_output])
|
||||
|
||||
if nmap_output: # Proceed only if nmap output is not empty
|
||||
# Parse the XML output using python-nmap
|
||||
devices = parse_nmap_xml(nmap_output, interface)
|
||||
|
||||
for device in devices:
|
||||
# Append to devices_list only if both IP and MAC addresses are present
|
||||
if device.get('ip') and device.get('mac'):
|
||||
devices_list.append(device)
|
||||
else:
|
||||
# Log an error if either IP or MAC address is missing
|
||||
mylog('verbose', [f"[{pluginName}] Skipped (Not enough info in output): ", device])
|
||||
else:
|
||||
# Log an error if nmap output is empty
|
||||
mylog('verbose', [f"[{pluginName}] No output received for interface: ", interface])
|
||||
|
||||
return devices_list
|
||||
|
||||
|
||||
|
||||
def execute_scan_on_interface (interface, timeout):
|
||||
# Prepare command arguments
|
||||
scan_args = get_setting_value('NMAPDEV_ARGS').split() + interface.replace('--interface=','-e ').split()
|
||||
|
||||
mylog('verbose', [f'[{pluginName}] scan_args: ', scan_args])
|
||||
|
||||
try:
|
||||
result = subprocess.check_output(scan_args, universal_newlines=True)
|
||||
except subprocess.CalledProcessError as e:
|
||||
error_type = type(e).__name__
|
||||
result = ""
|
||||
mylog('verbose', [f'[{pluginName}] ERROR: ', error_type])
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def parse_nmap_xml(xml_output, interface):
|
||||
devices_list = []
|
||||
|
||||
try:
|
||||
nm = nmap.PortScanner()
|
||||
nm.analyse_nmap_xml_scan(xml_output)
|
||||
|
||||
mylog('verbose', [f'[{pluginName}] Number of hosts: ', len(nm.all_hosts())])
|
||||
|
||||
for host in nm.all_hosts():
|
||||
hostname = nm[host].hostname() or '(unknown)'
|
||||
|
||||
ip = nm[host]['addresses']['ipv4'] if 'ipv4' in nm[host]['addresses'] else ''
|
||||
mac = nm[host]['addresses']['mac'] if 'mac' in nm[host]['addresses'] else ''
|
||||
|
||||
|
||||
mylog('verbose', [f'[{pluginName}] nm[host]: ', nm[host]])
|
||||
|
||||
vendor = ''
|
||||
|
||||
if nm[host]['vendor']:
|
||||
mylog('verbose', [f'[{pluginName}] entry: ', nm[host]['vendor']])
|
||||
|
||||
for key, value in nm[host]['vendor'].items():
|
||||
vendor = value
|
||||
|
||||
break
|
||||
|
||||
|
||||
# Log debug information
|
||||
mylog('verbose', [f"[{pluginName}] Hostname: {hostname}, IP: {ip}, MAC: {mac}, Vendor: {vendor}"])
|
||||
|
||||
# Only include devices with both IP and MAC addresses
|
||||
if ip != '' and mac != '':
|
||||
devices_list.append({
|
||||
'name': hostname,
|
||||
'ip': ip,
|
||||
'mac': mac,
|
||||
'vendor': vendor,
|
||||
'interface': interface
|
||||
})
|
||||
else:
|
||||
# MAC or IP missing
|
||||
mylog('verbose', [f"[{pluginName}] Skipping: {hostname}, IP or MAC missing"])
|
||||
|
||||
|
||||
except Exception as e:
|
||||
mylog('verbose', [f"[{pluginName}] Error parsing nmap XML: ", str(e)])
|
||||
|
||||
return devices_list
|
||||
|
||||
|
||||
|
||||
|
||||
#===============================================================================
|
||||
# BEGIN
|
||||
#===============================================================================
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -54,7 +54,7 @@
|
||||
}],
|
||||
"description": [{
|
||||
"language_code":"en_us",
|
||||
"string" : "When the plugin should be executed. If enabled this will execute the scan until there are no <code>(unknown)</code> or <code>(name not found)</code> devices. Setting this to <code>on_new_device</code> or a daily <code>schedule</code> is recommended."
|
||||
"string" : "When the plugin should be executed. If enabled this will execute the scan until there are no <code>(unknown)</code> or <code>(name not found)</code> devices. Setting this to <code>on_new_device</code> or a daily <code>schedule</code> is recommended.<br/><br/> Depends on the <a onclick=\"toggleAllSettings()\" href=\"#SCAN_SUBNETS\"><code>SCAN_SUBNETS</code> setting</a>."
|
||||
}]
|
||||
},
|
||||
{
|
||||
|
||||
@@ -38,15 +38,17 @@ timeZoneSetting = configFile['TIMEZONE']
|
||||
timeZone = pytz.timezone(timeZoneSetting)
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# Sanitizes plugin output
|
||||
def handleEmpty(input):
|
||||
if input == '' or None:
|
||||
if not input:
|
||||
return 'null'
|
||||
else:
|
||||
# Validate and sanitize message content
|
||||
# Remove potentially problematic characters if string
|
||||
if isinstance(input, str):
|
||||
if isinstance(input, str):
|
||||
input = re.sub(r'[^\x00-\x7F]+', ' ', input)
|
||||
return input
|
||||
input = input.replace('\n', '') # Removing new lines
|
||||
return input
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# Check if a valid MAC address
|
||||
|
||||
@@ -1,48 +1,13 @@
|
||||
## Overview
|
||||
|
||||
A simple script-based plugin for setting the password.
|
||||
A simple setting-based plugin for setting the password.
|
||||
|
||||
### Usage
|
||||
|
||||
- Head to **Settings** > **UI password** to adjust the default values.
|
||||
- Head to **Settings** > **Set Password** to adjust the default values.
|
||||
|
||||
### Notes
|
||||
|
||||
- The plugin is executed on the `RUN` type `before_config_save` so it's possible to update the `app.conf` file before the data is loaded into the app.
|
||||
- The executed command is stored in the `CMD` setting: `/app/back/pialert-cli set_password {password}`
|
||||
- The `{password}` parameter is replaced via the parameter and setting below:
|
||||
|
||||
```json
|
||||
...
|
||||
"params" : [
|
||||
{
|
||||
"name" : "password",
|
||||
"type" : "setting",
|
||||
"value" : "SETPWD_password"
|
||||
}
|
||||
],
|
||||
|
||||
...
|
||||
{
|
||||
"function": "password",
|
||||
"type": "password",
|
||||
"maxLength": 50,
|
||||
"default_value": "123456",
|
||||
"options": [],
|
||||
"localized": ["name", "description"],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Password"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "The default password is <code>123456</code>. To change the password run <code>/app/back/pialert-cli set_password {password}</code> in the container"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
```
|
||||
- The default password is <code>123456</code>.
|
||||
- When enabled a login dialog is displayed. If facing issues, you can always disable the login by setting <code>SETPWD_enable_password=False</code> in your <code>app.conf</code> file.
|
||||
- SHA256 hash is used
|
||||
@@ -4,7 +4,7 @@
|
||||
"unique_prefix": "SETPWD",
|
||||
"plugin_type": "system",
|
||||
"enabled": true,
|
||||
"data_source": "script",
|
||||
"data_source": "template",
|
||||
"show_ui": false,
|
||||
"localized": ["display_name", "description", "icon"],
|
||||
"display_name": [{
|
||||
@@ -40,57 +40,29 @@
|
||||
"value" : "SETPWD_password"
|
||||
}
|
||||
],
|
||||
"settings":[
|
||||
{
|
||||
"function": "RUN",
|
||||
"events": [],
|
||||
"type": "text.select",
|
||||
"default_value":"disabled",
|
||||
"options": ["disabled", "before_config_save"],
|
||||
"localized": ["name", "description"],
|
||||
"name" :[{
|
||||
"language_code":"en_us",
|
||||
"string" : "When to run"
|
||||
},
|
||||
{
|
||||
"language_code":"es_es",
|
||||
"string" : "Cuándo ejecuta"
|
||||
}],
|
||||
"description": [{
|
||||
"language_code":"en_us",
|
||||
"string" : "Set to <code>before_config_save</code> and specify password to reset your pasword in <code>SETPWD_password</code>."
|
||||
},
|
||||
{
|
||||
"language_code":"es_es",
|
||||
"string" : "Configure en <code>before_config_save</code> y especifique la contraseña para restablecer su contraseña en <code>SETPWD_password</code>. Puede establecer <code>deshabilitado</code> una vez que se cambia la contraseña."
|
||||
}]
|
||||
},
|
||||
"settings":[
|
||||
{
|
||||
"function": "CMD",
|
||||
"type": "readonly",
|
||||
"default_value":"/app/back/pialert-cli set_password {password}",
|
||||
"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": "enable_password",
|
||||
"type": "boolean",
|
||||
"default_value": false,
|
||||
"options": [],
|
||||
"localized": ["name", "description"],
|
||||
"name": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "Enable login"
|
||||
}
|
||||
],
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "When enabled a login dialog is displayed. If facing issues, you can always disable the login by setting <code>SETPWD_enable_password=False</code> in your <code>app.conf</code> file."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"function": "password",
|
||||
"type": "password",
|
||||
"type": "password.SHA256",
|
||||
"maxLength": 50,
|
||||
"default_value": "123456",
|
||||
"options": [],
|
||||
@@ -108,12 +80,8 @@
|
||||
"description": [
|
||||
{
|
||||
"language_code": "en_us",
|
||||
"string": "The default password is <code>123456</code>. To change it, you can either use this plugin (follow the instructions in the <code>SETPWD_RUN</code> setting) or run <code>/app/back/pialert-cli set_password {password}</code> in the container."
|
||||
},
|
||||
{
|
||||
"language_code": "es_es",
|
||||
"string": "La contraseña predeterminada es <code>123456</code>. Para cambiar la contraseña, ejecute <code>/app/back/pialert-cli set_password {password}</code> en el contenedor"
|
||||
}
|
||||
"string": "The default password is <code>123456</code>."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
@@ -53,50 +53,54 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
<!-- Page ------------------------------------------------------------------ -->
|
||||
<!-- Page ------------------------------------------------------------------ -->
|
||||
|
||||
<script src="js/settings_utils.js"></script>
|
||||
<script src="js/db_methods.js"></script>
|
||||
<script src="js/ui_components.js"></script>
|
||||
<script src="js/settings_utils.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
||||
<script src="js/db_methods.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
||||
<script src="lib/crypto/crypto-js.min.js"></script>
|
||||
|
||||
|
||||
<div id="settingsPage" class="content-wrapper">
|
||||
|
||||
<!-- Content header--------------------------------------------------------- -->
|
||||
<section class="content-header">
|
||||
<?php require 'php/templates/notification.php'; ?>
|
||||
<h1 id="pageTitle">
|
||||
<i class="fa fa-cog"></i>
|
||||
<?= lang('Navigation_Settings');?>
|
||||
<a style="cursor:pointer">
|
||||
<span>
|
||||
<i id='toggleSettings' onclick="toggleAllSettings()" class="settings-expand-icon fa fa-angle-double-down"></i>
|
||||
</span>
|
||||
</a>
|
||||
</h1>
|
||||
|
||||
<div class="col-sm-2 " title="<?= lang("settings_imported");?> ">
|
||||
<div class="settingsImported">
|
||||
<?= lang("settings_imported_label");?>
|
||||
</div>
|
||||
<div class="col-sm-5">
|
||||
<h1 id="pageTitle col-sm-3">
|
||||
<i class="fa fa-cog"></i>
|
||||
<?= lang('Navigation_Settings');?>
|
||||
<a style="cursor:pointer">
|
||||
<span>
|
||||
<i id='toggleSettings' onclick="toggleAllSettings()" class="settings-expand-icon fa fa-angle-double-down"></i>
|
||||
</span>
|
||||
</a>
|
||||
</h1>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-7 settingsImportedTimestamp" title="<?= lang("settings_imported");?> ">
|
||||
<div class="settingsImported ">
|
||||
<?= lang("settings_imported_label");?>:
|
||||
|
||||
<span id="lastImportedTime"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-10">
|
||||
<span id="lastImportedTime"></span>
|
||||
</div>
|
||||
|
||||
|
||||
</section>
|
||||
<section class="content-header">
|
||||
|
||||
<div id="settingsOverview" class ="bg-white color-palette box panel panel-default col-sm-12 box-default box-info" >
|
||||
<div class ="bg-white color-palette box box-solid box-primary col-sm-12 panel panel-default panel-title" >
|
||||
<!-- Settings imported time -->
|
||||
|
||||
<div class ="settings-group col-sm-12">
|
||||
<i class="<?= lang("settings_enabled_icon");?>"></i> <?= lang("settings_enabled");?>
|
||||
</div>
|
||||
<div class =" col-sm-12" id=""></div>
|
||||
|
||||
|
||||
<a data-toggle="collapse" href="#settingsOverview">
|
||||
<div class ="settings-group col-sm-12 panel-heading panel-title">
|
||||
<i class="<?= lang("settings_enabled_icon");?>"></i> <?= lang("settings_enabled");?>
|
||||
</div>
|
||||
</a>
|
||||
<div id="settingsOverview" class="panel-collapse collapse in">
|
||||
<div class="panel-body"></div>
|
||||
<div class =" col-sm-12" id=""></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
<div class="content settingswrap " id="accordion_gen">
|
||||
|
||||
<div class ="bg-grey-dark color-palette box panel panel-default col-sm-12 box-default box-info" id="core_content_header" >
|
||||
@@ -137,15 +141,39 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
</div>
|
||||
|
||||
<!-- /.content -->
|
||||
<div class="row" >
|
||||
<div class="row">
|
||||
<button type="button" class="center top-margin btn btn-primary btn-default pa-btn bg-green dbtools-button" id="save" onclick="saveSettings()"><?= lang('DevDetail_button_Save');?></button>
|
||||
|
||||
<section class=" padding-bottom col-sm-12">
|
||||
<!-- needed so the filter & save button don't hide the settings -->
|
||||
</section>
|
||||
|
||||
|
||||
<section class=" settings-sticky-bottom-section col-sm-10">
|
||||
<div class="col-sm-8 settingsSearchWrap form-group has-success bg-white color-palette ">
|
||||
<div class ="col-sm-8">
|
||||
<i class="fa-solid fa-filter"></i> <?= lang("Gen_Filter");?>
|
||||
</div>
|
||||
<div id="result"></div>
|
||||
</div>
|
||||
<div class ="col-sm-12">
|
||||
|
||||
<input type="text" id="settingsSearch" class="form-control input-sm col-sm-12" placeholder="Filter Settings...">
|
||||
<div class="clear-filter ">
|
||||
<i class="fa-solid fa-circle-xmark" onclick="$('#settingsSearch').val('');filterRows();$('#settingsSearch').focus()"></i>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="col-sm-4 saveSettingsWrapper">
|
||||
<button type="button" class=" btn btn-primary btn-default pa-btn bg-green" id="save" onclick="saveSettings()"><?= lang('DevDetail_button_Save');?></button>
|
||||
</div>
|
||||
<div id="result"></div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- /.content-wrapper -->
|
||||
|
||||
<!-- ----------------------------------------------------------------------- -->
|
||||
@@ -208,8 +236,7 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
overviewSectionsHtml = [
|
||||
pluginCards(enabledDeviceScanners,['RUN', 'RUN_SCHD']),
|
||||
pluginCards(enabledOthers, ['RUN', 'RUN_SCHD']),
|
||||
pluginCards(enabledPublishers, []),
|
||||
|
||||
pluginCards(enabledPublishers, []),
|
||||
]
|
||||
|
||||
index = 0
|
||||
@@ -233,7 +260,7 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
index++;
|
||||
});
|
||||
|
||||
$('#settingsOverview').append(overviewSections_html);
|
||||
$('#settingsOverview .panel-body').append(overviewSections_html);
|
||||
|
||||
// Display warning
|
||||
if(schedulesAreSynchronized(enabledDeviceScanners, pluginsData) == false)
|
||||
@@ -245,8 +272,6 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
</small>
|
||||
`)
|
||||
}
|
||||
|
||||
|
||||
|
||||
let isIn = ' in '; // to open the active panel in AdminLTE
|
||||
|
||||
@@ -259,7 +284,7 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
{
|
||||
let isEnabled = ["once", "schedule", "always_after_scan", "on_new_device", "on_notification", "before_config_save", "before_name_updates" ].includes(getSetting(group+"_RUN"));
|
||||
|
||||
isEnabled ? onOff = 'circle-check' : onOff = 'circle';
|
||||
isEnabled ? onOff = 'dot-circle' : onOff = 'circle';
|
||||
|
||||
enabledHtml = `
|
||||
<div class="enabled-disabled-icon">
|
||||
@@ -337,7 +362,7 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
<div class="row table_row ${metadataClass}" id="row_${codeName}">
|
||||
<div class="table_cell setting_name bold">
|
||||
<label>${getString(codeName + '_name', set['Display_Name'])}</label>
|
||||
<div class="small">
|
||||
<div class="small text-overflow-hidden">
|
||||
<code>${codeName}</code>${infoIcon}
|
||||
</div>
|
||||
</div>
|
||||
@@ -412,7 +437,7 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
}
|
||||
} else if (setType === 'integer') {
|
||||
inputHtml = `<input onChange="settingsChanged()" my-data-type="${setType}" class="form-control" id="${codeName}" type="number" value="${val}"/>`;
|
||||
} else if (setType === 'password') {
|
||||
} else if (setType.startsWith('password')) {
|
||||
inputHtml = `<input onChange="settingsChanged()" my-data-type="${setType}" class="form-control input" id="${codeName}" type="password" value="${val}"/>`;
|
||||
} else if (setType === 'readonly') {
|
||||
inputHtml = `<input class="form-control input" my-data-type="${setType}" id="${codeName}" value="${val}" readonly/>`;
|
||||
@@ -440,21 +465,31 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
<input class="form-control" id="ipInterface" type="text" placeholder="eth0" />
|
||||
</div>
|
||||
<div class="col-xs-3">
|
||||
<button class="btn btn-primary" onclick="addInterface()">Add</button>
|
||||
<button class="btn btn-primary" onclick="addInterface();initListInteractionOptions('${codeName}')">${getString("Gen_Add")}</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<select class="form-control" my-data-type="${setType}" name="${codeName}" id="${codeName}" multiple readonly>`;
|
||||
<select class="form-control" my-data-type="${setType}" name="${codeName}" id="${codeName}" onchange="initListInteractionOptions(${codeName})" multiple readonly>`;
|
||||
|
||||
|
||||
options = createArray(val);
|
||||
|
||||
options.forEach(option => {
|
||||
inputHtml += `<option value="${option}" disabled>${option}</option>`;
|
||||
inputHtml += `<option value="${option}" >${option}</option>`;
|
||||
});
|
||||
|
||||
inputHtml += '</select></div>' +
|
||||
'<div><button class="btn btn-primary" onclick="removeInterfaces()">Remove all</button></div>';
|
||||
|
||||
|
||||
inputHtml += `</select>
|
||||
</div>
|
||||
<div class="col-xs-12">
|
||||
<button class="btn btn-primary" my-input="${codeName}" onclick="removeFromList(this)">
|
||||
${getString("Gen_Remove_Last")}
|
||||
</button>
|
||||
<button class="btn btn-primary" my-input="${codeName}" onclick="removeAllOptions(this)">
|
||||
${getString("Gen_Remove_All")}
|
||||
</button>
|
||||
</div>`;
|
||||
} else if (setType === 'list' || setType === 'list.readonly') {
|
||||
|
||||
settingKeyOfLists.push(codeName);
|
||||
@@ -465,7 +500,7 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
<input class="form-control" type="text" id="${codeName}_input" placeholder="Enter value"/>
|
||||
</div>
|
||||
<div class="col-xs-3">
|
||||
<button class="btn btn-primary" my-input-from="${codeName}_input" my-input-to="${codeName}" onclick="addList(this)">Add</button>
|
||||
<button class="btn btn-primary" my-input-from="${codeName}_input" my-input-to="${codeName}" onclick="addList(this);initListInteractionOptions('${codeName}')">${getString("Gen_Add")}</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
@@ -474,11 +509,19 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
let options = createArray(val);
|
||||
|
||||
options.forEach(option => {
|
||||
inputHtml += `<option value="${option}" disabled>${option}</option>`;
|
||||
|
||||
inputHtml += `<option value="${option}" >${option}</option>`;
|
||||
});
|
||||
|
||||
inputHtml += '</select></div>' +
|
||||
`<div><button class="btn btn-primary" my-input="${codeName}" onclick="removeFromList(this)">Remove last</button></div>`;
|
||||
`<div>
|
||||
<button class="btn btn-primary" my-input="${codeName}" onclick="removeFromList(this)">
|
||||
${getString("Gen_Remove_Last")}
|
||||
</button>
|
||||
<button class="btn btn-primary" my-input="${codeName}" onclick="removeAllOptions(this)">
|
||||
${getString("Gen_Remove_All")}
|
||||
</button>
|
||||
</div>`;
|
||||
} else if (setType === 'json') {
|
||||
inputHtml = `<textarea class="form-control input" my-data-type="${setType}" id="${codeName}" readonly>${JSON.stringify(val, null, 2)}</textarea>`;
|
||||
}
|
||||
@@ -512,6 +555,12 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
|
||||
// generate settings in the correct group section
|
||||
$(`#${group} .panel-body`).append(setHtml);
|
||||
|
||||
// init remove and edit listitem click gestures
|
||||
if(['subnets', 'list' ].includes(setType))
|
||||
{
|
||||
initListInteractionOptions(codeName)
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
@@ -614,6 +663,7 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
{
|
||||
settingsChanged();
|
||||
$(`#${$(element).attr('my-input')}`).find("option:last").remove();
|
||||
|
||||
}
|
||||
// ---------------------------------------------------------
|
||||
function addInterface()
|
||||
@@ -637,15 +687,7 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
settingsChanged();
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------
|
||||
function removeInterfaces()
|
||||
{
|
||||
settingsChanged();
|
||||
$('#SCAN_SUBNETS').empty();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// ---------------------------------------------------------
|
||||
function saveSettings() {
|
||||
if(<?php echo count($settings)?> != settingsNumber)
|
||||
@@ -686,30 +728,57 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
settingsArray.push([set["Group"], set["Code_Name"], set["Type"], JSON.stringify(temps)]);
|
||||
} else if (set['Type'] === 'json') {
|
||||
const temps = $('#'+set["Code_Name"]).val();
|
||||
settingsArray.push([set["Group"], set["Code_Name"], set["Type"], temps]);
|
||||
} else if (set['Type'] === 'password.SHA256') {
|
||||
// save value as SHA256 if value isn't SHA256 already
|
||||
var temps = $('#'+set["Code_Name"]).val();
|
||||
|
||||
if(temps != "" && !isSHA256(temps))
|
||||
{
|
||||
temps = CryptoJS.SHA256(temps).toString(CryptoJS.enc.Hex);
|
||||
}
|
||||
settingsArray.push([set["Group"], set["Code_Name"], set["Type"], temps]);
|
||||
}
|
||||
});
|
||||
|
||||
// trigger a save settings event in the backend
|
||||
$.ajax({
|
||||
method: "POST",
|
||||
url: "php/server/util.php",
|
||||
data: {
|
||||
function: 'savesettings',
|
||||
settings: JSON.stringify(settingsArray) },
|
||||
success: function(data, textStatus) {
|
||||
|
||||
showModalOk ('Result', data );
|
||||
|
||||
// Remove navigation prompt "Are you sure you want to leave..."
|
||||
window.onbeforeunload = null;
|
||||
// console.log(settingsArray);
|
||||
|
||||
// Reloads the current page
|
||||
setTimeout("window.location.reload()", 3000);
|
||||
// sanity check to make sure settings were loaded & collected correctly
|
||||
sanityCheck_notOK = true
|
||||
$.each(settingsArray, function(index, value) {
|
||||
// Do something with each element of the array
|
||||
if(value[1] == "UI_LANG")
|
||||
{
|
||||
sanityCheck_notOK = isEmpty(value[3])
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
if(sanityCheck_notOK == false)
|
||||
{
|
||||
// trigger a save settings event in the backend
|
||||
$.ajax({
|
||||
method: "POST",
|
||||
url: "php/server/util.php",
|
||||
data: {
|
||||
function: 'savesettings',
|
||||
settings: JSON.stringify(settingsArray) },
|
||||
success: function(data, textStatus) {
|
||||
|
||||
showModalOk ('Result', data );
|
||||
|
||||
// Remove navigation prompt "Are you sure you want to leave..."
|
||||
window.onbeforeunload = null;
|
||||
|
||||
// Reloads the current page
|
||||
setTimeout("clearCache()", 5000);
|
||||
|
||||
}
|
||||
});
|
||||
} else{
|
||||
showModalOk('WARNING', "<?= lang("settings_missing_block")?>");
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
}
|
||||
@@ -744,24 +813,44 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
||||
|
||||
fileModificationTime = <?php echo filemtime($confPath)*1000;?>;
|
||||
|
||||
console.log(appState["settingsImported"]*1000)
|
||||
// console.log(appState["settingsImported"]*1000)
|
||||
importedMiliseconds = parseInt((appState["settingsImported"]*1000));
|
||||
|
||||
humanReadable = (new Date(importedMiliseconds)).toLocaleString("en-UK", { timeZone: "<?php echo $timeZone?>" });
|
||||
|
||||
console.log(humanReadable.replaceAll('"', ''))
|
||||
// console.log(humanReadable.replaceAll('"', ''))
|
||||
|
||||
// check if displayed settings are outdated
|
||||
// if(fileModificationTime > importedMiliseconds)
|
||||
|
||||
if(appState["showSpinner"] || fileModificationTime > importedMiliseconds)
|
||||
{
|
||||
|
||||
showSpinner("settings_old")
|
||||
|
||||
setTimeout("handleLoadingDialog()", 1000);
|
||||
|
||||
} else
|
||||
{
|
||||
hideSpinner()
|
||||
// check if the app is initialized and hide the spinner
|
||||
if(isAppInitialized())
|
||||
{
|
||||
hideSpinner()
|
||||
|
||||
// reload page if outdated information might be displayed
|
||||
if(secondsSincePageLoad() > 3)
|
||||
{
|
||||
clearCache()
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// reload the page if not initialized to give time the background tasks to finish
|
||||
setTimeout(() => {
|
||||
|
||||
window.location.reload()
|
||||
|
||||
}, 3000);
|
||||
}
|
||||
}
|
||||
|
||||
document.getElementById('lastImportedTime').innerHTML = humanReadable;
|
||||
@@ -850,6 +939,7 @@ function updateModalState() {
|
||||
// ---------------------------------------------------------
|
||||
// Show last time settings have been imported
|
||||
|
||||
showSpinner()
|
||||
handleLoadingDialog()
|
||||
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ fi
|
||||
apt-get install -y \
|
||||
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 \
|
||||
python3 iproute2 nmap python3-pip zip systemctl usbutils traceroute
|
||||
python3 iproute2 nmap python3-pip zip systemctl usbutils traceroute
|
||||
|
||||
# alternate dependencies
|
||||
sudo apt-get install nginx nginx-core mtr php-fpm php8.2-fpm php-cli php8.2 php8.2-sqlite3 -y
|
||||
@@ -30,4 +30,5 @@ source myenv/bin/activate
|
||||
update-alternatives --install /usr/bin/python python /usr/bin/python3 10
|
||||
|
||||
# install packages thru pip3
|
||||
pip3 install requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet
|
||||
pip3 install requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython
|
||||
|
||||
|
||||
@@ -36,8 +36,6 @@ UI_LANG = 'English'
|
||||
UI_PRESENCE = ['online', 'offline', 'archived']
|
||||
UI_MY_DEVICES = ['online', 'offline', 'archived', 'new', 'down']
|
||||
UI_NOT_RANDOM_MAC = []
|
||||
PIALERT_WEB_PROTECTION = False
|
||||
PIALERT_WEB_PASSWORD = '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92'
|
||||
DAYS_TO_KEEP_EVENTS = 90
|
||||
REPORT_DASHBOARD_URL = 'http://netalertx/'
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ reportTemplatesPath = applicationPath + '/front/report_templates/'
|
||||
fullConfPath = applicationPath + confPath
|
||||
fullDbPath = applicationPath + dbPath
|
||||
vendorsPath = '/usr/share/arp-scan/ieee-oui.txt'
|
||||
vendorsPathNewest = '/usr/share/arp-scan/ieee-oui_all_filtered.txt'
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,10 +2,11 @@
|
||||
import subprocess
|
||||
|
||||
import conf
|
||||
import os
|
||||
import re
|
||||
from helper import timeNowTZ, get_setting, get_setting_value, list_to_where, resolve_device_name_dig, resolve_device_name_pholus, get_device_name_nslookup, check_IP_format
|
||||
from logger import mylog, print_log
|
||||
from const import vendorsPath
|
||||
from const import vendorsPath, vendorsPathNewest
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Device object handling (WIP)
|
||||
@@ -404,9 +405,14 @@ def check_mac_or_internet(input_str):
|
||||
def query_MAC_vendor (pMAC):
|
||||
|
||||
pMACstr = str(pMAC)
|
||||
|
||||
filePath = vendorsPath
|
||||
|
||||
if os.path.isfile(vendorsPathNewest):
|
||||
filePath = vendorsPathNewest
|
||||
|
||||
# Check MAC parameter
|
||||
mac = pMACstr.replace (':','')
|
||||
mac = pMACstr.replace (':','').lower()
|
||||
if len(pMACstr) != 17 or len(mac) != 12 :
|
||||
return -2 # return -2 if ignored MAC
|
||||
|
||||
@@ -415,16 +421,17 @@ def query_MAC_vendor (pMAC):
|
||||
mac_start_string9 = mac[0:9]
|
||||
|
||||
try:
|
||||
with open(vendorsPath, 'r') as f:
|
||||
with open(filePath, 'r') as f:
|
||||
for line in f:
|
||||
if line.startswith(mac_start_string6):
|
||||
line_lower = line.lower() # Convert line to lowercase for case-insensitive matching
|
||||
if line_lower.startswith(mac_start_string6):
|
||||
parts = line.split(' ', 1)
|
||||
if len(parts) > 1:
|
||||
vendor = parts[1].strip()
|
||||
mylog('debug', [f"[Vendor Check] Found '{vendor}' for '{pMAC}' in {vendorsPath}"])
|
||||
return vendor
|
||||
else:
|
||||
mylog('debug', [f'[Vendor Check] ⚠ ERROR: Match found, but line could not be processed: "{line}"'])
|
||||
mylog('debug', [f'[Vendor Check] ⚠ ERROR: Match found, but line could not be processed: "{line_lower}"'])
|
||||
return -1
|
||||
|
||||
|
||||
|
||||
@@ -302,7 +302,7 @@ def get_setting_value(key):
|
||||
set_type = setting["Type"] # Setting type
|
||||
|
||||
# Handle different types of settings
|
||||
if set_type in ['text', 'string', 'password', 'readonly', 'text.select']:
|
||||
if set_type in ['text', 'string', 'password', 'password.SHA256', 'readonly', 'text.select']:
|
||||
value = str(set_value)
|
||||
elif set_type in ['boolean', 'integer.checkbox']:
|
||||
|
||||
@@ -570,12 +570,55 @@ def resolve_device_name_pholus (pMAC, pIP, allRes, nameNotFound, match_IP = Fals
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
import dns.resolver
|
||||
|
||||
def cleanDeviceName(str, match_IP):
|
||||
|
||||
if get_setting_value('NEWDEV_LESS_NAME_CLEANUP'):
|
||||
mylog('debug', ["[Name cleanup] Using new cleanDeviceName(" + str + ")"])
|
||||
|
||||
# replace all labels starting with underscore
|
||||
str = re.sub(r'^_[^\.]*\.', '', str) # leading label
|
||||
str = re.sub(r'\._[^\.]*\.', '.', str) # nested label
|
||||
|
||||
# get a stub resolver for access to resolv.conf configuration
|
||||
resolv = dns.resolver.Resolver()
|
||||
|
||||
# replace the local domain name
|
||||
str = re.sub(r'\.' + resolv.domain.to_text() + r'$', '', str)
|
||||
|
||||
# replace dns search list
|
||||
for name in resolv.search:
|
||||
str = re.sub(r'\.' + name.to_text() + r'$', '', str)
|
||||
|
||||
# removing last part of e.g. Nest-Audio-ff77ff77ff77ff77ff77ff77ff77ff77
|
||||
str = re.sub(r'-[a-fA-F0-9]{32}', '', str)
|
||||
|
||||
# Remove everything after '#' including the '#'
|
||||
str = re.sub(r'#.*', '', str)
|
||||
|
||||
# remove trailing dot
|
||||
if str.endswith('.'):
|
||||
str = str[:-1]
|
||||
|
||||
# add matching info
|
||||
if match_IP:
|
||||
str = str + " (IP match)"
|
||||
|
||||
# done
|
||||
mylog('debug', ["[Name cleanup] cleanDeviceName = " + str])
|
||||
return str
|
||||
|
||||
################################
|
||||
#
|
||||
# OLD cleanDeviceName
|
||||
mylog('debug', ["[Name cleanup] Using old cleanDeviceName(" + str + ")"])
|
||||
|
||||
# alternative str.split('.')[0]
|
||||
str = str.replace("._airplay", "")
|
||||
str = str.replace("._tcp", "")
|
||||
str = str.replace(".localdomain", "")
|
||||
str = str.replace(".local", "")
|
||||
str = str.replace(".local", "")
|
||||
str = str.replace("._esphomelib", "")
|
||||
str = str.replace("._googlecast", "")
|
||||
str = str.replace(".lan", "")
|
||||
@@ -586,13 +629,12 @@ def cleanDeviceName(str, match_IP):
|
||||
if str.endswith('.'):
|
||||
str = str[:-1]
|
||||
|
||||
|
||||
if match_IP:
|
||||
str = str + " (IP match)"
|
||||
|
||||
mylog('debug', ["cleanDeviceName = " + str])
|
||||
return str
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# String manipulation methods
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -659,6 +701,27 @@ def generate_mac_links (html, deviceUrl):
|
||||
|
||||
return html
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
def extract_between_strings(text, start, end):
|
||||
start_index = text.find(start)
|
||||
end_index = text.find(end, start_index + len(start))
|
||||
if start_index != -1 and end_index != -1:
|
||||
return text[start_index + len(start):end_index]
|
||||
else:
|
||||
return ""
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
def extract_mac_addresses(text):
|
||||
mac_pattern = r"([0-9A-Fa-f]{2}(?:[:-][0-9A-Fa-f]{2}){5})"
|
||||
mac_addresses = re.findall(mac_pattern, text)
|
||||
return mac_addresses
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
def extract_ip_addresses(text):
|
||||
ip_pattern = r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b"
|
||||
ip_addresses = re.findall(ip_pattern, text)
|
||||
return ip_addresses
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# JSON methods
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
@@ -99,11 +99,10 @@ def importConfigs (db):
|
||||
# General
|
||||
# ----------------------------------------
|
||||
|
||||
conf.SCAN_SUBNETS = ccd('SCAN_SUBNETS', ['192.168.1.0/24 --interface=eth1', '192.168.1.0/24 --interface=eth0'] , c_d, 'Subnets to scan', 'subnets', '', 'General')
|
||||
conf.LOG_LEVEL = ccd('LOG_LEVEL', 'verbose' , c_d, 'Log verboseness', 'text.select', "['none', 'minimal', 'verbose', 'debug']", 'General')
|
||||
conf.TIMEZONE = ccd('TIMEZONE', 'Europe/Berlin' , c_d, 'Time zone', 'text', '', 'General')
|
||||
conf.PLUGINS_KEEP_HIST = ccd('PLUGINS_KEEP_HIST', 250 , c_d, 'Keep history entries', 'integer', '', 'General')
|
||||
conf.PIALERT_WEB_PROTECTION = ccd('PIALERT_WEB_PROTECTION', False , c_d, 'Enable logon', 'boolean', '', 'General')
|
||||
conf.PIALERT_WEB_PASSWORD = ccd('PIALERT_WEB_PASSWORD', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92' , c_d, 'Logon password', 'readonly', '', 'General')
|
||||
conf.REPORT_DASHBOARD_URL = ccd('REPORT_DASHBOARD_URL', 'http://netalertx/' , c_d, 'NetAlertX URL', 'text', '', 'General')
|
||||
conf.UI_LANG = ccd('UI_LANG', 'English' , c_d, 'Language Interface', 'text.select', "['English', 'French', 'German', 'Norwegian', 'Russian', 'Spanish' ]", 'General')
|
||||
conf.UI_PRESENCE = ccd('UI_PRESENCE', ['online', 'offline', 'archived'] , c_d, 'Include in presence', 'text.multiselect', "['online', 'offline', 'archived']", 'General')
|
||||
@@ -117,9 +116,8 @@ def importConfigs (db):
|
||||
conf.API_CUSTOM_SQL = ccd('API_CUSTOM_SQL', 'SELECT * FROM Devices WHERE dev_PresentLastScan = 0' , c_d, 'Custom endpoint', 'text', '', 'General')
|
||||
conf.NETWORK_DEVICE_TYPES = ccd('NETWORK_DEVICE_TYPES', ['AP', 'Gateway', 'Firewall', 'Hypervisor', 'Powerline', 'Switch', 'WLAN', 'PLC', 'Router','USB LAN Adapter', 'USB WIFI Adapter', 'Internet'] , c_d, 'Network device types', 'list', '', 'General')
|
||||
|
||||
# ARPSCAN (+ more settings are provided by the ARPSCAN plugin)
|
||||
conf.SCAN_SUBNETS = ccd('SCAN_SUBNETS', ['192.168.1.0/24 --interface=eth1', '192.168.1.0/24 --interface=eth0'] , c_d, 'Subnets to scan', 'subnets', '', 'ARPSCAN')
|
||||
|
||||
|
||||
|
||||
# Init timezone in case it changed
|
||||
conf.tz = timezone(conf.TIMEZONE)
|
||||
|
||||
@@ -256,6 +254,8 @@ def read_config_file(filename):
|
||||
replacements = {
|
||||
r'\bREPORT_TO\b': 'SMTP_REPORT_TO',
|
||||
r'\bREPORT_FROM\b': 'SMTP_REPORT_FROM',
|
||||
r'\bPIALERT_WEB_PROTECTION\b': 'SETPWD_enable_password',
|
||||
r'\bPIALERT_WEB_PASSWORD\b': 'SETPWD_password',
|
||||
r'REPORT_MAIL=True': 'SMTP_RUN=\'on_notification\'',
|
||||
r'REPORT_APPRISE=True': 'APPRISE_RUN=\'on_notification\'',
|
||||
r'REPORT_NTFY=True': 'NTFY_RUN=\'on_notification\'',
|
||||
|
||||
@@ -31,7 +31,7 @@ class plugin_param:
|
||||
setVal = inputValue["Value"] # setting value
|
||||
setTyp = inputValue["Type"] # setting type
|
||||
|
||||
noConversion = ['text', 'string', 'integer', 'boolean', 'password', 'readonly', 'integer.select', 'text.select', 'integer.checkbox' ]
|
||||
noConversion = ['text', 'string', 'integer', 'boolean', 'password', 'password.SHA256', 'readonly', 'integer.select', 'text.select', 'integer.checkbox' ]
|
||||
arrayConversion = ['text.multiselect', 'list', 'subnets']
|
||||
jsonConversion = ['.template']
|
||||
|
||||
|
||||
Reference in New Issue
Block a user