mirror of
https://github.com/jokob-sk/NetAlertX.git
synced 2025-12-07 09:36:05 -08:00
Compare commits
99 Commits
e8d3d5c2a9
...
rewrite
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b28cd243f0 | ||
|
|
dce8c34064 | ||
|
|
9502ee0cd0 | ||
|
|
8eb4ffe3ed | ||
|
|
4be59807e5 | ||
|
|
4712a2ff29 | ||
|
|
f9179a1e89 | ||
|
|
a6df204721 | ||
|
|
101189ae7c | ||
|
|
f25c012fbe | ||
|
|
868a85d84c | ||
|
|
771dd4b176 | ||
|
|
ed4d3bf17c | ||
|
|
7c728fbe36 | ||
|
|
4ff9d01ef5 | ||
|
|
1bce2e80e8 | ||
|
|
1556d74406 | ||
|
|
9b3947cc90 | ||
|
|
18b0309ac4 | ||
|
|
0afd4ae115 | ||
|
|
09e360c746 | ||
|
|
5dbe79ba2f | ||
|
|
779707761f | ||
|
|
16992bb2bd | ||
|
|
3374f83255 | ||
|
|
8f420a14cd | ||
|
|
57024c0cb1 | ||
|
|
db7fb825fe | ||
|
|
49e8c6a4f2 | ||
|
|
66bf4241b2 | ||
|
|
76a5dda553 | ||
|
|
6393aa7f2c | ||
|
|
c5f938113f | ||
|
|
dac7eaba6d | ||
|
|
35e6059068 | ||
|
|
afebc8dc39 | ||
|
|
34151a86b1 | ||
|
|
72d6934345 | ||
|
|
f5f7031030 | ||
|
|
ffccca9424 | ||
|
|
3f5ae334a2 | ||
|
|
bb45c4d345 | ||
|
|
bad3c76de9 | ||
|
|
4ee652cfda | ||
|
|
abaffa4042 | ||
|
|
ad4b5d7c64 | ||
|
|
3b38476c5a | ||
|
|
a42f6a20e4 | ||
|
|
da2afb2fb7 | ||
|
|
dda0d6a898 | ||
|
|
36068aaf77 | ||
|
|
3cb65fa4ec | ||
|
|
26cc757f75 | ||
|
|
2337f96685 | ||
|
|
82ec3b239e | ||
|
|
aa72b0216d | ||
|
|
b002bc34ac | ||
|
|
a84f0d4faf | ||
|
|
a9715cb087 | ||
|
|
827b0d15d1 | ||
|
|
4b4b2f914f | ||
|
|
bf679cdc5d | ||
|
|
4c430c6d5d | ||
|
|
905279aabe | ||
|
|
d92a5da029 | ||
|
|
a3a27fc27a | ||
|
|
0d6bc71d2b | ||
|
|
41397be1bd | ||
|
|
8fbcb07267 | ||
|
|
3c18540c8c | ||
|
|
ab9c940d01 | ||
|
|
7e573282d0 | ||
|
|
d08368e4f5 | ||
|
|
2c1718bb0e | ||
|
|
5a0bf03b81 | ||
|
|
6978c9446c | ||
|
|
d3fd160cf3 | ||
|
|
c3421c8699 | ||
|
|
0a3ebc931b | ||
|
|
83c593a1e2 | ||
|
|
60c812327a | ||
|
|
d27ba5c046 | ||
|
|
120a88d12d | ||
|
|
054df2ed79 | ||
|
|
94240f61ca | ||
|
|
9c77a25d9a | ||
|
|
7819f2774c | ||
|
|
a07bdd7469 | ||
|
|
68c3712539 | ||
|
|
be5fc6dccb | ||
|
|
414110e575 | ||
|
|
bd641273ff | ||
|
|
404a97fb89 | ||
|
|
e3cab610ec | ||
|
|
cd87f6db0d | ||
|
|
dc015077e4 | ||
|
|
f778932fd6 | ||
|
|
c284d27d31 | ||
|
|
acac02a672 |
2
.github/FUNDING.yml
vendored
2
.github/FUNDING.yml
vendored
@@ -1,3 +1,3 @@
|
|||||||
github: jokob-sk
|
github: jokob-sk
|
||||||
patreon: 84385063
|
patreon: netalertx
|
||||||
buy_me_a_coffee: jokobsk
|
buy_me_a_coffee: jokobsk
|
||||||
|
|||||||
81
.github/workflows/docker_rewrite.yml
vendored
Executable file
81
.github/workflows/docker_rewrite.yml
vendored
Executable file
@@ -0,0 +1,81 @@
|
|||||||
|
name: docker
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- rewrite
|
||||||
|
tags:
|
||||||
|
- '*.*.*'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- rewrite
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
docker_dev:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 30
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
if: >
|
||||||
|
contains(github.event.head_commit.message, 'PUSHPROD') != 'True' &&
|
||||||
|
github.repository == 'jokob-sk/NetAlertX'
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v3
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Set up dynamic build ARGs
|
||||||
|
id: getargs
|
||||||
|
run: echo "version=$(cat ./stable/VERSION)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Get release version
|
||||||
|
id: get_version
|
||||||
|
run: echo "version=Dev" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Create .VERSION file
|
||||||
|
run: echo "${{ steps.get_version.outputs.version }}" >> .VERSION
|
||||||
|
|
||||||
|
- name: Docker meta
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v4
|
||||||
|
with:
|
||||||
|
images: |
|
||||||
|
ghcr.io/jokob-sk/netalertx-dev-rewrite
|
||||||
|
jokobsk/netalertx-dev-rewrite
|
||||||
|
tags: |
|
||||||
|
type=raw,value=latest
|
||||||
|
type=ref,event=branch
|
||||||
|
type=ref,event=pr
|
||||||
|
type=semver,pattern={{version}}
|
||||||
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
|
type=semver,pattern={{major}}
|
||||||
|
type=sha
|
||||||
|
|
||||||
|
- name: Log in to Github Container Registry (GHCR)
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: jokob-sk
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Log in to DockerHub
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
uses: docker/build-push-action@v3
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6
|
||||||
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
@@ -13,7 +13,7 @@ ENV PATH="/opt/venv/bin:$PATH"
|
|||||||
|
|
||||||
COPY . ${INSTALL_DIR}/
|
COPY . ${INSTALL_DIR}/
|
||||||
|
|
||||||
RUN pip install openwrt-luci-rpc asusrouter asyncio aiohttp graphene flask tplink-omada-client wakeonlan pycryptodome requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython librouteros yattag git+https://github.com/foreign-sub/aiofreepybox.git \
|
RUN pip install openwrt-luci-rpc asusrouter asyncio aiohttp graphene flask flask-cors unifi-sm-api tplink-omada-client wakeonlan pycryptodome requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython librouteros yattag git+https://github.com/foreign-sub/aiofreepybox.git \
|
||||||
&& bash -c "find ${INSTALL_DIR} -type d -exec chmod 750 {} \;" \
|
&& bash -c "find ${INSTALL_DIR} -type d -exec chmod 750 {} \;" \
|
||||||
&& bash -c "find ${INSTALL_DIR} -type f -exec chmod 640 {} \;" \
|
&& bash -c "find ${INSTALL_DIR} -type f -exec chmod 640 {} \;" \
|
||||||
&& bash -c "find ${INSTALL_DIR} -type f \( -name '*.sh' -o -name '*.py' -o -name 'speedtest-cli' \) -exec chmod 750 {} \;"
|
&& bash -c "find ${INSTALL_DIR} -type f \( -name '*.sh' -o -name '*.py' -o -name 'speedtest-cli' \) -exec chmod 750 {} \;"
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ RUN phpenmod -v 8.2 sqlite3
|
|||||||
RUN apt-get install -y python3-venv
|
RUN apt-get install -y python3-venv
|
||||||
RUN python3 -m venv myenv
|
RUN python3 -m venv myenv
|
||||||
|
|
||||||
RUN /bin/bash -c "source myenv/bin/activate && update-alternatives --install /usr/bin/python python /usr/bin/python3 10 && pip3 install openwrt-luci-rpc asusrouter asyncio aiohttp graphene flask tplink-omada-client wakeonlan pycryptodome requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython librouteros yattag "
|
RUN /bin/bash -c "source myenv/bin/activate && update-alternatives --install /usr/bin/python python /usr/bin/python3 10 && pip3 install openwrt-luci-rpc asusrouter asyncio aiohttp graphene flask flask-cors unifi-sm-api tplink-omada-client wakeonlan pycryptodome requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython librouteros yattag "
|
||||||
|
|
||||||
# Create a buildtimestamp.txt to later check if a new version was released
|
# Create a buildtimestamp.txt to later check if a new version was released
|
||||||
RUN date +%s > ${INSTALL_DIR}/front/buildtimestamp.txt
|
RUN date +%s > ${INSTALL_DIR}/front/buildtimestamp.txt
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ LOADED_PLUGINS=['ARPSCAN', 'AVAHISCAN', 'CSVBCKP','DBCLNP', 'DIGSCAN', 'INTRNT',
|
|||||||
|
|
||||||
DAYS_TO_KEEP_EVENTS=90
|
DAYS_TO_KEEP_EVENTS=90
|
||||||
# Used for generating links in emails. Make sure not to add a trailing slash!
|
# Used for generating links in emails. Make sure not to add a trailing slash!
|
||||||
REPORT_DASHBOARD_URL='http://127.0.0.1'
|
REPORT_DASHBOARD_URL='update_REPORT_DASHBOARD_URL_setting'
|
||||||
|
|
||||||
# Make sure at least these scanners are enabled for new installs, other defaults are taken from the config.json
|
# Make sure at least these scanners are enabled for new installs, other defaults are taken from the config.json
|
||||||
INTRNT_RUN='schedule'
|
INTRNT_RUN='schedule'
|
||||||
|
|||||||
200
back/device_heuristics_rules.json
Executable file
200
back/device_heuristics_rules.json
Executable file
@@ -0,0 +1,200 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"dev_type": "Gateway",
|
||||||
|
"icon_html": "<i class=\"fa fa-globe\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
{ "mac_prefix": "INTERNET", "vendor": "" }
|
||||||
|
],
|
||||||
|
"name_pattern": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "Access Point",
|
||||||
|
"icon_html": "<i class=\"fa fa-network-wired\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
{ "mac_prefix": "74ACB9", "vendor": "Ubiquiti" },
|
||||||
|
{ "mac_prefix": "002468", "vendor": "Cisco" },
|
||||||
|
{ "mac_prefix": "F4F5D8", "vendor": "TP-Link" },
|
||||||
|
{ "mac_prefix": "F88E85", "vendor": "Netgear" }
|
||||||
|
],
|
||||||
|
"name_pattern": ["router", "gateway", "ap", "access point", "access-point", "switch"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "Phone",
|
||||||
|
"icon_html": "<i class=\"fa-brands fa-apple\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
{ "mac_prefix": "001A79", "vendor": "Apple" },
|
||||||
|
{ "mac_prefix": "B0BE83", "vendor": "Samsung" },
|
||||||
|
{ "mac_prefix": "BC926B", "vendor": "Motorola" }
|
||||||
|
],
|
||||||
|
"name_pattern": ["iphone", "ipad", "pixel", "galaxy", "redmi"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "Phone",
|
||||||
|
"icon_html": "<i class=\"fa-solid fa-mobile\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
],
|
||||||
|
"name_pattern": ["android","samsung"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "Tablet",
|
||||||
|
"icon_html": "<i class=\"fa fa-tablet\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
{ "mac_prefix": "001B63", "vendor": "Apple" },
|
||||||
|
{ "mac_prefix": "BC4C4C", "vendor": "Samsung" }
|
||||||
|
],
|
||||||
|
"name_pattern": ["tablet", "pad"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "IoT",
|
||||||
|
"icon_html": "<i class=\"fa-brands fa-raspberry-pi\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
{ "mac_prefix": "B827EB", "vendor": "Raspberry Pi" },
|
||||||
|
{ "mac_prefix": "DCA632", "vendor": "Raspberry Pi" }
|
||||||
|
],
|
||||||
|
"name_pattern": ["raspberry", "pi"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "IoT",
|
||||||
|
"icon_html": "<i class=\"fa-solid fa-microchip\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
{ "mac_prefix": "840D8E", "vendor": "Espressif" },
|
||||||
|
{ "mac_prefix": "ECFABC", "vendor": "Espressif" },
|
||||||
|
{ "mac_prefix": "7C9EBD", "vendor": "Espressif" }
|
||||||
|
],
|
||||||
|
"name_pattern": ["raspberry", "pi"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "Desktop",
|
||||||
|
"icon_html": "<i class=\"fa fa-desktop\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
{ "mac_prefix": "001422", "vendor": "Dell" },
|
||||||
|
{ "mac_prefix": "001874", "vendor": "Lenovo" },
|
||||||
|
{ "mac_prefix": "00E04C", "vendor": "Hewlett Packard" }
|
||||||
|
],
|
||||||
|
"name_pattern": ["desktop", "pc", "computer"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "Laptop",
|
||||||
|
"icon_html": "<i class=\"fa fa-laptop\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
{ "mac_prefix": "3C0754", "vendor": "HP" },
|
||||||
|
{ "mac_prefix": "0017A4", "vendor": "Dell" },
|
||||||
|
{ "mac_prefix": "F4CE46", "vendor": "Lenovo" },
|
||||||
|
{ "mac_prefix": "409F38", "vendor": "Acer" }
|
||||||
|
],
|
||||||
|
"name_pattern": ["macbook", "imac", "laptop", "notebook"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "Server",
|
||||||
|
"icon_html": "<i class=\"fa fa-server\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
{ "mac_prefix": "001CBF", "vendor": "Supermicro" },
|
||||||
|
{ "mac_prefix": "002186", "vendor": "Dell" },
|
||||||
|
{ "mac_prefix": "D02788", "vendor": "Hewlett Packard" },
|
||||||
|
{ "mac_prefix": "002590", "vendor": "IBM" }
|
||||||
|
],
|
||||||
|
"name_pattern": ["server", "nas"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "VM",
|
||||||
|
"icon_html": "<i class=\"fa fa-server\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
{ "mac_prefix": "525400", "vendor": "QEMU" },
|
||||||
|
{ "mac_prefix": "005056", "vendor": "VMware" },
|
||||||
|
{ "mac_prefix": "000C29", "vendor": "VMware" },
|
||||||
|
{ "mac_prefix": "000569", "vendor": "VMware" },
|
||||||
|
{ "mac_prefix": "00163E", "vendor": "Xen" },
|
||||||
|
{ "mac_prefix": "080027", "vendor": "VirtualBox" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "TV",
|
||||||
|
"icon_html": "<i class=\"fa fa-tv\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
{ "mac_prefix": "0013CE", "vendor": "Samsung" },
|
||||||
|
{ "mac_prefix": "0017C8", "vendor": "LG" },
|
||||||
|
{ "mac_prefix": "D46E0E", "vendor": "Sony" }
|
||||||
|
],
|
||||||
|
"name_pattern": ["tv", "television", "smarttv"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "Gaming Console",
|
||||||
|
"icon_html": "<i class=\"fa fa-gamepad\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
{ "mac_prefix": "001FA7", "vendor": "Sony" },
|
||||||
|
{ "mac_prefix": "7C04D0", "vendor": "Nintendo" },
|
||||||
|
{ "mac_prefix": "EC26CA", "vendor": "Sony" }
|
||||||
|
],
|
||||||
|
"name_pattern": ["playstation", "xbox"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "Camera",
|
||||||
|
"icon_html": "<i class=\"fa fa-camera\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
{ "mac_prefix": "A45E60", "vendor": "Hikvision" },
|
||||||
|
{ "mac_prefix": "00408C", "vendor": "Axis" },
|
||||||
|
{ "mac_prefix": "00156D", "vendor": "Amcrest" },
|
||||||
|
{ "mac_prefix": "AC9E17", "vendor": "Reolink" }
|
||||||
|
],
|
||||||
|
"name_pattern": ["camera", "cam", "webcam"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "Smart Speaker",
|
||||||
|
"icon_html": "<i class=\"fa fa-volume-up\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
{ "mac_prefix": "44650D", "vendor": "Amazon" },
|
||||||
|
{ "mac_prefix": "74ACB9", "vendor": "Google" }
|
||||||
|
],
|
||||||
|
"name_pattern": ["echo", "alexa", "dot"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "Router",
|
||||||
|
"icon_html": "<i class=\"fa fa-random\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
{ "mac_prefix": "000C29", "vendor": "Cisco" },
|
||||||
|
{ "mac_prefix": "00155D", "vendor": "MikroTik" }
|
||||||
|
],
|
||||||
|
"name_pattern": ["router", "gateway", "ap", "access point", "access-point"],
|
||||||
|
"ip_pattern": [
|
||||||
|
"^192\\.168\\.[0-1]\\.1$",
|
||||||
|
"^10\\.0\\.0\\.1$"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "Smart Light",
|
||||||
|
"icon_html": "<i class=\"fa fa-lightbulb\"></i>",
|
||||||
|
"matching_pattern": [],
|
||||||
|
"name_pattern": ["hue", "lifx", "bulb"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "Smart Home",
|
||||||
|
"icon_html": "<i class=\"fa fa-house\"></i>",
|
||||||
|
"matching_pattern": [],
|
||||||
|
"name_pattern": ["google", "chromecast", "nest"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "Smartwatch",
|
||||||
|
"icon_html": "<i class=\"fa fa-watch\"></i>",
|
||||||
|
"matching_pattern": [],
|
||||||
|
"name_pattern": ["watch", "wear"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "Printer",
|
||||||
|
"icon_html": "<i class=\"fa fa-print\"></i>",
|
||||||
|
"matching_pattern": [],
|
||||||
|
"name_pattern": ["printer", "print"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "Security Device",
|
||||||
|
"icon_html": "<i class=\"fa fa-shield-alt\"></i>",
|
||||||
|
"matching_pattern": [],
|
||||||
|
"name_pattern": ["doorbell", "lock", "security"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"dev_type": "Smart Light",
|
||||||
|
"icon_html": "<i class=\"fa-solid fa-lightbulb\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
],
|
||||||
|
"name_pattern": ["light","bulb"]
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -59,6 +59,9 @@ services:
|
|||||||
- ${DEV_LOCATION}/front/presence.php:/app/front/presence.php
|
- ${DEV_LOCATION}/front/presence.php:/app/front/presence.php
|
||||||
- ${DEV_LOCATION}/front/settings.php:/app/front/settings.php
|
- ${DEV_LOCATION}/front/settings.php:/app/front/settings.php
|
||||||
- ${DEV_LOCATION}/front/systeminfo.php:/app/front/systeminfo.php
|
- ${DEV_LOCATION}/front/systeminfo.php:/app/front/systeminfo.php
|
||||||
|
- ${DEV_LOCATION}/front/systeminfoNetwork.php:/app/front/systeminfoNetwork.php
|
||||||
|
- ${DEV_LOCATION}/front/systeminfoServer.php:/app/front/systeminfoServer.php
|
||||||
|
- ${DEV_LOCATION}/front/systeminfoStorage.php:/app/front/systeminfoStorage.php
|
||||||
- ${DEV_LOCATION}/front/cloud_services.php:/app/front/cloud_services.php
|
- ${DEV_LOCATION}/front/cloud_services.php:/app/front/cloud_services.php
|
||||||
- ${DEV_LOCATION}/front/report.php:/app/front/report.php
|
- ${DEV_LOCATION}/front/report.php:/app/front/report.php
|
||||||
- ${DEV_LOCATION}/front/workflows.php:/app/front/workflows.php
|
- ${DEV_LOCATION}/front/workflows.php:/app/front/workflows.php
|
||||||
|
|||||||
106
docs/API.md
106
docs/API.md
@@ -221,6 +221,112 @@ Example JSON of the `table_devices.json` endpoint with two Devices (database row
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## API Endpoint: Prometheus Exporter
|
||||||
|
|
||||||
|
* **Endpoint URL**: `/metrics`
|
||||||
|
* **Host**: (where NetAlertX exporter is running)
|
||||||
|
* **Port**: as configured in the `GRAPHQL_PORT` setting (`20212` by default)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Example Output of the `/metrics` Endpoint
|
||||||
|
|
||||||
|
Below is a representative snippet of the metrics you may find when querying the `/metrics` endpoint for `netalertx`. It includes both aggregate counters and `device_status` labels per device.
|
||||||
|
|
||||||
|
```
|
||||||
|
netalertx_connected_devices 31
|
||||||
|
netalertx_offline_devices 54
|
||||||
|
netalertx_down_devices 0
|
||||||
|
netalertx_new_devices 0
|
||||||
|
netalertx_archived_devices 31
|
||||||
|
netalertx_favorite_devices 2
|
||||||
|
netalertx_my_devices 54
|
||||||
|
|
||||||
|
netalertx_device_status{device="Net - Huawei", mac="Internet", ip="1111.111.111.111", vendor="None", first_connection="2021-01-01 00:00:00", last_connection="2025-08-04 17:57:00", dev_type="Router", device_status="Online"} 1
|
||||||
|
netalertx_device_status{device="Net - USG", mac="74:ac:74:ac:74:ac", ip="192.168.1.1", vendor="Ubiquiti Networks Inc.", first_connection="2022-02-12 22:05:00", last_connection="2025-06-07 08:16:49", dev_type="Firewall", device_status="Archived"} 1
|
||||||
|
netalertx_device_status{device="Raspberry Pi 4 LAN", mac="74:ac:74:ac:74:74", ip="192.168.1.9", vendor="Raspberry Pi Trading Ltd", first_connection="2022-02-12 22:05:00", last_connection="2025-08-04 17:57:00", dev_type="Singleboard Computer (SBC)", device_status="Online"} 1
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Metrics Explanation
|
||||||
|
|
||||||
|
#### 1. Aggregate Device Counts
|
||||||
|
|
||||||
|
Metric names prefixed with `netalertx_` provide aggregated counts by device status:
|
||||||
|
|
||||||
|
* `netalertx_connected_devices`: number of devices currently connected
|
||||||
|
* `netalertx_offline_devices`: devices currently offline
|
||||||
|
* `netalertx_down_devices`: down/unreachable devices
|
||||||
|
* `netalertx_new_devices`: devices recently detected
|
||||||
|
* `netalertx_archived_devices`: archived devices
|
||||||
|
* `netalertx_favorite_devices`: user-marked favorite devices
|
||||||
|
* `netalertx_my_devices`: devices associated with the current user context
|
||||||
|
|
||||||
|
These numeric values give a high-level overview of device distribution.
|
||||||
|
|
||||||
|
#### 2. Per‑Device Status with Labels
|
||||||
|
|
||||||
|
Each individual device is represented by a `netalertx_device_status` metric, with descriptive labels:
|
||||||
|
|
||||||
|
* `device`: friendly name of the device
|
||||||
|
* `mac`: MAC address (or placeholder)
|
||||||
|
* `ip`: last recorded IP address
|
||||||
|
* `vendor`: manufacturer or "None" if unknown
|
||||||
|
* `first_connection`: timestamp when the device was first observed
|
||||||
|
* `last_connection`: most recent contact timestamp
|
||||||
|
* `dev_type`: device category or type
|
||||||
|
* `device_status`: current status (Online / Offline / Archived / Down / ...)
|
||||||
|
|
||||||
|
The metric value is always `1` (indicating presence or active state) and the combination of labels identifies the device.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### How to Query with `curl`
|
||||||
|
|
||||||
|
To fetch the metrics from the NetAlertX exporter:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl 'http://<server_ip>:<GRAPHQL_PORT>/metrics' \
|
||||||
|
-H 'Authorization: Bearer <API_TOKEN>' \
|
||||||
|
-H 'Accept: text/plain'
|
||||||
|
```
|
||||||
|
|
||||||
|
Replace:
|
||||||
|
|
||||||
|
* `<server_ip>`: IP or hostname of the NetAlertX server
|
||||||
|
* `<GRAPHQL_PORT>`: port specified in your `GRAPHQL_PORT` setting (default: `20212`)
|
||||||
|
* `<API_TOKEN>` your Bearer token from the `API_TOKEN` setting
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Summary
|
||||||
|
|
||||||
|
* **Endpoint**: `/metrics` provides both summary counters and per-device status entries.
|
||||||
|
* **Aggregate metrics** help monitor overall device states.
|
||||||
|
* **Detailed metrics** expose each device’s metadata via labels.
|
||||||
|
* **Use case**: feed into Prometheus for scraping, monitoring, alerting, or charting dashboard views.
|
||||||
|
|
||||||
|
### Prometheus Scraping Configuration
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
scrape_configs:
|
||||||
|
- job_name: 'netalertx'
|
||||||
|
metrics_path: /metrics
|
||||||
|
scheme: http
|
||||||
|
scrape_interval: 60s
|
||||||
|
static_configs:
|
||||||
|
- targets: ['<server_ip>:<GRAPHQL_PORT>']
|
||||||
|
authorization:
|
||||||
|
type: Bearer
|
||||||
|
credentials: <API_TOKEN>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Grafana template
|
||||||
|
|
||||||
|
Grafana template sample: [Download json](./samples/API/Grafana_Dashboard.json)
|
||||||
|
|
||||||
## API Endpoint: /log files
|
## API Endpoint: /log files
|
||||||
|
|
||||||
This API endpoint retrieves files from the `/app/log` folder.
|
This API endpoint retrieves files from the `/app/log` folder.
|
||||||
|
|||||||
34
docs/DEBUG_PHP.md
Executable file
34
docs/DEBUG_PHP.md
Executable file
@@ -0,0 +1,34 @@
|
|||||||
|
# Debugging backend PHP issues
|
||||||
|
|
||||||
|
## Logs in UI
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
You can view recent backend PHP errors directly in the **Maintenance > Logs** section of the UI. This provides quick access to logs without needing terminal access.
|
||||||
|
|
||||||
|
## Accessing logs directly
|
||||||
|
|
||||||
|
Sometimes, the UI might not be accessible. In that case, you can access the logs directly inside the container.
|
||||||
|
|
||||||
|
### Step-by-step:
|
||||||
|
|
||||||
|
1. **Open a shell into the container:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -it netalertx /bin/sh
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Check the NGINX error log:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat /var/log/nginx/error.log
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Check the PHP application error log:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat /app/log/app.php_errors.log
|
||||||
|
```
|
||||||
|
|
||||||
|
These logs will help identify syntax issues, fatal errors, or startup problems when the UI fails to load properly.
|
||||||
|
|
||||||
114
docs/DEVICE_HEURISTICS.md
Executable file
114
docs/DEVICE_HEURISTICS.md
Executable file
@@ -0,0 +1,114 @@
|
|||||||
|
# Device Heuristics: Icon and Type Guessing
|
||||||
|
|
||||||
|
This module is responsible for inferring the most likely **device type** and **icon** based on minimal identifying data like MAC address, vendor, IP, or device name.
|
||||||
|
|
||||||
|
It does this using a set of heuristics defined in an external JSON rules file, which it evaluates **in priority order**.
|
||||||
|
|
||||||
|
>[!NOTE]
|
||||||
|
> You can find the full source code of the heuristics module in the `device_heuristics.py` file.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## JSON Rule Format
|
||||||
|
|
||||||
|
Rules are defined in a file called `device_heuristics_rules.json` (located under `/back`), structured like:
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"dev_type": "Phone",
|
||||||
|
"icon_html": "<i class=\"fa-brands fa-apple\"></i>",
|
||||||
|
"matching_pattern": [
|
||||||
|
{ "mac_prefix": "001A79", "vendor": "Apple" }
|
||||||
|
],
|
||||||
|
"name_pattern": ["iphone", "pixel"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
>[!NOTE]
|
||||||
|
> Feel free to raise a PR in case you'd like to add any rules into the `device_heuristics_rules.json` file. Please place new rules into the correct position and consider the priority of already available rules.
|
||||||
|
|
||||||
|
### Supported fields:
|
||||||
|
|
||||||
|
| Field | Type | Description |
|
||||||
|
| ------------------ | -------------------- | --------------------------------------------------------------- |
|
||||||
|
| `dev_type` | `string` | Type to assign if rule matches (e.g. `"Gateway"`, `"Phone"`) |
|
||||||
|
| `icon_html` | `string` | Icon (HTML string) to assign if rule matches. Encoded to base64 at load time. |
|
||||||
|
| `matching_pattern` | `array` | List of `{ mac_prefix, vendor }` objects for first strict and then loose matching |
|
||||||
|
| `name_pattern` | `array` *(optional)* | List of lowercase substrings (used with regex) |
|
||||||
|
| `ip_pattern` | `array` *(optional)* | Regex patterns to match IPs |
|
||||||
|
|
||||||
|
**Order in this array defines priority** — rules are checked top-down and short-circuit on first match.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Matching Flow (in Priority Order)
|
||||||
|
|
||||||
|
The function `guess_device_attributes(...)` runs a series of matching functions in strict order:
|
||||||
|
|
||||||
|
1. MAC + Vendor → `match_mac_and_vendor()`
|
||||||
|
2. Vendor only → `match_vendor()`
|
||||||
|
3. Name pattern → `match_name()`
|
||||||
|
4. IP pattern → `match_ip()`
|
||||||
|
5. Final fallback → defaults defined in the `NEWDEV_devIcon` and `NEWDEV_devType` settings.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> The app will try guessing the device type or icon if `devType` or `devIcon` are `""` or `"null"`.
|
||||||
|
|
||||||
|
### Use of default values
|
||||||
|
|
||||||
|
The guessing process runs for every device **as long as the current type or icon still matches the default values**. Even if earlier heuristics return a match, the system continues evaluating additional clues — like name or IP — to try and replace placeholders.
|
||||||
|
|
||||||
|
```python
|
||||||
|
# Still considered a match attempt if current values are defaults
|
||||||
|
if (not type_ or type_ == default_type) or (not icon or icon == default_icon):
|
||||||
|
type_, icon = match_ip(ip, default_type, default_icon)
|
||||||
|
```
|
||||||
|
|
||||||
|
In other words: if the type or icon is still `"unknown"` (or matches the default), the system assumes the match isn’t final — and keeps looking. It stops only when both values are non-default (defaults are defined in the `NEWDEV_devIcon` and `NEWDEV_devType` settings).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Match Behavior (per function)
|
||||||
|
|
||||||
|
These functions are executed in the following order:
|
||||||
|
|
||||||
|
### `match_mac_and_vendor(mac_clean, vendor, ...)`
|
||||||
|
|
||||||
|
* Looks for MAC prefix **and** vendor substring match
|
||||||
|
* Most precise
|
||||||
|
* Stops as soon as a match is found
|
||||||
|
|
||||||
|
### `match_vendor(vendor, ...)`
|
||||||
|
|
||||||
|
* Falls back to substring match on vendor only
|
||||||
|
* Ignores rules where `mac_prefix` is present (ensures this is really a fallback)
|
||||||
|
|
||||||
|
### `match_name(name, ...)`
|
||||||
|
|
||||||
|
* Lowercase name is compared against all `name_pattern` values using regex
|
||||||
|
* Good for user-assigned labels (e.g. "AP Office", "iPhone")
|
||||||
|
|
||||||
|
### `match_ip(ip, ...)`
|
||||||
|
|
||||||
|
* If IP is present and matches regex patterns under any rule, it returns that type/icon
|
||||||
|
* Usually used for gateways or local IP ranges
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Icons
|
||||||
|
|
||||||
|
* Each rule can define an `icon_html`, which is converted to a `icon_base64` on load
|
||||||
|
* If missing, it falls back to the passed-in `default_icon` (`NEWDEV_devIcon` setting)
|
||||||
|
* If a match is found but icon is still blank, default is used
|
||||||
|
|
||||||
|
**TL;DR:** Type and icon must both be matched. If only one is matched, the other falls back to the default.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Priority Mechanics
|
||||||
|
|
||||||
|
* JSON rules are evaluated **top-to-bottom**
|
||||||
|
* Matching is **first-hit wins** — no scoring, no weights
|
||||||
|
* Rules that are more specific (e.g. exact MAC prefixes) should be listed earlier
|
||||||
BIN
docs/img/DEBUG/maintenance_debug_php.png
Executable file
BIN
docs/img/DEBUG/maintenance_debug_php.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 160 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 7.0 KiB |
1110
docs/samples/API/Grafana_Dashboard.json
Executable file
1110
docs/samples/API/Grafana_Dashboard.json
Executable file
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
require 'php/templates/header.php';
|
require 'php/templates/header.php';
|
||||||
require 'php/templates/notification.php';
|
require 'php/templates/modals.php';
|
||||||
?>
|
?>
|
||||||
<!-- ----------------------------------------------------------------------- -->
|
<!-- ----------------------------------------------------------------------- -->
|
||||||
|
|
||||||
|
|||||||
@@ -387,6 +387,16 @@ body
|
|||||||
margin-bottom: 0px;
|
margin-bottom: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.plugin-content #tabs-location .nav-tabs-custom > .nav-tabs > li
|
||||||
|
{
|
||||||
|
display: contents;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plugin-content .left-nav
|
||||||
|
{
|
||||||
|
display: contents;
|
||||||
|
}
|
||||||
|
|
||||||
.pa-small-box-2 .inner h3 {
|
.pa-small-box-2 .inner h3 {
|
||||||
margin-left: 0em;
|
margin-left: 0em;
|
||||||
margin-bottom: 1.3em;
|
margin-bottom: 1.3em;
|
||||||
@@ -1411,6 +1421,7 @@ input[readonly] {
|
|||||||
.iconPreview svg{
|
.iconPreview svg{
|
||||||
min-width: 20px;
|
min-width: 20px;
|
||||||
max-width: 20px;
|
max-width: 20px;
|
||||||
|
margin-bottom: -3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1489,7 +1500,7 @@ input[readonly] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#tableDevicesBox td svg, #tableDevicesBox td i{
|
#tableDevicesBox td svg, #tableDevicesBox td i{
|
||||||
height: 1.5em !important;
|
height: 1em !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
#TileCards .tile .inner
|
#TileCards .tile .inner
|
||||||
@@ -1649,6 +1660,21 @@ input[readonly] {
|
|||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.custom-badge a
|
||||||
|
{
|
||||||
|
color: #fff !important;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
.custom-badge
|
||||||
|
{
|
||||||
|
border: 1px solid #aaa;
|
||||||
|
border-radius: 4px;
|
||||||
|
border-style: solid;
|
||||||
|
padding: 0 5px;
|
||||||
|
font-size: 14px;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
#deviceDetailsEdit .form-control
|
#deviceDetailsEdit .form-control
|
||||||
{
|
{
|
||||||
min-height: 42px;
|
min-height: 42px;
|
||||||
@@ -1700,6 +1726,16 @@ input[readonly] {
|
|||||||
width: 92%;
|
width: 92%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#modal-ok
|
||||||
|
{
|
||||||
|
z-index: 1051; /*highest priority*/
|
||||||
|
}
|
||||||
|
|
||||||
|
#modal-form-plc
|
||||||
|
{
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------- */
|
/* ----------------------------------------------------------------- */
|
||||||
/* NETWORK page */
|
/* NETWORK page */
|
||||||
/* ----------------------------------------------------------------- */
|
/* ----------------------------------------------------------------- */
|
||||||
@@ -2093,15 +2129,20 @@ input[readonly] {
|
|||||||
#loadingSpinner {
|
#loadingSpinner {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
z-index: 1000;
|
z-index: 1000;
|
||||||
top: 0;
|
/* top: 0; */
|
||||||
left: 0;
|
/* left: 0; */
|
||||||
width: 100%;
|
/* width: 100%; */
|
||||||
height: 100%;
|
/* height: 100%; */
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transition: opacity 0.3s ease-in-out;
|
transition: opacity 0.3s ease-in-out;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
display: block;
|
display: block;
|
||||||
z-index: 999;
|
z-index: 800;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fa-spinner
|
||||||
|
{
|
||||||
|
font-size: initial;
|
||||||
}
|
}
|
||||||
|
|
||||||
#loadingSpinner.visible {
|
#loadingSpinner.visible {
|
||||||
@@ -2109,16 +2150,16 @@ input[readonly] {
|
|||||||
pointer-events: auto;
|
pointer-events: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pa_semitransparent-panel {
|
.nax_semitransparent-panel {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
opacity: 0.8;
|
opacity: 0.5;
|
||||||
z-index: 99;
|
z-index: 99;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pa_spinner {
|
.nax_spinner {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 100px;
|
top: 100px;
|
||||||
left: 50%;
|
left: 50%;
|
||||||
@@ -2155,9 +2196,10 @@ input[readonly] {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.pia-top-left-logo
|
.top-left-logo
|
||||||
{
|
{
|
||||||
height:50px;
|
height:35px;
|
||||||
|
width:35px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -659,8 +659,14 @@ input[type="password"]::-webkit-caps-lock-indicator {
|
|||||||
border-color: #888888;
|
border-color: #888888;
|
||||||
}
|
}
|
||||||
.table-hover tbody tr:hover td, .table-hover tbody tr:hover th {
|
.table-hover tbody tr:hover td, .table-hover tbody tr:hover th {
|
||||||
background-color: rgb(189,192,198);
|
background-color: var(--datatable-bgcolor);
|
||||||
color: #444;
|
color: var(--fbc-white);
|
||||||
|
}
|
||||||
|
|
||||||
|
table.dataTable tbody tr.selected, table.dataTable tbody tr .selected
|
||||||
|
{
|
||||||
|
background-color: var(--datatable-bgcolor);
|
||||||
|
color: var(--fbc-white);
|
||||||
}
|
}
|
||||||
|
|
||||||
.db_info_table_cell:nth-child(1) {background: #272c30}
|
.db_info_table_cell:nth-child(1) {background: #272c30}
|
||||||
@@ -738,7 +744,7 @@ input[type="password"]::-webkit-caps-lock-indicator {
|
|||||||
top: 0.01em;
|
top: 0.01em;
|
||||||
font-size: 3.25em;
|
font-size: 3.25em;
|
||||||
}
|
}
|
||||||
.pa_semitransparent-panel{
|
.nax_semitransparent-panel{
|
||||||
background-color: #000 !important;
|
background-color: #000 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,8 @@
|
|||||||
--color-yellow: #f39c12;
|
--color-yellow: #f39c12;
|
||||||
--color-red: #dd4b39;
|
--color-red: #dd4b39;
|
||||||
--color-gray: #8c8c8c;
|
--color-gray: #8c8c8c;
|
||||||
}
|
--color-white: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--datatable-bgcolor: rgba(64, 76, 88, 0.8);
|
--datatable-bgcolor: rgba(64, 76, 88, 0.8);
|
||||||
@@ -746,7 +747,7 @@
|
|||||||
top: 0.01em;
|
top: 0.01em;
|
||||||
font-size: 3.25em;
|
font-size: 3.25em;
|
||||||
}
|
}
|
||||||
.pa_semitransparent-panel{
|
.nax_semitransparent-panel{
|
||||||
background-color: #000 !important;
|
background-color: #000 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -793,5 +794,5 @@
|
|||||||
|
|
||||||
.btn:hover
|
.btn:hover
|
||||||
{
|
{
|
||||||
color: var(--color-gray);
|
color: var(--color-white);
|
||||||
}
|
}
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
<!-- Content header--------------------------------------------------------- -->
|
<!-- Content header--------------------------------------------------------- -->
|
||||||
<section class="content-header">
|
<section class="content-header">
|
||||||
<?php require 'php/templates/notification.php'; ?>
|
<?php require 'php/templates/modals.php'; ?>
|
||||||
|
|
||||||
<h1 id="pageTitle">
|
<h1 id="pageTitle">
|
||||||
 <small>Quering device info...</small>
|
 <small>Quering device info...</small>
|
||||||
@@ -123,7 +123,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<div class="tab-content" style="min-height: 430px;">
|
<div class="tab-content spinnerTarget" style="min-height: 430px;">
|
||||||
|
|
||||||
<!-- tab page 1 ------------------------------------------------------------ -->
|
<!-- tab page 1 ------------------------------------------------------------ -->
|
||||||
|
|
||||||
@@ -225,13 +225,6 @@ switch ($UI_THEME) {
|
|||||||
var selectedTab = 'tabDetails';
|
var selectedTab = 'tabDetails';
|
||||||
var emptyArr = ['undefined', "", undefined, null];
|
var emptyArr = ['undefined', "", undefined, null];
|
||||||
|
|
||||||
|
|
||||||
// Call renderSmallBoxes, then main
|
|
||||||
(async () => {
|
|
||||||
await renderSmallBoxes();
|
|
||||||
main();
|
|
||||||
})();
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
function main () {
|
function main () {
|
||||||
|
|
||||||
@@ -299,17 +292,32 @@ function recordSwitch(direction) {
|
|||||||
function updateChevrons(currentMac) {
|
function updateChevrons(currentMac) {
|
||||||
const devicesList = getDevicesList();
|
const devicesList = getDevicesList();
|
||||||
|
|
||||||
// Find the index of the device by MAC
|
pos = devicesList.findIndex(item => item.devMac === currentMac);
|
||||||
pos = devicesList.findIndex(item => item.devMac == currentMac);
|
|
||||||
|
|
||||||
// If device not found, optionally add it or handle error
|
|
||||||
if (pos === -1) {
|
if (pos === -1) {
|
||||||
// If you want to add a placeholder or handle missing device:
|
console.warn('Device not found in cache. Re-caching devices...', currentMac);
|
||||||
// devicesList.push({ mac: currentMac, name: 'Unknown', type: 'Unknown' });
|
|
||||||
// pos = devicesList.length - 1;
|
showSpinner();
|
||||||
|
|
||||||
|
cacheDevices().then(() => {
|
||||||
|
hideSpinner();
|
||||||
|
|
||||||
|
// Retry after re-caching
|
||||||
|
const refreshedList = getDevicesList();
|
||||||
|
pos = refreshedList.findIndex(item => item.devMac === currentMac);
|
||||||
|
|
||||||
|
if (pos === -1) {
|
||||||
|
console.error('Still not found after re-cache:', currentMac);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Device found after re-cache:', refreshedList[pos]);
|
||||||
|
// Proceed with using `refreshedList[pos]`
|
||||||
|
}).catch((err) => {
|
||||||
|
hideSpinner();
|
||||||
|
console.error('Failed to cache devices:', err);
|
||||||
|
});
|
||||||
|
|
||||||
// Or just return early if device not found
|
|
||||||
console.warn('Device with MAC not found:', currentMac);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -345,7 +353,7 @@ function performSwitch(direction)
|
|||||||
|
|
||||||
// Update the global position in the devices list variable 'pos'
|
// Update the global position in the devices list variable 'pos'
|
||||||
if (direction === "next") {
|
if (direction === "next") {
|
||||||
console.log("direction" + direction);
|
console.log("direction:" + direction);
|
||||||
|
|
||||||
if (pos < devicesList.length) {
|
if (pos < devicesList.length) {
|
||||||
pos++;
|
pos++;
|
||||||
@@ -414,7 +422,6 @@ async function renderSmallBoxes() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const deviceData = await response.json();
|
const deviceData = await response.json();
|
||||||
console.log(deviceData);
|
|
||||||
|
|
||||||
// Prepare custom data
|
// Prepare custom data
|
||||||
const customData = [
|
const customData = [
|
||||||
@@ -486,34 +493,58 @@ async function renderSmallBoxes() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function updateDevicePageName(mac) {
|
function updateDevicePageName(mac) {
|
||||||
|
let name = getDevDataByMac(mac, "devName");
|
||||||
|
let owner = getDevDataByMac(mac, "devOwner");
|
||||||
|
|
||||||
name = getDevDataByMac(mac, "devName")
|
// If data is missing, re-cache and retry once
|
||||||
owner = getDevDataByMac(mac, "devOwner")
|
if (mac != 'new' && (name === "Unknown" || owner === "Unknown")) {
|
||||||
|
console.warn("Device not found in cache, retrying after re-cache:", mac);
|
||||||
|
showSpinner();
|
||||||
|
cacheDevices().then(() => {
|
||||||
|
hideSpinner();
|
||||||
|
// Retry after successful cache
|
||||||
|
updateDevicePageName(mac);
|
||||||
|
}).catch((err) => {
|
||||||
|
hideSpinner();
|
||||||
|
console.error("Failed to refresh devices:", err);
|
||||||
|
});
|
||||||
|
return; // Exit early to avoid showing bad data
|
||||||
|
}
|
||||||
|
|
||||||
// Page title - Name
|
// Page title - Name
|
||||||
if (mac == "new") {
|
if (mac == "new") {
|
||||||
$('#pageTitle').html(`<i title="${getString("Gen_create_new_device")}" class="fa fa-square-plus"></i> ` + getString("Gen_create_new_device"));
|
$('#pageTitle').html(
|
||||||
$('#devicePageInfoPlc .inner').html(`<i class="fa fa-circle-info"></i> ` + getString("Gen_create_new_device_info"));
|
`<i title="${getString("Gen_create_new_device")}" class="fa fa-square-plus"></i> ` + getString("Gen_create_new_device")
|
||||||
$('#devicePageInfoPlc').show();
|
);
|
||||||
} else if (owner == null || owner == '' ||
|
$('#devicePageInfoPlc .inner').html(
|
||||||
(name.toString()).indexOf(owner) != -1) {
|
`<i class="fa fa-circle-info"></i> ` + getString("Gen_create_new_device_info")
|
||||||
$('#pageTitle').html(name);
|
);
|
||||||
$('#devicePageInfoPlc').hide();
|
$('#devicePageInfoPlc').show();
|
||||||
|
} else if (!owner || (name.toString()).indexOf(owner) !== -1) {
|
||||||
|
$('#pageTitle').html(name);
|
||||||
|
$('#devicePageInfoPlc').hide();
|
||||||
} else {
|
} else {
|
||||||
$('#pageTitle').html(name + ' (' + owner + ')');
|
$('#pageTitle').html(name + ' (' + owner + ')');
|
||||||
$('#devicePageInfoPlc').hide();
|
$('#devicePageInfoPlc').hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Call renderSmallBoxes, then main
|
||||||
|
(async () => {
|
||||||
|
await renderSmallBoxes();
|
||||||
|
main();
|
||||||
|
})();
|
||||||
|
|
||||||
|
|
||||||
window.onload = function async()
|
window.onload = function async()
|
||||||
{
|
{
|
||||||
initializeTabs();
|
// initializeTabs();
|
||||||
updateChevrons(mac);
|
updateChevrons(mac);
|
||||||
updateDevicePageName(mac);
|
updateDevicePageName(mac);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -290,18 +290,6 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------
|
|
||||||
// Show the description of a setting
|
|
||||||
function showDescriptionPopup(e) {
|
|
||||||
|
|
||||||
console.log($(e).attr("my-set-key"));
|
|
||||||
|
|
||||||
showModalOK("Info", getString($(e).attr("my-set-key") + '_description'))
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// Save device data to DB
|
// Save device data to DB
|
||||||
function setDeviceData(direction = '', refreshCallback = '') {
|
function setDeviceData(direction = '', refreshCallback = '') {
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th><?= lang("DevDetail_Tab_EventsTableDate");?></th>
|
<th><?= lang("DevDetail_Tab_EventsTableDate");?></th>
|
||||||
|
<th><?= lang("DevDetail_Tab_EventsTableDate");?></th>
|
||||||
<th><?= lang("DevDetail_Tab_EventsTableEvent");?></th>
|
<th><?= lang("DevDetail_Tab_EventsTableEvent");?></th>
|
||||||
<th><?= lang("DevDetail_Tab_EventsTableIP");?></th>
|
<th><?= lang("DevDetail_Tab_EventsTableIP");?></th>
|
||||||
<th><?= lang("DevDetail_Tab_EventsTableInfo");?></th>
|
<th><?= lang("DevDetail_Tab_EventsTableInfo");?></th>
|
||||||
@@ -41,7 +42,7 @@ function loadEventsData() {
|
|||||||
mac = getMac()
|
mac = getMac()
|
||||||
|
|
||||||
const rawSql = `
|
const rawSql = `
|
||||||
SELECT eve_DateTime, eve_EventType, eve_IP, eve_AdditionalInfo
|
SELECT eve_DateTime, eve_DateTime, eve_EventType, eve_IP, eve_AdditionalInfo
|
||||||
FROM Events
|
FROM Events
|
||||||
WHERE eve_MAC = "${mac}"
|
WHERE eve_MAC = "${mac}"
|
||||||
AND (
|
AND (
|
||||||
@@ -61,6 +62,7 @@ function loadEventsData() {
|
|||||||
const formattedDate = rawDate ? localizeTimestamp(rawDate) : '-';
|
const formattedDate = rawDate ? localizeTimestamp(rawDate) : '-';
|
||||||
return [
|
return [
|
||||||
formattedDate,
|
formattedDate,
|
||||||
|
row.eve_DateTime,
|
||||||
row.eve_EventType,
|
row.eve_EventType,
|
||||||
row.eve_IP,
|
row.eve_IP,
|
||||||
row.eve_AdditionalInfo
|
row.eve_AdditionalInfo
|
||||||
@@ -95,6 +97,8 @@ function initializeEventsDatatable (eventsRows) {
|
|||||||
'pageLength' : eventsRows,
|
'pageLength' : eventsRows,
|
||||||
|
|
||||||
'columnDefs' : [
|
'columnDefs' : [
|
||||||
|
{ orderData: [1], targets: [0] },
|
||||||
|
{ visible: false, targets: [1] },
|
||||||
{
|
{
|
||||||
targets: [0],
|
targets: [0],
|
||||||
'createdCell': function (td, cellData, rowData, row, col) {
|
'createdCell': function (td, cellData, rowData, row, col) {
|
||||||
@@ -106,7 +110,7 @@ function initializeEventsDatatable (eventsRows) {
|
|||||||
'processing' : true,
|
'processing' : true,
|
||||||
'language' : {
|
'language' : {
|
||||||
processing: '<table><td width="130px" align="middle"><?= lang("DevDetail_Loading");?></td>'+
|
processing: '<table><td width="130px" align="middle"><?= lang("DevDetail_Loading");?></td>'+
|
||||||
'<td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></i></td></table>',
|
'<td><i class="fa-solid fa-spinner fa-spin-pulse"></i></td></table>',
|
||||||
emptyTable: 'No data',
|
emptyTable: 'No data',
|
||||||
"lengthMenu": "<?= lang('Events_Tablelenght');?>",
|
"lengthMenu": "<?= lang('Events_Tablelenght');?>",
|
||||||
"search": "<?= lang('Events_Searchbox');?>: ",
|
"search": "<?= lang('Events_Searchbox');?>: ",
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ function initializeSessionsDatatable (sessionsRows) {
|
|||||||
'processing' : true,
|
'processing' : true,
|
||||||
'language' : {
|
'language' : {
|
||||||
processing: '<table><td width="130px" align="middle"><?= lang("DevDetail_Loading");?></td>'+
|
processing: '<table><td width="130px" align="middle"><?= lang("DevDetail_Loading");?></td>'+
|
||||||
'<td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw">'+
|
'<td><i class="fa-solid fa-spinner fa-spin-pulse"></i>'+
|
||||||
'</td></table>',
|
'</td></table>',
|
||||||
emptyTable: 'No data',
|
emptyTable: 'No data',
|
||||||
"lengthMenu": "<?= lang('Events_Tablelenght');?>",
|
"lengthMenu": "<?= lang('Events_Tablelenght');?>",
|
||||||
|
|||||||
@@ -443,6 +443,37 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// init first time
|
// init first time
|
||||||
initNmapButtons();
|
// -----------------------------------------------------------
|
||||||
initCopyFromDevice();
|
var toolsPageInitialized = false;
|
||||||
|
|
||||||
|
function initDeviceToolsPage()
|
||||||
|
{
|
||||||
|
// Only proceed if .panTools is visible
|
||||||
|
if (!$('#panTools:visible').length) {
|
||||||
|
return; // exit early if nothing is visible
|
||||||
|
}
|
||||||
|
|
||||||
|
// init page once
|
||||||
|
if (toolsPageInitialized) return;
|
||||||
|
toolsPageInitialized = true;
|
||||||
|
|
||||||
|
initNmapButtons();
|
||||||
|
initCopyFromDevice();
|
||||||
|
|
||||||
|
hideSpinner();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// Recurring function to monitor the URL and reinitialize if needed
|
||||||
|
function deviceToolsPageUpdater() {
|
||||||
|
initDeviceToolsPage();
|
||||||
|
|
||||||
|
// Run updater again after delay
|
||||||
|
setTimeout(deviceToolsPageUpdater, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
// start updater
|
||||||
|
deviceToolsPageUpdater();
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -150,9 +150,6 @@ function main () {
|
|||||||
var availableColumns = getSettingOptions("UI_device_columns").split(",");
|
var availableColumns = getSettingOptions("UI_device_columns").split(",");
|
||||||
headersDefaultOrder = availableColumns.map(val => getString(val));
|
headersDefaultOrder = availableColumns.map(val => getString(val));
|
||||||
|
|
||||||
console.log(headersDefaultOrder);
|
|
||||||
|
|
||||||
|
|
||||||
var selectedColumns = JSON.parse(getSetting("UI_device_columns").replace(/'/g, '"'));
|
var selectedColumns = JSON.parse(getSetting("UI_device_columns").replace(/'/g, '"'));
|
||||||
|
|
||||||
// generate default order lists of given length
|
// generate default order lists of given length
|
||||||
@@ -266,14 +263,16 @@ function getDevicesTotals() {
|
|||||||
function processDeviceTotals(devicesData) {
|
function processDeviceTotals(devicesData) {
|
||||||
// Define filter conditions and corresponding objects
|
// Define filter conditions and corresponding objects
|
||||||
const filters = [
|
const filters = [
|
||||||
{ status: 'my_devices', color: 'bg-aqua', label: getString('Device_Shortcut_AllDevices'), icon: 'fa-laptop' },
|
{ status: 'my_devices', color: 'bg-aqua', label: getString('Device_Shortcut_AllDevices'), icon: 'fa-laptop' },
|
||||||
{ status: 'all', color: 'bg-aqua', label: getString('Gen_All_Devices'), icon: 'fa-laptop' },
|
{ status: 'all', color: 'bg-aqua', label: getString('Gen_All_Devices'), icon: 'fa-laptop' },
|
||||||
{ status: 'connected', color: 'bg-green', label: getString('Device_Shortcut_Connected'), icon: 'fa-plug' },
|
{ status: 'connected', color: 'bg-green', label: getString('Device_Shortcut_Connected'), icon: 'fa-plug' },
|
||||||
{ status: 'favorites', color: 'bg-yellow', label: getString('Device_Shortcut_Favorites'), icon: 'fa-star' },
|
{ status: 'favorites', color: 'bg-yellow', label: getString('Device_Shortcut_Favorites'), icon: 'fa-star' },
|
||||||
{ status: 'new', color: 'bg-yellow', label: getString('Device_Shortcut_NewDevices'), icon: 'fa-plus' },
|
{ status: 'new', color: 'bg-yellow', label: getString('Device_Shortcut_NewDevices'), icon: 'fa-plus' },
|
||||||
{ status: 'down', color: 'bg-red', label: getString('Device_Shortcut_DownOnly'), icon: 'fa-warning' },
|
{ status: 'down', color: 'bg-red', label: getString('Device_Shortcut_DownOnly'), icon: 'fa-warning' },
|
||||||
{ status: 'archived', color: 'bg-gray', label: getString('Device_Shortcut_Archived'), icon: 'fa-eye-slash' },
|
{ status: 'archived', color: 'bg-gray', label: getString('Device_Shortcut_Archived'), icon: 'fa-eye-slash' },
|
||||||
{ status: 'offline', color: 'bg-gray', label: getString('Gen_Offline'), icon: 'fa-xmark' }
|
{ status: 'offline', color: 'bg-gray', label: getString('Gen_Offline'), icon: 'fa-xmark' },
|
||||||
|
{ status: 'all_devices', color: 'bg-gray', label: getString('Gen_All_Devices'), icon: 'fa-laptop' },
|
||||||
|
{ status: 'network_devices', color: 'bg-aqua', label: getString('Network_Devices'), icon: 'fa-sitemap fa-rotate-270' }
|
||||||
];
|
];
|
||||||
|
|
||||||
// Initialize an empty array to store the final objects
|
// Initialize an empty array to store the final objects
|
||||||
@@ -300,12 +299,6 @@ function processDeviceTotals(devicesData) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Render info boxes/tile cards
|
// Render info boxes/tile cards
|
||||||
console.log(getSetting('UI_hide_empty'));
|
|
||||||
|
|
||||||
console.log(dataArray);
|
|
||||||
console.log(devicesData);
|
|
||||||
|
|
||||||
|
|
||||||
renderInfoboxes(dataArray);
|
renderInfoboxes(dataArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,8 +350,6 @@ function initFilters() {
|
|||||||
// Clear any existing filters in the DOM
|
// Clear any existing filters in the DOM
|
||||||
$('#columnFilters').empty();
|
$('#columnFilters').empty();
|
||||||
|
|
||||||
console.log(displayedFilters);
|
|
||||||
|
|
||||||
// Ensure displayedFilters is an array and not empty
|
// Ensure displayedFilters is an array and not empty
|
||||||
if (Array.isArray(displayedFilters) && displayedFilters.length > 0) {
|
if (Array.isArray(displayedFilters) && displayedFilters.length > 0) {
|
||||||
$('#columnFiltersWrap').removeClass("hidden");
|
$('#columnFiltersWrap').removeClass("hidden");
|
||||||
@@ -512,36 +503,36 @@ function collectFilters() {
|
|||||||
function mapColumnIndexToFieldName(index, tableColumnVisible) {
|
function mapColumnIndexToFieldName(index, tableColumnVisible) {
|
||||||
// the order is important, don't change it!
|
// the order is important, don't change it!
|
||||||
const columnNames = [
|
const columnNames = [
|
||||||
"devName",
|
"devName", // 0
|
||||||
"devOwner",
|
"devOwner", // 1
|
||||||
"devType",
|
"devType", // 2
|
||||||
"devIcon",
|
"devIcon", // 3
|
||||||
"devFavorite",
|
"devFavorite", // 4
|
||||||
"devGroup",
|
"devGroup", // 5
|
||||||
"devFirstConnection",
|
"devFirstConnection", // 6
|
||||||
"devLastConnection",
|
"devLastConnection", // 7
|
||||||
"devLastIP",
|
"devLastIP", // 8
|
||||||
"devIsRandomMac", // resolved on the fly
|
"devIsRandomMac", // 9 resolved on the fly
|
||||||
"devStatus", // resolved on the fly
|
"devStatus", // 10 resolved on the fly
|
||||||
"devMac",
|
"devMac", // 11
|
||||||
"devIpLong", //formatIPlong(device.devLastIP) || "", // IP orderable
|
"devIpLong", // 12 formatIPlong(device.devLastIP) || "", // IP orderable
|
||||||
"rowid",
|
"rowid", // 13
|
||||||
"devParentMAC",
|
"devParentMAC", // 14
|
||||||
"devParentChildrenCount", // resolved on the fly
|
"devParentChildrenCount", // 15 resolved on the fly
|
||||||
"devLocation",
|
"devLocation", // 16
|
||||||
"devVendor",
|
"devVendor", // 17
|
||||||
"devParentPort",
|
"devParentPort", // 18
|
||||||
"devGUID",
|
"devGUID", // 19
|
||||||
"devSyncHubNode",
|
"devSyncHubNode", // 20
|
||||||
"devSite",
|
"devSite", // 21
|
||||||
"devSSID",
|
"devSSID", // 22
|
||||||
"devSourcePlugin",
|
"devSourcePlugin", // 23
|
||||||
"devPresentLastScan",
|
"devPresentLastScan", // 24
|
||||||
"devAlertDown",
|
"devAlertDown", // 25
|
||||||
"devCustomProps",
|
"devCustomProps", // 26
|
||||||
"devFQDN",
|
"devFQDN", // 27
|
||||||
"devParentRelType",
|
"devParentRelType", // 28
|
||||||
"devReqNicsOnline"
|
"devReqNicsOnline" // 29
|
||||||
];
|
];
|
||||||
|
|
||||||
// console.log("OrderBy: " + columnNames[tableColumnOrder[index]]);
|
// console.log("OrderBy: " + columnNames[tableColumnOrder[index]]);
|
||||||
@@ -564,15 +555,17 @@ function initializeDatatable (status) {
|
|||||||
|
|
||||||
// Define color & title for the status selected
|
// Define color & title for the status selected
|
||||||
switch (deviceStatus) {
|
switch (deviceStatus) {
|
||||||
case 'my_devices': tableTitle = getString('Device_Shortcut_AllDevices'); color = 'aqua'; break;
|
case 'my_devices': tableTitle = getString('Device_Shortcut_AllDevices'); color = 'aqua'; break;
|
||||||
case 'connected': tableTitle = getString('Device_Shortcut_Connected'); color = 'green'; break;
|
case 'connected': tableTitle = getString('Device_Shortcut_Connected'); color = 'green'; break;
|
||||||
case 'all': tableTitle = getString('Gen_All_Devices'); color = 'aqua'; break;
|
case 'all': tableTitle = getString('Gen_All_Devices'); color = 'aqua'; break;
|
||||||
case 'favorites': tableTitle = getString('Device_Shortcut_Favorites'); color = 'yellow'; break;
|
case 'favorites': tableTitle = getString('Device_Shortcut_Favorites'); color = 'yellow'; break;
|
||||||
case 'new': tableTitle = getString('Device_Shortcut_NewDevices'); color = 'yellow'; break;
|
case 'new': tableTitle = getString('Device_Shortcut_NewDevices'); color = 'yellow'; break;
|
||||||
case 'down': tableTitle = getString('Device_Shortcut_DownOnly'); color = 'red'; break;
|
case 'down': tableTitle = getString('Device_Shortcut_DownOnly'); color = 'red'; break;
|
||||||
case 'archived': tableTitle = getString('Device_Shortcut_Archived'); color = 'gray'; break;
|
case 'archived': tableTitle = getString('Device_Shortcut_Archived'); color = 'gray'; break;
|
||||||
case 'offline': tableTitle = getString('Gen_Offline'); color = 'gray'; break;
|
case 'offline': tableTitle = getString('Gen_Offline'); color = 'gray'; break;
|
||||||
default: tableTitle = getString('Device_Shortcut_Devices'); color = 'gray'; break;
|
case 'all_devices': tableTitle = getString('Gen_All_Devices'); color = 'gray'; break;
|
||||||
|
case 'network_devices': tableTitle = getString('Network_Devices'); color = 'aqua'; break;
|
||||||
|
default: tableTitle = getString('Device_Shortcut_Devices'); color = 'gray'; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set title and color
|
// Set title and color
|
||||||
@@ -601,7 +594,6 @@ function initializeDatatable (status) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo: dynamically filter based on status
|
|
||||||
var table = $('#tableDevices').DataTable({
|
var table = $('#tableDevices').DataTable({
|
||||||
"serverSide": true,
|
"serverSide": true,
|
||||||
"processing": true,
|
"processing": true,
|
||||||
@@ -692,8 +684,6 @@ function initializeDatatable (status) {
|
|||||||
return JSON.stringify(query); // Send the JSON request
|
return JSON.stringify(query); // Send the JSON request
|
||||||
},
|
},
|
||||||
"dataSrc": function (json) {
|
"dataSrc": function (json) {
|
||||||
console.log(json);
|
|
||||||
|
|
||||||
// Set the total number of records for pagination
|
// Set the total number of records for pagination
|
||||||
json.recordsTotal = json.devices.count || 0;
|
json.recordsTotal = json.devices.count || 0;
|
||||||
json.recordsFiltered = json.devices.count || 0;
|
json.recordsFiltered = json.devices.count || 0;
|
||||||
@@ -909,6 +899,28 @@ function initializeDatatable (status) {
|
|||||||
}
|
}
|
||||||
} },
|
} },
|
||||||
|
|
||||||
|
// Parent Mac
|
||||||
|
{targets: [mapIndx(14)],
|
||||||
|
'createdCell': function (td, cellData, rowData, row, col) {
|
||||||
|
if (!isValidMac(cellData)) {
|
||||||
|
$(td).html('');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = {
|
||||||
|
id: cellData, // MAC address
|
||||||
|
text: cellData // Optional display text (you could use a name or something else)
|
||||||
|
};
|
||||||
|
|
||||||
|
spanWrap = $(`<span class="custom-badge text-white"></span>`)
|
||||||
|
|
||||||
|
$(td).html(spanWrap);
|
||||||
|
|
||||||
|
const chipHtml = renderDeviceLink(data, spanWrap, true); // pass the td as container
|
||||||
|
|
||||||
|
$(spanWrap).append(chipHtml);
|
||||||
|
}
|
||||||
|
},
|
||||||
// Status color
|
// Status color
|
||||||
{targets: [mapIndx(10)],
|
{targets: [mapIndx(10)],
|
||||||
'createdCell': function (td, cellData, rowData, row, col) {
|
'createdCell': function (td, cellData, rowData, row, col) {
|
||||||
@@ -993,8 +1005,6 @@ function initializeDatatable (status) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
require 'php/templates/header.php';
|
require 'php/templates/header.php';
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
showSpinner();
|
||||||
|
</script>
|
||||||
|
|
||||||
<!-- ----------------------------------------------------------------------- -->
|
<!-- ----------------------------------------------------------------------- -->
|
||||||
|
|
||||||
<!-- Page ------------------------------------------------------------------ -->
|
<!-- Page ------------------------------------------------------------------ -->
|
||||||
@@ -67,7 +71,7 @@
|
|||||||
<div class="inner"> <h3 id="eventsNewDevices"> -- </h3>
|
<div class="inner"> <h3 id="eventsNewDevices"> -- </h3>
|
||||||
<p class="infobox_label"><?= lang('Events_Shortcut_NewDevices');?></p>
|
<p class="infobox_label"><?= lang('Events_Shortcut_NewDevices');?></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="icon"> <i class="ion ion-plus-round text-yellow-40"></i> </div>
|
<div class="icon"> <i class="fa-solid fa-circle-plus text-yellow-40"></i> </div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
@@ -238,7 +242,7 @@ function initializeDatatable () {
|
|||||||
// Processing
|
// Processing
|
||||||
'processing' : true,
|
'processing' : true,
|
||||||
'language' : {
|
'language' : {
|
||||||
processing: '<table><td width="130px" align="middle"><?= lang("Events_Loading");?></td><td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></td></table>',
|
processing: '<table><td width="130px" align="middle"><?= lang("Events_Loading");?></td><td><i class="fa-solid fa-spinner fa-spin-pulse"></i></td></table>',
|
||||||
emptyTable: 'No data',
|
emptyTable: 'No data',
|
||||||
"lengthMenu": "<?= lang('Events_Tablelenght');?>",
|
"lengthMenu": "<?= lang('Events_Tablelenght');?>",
|
||||||
"search": "<?= lang('Events_Searchbox');?>: ",
|
"search": "<?= lang('Events_Searchbox');?>: ",
|
||||||
@@ -247,6 +251,9 @@ function initializeDatatable () {
|
|||||||
"previous": "<?= lang('Events_Table_nav_prev');?>"
|
"previous": "<?= lang('Events_Table_nav_prev');?>"
|
||||||
},
|
},
|
||||||
"info": "<?= lang('Events_Table_info');?>",
|
"info": "<?= lang('Events_Table_info');?>",
|
||||||
|
},
|
||||||
|
initComplete: function(settings, json) {
|
||||||
|
hideSpinner(); // Called after the DataTable is fully initialized
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
"display": "standalone",
|
"display": "standalone",
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "",
|
"src": "/img/NetAlertX_logo.png",
|
||||||
"sizes": "180x180",
|
"sizes": "180x180",
|
||||||
"type": "image/png"
|
"type": "image/png"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1032,6 +1032,7 @@ function getDevDataByMac(macAddress, dbColumn) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.error("⚠ Device with MAC not found:" + macAddress)
|
||||||
return "Unknown"; // Return a default value if MAC address is not found
|
return "Unknown"; // Return a default value if MAC address is not found
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1039,11 +1040,8 @@ function getDevDataByMac(macAddress, dbColumn) {
|
|||||||
// Cache the devices as one JSON
|
// Cache the devices as one JSON
|
||||||
function cacheDevices()
|
function cacheDevices()
|
||||||
{
|
{
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
// if(!getCache('completedCalls').includes('cacheDevices'))
|
|
||||||
// {
|
|
||||||
$.get('php/server/query_json.php', { file: 'table_devices.json', nocache: Date.now() }, function(data) {
|
$.get('php/server/query_json.php', { file: 'table_devices.json', nocache: Date.now() }, function(data) {
|
||||||
|
|
||||||
// console.log(data)
|
// console.log(data)
|
||||||
@@ -1067,8 +1065,7 @@ function cacheDevices()
|
|||||||
// console.log(getCache('devicesListAll_JSON'))
|
// console.log(getCache('devicesListAll_JSON'))
|
||||||
}).then(() => handleSuccess('cacheDevices', resolve())).catch(() => handleFailure('cacheDevices', reject("cacheDevices already completed"))); // handle AJAX synchronization
|
}).then(() => handleSuccess('cacheDevices', resolve())).catch(() => handleFailure('cacheDevices', reject("cacheDevices already completed"))); // handle AJAX synchronization
|
||||||
}
|
}
|
||||||
// }
|
);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var devicesListAll_JSON = []; // this will contain a list off all devices
|
var devicesListAll_JSON = []; // this will contain a list off all devices
|
||||||
@@ -1116,46 +1113,95 @@ let animationTime = 300
|
|||||||
function showSpinner(stringKey = 'Loading') {
|
function showSpinner(stringKey = 'Loading') {
|
||||||
const text = isEmpty(stringKey) ? "Loading" : getString(stringKey || "Loading");
|
const text = isEmpty(stringKey) ? "Loading" : getString(stringKey || "Loading");
|
||||||
const spinner = $("#loadingSpinner");
|
const spinner = $("#loadingSpinner");
|
||||||
|
const target = $(".spinnerTarget").first(); // Only use the first one if multiple exist
|
||||||
|
|
||||||
if (spinner.length && spinner.is(':visible')) {
|
$("#loadingSpinnerText").text(text);
|
||||||
clearTimeout(spinnerTimeout);
|
|
||||||
|
|
||||||
console.log(spinner);
|
if (target.length) {
|
||||||
|
// Position relative to target
|
||||||
|
const offset = target.offset();
|
||||||
|
const width = target.outerWidth();
|
||||||
|
const height = target.outerHeight();
|
||||||
|
|
||||||
$("#loadingSpinnerText").text(text);
|
spinner.css({
|
||||||
spinner.addClass("visible");
|
position: "absolute",
|
||||||
|
top: offset.top,
|
||||||
spinner.fadeIn(animationTime);
|
left: offset.left,
|
||||||
|
width: width,
|
||||||
|
height: height,
|
||||||
|
zIndex: 800
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
$("#loadingSpinnerText").text(text);
|
// Fullscreen fallback
|
||||||
|
spinner.css({
|
||||||
requestAnimationFrame(() => {
|
position: "fixed",
|
||||||
spinner.addClass("visible");
|
top: 0,
|
||||||
spinner.fadeIn(animationTime);
|
left: 0,
|
||||||
|
width: "100%",
|
||||||
|
height: "100%",
|
||||||
|
zIndex: 800
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
spinner.addClass("visible");
|
||||||
|
spinner.fadeIn(animationTime);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function hideSpinner() {
|
function hideSpinner() {
|
||||||
clearTimeout(spinnerTimeout);
|
clearTimeout(spinnerTimeout);
|
||||||
|
|
||||||
const spinner = $("#loadingSpinner");
|
const spinner = $("#loadingSpinner");
|
||||||
|
|
||||||
if (spinner.length) {
|
if (!spinner.length) return;
|
||||||
spinner.removeClass("visible");
|
|
||||||
spinner.fadeOut(animationTime);
|
|
||||||
|
|
||||||
spinnerTimeout = setTimeout(() => {
|
const target = $(".spinnerTarget").first();
|
||||||
spinner.removeClass("visible");
|
|
||||||
spinner.fadeOut(animationTime); // optional remove or hide again
|
if (target.length) {
|
||||||
}, 300);
|
// Lock position to target
|
||||||
|
const offset = target.offset();
|
||||||
|
const width = target.outerWidth();
|
||||||
|
const height = target.outerHeight();
|
||||||
|
|
||||||
|
spinner.css({
|
||||||
|
position: "absolute",
|
||||||
|
top: offset.top,
|
||||||
|
left: offset.left,
|
||||||
|
width: width,
|
||||||
|
height: height,
|
||||||
|
zIndex: 800
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// Fullscreen fallback
|
||||||
|
spinner.css({
|
||||||
|
position: "fixed",
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
width: "100%",
|
||||||
|
height: "100%",
|
||||||
|
zIndex: 800
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Trigger fade-out and only remove styles AFTER fade completes AND display is none
|
||||||
|
spinner.removeClass("visible").fadeOut(animationTime, () => {
|
||||||
|
// Ensure it's really hidden before resetting styles
|
||||||
|
spinner.css({
|
||||||
|
display: "none"
|
||||||
|
});
|
||||||
|
|
||||||
|
spinner.css({
|
||||||
|
position: "",
|
||||||
|
top: "",
|
||||||
|
left: "",
|
||||||
|
width: "",
|
||||||
|
height: "",
|
||||||
|
zIndex: ""
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
// Calls a backend function to add a front-end event to an execution queue
|
// Calls a backend function to add a front-end event to an execution queue
|
||||||
function updateApi(apiEndpoints)
|
function updateApi(apiEndpoints)
|
||||||
|
|||||||
@@ -161,6 +161,91 @@ function showModalFieldInput(
|
|||||||
$(`#${prefix}`).modal("show");
|
$(`#${prefix}`).modal("show");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
function showModalPopupForm(
|
||||||
|
title,
|
||||||
|
message,
|
||||||
|
btnCancel = getString("Gen_Cancel"),
|
||||||
|
btnOK = getString("Gen_Okay"),
|
||||||
|
curValue = "",
|
||||||
|
callbackFunction = null,
|
||||||
|
triggeredBy = null,
|
||||||
|
popupFormJson = null,
|
||||||
|
parentSettingKey = null
|
||||||
|
) {
|
||||||
|
// set captions
|
||||||
|
prefix = "modal-form";
|
||||||
|
console.log(popupFormJson);
|
||||||
|
|
||||||
|
$(`#${prefix}-title`).html(title);
|
||||||
|
$(`#${prefix}-message`).html(message);
|
||||||
|
$(`#${prefix}-cancel`).html(btnCancel);
|
||||||
|
$(`#${prefix}-OK`).html(btnOK);
|
||||||
|
|
||||||
|
if (callbackFunction != null) {
|
||||||
|
modalCallbackFunction = callbackFunction;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (triggeredBy != null) {
|
||||||
|
$('#'+prefix).attr("data-myparam-triggered-by", triggeredBy)
|
||||||
|
}
|
||||||
|
|
||||||
|
outputHtml = "";
|
||||||
|
|
||||||
|
if (Array.isArray(popupFormJson)) {
|
||||||
|
popupFormJson.forEach((field, index) => {
|
||||||
|
// You'll need to define these or map them from `field`
|
||||||
|
const setName = field.name?.find(n => n.language_code === "en_us")?.string || setKey;
|
||||||
|
const labelClasses = "col-sm-2"; // example, or from your obj.labelClasses
|
||||||
|
const inputClasses = "col-sm-10"; // example, or from your obj.inputClasses
|
||||||
|
const fieldData = field.default_value ?? "";
|
||||||
|
const fieldOptionsOverride = field.type?.elements[0]?.elementOptions || [];
|
||||||
|
|
||||||
|
const setKey = field.function || `field_${index}`;
|
||||||
|
const setValue = field.default_value ?? "";
|
||||||
|
const setType = JSON.stringify(field.type);
|
||||||
|
const setEvents = field.events || []; // default to empty array if missing
|
||||||
|
|
||||||
|
const setObj = { setKey, setValue, setType, setEvents };
|
||||||
|
|
||||||
|
// Generate the input field HTML
|
||||||
|
const inputFormHtml = `
|
||||||
|
<div class="form-group col-xs-12">
|
||||||
|
<label id="${setKey}_label" class="${labelClasses}"> ${setName}
|
||||||
|
<i my-set-key="${parentSettingKey}_popupform_${setKey}"
|
||||||
|
title="${getString("Settings_Show_Description")}"
|
||||||
|
class="fa fa-circle-info pointer helpIconSmallTopRight"
|
||||||
|
onclick="showDescriptionPopup(this)">
|
||||||
|
</i>
|
||||||
|
</label>
|
||||||
|
<div class="${inputClasses}">
|
||||||
|
${generateFormHtml(
|
||||||
|
null, // settingsData only required for datatables
|
||||||
|
setObj,
|
||||||
|
fieldData.toString(),
|
||||||
|
fieldOptionsOverride,
|
||||||
|
null
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
// Append to result
|
||||||
|
outputHtml += inputFormHtml;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$(`#modal-form-plc`).html(outputHtml);
|
||||||
|
|
||||||
|
// $(`#${prefix}-field`).val(curValue);
|
||||||
|
// setTimeout(function () {
|
||||||
|
// $(`#${prefix}-field`).focus();
|
||||||
|
// }, 500);
|
||||||
|
|
||||||
|
// Show modal
|
||||||
|
$(`#${prefix}`).modal("show");
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
function modalDefaultOK() {
|
function modalDefaultOK() {
|
||||||
// Hide modal
|
// Hide modal
|
||||||
@@ -224,7 +309,7 @@ function modalWarningOK() {
|
|||||||
} else if (typeof modalCallbackFunction === "string" && typeof window[modalCallbackFunction] === "function") {
|
} else if (typeof modalCallbackFunction === "string" && typeof window[modalCallbackFunction] === "function") {
|
||||||
window[modalCallbackFunction](); // Call via window
|
window[modalCallbackFunction](); // Call via window
|
||||||
} else {
|
} else {
|
||||||
console.error("Invalid callback function");
|
console.error("Invalid callback function: " + modalCallbackFunction);
|
||||||
}
|
}
|
||||||
}, 100);
|
}, 100);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,6 +67,15 @@ function getPluginConfig(pluginsData, prefix) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------
|
||||||
|
// Show the description of a setting
|
||||||
|
function showDescriptionPopup(e) {
|
||||||
|
|
||||||
|
console.log($(e).attr("my-set-key"));
|
||||||
|
|
||||||
|
showModalOK("Info", getString($(e).attr("my-set-key") + '_description'))
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
// Generate plugin HTML card based on prefixes in an array
|
// Generate plugin HTML card based on prefixes in an array
|
||||||
function pluginCards(prefixesOfEnabledPlugins, includeSettings) {
|
function pluginCards(prefixesOfEnabledPlugins, includeSettings) {
|
||||||
@@ -299,6 +308,45 @@ function removeDataTableRow(el) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------
|
||||||
|
// Add item via pop up form dialog
|
||||||
|
function addViaPopupForm(element) {
|
||||||
|
console.log(element)
|
||||||
|
|
||||||
|
const fromId = $(element).attr("my-input-from");
|
||||||
|
const toId = $(element).attr("my-input-to");
|
||||||
|
const curValue = $(`#${fromId}`).val();
|
||||||
|
const triggeredBy = $(element).attr("id");
|
||||||
|
const parsed = JSON.parse(atob($(element).data("elementoptionsbase64")));
|
||||||
|
const popupFormJson = parsed.find(obj => "popupForm" in obj)?.popupForm ?? null;
|
||||||
|
|
||||||
|
console.log(`fromId | toId | triggeredBy | curValue: ${fromId} | ${toId} | ${triggeredBy} | ${curValue}`);
|
||||||
|
|
||||||
|
showModalPopupForm(
|
||||||
|
`<i class="fa fa-pen-to-square"></i> ${getString(
|
||||||
|
"Gen_Update_Value"
|
||||||
|
)}`, // title
|
||||||
|
getString("settings_update_item_warning"), // message
|
||||||
|
getString("Gen_Cancel"), // btnCancel
|
||||||
|
getString("Gen_Add"), // btnOK
|
||||||
|
curValue, // curValue
|
||||||
|
null, // callbackFunction
|
||||||
|
triggeredBy, // triggeredBy
|
||||||
|
popupFormJson, // popupform
|
||||||
|
toId // parentSettingKey
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------
|
||||||
|
// Add item to list via popup form
|
||||||
|
function addViaPopupFormToList(element, clearInput = true) {
|
||||||
|
|
||||||
|
|
||||||
|
// flag something changes to prevent navigating from page
|
||||||
|
settingsChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------
|
// ---------------------------------------------------------
|
||||||
// Add item to list
|
// Add item to list
|
||||||
function addList(element, clearInput = true) {
|
function addList(element, clearInput = true) {
|
||||||
@@ -622,8 +670,6 @@ function generateOptionsOrSetOptions(
|
|||||||
// obj.push({ id: item, name: item })
|
// obj.push({ id: item, name: item })
|
||||||
options = arrayToObject(createArray(overrideOptions ? overrideOptions : getSettingOptions(setKey)))
|
options = arrayToObject(createArray(overrideOptions ? overrideOptions : getSettingOptions(setKey)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Call to render lists
|
// Call to render lists
|
||||||
renderList(
|
renderList(
|
||||||
options,
|
options,
|
||||||
@@ -633,8 +679,6 @@ function generateOptionsOrSetOptions(
|
|||||||
targetField,
|
targetField,
|
||||||
transformers
|
transformers
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -655,6 +699,13 @@ function applyTransformers(val, transformers) {
|
|||||||
val = btoa(val);
|
val = btoa(val);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case "name|base64":
|
||||||
|
// // Implement base64 logic
|
||||||
|
// if (!isBase64(val)) {
|
||||||
|
// val = btoa(val);
|
||||||
|
// }
|
||||||
|
val = val; // probably TODO ⚠
|
||||||
|
break;
|
||||||
case "getString":
|
case "getString":
|
||||||
// no change
|
// no change
|
||||||
val = val;
|
val = val;
|
||||||
@@ -681,6 +732,13 @@ function reverseTransformers(val, transformers) {
|
|||||||
val = atob(val);
|
val = atob(val);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case "name|base64":
|
||||||
|
// // Implement base64 decoding logic
|
||||||
|
// if (isBase64(val)) {
|
||||||
|
// val = atob(val);
|
||||||
|
// }
|
||||||
|
val = val; // probably TODO ⚠
|
||||||
|
break;
|
||||||
case "getString":
|
case "getString":
|
||||||
// retrieve string
|
// retrieve string
|
||||||
val = getString(val);
|
val = getString(val);
|
||||||
@@ -721,7 +779,7 @@ const handleElementOptions = (setKey, elementOptions, transformers, val) => {
|
|||||||
let customId = "";
|
let customId = "";
|
||||||
let columns = [];
|
let columns = [];
|
||||||
let base64Regex = "";
|
let base64Regex = "";
|
||||||
|
let elementOptionsBase64 = btoa(JSON.stringify(elementOptions));
|
||||||
|
|
||||||
elementOptions.forEach((option) => {
|
elementOptions.forEach((option) => {
|
||||||
if (option.prefillValue) {
|
if (option.prefillValue) {
|
||||||
@@ -804,7 +862,8 @@ const handleElementOptions = (setKey, elementOptions, transformers, val) => {
|
|||||||
customParams,
|
customParams,
|
||||||
customId,
|
customId,
|
||||||
columns,
|
columns,
|
||||||
base64Regex
|
base64Regex,
|
||||||
|
elementOptionsBase64
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -955,6 +1014,8 @@ function generateFormHtml(settingsData, set, overrideValue, overrideOptions, ori
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
// Parse the setType JSON string
|
// Parse the setType JSON string
|
||||||
|
console.log(processQuotes(setType));
|
||||||
|
|
||||||
const setTypeObject = JSON.parse(processQuotes(setType))
|
const setTypeObject = JSON.parse(processQuotes(setType))
|
||||||
const dataType = setTypeObject.dataType;
|
const dataType = setTypeObject.dataType;
|
||||||
const elements = setTypeObject.elements || [];
|
const elements = setTypeObject.elements || [];
|
||||||
@@ -982,7 +1043,8 @@ function generateFormHtml(settingsData, set, overrideValue, overrideOptions, ori
|
|||||||
customParams,
|
customParams,
|
||||||
customId,
|
customId,
|
||||||
columns,
|
columns,
|
||||||
base64Regex
|
base64Regex,
|
||||||
|
elementOptionsBase64
|
||||||
} = handleElementOptions(setKey, elementOptions, transformers, inVal);
|
} = handleElementOptions(setKey, elementOptions, transformers, inVal);
|
||||||
|
|
||||||
// Override value
|
// Override value
|
||||||
@@ -1051,6 +1113,7 @@ function generateFormHtml(settingsData, set, overrideValue, overrideOptions, ori
|
|||||||
my-originalSetKey="${originalSetKey}"
|
my-originalSetKey="${originalSetKey}"
|
||||||
my-input-from="${sourceIds}"
|
my-input-from="${sourceIds}"
|
||||||
my-input-to="${setKey}"
|
my-input-to="${setKey}"
|
||||||
|
data-elementoptionsbase64="${elementOptionsBase64}"
|
||||||
onclick="${onClick}">
|
onclick="${onClick}">
|
||||||
${getString(getStringKey)}
|
${getString(getStringKey)}
|
||||||
</button>`;
|
</button>`;
|
||||||
|
|||||||
@@ -336,7 +336,8 @@ function execute_settingEvent(element) {
|
|||||||
getString('DevDetail_button_OverwriteIcons_Warning'),
|
getString('DevDetail_button_OverwriteIcons_Warning'),
|
||||||
getString('Gen_Cancel'),
|
getString('Gen_Cancel'),
|
||||||
getString('Gen_Okay'),
|
getString('Gen_Okay'),
|
||||||
'overwriteIconType'
|
'overwriteIconType',
|
||||||
|
feSourceId // triggered by id
|
||||||
);
|
);
|
||||||
} else if (["go_to_device"].includes(feEvent)) {
|
} else if (["go_to_device"].includes(feEvent)) {
|
||||||
|
|
||||||
@@ -349,7 +350,41 @@ function execute_settingEvent(element) {
|
|||||||
console.warn(`🔺Not implemented: ${feEvent}`)
|
console.warn(`🔺Not implemented: ${feEvent}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// Go to the correct network node in the Network section
|
||||||
|
function overwriteIconType()
|
||||||
|
{
|
||||||
|
const mac = getMac();
|
||||||
|
|
||||||
|
if (!isValidMac(mac)) {
|
||||||
|
showModalOK("Error", getString("Gen_InvalidMac"))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construct SQL query
|
||||||
|
const rawSql = `
|
||||||
|
UPDATE Devices
|
||||||
|
SET devIcon = (
|
||||||
|
SELECT devIcon FROM Devices WHERE devMac = "${mac}"
|
||||||
|
)
|
||||||
|
WHERE devType IN (
|
||||||
|
SELECT devType FROM Devices WHERE devMac = "${mac}"
|
||||||
|
)
|
||||||
|
`;
|
||||||
|
|
||||||
|
const apiUrl = `php/server/dbHelper.php?action=write&rawSql=${btoa(encodeURIComponent(rawSql))}`;
|
||||||
|
|
||||||
|
$.get(apiUrl, function(response) {
|
||||||
|
if (response === 'OK') {
|
||||||
|
showMessage (response);
|
||||||
|
updateApi("devices")
|
||||||
|
} else {
|
||||||
|
showMessage (response, 3000, "modal_red");
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -680,45 +715,7 @@ function initSelect2() {
|
|||||||
{
|
{
|
||||||
var selectEl = $(this).select2({
|
var selectEl = $(this).select2({
|
||||||
templateSelection: function (data, container) {
|
templateSelection: function (data, container) {
|
||||||
if (!data.id) return data.text; // default for placeholder etc.
|
return $(renderDeviceLink(data, container));
|
||||||
|
|
||||||
const device = getDevDataByMac(data.id);
|
|
||||||
|
|
||||||
const badge = getStatusBadgeParts(
|
|
||||||
device.devPresentLastScan,
|
|
||||||
device.devAlertDown,
|
|
||||||
device.devMac
|
|
||||||
)
|
|
||||||
|
|
||||||
$(container).addClass(badge.cssClass);
|
|
||||||
|
|
||||||
// Custom HTML
|
|
||||||
const html = $(`
|
|
||||||
<a href="${badge.url}" target="_blank">
|
|
||||||
<span class="custom-chip hover-node-info"
|
|
||||||
data-name="${device.devName}"
|
|
||||||
data-ip="${device.devLastIP}"
|
|
||||||
data-mac="${device.devMac}"
|
|
||||||
data-vendor="${device.devVendor}"
|
|
||||||
data-type="${device.devType}"
|
|
||||||
data-lastseen="${device.devLastConnection}"
|
|
||||||
data-firstseen="${device.devFirstConnection}"
|
|
||||||
data-relationship="${device.devParentRelType}"
|
|
||||||
data-status="${device.devStatus}"
|
|
||||||
data-present="${device.devPresentLastScan}"
|
|
||||||
data-alert="${device.devAlertDown}"
|
|
||||||
data-icon="${device.devIcon}"
|
|
||||||
>
|
|
||||||
<span class="iconPreview">${atob(device.devIcon)}</span>
|
|
||||||
${data.text}
|
|
||||||
<span>
|
|
||||||
(${badge.iconHtml})
|
|
||||||
</span
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
`);
|
|
||||||
|
|
||||||
return html;
|
|
||||||
},
|
},
|
||||||
escapeMarkup: function (m) {
|
escapeMarkup: function (m) {
|
||||||
return m; // Allow HTML
|
return m; // Allow HTML
|
||||||
@@ -782,6 +779,50 @@ function initSelect2() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------
|
||||||
|
// Render a device link with hover-over functionality
|
||||||
|
function renderDeviceLink(data, container, useName = false) {
|
||||||
|
if (!data.id || !isValidMac(data.id)) return data.text; // default placeholder etc.
|
||||||
|
|
||||||
|
const device = getDevDataByMac(data.id);
|
||||||
|
|
||||||
|
const badge = getStatusBadgeParts(
|
||||||
|
device.devPresentLastScan,
|
||||||
|
device.devAlertDown,
|
||||||
|
device.devMac
|
||||||
|
);
|
||||||
|
|
||||||
|
// badge class and hover-info class to container
|
||||||
|
$(container)
|
||||||
|
.addClass(`${badge.cssClass} hover-node-info`)
|
||||||
|
.attr({
|
||||||
|
'data-name': device.devName,
|
||||||
|
'data-ip': device.devLastIP,
|
||||||
|
'data-mac': device.devMac,
|
||||||
|
'data-vendor': device.devVendor,
|
||||||
|
'data-type': device.devType,
|
||||||
|
'data-lastseen': device.devLastConnection,
|
||||||
|
'data-firstseen': device.devFirstConnection,
|
||||||
|
'data-relationship': device.devParentRelType,
|
||||||
|
'data-status': device.devStatus,
|
||||||
|
'data-present': device.devPresentLastScan,
|
||||||
|
'data-alert': device.devAlertDown,
|
||||||
|
'data-icon': device.devIcon
|
||||||
|
});
|
||||||
|
|
||||||
|
return `
|
||||||
|
<a href="${badge.url}" target="_blank">
|
||||||
|
<span class="custom-chip">
|
||||||
|
<span class="iconPreview">${atob(device.devIcon)}</span>
|
||||||
|
${useName ? device.devName : data.text}
|
||||||
|
<span>
|
||||||
|
(${badge.iconHtml})
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------------
|
// ------------------------------------------
|
||||||
// Display device info on hover (attach only once)
|
// Display device info on hover (attach only once)
|
||||||
function initHoverNodeInfo() {
|
function initHoverNodeInfo() {
|
||||||
|
|||||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
Before Width: | Height: | Size: 326 KiB After Width: | Height: | Size: 305 KiB |
Binary file not shown.
Binary file not shown.
BIN
front/lib/fonts/ionicons.woff2
Executable file
BIN
front/lib/fonts/ionicons.woff2
Executable file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
require 'php/templates/header.php';
|
require 'php/templates/header.php';
|
||||||
require 'php/templates/notification.php';
|
require 'php/templates/modals.php';
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<!-- Page ------------------------------------------------------------------ -->
|
<!-- Page ------------------------------------------------------------------ -->
|
||||||
@@ -9,6 +9,9 @@
|
|||||||
<!-- Main content ---------------------------------------------------------- -->
|
<!-- Main content ---------------------------------------------------------- -->
|
||||||
<section class="content">
|
<section class="content">
|
||||||
|
|
||||||
|
<script>
|
||||||
|
showSpinner();
|
||||||
|
</script>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
@@ -143,7 +146,7 @@ $db->close();
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="tab-content">
|
<div class="tab-content spinnerTarget">
|
||||||
<div class="tab-pane active" id="tab_DBTools">
|
<div class="tab-pane active" id="tab_DBTools">
|
||||||
<div class="db_info_table">
|
<div class="db_info_table">
|
||||||
<div class="db_info_table_row">
|
<div class="db_info_table_row">
|
||||||
@@ -182,6 +185,12 @@ $db->close();
|
|||||||
</div>
|
</div>
|
||||||
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_del_ActHistory_text');?></div>
|
<div class="db_tools_table_cell_b"><?= lang('Maintenance_Tool_del_ActHistory_text');?></div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="db_info_table_row">
|
||||||
|
<div class="db_tools_table_cell_a" >
|
||||||
|
<button type="button" class="btn btn-default pa-btn pa-btn-delete bg-red dbtools-button" id="btnRestartServer" onclick="askRestartBackend()"><?= lang('Maint_RestartServer');?></button>
|
||||||
|
</div>
|
||||||
|
<div class="db_tools_table_cell_b"><?= lang('Maint_Restart_Server_noti_text');?></div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -709,6 +718,8 @@ window.onload = function asyncFooter() {
|
|||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
hideSpinner();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -136,7 +136,8 @@
|
|||||||
customParams,
|
customParams,
|
||||||
customId,
|
customId,
|
||||||
columns,
|
columns,
|
||||||
base64Regex
|
base64Regex,
|
||||||
|
elementOptionsBase64
|
||||||
} = handleElementOptions('none', elementOptions, transformers, val = "");
|
} = handleElementOptions('none', elementOptions, transformers, val = "");
|
||||||
|
|
||||||
// render based on element type
|
// render based on element type
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
require 'php/templates/header.php';
|
require 'php/templates/header.php';
|
||||||
require 'php/templates/notification.php';
|
require 'php/templates/modals.php';
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -437,7 +437,7 @@
|
|||||||
|
|
||||||
if(archivedCount > 0)
|
if(archivedCount > 0)
|
||||||
{
|
{
|
||||||
$('#showArchivedNumber').text(`(${archivedCount})`);
|
$('#showArchivedNumber').text(`(${archivedCount})`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(offlineCount > 0)
|
if(offlineCount > 0)
|
||||||
@@ -968,7 +968,6 @@ $(window).on('resize', function () {
|
|||||||
// init pop up hover boxes for device details
|
// init pop up hover boxes for device details
|
||||||
initHoverNodeInfo();
|
initHoverNodeInfo();
|
||||||
|
|
||||||
// display toggles
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
// Restore cached values on load
|
// Restore cached values on load
|
||||||
const cachedOffline = getCache('showOffline');
|
const cachedOffline = getCache('showOffline');
|
||||||
@@ -981,12 +980,34 @@ $(document).ready(function () {
|
|||||||
$('input[name="showArchived"]').prop('checked', cachedArchived === 'true');
|
$('input[name="showArchived"]').prop('checked', cachedArchived === 'true');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Function to enable/disable showArchived based on showOffline
|
||||||
|
function updateArchivedToggle() {
|
||||||
|
const isOfflineChecked = $('input[name="showOffline"]').is(':checked');
|
||||||
|
const archivedToggle = $('input[name="showArchived"]');
|
||||||
|
|
||||||
|
if (!isOfflineChecked) {
|
||||||
|
archivedToggle.prop('checked', false);
|
||||||
|
archivedToggle.prop('disabled', true);
|
||||||
|
setCache('showArchived', false);
|
||||||
|
} else {
|
||||||
|
archivedToggle.prop('disabled', false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initial state on load
|
||||||
|
updateArchivedToggle();
|
||||||
|
|
||||||
// Bind change event for both toggles
|
// Bind change event for both toggles
|
||||||
$('input[name="showOffline"], input[name="showArchived"]').on('change', function () {
|
$('input[name="showOffline"], input[name="showArchived"]').on('change', function () {
|
||||||
const name = $(this).attr('name');
|
const name = $(this).attr('name');
|
||||||
const value = $(this).is(':checked');
|
const value = $(this).is(':checked');
|
||||||
setCache(name, value);
|
setCache(name, value);
|
||||||
|
|
||||||
|
// Update state of showArchived if showOffline changed
|
||||||
|
if (name === 'showOffline') {
|
||||||
|
updateArchivedToggle();
|
||||||
|
}
|
||||||
|
|
||||||
// Refresh page after a brief delay to ensure cache is written
|
// Refresh page after a brief delay to ensure cache is written
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
location.reload();
|
location.reload();
|
||||||
@@ -994,6 +1015,7 @@ $(document).ready(function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
|||||||
switch ($action) {
|
switch ($action) {
|
||||||
case 'create': create($defaultValue, $expireMinutes, $dbtable, $columns, $values ); break;
|
case 'create': create($defaultValue, $expireMinutes, $dbtable, $columns, $values ); break;
|
||||||
case 'read' : read($rawSql); break;
|
case 'read' : read($rawSql); break;
|
||||||
|
case 'write' : write($rawSql); break;
|
||||||
case 'update': update($columnName, $id, $defaultValue, $expireMinutes, $dbtable, $columns, $values); break;
|
case 'update': update($columnName, $id, $defaultValue, $expireMinutes, $dbtable, $columns, $values); break;
|
||||||
case 'delete': delete($columnName, $id, $dbtable); break;
|
case 'delete': delete($columnName, $id, $dbtable); break;
|
||||||
case 'lockDatabase': lockDatabase($delay); break;
|
case 'lockDatabase': lockDatabase($delay); break;
|
||||||
@@ -120,6 +121,31 @@ function read($rawSql) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// write
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
function write($rawSql) {
|
||||||
|
global $db;
|
||||||
|
|
||||||
|
// Construct the SQL query to select values
|
||||||
|
$sql = $rawSql;
|
||||||
|
|
||||||
|
// Execute the SQL query
|
||||||
|
$result = $db->query($sql);
|
||||||
|
|
||||||
|
// Check if the query executed successfully
|
||||||
|
if (! $result == TRUE) {
|
||||||
|
// Output an error message if the query failed
|
||||||
|
echo "Error writing data\n\n " .$sql." \n\n". $db->lastErrorMsg();
|
||||||
|
return;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
// Output
|
||||||
|
echo "OK";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// update
|
// update
|
||||||
|
|||||||
@@ -48,7 +48,6 @@
|
|||||||
case 'getDevicesListCalendar': getDevicesListCalendar(); break; //todo: slowly deprecate this
|
case 'getDevicesListCalendar': getDevicesListCalendar(); break; //todo: slowly deprecate this
|
||||||
|
|
||||||
case 'updateNetworkLeaf': updateNetworkLeaf(); break;
|
case 'updateNetworkLeaf': updateNetworkLeaf(); break;
|
||||||
case 'overwriteIconType': overwriteIconType(); break;
|
|
||||||
case 'getIcons': getIcons(); break;
|
case 'getIcons': getIcons(); break;
|
||||||
case 'getActions': getActions(); break;
|
case 'getActions': getActions(); break;
|
||||||
case 'getDevices': getDevices(); break;
|
case 'getDevices': getDevices(); break;
|
||||||
@@ -924,33 +923,6 @@ function updateNetworkLeaf()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------------------
|
|
||||||
function overwriteIconType()
|
|
||||||
{
|
|
||||||
$mac = $_REQUEST['mac'];
|
|
||||||
$icon = $_REQUEST['icon'];
|
|
||||||
|
|
||||||
if ((false === filter_var($mac , FILTER_VALIDATE_MAC) && $mac != "Internet" && $mac != "") ) {
|
|
||||||
throw new Exception('Invalid mac address');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
global $db;
|
|
||||||
// sql
|
|
||||||
$sql = 'UPDATE Devices SET "devIcon" = "'. $icon .'" where devType in (select devType from Devices where devMac = "' . $mac.'")' ;
|
|
||||||
// update Data
|
|
||||||
$result = $db->query($sql);
|
|
||||||
|
|
||||||
// check result
|
|
||||||
if ($result == TRUE) {
|
|
||||||
echo 'OK';
|
|
||||||
} else {
|
|
||||||
echo lang('BackDevices_Device_UpdDevError');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Wake-on-LAN
|
// Wake-on-LAN
|
||||||
// Inspired by @leiweibau: https://github.com/leiweibau/Pi.Alert/commit/30427c7fea180670c71a2b790699e5d9e9e88ffd
|
// Inspired by @leiweibau: https://github.com/leiweibau/Pi.Alert/commit/30427c7fea180670c71a2b790699e5d9e9e88ffd
|
||||||
|
|||||||
@@ -42,7 +42,6 @@
|
|||||||
<script src="lib/datatables.net/js/jquery.dataTables.min.js"></script>
|
<script src="lib/datatables.net/js/jquery.dataTables.min.js"></script>
|
||||||
<script src="lib/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>
|
<script src="lib/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>
|
||||||
<script src="lib/datatables.net/js/dataTables.select.min.js"></script>
|
<script src="lib/datatables.net/js/dataTables.select.min.js"></script>
|
||||||
<script src="lib/popper_tooltip/popper.min.js"></script>
|
|
||||||
|
|
||||||
<script src="js/common.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
<script src="js/common.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
||||||
<script src="js/modal.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
<script src="js/modal.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
||||||
@@ -51,8 +50,6 @@
|
|||||||
<script src="js/settings_utils.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
<script src="js/settings_utils.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
||||||
<script src="js/device.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
<script src="js/device.js?v=<?php include 'php/templates/version.php'; ?>"></script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- iCheck -->
|
<!-- iCheck -->
|
||||||
|
|
||||||
<link rel="stylesheet" href="lib/iCheck/all.css">
|
<link rel="stylesheet" href="lib/iCheck/all.css">
|
||||||
@@ -142,11 +139,11 @@
|
|||||||
<body class="hold-transition fixed <?php echo $pia_skin_selected;?> theme-<?php echo $UI_THEME;?> sidebar-mini" onLoad="update_servertime();" >
|
<body class="hold-transition fixed <?php echo $pia_skin_selected;?> theme-<?php echo $UI_THEME;?> sidebar-mini" onLoad="update_servertime();" >
|
||||||
|
|
||||||
<div id="loadingSpinner">
|
<div id="loadingSpinner">
|
||||||
<div class="pa_semitransparent-panel"></div>
|
<div class="nax_semitransparent-panel"></div>
|
||||||
<div class="panel panel-default pa_spinner">
|
<div class="panel panel-default nax_spinner">
|
||||||
<table>
|
<table>
|
||||||
<td id="loadingSpinnerText" width="130px" ></td>
|
<td id="loadingSpinnerText" width="130px" ></td>
|
||||||
<td><i class="ion ion-ios-loop-strong fa-spin fa-2x fa-fw"></td>
|
<td><i class="fa-solid fa-spinner fa-spin-pulse"></i></td>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -163,7 +160,7 @@
|
|||||||
<a href="devices.php" class="logo">
|
<a href="devices.php" class="logo">
|
||||||
<!-- mini logo for sidebar mini 50x50 pixels -->
|
<!-- mini logo for sidebar mini 50x50 pixels -->
|
||||||
<span class="logo-mini">
|
<span class="logo-mini">
|
||||||
<img src="img/NetAlertX_logo.png" class="pia-top-left-logo" alt="NetAlertX Logo"/>
|
<img src="img/NetAlertX_logo.png" class="top-left-logo" alt="NetAlertX Logo"/>
|
||||||
</span>
|
</span>
|
||||||
<!-- logo for regular state and mobile devices -->
|
<!-- logo for regular state and mobile devices -->
|
||||||
<span class="logo-lg">Net<b>Alert</b><sup>x</sup>
|
<span class="logo-lg">Net<b>Alert</b><sup>x</sup>
|
||||||
@@ -312,7 +309,10 @@
|
|||||||
<a href="devices.php#archived" onclick="forceLoadUrl('devices.php#archived')" > <?= lang("Device_Shortcut_Archived");?> </a>
|
<a href="devices.php#archived" onclick="forceLoadUrl('devices.php#archived')" > <?= lang("Device_Shortcut_Archived");?> </a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="devices.php#all" onclick="forceLoadUrl('devices.php#all_nodes')" > <?= lang("Device_Shortcut_AllNodes");?> </a>
|
<a href="devices.php#all_devices" onclick="forceLoadUrl('devices.php#all_devices')" > <?= lang("Gen_All_Devices");?> </a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="devices.php#network_devices" onclick="forceLoadUrl('devices.php#network_devices')" > <?= lang("Network_Devices");?> </a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
@@ -436,8 +436,24 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<!-- system info menu item -->
|
<!-- system info menu item -->
|
||||||
<li class=" <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('systeminfo.php') ) ){ echo 'active'; } ?>">
|
<li class=" treeview <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('systeminfo.php') ) ){ echo 'active menu-open'; } ?>">
|
||||||
<a href="systeminfo.php"><i class="fa fa-fw fa-info-circle"></i> <span><?= lang('Navigation_SystemInfo');?></span></a>
|
<a href="#">
|
||||||
|
<i class="fa fa-fw fa-info-circle"></i> <span><?= lang('Navigation_SystemInfo');?></span>
|
||||||
|
<span class="pull-right-container">
|
||||||
|
<i class="fa fa-angle-left pull-right"></i>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
<ul class="treeview-menu " style="display: <?php if (in_array (basename($_SERVER['SCRIPT_NAME']), array('systeminfo.php') ) ){ echo 'block'; } else {echo 'none';} ?>;">
|
||||||
|
<li>
|
||||||
|
<a href="systeminfo.php#panServer" onclick="setCache('activeSysinfoTab','tabServer');initializeTabs()"><?= lang('Systeminfo_System');?></a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="systeminfo.php#panNetwork" onclick="setCache('activeSysinfoTab','tabNetwork');initializeTabs()"><?= lang('Systeminfo_Network');?></a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="systeminfo.php#panStorage" onclick="setCache('activeSysinfoTab','tabStorage');initializeTabs()"><?= lang('Systeminfo_Storage');?></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
@@ -450,24 +466,6 @@
|
|||||||
|
|
||||||
<script defer>
|
<script defer>
|
||||||
|
|
||||||
// Generate work-in-progress icons
|
|
||||||
function workInProgress() {
|
|
||||||
|
|
||||||
if($(".work-in-progress").length > 0 && $(".work-in-progress").html().trim() == "")
|
|
||||||
{
|
|
||||||
$(".work-in-progress").append(`
|
|
||||||
<a href="https://github.com/jokob-sk/NetAlertX/issues" target="_blank">
|
|
||||||
<b class="pointer" title="${getString("Gen_Work_In_Progress")}">🦺</b>
|
|
||||||
</a>
|
|
||||||
`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
|
||||||
|
|
||||||
function toggleFullscreen() {
|
function toggleFullscreen() {
|
||||||
|
|
||||||
if (document.fullscreenElement) {
|
if (document.fullscreenElement) {
|
||||||
@@ -485,6 +483,5 @@ function workInProgress() {
|
|||||||
|
|
||||||
// Update server state in the header
|
// Update server state in the header
|
||||||
updateState()
|
updateState()
|
||||||
workInProgress()
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
6
front/php/templates/language/ar_ar.json
Normal file → Executable file
6
front/php/templates/language/ar_ar.json
Normal file → Executable file
@@ -301,6 +301,7 @@
|
|||||||
"Gen_Cancel": "إلغاء",
|
"Gen_Cancel": "إلغاء",
|
||||||
"Gen_Change": "تغيير",
|
"Gen_Change": "تغيير",
|
||||||
"Gen_Copy": "نسخ",
|
"Gen_Copy": "نسخ",
|
||||||
|
"Gen_CopyToClipboard": "",
|
||||||
"Gen_DataUpdatedUITakesTime": "تم تحديث البيانات. قد يستغرق تحديث واجهة المستخدم بعض الوقت",
|
"Gen_DataUpdatedUITakesTime": "تم تحديث البيانات. قد يستغرق تحديث واجهة المستخدم بعض الوقت",
|
||||||
"Gen_Delete": "حذف",
|
"Gen_Delete": "حذف",
|
||||||
"Gen_DeleteAll": "حذف الكل",
|
"Gen_DeleteAll": "حذف الكل",
|
||||||
@@ -308,7 +309,9 @@
|
|||||||
"Gen_Error": "خطأ",
|
"Gen_Error": "خطأ",
|
||||||
"Gen_Filter": "تصفية",
|
"Gen_Filter": "تصفية",
|
||||||
"Gen_Generate": "إنشاء",
|
"Gen_Generate": "إنشاء",
|
||||||
|
"Gen_InvalidMac": "",
|
||||||
"Gen_LockedDB": "قاعدة البيانات مقفلة",
|
"Gen_LockedDB": "قاعدة البيانات مقفلة",
|
||||||
|
"Gen_NetworkMask": "",
|
||||||
"Gen_Offline": "غير متصل",
|
"Gen_Offline": "غير متصل",
|
||||||
"Gen_Okay": "موافق",
|
"Gen_Okay": "موافق",
|
||||||
"Gen_Online": "متصل",
|
"Gen_Online": "متصل",
|
||||||
@@ -326,6 +329,7 @@
|
|||||||
"Gen_SelectIcon": "اختيار أيقونة",
|
"Gen_SelectIcon": "اختيار أيقونة",
|
||||||
"Gen_SelectToPreview": "اختر للمعاينة",
|
"Gen_SelectToPreview": "اختر للمعاينة",
|
||||||
"Gen_Selected_Devices": "الأجهزة المحددة",
|
"Gen_Selected_Devices": "الأجهزة المحددة",
|
||||||
|
"Gen_Subnet": "",
|
||||||
"Gen_Switch": "تبديل",
|
"Gen_Switch": "تبديل",
|
||||||
"Gen_Upd": "تحديث",
|
"Gen_Upd": "تحديث",
|
||||||
"Gen_Upd_Fail": "فشل التحديث",
|
"Gen_Upd_Fail": "فشل التحديث",
|
||||||
@@ -494,6 +498,7 @@
|
|||||||
"Network_Cant_Assign_No_Node_Selected": "",
|
"Network_Cant_Assign_No_Node_Selected": "",
|
||||||
"Network_Configuration_Error": "خطأ في التكوين",
|
"Network_Configuration_Error": "خطأ في التكوين",
|
||||||
"Network_Connected": "متصل",
|
"Network_Connected": "متصل",
|
||||||
|
"Network_Devices": "",
|
||||||
"Network_ManageAdd": "إضافة إدارة",
|
"Network_ManageAdd": "إضافة إدارة",
|
||||||
"Network_ManageAdd_Name": "اسم الإدارة",
|
"Network_ManageAdd_Name": "اسم الإدارة",
|
||||||
"Network_ManageAdd_Name_text": "نص اسم الإدارة",
|
"Network_ManageAdd_Name_text": "نص اسم الإدارة",
|
||||||
@@ -593,6 +598,7 @@
|
|||||||
"Settings_device_Scanners_desync": "عدم تزامن ماسحات الأجهزة",
|
"Settings_device_Scanners_desync": "عدم تزامن ماسحات الأجهزة",
|
||||||
"Settings_device_Scanners_desync_popup": "نافذة عدم تزامن ماسحات الأجهزة",
|
"Settings_device_Scanners_desync_popup": "نافذة عدم تزامن ماسحات الأجهزة",
|
||||||
"Speedtest_Results": "نتائج اختبار السرعة",
|
"Speedtest_Results": "نتائج اختبار السرعة",
|
||||||
|
"Systeminfo_AvailableIps": "",
|
||||||
"Systeminfo_CPU": "المعالج",
|
"Systeminfo_CPU": "المعالج",
|
||||||
"Systeminfo_CPU_Cores": "أنوية المعالج",
|
"Systeminfo_CPU_Cores": "أنوية المعالج",
|
||||||
"Systeminfo_CPU_Name": "اسم المعالج",
|
"Systeminfo_CPU_Name": "اسم المعالج",
|
||||||
|
|||||||
6
front/php/templates/language/ca_ca.json
Normal file → Executable file
6
front/php/templates/language/ca_ca.json
Normal file → Executable file
@@ -301,6 +301,7 @@
|
|||||||
"Gen_Cancel": "Cancel·lar",
|
"Gen_Cancel": "Cancel·lar",
|
||||||
"Gen_Change": "Canviar",
|
"Gen_Change": "Canviar",
|
||||||
"Gen_Copy": "Executar",
|
"Gen_Copy": "Executar",
|
||||||
|
"Gen_CopyToClipboard": "",
|
||||||
"Gen_DataUpdatedUITakesTime": "D'acord - Pot passar una estona perquè la interfície d'usuari s'actualitzi si s'està executant una exploració.",
|
"Gen_DataUpdatedUITakesTime": "D'acord - Pot passar una estona perquè la interfície d'usuari s'actualitzi si s'està executant una exploració.",
|
||||||
"Gen_Delete": "Esborrar",
|
"Gen_Delete": "Esborrar",
|
||||||
"Gen_DeleteAll": "Esborrar tot",
|
"Gen_DeleteAll": "Esborrar tot",
|
||||||
@@ -308,7 +309,9 @@
|
|||||||
"Gen_Error": "Error",
|
"Gen_Error": "Error",
|
||||||
"Gen_Filter": "Filtrar",
|
"Gen_Filter": "Filtrar",
|
||||||
"Gen_Generate": "Generar",
|
"Gen_Generate": "Generar",
|
||||||
|
"Gen_InvalidMac": "",
|
||||||
"Gen_LockedDB": "ERROR - DB podria estar bloquejada - Fes servir F12 Eines desenvolupament -> Consola o provar-ho més tard.",
|
"Gen_LockedDB": "ERROR - DB podria estar bloquejada - Fes servir F12 Eines desenvolupament -> Consola o provar-ho més tard.",
|
||||||
|
"Gen_NetworkMask": "",
|
||||||
"Gen_Offline": "Fora de línia",
|
"Gen_Offline": "Fora de línia",
|
||||||
"Gen_Okay": "Ok",
|
"Gen_Okay": "Ok",
|
||||||
"Gen_Online": "En línia",
|
"Gen_Online": "En línia",
|
||||||
@@ -326,6 +329,7 @@
|
|||||||
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
||||||
"Gen_SelectToPreview": "Seleccioneu la vista prèvia",
|
"Gen_SelectToPreview": "Seleccioneu la vista prèvia",
|
||||||
"Gen_Selected_Devices": "Dispositius seleccionats:",
|
"Gen_Selected_Devices": "Dispositius seleccionats:",
|
||||||
|
"Gen_Subnet": "",
|
||||||
"Gen_Switch": "Switch",
|
"Gen_Switch": "Switch",
|
||||||
"Gen_Upd": "Actualitzat correctament",
|
"Gen_Upd": "Actualitzat correctament",
|
||||||
"Gen_Upd_Fail": "Actualització fallida",
|
"Gen_Upd_Fail": "Actualització fallida",
|
||||||
@@ -494,6 +498,7 @@
|
|||||||
"Network_Cant_Assign_No_Node_Selected": "",
|
"Network_Cant_Assign_No_Node_Selected": "",
|
||||||
"Network_Configuration_Error": "Error de configuració",
|
"Network_Configuration_Error": "Error de configuració",
|
||||||
"Network_Connected": "Dispositius connectats",
|
"Network_Connected": "Dispositius connectats",
|
||||||
|
"Network_Devices": "",
|
||||||
"Network_ManageAdd": "Afegir dispositiu",
|
"Network_ManageAdd": "Afegir dispositiu",
|
||||||
"Network_ManageAdd_Name": "Nom del dispositiu",
|
"Network_ManageAdd_Name": "Nom del dispositiu",
|
||||||
"Network_ManageAdd_Name_text": "Nom sense caràcters especials",
|
"Network_ManageAdd_Name_text": "Nom sense caràcters especials",
|
||||||
@@ -593,6 +598,7 @@
|
|||||||
"Settings_device_Scanners_desync": "⚠ Els horaris d'escàner de dispositius no estan en sincronia.",
|
"Settings_device_Scanners_desync": "⚠ Els horaris d'escàner de dispositius no estan en sincronia.",
|
||||||
"Settings_device_Scanners_desync_popup": "Els horaris dels escàners de dispositius (<code>*_RUN_SCHD</code>) no són iguals. Això donarà lloc a notificacions inconsistents del dispositiu en línia / fora de línia. Si no és intencionat, utilitzeu el mateix horari per a tots els <b>🔍 escàners de dispositius</b>.",
|
"Settings_device_Scanners_desync_popup": "Els horaris dels escàners de dispositius (<code>*_RUN_SCHD</code>) no són iguals. Això donarà lloc a notificacions inconsistents del dispositiu en línia / fora de línia. Si no és intencionat, utilitzeu el mateix horari per a tots els <b>🔍 escàners de dispositius</b>.",
|
||||||
"Speedtest_Results": "Speedtest Resultats",
|
"Speedtest_Results": "Speedtest Resultats",
|
||||||
|
"Systeminfo_AvailableIps": "",
|
||||||
"Systeminfo_CPU": "CPU",
|
"Systeminfo_CPU": "CPU",
|
||||||
"Systeminfo_CPU_Cores": "Nuclis de CPU:",
|
"Systeminfo_CPU_Cores": "Nuclis de CPU:",
|
||||||
"Systeminfo_CPU_Name": "Nom de CPU:",
|
"Systeminfo_CPU_Name": "Nom de CPU:",
|
||||||
|
|||||||
6
front/php/templates/language/cs_cz.json
Normal file → Executable file
6
front/php/templates/language/cs_cz.json
Normal file → Executable file
@@ -301,6 +301,7 @@
|
|||||||
"Gen_Cancel": "Zrušit",
|
"Gen_Cancel": "Zrušit",
|
||||||
"Gen_Change": "Změnit",
|
"Gen_Change": "Změnit",
|
||||||
"Gen_Copy": "Spustit",
|
"Gen_Copy": "Spustit",
|
||||||
|
"Gen_CopyToClipboard": "",
|
||||||
"Gen_DataUpdatedUITakesTime": "OK - může zabrat chvíli aktualizovat rozhraní, pokud běží scan.",
|
"Gen_DataUpdatedUITakesTime": "OK - může zabrat chvíli aktualizovat rozhraní, pokud běží scan.",
|
||||||
"Gen_Delete": "Smazat",
|
"Gen_Delete": "Smazat",
|
||||||
"Gen_DeleteAll": "Smazat vše",
|
"Gen_DeleteAll": "Smazat vše",
|
||||||
@@ -308,7 +309,9 @@
|
|||||||
"Gen_Error": "Chyba",
|
"Gen_Error": "Chyba",
|
||||||
"Gen_Filter": "Filtr",
|
"Gen_Filter": "Filtr",
|
||||||
"Gen_Generate": "Vygenerovat",
|
"Gen_Generate": "Vygenerovat",
|
||||||
|
"Gen_InvalidMac": "",
|
||||||
"Gen_LockedDB": "CHYBA - Databáze je možná zamčená - Zkontrolujte F12 -> Nástroje pro vývojáře -> Konzole. nebo to zkuste později.",
|
"Gen_LockedDB": "CHYBA - Databáze je možná zamčená - Zkontrolujte F12 -> Nástroje pro vývojáře -> Konzole. nebo to zkuste později.",
|
||||||
|
"Gen_NetworkMask": "",
|
||||||
"Gen_Offline": "Offline",
|
"Gen_Offline": "Offline",
|
||||||
"Gen_Okay": "Ok",
|
"Gen_Okay": "Ok",
|
||||||
"Gen_Online": "Online",
|
"Gen_Online": "Online",
|
||||||
@@ -326,6 +329,7 @@
|
|||||||
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
||||||
"Gen_SelectToPreview": "Vybrat na náhled",
|
"Gen_SelectToPreview": "Vybrat na náhled",
|
||||||
"Gen_Selected_Devices": "Vybraná zařízení:",
|
"Gen_Selected_Devices": "Vybraná zařízení:",
|
||||||
|
"Gen_Subnet": "",
|
||||||
"Gen_Switch": "Přepnout",
|
"Gen_Switch": "Přepnout",
|
||||||
"Gen_Upd": "Úspěšně aktualizováno",
|
"Gen_Upd": "Úspěšně aktualizováno",
|
||||||
"Gen_Upd_Fail": "Aktualizace se nezdařila",
|
"Gen_Upd_Fail": "Aktualizace se nezdařila",
|
||||||
@@ -494,6 +498,7 @@
|
|||||||
"Network_Cant_Assign_No_Node_Selected": "",
|
"Network_Cant_Assign_No_Node_Selected": "",
|
||||||
"Network_Configuration_Error": "",
|
"Network_Configuration_Error": "",
|
||||||
"Network_Connected": "",
|
"Network_Connected": "",
|
||||||
|
"Network_Devices": "",
|
||||||
"Network_ManageAdd": "",
|
"Network_ManageAdd": "",
|
||||||
"Network_ManageAdd_Name": "",
|
"Network_ManageAdd_Name": "",
|
||||||
"Network_ManageAdd_Name_text": "",
|
"Network_ManageAdd_Name_text": "",
|
||||||
@@ -593,6 +598,7 @@
|
|||||||
"Settings_device_Scanners_desync": "",
|
"Settings_device_Scanners_desync": "",
|
||||||
"Settings_device_Scanners_desync_popup": "",
|
"Settings_device_Scanners_desync_popup": "",
|
||||||
"Speedtest_Results": "",
|
"Speedtest_Results": "",
|
||||||
|
"Systeminfo_AvailableIps": "",
|
||||||
"Systeminfo_CPU": "",
|
"Systeminfo_CPU": "",
|
||||||
"Systeminfo_CPU_Cores": "",
|
"Systeminfo_CPU_Cores": "",
|
||||||
"Systeminfo_CPU_Name": "",
|
"Systeminfo_CPU_Name": "",
|
||||||
|
|||||||
14
front/php/templates/language/de_de.json
Normal file → Executable file
14
front/php/templates/language/de_de.json
Normal file → Executable file
@@ -5,14 +5,6 @@
|
|||||||
"API_TOKEN_name": "API-Schlüssel",
|
"API_TOKEN_name": "API-Schlüssel",
|
||||||
"API_display_name": "API",
|
"API_display_name": "API",
|
||||||
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
|
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
|
||||||
"APPRISE_HOST_description": "Apprise host URL starting with <code>http://</code> or <code>https://</code>. (do not forget to include <code>/notify</code> at the end)",
|
|
||||||
"APPRISE_HOST_name": "Apprise host URL",
|
|
||||||
"APPRISE_PAYLOAD_description": "Select the payload type sent to Apprise. For example <code>html</code> works well with emails, <code>text</code> with chat apps, such as Telegram.",
|
|
||||||
"APPRISE_PAYLOAD_name": "Payload type",
|
|
||||||
"APPRISE_SIZE_description": "The maximum size of the apprise payload as number of characters in the passed string. If above limit, it will be truncated and a <code>(text was truncated)</code> message is appended.",
|
|
||||||
"APPRISE_SIZE_name": "Max payload size",
|
|
||||||
"APPRISE_URL_description": "Apprise notification target URL. For example for Telegram it would be <code>tgram://{bot_token}/{chat_id}</code>.",
|
|
||||||
"APPRISE_URL_name": "Apprise notification URL",
|
|
||||||
"About_Design": "Entworfen für:",
|
"About_Design": "Entworfen für:",
|
||||||
"About_Exit": "Abmelden",
|
"About_Exit": "Abmelden",
|
||||||
"About_Title": "Netzwerksicherheitsscanner und Benachrichtigungsframework",
|
"About_Title": "Netzwerksicherheitsscanner und Benachrichtigungsframework",
|
||||||
@@ -313,6 +305,7 @@
|
|||||||
"Gen_Cancel": "Abbrechen",
|
"Gen_Cancel": "Abbrechen",
|
||||||
"Gen_Change": "Ändern",
|
"Gen_Change": "Ändern",
|
||||||
"Gen_Copy": "Ausführen",
|
"Gen_Copy": "Ausführen",
|
||||||
|
"Gen_CopyToClipboard": "",
|
||||||
"Gen_DataUpdatedUITakesTime": "OK – Es kann einen Moment dauern, bis die Benutzeroberfläche aktualisiert wird, während ein Scan ausgeführt wird.",
|
"Gen_DataUpdatedUITakesTime": "OK – Es kann einen Moment dauern, bis die Benutzeroberfläche aktualisiert wird, während ein Scan ausgeführt wird.",
|
||||||
"Gen_Delete": "Löschen",
|
"Gen_Delete": "Löschen",
|
||||||
"Gen_DeleteAll": "Alles löschen",
|
"Gen_DeleteAll": "Alles löschen",
|
||||||
@@ -320,7 +313,9 @@
|
|||||||
"Gen_Error": "Fehler",
|
"Gen_Error": "Fehler",
|
||||||
"Gen_Filter": "Filter",
|
"Gen_Filter": "Filter",
|
||||||
"Gen_Generate": "Generieren",
|
"Gen_Generate": "Generieren",
|
||||||
|
"Gen_InvalidMac": "Ungültige MAC-Adresse.",
|
||||||
"Gen_LockedDB": "ERROR - DB eventuell gesperrt - Nutze die Konsole in den Entwickler Werkzeugen (F12) zur Überprüfung oder probiere es später erneut.",
|
"Gen_LockedDB": "ERROR - DB eventuell gesperrt - Nutze die Konsole in den Entwickler Werkzeugen (F12) zur Überprüfung oder probiere es später erneut.",
|
||||||
|
"Gen_NetworkMask": "",
|
||||||
"Gen_Offline": "Offline",
|
"Gen_Offline": "Offline",
|
||||||
"Gen_Okay": "Ok",
|
"Gen_Okay": "Ok",
|
||||||
"Gen_Online": "Online",
|
"Gen_Online": "Online",
|
||||||
@@ -338,6 +333,7 @@
|
|||||||
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
||||||
"Gen_SelectToPreview": "Zur Vorschau auswählen",
|
"Gen_SelectToPreview": "Zur Vorschau auswählen",
|
||||||
"Gen_Selected_Devices": "Ausgewählte Geräte:",
|
"Gen_Selected_Devices": "Ausgewählte Geräte:",
|
||||||
|
"Gen_Subnet": "",
|
||||||
"Gen_Switch": "Umschalten",
|
"Gen_Switch": "Umschalten",
|
||||||
"Gen_Upd": "Aktualisierung erfolgreich",
|
"Gen_Upd": "Aktualisierung erfolgreich",
|
||||||
"Gen_Upd_Fail": "Aktualisierung fehlgeschlagen",
|
"Gen_Upd_Fail": "Aktualisierung fehlgeschlagen",
|
||||||
@@ -531,6 +527,7 @@
|
|||||||
"Network_Cant_Assign_No_Node_Selected": "",
|
"Network_Cant_Assign_No_Node_Selected": "",
|
||||||
"Network_Configuration_Error": "Konfigurationsfehler",
|
"Network_Configuration_Error": "Konfigurationsfehler",
|
||||||
"Network_Connected": "Verbundene Geräte",
|
"Network_Connected": "Verbundene Geräte",
|
||||||
|
"Network_Devices": "",
|
||||||
"Network_ManageAdd": "Gerät hinzufügen",
|
"Network_ManageAdd": "Gerät hinzufügen",
|
||||||
"Network_ManageAdd_Name": "Name des Gerätes",
|
"Network_ManageAdd_Name": "Name des Gerätes",
|
||||||
"Network_ManageAdd_Name_text": "Name ohne Sonderzeichen",
|
"Network_ManageAdd_Name_text": "Name ohne Sonderzeichen",
|
||||||
@@ -662,6 +659,7 @@
|
|||||||
"Settings_device_Scanners_desync": "⚠ Die Zeitpläne des Gerätescanners sind nicht synchronisiert.",
|
"Settings_device_Scanners_desync": "⚠ Die Zeitpläne des Gerätescanners sind nicht synchronisiert.",
|
||||||
"Settings_device_Scanners_desync_popup": "",
|
"Settings_device_Scanners_desync_popup": "",
|
||||||
"Speedtest_Results": "Ergebnisse des Geschwindigkeitstests",
|
"Speedtest_Results": "Ergebnisse des Geschwindigkeitstests",
|
||||||
|
"Systeminfo_AvailableIps": "",
|
||||||
"Systeminfo_CPU": "CPU",
|
"Systeminfo_CPU": "CPU",
|
||||||
"Systeminfo_CPU_Cores": "CPU-Kerne:",
|
"Systeminfo_CPU_Cores": "CPU-Kerne:",
|
||||||
"Systeminfo_CPU_Name": "CPU-Name:",
|
"Systeminfo_CPU_Name": "CPU-Name:",
|
||||||
|
|||||||
@@ -39,8 +39,8 @@
|
|||||||
"BackDevices_Backup_CopError": "The original database could not be saved.",
|
"BackDevices_Backup_CopError": "The original database could not be saved.",
|
||||||
"BackDevices_Backup_Failed": "The backup executed partially successfully. The archive could not be created or is empty.",
|
"BackDevices_Backup_Failed": "The backup executed partially successfully. The archive could not be created or is empty.",
|
||||||
"BackDevices_Backup_okay": "The backup executed successfully with the new archive",
|
"BackDevices_Backup_okay": "The backup executed successfully with the new archive",
|
||||||
"BackDevices_DBTools_DelDevError_a": "Error deleting Device",
|
"BackDevices_DBTools_DelDevError_a": "Error deleting device",
|
||||||
"BackDevices_DBTools_DelDevError_b": "Error deleting Devices",
|
"BackDevices_DBTools_DelDevError_b": "Error deleting devices",
|
||||||
"BackDevices_DBTools_DelDev_a": "Device deleted",
|
"BackDevices_DBTools_DelDev_a": "Device deleted",
|
||||||
"BackDevices_DBTools_DelDev_b": "Devices deleted",
|
"BackDevices_DBTools_DelDev_b": "Devices deleted",
|
||||||
"BackDevices_DBTools_DelEvents": "Events deleted",
|
"BackDevices_DBTools_DelEvents": "Events deleted",
|
||||||
@@ -72,18 +72,18 @@
|
|||||||
"DevDetail_CustomProperties_Title": "Custom Properties",
|
"DevDetail_CustomProperties_Title": "Custom Properties",
|
||||||
"DevDetail_CustomProps_reset_info": "This will remove your custom properties on this device and reset them to the default value.",
|
"DevDetail_CustomProps_reset_info": "This will remove your custom properties on this device and reset them to the default value.",
|
||||||
"DevDetail_DisplayFields_Title": "Display",
|
"DevDetail_DisplayFields_Title": "Display",
|
||||||
"DevDetail_EveandAl_AlertAllEvents": "Alert Events",
|
"DevDetail_EveandAl_AlertAllEvents": "Alert events",
|
||||||
"DevDetail_EveandAl_AlertDown": "Alert Down",
|
"DevDetail_EveandAl_AlertDown": "Alert down",
|
||||||
"DevDetail_EveandAl_Archived": "Archived",
|
"DevDetail_EveandAl_Archived": "Archived",
|
||||||
"DevDetail_EveandAl_NewDevice": "New Device",
|
"DevDetail_EveandAl_NewDevice": "New device",
|
||||||
"DevDetail_EveandAl_NewDevice_Tooltip": "Will show the New status for the device and include it in lists when the New Devices filter is active. Doesn't affect notifications.",
|
"DevDetail_EveandAl_NewDevice_Tooltip": "Will show the New status for the device and include it in lists when the New devices filter is active. Doesn't affect notifications.",
|
||||||
"DevDetail_EveandAl_RandomMAC": "Random MAC",
|
"DevDetail_EveandAl_RandomMAC": "Random MAC",
|
||||||
"DevDetail_EveandAl_ScanCycle": "Scan device",
|
"DevDetail_EveandAl_ScanCycle": "Scan device",
|
||||||
"DevDetail_EveandAl_ScanCycle_a": "Scan Device",
|
"DevDetail_EveandAl_ScanCycle_a": "Scan device",
|
||||||
"DevDetail_EveandAl_ScanCycle_z": "Don't Scan Device",
|
"DevDetail_EveandAl_ScanCycle_z": "Don't scan device",
|
||||||
"DevDetail_EveandAl_Skip": "Skip repeated notifications for",
|
"DevDetail_EveandAl_Skip": "Skip repeated notifications for",
|
||||||
"DevDetail_EveandAl_Title": "Notifications config",
|
"DevDetail_EveandAl_Title": "Notifications config",
|
||||||
"DevDetail_Events_CheckBox": "Hide Connection Events",
|
"DevDetail_Events_CheckBox": "Hide connection events",
|
||||||
"DevDetail_GoToNetworkNode": "Navigate to the Network page of the given node.",
|
"DevDetail_GoToNetworkNode": "Navigate to the Network page of the given node.",
|
||||||
"DevDetail_Icon": "Icon",
|
"DevDetail_Icon": "Icon",
|
||||||
"DevDetail_Icon_Descr": "Enter a font awesome icon name without the fa- prefix or with complete class, e.g.: fa fa-brands fa-apple.",
|
"DevDetail_Icon_Descr": "Enter a font awesome icon name without the fa- prefix or with complete class, e.g.: fa fa-brands fa-apple.",
|
||||||
@@ -201,7 +201,7 @@
|
|||||||
"Device_MultiEdit_MassActions": "Mass actions:",
|
"Device_MultiEdit_MassActions": "Mass actions:",
|
||||||
"Device_MultiEdit_Tooltip": "Careful. Clicking this will apply the value on the left to all devices selected above.",
|
"Device_MultiEdit_Tooltip": "Careful. Clicking this will apply the value on the left to all devices selected above.",
|
||||||
"Device_Searchbox": "Search",
|
"Device_Searchbox": "Search",
|
||||||
"Device_Shortcut_AllDevices": "My Devices",
|
"Device_Shortcut_AllDevices": "My devices",
|
||||||
"Device_Shortcut_AllNodes": "All Nodes",
|
"Device_Shortcut_AllNodes": "All Nodes",
|
||||||
"Device_Shortcut_Archived": "Archived",
|
"Device_Shortcut_Archived": "Archived",
|
||||||
"Device_Shortcut_Connected": "Connected",
|
"Device_Shortcut_Connected": "Connected",
|
||||||
@@ -209,7 +209,7 @@
|
|||||||
"Device_Shortcut_DownAlerts": "Down & Offline",
|
"Device_Shortcut_DownAlerts": "Down & Offline",
|
||||||
"Device_Shortcut_DownOnly": "Down",
|
"Device_Shortcut_DownOnly": "Down",
|
||||||
"Device_Shortcut_Favorites": "Favorites",
|
"Device_Shortcut_Favorites": "Favorites",
|
||||||
"Device_Shortcut_NewDevices": "New Devices",
|
"Device_Shortcut_NewDevices": "New devices",
|
||||||
"Device_Shortcut_OnlineChart": "Device presence",
|
"Device_Shortcut_OnlineChart": "Device presence",
|
||||||
"Device_TableHead_AlertDown": "Alert Down",
|
"Device_TableHead_AlertDown": "Alert Down",
|
||||||
"Device_TableHead_Connected_Devices": "Connections",
|
"Device_TableHead_Connected_Devices": "Connections",
|
||||||
@@ -267,7 +267,7 @@
|
|||||||
"Events_Shortcut_DownAlerts": "Down Alerts",
|
"Events_Shortcut_DownAlerts": "Down Alerts",
|
||||||
"Events_Shortcut_Events": "Events",
|
"Events_Shortcut_Events": "Events",
|
||||||
"Events_Shortcut_MissSessions": "Missing Sessions",
|
"Events_Shortcut_MissSessions": "Missing Sessions",
|
||||||
"Events_Shortcut_NewDevices": "New Devices",
|
"Events_Shortcut_NewDevices": "New devices",
|
||||||
"Events_Shortcut_Sessions": "Sessions",
|
"Events_Shortcut_Sessions": "Sessions",
|
||||||
"Events_Shortcut_VoidSessions": "Voided Sessions",
|
"Events_Shortcut_VoidSessions": "Voided Sessions",
|
||||||
"Events_TableHead_AdditionalInfo": "Additional Info",
|
"Events_TableHead_AdditionalInfo": "Additional Info",
|
||||||
@@ -293,14 +293,15 @@
|
|||||||
"GRAPHQL_PORT_name": "GraphQL port",
|
"GRAPHQL_PORT_name": "GraphQL port",
|
||||||
"Gen_Action": "Action",
|
"Gen_Action": "Action",
|
||||||
"Gen_Add": "Add",
|
"Gen_Add": "Add",
|
||||||
"Gen_AddDevice": "Add Device",
|
"Gen_AddDevice": "Add device",
|
||||||
"Gen_Add_All": "Add all",
|
"Gen_Add_All": "Add all",
|
||||||
"Gen_All_Devices": "All Devices",
|
"Gen_All_Devices": "All devices",
|
||||||
"Gen_AreYouSure": "Are you sure?",
|
"Gen_AreYouSure": "Are you sure?",
|
||||||
"Gen_Backup": "Run Backup",
|
"Gen_Backup": "Run Backup",
|
||||||
"Gen_Cancel": "Cancel",
|
"Gen_Cancel": "Cancel",
|
||||||
"Gen_Change": "Change",
|
"Gen_Change": "Change",
|
||||||
"Gen_Copy": "Run",
|
"Gen_Copy": "Run",
|
||||||
|
"Gen_CopyToClipboard": "Copy to clipboard",
|
||||||
"Gen_DataUpdatedUITakesTime": "OK - It may take a while for the UI to update if a scan is running.",
|
"Gen_DataUpdatedUITakesTime": "OK - It may take a while for the UI to update if a scan is running.",
|
||||||
"Gen_Delete": "Delete",
|
"Gen_Delete": "Delete",
|
||||||
"Gen_DeleteAll": "Delete all",
|
"Gen_DeleteAll": "Delete all",
|
||||||
@@ -308,7 +309,9 @@
|
|||||||
"Gen_Error": "Error",
|
"Gen_Error": "Error",
|
||||||
"Gen_Filter": "Filter",
|
"Gen_Filter": "Filter",
|
||||||
"Gen_Generate": "Generate",
|
"Gen_Generate": "Generate",
|
||||||
|
"Gen_InvalidMac": "Invalid Mac address.",
|
||||||
"Gen_LockedDB": "ERROR - DB might be locked - Check F12 Dev tools -> Console or try later.",
|
"Gen_LockedDB": "ERROR - DB might be locked - Check F12 Dev tools -> Console or try later.",
|
||||||
|
"Gen_NetworkMask": "Network mask",
|
||||||
"Gen_Offline": "Offline",
|
"Gen_Offline": "Offline",
|
||||||
"Gen_Okay": "Ok",
|
"Gen_Okay": "Ok",
|
||||||
"Gen_Online": "Online",
|
"Gen_Online": "Online",
|
||||||
@@ -325,7 +328,8 @@
|
|||||||
"Gen_Select": "Select",
|
"Gen_Select": "Select",
|
||||||
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
||||||
"Gen_SelectToPreview": "Select to preview",
|
"Gen_SelectToPreview": "Select to preview",
|
||||||
"Gen_Selected_Devices": "Selected Devices:",
|
"Gen_Selected_Devices": "Selected devices:",
|
||||||
|
"Gen_Subnet": "Subnet",
|
||||||
"Gen_Switch": "Switch",
|
"Gen_Switch": "Switch",
|
||||||
"Gen_Upd": "Updated successfully",
|
"Gen_Upd": "Updated successfully",
|
||||||
"Gen_Upd_Fail": "Update failed",
|
"Gen_Upd_Fail": "Update failed",
|
||||||
@@ -338,9 +342,9 @@
|
|||||||
"Gen_create_new_device_info": "Devices are typically discovered using <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">plugins</a>. However, in certain cases, you may need to add devices manually. To explore specific scenarios check the <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/REMOTE_NETWORKS.md\">Remote Networks documentation</a>.",
|
"Gen_create_new_device_info": "Devices are typically discovered using <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">plugins</a>. However, in certain cases, you may need to add devices manually. To explore specific scenarios check the <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/REMOTE_NETWORKS.md\">Remote Networks documentation</a>.",
|
||||||
"General_display_name": "General",
|
"General_display_name": "General",
|
||||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||||
"HRS_TO_KEEP_NEWDEV_description": "This is a maintenance setting <b>DELETING devices</b>. If enabled (<code>0</code> is disabled), devices marked as <b>New Device</b> will be deleted if their <b>First Session</b> time was older than the specified hours in this setting. Use this setting if you want to auto-delete <b>New Devices</b> after <code>X</code> hours.",
|
"HRS_TO_KEEP_NEWDEV_description": "This is a maintenance setting <b>DELETING devices</b>. If enabled (<code>0</code> is disabled), devices marked as <b>New device</b> will be deleted if their <b>First Session</b> time was older than the specified hours in this setting. Use this setting if you want to auto-delete <b>New devices</b> after <code>X</code> hours.",
|
||||||
"HRS_TO_KEEP_NEWDEV_name": "Delete new devices after",
|
"HRS_TO_KEEP_NEWDEV_name": "Delete new devices after",
|
||||||
"HRS_TO_KEEP_OFFDEV_description": "This is a maintenance setting <b>DELETING devices</b>. If enabled (<code>0</code> is disabled), devices that are <b>Offline</b> and their <b>Last Connection</b> date time is older than the specified hours in this setting, will be deleted. Use this setting if you want to auto-delete <b>Offline Devices</b> after <code>X</code> hours being offline.",
|
"HRS_TO_KEEP_OFFDEV_description": "This is a maintenance setting <b>DELETING devices</b>. If enabled (<code>0</code> is disabled), devices that are <b>Offline</b> and their <b>Last Connection</b> date time is older than the specified hours in this setting, will be deleted. Use this setting if you want to auto-delete <b>Offline devices</b> after <code>X</code> hours being offline.",
|
||||||
"HRS_TO_KEEP_OFFDEV_name": "Delete offline devices after",
|
"HRS_TO_KEEP_OFFDEV_name": "Delete offline devices after",
|
||||||
"LOADED_PLUGINS_description": "Which Plugins to load. Adding plugins might slow the application. Read more about which plugins need to be enabled, types, or scanning options in the <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">plugins docs</a>. Unloaded plugins will lose your settings. Only <code>disabled</code> plugins can be unloaded.",
|
"LOADED_PLUGINS_description": "Which Plugins to load. Adding plugins might slow the application. Read more about which plugins need to be enabled, types, or scanning options in the <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">plugins docs</a>. Unloaded plugins will lose your settings. Only <code>disabled</code> plugins can be unloaded.",
|
||||||
"LOADED_PLUGINS_name": "Loaded plugins",
|
"LOADED_PLUGINS_name": "Loaded plugins",
|
||||||
@@ -364,20 +368,20 @@
|
|||||||
"Maint_PurgeLog": "Purge log",
|
"Maint_PurgeLog": "Purge log",
|
||||||
"Maint_RestartServer": "Restart server",
|
"Maint_RestartServer": "Restart server",
|
||||||
"Maint_Restart_Server_noti_text": "Are you sure you want to restart the backend server? This may casue app inconsistency. Backup your setup first. <br/> <br/> Note: This may take a few minutes.",
|
"Maint_Restart_Server_noti_text": "Are you sure you want to restart the backend server? This may casue app inconsistency. Backup your setup first. <br/> <br/> Note: This may take a few minutes.",
|
||||||
"Maintenance_InitCheck": "Init Check",
|
"Maintenance_InitCheck": "Init check",
|
||||||
"Maintenance_InitCheck_Checking": "Checking…",
|
"Maintenance_InitCheck_Checking": "Checking…",
|
||||||
"Maintenance_InitCheck_QuickSetupGuide": "Make sure you followed the <a href=\"https://jokob-sk.github.io/NetAlertX/INITIAL_SETUP/\" target=\"_blank\">quick setup guide</a>.",
|
"Maintenance_InitCheck_QuickSetupGuide": "Make sure you followed the <a href=\"https://jokob-sk.github.io/NetAlertX/INITIAL_SETUP/\" target=\"_blank\">quick setup guide</a>.",
|
||||||
"Maintenance_InitCheck_Success": "Application initialized succesfully!",
|
"Maintenance_InitCheck_Success": "Application initialized succesfully!",
|
||||||
"Maintenance_ReCheck": "Retry Check",
|
"Maintenance_ReCheck": "Retry check",
|
||||||
"Maintenance_Running_Version": "Installed version",
|
"Maintenance_Running_Version": "Installed version",
|
||||||
"Maintenance_Status": "Status",
|
"Maintenance_Status": "Status",
|
||||||
"Maintenance_Title": "Maintenance tools",
|
"Maintenance_Title": "Maintenance tools",
|
||||||
"Maintenance_Tool_DownloadConfig": "Settings Export",
|
"Maintenance_Tool_DownloadConfig": "Settings export",
|
||||||
"Maintenance_Tool_DownloadConfig_text": "Download a full backup of your Settings configuration stored in the <code>app.conf</code> file.",
|
"Maintenance_Tool_DownloadConfig_text": "Download a full backup of your Settings configuration stored in the <code>app.conf</code> file.",
|
||||||
"Maintenance_Tool_DownloadWorkflows": "Workflows Export",
|
"Maintenance_Tool_DownloadWorkflows": "Workflows export",
|
||||||
"Maintenance_Tool_DownloadWorkflows_text": "Download a full backup of your Workflows stored in the <code>workflows.json</code> file.",
|
"Maintenance_Tool_DownloadWorkflows_text": "Download a full backup of your Workflows stored in the <code>workflows.json</code> file.",
|
||||||
"Maintenance_Tool_ExportCSV": "Devices Export (csv)",
|
"Maintenance_Tool_ExportCSV": "Devices export (csv)",
|
||||||
"Maintenance_Tool_ExportCSV_noti": "Devices Export (csv)",
|
"Maintenance_Tool_ExportCSV_noti": "Devices export (csv)",
|
||||||
"Maintenance_Tool_ExportCSV_noti_text": "Are you sure you want to generate a CSV file?",
|
"Maintenance_Tool_ExportCSV_noti_text": "Are you sure you want to generate a CSV file?",
|
||||||
"Maintenance_Tool_ExportCSV_text": "Generate a CSV (comma separated value) file containing the list of Devices including the Network relationships between Network Nodes and connected devices. You can also trigger this by accessing this URL <code>your_NetAlertX_url/php/server/devices.php?action=ExportCSV</code> or by enabling the <a href=\"settings.php#CSVBCKP_header\">CSV Backup</a> plugin.",
|
"Maintenance_Tool_ExportCSV_text": "Generate a CSV (comma separated value) file containing the list of Devices including the Network relationships between Network Nodes and connected devices. You can also trigger this by accessing this URL <code>your_NetAlertX_url/php/server/devices.php?action=ExportCSV</code> or by enabling the <a href=\"settings.php#CSVBCKP_header\">CSV Backup</a> plugin.",
|
||||||
"Maintenance_Tool_ImportCSV": "Devices Import (csv)",
|
"Maintenance_Tool_ImportCSV": "Devices Import (csv)",
|
||||||
@@ -408,26 +412,26 @@
|
|||||||
"Maintenance_Tool_del_ActHistory_noti": "Delete network activity",
|
"Maintenance_Tool_del_ActHistory_noti": "Delete network activity",
|
||||||
"Maintenance_Tool_del_ActHistory_noti_text": "Are you sure you want to reset the network activity?",
|
"Maintenance_Tool_del_ActHistory_noti_text": "Are you sure you want to reset the network activity?",
|
||||||
"Maintenance_Tool_del_ActHistory_text": "The network activity graph is reset. This does not affect the events.",
|
"Maintenance_Tool_del_ActHistory_text": "The network activity graph is reset. This does not affect the events.",
|
||||||
"Maintenance_Tool_del_alldev": "Delete all Devices",
|
"Maintenance_Tool_del_alldev": "Delete all devices",
|
||||||
"Maintenance_Tool_del_alldev_noti": "Delete Devices",
|
"Maintenance_Tool_del_alldev_noti": "Delete devices",
|
||||||
"Maintenance_Tool_del_alldev_noti_text": "Are you sure you want to delete all devices?",
|
"Maintenance_Tool_del_alldev_noti_text": "Are you sure you want to delete all devices?",
|
||||||
"Maintenance_Tool_del_alldev_text": "Before using this function, please make a backup. The deletion cannot be undone. All devices will be deleted from the database.",
|
"Maintenance_Tool_del_alldev_text": "Before using this function, please make a backup. The deletion cannot be undone. All devices will be deleted from the database.",
|
||||||
"Maintenance_Tool_del_allevents": "Delete Events (Reset Presence)",
|
"Maintenance_Tool_del_allevents": "Delete Events (Reset Presence)",
|
||||||
"Maintenance_Tool_del_allevents30": "Delete all Events older than 30 days",
|
"Maintenance_Tool_del_allevents30": "Delete all Events older than 30 days",
|
||||||
"Maintenance_Tool_del_allevents30_noti": "Delete Events",
|
"Maintenance_Tool_del_allevents30_noti": "Delete Events",
|
||||||
"Maintenance_Tool_del_allevents30_noti_text": "Are you sure you want to delete all Events older than 30 days? This resets Presence of all Devices.",
|
"Maintenance_Tool_del_allevents30_noti_text": "Are you sure you want to delete all Events older than 30 days? This resets presence of all devices.",
|
||||||
"Maintenance_Tool_del_allevents30_text": "Before using this function, please make a backup. The deletion cannot be undone. All events older than 30 days in the database will be deleted. At that moment the presence of all devices will be reset. This can lead to invalid sessions. This means that devices are displayed as \"present\" although they are offline. A scan while the device in question is online solves the problem.",
|
"Maintenance_Tool_del_allevents30_text": "Before using this function, please make a backup. The deletion cannot be undone. All events older than 30 days in the database will be deleted. At that moment the presence of all devices will be reset. This can lead to invalid sessions. This means that devices are displayed as \"present\" although they are offline. A scan while the device in question is online solves the problem.",
|
||||||
"Maintenance_Tool_del_allevents_noti": "Delete Events",
|
"Maintenance_Tool_del_allevents_noti": "Delete Events",
|
||||||
"Maintenance_Tool_del_allevents_noti_text": "Are you sure you want to delete all Events? This resets Presence of all Devices.",
|
"Maintenance_Tool_del_allevents_noti_text": "Are you sure you want to delete all Events? This resets presence of all devices.",
|
||||||
"Maintenance_Tool_del_allevents_text": "Before using this function, please make a backup. The deletion cannot be undone. All events in the database will be deleted. At that moment the presence of all devices will be reset. This can lead to invalid sessions. This means that devices are displayed as \"present\" although they are offline. A scan while the device in question is online solves the problem.",
|
"Maintenance_Tool_del_allevents_text": "Before using this function, please make a backup. The deletion cannot be undone. All events in the database will be deleted. At that moment the presence of all devices will be reset. This can lead to invalid sessions. This means that devices are displayed as \"present\" although they are offline. A scan while the device in question is online solves the problem.",
|
||||||
"Maintenance_Tool_del_empty_macs": "Delete Devices with empty MACs",
|
"Maintenance_Tool_del_empty_macs": "Delete devices with empty MACs",
|
||||||
"Maintenance_Tool_del_empty_macs_noti": "Delete Devices",
|
"Maintenance_Tool_del_empty_macs_noti": "Delete devices",
|
||||||
"Maintenance_Tool_del_empty_macs_noti_text": "Are you sure you want to delete all devices with empty MAC addresses?<br>(maybe you prefer to archive it)",
|
"Maintenance_Tool_del_empty_macs_noti_text": "Are you sure you want to delete all devices with empty MAC addresses?<br>(maybe you prefer to archive it)",
|
||||||
"Maintenance_Tool_del_empty_macs_text": "Before using this function, please make a backup. The deletion cannot be undone. All devices without MAC will be deleted from the database.",
|
"Maintenance_Tool_del_empty_macs_text": "Before using this function, please make a backup. The deletion cannot be undone. All devices without MAC will be deleted from the database.",
|
||||||
"Maintenance_Tool_del_selecteddev": "Delete selected devices",
|
"Maintenance_Tool_del_selecteddev": "Delete selected devices",
|
||||||
"Maintenance_Tool_del_selecteddev_text": "Before using this function, please make a backup. The deletion cannot be undone. Selected devices will be deleted from the database.",
|
"Maintenance_Tool_del_selecteddev_text": "Before using this function, please make a backup. The deletion cannot be undone. Selected devices will be deleted from the database.",
|
||||||
"Maintenance_Tool_del_unknowndev": "Delete (unknown) Devices",
|
"Maintenance_Tool_del_unknowndev": "Delete (unknown) devices",
|
||||||
"Maintenance_Tool_del_unknowndev_noti": "Delete (unknown) Devices",
|
"Maintenance_Tool_del_unknowndev_noti": "Delete (unknown) devices",
|
||||||
"Maintenance_Tool_del_unknowndev_noti_text": "Are you sure you want to delete all (unknown) and (name not found) devices?",
|
"Maintenance_Tool_del_unknowndev_noti_text": "Are you sure you want to delete all (unknown) and (name not found) devices?",
|
||||||
"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_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_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.",
|
||||||
@@ -471,10 +475,10 @@
|
|||||||
"Maintenance_themeselector_lable": "Select Skin",
|
"Maintenance_themeselector_lable": "Select Skin",
|
||||||
"Maintenance_themeselector_text": "The change takes place on the server side, so it affects all devices in use.",
|
"Maintenance_themeselector_text": "The change takes place on the server side, so it affects all devices in use.",
|
||||||
"Maintenance_version": "App updates",
|
"Maintenance_version": "App updates",
|
||||||
"NETWORK_DEVICE_TYPES_description": "Which device types are allowed to be used as network devices in the Network view. The device type has to match exactly the <code>Type</code> setting on a specific device in Device details. Add it on the Device via the <code>+</code> button. Do not remove existing types, only add new ones.",
|
"NETWORK_DEVICE_TYPES_description": "Which device types are allowed to be used as network devices in the Network view. The device type has to match exactly the <code>Type</code> setting on a specific device in Device details. Add it on the device via the <code>+</code> button. Do not remove existing types, only add new ones.",
|
||||||
"NETWORK_DEVICE_TYPES_name": "Network device types",
|
"NETWORK_DEVICE_TYPES_name": "Network device types",
|
||||||
"Navigation_About": "About",
|
"Navigation_About": "About",
|
||||||
"Navigation_AppEvents": "App Events",
|
"Navigation_AppEvents": "App events",
|
||||||
"Navigation_Devices": "Devices",
|
"Navigation_Devices": "Devices",
|
||||||
"Navigation_Donations": "Donations",
|
"Navigation_Donations": "Donations",
|
||||||
"Navigation_Events": "Events",
|
"Navigation_Events": "Events",
|
||||||
@@ -485,7 +489,7 @@
|
|||||||
"Navigation_Notifications": "Notifications",
|
"Navigation_Notifications": "Notifications",
|
||||||
"Navigation_Plugins": "Plugins",
|
"Navigation_Plugins": "Plugins",
|
||||||
"Navigation_Presence": "Presence",
|
"Navigation_Presence": "Presence",
|
||||||
"Navigation_Report": "Sent Reports",
|
"Navigation_Report": "Sent reports",
|
||||||
"Navigation_Settings": "Settings",
|
"Navigation_Settings": "Settings",
|
||||||
"Navigation_SystemInfo": "System info",
|
"Navigation_SystemInfo": "System info",
|
||||||
"Navigation_Workflows": "Workflows",
|
"Navigation_Workflows": "Workflows",
|
||||||
@@ -494,30 +498,31 @@
|
|||||||
"Network_Cant_Assign_No_Node_Selected": "Can't assign, no parent node selected.",
|
"Network_Cant_Assign_No_Node_Selected": "Can't assign, no parent node selected.",
|
||||||
"Network_Configuration_Error": "Configuration Error",
|
"Network_Configuration_Error": "Configuration Error",
|
||||||
"Network_Connected": "Connected devices",
|
"Network_Connected": "Connected devices",
|
||||||
"Network_ManageAdd": "Add Device",
|
"Network_Devices": "Network devices",
|
||||||
"Network_ManageAdd_Name": "Device Name",
|
"Network_ManageAdd": "Add device",
|
||||||
|
"Network_ManageAdd_Name": "Device name",
|
||||||
"Network_ManageAdd_Name_text": "Name without special characters",
|
"Network_ManageAdd_Name_text": "Name without special characters",
|
||||||
"Network_ManageAdd_Port": "Port Count",
|
"Network_ManageAdd_Port": "Port Count",
|
||||||
"Network_ManageAdd_Port_text": "leave blank for wifi and powerline",
|
"Network_ManageAdd_Port_text": "leave blank for wifi and powerline",
|
||||||
"Network_ManageAdd_Submit": "Add Device",
|
"Network_ManageAdd_Submit": "Add device",
|
||||||
"Network_ManageAdd_Type": "Device Type",
|
"Network_ManageAdd_Type": "Device type",
|
||||||
"Network_ManageAdd_Type_text": "-- Select Type --",
|
"Network_ManageAdd_Type_text": "-- Select Type --",
|
||||||
"Network_ManageAssign": "Assign",
|
"Network_ManageAssign": "Assign",
|
||||||
"Network_ManageDel": "Delete Device",
|
"Network_ManageDel": "Delete device",
|
||||||
"Network_ManageDel_Name": "Device to delete",
|
"Network_ManageDel_Name": "Device to delete",
|
||||||
"Network_ManageDel_Name_text": "-- Select Device --",
|
"Network_ManageDel_Name_text": "-- Select device --",
|
||||||
"Network_ManageDel_Submit": "Delete",
|
"Network_ManageDel_Submit": "Delete",
|
||||||
"Network_ManageDevices": "Manage Devices",
|
"Network_ManageDevices": "Manage devices",
|
||||||
"Network_ManageEdit": "Update Device",
|
"Network_ManageEdit": "Update device",
|
||||||
"Network_ManageEdit_ID": "Device to update",
|
"Network_ManageEdit_ID": "Device to update",
|
||||||
"Network_ManageEdit_ID_text": "-- Select Device for editing --",
|
"Network_ManageEdit_ID_text": "-- Select device for editing --",
|
||||||
"Network_ManageEdit_Name": "New Device Name",
|
"Network_ManageEdit_Name": "New device name",
|
||||||
"Network_ManageEdit_Name_text": "Name without special characters",
|
"Network_ManageEdit_Name_text": "Name without special characters",
|
||||||
"Network_ManageEdit_Port": " New Port Count",
|
"Network_ManageEdit_Port": " New Port Count",
|
||||||
"Network_ManageEdit_Port_text": "leave blank for wifi and powerline",
|
"Network_ManageEdit_Port_text": "leave blank for wifi and powerline",
|
||||||
"Network_ManageEdit_Submit": "Save Changes",
|
"Network_ManageEdit_Submit": "Save Changes",
|
||||||
"Network_ManageEdit_Type": "New Device Type",
|
"Network_ManageEdit_Type": "New device type",
|
||||||
"Network_ManageEdit_Type_text": "-- Select Type --",
|
"Network_ManageEdit_Type_text": "-- Select type --",
|
||||||
"Network_ManageLeaf": "Manage assignment",
|
"Network_ManageLeaf": "Manage assignment",
|
||||||
"Network_ManageUnassign": "Unassign",
|
"Network_ManageUnassign": "Unassign",
|
||||||
"Network_NoAssignedDevices": "This network node does not have any assigned devices (leaf nodes). Assign one from bellow or go to the <b><i class=\"fa fa-info-circle\"></i> Details</b> tab of any device in <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Devices</b></a>, and assign it to a network <b><i class=\"fa fa-server\"></i> Node (MAC)</b> and <b><i class=\"fa fa-ethernet\"></i> Port</b> there.",
|
"Network_NoAssignedDevices": "This network node does not have any assigned devices (leaf nodes). Assign one from bellow or go to the <b><i class=\"fa fa-info-circle\"></i> Details</b> tab of any device in <a href=\"devices.php\"><b> <i class=\"fa fa-laptop\"></i> Devices</b></a>, and assign it to a network <b><i class=\"fa fa-server\"></i> Node (MAC)</b> and <b><i class=\"fa fa-ethernet\"></i> Port</b> there.",
|
||||||
@@ -528,15 +533,15 @@
|
|||||||
"Network_Root": "Root node",
|
"Network_Root": "Root node",
|
||||||
"Network_Root_Not_Configured": "Select a network device type, for example a <b>Gateway</b>, in the <b>Type</b> field of the <a href=\"deviceDetails.php?mac=Internet\">the Internet root device</a> to start configuring this screen. <br/><br/> More documentation can be found in the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank\">How to setup your Network page</a> guide",
|
"Network_Root_Not_Configured": "Select a network device type, for example a <b>Gateway</b>, in the <b>Type</b> field of the <a href=\"deviceDetails.php?mac=Internet\">the Internet root device</a> to start configuring this screen. <br/><br/> More documentation can be found in the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank\">How to setup your Network page</a> guide",
|
||||||
"Network_Root_Unconfigurable": "Unconfigurable root",
|
"Network_Root_Unconfigurable": "Unconfigurable root",
|
||||||
"Network_ShowArchived": "Show Archived",
|
"Network_ShowArchived": "Show archived",
|
||||||
"Network_ShowOffline": "Show Offline",
|
"Network_ShowOffline": "Show offline",
|
||||||
"Network_Table_Hostname": "Hostname",
|
"Network_Table_Hostname": "Hostname",
|
||||||
"Network_Table_IP": "IP",
|
"Network_Table_IP": "IP",
|
||||||
"Network_Table_State": "State",
|
"Network_Table_State": "State",
|
||||||
"Network_Title": "Network overview",
|
"Network_Title": "Network overview",
|
||||||
"Network_UnassignedDevices": "Unassigned devices",
|
"Network_UnassignedDevices": "Unassigned devices",
|
||||||
"Notifications_All": "All Notifications",
|
"Notifications_All": "All notifications",
|
||||||
"Notifications_Mark_All_Read": "Mark All Read",
|
"Notifications_Mark_All_Read": "Mark all read",
|
||||||
"PIALERT_WEB_PASSWORD_description": "The default password is <code>123456</code>. To change the password run <code>/app/back/pialert-cli</code> in the container or use the <a onclick=\"toggleAllSettings()\" href=\"#SETPWD_RUN\"><code>SETPWD_RUN</code> Set password plugin</a>.",
|
"PIALERT_WEB_PASSWORD_description": "The default password is <code>123456</code>. To change the password run <code>/app/back/pialert-cli</code> in the container or use the <a onclick=\"toggleAllSettings()\" href=\"#SETPWD_RUN\"><code>SETPWD_RUN</code> Set password plugin</a>.",
|
||||||
"PIALERT_WEB_PASSWORD_name": "Login password",
|
"PIALERT_WEB_PASSWORD_name": "Login password",
|
||||||
"PIALERT_WEB_PROTECTION_description": "When enabled a login dialog is displayed. Read below carefully if you get locked out of your instance.",
|
"PIALERT_WEB_PROTECTION_description": "When enabled a login dialog is displayed. Read below carefully if you get locked out of your instance.",
|
||||||
@@ -562,17 +567,17 @@
|
|||||||
"Presence_Key_OnlineNow_desc": "Device detected in the last scan as online.",
|
"Presence_Key_OnlineNow_desc": "Device detected in the last scan as online.",
|
||||||
"Presence_Key_OnlinePast": "Past online",
|
"Presence_Key_OnlinePast": "Past online",
|
||||||
"Presence_Key_OnlinePastMiss": "Past online (miss-match)",
|
"Presence_Key_OnlinePastMiss": "Past online (miss-match)",
|
||||||
"Presence_Key_OnlinePastMiss_desc": "Device online in the past, but currently offline, but the start session might be missing or has conflicting data. (might be a bug - please submit a PR if you know how to fix it - I'm a bit lost in code here)",
|
"Presence_Key_OnlinePastMiss_desc": "Device online in the past, but currently offline, but the start session might be missing or has conflicting data.",
|
||||||
"Presence_Key_OnlinePast_desc": "Device online in the past, but currently offline.",
|
"Presence_Key_OnlinePast_desc": "Device online in the past, but currently offline.",
|
||||||
"Presence_Loading": "Loading…",
|
"Presence_Loading": "Loading…",
|
||||||
"Presence_Shortcut_AllDevices": "My Devices",
|
"Presence_Shortcut_AllDevices": "My devices",
|
||||||
"Presence_Shortcut_Archived": "Archived",
|
"Presence_Shortcut_Archived": "Archived",
|
||||||
"Presence_Shortcut_Connected": "Connected",
|
"Presence_Shortcut_Connected": "Connected",
|
||||||
"Presence_Shortcut_Devices": "Devices",
|
"Presence_Shortcut_Devices": "Devices",
|
||||||
"Presence_Shortcut_DownAlerts": "Down Alerts",
|
"Presence_Shortcut_DownAlerts": "Down Alerts",
|
||||||
"Presence_Shortcut_Favorites": "Favorites",
|
"Presence_Shortcut_Favorites": "Favorites",
|
||||||
"Presence_Shortcut_NewDevices": "New Devices",
|
"Presence_Shortcut_NewDevices": "New devices",
|
||||||
"Presence_Title": "Presence by Device",
|
"Presence_Title": "Presence by device",
|
||||||
"REFRESH_FQDN_description": "Rescans all devices and refreshes their Fully Qualified Domain Name (FQDN). If disabled, only devices without a known name are scanned to improve performance. In this case, FQDN is updated only during initial device discovery.",
|
"REFRESH_FQDN_description": "Rescans all devices and refreshes their Fully Qualified Domain Name (FQDN). If disabled, only devices without a known name are scanned to improve performance. In this case, FQDN is updated only during initial device discovery.",
|
||||||
"REFRESH_FQDN_name": "Refresh FQDN",
|
"REFRESH_FQDN_name": "Refresh FQDN",
|
||||||
"REPORT_DASHBOARD_URL_description": "This URL is used as the base for generating links in HTML reports (e.g.: emails). Enter full URL starting with <code>http://</code> including the port number (no trailing slash <code>/</code>).",
|
"REPORT_DASHBOARD_URL_description": "This URL is used as the base for generating links in HTML reports (e.g.: emails). Enter full URL starting with <code>http://</code> including the port number (no trailing slash <code>/</code>).",
|
||||||
@@ -582,8 +587,8 @@
|
|||||||
"REPORT_MAIL_name": "Enable email",
|
"REPORT_MAIL_name": "Enable email",
|
||||||
"REPORT_TITLE": "Report",
|
"REPORT_TITLE": "Report",
|
||||||
"RandomMAC_hover": "Autodetected - indicates if the device randomizes it's MAC address. You can exclude specific MACs with the UI_NOT_RANDOM_MAC setting. Click to find out more.",
|
"RandomMAC_hover": "Autodetected - indicates if the device randomizes it's MAC address. You can exclude specific MACs with the UI_NOT_RANDOM_MAC setting. Click to find out more.",
|
||||||
"Reports_Sent_Log": "Sent Reports Log",
|
"Reports_Sent_Log": "Sent reports log",
|
||||||
"SCAN_SUBNETS_description": "Most on-network scanners (ARP-SCAN, NMAP, NSLOOKUP, DIG) rely on scanning specific network interfaces and subnets. Check the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">subnets documentation</a> for help on this setting, especially VLANs, what VLANs are supported, or how to figure out the network mask and your interface. <br/> <br/> An alternative to on-network scanners is to enable some other Device scanners/importers that don't rely on NetAlert<sup>X</sup> having access to the network (UNIFI, dhcp.leases, PiHole, etc.). <br/> <br/> Note: The scan time itself depends on the number of IP addresses to check, so set this up carefully with the appropriate network mask and interface.",
|
"SCAN_SUBNETS_description": "Most on-network scanners (ARP-SCAN, NMAP, NSLOOKUP, DIG) rely on scanning specific network interfaces and subnets. Check the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">subnets documentation</a> for help on this setting, especially VLANs, what VLANs are supported, or how to figure out the network mask and your interface. <br/> <br/> An alternative to on-network scanners is to enable some other device scanners/importers that don't rely on NetAlert<sup>X</sup> having access to the network (UNIFI, dhcp.leases, PiHole, etc.). <br/> <br/> Note: The scan time itself depends on the number of IP addresses to check, so set this up carefully with the appropriate network mask and interface.",
|
||||||
"SCAN_SUBNETS_name": "Networks to scan",
|
"SCAN_SUBNETS_name": "Networks to scan",
|
||||||
"SYSTEM_TITLE": "System Information",
|
"SYSTEM_TITLE": "System Information",
|
||||||
"Setting_Override": "Override value",
|
"Setting_Override": "Override value",
|
||||||
@@ -591,8 +596,9 @@
|
|||||||
"Settings_Metadata_Toggle": "Show/hide metadata for the given setting.",
|
"Settings_Metadata_Toggle": "Show/hide metadata for the given setting.",
|
||||||
"Settings_Show_Description": "Show setting description.",
|
"Settings_Show_Description": "Show setting description.",
|
||||||
"Settings_device_Scanners_desync": "⚠ Device scanner schedules are out-of-sync.",
|
"Settings_device_Scanners_desync": "⚠ Device scanner schedules are out-of-sync.",
|
||||||
"Settings_device_Scanners_desync_popup": "Schedules of devices scanners (<code>*_RUN_SCHD</code>) are not the same. This will result into inconsistent device online/offline notifications. Unless this is intended, please use the same schedule for all enabled <b>🔍Device scanners</b>.",
|
"Settings_device_Scanners_desync_popup": "Schedules of devices scanners (<code>*_RUN_SCHD</code>) are not the same. This will result into inconsistent device online/offline notifications. Unless this is intended, please use the same schedule for all enabled <b>🔍device scanners</b>.",
|
||||||
"Speedtest_Results": "Speedtest Results",
|
"Speedtest_Results": "Speedtest Results",
|
||||||
|
"Systeminfo_AvailableIps": "Available IPs",
|
||||||
"Systeminfo_CPU": "CPU",
|
"Systeminfo_CPU": "CPU",
|
||||||
"Systeminfo_CPU_Cores": "CPU Cores:",
|
"Systeminfo_CPU_Cores": "CPU Cores:",
|
||||||
"Systeminfo_CPU_Name": "CPU Name:",
|
"Systeminfo_CPU_Name": "CPU Name:",
|
||||||
@@ -666,18 +672,18 @@
|
|||||||
"Systeminfo_System_Uname": "Uname:",
|
"Systeminfo_System_Uname": "Uname:",
|
||||||
"Systeminfo_System_Uptime": "Uptime:",
|
"Systeminfo_System_Uptime": "Uptime:",
|
||||||
"Systeminfo_This_Client": "This Client",
|
"Systeminfo_This_Client": "This Client",
|
||||||
"Systeminfo_USB_Devices": "USB Devices",
|
"Systeminfo_USB_Devices": "USB devices",
|
||||||
"TICKER_MIGRATE_TO_NETALERTX": "⚠ Old mount locations detected. Follow <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/MIGRATION.md\" target=\"_blank\">this guide</a> to migrate to the new <code>/app/config</code> and <code>/app/db</code> folders and the <code>netalertx</code> container.",
|
"TICKER_MIGRATE_TO_NETALERTX": "⚠ Old mount locations detected. Follow <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/MIGRATION.md\" target=\"_blank\">this guide</a> to migrate to the new <code>/app/config</code> and <code>/app/db</code> folders and the <code>netalertx</code> container.",
|
||||||
"TIMEZONE_description": "Time zone to display stats correctly. Find your time zone <a target=\"_blank\" href=\"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\" rel=\"nofollow\">here</a>.",
|
"TIMEZONE_description": "Time zone to display stats correctly. Find your time zone <a target=\"_blank\" href=\"https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\" rel=\"nofollow\">here</a>.",
|
||||||
"TIMEZONE_name": "Time zone",
|
"TIMEZONE_name": "Time zone",
|
||||||
"UI_DEV_SECTIONS_description": "Select which UI elements to hide in the Devices pages.",
|
"UI_DEV_SECTIONS_description": "Select which UI elements to hide in the devices pages.",
|
||||||
"UI_DEV_SECTIONS_name": "Hide Devices Sections",
|
"UI_DEV_SECTIONS_name": "Hide devices sections",
|
||||||
"UI_ICONS_description": "A list of pre-defined icons. Proceed with caution, the preferred way to add icons is described in the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">Icons documentation</a>. You can add a base64-encoded SVG HTML or Font-awesome HTML tag.",
|
"UI_ICONS_description": "A list of pre-defined icons. Proceed with caution, the preferred way to add icons is described in the <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">Icons documentation</a>. You can add a base64-encoded SVG HTML or Font-awesome HTML tag.",
|
||||||
"UI_ICONS_name": "Pre-defined icons",
|
"UI_ICONS_name": "Pre-defined icons",
|
||||||
"UI_LANG_description": "Select the preferred UI language. Help translating or suggest languages in the online portal of <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
|
"UI_LANG_description": "Select the preferred UI language. Help translating or suggest languages in the online portal of <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
|
||||||
"UI_LANG_name": "UI Language",
|
"UI_LANG_name": "UI Language",
|
||||||
"UI_MY_DEVICES_description": "Devices of which statuses should be shown in the default <b>My Devices</b> view.",
|
"UI_MY_DEVICES_description": "Devices of which statuses should be shown in the default <b>My devices</b> view.",
|
||||||
"UI_MY_DEVICES_name": "Show in My Devices view",
|
"UI_MY_DEVICES_name": "Show in My devices view",
|
||||||
"UI_NOT_RANDOM_MAC_description": "Mac prefixes which shouldn't be marked as Random devices. Enter for example <code>52</code> to exclude devices starting with <code>52:xx:xx:xx:xx:xx</code> from being marked as devices with a random MAC address.",
|
"UI_NOT_RANDOM_MAC_description": "Mac prefixes which shouldn't be marked as Random devices. Enter for example <code>52</code> to exclude devices starting with <code>52:xx:xx:xx:xx:xx</code> from being marked as devices with a random MAC address.",
|
||||||
"UI_NOT_RANDOM_MAC_name": "Don't mark as Random",
|
"UI_NOT_RANDOM_MAC_name": "Don't mark as Random",
|
||||||
"UI_PRESENCE_description": "Select what statuses should be shown in the <b>Device presence</b> chart in the <a href=\"/devices.php\" target=\"_blank\">Devices</a> page.",
|
"UI_PRESENCE_description": "Select what statuses should be shown in the <b>Device presence</b> chart in the <a href=\"/devices.php\" target=\"_blank\">Devices</a> page.",
|
||||||
@@ -718,7 +724,7 @@
|
|||||||
"devices_old": "Refreshing…",
|
"devices_old": "Refreshing…",
|
||||||
"general_event_description": "The event you have triggered might take a while until background processes finish. The execution ended once the below execution queue empties (Check the <a href='/maintenance.php#tab_Logging'>error log</a> if you encounter issues). <br/> <br/> Execution queue:",
|
"general_event_description": "The event you have triggered might take a while until background processes finish. The execution ended once the below execution queue empties (Check the <a href='/maintenance.php#tab_Logging'>error log</a> if you encounter issues). <br/> <br/> Execution queue:",
|
||||||
"general_event_title": "Executing an ad-hoc event",
|
"general_event_title": "Executing an ad-hoc event",
|
||||||
"go_to_device_event_tooltip": "Navigate to the Device",
|
"go_to_device_event_tooltip": "Navigate to the device",
|
||||||
"go_to_node_event_tooltip": "Navigate to the Network page of the given node",
|
"go_to_node_event_tooltip": "Navigate to the Network page of the given node",
|
||||||
"new_version_available": "A new version is available.",
|
"new_version_available": "A new version is available.",
|
||||||
"report_guid": "Notification guid:",
|
"report_guid": "Notification guid:",
|
||||||
@@ -731,7 +737,7 @@
|
|||||||
"settings_core_label": "Core",
|
"settings_core_label": "Core",
|
||||||
"settings_device_scanners": "Device scanners used to discover devices that write into the CurrentScan database table.",
|
"settings_device_scanners": "Device scanners used to discover devices that write into the CurrentScan database table.",
|
||||||
"settings_device_scanners_icon": "fa-solid fa-magnifying-glass-plus",
|
"settings_device_scanners_icon": "fa-solid fa-magnifying-glass-plus",
|
||||||
"settings_device_scanners_info": "Load even more Device Scanners with the <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a> setting",
|
"settings_device_scanners_info": "Load more device scanners with the <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a> setting",
|
||||||
"settings_device_scanners_label": "Device scanners",
|
"settings_device_scanners_label": "Device scanners",
|
||||||
"settings_enabled": "Enabled settings",
|
"settings_enabled": "Enabled settings",
|
||||||
"settings_enabled_icon": "fa-solid fa-toggle-on",
|
"settings_enabled_icon": "fa-solid fa-toggle-on",
|
||||||
|
|||||||
94
front/php/templates/language/es_es.json
Normal file → Executable file
94
front/php/templates/language/es_es.json
Normal file → Executable file
@@ -5,14 +5,6 @@
|
|||||||
"API_TOKEN_name": "Token de la API",
|
"API_TOKEN_name": "Token de la API",
|
||||||
"API_display_name": "API",
|
"API_display_name": "API",
|
||||||
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
|
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
|
||||||
"APPRISE_HOST_description": "URL del host de Apprise que comienza con <code>http://</code> o <code>https://</code>. (no olvide incluir <code>/notify</code> al final)",
|
|
||||||
"APPRISE_HOST_name": "URL del host de Apprise",
|
|
||||||
"APPRISE_PAYLOAD_description": "Seleccione el tipo de carga útil enviada a Apprise. Por ejemplo, <code>html</code> funciona bien con correos electrónicos, <code>text</code> con aplicaciones de chat, como Telegram.",
|
|
||||||
"APPRISE_PAYLOAD_name": "Tipo de carga",
|
|
||||||
"APPRISE_SIZE_description": "El tamaño máximo de la carga útil de información como número de caracteres en la cadena pasada. Si supera el límite, se truncará y se agregará un mensaje <code>(text was truncated)</code>.",
|
|
||||||
"APPRISE_SIZE_name": "Tamaño máximo de carga útil",
|
|
||||||
"APPRISE_URL_description": "Informar de la URL de destino de la notificación. Por ejemplo, para Telegram sería <code>tgram://{bot_token}/{chat_id}</code>.",
|
|
||||||
"APPRISE_URL_name": "URL de notificación de Apprise",
|
|
||||||
"About_Design": "Diseñado para:",
|
"About_Design": "Diseñado para:",
|
||||||
"About_Exit": "Salir",
|
"About_Exit": "Salir",
|
||||||
"About_Title": "Escáner de seguridad de la red y marco de notificaciones",
|
"About_Title": "Escáner de seguridad de la red y marco de notificaciones",
|
||||||
@@ -50,7 +42,7 @@
|
|||||||
"BackDevices_Backup_Failed": "La copia de seguridad se ejecutó parcialmente con éxito. El archivo no se puede crear o está vacío.",
|
"BackDevices_Backup_Failed": "La copia de seguridad se ejecutó parcialmente con éxito. El archivo no se puede crear o está vacío.",
|
||||||
"BackDevices_Backup_okay": "La copia de seguridad ejecutada con éxito con el nuevo archivo",
|
"BackDevices_Backup_okay": "La copia de seguridad ejecutada con éxito con el nuevo archivo",
|
||||||
"BackDevices_DBTools_DelDevError_a": "Error de eliminación del dispositivo",
|
"BackDevices_DBTools_DelDevError_a": "Error de eliminación del dispositivo",
|
||||||
"BackDevices_DBTools_DelDevError_b": "Error de eliminación de dispositivos",
|
"BackDevices_DBTools_DelDevError_b": "Error eliminando dispositivos",
|
||||||
"BackDevices_DBTools_DelDev_a": "Dispositivo eliminado",
|
"BackDevices_DBTools_DelDev_a": "Dispositivo eliminado",
|
||||||
"BackDevices_DBTools_DelDev_b": "Dispositivos eliminados",
|
"BackDevices_DBTools_DelDev_b": "Dispositivos eliminados",
|
||||||
"BackDevices_DBTools_DelEvents": "Eventos eliminados",
|
"BackDevices_DBTools_DelEvents": "Eventos eliminados",
|
||||||
@@ -76,7 +68,7 @@
|
|||||||
"DAYS_TO_KEEP_EVENTS_name": "Eliminar eventos anteriores a",
|
"DAYS_TO_KEEP_EVENTS_name": "Eliminar eventos anteriores a",
|
||||||
"DISCOVER_PLUGINS_description": "Desactive esta opción para acelerar la inicialización y el ahorro de ajustes. Cuando está desactivado, los plugins no se descubren y no puede añadir nuevos plugins a la configuración <code>LOADED_PLUGINS</code>.",
|
"DISCOVER_PLUGINS_description": "Desactive esta opción para acelerar la inicialización y el ahorro de ajustes. Cuando está desactivado, los plugins no se descubren y no puede añadir nuevos plugins a la configuración <code>LOADED_PLUGINS</code>.",
|
||||||
"DISCOVER_PLUGINS_name": "Descubrir plugins",
|
"DISCOVER_PLUGINS_name": "Descubrir plugins",
|
||||||
"DevDetail_Children_Title": "",
|
"DevDetail_Children_Title": "Relaciones hijo",
|
||||||
"DevDetail_Copy_Device_Title": "Copiar detalles del dispositivo",
|
"DevDetail_Copy_Device_Title": "Copiar detalles del dispositivo",
|
||||||
"DevDetail_Copy_Device_Tooltip": "Copiar detalles del dispositivo de la lista desplegable. Todo en esta página se sobrescribirá",
|
"DevDetail_Copy_Device_Tooltip": "Copiar detalles del dispositivo de la lista desplegable. Todo en esta página se sobrescribirá",
|
||||||
"DevDetail_CustomProperties_Title": "Propiedades personalizadas",
|
"DevDetail_CustomProperties_Title": "Propiedades personalizadas",
|
||||||
@@ -89,15 +81,15 @@
|
|||||||
"DevDetail_EveandAl_NewDevice_Tooltip": "Mostrará el estado Nuevo para el dispositivo y lo incluirá en las listas cuando el filtro Nuevos dispositivos esté activo. No afecta a las notificaciones.",
|
"DevDetail_EveandAl_NewDevice_Tooltip": "Mostrará el estado Nuevo para el dispositivo y lo incluirá en las listas cuando el filtro Nuevos dispositivos esté activo. No afecta a las notificaciones.",
|
||||||
"DevDetail_EveandAl_RandomMAC": "MAC al azar",
|
"DevDetail_EveandAl_RandomMAC": "MAC al azar",
|
||||||
"DevDetail_EveandAl_ScanCycle": "Ciclo de escaneo",
|
"DevDetail_EveandAl_ScanCycle": "Ciclo de escaneo",
|
||||||
"DevDetail_EveandAl_ScanCycle_a": "Escanear Dispositivo",
|
"DevDetail_EveandAl_ScanCycle_a": "Escanear dispositivo",
|
||||||
"DevDetail_EveandAl_ScanCycle_z": "No Escanear Dispositivo",
|
"DevDetail_EveandAl_ScanCycle_z": "No escanear dispositivo",
|
||||||
"DevDetail_EveandAl_Skip": "Omitir notificaciones repetidas durante",
|
"DevDetail_EveandAl_Skip": "Omitir notificaciones repetidas durante",
|
||||||
"DevDetail_EveandAl_Title": "Configuración de eventos y alertas",
|
"DevDetail_EveandAl_Title": "Configuración de eventos y alertas",
|
||||||
"DevDetail_Events_CheckBox": "Ocultar eventos de conexión",
|
"DevDetail_Events_CheckBox": "Ocultar eventos de conexión",
|
||||||
"DevDetail_GoToNetworkNode": "Navegar a la página de Internet del nodo seleccionado.",
|
"DevDetail_GoToNetworkNode": "Navegar a la página de Internet del nodo seleccionado.",
|
||||||
"DevDetail_Icon": "Icono",
|
"DevDetail_Icon": "Icono",
|
||||||
"DevDetail_Icon_Descr": "Ingrese un nombre de icono de fuente awesome sin el prefijo fa- o con clase completa, por ejemplo: fa fa-skin fa-apple.",
|
"DevDetail_Icon_Descr": "Ingrese un nombre de icono de fuente awesome sin el prefijo fa- o con clase completa, por ejemplo: fa fa-skin fa-apple.",
|
||||||
"DevDetail_Loading": "Cargando ...",
|
"DevDetail_Loading": "Cargando…",
|
||||||
"DevDetail_MainInfo_Comments": "Comentario",
|
"DevDetail_MainInfo_Comments": "Comentario",
|
||||||
"DevDetail_MainInfo_Favorite": "Favorito",
|
"DevDetail_MainInfo_Favorite": "Favorito",
|
||||||
"DevDetail_MainInfo_Group": "Grupo",
|
"DevDetail_MainInfo_Group": "Grupo",
|
||||||
@@ -113,11 +105,11 @@
|
|||||||
"DevDetail_MainInfo_Type": "Tipo",
|
"DevDetail_MainInfo_Type": "Tipo",
|
||||||
"DevDetail_MainInfo_Vendor": "Proveedor",
|
"DevDetail_MainInfo_Vendor": "Proveedor",
|
||||||
"DevDetail_MainInfo_mac": "MAC",
|
"DevDetail_MainInfo_mac": "MAC",
|
||||||
"DevDetail_NavToChildNode": "",
|
"DevDetail_NavToChildNode": "Abrir nodo hijo",
|
||||||
"DevDetail_Network_Node_hover": "Seleccione el dispositivo de red principal al que está conectado el dispositivo actual para completar el árbol de Red.",
|
"DevDetail_Network_Node_hover": "Seleccione el dispositivo de red principal al que está conectado el dispositivo actual para completar el árbol de Red.",
|
||||||
"DevDetail_Network_Port_hover": "El puerto al que está conectado este dispositivo en el dispositivo de red principal. Si se deja vacío, se muestra un icono de wifi en el árbol de Red.",
|
"DevDetail_Network_Port_hover": "El puerto al que está conectado este dispositivo en el dispositivo de red principal. Si se deja vacío, se muestra un icono de wifi en el árbol de Red.",
|
||||||
"DevDetail_Nmap_Scans": "Escaneos de Nmap",
|
"DevDetail_Nmap_Scans": "Escaneos de Nmap",
|
||||||
"DevDetail_Nmap_Scans_desc": "Aquí puede ejecutar escaneos NMAP manuales. También puede programar escaneos NMAP automáticos regulares a través del complemento Servicios y puertos (NMAP). Dirígete a <a href='/settings.php' target='_blank'>Configuración</a> para obtener más información",
|
"DevDetail_Nmap_Scans_desc": "Aquí puede ejecutar escaneos NMAP manuales. También puede programar escaneos NMAP automáticos regulares a través del complemento Servicios y puertos (NMAP). Dirígete a <a href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Documentación</a> para obtener más información",
|
||||||
"DevDetail_Nmap_buttonDefault": "Escaneado predeterminado",
|
"DevDetail_Nmap_buttonDefault": "Escaneado predeterminado",
|
||||||
"DevDetail_Nmap_buttonDefault_text": "Escaneo predeterminado: NMAP escanea los 1,000 puertos principales para cada protocolo de escaneo solicitado. Esto atrapa aproximadamente el 93% de los puertos TCP y el 49% de los puertos UDP. (aproximadamente 5 segundos)",
|
"DevDetail_Nmap_buttonDefault_text": "Escaneo predeterminado: NMAP escanea los 1,000 puertos principales para cada protocolo de escaneo solicitado. Esto atrapa aproximadamente el 93% de los puertos TCP y el 49% de los puertos UDP. (aproximadamente 5 segundos)",
|
||||||
"DevDetail_Nmap_buttonDetail": "Escaneo detallado",
|
"DevDetail_Nmap_buttonDetail": "Escaneo detallado",
|
||||||
@@ -189,7 +181,7 @@
|
|||||||
"DevDetail_Tools_WOL": "Enviar comando WOL a ",
|
"DevDetail_Tools_WOL": "Enviar comando WOL a ",
|
||||||
"DevDetail_Tools_WOL_noti": "Wake-on-LAN",
|
"DevDetail_Tools_WOL_noti": "Wake-on-LAN",
|
||||||
"DevDetail_Tools_WOL_noti_text": "El comando de Wake-on-LAN en enviado a la dirección de escucha. Si el dispositivo no está en la misma subred/vlan que NetAlertX, el dispositivo no responderá.",
|
"DevDetail_Tools_WOL_noti_text": "El comando de Wake-on-LAN en enviado a la dirección de escucha. Si el dispositivo no está en la misma subred/vlan que NetAlertX, el dispositivo no responderá.",
|
||||||
"DevDetail_Type_hover": "El tipo de dispositivo. Si selecciona cualquiera de los dispositivos de la red predefinidos (por ejemplo: AP, Firewall, enrutador, conmutador...), aparecerán en la configuración del árbol de redes como posibles nodos de la red principal.",
|
"DevDetail_Type_hover": "El tipo de dispositivo. Si selecciona cualquiera de los dispositivos de la red predefinidos (por ejemplo: AP, Firewall, enrutador, conmutador ...), aparecerán en la configuración del árbol de redes como posibles nodos de la red principal.",
|
||||||
"DevDetail_Vendor_hover": "El proveedor debe ser detectado automáticamente. Puede sobrescribir o agregar su valor personalizado.",
|
"DevDetail_Vendor_hover": "El proveedor debe ser detectado automáticamente. Puede sobrescribir o agregar su valor personalizado.",
|
||||||
"DevDetail_WOL_Title": "<i class=\"fa fa-power-off\"></i> Wake-on-LAN",
|
"DevDetail_WOL_Title": "<i class=\"fa fa-power-off\"></i> Wake-on-LAN",
|
||||||
"DevDetail_button_AddIcon": "Añadir un nuevo icono",
|
"DevDetail_button_AddIcon": "Añadir un nuevo icono",
|
||||||
@@ -206,25 +198,25 @@
|
|||||||
"DevDetail_button_Save": "Guardar",
|
"DevDetail_button_Save": "Guardar",
|
||||||
"DeviceEdit_ValidMacIp": "Introduzca una dirección <b>Mac</b> y una dirección <b>IP</b> válidas .",
|
"DeviceEdit_ValidMacIp": "Introduzca una dirección <b>Mac</b> y una dirección <b>IP</b> válidas .",
|
||||||
"Device_MultiEdit": "Edición múltiple",
|
"Device_MultiEdit": "Edición múltiple",
|
||||||
"Device_MultiEdit_Backup": "Tenga cuidado, ingresar valores incorrectos o romperá su configuración. Por favor, haga una copia de seguridad de su base de datos o de la configuración de los dispositivos primero (<a href=\"php/server/devices.php?action=ExportCSV\">haga clic para descargar <i class=\"fa-solid fa-download fa-bounce\"></i></a>). Lea cómo recuperar dispositivos de este archivo en la documentación de <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\"_blank\">Copia de seguridad</a>.",
|
"Device_MultiEdit_Backup": "Tenga cuidado, ingresar valores incorrectos o romperá su configuración. Por favor, haga una copia de seguridad de su base de datos o de la configuración de los dispositivos primero (<a href=\"php/server/devices.php?action=ExportCSV\">haga clic para descargar <i class=\"fa-solid fa-download fa-bounce\"></i></a>). Lea cómo recuperar dispositivos de este archivo en la documentación de <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\"_blank\">Copia de seguridad</a>. Para aplicar sus cambios haga click en el ícono de <b>Guardar<i class=\"fa-solid fa-save\"></i></b> en cada campo que quiera actualizar.",
|
||||||
"Device_MultiEdit_Fields": "Editar campos:",
|
"Device_MultiEdit_Fields": "Editar campos:",
|
||||||
"Device_MultiEdit_MassActions": "Acciones masivas:",
|
"Device_MultiEdit_MassActions": "Acciones masivas:",
|
||||||
"Device_MultiEdit_Tooltip": "Cuidado. Al hacer clic se aplicará el valor de la izquierda a todos los dispositivos seleccionados anteriormente.",
|
"Device_MultiEdit_Tooltip": "Cuidado. Al hacer clic se aplicará el valor de la izquierda a todos los dispositivos seleccionados anteriormente.",
|
||||||
"Device_Searchbox": "Búsqueda",
|
"Device_Searchbox": "Búsqueda",
|
||||||
"Device_Shortcut_AllDevices": "Mis dispositivos",
|
"Device_Shortcut_AllDevices": "Mis dispositivos",
|
||||||
"Device_Shortcut_AllNodes": "",
|
"Device_Shortcut_AllNodes": "Todos los nodos",
|
||||||
"Device_Shortcut_Archived": "Archivado(s)",
|
"Device_Shortcut_Archived": "Archivado(s)",
|
||||||
"Device_Shortcut_Connected": "Conectado(s)",
|
"Device_Shortcut_Connected": "Conectado(s)",
|
||||||
"Device_Shortcut_Devices": "Dispositivos",
|
"Device_Shortcut_Devices": "Dispositivos",
|
||||||
"Device_Shortcut_DownAlerts": "Caído y sin conexión",
|
"Device_Shortcut_DownAlerts": "Caído y sin conexión",
|
||||||
"Device_Shortcut_DownOnly": "Caído",
|
"Device_Shortcut_DownOnly": "Caído",
|
||||||
"Device_Shortcut_Favorites": "Favorito(s)",
|
"Device_Shortcut_Favorites": "Favorito(s)",
|
||||||
"Device_Shortcut_NewDevices": "Nuevo(s)",
|
"Device_Shortcut_NewDevices": "Nuevos dispositivos",
|
||||||
"Device_Shortcut_OnlineChart": "Presencia del dispositivo a lo largo del tiempo",
|
"Device_Shortcut_OnlineChart": "Presencia del dispositivo a lo largo del tiempo",
|
||||||
"Device_TableHead_AlertDown": "Alerta desactivada",
|
"Device_TableHead_AlertDown": "Alerta desactivada",
|
||||||
"Device_TableHead_Connected_Devices": "Conexiones",
|
"Device_TableHead_Connected_Devices": "Conexiones",
|
||||||
"Device_TableHead_CustomProps": "Propiedades / Acciones",
|
"Device_TableHead_CustomProps": "Propiedades / Acciones",
|
||||||
"Device_TableHead_FQDN": "",
|
"Device_TableHead_FQDN": "FQDN",
|
||||||
"Device_TableHead_Favorite": "Favorito",
|
"Device_TableHead_Favorite": "Favorito",
|
||||||
"Device_TableHead_FirstSession": "1ra. sesión",
|
"Device_TableHead_FirstSession": "1ra. sesión",
|
||||||
"Device_TableHead_GUID": "GUID",
|
"Device_TableHead_GUID": "GUID",
|
||||||
@@ -239,11 +231,11 @@
|
|||||||
"Device_TableHead_Name": "Nombre",
|
"Device_TableHead_Name": "Nombre",
|
||||||
"Device_TableHead_NetworkSite": "Lugar de la red",
|
"Device_TableHead_NetworkSite": "Lugar de la red",
|
||||||
"Device_TableHead_Owner": "Propietario",
|
"Device_TableHead_Owner": "Propietario",
|
||||||
"Device_TableHead_ParentRelType": "",
|
"Device_TableHead_ParentRelType": "Tipo de relación",
|
||||||
"Device_TableHead_Parent_MAC": "Nodo principal de la red",
|
"Device_TableHead_Parent_MAC": "Nodo principal de la red",
|
||||||
"Device_TableHead_Port": "Puerto",
|
"Device_TableHead_Port": "Puerto",
|
||||||
"Device_TableHead_PresentLastScan": "Historial",
|
"Device_TableHead_PresentLastScan": "Historial",
|
||||||
"Device_TableHead_ReqNicsOnline": "",
|
"Device_TableHead_ReqNicsOnline": "Requiere que la interfaz de red (NIC) esté conectada",
|
||||||
"Device_TableHead_RowID": "ID de fila",
|
"Device_TableHead_RowID": "ID de fila",
|
||||||
"Device_TableHead_Rowid": "ID de fila",
|
"Device_TableHead_Rowid": "ID de fila",
|
||||||
"Device_TableHead_SSID": "SSID",
|
"Device_TableHead_SSID": "SSID",
|
||||||
@@ -266,7 +258,7 @@
|
|||||||
"ENCRYPTION_KEY_name": "Llave de cifrado",
|
"ENCRYPTION_KEY_name": "Llave de cifrado",
|
||||||
"Email_display_name": "Email",
|
"Email_display_name": "Email",
|
||||||
"Email_icon": "<i class=\"fa fa-at\"></i>",
|
"Email_icon": "<i class=\"fa fa-at\"></i>",
|
||||||
"Events_Loading": "Cargando...",
|
"Events_Loading": "Cargando. . .",
|
||||||
"Events_Periodselect_All": "Toda la información",
|
"Events_Periodselect_All": "Toda la información",
|
||||||
"Events_Periodselect_LastMonth": "El mes pasado",
|
"Events_Periodselect_LastMonth": "El mes pasado",
|
||||||
"Events_Periodselect_LastWeek": "La semana pasada",
|
"Events_Periodselect_LastWeek": "La semana pasada",
|
||||||
@@ -277,7 +269,7 @@
|
|||||||
"Events_Shortcut_DownAlerts": "Alerta(s) de caída(s)",
|
"Events_Shortcut_DownAlerts": "Alerta(s) de caída(s)",
|
||||||
"Events_Shortcut_Events": "Eventos",
|
"Events_Shortcut_Events": "Eventos",
|
||||||
"Events_Shortcut_MissSessions": "Sesiones faltantes",
|
"Events_Shortcut_MissSessions": "Sesiones faltantes",
|
||||||
"Events_Shortcut_NewDevices": "Nuevo(s)",
|
"Events_Shortcut_NewDevices": "Nuevos dispositivos",
|
||||||
"Events_Shortcut_Sessions": "Sesiones",
|
"Events_Shortcut_Sessions": "Sesiones",
|
||||||
"Events_Shortcut_VoidSessions": "Sesiones anuladas",
|
"Events_Shortcut_VoidSessions": "Sesiones anuladas",
|
||||||
"Events_TableHead_AdditionalInfo": "Información adicional",
|
"Events_TableHead_AdditionalInfo": "Información adicional",
|
||||||
@@ -305,12 +297,13 @@
|
|||||||
"Gen_Add": "Añadir",
|
"Gen_Add": "Añadir",
|
||||||
"Gen_AddDevice": "Añadir dispositivo",
|
"Gen_AddDevice": "Añadir dispositivo",
|
||||||
"Gen_Add_All": "Añadir todo",
|
"Gen_Add_All": "Añadir todo",
|
||||||
"Gen_All_Devices": "Todo los dispositivos",
|
"Gen_All_Devices": "Todos los dispositivos",
|
||||||
"Gen_AreYouSure": "¿Estás seguro?",
|
"Gen_AreYouSure": "¿Estás seguro?",
|
||||||
"Gen_Backup": "Ejecutar copia de seguridad",
|
"Gen_Backup": "Ejecutar copia de seguridad",
|
||||||
"Gen_Cancel": "Cancelar",
|
"Gen_Cancel": "Cancelar",
|
||||||
"Gen_Change": "Cambiar",
|
"Gen_Change": "Cambiar",
|
||||||
"Gen_Copy": "Ejecutar",
|
"Gen_Copy": "Ejecutar",
|
||||||
|
"Gen_CopyToClipboard": "",
|
||||||
"Gen_DataUpdatedUITakesTime": "Correcto - La interfaz puede tardar en actualizarse si se está ejecutando un escaneo.",
|
"Gen_DataUpdatedUITakesTime": "Correcto - La interfaz puede tardar en actualizarse si se está ejecutando un escaneo.",
|
||||||
"Gen_Delete": "Eliminar",
|
"Gen_Delete": "Eliminar",
|
||||||
"Gen_DeleteAll": "Eliminar todo",
|
"Gen_DeleteAll": "Eliminar todo",
|
||||||
@@ -318,7 +311,9 @@
|
|||||||
"Gen_Error": "Error",
|
"Gen_Error": "Error",
|
||||||
"Gen_Filter": "Filtro",
|
"Gen_Filter": "Filtro",
|
||||||
"Gen_Generate": "Generar",
|
"Gen_Generate": "Generar",
|
||||||
|
"Gen_InvalidMac": "",
|
||||||
"Gen_LockedDB": "Fallo - La base de datos puede estar bloqueada - Pulsa F1 -> Ajustes de desarrolladores -> Consola o prueba más tarde.",
|
"Gen_LockedDB": "Fallo - La base de datos puede estar bloqueada - Pulsa F1 -> Ajustes de desarrolladores -> Consola o prueba más tarde.",
|
||||||
|
"Gen_NetworkMask": "",
|
||||||
"Gen_Offline": "Desconectado",
|
"Gen_Offline": "Desconectado",
|
||||||
"Gen_Okay": "Aceptar",
|
"Gen_Okay": "Aceptar",
|
||||||
"Gen_Online": "En linea",
|
"Gen_Online": "En linea",
|
||||||
@@ -336,6 +331,7 @@
|
|||||||
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
||||||
"Gen_SelectToPreview": "Seleccionar para previsualizar",
|
"Gen_SelectToPreview": "Seleccionar para previsualizar",
|
||||||
"Gen_Selected_Devices": "Dispositivos seleccionados:",
|
"Gen_Selected_Devices": "Dispositivos seleccionados:",
|
||||||
|
"Gen_Subnet": "",
|
||||||
"Gen_Switch": "Cambiar",
|
"Gen_Switch": "Cambiar",
|
||||||
"Gen_Upd": "Actualizado correctamente",
|
"Gen_Upd": "Actualizado correctamente",
|
||||||
"Gen_Upd_Fail": "Fallo al actualizar",
|
"Gen_Upd_Fail": "Fallo al actualizar",
|
||||||
@@ -348,15 +344,15 @@
|
|||||||
"Gen_create_new_device_info": "Los dispositivos se suelen descubrir utilizando <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">plugins</a>. Sin embargo, en algunos casos, es posible que necesite agregar dispositivos manualmente. Para explorar escenarios específicos, consulte la documentación <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/REMOTE_NETWORKS.md\">Redes remotas</a>.",
|
"Gen_create_new_device_info": "Los dispositivos se suelen descubrir utilizando <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">plugins</a>. Sin embargo, en algunos casos, es posible que necesite agregar dispositivos manualmente. Para explorar escenarios específicos, consulte la documentación <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/REMOTE_NETWORKS.md\">Redes remotas</a>.",
|
||||||
"General_display_name": "General",
|
"General_display_name": "General",
|
||||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||||
"HRS_TO_KEEP_NEWDEV_description": "Se trata de una configuración de mantenimiento <b>BORRAR dispositivos</b>. Si está activado (<code>0</code> está desactivado), los dispositivos marcados como <b>Nuevo dispositivo</b> se eliminarán si su fecha de <b>primera sesión</b> es anterior a las horas especificadas en este ajuste. Use este ajuste si desea eliminar automáticamente <b>Nuevos dispositivos</b> después de <code>X</code> horas.",
|
"HRS_TO_KEEP_NEWDEV_description": "Esta es una configuración de mantenimiento <b>BORRAR dispositivos</b>. Si está activado (<code>0</code> está desactivado), los dispositivos marcados como <b>Nuevo dispositivo</b> se eliminarán si su fecha de <b>Primera Sesión</b> es anterior a las horas especificadas en este ajuste. Use este ajuste si desea eliminar automáticamente <b>Nuevos dispositivos</b> después de <code>X</code> horas.",
|
||||||
"HRS_TO_KEEP_NEWDEV_name": "Eliminar nuevos dispositivos después",
|
"HRS_TO_KEEP_NEWDEV_name": "Eliminar nuevos dispositivos después",
|
||||||
"HRS_TO_KEEP_OFFDEV_description": "Se trata de una configuración de mantenimiento <b>BORRAR dispositivos</b>. Si está activado (<code>0</code> está desactivado), los dispositivos que están <b>sin conexión</b> y su fecha de <b>última conexión</b> es anterior a las horas especificadas en este ajuste se eliminarán. Use este ajuste si desea eliminar automáticamente <b>los dispositivos sin conexión</b> después de que el <code>X</code> horas esté sin conexión.",
|
"HRS_TO_KEEP_OFFDEV_description": "Esta es una configuración de mantenimiento <b>BORRAR dispositivos</b>. Si está activado (<code>0</code> está desactivado), los dispositivos que están <b>Sin Conexión</b> y su fecha de <b>Última Conexión</b> es anterior a las horas especificadas en este ajuste se eliminarán. Use este ajuste si desea eliminar automáticamente <b>los dispositivos sin conexión</b> después de que el <code>X</code> horas esté sin conexión.",
|
||||||
"HRS_TO_KEEP_OFFDEV_name": "Borrar dispositivos sin conexión después de",
|
"HRS_TO_KEEP_OFFDEV_name": "Borrar dispositivos sin conexión después de",
|
||||||
"LOADED_PLUGINS_description": "¿Qué plugins cargar?. Agregar plugins puede ralentizar la aplicación. Obtén más información sobre los complementos que deben habilitarse, los tipos o las opciones de escaneo en los documentos de <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">plugins</a>. Los plugins descargados perderán tu configuración. Solo se pueden descargar los complementos <code>deshabilitados</code>.",
|
"LOADED_PLUGINS_description": "¿Qué plugins cargar?. Agregar plugins puede ralentizar la aplicación. Obtén más información sobre los complementos que deben habilitarse, los tipos o las opciones de escaneo en los documentos de <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">plugins</a>. Los plugins descargados perderán tu configuración. Solo se pueden descargar los complementos <code>deshabilitados</code>.",
|
||||||
"LOADED_PLUGINS_name": "Plugins cargados",
|
"LOADED_PLUGINS_name": "Plugins cargados",
|
||||||
"LOG_LEVEL_description": "Esto hará que el registro tenga más información. Util para depurar que eventos se van guardando en la base de datos.",
|
"LOG_LEVEL_description": "Esto hará que el registro tenga más información. Util para depurar que eventos se van guardando en la base de datos.",
|
||||||
"LOG_LEVEL_name": "Imprimir registros adicionales",
|
"LOG_LEVEL_name": "Imprimir registros adicionales",
|
||||||
"Loading": "Cargando...",
|
"Loading": "Cargando . . .",
|
||||||
"Login_Box": "Ingrese su contraseña",
|
"Login_Box": "Ingrese su contraseña",
|
||||||
"Login_Default_PWD": "La contraseña por defecto \"123456\" sigue activa.",
|
"Login_Default_PWD": "La contraseña por defecto \"123456\" sigue activa.",
|
||||||
"Login_Info": "Las contraseñas se establecen a través del plugin Establecer contraseña. Compruebe la <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">documentación SETPWD</a> si tiene problemas para iniciar sesión.",
|
"Login_Info": "Las contraseñas se establecen a través del plugin Establecer contraseña. Compruebe la <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">documentación SETPWD</a> si tiene problemas para iniciar sesión.",
|
||||||
@@ -388,11 +384,11 @@
|
|||||||
"Maint_PurgeLog": "Purgar los registros",
|
"Maint_PurgeLog": "Purgar los registros",
|
||||||
"Maint_RestartServer": "Restablecer el servidor",
|
"Maint_RestartServer": "Restablecer el servidor",
|
||||||
"Maint_Restart_Server_noti_text": "¿Estás seguro de que desea reiniciar el servidor backend? Esto puede causar inconsistencia en la aplicación. Primero haga una copia de seguridad de su configuración.<br/> <br/> Nota: Esto puede tardar unos minutos.",
|
"Maint_Restart_Server_noti_text": "¿Estás seguro de que desea reiniciar el servidor backend? Esto puede causar inconsistencia en la aplicación. Primero haga una copia de seguridad de su configuración.<br/> <br/> Nota: Esto puede tardar unos minutos.",
|
||||||
"Maintenance_InitCheck": "",
|
"Maintenance_InitCheck": "Validación inicial",
|
||||||
"Maintenance_InitCheck_Checking": "",
|
"Maintenance_InitCheck_Checking": "Validando . . .",
|
||||||
"Maintenance_InitCheck_QuickSetupGuide": "",
|
"Maintenance_InitCheck_QuickSetupGuide": "Asegúrece de seguir la <a href=\"https://jokob-sk.github.io/NetAlertX/INITIAL_SETUP/\" target=\"_blank\">guía de configuración rápida</a>.",
|
||||||
"Maintenance_InitCheck_Success": "",
|
"Maintenance_InitCheck_Success": "¡Aplicación inicializada con éxito!",
|
||||||
"Maintenance_ReCheck": "",
|
"Maintenance_ReCheck": "Reintentar validación",
|
||||||
"Maintenance_Running_Version": "Versión instalada",
|
"Maintenance_Running_Version": "Versión instalada",
|
||||||
"Maintenance_Status": "Situación",
|
"Maintenance_Status": "Situación",
|
||||||
"Maintenance_Title": "Herramientas de mantenimiento",
|
"Maintenance_Title": "Herramientas de mantenimiento",
|
||||||
@@ -475,7 +471,7 @@
|
|||||||
"Maintenance_Tools_Tab_UISettings": "Ajustes de interfaz",
|
"Maintenance_Tools_Tab_UISettings": "Ajustes de interfaz",
|
||||||
"Maintenance_arp_status": "Estado de la exploración",
|
"Maintenance_arp_status": "Estado de la exploración",
|
||||||
"Maintenance_arp_status_off": "está actualmente deshabilitado",
|
"Maintenance_arp_status_off": "está actualmente deshabilitado",
|
||||||
"Maintenance_arp_status_on": "escaneo(s) actualmente en ejecución",
|
"Maintenance_arp_status_on": "escaneo en ejecución",
|
||||||
"Maintenance_built_on": "Creada",
|
"Maintenance_built_on": "Creada",
|
||||||
"Maintenance_current_version": "No hay actualizaciones disponibles. Comprueba en que <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">se está trabajando</a>.",
|
"Maintenance_current_version": "No hay actualizaciones disponibles. Comprueba en que <a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">se está trabajando</a>.",
|
||||||
"Maintenance_database_backup": "Copias de seguridad de BD",
|
"Maintenance_database_backup": "Copias de seguridad de BD",
|
||||||
@@ -526,9 +522,10 @@
|
|||||||
"Navigation_Workflows": "Flujo de trabajo",
|
"Navigation_Workflows": "Flujo de trabajo",
|
||||||
"Network_Assign": "Conectar al nodo de <i class=\"fa fa-server\"></i> red",
|
"Network_Assign": "Conectar al nodo de <i class=\"fa fa-server\"></i> red",
|
||||||
"Network_Cant_Assign": "No se puede asignar el nodo principal de Internet como nodo secundario.",
|
"Network_Cant_Assign": "No se puede asignar el nodo principal de Internet como nodo secundario.",
|
||||||
"Network_Cant_Assign_No_Node_Selected": "",
|
"Network_Cant_Assign_No_Node_Selected": "No es posible asignar, no se ha seleccionado un nodo padre.",
|
||||||
"Network_Configuration_Error": "Error en la configuración",
|
"Network_Configuration_Error": "Error en la configuración",
|
||||||
"Network_Connected": "Dispositivos conectados",
|
"Network_Connected": "Dispositivos conectados",
|
||||||
|
"Network_Devices": "Dispositivos de red",
|
||||||
"Network_ManageAdd": "Añadir dispositivo",
|
"Network_ManageAdd": "Añadir dispositivo",
|
||||||
"Network_ManageAdd_Name": "Nombre del dispositivo",
|
"Network_ManageAdd_Name": "Nombre del dispositivo",
|
||||||
"Network_ManageAdd_Name_text": "Nombre sin caracteres especiales",
|
"Network_ManageAdd_Name_text": "Nombre sin caracteres especiales",
|
||||||
@@ -563,8 +560,8 @@
|
|||||||
"Network_Root": "Nodo principal",
|
"Network_Root": "Nodo principal",
|
||||||
"Network_Root_Not_Configured": "Seleccione un tipo de dispositivo de red, por ejemplo un <b>Gateway</b>, en el campo <b>Tipo</b> del <a href=\"deviceDetails.php?mac=Internet\">dispositivo principal de Internet</a> para empezar a configurar esta pantalla. <br/><br/>Puede encontrar más documentación en la guía <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank\">¿Cómo configurar su página de Red?</a>",
|
"Network_Root_Not_Configured": "Seleccione un tipo de dispositivo de red, por ejemplo un <b>Gateway</b>, en el campo <b>Tipo</b> del <a href=\"deviceDetails.php?mac=Internet\">dispositivo principal de Internet</a> para empezar a configurar esta pantalla. <br/><br/>Puede encontrar más documentación en la guía <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank\">¿Cómo configurar su página de Red?</a>",
|
||||||
"Network_Root_Unconfigurable": "Root no configurable",
|
"Network_Root_Unconfigurable": "Root no configurable",
|
||||||
"Network_ShowArchived": "",
|
"Network_ShowArchived": "Mostrar archivado",
|
||||||
"Network_ShowOffline": "",
|
"Network_ShowOffline": "Mostrar fuera de línea",
|
||||||
"Network_Table_Hostname": "Nombre de host",
|
"Network_Table_Hostname": "Nombre de host",
|
||||||
"Network_Table_IP": "Dirección IP",
|
"Network_Table_IP": "Dirección IP",
|
||||||
"Network_Table_State": "Estado",
|
"Network_Table_State": "Estado",
|
||||||
@@ -601,9 +598,9 @@
|
|||||||
"Presence_Key_OnlineNow_desc": "Dispositivo detectado en el último escaneo como conectado.",
|
"Presence_Key_OnlineNow_desc": "Dispositivo detectado en el último escaneo como conectado.",
|
||||||
"Presence_Key_OnlinePast": "Anterior en línea",
|
"Presence_Key_OnlinePast": "Anterior en línea",
|
||||||
"Presence_Key_OnlinePastMiss": "Anterior en línea (miss-match)",
|
"Presence_Key_OnlinePastMiss": "Anterior en línea (miss-match)",
|
||||||
"Presence_Key_OnlinePastMiss_desc": "Dispositivo en línea en el pasado, pero actualmente desconectado, pero la sesión de inicio podría estar faltando o tiene datos conflictivos. (Puede ser un error - por favor envíe un PR si sabe cómo solucionarlo - estoy un poco perdido en código)",
|
"Presence_Key_OnlinePastMiss_desc": "Dispositivo en línea en el pasado, pero actualmente desconectado, pero la sesión de inicio podría estar faltando o tiene datos conflictivos.",
|
||||||
"Presence_Key_OnlinePast_desc": "Dispositivo en línea en el pasado, pero actualmente no conectado.",
|
"Presence_Key_OnlinePast_desc": "Dispositivo en línea en el pasado, pero actualmente no conectado.",
|
||||||
"Presence_Loading": "Cargando...",
|
"Presence_Loading": "Cargando. . .",
|
||||||
"Presence_Shortcut_AllDevices": "Mis dispositivos",
|
"Presence_Shortcut_AllDevices": "Mis dispositivos",
|
||||||
"Presence_Shortcut_Archived": "Archivado(s)",
|
"Presence_Shortcut_Archived": "Archivado(s)",
|
||||||
"Presence_Shortcut_Connected": "Conectado(s)",
|
"Presence_Shortcut_Connected": "Conectado(s)",
|
||||||
@@ -611,9 +608,9 @@
|
|||||||
"Presence_Shortcut_DownAlerts": "Alerta(s) de caída(s)",
|
"Presence_Shortcut_DownAlerts": "Alerta(s) de caída(s)",
|
||||||
"Presence_Shortcut_Favorites": "Favorito(s)",
|
"Presence_Shortcut_Favorites": "Favorito(s)",
|
||||||
"Presence_Shortcut_NewDevices": "Nuevo(s)",
|
"Presence_Shortcut_NewDevices": "Nuevo(s)",
|
||||||
"Presence_Title": "Historial por dispositivo",
|
"Presence_Title": "Presencia por dispositivo",
|
||||||
"REFRESH_FQDN_description": "",
|
"REFRESH_FQDN_description": "Vuelve a escanear todos los dispositivos y actualiza su nombre de dominio completo (FQDN). Si esta opción está deshabilitada, solo se escanean los dispositivos sin nombre conocido para mejorar el rendimiento. En este caso, el FQDN se actualiza solo durante la detección inicial de dispositivos.",
|
||||||
"REFRESH_FQDN_name": "",
|
"REFRESH_FQDN_name": "Refrescar FQDN",
|
||||||
"REPORT_APPRISE_description": "Habilitar el envío de notificaciones a través de <a target=\"_blank\" href=\"https://hub.docker.com/r/caronc/apprise\">Apprise</a>.",
|
"REPORT_APPRISE_description": "Habilitar el envío de notificaciones a través de <a target=\"_blank\" href=\"https://hub.docker.com/r/caronc/apprise\">Apprise</a>.",
|
||||||
"REPORT_APPRISE_name": "Habilitar Apprise",
|
"REPORT_APPRISE_name": "Habilitar Apprise",
|
||||||
"REPORT_DASHBOARD_URL_description": "Esta URL se utiliza como base para generar enlaces en los correos electrónicos. Ingrese la URL completa que comienza con <code>http://</code>, incluido el número de puerto (sin barra inclinada al final <code>/</code>).",
|
"REPORT_DASHBOARD_URL_description": "Esta URL se utiliza como base para generar enlaces en los correos electrónicos. Ingrese la URL completa que comienza con <code>http://</code>, incluido el número de puerto (sin barra inclinada al final <code>/</code>).",
|
||||||
@@ -661,6 +658,7 @@
|
|||||||
"Settings_device_Scanners_desync": "⚠ Los horarios del escáner de los dispositivos no están sincronizados.",
|
"Settings_device_Scanners_desync": "⚠ Los horarios del escáner de los dispositivos no están sincronizados.",
|
||||||
"Settings_device_Scanners_desync_popup": "Los horarios de escáneres de dispositivos (<code> *_RUN_SCHD</code> ) no son lo mismo. Esto resultará en notificaciones inconsistentes del dispositivo en línea/fuera de línea. A menos que sea así, utilice el mismo horario para todos los habilitados.<b> 🔍Escáneres de dispositivos</b> .",
|
"Settings_device_Scanners_desync_popup": "Los horarios de escáneres de dispositivos (<code> *_RUN_SCHD</code> ) no son lo mismo. Esto resultará en notificaciones inconsistentes del dispositivo en línea/fuera de línea. A menos que sea así, utilice el mismo horario para todos los habilitados.<b> 🔍Escáneres de dispositivos</b> .",
|
||||||
"Speedtest_Results": "Resultados de la prueba de velocidad",
|
"Speedtest_Results": "Resultados de la prueba de velocidad",
|
||||||
|
"Systeminfo_AvailableIps": "",
|
||||||
"Systeminfo_CPU": "CPU",
|
"Systeminfo_CPU": "CPU",
|
||||||
"Systeminfo_CPU_Cores": "Núcleos de CPU:",
|
"Systeminfo_CPU_Cores": "Núcleos de CPU:",
|
||||||
"Systeminfo_CPU_Name": "Nombre de la CPU:",
|
"Systeminfo_CPU_Name": "Nombre de la CPU:",
|
||||||
@@ -794,10 +792,10 @@
|
|||||||
"add_icon_event_tooltip": "Agregar nuevo icono",
|
"add_icon_event_tooltip": "Agregar nuevo icono",
|
||||||
"add_option_event_tooltip": "Añadir nuevo valor",
|
"add_option_event_tooltip": "Añadir nuevo valor",
|
||||||
"copy_icons_event_tooltip": "Sobrescribir los iconos de todos los dispositivos con el mismo tipo de dispositivo",
|
"copy_icons_event_tooltip": "Sobrescribir los iconos de todos los dispositivos con el mismo tipo de dispositivo",
|
||||||
"devices_old": "Volviendo a actualizar....",
|
"devices_old": "Refrescando . . .",
|
||||||
"general_event_description": "El evento que ha activado puede tardar un poco hasta que finalicen los procesos en segundo plano. La ejecución finalizó una vez que se vacía la cola de ejecución a continuación (consulte el <a href='/maintenance.php#tab_Logging'>registro de errores</a> si encuentra problemas). <br/> <br/> Cola de ejecución:",
|
"general_event_description": "El evento que ha activado puede tardar un poco hasta que finalicen los procesos en segundo plano. La ejecución finalizó una vez que se vacía la cola de ejecución a continuación (consulte el <a href='/maintenance.php#tab_Logging'>registro de errores</a> si encuentra problemas). <br/> <br/> Cola de ejecución:",
|
||||||
"general_event_title": "Ejecutar un evento ad-hoc",
|
"general_event_title": "Ejecutar un evento ad-hoc",
|
||||||
"go_to_device_event_tooltip": "",
|
"go_to_device_event_tooltip": "Navegar al dispositivo",
|
||||||
"go_to_node_event_tooltip": "Vaya a la página de Red del nodo indicado",
|
"go_to_node_event_tooltip": "Vaya a la página de Red del nodo indicado",
|
||||||
"new_version_available": "Una nueva versión está disponible.",
|
"new_version_available": "Una nueva versión está disponible.",
|
||||||
"report_guid": "Guía de las notificaciones:",
|
"report_guid": "Guía de las notificaciones:",
|
||||||
@@ -805,12 +803,12 @@
|
|||||||
"report_select_format": "Selecciona el formato:",
|
"report_select_format": "Selecciona el formato:",
|
||||||
"report_time": "Hora de la notificación:",
|
"report_time": "Hora de la notificación:",
|
||||||
"run_event_tooltip": "Activa el ajuste y guarda tus cambios antes de ejecutarlo.",
|
"run_event_tooltip": "Activa el ajuste y guarda tus cambios antes de ejecutarlo.",
|
||||||
"select_icon_event_tooltip": "",
|
"select_icon_event_tooltip": "Seleccionar ícono",
|
||||||
"settings_core_icon": "fa-solid fa-gem",
|
"settings_core_icon": "fa-solid fa-gem",
|
||||||
"settings_core_label": "Núcleo",
|
"settings_core_label": "Núcleo",
|
||||||
"settings_device_scanners": "Los escáneres de los dispositivos se utilizan para descubrir dispositivos que escriben en la tabla de base de datos de CurrentScan.",
|
"settings_device_scanners": "Los escáneres de los dispositivos se utilizan para descubrir dispositivos que escriben en la tabla de base de datos de CurrentScan.",
|
||||||
"settings_device_scanners_icon": "fa-solid fa-magnifying-glass-plus",
|
"settings_device_scanners_icon": "fa-solid fa-magnifying-glass-plus",
|
||||||
"settings_device_scanners_info": "Cargue aún más escáneres de dispositivos con el ajuste <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a>",
|
"settings_device_scanners_info": "Cargue más escáneres de dispositivos con el ajuste <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a>",
|
||||||
"settings_device_scanners_label": "Escáneres de dispositivos",
|
"settings_device_scanners_label": "Escáneres de dispositivos",
|
||||||
"settings_enabled": "Configuración activada",
|
"settings_enabled": "Configuración activada",
|
||||||
"settings_enabled_icon": "fa-solid fa-toggle-on",
|
"settings_enabled_icon": "fa-solid fa-toggle-on",
|
||||||
@@ -819,7 +817,7 @@
|
|||||||
"settings_imported_label": "Configuración importada",
|
"settings_imported_label": "Configuración importada",
|
||||||
"settings_missing": "No se han cargado todos los ajustes. Carga alta en la base de datos o secuencia de inicio de la app. Haz clic en el botón 🔄 recargar en la parte superior.",
|
"settings_missing": "No se han cargado todos los ajustes. Carga alta en la base de datos o secuencia de inicio de la app. Haz clic en el botón 🔄 recargar en la parte superior.",
|
||||||
"settings_missing_block": "Error: La configuración no se ha cargado correctamente. Haga clic en el botón de recarga 🔄 en la parte superior, alternativamente, compruebe el registro del navegador para más detalles (F12).",
|
"settings_missing_block": "Error: La configuración no se ha cargado correctamente. Haga clic en el botón de recarga 🔄 en la parte superior, alternativamente, compruebe el registro del navegador para más detalles (F12).",
|
||||||
"settings_old": "Importar ajustes y reiniciar...",
|
"settings_old": "Importar ajustes y reiniciar. . .",
|
||||||
"settings_other_scanners": "Otros plugins de escáner no relacionados con dispositivos que están activados actualmente.",
|
"settings_other_scanners": "Otros plugins de escáner no relacionados con dispositivos que están activados actualmente.",
|
||||||
"settings_other_scanners_icon": "fa-solid fa-recycle",
|
"settings_other_scanners_icon": "fa-solid fa-recycle",
|
||||||
"settings_other_scanners_label": "Otros escáneres",
|
"settings_other_scanners_label": "Otros escáneres",
|
||||||
@@ -828,7 +826,7 @@
|
|||||||
"settings_publishers_info": "Cargue más editor@s con el ajuste <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a>",
|
"settings_publishers_info": "Cargue más editor@s con el ajuste <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a>",
|
||||||
"settings_publishers_label": "Editores",
|
"settings_publishers_label": "Editores",
|
||||||
"settings_readonly": "No se puede LEER ni ESCRIBIR <code>app.conf</code>. Intente reiniciar el contenedor y lea la <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/FILE_PERMISSIONS.md\" target=\"_blank\">documentación de permisos de archivo</a>",
|
"settings_readonly": "No se puede LEER ni ESCRIBIR <code>app.conf</code>. Intente reiniciar el contenedor y lea la <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/FILE_PERMISSIONS.md\" target=\"_blank\">documentación de permisos de archivo</a>",
|
||||||
"settings_saved": "<br/>Ajustes guardados. <br/> Recargando... <br/><i class=\"ion ion-ios-loop-strong fa-spin fa-2x fa-fw\"></i> <br/>",
|
"settings_saved": "<br/>Ajustes guardados. <br/> Recargando. . . <br/><i class=\"ion ion-ios-loop-strong fa-spin fa-2x fa-fw\"></i> <br/>",
|
||||||
"settings_system_icon": "fa-solid fa-gear",
|
"settings_system_icon": "fa-solid fa-gear",
|
||||||
"settings_system_label": "Sistema",
|
"settings_system_label": "Sistema",
|
||||||
"settings_update_item_warning": "Actualice el valor a continuación. Tenga cuidado de seguir el formato anterior. <b>O la validación no se realiza.</b>",
|
"settings_update_item_warning": "Actualice el valor a continuación. Tenga cuidado de seguir el formato anterior. <b>O la validación no se realiza.</b>",
|
||||||
|
|||||||
12
front/php/templates/language/fr_fr.json
Normal file → Executable file
12
front/php/templates/language/fr_fr.json
Normal file → Executable file
@@ -9,7 +9,7 @@
|
|||||||
"About_Exit": "Se déconnecter",
|
"About_Exit": "Se déconnecter",
|
||||||
"About_Title": "Analyse de la sécurité du réseau et cadre de notification",
|
"About_Title": "Analyse de la sécurité du réseau et cadre de notification",
|
||||||
"AppEvents_AppEventProcessed": "Traité(s)",
|
"AppEvents_AppEventProcessed": "Traité(s)",
|
||||||
"AppEvents_DateTimeCreated": "Découvert le",
|
"AppEvents_DateTimeCreated": "Identifié",
|
||||||
"AppEvents_Extra": "Extra",
|
"AppEvents_Extra": "Extra",
|
||||||
"AppEvents_GUID": "GUID d’événements de l'application",
|
"AppEvents_GUID": "GUID d’événements de l'application",
|
||||||
"AppEvents_Helper1": "Assistant 1",
|
"AppEvents_Helper1": "Assistant 1",
|
||||||
@@ -301,6 +301,7 @@
|
|||||||
"Gen_Cancel": "Annuler",
|
"Gen_Cancel": "Annuler",
|
||||||
"Gen_Change": "Changement",
|
"Gen_Change": "Changement",
|
||||||
"Gen_Copy": "Lancer",
|
"Gen_Copy": "Lancer",
|
||||||
|
"Gen_CopyToClipboard": "Copier vers le presse-papier",
|
||||||
"Gen_DataUpdatedUITakesTime": "OK - cela peut prendre du temps à l'interface pour se mettre à jour si un scan est en cours.",
|
"Gen_DataUpdatedUITakesTime": "OK - cela peut prendre du temps à l'interface pour se mettre à jour si un scan est en cours.",
|
||||||
"Gen_Delete": "Supprimer",
|
"Gen_Delete": "Supprimer",
|
||||||
"Gen_DeleteAll": "Supprimer tous",
|
"Gen_DeleteAll": "Supprimer tous",
|
||||||
@@ -308,7 +309,9 @@
|
|||||||
"Gen_Error": "Erreur",
|
"Gen_Error": "Erreur",
|
||||||
"Gen_Filter": "Filtrer",
|
"Gen_Filter": "Filtrer",
|
||||||
"Gen_Generate": "Générer",
|
"Gen_Generate": "Générer",
|
||||||
|
"Gen_InvalidMac": "Adresse MAC invalide.",
|
||||||
"Gen_LockedDB": "Erreur - La base de données est peut-être verrouillée - Vérifier avec les outils de dév via F12 -> Console ou essayer plus tard.",
|
"Gen_LockedDB": "Erreur - La base de données est peut-être verrouillée - Vérifier avec les outils de dév via F12 -> Console ou essayer plus tard.",
|
||||||
|
"Gen_NetworkMask": "Masque réseau",
|
||||||
"Gen_Offline": "Hors ligne",
|
"Gen_Offline": "Hors ligne",
|
||||||
"Gen_Okay": "OK",
|
"Gen_Okay": "OK",
|
||||||
"Gen_Online": "En ligne",
|
"Gen_Online": "En ligne",
|
||||||
@@ -325,7 +328,8 @@
|
|||||||
"Gen_Select": "Sélectionner",
|
"Gen_Select": "Sélectionner",
|
||||||
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
||||||
"Gen_SelectToPreview": "Sélectionnez pour prévisualiser",
|
"Gen_SelectToPreview": "Sélectionnez pour prévisualiser",
|
||||||
"Gen_Selected_Devices": "Appareils sélectionnés :",
|
"Gen_Selected_Devices": "Appareils sélectionnés :",
|
||||||
|
"Gen_Subnet": "Sous-réseau",
|
||||||
"Gen_Switch": "Basculer",
|
"Gen_Switch": "Basculer",
|
||||||
"Gen_Upd": "Mise à jour réussie",
|
"Gen_Upd": "Mise à jour réussie",
|
||||||
"Gen_Upd_Fail": "Échec de la mise à jour",
|
"Gen_Upd_Fail": "Échec de la mise à jour",
|
||||||
@@ -494,6 +498,7 @@
|
|||||||
"Network_Cant_Assign_No_Node_Selected": "Impossible d'assigner, aucun noeud parent sélectionné.",
|
"Network_Cant_Assign_No_Node_Selected": "Impossible d'assigner, aucun noeud parent sélectionné.",
|
||||||
"Network_Configuration_Error": "Erreur de configuration",
|
"Network_Configuration_Error": "Erreur de configuration",
|
||||||
"Network_Connected": "Appareils connectés",
|
"Network_Connected": "Appareils connectés",
|
||||||
|
"Network_Devices": "Appareils réseau",
|
||||||
"Network_ManageAdd": "Ajouter un appareil",
|
"Network_ManageAdd": "Ajouter un appareil",
|
||||||
"Network_ManageAdd_Name": "Nom de l'appareil",
|
"Network_ManageAdd_Name": "Nom de l'appareil",
|
||||||
"Network_ManageAdd_Name_text": "Nom sans caractère spécial",
|
"Network_ManageAdd_Name_text": "Nom sans caractère spécial",
|
||||||
@@ -562,7 +567,7 @@
|
|||||||
"Presence_Key_OnlineNow_desc": "Appareil détecté comme étant en ligne lors de la dernière analyse.",
|
"Presence_Key_OnlineNow_desc": "Appareil détecté comme étant en ligne lors de la dernière analyse.",
|
||||||
"Presence_Key_OnlinePast": "Passé en ligne",
|
"Presence_Key_OnlinePast": "Passé en ligne",
|
||||||
"Presence_Key_OnlinePastMiss": "Passé en ligne (correspondance manquée)",
|
"Presence_Key_OnlinePastMiss": "Passé en ligne (correspondance manquée)",
|
||||||
"Presence_Key_OnlinePastMiss_desc": "Appareil en ligne dans le passé, mais actuellement hors ligne, mais la session de démarrage pourrait être manquante ou avoir des données contradictoires. (il s'agit peut-être d'un bogue - veuillez soumettre un PR si vous savez comment le corriger - je suis un peu perdu dans le code ici)",
|
"Presence_Key_OnlinePastMiss_desc": "Appareil en ligne dans le passé, mais actuellement hors ligne, mais la session de démarrage pourrait être manquante ou avoir des données contradictoires.",
|
||||||
"Presence_Key_OnlinePast_desc": "Appareil en ligne dans le passé, mais actuellement hors ligne.",
|
"Presence_Key_OnlinePast_desc": "Appareil en ligne dans le passé, mais actuellement hors ligne.",
|
||||||
"Presence_Loading": "Chargement …",
|
"Presence_Loading": "Chargement …",
|
||||||
"Presence_Shortcut_AllDevices": "Mes appareils",
|
"Presence_Shortcut_AllDevices": "Mes appareils",
|
||||||
@@ -593,6 +598,7 @@
|
|||||||
"Settings_device_Scanners_desync": "⚠ La planification des différents scanners d'appareils est désynchronisée.",
|
"Settings_device_Scanners_desync": "⚠ La planification des différents scanners d'appareils est désynchronisée.",
|
||||||
"Settings_device_Scanners_desync_popup": "La planification des scanners (<code>*_RUN_SCHD</code>) n'est pas identique entre scanners. Cela va entraîner des notifications en ligne/hors-ligne non cohérentes. À moins que cela soit attendu, utilisez la même planification pour tous les <b>🔍scanners d'appareils</b> activés.",
|
"Settings_device_Scanners_desync_popup": "La planification des scanners (<code>*_RUN_SCHD</code>) n'est pas identique entre scanners. Cela va entraîner des notifications en ligne/hors-ligne non cohérentes. À moins que cela soit attendu, utilisez la même planification pour tous les <b>🔍scanners d'appareils</b> activés.",
|
||||||
"Speedtest_Results": "Résultats du test de débit",
|
"Speedtest_Results": "Résultats du test de débit",
|
||||||
|
"Systeminfo_AvailableIps": "Adresses IP disponibles",
|
||||||
"Systeminfo_CPU": "Processeur",
|
"Systeminfo_CPU": "Processeur",
|
||||||
"Systeminfo_CPU_Cores": "Cœurs de processeur :",
|
"Systeminfo_CPU_Cores": "Cœurs de processeur :",
|
||||||
"Systeminfo_CPU_Name": "Nom du processeur :",
|
"Systeminfo_CPU_Name": "Nom du processeur :",
|
||||||
|
|||||||
42
front/php/templates/language/it_it.json
Normal file → Executable file
42
front/php/templates/language/it_it.json
Normal file → Executable file
@@ -9,7 +9,7 @@
|
|||||||
"About_Exit": "Esci",
|
"About_Exit": "Esci",
|
||||||
"About_Title": "Scanner di sicurezza di rete e framework di notifica",
|
"About_Title": "Scanner di sicurezza di rete e framework di notifica",
|
||||||
"AppEvents_AppEventProcessed": "Elaborato",
|
"AppEvents_AppEventProcessed": "Elaborato",
|
||||||
"AppEvents_DateTimeCreated": "Scoperto il",
|
"AppEvents_DateTimeCreated": "Registrato",
|
||||||
"AppEvents_Extra": "Extra",
|
"AppEvents_Extra": "Extra",
|
||||||
"AppEvents_GUID": "GUID evento applicazione",
|
"AppEvents_GUID": "GUID evento applicazione",
|
||||||
"AppEvents_Helper1": "Aiutante 1",
|
"AppEvents_Helper1": "Aiutante 1",
|
||||||
@@ -72,11 +72,11 @@
|
|||||||
"DevDetail_CustomProperties_Title": "Proprietà personalizzate",
|
"DevDetail_CustomProperties_Title": "Proprietà personalizzate",
|
||||||
"DevDetail_CustomProps_reset_info": "Questa operazione rimuoverà le proprietà personalizzate su questo dispositivo e le ripristinerà al valore predefinito.",
|
"DevDetail_CustomProps_reset_info": "Questa operazione rimuoverà le proprietà personalizzate su questo dispositivo e le ripristinerà al valore predefinito.",
|
||||||
"DevDetail_DisplayFields_Title": "Visualizza",
|
"DevDetail_DisplayFields_Title": "Visualizza",
|
||||||
"DevDetail_EveandAl_AlertAllEvents": "Notifica eventi",
|
"DevDetail_EveandAl_AlertAllEvents": "Eventi di allerta",
|
||||||
"DevDetail_EveandAl_AlertDown": "Avviso disconnessione",
|
"DevDetail_EveandAl_AlertDown": "Avviso inattivo",
|
||||||
"DevDetail_EveandAl_Archived": "Archiviato",
|
"DevDetail_EveandAl_Archived": "Archiviato",
|
||||||
"DevDetail_EveandAl_NewDevice": "Nuovo dispositivo",
|
"DevDetail_EveandAl_NewDevice": "Nuovo dispositivo",
|
||||||
"DevDetail_EveandAl_NewDevice_Tooltip": "Mostrerà il Nuovo stato del dispositivo e lo includerà negli elenchi quando il filtro Nuovi dispositivi è attivo. Non influisce sulle notifiche.",
|
"DevDetail_EveandAl_NewDevice_Tooltip": "Mostra lo stato Nuovo del dispositivo e lo include negli elenchi quando il filtro Nuovi dispositivi è attivo. Non influisce sulle notifiche.",
|
||||||
"DevDetail_EveandAl_RandomMAC": "MAC casuale",
|
"DevDetail_EveandAl_RandomMAC": "MAC casuale",
|
||||||
"DevDetail_EveandAl_ScanCycle": "Scansiona dispositivo",
|
"DevDetail_EveandAl_ScanCycle": "Scansiona dispositivo",
|
||||||
"DevDetail_EveandAl_ScanCycle_a": "Scansiona dispositivo",
|
"DevDetail_EveandAl_ScanCycle_a": "Scansiona dispositivo",
|
||||||
@@ -201,7 +201,7 @@
|
|||||||
"Device_MultiEdit_MassActions": "Azioni di massa:",
|
"Device_MultiEdit_MassActions": "Azioni di massa:",
|
||||||
"Device_MultiEdit_Tooltip": "Attento. Facendo clic verrà applicato il valore sulla sinistra a tutti i dispositivi selezionati sopra.",
|
"Device_MultiEdit_Tooltip": "Attento. Facendo clic verrà applicato il valore sulla sinistra a tutti i dispositivi selezionati sopra.",
|
||||||
"Device_Searchbox": "Cerca",
|
"Device_Searchbox": "Cerca",
|
||||||
"Device_Shortcut_AllDevices": "Miei dispositivi",
|
"Device_Shortcut_AllDevices": "I miei dispositivi",
|
||||||
"Device_Shortcut_AllNodes": "Tutti i nodi",
|
"Device_Shortcut_AllNodes": "Tutti i nodi",
|
||||||
"Device_Shortcut_Archived": "Archiviati",
|
"Device_Shortcut_Archived": "Archiviati",
|
||||||
"Device_Shortcut_Connected": "Connessi",
|
"Device_Shortcut_Connected": "Connessi",
|
||||||
@@ -301,6 +301,7 @@
|
|||||||
"Gen_Cancel": "Annulla",
|
"Gen_Cancel": "Annulla",
|
||||||
"Gen_Change": "Modifica",
|
"Gen_Change": "Modifica",
|
||||||
"Gen_Copy": "Esegui",
|
"Gen_Copy": "Esegui",
|
||||||
|
"Gen_CopyToClipboard": "Copia negli appunti",
|
||||||
"Gen_DataUpdatedUITakesTime": "OK: l'aggiornamento dell'interfaccia utente potrebbe richiedere del tempo se è in esecuzione una scansione.",
|
"Gen_DataUpdatedUITakesTime": "OK: l'aggiornamento dell'interfaccia utente potrebbe richiedere del tempo se è in esecuzione una scansione.",
|
||||||
"Gen_Delete": "Elimina",
|
"Gen_Delete": "Elimina",
|
||||||
"Gen_DeleteAll": "Elimina tutti",
|
"Gen_DeleteAll": "Elimina tutti",
|
||||||
@@ -308,7 +309,9 @@
|
|||||||
"Gen_Error": "Errore",
|
"Gen_Error": "Errore",
|
||||||
"Gen_Filter": "Filtro",
|
"Gen_Filter": "Filtro",
|
||||||
"Gen_Generate": "Genera",
|
"Gen_Generate": "Genera",
|
||||||
|
"Gen_InvalidMac": "Indirizzo Mac non valido.",
|
||||||
"Gen_LockedDB": "ERRORE: il DB potrebbe essere bloccato, controlla F12 Strumenti di sviluppo -> Console o riprova più tardi.",
|
"Gen_LockedDB": "ERRORE: il DB potrebbe essere bloccato, controlla F12 Strumenti di sviluppo -> Console o riprova più tardi.",
|
||||||
|
"Gen_NetworkMask": "Maschera di rete",
|
||||||
"Gen_Offline": "Offline",
|
"Gen_Offline": "Offline",
|
||||||
"Gen_Okay": "Ok",
|
"Gen_Okay": "Ok",
|
||||||
"Gen_Online": "Online",
|
"Gen_Online": "Online",
|
||||||
@@ -326,6 +329,7 @@
|
|||||||
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
||||||
"Gen_SelectToPreview": "Seleziona per anteprima",
|
"Gen_SelectToPreview": "Seleziona per anteprima",
|
||||||
"Gen_Selected_Devices": "Dispositivi selezionati:",
|
"Gen_Selected_Devices": "Dispositivi selezionati:",
|
||||||
|
"Gen_Subnet": "Sottorete",
|
||||||
"Gen_Switch": "Cambia",
|
"Gen_Switch": "Cambia",
|
||||||
"Gen_Upd": "Aggiornato correttamente",
|
"Gen_Upd": "Aggiornato correttamente",
|
||||||
"Gen_Upd_Fail": "Aggiornamento fallito",
|
"Gen_Upd_Fail": "Aggiornamento fallito",
|
||||||
@@ -338,9 +342,9 @@
|
|||||||
"Gen_create_new_device_info": "I dispositivi vengono generalmente rilevati utilizzando <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">plugin</a>. Tuttavia, in alcuni casi, potrebbe essere necessario aggiungere manualmente i dispositivi. Per esplorare scenari specifici, consulta la <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/REMOTE_NETWORKS.md\">documentazione sulle reti remote</a>.",
|
"Gen_create_new_device_info": "I dispositivi vengono generalmente rilevati utilizzando <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">plugin</a>. Tuttavia, in alcuni casi, potrebbe essere necessario aggiungere manualmente i dispositivi. Per esplorare scenari specifici, consulta la <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/REMOTE_NETWORKS.md\">documentazione sulle reti remote</a>.",
|
||||||
"General_display_name": "Generale",
|
"General_display_name": "Generale",
|
||||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||||
"HRS_TO_KEEP_NEWDEV_description": "Questa è un'impostazione di manutenzione <b>ELIMINAZIONE dispositivi</b>. Se abilitata (<code>0</code> è disabilitata), tutti i dispositivi marcati con <b>Nuovo dispositivo</b> verranno eliminati se l'orario della <b>Prima sessione</b> è precedente all'orario di questa impostazione. Usa questa impostazione se vuoi eliminare automaticamente i <b>Nuovi dispositivi</b> dopo <code>X</code> ore.",
|
"HRS_TO_KEEP_NEWDEV_description": "Questa è un'impostazione di manutenzione che <b>ELIMINA dispositivi</b>. Se abilitata (<code>0</code> è disabilitata), i dispositivi contrassegnati come <b>Nuovo dispositivo</b> verranno eliminati se la loro <b>Prima sessione</b> è antecedente alle ore specificate in questa impostazione. Utilizza questa impostazione se vuoi eliminare automaticamente i <b>Nuovi dispositivi</b> dopo <code>X</code> ore.",
|
||||||
"HRS_TO_KEEP_NEWDEV_name": "Elimina nuovi dispositivi dopo",
|
"HRS_TO_KEEP_NEWDEV_name": "Elimina nuovi dispositivi dopo",
|
||||||
"HRS_TO_KEEP_OFFDEV_description": "Questa è un'impostazione di manutenzione <b>ELIMINAZIONE dispositivi</b>. Se abilitata (<code>0</code> è disabilitata), i dispositivi che sono <b>Offline</b> e la loro data e ora <b>Ultima connessione</b> sono più vecchi delle ore specificate in questa impostazione saranno eliminati. Usa questa impostazione se vuoi eliminare automaticamente <b>Dispositivi offline</b> dopo <code>X</code> ore trascorse offline.",
|
"HRS_TO_KEEP_OFFDEV_description": "Questa è un'impostazione di manutenzione che <b>ELIMINA dispositivi</b>. Se abilitata (<code>0</code> è disabilitata), i dispositivi <b>Offline</b> la cui data e ora di <b>Ultima connessione</b> sono antecedenti alle ore specificate in questa impostazione, verranno eliminati. Utilizza questa impostazione se vuoi eliminare automaticamente i <b>Dispositivi offline</b> dopo <code>X</code> ore trascorse offline.",
|
||||||
"HRS_TO_KEEP_OFFDEV_name": "Elimina dispositivi offline dopo",
|
"HRS_TO_KEEP_OFFDEV_name": "Elimina dispositivi offline dopo",
|
||||||
"LOADED_PLUGINS_description": "Quali Plugin caricare. L'aggiunta di plugin potrebbe rallentare l'applicazione. Leggi di più su quali plugin necessitano di essere abilitati, tipi e opzioni di scansione nella <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">documentazione plugin</a>. I plugin disinstallati perdono la loro configurazione. Solo i plugin <code>disabilitati</code> possono essere disinstallati.",
|
"LOADED_PLUGINS_description": "Quali Plugin caricare. L'aggiunta di plugin potrebbe rallentare l'applicazione. Leggi di più su quali plugin necessitano di essere abilitati, tipi e opzioni di scansione nella <a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">documentazione plugin</a>. I plugin disinstallati perdono la loro configurazione. Solo i plugin <code>disabilitati</code> possono essere disinstallati.",
|
||||||
"LOADED_PLUGINS_name": "Plugin caricati",
|
"LOADED_PLUGINS_name": "Plugin caricati",
|
||||||
@@ -372,12 +376,12 @@
|
|||||||
"Maintenance_Running_Version": "Versione installata",
|
"Maintenance_Running_Version": "Versione installata",
|
||||||
"Maintenance_Status": "Stato",
|
"Maintenance_Status": "Stato",
|
||||||
"Maintenance_Title": "Strumenti di manutenzione",
|
"Maintenance_Title": "Strumenti di manutenzione",
|
||||||
"Maintenance_Tool_DownloadConfig": "Impostazioni Esporta",
|
"Maintenance_Tool_DownloadConfig": "Esportazione delle impostazioni",
|
||||||
"Maintenance_Tool_DownloadConfig_text": "Scarica un backup completo della configurazione delle tue Impostazioni memorizzata nel file <code>app.conf</code>.",
|
"Maintenance_Tool_DownloadConfig_text": "Scarica un backup completo della configurazione delle tue Impostazioni memorizzata nel file <code>app.conf</code>.",
|
||||||
"Maintenance_Tool_DownloadWorkflows": "Esportazione flussi di lavoro",
|
"Maintenance_Tool_DownloadWorkflows": "Esportazione del flusso di lavoro",
|
||||||
"Maintenance_Tool_DownloadWorkflows_text": "Scarica un backup completo dei tuoi flussi di lavoro archiviati nel file <code>workflows.json</code>.",
|
"Maintenance_Tool_DownloadWorkflows_text": "Scarica un backup completo dei tuoi flussi di lavoro archiviati nel file <code>workflows.json</code>.",
|
||||||
"Maintenance_Tool_ExportCSV": "Esporta dispositivi (csv)",
|
"Maintenance_Tool_ExportCSV": "Esportazione dispositivi (csv)",
|
||||||
"Maintenance_Tool_ExportCSV_noti": "Esporta dispositivi (csv)",
|
"Maintenance_Tool_ExportCSV_noti": "Esportazione dispositivi (csv)",
|
||||||
"Maintenance_Tool_ExportCSV_noti_text": "Sei sicuro di voler generare un file CSV?",
|
"Maintenance_Tool_ExportCSV_noti_text": "Sei sicuro di voler generare un file CSV?",
|
||||||
"Maintenance_Tool_ExportCSV_text": "Genera un file CSV (comma separated value) contenente la lista dei dispositivi incluse le relazioni di rete tra i nodi di rete e i dispositivi connessi. Puoi anche eseguire questa azione accedendo all'URL <code>il_tuo_NetAlertX/php/server/devices.php?action=ExportCSV</code> o abilitando il plugin <a href=\"settings.php#CSVBCKP_header\">Backup CSV</a>.",
|
"Maintenance_Tool_ExportCSV_text": "Genera un file CSV (comma separated value) contenente la lista dei dispositivi incluse le relazioni di rete tra i nodi di rete e i dispositivi connessi. Puoi anche eseguire questa azione accedendo all'URL <code>il_tuo_NetAlertX/php/server/devices.php?action=ExportCSV</code> o abilitando il plugin <a href=\"settings.php#CSVBCKP_header\">Backup CSV</a>.",
|
||||||
"Maintenance_Tool_ImportCSV": "Importa dispositivi (csv)",
|
"Maintenance_Tool_ImportCSV": "Importa dispositivi (csv)",
|
||||||
@@ -471,7 +475,7 @@
|
|||||||
"Maintenance_themeselector_lable": "Seleziona skin",
|
"Maintenance_themeselector_lable": "Seleziona skin",
|
||||||
"Maintenance_themeselector_text": "Questa modifica avviene lato server, quindi influenza tutti i dispositivi in uso.",
|
"Maintenance_themeselector_text": "Questa modifica avviene lato server, quindi influenza tutti i dispositivi in uso.",
|
||||||
"Maintenance_version": "Aggiornamenti app",
|
"Maintenance_version": "Aggiornamenti app",
|
||||||
"NETWORK_DEVICE_TYPES_description": "Quali tipi di dispositivo possono essere utilizzati come dispositivi di rete nella vista Rete. Il tipo di dispositivo deve corrispondere esattamente all'impostazione <code>Tipo</code> su un dispositivo specifico nei Dettagli dispositivo. Aggiungilo sul Dispositivo tramite il pulsante <code>+</code>. Non rimuovere i tipi esistenti, aggiungine solo di nuovi.",
|
"NETWORK_DEVICE_TYPES_description": "Quali tipi di dispositivo possono essere utilizzati come dispositivi di rete nella vista Rete. Il tipo di dispositivo deve corrispondere esattamente all'impostazione <code>Tipo</code> su un dispositivo specifico nei Dettagli dispositivo. Aggiungilo al dispositivo tramite il pulsante <code>+</code>. Non rimuovere i tipi esistenti, aggiungine solo di nuovi.",
|
||||||
"NETWORK_DEVICE_TYPES_name": "Tipi di dispositivi di rete",
|
"NETWORK_DEVICE_TYPES_name": "Tipi di dispositivi di rete",
|
||||||
"Navigation_About": "Informazioni su",
|
"Navigation_About": "Informazioni su",
|
||||||
"Navigation_AppEvents": "Eventi app",
|
"Navigation_AppEvents": "Eventi app",
|
||||||
@@ -494,6 +498,7 @@
|
|||||||
"Network_Cant_Assign_No_Node_Selected": "Impossibile assegnare, nessun nodo padre selezionato.",
|
"Network_Cant_Assign_No_Node_Selected": "Impossibile assegnare, nessun nodo padre selezionato.",
|
||||||
"Network_Configuration_Error": "Errore di configurazione",
|
"Network_Configuration_Error": "Errore di configurazione",
|
||||||
"Network_Connected": "Dispositivi connessi",
|
"Network_Connected": "Dispositivi connessi",
|
||||||
|
"Network_Devices": "Dispositivi di rete",
|
||||||
"Network_ManageAdd": "Aggiungi dispositivo",
|
"Network_ManageAdd": "Aggiungi dispositivo",
|
||||||
"Network_ManageAdd_Name": "Nome dispositivo",
|
"Network_ManageAdd_Name": "Nome dispositivo",
|
||||||
"Network_ManageAdd_Name_text": "Nome senza caratteri speciali",
|
"Network_ManageAdd_Name_text": "Nome senza caratteri speciali",
|
||||||
@@ -562,10 +567,10 @@
|
|||||||
"Presence_Key_OnlineNow_desc": "Dispositivo rilevato durante l'ultima scansione come online.",
|
"Presence_Key_OnlineNow_desc": "Dispositivo rilevato durante l'ultima scansione come online.",
|
||||||
"Presence_Key_OnlinePast": "Online in passato",
|
"Presence_Key_OnlinePast": "Online in passato",
|
||||||
"Presence_Key_OnlinePastMiss": "Online in passato (non corrispondente)",
|
"Presence_Key_OnlinePastMiss": "Online in passato (non corrispondente)",
|
||||||
"Presence_Key_OnlinePastMiss_desc": "Dispositivo online in passato, ma attualmente offline, ma la sessione di avvio potrebbe essere mancante o presentare dati in conflitto. (potrebbe trattarsi di un bug: invia una PR se sai come risolverlo, sono un po' perso nel codice qui)",
|
"Presence_Key_OnlinePastMiss_desc": "Dispositivo online in passato, ma attualmente offline, ma la sessione di avvio potrebbe essere mancante o presentare dati in conflitto.",
|
||||||
"Presence_Key_OnlinePast_desc": "Dispositivo online in passato, ma attualmente offline.",
|
"Presence_Key_OnlinePast_desc": "Dispositivo online in passato, ma attualmente offline.",
|
||||||
"Presence_Loading": "Caricamento…",
|
"Presence_Loading": "Caricamento…",
|
||||||
"Presence_Shortcut_AllDevices": "Miei dispositivi",
|
"Presence_Shortcut_AllDevices": "I miei dispositivi",
|
||||||
"Presence_Shortcut_Archived": "Archiviati",
|
"Presence_Shortcut_Archived": "Archiviati",
|
||||||
"Presence_Shortcut_Connected": "Connessi",
|
"Presence_Shortcut_Connected": "Connessi",
|
||||||
"Presence_Shortcut_Devices": "Dispositivi",
|
"Presence_Shortcut_Devices": "Dispositivi",
|
||||||
@@ -591,8 +596,9 @@
|
|||||||
"Settings_Metadata_Toggle": "Mostra/nascondi i metadati per l'impostazione specificata.",
|
"Settings_Metadata_Toggle": "Mostra/nascondi i metadati per l'impostazione specificata.",
|
||||||
"Settings_Show_Description": "Mostra descrizione dell'impostazione.",
|
"Settings_Show_Description": "Mostra descrizione dell'impostazione.",
|
||||||
"Settings_device_Scanners_desync": "⚠ Le pianificazioni dello scanner del dispositivo non sono sincronizzate.",
|
"Settings_device_Scanners_desync": "⚠ Le pianificazioni dello scanner del dispositivo non sono sincronizzate.",
|
||||||
"Settings_device_Scanners_desync_popup": "Gli orari degli scanner dei dispositivi (<code>*_RUN_SCHD</code>) non sono gli stessi. Questo comporterà notifiche online/offline incoerenti del dispositivo. A meno che ciò non sia previsto, utilizza la stessa pianificazione per tutti gli <b>🔍Scanner dispositivi</b> abilitati.",
|
"Settings_device_Scanners_desync_popup": "Gli orari degli scanner dei dispositivi (<code>*_RUN_SCHD</code>) non sono gli stessi. Questo comporterà notifiche online/offline incoerenti del dispositivo. A meno che ciò non sia previsto, utilizza la stessa pianificazione per tutti gli <b>🔍 scanner dispositivi</b> abilitati.",
|
||||||
"Speedtest_Results": "Risultati test di velocità",
|
"Speedtest_Results": "Risultati test di velocità",
|
||||||
|
"Systeminfo_AvailableIps": "IP disponibili",
|
||||||
"Systeminfo_CPU": "CPU",
|
"Systeminfo_CPU": "CPU",
|
||||||
"Systeminfo_CPU_Cores": "Core CPU:",
|
"Systeminfo_CPU_Cores": "Core CPU:",
|
||||||
"Systeminfo_CPU_Name": "Nome CPU:",
|
"Systeminfo_CPU_Name": "Nome CPU:",
|
||||||
@@ -676,8 +682,8 @@
|
|||||||
"UI_ICONS_name": "Icone predefinite",
|
"UI_ICONS_name": "Icone predefinite",
|
||||||
"UI_LANG_description": "Seleziona la lingua preferita dell'interfaccia utente. Aiuta nella traduzione o suggerisci una nuova lingua sul portale online di <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
|
"UI_LANG_description": "Seleziona la lingua preferita dell'interfaccia utente. Aiuta nella traduzione o suggerisci una nuova lingua sul portale online di <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a>.",
|
||||||
"UI_LANG_name": "Lingua UI",
|
"UI_LANG_name": "Lingua UI",
|
||||||
"UI_MY_DEVICES_description": "Dispositivi i cui stati devono essere visualizzati nella visualizzazione predefinita <b>Miei dispositivi</b>.",
|
"UI_MY_DEVICES_description": "Dispositivi i cui stati devono essere visualizzati nella visualizzazione predefinita <b>I miei dispositivi</b>.",
|
||||||
"UI_MY_DEVICES_name": "Mostra nella vista Miei dispositivi",
|
"UI_MY_DEVICES_name": "Mostra nella vista I miei dispositivi",
|
||||||
"UI_NOT_RANDOM_MAC_description": "Prefissi MAC che non devono essere contrassegnati come dispositivi casuali. Inserisci ad esempio <code>52</code> per escludere i dispositivi che iniziano con <code>52:xx:xx:xx:xx:xx</code> dall'essere contrassegnati come dispositivi con un indirizzo MAC casuale.",
|
"UI_NOT_RANDOM_MAC_description": "Prefissi MAC che non devono essere contrassegnati come dispositivi casuali. Inserisci ad esempio <code>52</code> per escludere i dispositivi che iniziano con <code>52:xx:xx:xx:xx:xx</code> dall'essere contrassegnati come dispositivi con un indirizzo MAC casuale.",
|
||||||
"UI_NOT_RANDOM_MAC_name": "Non segnalare come casuale",
|
"UI_NOT_RANDOM_MAC_name": "Non segnalare come casuale",
|
||||||
"UI_PRESENCE_description": "Seleziona quali stati devono essere mostrati nel grafico <b>Presenza dispositivo</b> nella pagina <a href=\"/devices.php\" target=\"_blank\">Dispositivi</a>.",
|
"UI_PRESENCE_description": "Seleziona quali stati devono essere mostrati nel grafico <b>Presenza dispositivo</b> nella pagina <a href=\"/devices.php\" target=\"_blank\">Dispositivi</a>.",
|
||||||
@@ -731,7 +737,7 @@
|
|||||||
"settings_core_label": "Core",
|
"settings_core_label": "Core",
|
||||||
"settings_device_scanners": "Scanner dei dispositivi utilizzati per rilevare i dispositivi che scrivono nella tabella del database CurrentScan.",
|
"settings_device_scanners": "Scanner dei dispositivi utilizzati per rilevare i dispositivi che scrivono nella tabella del database CurrentScan.",
|
||||||
"settings_device_scanners_icon": "fa-solid fa-magnifying-glass-plus",
|
"settings_device_scanners_icon": "fa-solid fa-magnifying-glass-plus",
|
||||||
"settings_device_scanners_info": "Carica ancora più scanner di dispositivi con l'impostazione <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a>",
|
"settings_device_scanners_info": "Carica più scanner di dispositivi con l'impostazione <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a>",
|
||||||
"settings_device_scanners_label": "Scanner dispositivi",
|
"settings_device_scanners_label": "Scanner dispositivi",
|
||||||
"settings_enabled": "Impostazioni abilitate",
|
"settings_enabled": "Impostazioni abilitate",
|
||||||
"settings_enabled_icon": "fa-solid fa-toggle-on",
|
"settings_enabled_icon": "fa-solid fa-toggle-on",
|
||||||
|
|||||||
6
front/php/templates/language/nb_no.json
Normal file → Executable file
6
front/php/templates/language/nb_no.json
Normal file → Executable file
@@ -301,6 +301,7 @@
|
|||||||
"Gen_Cancel": "Avbryt",
|
"Gen_Cancel": "Avbryt",
|
||||||
"Gen_Change": "",
|
"Gen_Change": "",
|
||||||
"Gen_Copy": "Kjør",
|
"Gen_Copy": "Kjør",
|
||||||
|
"Gen_CopyToClipboard": "",
|
||||||
"Gen_DataUpdatedUITakesTime": "OK - Det kan ta litt tid før brukergrensesnittet oppdateres hvis en skanning kjøres.",
|
"Gen_DataUpdatedUITakesTime": "OK - Det kan ta litt tid før brukergrensesnittet oppdateres hvis en skanning kjøres.",
|
||||||
"Gen_Delete": "Slett",
|
"Gen_Delete": "Slett",
|
||||||
"Gen_DeleteAll": "Slett alle",
|
"Gen_DeleteAll": "Slett alle",
|
||||||
@@ -308,7 +309,9 @@
|
|||||||
"Gen_Error": "Feil",
|
"Gen_Error": "Feil",
|
||||||
"Gen_Filter": "Filter",
|
"Gen_Filter": "Filter",
|
||||||
"Gen_Generate": "",
|
"Gen_Generate": "",
|
||||||
|
"Gen_InvalidMac": "",
|
||||||
"Gen_LockedDB": "FEIL - DB kan være låst - Sjekk F12 Dev tools -> Konsoll eller prøv senere.",
|
"Gen_LockedDB": "FEIL - DB kan være låst - Sjekk F12 Dev tools -> Konsoll eller prøv senere.",
|
||||||
|
"Gen_NetworkMask": "",
|
||||||
"Gen_Offline": "Frakoblet",
|
"Gen_Offline": "Frakoblet",
|
||||||
"Gen_Okay": "Ok",
|
"Gen_Okay": "Ok",
|
||||||
"Gen_Online": "",
|
"Gen_Online": "",
|
||||||
@@ -326,6 +329,7 @@
|
|||||||
"Gen_SelectIcon": "",
|
"Gen_SelectIcon": "",
|
||||||
"Gen_SelectToPreview": "",
|
"Gen_SelectToPreview": "",
|
||||||
"Gen_Selected_Devices": "Valgte Enheter:",
|
"Gen_Selected_Devices": "Valgte Enheter:",
|
||||||
|
"Gen_Subnet": "",
|
||||||
"Gen_Switch": "Bytt",
|
"Gen_Switch": "Bytt",
|
||||||
"Gen_Upd": "Oppdatering vellykket",
|
"Gen_Upd": "Oppdatering vellykket",
|
||||||
"Gen_Upd_Fail": "Oppdatering feilet",
|
"Gen_Upd_Fail": "Oppdatering feilet",
|
||||||
@@ -494,6 +498,7 @@
|
|||||||
"Network_Cant_Assign_No_Node_Selected": "",
|
"Network_Cant_Assign_No_Node_Selected": "",
|
||||||
"Network_Configuration_Error": "Konfigurasjonsfeil",
|
"Network_Configuration_Error": "Konfigurasjonsfeil",
|
||||||
"Network_Connected": "Tilkoblede enheter",
|
"Network_Connected": "Tilkoblede enheter",
|
||||||
|
"Network_Devices": "",
|
||||||
"Network_ManageAdd": "Legg til enhet",
|
"Network_ManageAdd": "Legg til enhet",
|
||||||
"Network_ManageAdd_Name": "Enhetsnavn",
|
"Network_ManageAdd_Name": "Enhetsnavn",
|
||||||
"Network_ManageAdd_Name_text": "Navn uten spesialtegn",
|
"Network_ManageAdd_Name_text": "Navn uten spesialtegn",
|
||||||
@@ -593,6 +598,7 @@
|
|||||||
"Settings_device_Scanners_desync": "⚠ Enhetsskanning tidsplan er ikke synkronisert lenger.",
|
"Settings_device_Scanners_desync": "⚠ Enhetsskanning tidsplan er ikke synkronisert lenger.",
|
||||||
"Settings_device_Scanners_desync_popup": "Tidsplanene for enhetsskanning (<code>*_RUN_SCHD</code>) er ikke de samme. Dette vil føre til inkonsekvent enhet på online/offline varsler. Med mindre dette er ment, kan du bruke den samme tidsplanen for alle aktiverte <b> 🔍Enhets-skannere</b>.",
|
"Settings_device_Scanners_desync_popup": "Tidsplanene for enhetsskanning (<code>*_RUN_SCHD</code>) er ikke de samme. Dette vil føre til inkonsekvent enhet på online/offline varsler. Med mindre dette er ment, kan du bruke den samme tidsplanen for alle aktiverte <b> 🔍Enhets-skannere</b>.",
|
||||||
"Speedtest_Results": "Speedtest resultater",
|
"Speedtest_Results": "Speedtest resultater",
|
||||||
|
"Systeminfo_AvailableIps": "",
|
||||||
"Systeminfo_CPU": "CPU",
|
"Systeminfo_CPU": "CPU",
|
||||||
"Systeminfo_CPU_Cores": "CPU-kjerner:",
|
"Systeminfo_CPU_Cores": "CPU-kjerner:",
|
||||||
"Systeminfo_CPU_Name": "CPU-navn:",
|
"Systeminfo_CPU_Name": "CPU-navn:",
|
||||||
|
|||||||
6
front/php/templates/language/pl_pl.json
Normal file → Executable file
6
front/php/templates/language/pl_pl.json
Normal file → Executable file
@@ -301,6 +301,7 @@
|
|||||||
"Gen_Cancel": "Anuluj",
|
"Gen_Cancel": "Anuluj",
|
||||||
"Gen_Change": "Zmiana",
|
"Gen_Change": "Zmiana",
|
||||||
"Gen_Copy": "Wykonaj",
|
"Gen_Copy": "Wykonaj",
|
||||||
|
"Gen_CopyToClipboard": "",
|
||||||
"Gen_DataUpdatedUITakesTime": "OK – Może to potrwać chwilę, zanim interfejs użytkownika się zaktualizuje, jeśli trwa skan.",
|
"Gen_DataUpdatedUITakesTime": "OK – Może to potrwać chwilę, zanim interfejs użytkownika się zaktualizuje, jeśli trwa skan.",
|
||||||
"Gen_Delete": "Usuń",
|
"Gen_Delete": "Usuń",
|
||||||
"Gen_DeleteAll": "Usuń wszystko",
|
"Gen_DeleteAll": "Usuń wszystko",
|
||||||
@@ -308,7 +309,9 @@
|
|||||||
"Gen_Error": "Błąd",
|
"Gen_Error": "Błąd",
|
||||||
"Gen_Filter": "Filtr",
|
"Gen_Filter": "Filtr",
|
||||||
"Gen_Generate": "Wygeneruj",
|
"Gen_Generate": "Wygeneruj",
|
||||||
|
"Gen_InvalidMac": "",
|
||||||
"Gen_LockedDB": "Błąd - Baza danych może być zablokowana - Sprawdź narzędzia deweloperskie F12 -> Konsola lub spróbuj później.",
|
"Gen_LockedDB": "Błąd - Baza danych może być zablokowana - Sprawdź narzędzia deweloperskie F12 -> Konsola lub spróbuj później.",
|
||||||
|
"Gen_NetworkMask": "",
|
||||||
"Gen_Offline": "Niedostępne",
|
"Gen_Offline": "Niedostępne",
|
||||||
"Gen_Okay": "Ok",
|
"Gen_Okay": "Ok",
|
||||||
"Gen_Online": "Dostępne",
|
"Gen_Online": "Dostępne",
|
||||||
@@ -326,6 +329,7 @@
|
|||||||
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
||||||
"Gen_SelectToPreview": "Wybierz, aby podglądnąć",
|
"Gen_SelectToPreview": "Wybierz, aby podglądnąć",
|
||||||
"Gen_Selected_Devices": "Wybrane urządzenia:",
|
"Gen_Selected_Devices": "Wybrane urządzenia:",
|
||||||
|
"Gen_Subnet": "",
|
||||||
"Gen_Switch": "Switch",
|
"Gen_Switch": "Switch",
|
||||||
"Gen_Upd": "Zaktualizowano pomyślnie",
|
"Gen_Upd": "Zaktualizowano pomyślnie",
|
||||||
"Gen_Upd_Fail": "Aktualizacja nie powiodła się",
|
"Gen_Upd_Fail": "Aktualizacja nie powiodła się",
|
||||||
@@ -494,6 +498,7 @@
|
|||||||
"Network_Cant_Assign_No_Node_Selected": "",
|
"Network_Cant_Assign_No_Node_Selected": "",
|
||||||
"Network_Configuration_Error": "Błąd konfiguracji",
|
"Network_Configuration_Error": "Błąd konfiguracji",
|
||||||
"Network_Connected": "Połączone urządzenia",
|
"Network_Connected": "Połączone urządzenia",
|
||||||
|
"Network_Devices": "",
|
||||||
"Network_ManageAdd": "Dodaj urządzenie",
|
"Network_ManageAdd": "Dodaj urządzenie",
|
||||||
"Network_ManageAdd_Name": "Nazwa urządzenia",
|
"Network_ManageAdd_Name": "Nazwa urządzenia",
|
||||||
"Network_ManageAdd_Name_text": "Nazwa bez znaków specjalnych",
|
"Network_ManageAdd_Name_text": "Nazwa bez znaków specjalnych",
|
||||||
@@ -593,6 +598,7 @@
|
|||||||
"Settings_device_Scanners_desync": "⚠ Harmonogramy skanerów urządzeń są niezsynchronizowane.",
|
"Settings_device_Scanners_desync": "⚠ Harmonogramy skanerów urządzeń są niezsynchronizowane.",
|
||||||
"Settings_device_Scanners_desync_popup": "Harmonogramy skanerów urządzeń (<code>*_RUN_SCHD</code>) są różne. Może to prowadzić do niespójnych powiadomień o statusie online/offline urządzeń. Jeśli nie jest to zamierzone, proszę używać tego samego harmonogramu dla wszystkich włączonych <b>🔍 Skanerów urządzeń</b>.",
|
"Settings_device_Scanners_desync_popup": "Harmonogramy skanerów urządzeń (<code>*_RUN_SCHD</code>) są różne. Może to prowadzić do niespójnych powiadomień o statusie online/offline urządzeń. Jeśli nie jest to zamierzone, proszę używać tego samego harmonogramu dla wszystkich włączonych <b>🔍 Skanerów urządzeń</b>.",
|
||||||
"Speedtest_Results": "Wyniki testu prędkości",
|
"Speedtest_Results": "Wyniki testu prędkości",
|
||||||
|
"Systeminfo_AvailableIps": "",
|
||||||
"Systeminfo_CPU": "Procesor CPU",
|
"Systeminfo_CPU": "Procesor CPU",
|
||||||
"Systeminfo_CPU_Cores": "Rdzenie CPU:",
|
"Systeminfo_CPU_Cores": "Rdzenie CPU:",
|
||||||
"Systeminfo_CPU_Name": "Nazwa procesora CPU:",
|
"Systeminfo_CPU_Name": "Nazwa procesora CPU:",
|
||||||
|
|||||||
6
front/php/templates/language/pt_br.json
Normal file → Executable file
6
front/php/templates/language/pt_br.json
Normal file → Executable file
@@ -301,6 +301,7 @@
|
|||||||
"Gen_Cancel": "Cancelar",
|
"Gen_Cancel": "Cancelar",
|
||||||
"Gen_Change": "Alterar",
|
"Gen_Change": "Alterar",
|
||||||
"Gen_Copy": "Executar",
|
"Gen_Copy": "Executar",
|
||||||
|
"Gen_CopyToClipboard": "",
|
||||||
"Gen_DataUpdatedUITakesTime": "OK - Pode levar um tempo para a interface do usuário ser atualizada se uma verificação estiver em execução.",
|
"Gen_DataUpdatedUITakesTime": "OK - Pode levar um tempo para a interface do usuário ser atualizada se uma verificação estiver em execução.",
|
||||||
"Gen_Delete": "Excluir",
|
"Gen_Delete": "Excluir",
|
||||||
"Gen_DeleteAll": "Excluir todos",
|
"Gen_DeleteAll": "Excluir todos",
|
||||||
@@ -308,7 +309,9 @@
|
|||||||
"Gen_Error": "Erro",
|
"Gen_Error": "Erro",
|
||||||
"Gen_Filter": "Filtro",
|
"Gen_Filter": "Filtro",
|
||||||
"Gen_Generate": "Gerar",
|
"Gen_Generate": "Gerar",
|
||||||
|
"Gen_InvalidMac": "",
|
||||||
"Gen_LockedDB": "ERRO - O banco de dados pode estar bloqueado - Verifique F12 Ferramentas de desenvolvimento -> Console ou tente mais tarde.",
|
"Gen_LockedDB": "ERRO - O banco de dados pode estar bloqueado - Verifique F12 Ferramentas de desenvolvimento -> Console ou tente mais tarde.",
|
||||||
|
"Gen_NetworkMask": "",
|
||||||
"Gen_Offline": "Offline",
|
"Gen_Offline": "Offline",
|
||||||
"Gen_Okay": "Ok",
|
"Gen_Okay": "Ok",
|
||||||
"Gen_Online": "Online",
|
"Gen_Online": "Online",
|
||||||
@@ -326,6 +329,7 @@
|
|||||||
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
||||||
"Gen_SelectToPreview": "Selecionar para pré-visualizar",
|
"Gen_SelectToPreview": "Selecionar para pré-visualizar",
|
||||||
"Gen_Selected_Devices": "Dispositivos selecionados:",
|
"Gen_Selected_Devices": "Dispositivos selecionados:",
|
||||||
|
"Gen_Subnet": "",
|
||||||
"Gen_Switch": "Trocar",
|
"Gen_Switch": "Trocar",
|
||||||
"Gen_Upd": "Atualizado com sucesso",
|
"Gen_Upd": "Atualizado com sucesso",
|
||||||
"Gen_Upd_Fail": "A atualização falhou",
|
"Gen_Upd_Fail": "A atualização falhou",
|
||||||
@@ -494,6 +498,7 @@
|
|||||||
"Network_Cant_Assign_No_Node_Selected": "",
|
"Network_Cant_Assign_No_Node_Selected": "",
|
||||||
"Network_Configuration_Error": "",
|
"Network_Configuration_Error": "",
|
||||||
"Network_Connected": "",
|
"Network_Connected": "",
|
||||||
|
"Network_Devices": "",
|
||||||
"Network_ManageAdd": "",
|
"Network_ManageAdd": "",
|
||||||
"Network_ManageAdd_Name": "",
|
"Network_ManageAdd_Name": "",
|
||||||
"Network_ManageAdd_Name_text": "",
|
"Network_ManageAdd_Name_text": "",
|
||||||
@@ -593,6 +598,7 @@
|
|||||||
"Settings_device_Scanners_desync": "",
|
"Settings_device_Scanners_desync": "",
|
||||||
"Settings_device_Scanners_desync_popup": "",
|
"Settings_device_Scanners_desync_popup": "",
|
||||||
"Speedtest_Results": "",
|
"Speedtest_Results": "",
|
||||||
|
"Systeminfo_AvailableIps": "",
|
||||||
"Systeminfo_CPU": "",
|
"Systeminfo_CPU": "",
|
||||||
"Systeminfo_CPU_Cores": "",
|
"Systeminfo_CPU_Cores": "",
|
||||||
"Systeminfo_CPU_Name": "",
|
"Systeminfo_CPU_Name": "",
|
||||||
|
|||||||
30
front/php/templates/language/ru_ru.json
Normal file → Executable file
30
front/php/templates/language/ru_ru.json
Normal file → Executable file
@@ -9,7 +9,7 @@
|
|||||||
"About_Exit": "Зарегистрироваться",
|
"About_Exit": "Зарегистрироваться",
|
||||||
"About_Title": "Сетевой сканер и система уведомлений",
|
"About_Title": "Сетевой сканер и система уведомлений",
|
||||||
"AppEvents_AppEventProcessed": "Обработанный",
|
"AppEvents_AppEventProcessed": "Обработанный",
|
||||||
"AppEvents_DateTimeCreated": "Обнаружено",
|
"AppEvents_DateTimeCreated": "Зарегистрировано",
|
||||||
"AppEvents_Extra": "Дополнительно",
|
"AppEvents_Extra": "Дополнительно",
|
||||||
"AppEvents_GUID": "GUID события приложения",
|
"AppEvents_GUID": "GUID события приложения",
|
||||||
"AppEvents_Helper1": "Помощник 1",
|
"AppEvents_Helper1": "Помощник 1",
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
"DAYS_TO_KEEP_EVENTS_name": "Удалить события старше",
|
"DAYS_TO_KEEP_EVENTS_name": "Удалить события старше",
|
||||||
"DISCOVER_PLUGINS_description": "Отключите эту опцию, чтобы ускорить инициализацию и сохранение настроек. При отключении этой опции плагины не обнаруживаются, и вы не можете добавлять новые плагины в параметр <code>LOADED_PLUGINS</code>.",
|
"DISCOVER_PLUGINS_description": "Отключите эту опцию, чтобы ускорить инициализацию и сохранение настроек. При отключении этой опции плагины не обнаруживаются, и вы не можете добавлять новые плагины в параметр <code>LOADED_PLUGINS</code>.",
|
||||||
"DISCOVER_PLUGINS_name": "Обзор плагинов",
|
"DISCOVER_PLUGINS_name": "Обзор плагинов",
|
||||||
"DevDetail_Children_Title": "",
|
"DevDetail_Children_Title": "Дочерние отношения",
|
||||||
"DevDetail_Copy_Device_Title": "Скопировать данные с устройства",
|
"DevDetail_Copy_Device_Title": "Скопировать данные с устройства",
|
||||||
"DevDetail_Copy_Device_Tooltip": "Скопируйте данные с устройства из раскрывающегося списка. Все на этой странице будет перезаписано",
|
"DevDetail_Copy_Device_Tooltip": "Скопируйте данные с устройства из раскрывающегося списка. Все на этой странице будет перезаписано",
|
||||||
"DevDetail_CustomProperties_Title": "Пользовательские свойства",
|
"DevDetail_CustomProperties_Title": "Пользовательские свойства",
|
||||||
@@ -79,7 +79,7 @@
|
|||||||
"DevDetail_EveandAl_NewDevice_Tooltip": "Будет показывать статус «Новое» для устройства и включать его в списки, когда фильтр «Новые устройства» активен. Не влияет на уведомления.",
|
"DevDetail_EveandAl_NewDevice_Tooltip": "Будет показывать статус «Новое» для устройства и включать его в списки, когда фильтр «Новые устройства» активен. Не влияет на уведомления.",
|
||||||
"DevDetail_EveandAl_RandomMAC": "Случайный MAC-адрес",
|
"DevDetail_EveandAl_RandomMAC": "Случайный MAC-адрес",
|
||||||
"DevDetail_EveandAl_ScanCycle": "Сканировать устройство",
|
"DevDetail_EveandAl_ScanCycle": "Сканировать устройство",
|
||||||
"DevDetail_EveandAl_ScanCycle_a": "Сканировать Устройство",
|
"DevDetail_EveandAl_ScanCycle_a": "Сканировать устройство",
|
||||||
"DevDetail_EveandAl_ScanCycle_z": "Не сканировать устройство",
|
"DevDetail_EveandAl_ScanCycle_z": "Не сканировать устройство",
|
||||||
"DevDetail_EveandAl_Skip": "Пропустить повторные уведомления",
|
"DevDetail_EveandAl_Skip": "Пропустить повторные уведомления",
|
||||||
"DevDetail_EveandAl_Title": "Конфигурация событий и оповещений",
|
"DevDetail_EveandAl_Title": "Конфигурация событий и оповещений",
|
||||||
@@ -103,7 +103,7 @@
|
|||||||
"DevDetail_MainInfo_Type": "Тип",
|
"DevDetail_MainInfo_Type": "Тип",
|
||||||
"DevDetail_MainInfo_Vendor": "Поставщик",
|
"DevDetail_MainInfo_Vendor": "Поставщик",
|
||||||
"DevDetail_MainInfo_mac": "MAC адрес",
|
"DevDetail_MainInfo_mac": "MAC адрес",
|
||||||
"DevDetail_NavToChildNode": "",
|
"DevDetail_NavToChildNode": "Открыть дочерний узел",
|
||||||
"DevDetail_Network_Node_hover": "Выберите родительское сетевое устройство, к которому подключено текущее устройство, чтобы заполнить дерево сети.",
|
"DevDetail_Network_Node_hover": "Выберите родительское сетевое устройство, к которому подключено текущее устройство, чтобы заполнить дерево сети.",
|
||||||
"DevDetail_Network_Port_hover": "Порт, к которому подключено это устройство на родительском сетевом устройстве. Если оставить пустым, в дереве сети отобразится значок Wi-Fi.",
|
"DevDetail_Network_Port_hover": "Порт, к которому подключено это устройство на родительском сетевом устройстве. Если оставить пустым, в дереве сети отобразится значок Wi-Fi.",
|
||||||
"DevDetail_Nmap_Scans": "Ручные сканеры Nmap",
|
"DevDetail_Nmap_Scans": "Ручные сканеры Nmap",
|
||||||
@@ -202,7 +202,7 @@
|
|||||||
"Device_MultiEdit_Tooltip": "Осторожно. При нажатии на эту кнопку значение слева будет применено ко всем устройствам, выбранным выше.",
|
"Device_MultiEdit_Tooltip": "Осторожно. При нажатии на эту кнопку значение слева будет применено ко всем устройствам, выбранным выше.",
|
||||||
"Device_Searchbox": "Поиск",
|
"Device_Searchbox": "Поиск",
|
||||||
"Device_Shortcut_AllDevices": "Мои устройства",
|
"Device_Shortcut_AllDevices": "Мои устройства",
|
||||||
"Device_Shortcut_AllNodes": "",
|
"Device_Shortcut_AllNodes": "Все узлы",
|
||||||
"Device_Shortcut_Archived": "Архив",
|
"Device_Shortcut_Archived": "Архив",
|
||||||
"Device_Shortcut_Connected": "Подключенные",
|
"Device_Shortcut_Connected": "Подключенные",
|
||||||
"Device_Shortcut_Devices": "Устройства",
|
"Device_Shortcut_Devices": "Устройства",
|
||||||
@@ -229,11 +229,11 @@
|
|||||||
"Device_TableHead_Name": "Имя",
|
"Device_TableHead_Name": "Имя",
|
||||||
"Device_TableHead_NetworkSite": "Сайт устройства",
|
"Device_TableHead_NetworkSite": "Сайт устройства",
|
||||||
"Device_TableHead_Owner": "Владелец",
|
"Device_TableHead_Owner": "Владелец",
|
||||||
"Device_TableHead_ParentRelType": "",
|
"Device_TableHead_ParentRelType": "Тип отношений",
|
||||||
"Device_TableHead_Parent_MAC": "Родительский узел сети",
|
"Device_TableHead_Parent_MAC": "Родительский узел сети",
|
||||||
"Device_TableHead_Port": "Порт",
|
"Device_TableHead_Port": "Порт",
|
||||||
"Device_TableHead_PresentLastScan": "Присутствие",
|
"Device_TableHead_PresentLastScan": "Присутствие",
|
||||||
"Device_TableHead_ReqNicsOnline": "",
|
"Device_TableHead_ReqNicsOnline": "Требуется NIC онлайн",
|
||||||
"Device_TableHead_RowID": "ID строки",
|
"Device_TableHead_RowID": "ID строки",
|
||||||
"Device_TableHead_Rowid": "ID строки",
|
"Device_TableHead_Rowid": "ID строки",
|
||||||
"Device_TableHead_SSID": "SSID",
|
"Device_TableHead_SSID": "SSID",
|
||||||
@@ -301,6 +301,7 @@
|
|||||||
"Gen_Cancel": "Отмена",
|
"Gen_Cancel": "Отмена",
|
||||||
"Gen_Change": "Изменить",
|
"Gen_Change": "Изменить",
|
||||||
"Gen_Copy": "Запустить",
|
"Gen_Copy": "Запустить",
|
||||||
|
"Gen_CopyToClipboard": "",
|
||||||
"Gen_DataUpdatedUITakesTime": "ОК - Обновление UI может занять некоторое время, если сканирование выполняется.",
|
"Gen_DataUpdatedUITakesTime": "ОК - Обновление UI может занять некоторое время, если сканирование выполняется.",
|
||||||
"Gen_Delete": "Удалить",
|
"Gen_Delete": "Удалить",
|
||||||
"Gen_DeleteAll": "Удалить все",
|
"Gen_DeleteAll": "Удалить все",
|
||||||
@@ -308,7 +309,9 @@
|
|||||||
"Gen_Error": "Ошибка",
|
"Gen_Error": "Ошибка",
|
||||||
"Gen_Filter": "Фильтр",
|
"Gen_Filter": "Фильтр",
|
||||||
"Gen_Generate": "Генерировать",
|
"Gen_Generate": "Генерировать",
|
||||||
|
"Gen_InvalidMac": "",
|
||||||
"Gen_LockedDB": "ОШИБКА - Возможно, база данных заблокирована. Проверьте инструменты разработчика F12 -> Консоль или повторите попытку позже.",
|
"Gen_LockedDB": "ОШИБКА - Возможно, база данных заблокирована. Проверьте инструменты разработчика F12 -> Консоль или повторите попытку позже.",
|
||||||
|
"Gen_NetworkMask": "",
|
||||||
"Gen_Offline": "Оффлайн",
|
"Gen_Offline": "Оффлайн",
|
||||||
"Gen_Okay": "OK",
|
"Gen_Okay": "OK",
|
||||||
"Gen_Online": "Онлайн",
|
"Gen_Online": "Онлайн",
|
||||||
@@ -326,6 +329,7 @@
|
|||||||
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
||||||
"Gen_SelectToPreview": "Выберите для предварительного просмотра",
|
"Gen_SelectToPreview": "Выберите для предварительного просмотра",
|
||||||
"Gen_Selected_Devices": "Выбранные устройства:",
|
"Gen_Selected_Devices": "Выбранные устройства:",
|
||||||
|
"Gen_Subnet": "",
|
||||||
"Gen_Switch": "Переключить",
|
"Gen_Switch": "Переключить",
|
||||||
"Gen_Upd": "Успешное обновление",
|
"Gen_Upd": "Успешное обновление",
|
||||||
"Gen_Upd_Fail": "Не удалось обновить",
|
"Gen_Upd_Fail": "Не удалось обновить",
|
||||||
@@ -491,9 +495,10 @@
|
|||||||
"Navigation_Workflows": "Рабочие процессы",
|
"Navigation_Workflows": "Рабочие процессы",
|
||||||
"Network_Assign": "Подключитесь к указанному выше сетевому узлу <i class=\"fa fa-server\"></i>",
|
"Network_Assign": "Подключитесь к указанному выше сетевому узлу <i class=\"fa fa-server\"></i>",
|
||||||
"Network_Cant_Assign": "Невозможно назначить корневой узел Интернета в качестве дочернего конечного узла.",
|
"Network_Cant_Assign": "Невозможно назначить корневой узел Интернета в качестве дочернего конечного узла.",
|
||||||
"Network_Cant_Assign_No_Node_Selected": "",
|
"Network_Cant_Assign_No_Node_Selected": "Невозможно назначить, не выбран узел-родитель.",
|
||||||
"Network_Configuration_Error": "Ошибка конфигурации",
|
"Network_Configuration_Error": "Ошибка конфигурации",
|
||||||
"Network_Connected": "Подключенные устройства",
|
"Network_Connected": "Подключенные устройства",
|
||||||
|
"Network_Devices": "Сетевые устройства",
|
||||||
"Network_ManageAdd": "Добавить устройство",
|
"Network_ManageAdd": "Добавить устройство",
|
||||||
"Network_ManageAdd_Name": "Имя устройства",
|
"Network_ManageAdd_Name": "Имя устройства",
|
||||||
"Network_ManageAdd_Name_text": "Имя без специальных символов",
|
"Network_ManageAdd_Name_text": "Имя без специальных символов",
|
||||||
@@ -528,8 +533,8 @@
|
|||||||
"Network_Root": "Корневой узел",
|
"Network_Root": "Корневой узел",
|
||||||
"Network_Root_Not_Configured": "Выберите тип сетевого устройства, например <b>Шлюз</b>, в поле <b>Тип</b> <a href=\"deviceDetails.php?mac=Internet\">корневого Интернет-устройства</a>, чтобы начать настройку этого экрана. <br/><br/> Дополнительную документацию можно найти в руководстве <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank \">Как настроить свою сетевую страницу</a>",
|
"Network_Root_Not_Configured": "Выберите тип сетевого устройства, например <b>Шлюз</b>, в поле <b>Тип</b> <a href=\"deviceDetails.php?mac=Internet\">корневого Интернет-устройства</a>, чтобы начать настройку этого экрана. <br/><br/> Дополнительную документацию можно найти в руководстве <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank \">Как настроить свою сетевую страницу</a>",
|
||||||
"Network_Root_Unconfigurable": "Ненастраиваемый ROOT",
|
"Network_Root_Unconfigurable": "Ненастраиваемый ROOT",
|
||||||
"Network_ShowArchived": "",
|
"Network_ShowArchived": "Показать архивные",
|
||||||
"Network_ShowOffline": "",
|
"Network_ShowOffline": "Показать офлайн устройства",
|
||||||
"Network_Table_Hostname": "Имя хоста",
|
"Network_Table_Hostname": "Имя хоста",
|
||||||
"Network_Table_IP": "IP",
|
"Network_Table_IP": "IP",
|
||||||
"Network_Table_State": "Состояние",
|
"Network_Table_State": "Состояние",
|
||||||
@@ -593,6 +598,7 @@
|
|||||||
"Settings_device_Scanners_desync": "⚠ Расписания сканера устройств не синхронизированы.",
|
"Settings_device_Scanners_desync": "⚠ Расписания сканера устройств не синхронизированы.",
|
||||||
"Settings_device_Scanners_desync_popup": "Расписания сканеров устройств (<code>*_RUN_SCHD</code>) не совпадают. Это приведет к несогласованным онлайн/оффлайн уведомлениям устройства. Если это не предусмотрено, используйте одно и то же расписание для всех включенных <b>🔍Сканеров устройств</b>.",
|
"Settings_device_Scanners_desync_popup": "Расписания сканеров устройств (<code>*_RUN_SCHD</code>) не совпадают. Это приведет к несогласованным онлайн/оффлайн уведомлениям устройства. Если это не предусмотрено, используйте одно и то же расписание для всех включенных <b>🔍Сканеров устройств</b>.",
|
||||||
"Speedtest_Results": "Результаты теста скорости",
|
"Speedtest_Results": "Результаты теста скорости",
|
||||||
|
"Systeminfo_AvailableIps": "",
|
||||||
"Systeminfo_CPU": "CPU",
|
"Systeminfo_CPU": "CPU",
|
||||||
"Systeminfo_CPU_Cores": "Ядра CPU:",
|
"Systeminfo_CPU_Cores": "Ядра CPU:",
|
||||||
"Systeminfo_CPU_Name": "Имя CPU:",
|
"Systeminfo_CPU_Name": "Имя CPU:",
|
||||||
@@ -718,7 +724,7 @@
|
|||||||
"devices_old": "Актуализируется…",
|
"devices_old": "Актуализируется…",
|
||||||
"general_event_description": "Событие, которое вы инициировали, может занять некоторое время, прежде чем фоновые процессы завершатся. Выполнение завершится, как только очередь выполнения, указанная ниже, опустеет (Проверьте <a href='/maintenance.php#tab_Logging'>журнал ошибок</a> при возникновении проблем). <br/> <br/>· · Очередь выполнения:",
|
"general_event_description": "Событие, которое вы инициировали, может занять некоторое время, прежде чем фоновые процессы завершатся. Выполнение завершится, как только очередь выполнения, указанная ниже, опустеет (Проверьте <a href='/maintenance.php#tab_Logging'>журнал ошибок</a> при возникновении проблем). <br/> <br/>· · Очередь выполнения:",
|
||||||
"general_event_title": "Выполнение специального события",
|
"general_event_title": "Выполнение специального события",
|
||||||
"go_to_device_event_tooltip": "",
|
"go_to_device_event_tooltip": "Перейти к устройству",
|
||||||
"go_to_node_event_tooltip": "Переход на страницу \"Сеть\" данного узла",
|
"go_to_node_event_tooltip": "Переход на страницу \"Сеть\" данного узла",
|
||||||
"new_version_available": "Доступна новая версия.",
|
"new_version_available": "Доступна новая версия.",
|
||||||
"report_guid": "Идентификатор уведомления:",
|
"report_guid": "Идентификатор уведомления:",
|
||||||
@@ -726,7 +732,7 @@
|
|||||||
"report_select_format": "Выбрать формат:",
|
"report_select_format": "Выбрать формат:",
|
||||||
"report_time": "Время уведомления:",
|
"report_time": "Время уведомления:",
|
||||||
"run_event_tooltip": "Включите настройку и сначала сохраните изменения, прежде чем запускать ее.",
|
"run_event_tooltip": "Включите настройку и сначала сохраните изменения, прежде чем запускать ее.",
|
||||||
"select_icon_event_tooltip": "",
|
"select_icon_event_tooltip": "Выбрать значок",
|
||||||
"settings_core_icon": "fa-solid fa-gem",
|
"settings_core_icon": "fa-solid fa-gem",
|
||||||
"settings_core_label": "Основные",
|
"settings_core_label": "Основные",
|
||||||
"settings_device_scanners": "Сканеры устройств, используемые для обнаружения устройств, записывающих данные в таблицу базы данных CurrentScan.",
|
"settings_device_scanners": "Сканеры устройств, используемые для обнаружения устройств, записывающих данные в таблицу базы данных CurrentScan.",
|
||||||
|
|||||||
6
front/php/templates/language/tr_tr.json
Normal file → Executable file
6
front/php/templates/language/tr_tr.json
Normal file → Executable file
@@ -301,6 +301,7 @@
|
|||||||
"Gen_Cancel": "İptal",
|
"Gen_Cancel": "İptal",
|
||||||
"Gen_Change": "Değiştir",
|
"Gen_Change": "Değiştir",
|
||||||
"Gen_Copy": "Çalıştır",
|
"Gen_Copy": "Çalıştır",
|
||||||
|
"Gen_CopyToClipboard": "",
|
||||||
"Gen_DataUpdatedUITakesTime": "TAMAM - Eğer bir tarama çalışıyorsa arayüzün güncellenmesi biraz zaman alabilir.",
|
"Gen_DataUpdatedUITakesTime": "TAMAM - Eğer bir tarama çalışıyorsa arayüzün güncellenmesi biraz zaman alabilir.",
|
||||||
"Gen_Delete": "Sil",
|
"Gen_Delete": "Sil",
|
||||||
"Gen_DeleteAll": "Tümünü sil",
|
"Gen_DeleteAll": "Tümünü sil",
|
||||||
@@ -308,7 +309,9 @@
|
|||||||
"Gen_Error": "Hata",
|
"Gen_Error": "Hata",
|
||||||
"Gen_Filter": "Filtre",
|
"Gen_Filter": "Filtre",
|
||||||
"Gen_Generate": "Oluştur",
|
"Gen_Generate": "Oluştur",
|
||||||
|
"Gen_InvalidMac": "",
|
||||||
"Gen_LockedDB": "HATA - Veritabanı kilitlenmiş olabilir - F12 Geliştirici araçlarını -> Konsol kısmını kontrol edin veya daha sonra tekrar deneyin.",
|
"Gen_LockedDB": "HATA - Veritabanı kilitlenmiş olabilir - F12 Geliştirici araçlarını -> Konsol kısmını kontrol edin veya daha sonra tekrar deneyin.",
|
||||||
|
"Gen_NetworkMask": "",
|
||||||
"Gen_Offline": "Çevrimdışı",
|
"Gen_Offline": "Çevrimdışı",
|
||||||
"Gen_Okay": "Tamam",
|
"Gen_Okay": "Tamam",
|
||||||
"Gen_Online": "Çevrimiçi",
|
"Gen_Online": "Çevrimiçi",
|
||||||
@@ -326,6 +329,7 @@
|
|||||||
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
||||||
"Gen_SelectToPreview": "Önizleme yapmak için seçin",
|
"Gen_SelectToPreview": "Önizleme yapmak için seçin",
|
||||||
"Gen_Selected_Devices": "Seçilmiş Cihazlar:",
|
"Gen_Selected_Devices": "Seçilmiş Cihazlar:",
|
||||||
|
"Gen_Subnet": "",
|
||||||
"Gen_Switch": "Switch",
|
"Gen_Switch": "Switch",
|
||||||
"Gen_Upd": "Başarılı bir şekilde güncellendi",
|
"Gen_Upd": "Başarılı bir şekilde güncellendi",
|
||||||
"Gen_Upd_Fail": "Güncelleme işlemi başarısız oldu",
|
"Gen_Upd_Fail": "Güncelleme işlemi başarısız oldu",
|
||||||
@@ -494,6 +498,7 @@
|
|||||||
"Network_Cant_Assign_No_Node_Selected": "",
|
"Network_Cant_Assign_No_Node_Selected": "",
|
||||||
"Network_Configuration_Error": "Kurulum Hatası",
|
"Network_Configuration_Error": "Kurulum Hatası",
|
||||||
"Network_Connected": "Bağlanmış cihazlar",
|
"Network_Connected": "Bağlanmış cihazlar",
|
||||||
|
"Network_Devices": "",
|
||||||
"Network_ManageAdd": "Cihaz Ekle",
|
"Network_ManageAdd": "Cihaz Ekle",
|
||||||
"Network_ManageAdd_Name": "Cihaz İsmi",
|
"Network_ManageAdd_Name": "Cihaz İsmi",
|
||||||
"Network_ManageAdd_Name_text": "Özel karakterler olmadan isim veriniz",
|
"Network_ManageAdd_Name_text": "Özel karakterler olmadan isim veriniz",
|
||||||
@@ -593,6 +598,7 @@
|
|||||||
"Settings_device_Scanners_desync": "",
|
"Settings_device_Scanners_desync": "",
|
||||||
"Settings_device_Scanners_desync_popup": "",
|
"Settings_device_Scanners_desync_popup": "",
|
||||||
"Speedtest_Results": "",
|
"Speedtest_Results": "",
|
||||||
|
"Systeminfo_AvailableIps": "",
|
||||||
"Systeminfo_CPU": "",
|
"Systeminfo_CPU": "",
|
||||||
"Systeminfo_CPU_Cores": "",
|
"Systeminfo_CPU_Cores": "",
|
||||||
"Systeminfo_CPU_Name": "",
|
"Systeminfo_CPU_Name": "",
|
||||||
|
|||||||
24
front/php/templates/language/uk_ua.json
Normal file → Executable file
24
front/php/templates/language/uk_ua.json
Normal file → Executable file
@@ -9,7 +9,7 @@
|
|||||||
"About_Exit": "Вийти",
|
"About_Exit": "Вийти",
|
||||||
"About_Title": "Сканер безпеки мережі та структура сповіщень",
|
"About_Title": "Сканер безпеки мережі та структура сповіщень",
|
||||||
"AppEvents_AppEventProcessed": "Оброблено",
|
"AppEvents_AppEventProcessed": "Оброблено",
|
||||||
"AppEvents_DateTimeCreated": "Виявлено",
|
"AppEvents_DateTimeCreated": "Зареєстровано",
|
||||||
"AppEvents_Extra": "Екстра",
|
"AppEvents_Extra": "Екстра",
|
||||||
"AppEvents_GUID": "GUID події програми",
|
"AppEvents_GUID": "GUID події програми",
|
||||||
"AppEvents_Helper1": "Помічник 1",
|
"AppEvents_Helper1": "Помічник 1",
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
"DevDetail_CustomProps_reset_info": "Це призведе до видалення настроюваних властивостей на цьому пристрої та скидання їх до значень за замовчуванням.",
|
"DevDetail_CustomProps_reset_info": "Це призведе до видалення настроюваних властивостей на цьому пристрої та скидання їх до значень за замовчуванням.",
|
||||||
"DevDetail_DisplayFields_Title": "Дисплей",
|
"DevDetail_DisplayFields_Title": "Дисплей",
|
||||||
"DevDetail_EveandAl_AlertAllEvents": "Повідомлення про події",
|
"DevDetail_EveandAl_AlertAllEvents": "Повідомлення про події",
|
||||||
"DevDetail_EveandAl_AlertDown": "Сповіщення вниз",
|
"DevDetail_EveandAl_AlertDown": "Агент вниз",
|
||||||
"DevDetail_EveandAl_Archived": "Архівовано",
|
"DevDetail_EveandAl_Archived": "Архівовано",
|
||||||
"DevDetail_EveandAl_NewDevice": "Новий пристроїв",
|
"DevDetail_EveandAl_NewDevice": "Новий пристроїв",
|
||||||
"DevDetail_EveandAl_NewDevice_Tooltip": "Відображатиме новий статус для пристрою та включатиме його до списків, коли фільтр нових пристроїв активний. Не впливає на сповіщення.",
|
"DevDetail_EveandAl_NewDevice_Tooltip": "Відображатиме новий статус для пристрою та включатиме його до списків, коли фільтр нових пристроїв активний. Не впливає на сповіщення.",
|
||||||
@@ -185,7 +185,7 @@
|
|||||||
"DevDetail_button_AddIcon": "Додати новий значок",
|
"DevDetail_button_AddIcon": "Додати новий значок",
|
||||||
"DevDetail_button_AddIcon_Help": "Вставте HTML-тег SVG або значок HTML-тегу Font Awesome. Щоб дізнатися більше, прочитайте <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">документацію щодо значків</a>.",
|
"DevDetail_button_AddIcon_Help": "Вставте HTML-тег SVG або значок HTML-тегу Font Awesome. Щоб дізнатися більше, прочитайте <a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/ICONS.md\" target=\"_blank\">документацію щодо значків</a>.",
|
||||||
"DevDetail_button_AddIcon_Tooltip": "Додайте нову піктограму до цього пристрою, яка ще не доступна в спадному меню.",
|
"DevDetail_button_AddIcon_Tooltip": "Додайте нову піктограму до цього пристрою, яка ще не доступна в спадному меню.",
|
||||||
"DevDetail_button_Delete": "Видалити пристрій",
|
"DevDetail_button_Delete": "Видалити Пристрій",
|
||||||
"DevDetail_button_DeleteEvents": "Видалити події",
|
"DevDetail_button_DeleteEvents": "Видалити події",
|
||||||
"DevDetail_button_DeleteEvents_Warning": "Ви впевнені, що бажаєте видалити всі події цього пристрою?<br><br>(це очистить <b>історію подій</b> і <b>сеанси</b> та може допомогти з постійними (постійними) ) сповіщення)",
|
"DevDetail_button_DeleteEvents_Warning": "Ви впевнені, що бажаєте видалити всі події цього пристрою?<br><br>(це очистить <b>історію подій</b> і <b>сеанси</b> та може допомогти з постійними (постійними) ) сповіщення)",
|
||||||
"DevDetail_button_Delete_ask": "Ви впевнені, що хочете видалити цей пристрій? Натомість ви також можете заархівувати його.",
|
"DevDetail_button_Delete_ask": "Ви впевнені, що хочете видалити цей пристрій? Натомість ви також можете заархівувати його.",
|
||||||
@@ -211,7 +211,7 @@
|
|||||||
"Device_Shortcut_Favorites": "Вибране",
|
"Device_Shortcut_Favorites": "Вибране",
|
||||||
"Device_Shortcut_NewDevices": "Нові пристрої",
|
"Device_Shortcut_NewDevices": "Нові пристрої",
|
||||||
"Device_Shortcut_OnlineChart": "Наявність пристрою",
|
"Device_Shortcut_OnlineChart": "Наявність пристрою",
|
||||||
"Device_TableHead_AlertDown": "Сповіщення вниз",
|
"Device_TableHead_AlertDown": "Агент Вниз",
|
||||||
"Device_TableHead_Connected_Devices": "Зв'язки",
|
"Device_TableHead_Connected_Devices": "Зв'язки",
|
||||||
"Device_TableHead_CustomProps": "Реквізит / дії",
|
"Device_TableHead_CustomProps": "Реквізит / дії",
|
||||||
"Device_TableHead_FQDN": "FQDN",
|
"Device_TableHead_FQDN": "FQDN",
|
||||||
@@ -301,6 +301,7 @@
|
|||||||
"Gen_Cancel": "Скасувати",
|
"Gen_Cancel": "Скасувати",
|
||||||
"Gen_Change": "Зміна",
|
"Gen_Change": "Зміна",
|
||||||
"Gen_Copy": "Запустити",
|
"Gen_Copy": "Запустити",
|
||||||
|
"Gen_CopyToClipboard": "Копіювати в буфер обміну",
|
||||||
"Gen_DataUpdatedUITakesTime": "Добре. Оновлення інтерфейсу може зайняти деякий час, якщо сканування виконується.",
|
"Gen_DataUpdatedUITakesTime": "Добре. Оновлення інтерфейсу може зайняти деякий час, якщо сканування виконується.",
|
||||||
"Gen_Delete": "Видалити",
|
"Gen_Delete": "Видалити",
|
||||||
"Gen_DeleteAll": "Видалити все",
|
"Gen_DeleteAll": "Видалити все",
|
||||||
@@ -308,7 +309,9 @@
|
|||||||
"Gen_Error": "Помилка",
|
"Gen_Error": "Помилка",
|
||||||
"Gen_Filter": "Фільтр",
|
"Gen_Filter": "Фільтр",
|
||||||
"Gen_Generate": "Генерувати",
|
"Gen_Generate": "Генерувати",
|
||||||
|
"Gen_InvalidMac": "Недійсна Mac-адреса.",
|
||||||
"Gen_LockedDB": "ПОМИЛКА – БД може бути заблоковано – перевірте F12 Інструменти розробника -> Консоль або спробуйте пізніше.",
|
"Gen_LockedDB": "ПОМИЛКА – БД може бути заблоковано – перевірте F12 Інструменти розробника -> Консоль або спробуйте пізніше.",
|
||||||
|
"Gen_NetworkMask": "Маска мережі",
|
||||||
"Gen_Offline": "Офлайн",
|
"Gen_Offline": "Офлайн",
|
||||||
"Gen_Okay": "Гаразд",
|
"Gen_Okay": "Гаразд",
|
||||||
"Gen_Online": "Онлайн",
|
"Gen_Online": "Онлайн",
|
||||||
@@ -326,6 +329,7 @@
|
|||||||
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
||||||
"Gen_SelectToPreview": "Виберіть для попереднього перегляду",
|
"Gen_SelectToPreview": "Виберіть для попереднього перегляду",
|
||||||
"Gen_Selected_Devices": "Вибрані пристрої:",
|
"Gen_Selected_Devices": "Вибрані пристрої:",
|
||||||
|
"Gen_Subnet": "Підмережа",
|
||||||
"Gen_Switch": "Перемикач",
|
"Gen_Switch": "Перемикач",
|
||||||
"Gen_Upd": "Оновлено успішно",
|
"Gen_Upd": "Оновлено успішно",
|
||||||
"Gen_Upd_Fail": "Не вдалося оновити",
|
"Gen_Upd_Fail": "Не вдалося оновити",
|
||||||
@@ -494,6 +498,7 @@
|
|||||||
"Network_Cant_Assign_No_Node_Selected": "Неможливо призначити, не вибрано батьківський вузол.",
|
"Network_Cant_Assign_No_Node_Selected": "Неможливо призначити, не вибрано батьківський вузол.",
|
||||||
"Network_Configuration_Error": "Помилка конфігурації",
|
"Network_Configuration_Error": "Помилка конфігурації",
|
||||||
"Network_Connected": "Підключені пристрої",
|
"Network_Connected": "Підключені пристрої",
|
||||||
|
"Network_Devices": "Мережеві пристрої",
|
||||||
"Network_ManageAdd": "Додати пристрій",
|
"Network_ManageAdd": "Додати пристрій",
|
||||||
"Network_ManageAdd_Name": "Назва пристрою",
|
"Network_ManageAdd_Name": "Назва пристрою",
|
||||||
"Network_ManageAdd_Name_text": "Назва без спеціальних символів",
|
"Network_ManageAdd_Name_text": "Назва без спеціальних символів",
|
||||||
@@ -501,7 +506,7 @@
|
|||||||
"Network_ManageAdd_Port_text": "залиште порожнім для wifi та powerline",
|
"Network_ManageAdd_Port_text": "залиште порожнім для wifi та powerline",
|
||||||
"Network_ManageAdd_Submit": "Додати пристрій",
|
"Network_ManageAdd_Submit": "Додати пристрій",
|
||||||
"Network_ManageAdd_Type": "Тип пристрою",
|
"Network_ManageAdd_Type": "Тип пристрою",
|
||||||
"Network_ManageAdd_Type_text": "-- Виберіть тип --",
|
"Network_ManageAdd_Type_text": "-- Виберіть Тип --",
|
||||||
"Network_ManageAssign": "Призначити",
|
"Network_ManageAssign": "Призначити",
|
||||||
"Network_ManageDel": "Видалити пристрій",
|
"Network_ManageDel": "Видалити пристрій",
|
||||||
"Network_ManageDel_Name": "Пристрій для видалення",
|
"Network_ManageDel_Name": "Пристрій для видалення",
|
||||||
@@ -536,7 +541,7 @@
|
|||||||
"Network_Title": "Огляд мережі",
|
"Network_Title": "Огляд мережі",
|
||||||
"Network_UnassignedDevices": "Непризначені пристрої",
|
"Network_UnassignedDevices": "Непризначені пристрої",
|
||||||
"Notifications_All": "Усі сповіщення",
|
"Notifications_All": "Усі сповіщення",
|
||||||
"Notifications_Mark_All_Read": "Позначити все як прочитане",
|
"Notifications_Mark_All_Read": "Позначити як прочитане",
|
||||||
"PIALERT_WEB_PASSWORD_description": "Пароль за умовчанням — <code>123456</code>. Щоб змінити пароль, запустіть <code>/app/back/pialert-cli</code> у контейнері або скористайтеся <a onclick=\"toggleAllSettings()\" href=\"#SETPWD_RUN\"><code>SETPWD_RUN</code> Плагін встановлення пароля</a>.",
|
"PIALERT_WEB_PASSWORD_description": "Пароль за умовчанням — <code>123456</code>. Щоб змінити пароль, запустіть <code>/app/back/pialert-cli</code> у контейнері або скористайтеся <a onclick=\"toggleAllSettings()\" href=\"#SETPWD_RUN\"><code>SETPWD_RUN</code> Плагін встановлення пароля</a>.",
|
||||||
"PIALERT_WEB_PASSWORD_name": "Пароль для входу",
|
"PIALERT_WEB_PASSWORD_name": "Пароль для входу",
|
||||||
"PIALERT_WEB_PROTECTION_description": "Якщо ввімкнено, відображається діалогове вікно входу. Уважно прочитайте нижче, якщо вас заблокують у вашому екземплярі.",
|
"PIALERT_WEB_PROTECTION_description": "Якщо ввімкнено, відображається діалогове вікно входу. Уважно прочитайте нижче, якщо вас заблокують у вашому екземплярі.",
|
||||||
@@ -562,7 +567,7 @@
|
|||||||
"Presence_Key_OnlineNow_desc": "Під час останнього сканування пристрій виявлено як онлайн.",
|
"Presence_Key_OnlineNow_desc": "Під час останнього сканування пристрій виявлено як онлайн.",
|
||||||
"Presence_Key_OnlinePast": "Минулий онлайн",
|
"Presence_Key_OnlinePast": "Минулий онлайн",
|
||||||
"Presence_Key_OnlinePastMiss": "Минулий онлайн (пропущений матч)",
|
"Presence_Key_OnlinePastMiss": "Минулий онлайн (пропущений матч)",
|
||||||
"Presence_Key_OnlinePastMiss_desc": "Пристрій був онлайн, але зараз офлайн, але початковий сеанс може бути відсутнім або містить суперечливі дані. (може бути помилка - будь ласка, надішліть PR, якщо ви знаєте, як це виправити - я трохи загубився в коді тут)",
|
"Presence_Key_OnlinePastMiss_desc": "Пристрій був онлайн у минулому, але зараз офлайн, але початковий сеанс може бути відсутнім або містити суперечливі дані.",
|
||||||
"Presence_Key_OnlinePast_desc": "Пристрій був онлайн, але зараз офлайн.",
|
"Presence_Key_OnlinePast_desc": "Пристрій був онлайн, але зараз офлайн.",
|
||||||
"Presence_Loading": "Завантаження…",
|
"Presence_Loading": "Завантаження…",
|
||||||
"Presence_Shortcut_AllDevices": "Мої пристрої",
|
"Presence_Shortcut_AllDevices": "Мої пристрої",
|
||||||
@@ -593,6 +598,7 @@
|
|||||||
"Settings_device_Scanners_desync": "⚠ Розклади сканування пристрою не синхронізовані.",
|
"Settings_device_Scanners_desync": "⚠ Розклади сканування пристрою не синхронізовані.",
|
||||||
"Settings_device_Scanners_desync_popup": "Розклади сканерів пристроїв (<code>*_RUN_SCHD</code>) не однакові. Це призведе до непослідовних сповіщень пристрою онлайн/офлайн. Якщо це не передбачено, використовуйте той самий розклад для всіх увімкнених <b>🔍сканерів пристроїв</b>.",
|
"Settings_device_Scanners_desync_popup": "Розклади сканерів пристроїв (<code>*_RUN_SCHD</code>) не однакові. Це призведе до непослідовних сповіщень пристрою онлайн/офлайн. Якщо це не передбачено, використовуйте той самий розклад для всіх увімкнених <b>🔍сканерів пристроїв</b>.",
|
||||||
"Speedtest_Results": "Результати Speedtest",
|
"Speedtest_Results": "Результати Speedtest",
|
||||||
|
"Systeminfo_AvailableIps": "Доступні IP-адреси",
|
||||||
"Systeminfo_CPU": "CPU",
|
"Systeminfo_CPU": "CPU",
|
||||||
"Systeminfo_CPU_Cores": "Ядра ЦП:",
|
"Systeminfo_CPU_Cores": "Ядра ЦП:",
|
||||||
"Systeminfo_CPU_Name": "Назва ЦП:",
|
"Systeminfo_CPU_Name": "Назва ЦП:",
|
||||||
@@ -625,7 +631,7 @@
|
|||||||
"Systeminfo_Network_HTTP_Referer": "HTTP реферер:",
|
"Systeminfo_Network_HTTP_Referer": "HTTP реферер:",
|
||||||
"Systeminfo_Network_HTTP_Referer_String": "Немає реферера HTTP",
|
"Systeminfo_Network_HTTP_Referer_String": "Немає реферера HTTP",
|
||||||
"Systeminfo_Network_Hardware": "Мережеве обладнання",
|
"Systeminfo_Network_Hardware": "Мережеве обладнання",
|
||||||
"Systeminfo_Network_Hardware_Interface_Mask": "Маска мережі",
|
"Systeminfo_Network_Hardware_Interface_Mask": "Маска Мережі",
|
||||||
"Systeminfo_Network_Hardware_Interface_Name": "Назва інтерфейсу",
|
"Systeminfo_Network_Hardware_Interface_Name": "Назва інтерфейсу",
|
||||||
"Systeminfo_Network_Hardware_Interface_RX": "Отримано",
|
"Systeminfo_Network_Hardware_Interface_RX": "Отримано",
|
||||||
"Systeminfo_Network_Hardware_Interface_TX": "Передано",
|
"Systeminfo_Network_Hardware_Interface_TX": "Передано",
|
||||||
@@ -731,7 +737,7 @@
|
|||||||
"settings_core_label": "Ядро",
|
"settings_core_label": "Ядро",
|
||||||
"settings_device_scanners": "Сканери пристроїв, які використовуються для виявлення пристроїв, які записують дані в таблицю бази даних CurrentScan.",
|
"settings_device_scanners": "Сканери пристроїв, які використовуються для виявлення пристроїв, які записують дані в таблицю бази даних CurrentScan.",
|
||||||
"settings_device_scanners_icon": "fa-solid fa-збільшувальне-скло-плюс",
|
"settings_device_scanners_icon": "fa-solid fa-збільшувальне-скло-плюс",
|
||||||
"settings_device_scanners_info": "Завантажте ще більше сканерів пристроїв за допомогою параметра <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a>",
|
"settings_device_scanners_info": "Завантажте більше сканерів пристроїв за допомогою налаштування <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a>",
|
||||||
"settings_device_scanners_label": "Сканери пристроїв",
|
"settings_device_scanners_label": "Сканери пристроїв",
|
||||||
"settings_enabled": "Увімкнені налаштування",
|
"settings_enabled": "Увімкнені налаштування",
|
||||||
"settings_enabled_icon": "fa-твердий fa-перемикач",
|
"settings_enabled_icon": "fa-твердий fa-перемикач",
|
||||||
|
|||||||
194
front/php/templates/language/zh_cn.json
Normal file → Executable file
194
front/php/templates/language/zh_cn.json
Normal file → Executable file
@@ -22,7 +22,7 @@
|
|||||||
"AppEvents_ObjectPlugin": "链接插件",
|
"AppEvents_ObjectPlugin": "链接插件",
|
||||||
"AppEvents_ObjectPrimaryID": "主ID",
|
"AppEvents_ObjectPrimaryID": "主ID",
|
||||||
"AppEvents_ObjectSecondaryID": "次级ID",
|
"AppEvents_ObjectSecondaryID": "次级ID",
|
||||||
"AppEvents_ObjectStatus": "状态(记录时)",
|
"AppEvents_ObjectStatus": "登录状态",
|
||||||
"AppEvents_ObjectStatusColumn": "状态栏",
|
"AppEvents_ObjectStatusColumn": "状态栏",
|
||||||
"AppEvents_ObjectType": "对象类型",
|
"AppEvents_ObjectType": "对象类型",
|
||||||
"AppEvents_Plugin": "插件",
|
"AppEvents_Plugin": "插件",
|
||||||
@@ -47,9 +47,9 @@
|
|||||||
"BackDevices_DBTools_DelEventsError": "删除事件时出错",
|
"BackDevices_DBTools_DelEventsError": "删除事件时出错",
|
||||||
"BackDevices_DBTools_ImportCSV": "CSV 文件中的设备已成功导入。",
|
"BackDevices_DBTools_ImportCSV": "CSV 文件中的设备已成功导入。",
|
||||||
"BackDevices_DBTools_ImportCSVError": "无法导入 CSV 文件。请确保格式正确。",
|
"BackDevices_DBTools_ImportCSVError": "无法导入 CSV 文件。请确保格式正确。",
|
||||||
"BackDevices_DBTools_ImportCSVMissing": "在 <b>/config/devices.csv</b> 下找不到 CSV 文件。",
|
"BackDevices_DBTools_ImportCSVMissing": "在 <b>/config/devices.csv</b> 下找不到 CSV 文件",
|
||||||
"BackDevices_DBTools_Purge": "最旧的备份已被删除",
|
"BackDevices_DBTools_Purge": "最旧的备份已被删除",
|
||||||
"BackDevices_DBTools_UpdDev": "设备更新成功",
|
"BackDevices_DBTools_UpdDev": "设备更新成功。如果正在扫描中,主设备列表可能需要时间重新加载。",
|
||||||
"BackDevices_DBTools_UpdDevError": "更新设备时出错",
|
"BackDevices_DBTools_UpdDevError": "更新设备时出错",
|
||||||
"BackDevices_DBTools_Upgrade": "数据库升级成功",
|
"BackDevices_DBTools_Upgrade": "数据库升级成功",
|
||||||
"BackDevices_DBTools_UpgradeError": "数据库升级失败",
|
"BackDevices_DBTools_UpgradeError": "数据库升级失败",
|
||||||
@@ -67,12 +67,12 @@
|
|||||||
"DISCOVER_PLUGINS_description": "禁用此选项可加快初始化和设置保存的速度。当禁用时,插件不会被发现,并且您无法将新插件添加到 <code>LOADED_PLUGINS</code>设置中。",
|
"DISCOVER_PLUGINS_description": "禁用此选项可加快初始化和设置保存的速度。当禁用时,插件不会被发现,并且您无法将新插件添加到 <code>LOADED_PLUGINS</code>设置中。",
|
||||||
"DISCOVER_PLUGINS_name": "发现插件",
|
"DISCOVER_PLUGINS_name": "发现插件",
|
||||||
"DevDetail_Children_Title": "子代关系",
|
"DevDetail_Children_Title": "子代关系",
|
||||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> 从设备复制详细信息",
|
"DevDetail_Copy_Device_Title": "从设备复制详细信息",
|
||||||
"DevDetail_Copy_Device_Tooltip": "从下拉列表中复制设备的详细信息。此页面上的所有内容都将被覆盖",
|
"DevDetail_Copy_Device_Tooltip": "从下拉列表中复制设备的详细信息。此页面上的所有内容都将被覆盖",
|
||||||
"DevDetail_CustomProperties_Title": "自定义属性",
|
"DevDetail_CustomProperties_Title": "自定义属性",
|
||||||
"DevDetail_CustomProps_reset_info": "这将删除此设备上的自定义属性并将其重置为默认值。",
|
"DevDetail_CustomProps_reset_info": "这将删除此设备上的自定义属性并将其重置为默认值。",
|
||||||
"DevDetail_DisplayFields_Title": "显示",
|
"DevDetail_DisplayFields_Title": "显示",
|
||||||
"DevDetail_EveandAl_AlertAllEvents": "提醒所有事件",
|
"DevDetail_EveandAl_AlertAllEvents": "提醒事件",
|
||||||
"DevDetail_EveandAl_AlertDown": "警报关闭",
|
"DevDetail_EveandAl_AlertDown": "警报关闭",
|
||||||
"DevDetail_EveandAl_Archived": "已归档",
|
"DevDetail_EveandAl_Archived": "已归档",
|
||||||
"DevDetail_EveandAl_NewDevice": "新设备",
|
"DevDetail_EveandAl_NewDevice": "新设备",
|
||||||
@@ -87,7 +87,7 @@
|
|||||||
"DevDetail_GoToNetworkNode": "导航到指定节点的网络页面。",
|
"DevDetail_GoToNetworkNode": "导航到指定节点的网络页面。",
|
||||||
"DevDetail_Icon": "图标",
|
"DevDetail_Icon": "图标",
|
||||||
"DevDetail_Icon_Descr": "输入一个不带 fa- 前缀或带有完整类的 Font Awesome 图标名称,例如:fa fa-brands fa-apple。",
|
"DevDetail_Icon_Descr": "输入一个不带 fa- 前缀或带有完整类的 Font Awesome 图标名称,例如:fa fa-brands fa-apple。",
|
||||||
"DevDetail_Loading": "加载中...",
|
"DevDetail_Loading": "加载中…",
|
||||||
"DevDetail_MainInfo_Comments": "评论",
|
"DevDetail_MainInfo_Comments": "评论",
|
||||||
"DevDetail_MainInfo_Favorite": "收藏",
|
"DevDetail_MainInfo_Favorite": "收藏",
|
||||||
"DevDetail_MainInfo_Group": "组",
|
"DevDetail_MainInfo_Group": "组",
|
||||||
@@ -107,7 +107,7 @@
|
|||||||
"DevDetail_Network_Node_hover": "选择当前设备连接到的父网络设备,以填充网络树。",
|
"DevDetail_Network_Node_hover": "选择当前设备连接到的父网络设备,以填充网络树。",
|
||||||
"DevDetail_Network_Port_hover": "此设备连接到父网络设备上的端口。如果留空,则网络树中会显示一个 wifi 图标。",
|
"DevDetail_Network_Port_hover": "此设备连接到父网络设备上的端口。如果留空,则网络树中会显示一个 wifi 图标。",
|
||||||
"DevDetail_Nmap_Scans": "手动 Nmap 扫描",
|
"DevDetail_Nmap_Scans": "手动 Nmap 扫描",
|
||||||
"DevDetail_Nmap_Scans_desc": "您可以在此处执行手动 NMAP 扫描。您还可以通过服务和端口 (NMAP) 插件安排定期自动 NMAP 扫描。前往<a href='/settings.php' target='_blank'>设置</a>了解更多信息",
|
"DevDetail_Nmap_Scans_desc": "您可以在此处执行手动 NMAP 扫描。您还可以通过服务和端口 (NMAP) 插件安排定期自动 NMAP 扫描。前往<a href= \"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/nmap_scan\" target=\"_blank\">Docs</a>了解更多信息",
|
||||||
"DevDetail_Nmap_buttonDefault": "默认扫描",
|
"DevDetail_Nmap_buttonDefault": "默认扫描",
|
||||||
"DevDetail_Nmap_buttonDefault_text": "默认扫描:Nmap 会扫描请求的每个扫描协议的前 1,000 个端口。这将捕获大约 93% 的 TCP 端口和 49% 的 UDP 端口。(大约 5 秒)",
|
"DevDetail_Nmap_buttonDefault_text": "默认扫描:Nmap 会扫描请求的每个扫描协议的前 1,000 个端口。这将捕获大约 93% 的 TCP 端口和 49% 的 UDP 端口。(大约 5 秒)",
|
||||||
"DevDetail_Nmap_buttonDetail": "详细扫描",
|
"DevDetail_Nmap_buttonDetail": "详细扫描",
|
||||||
@@ -179,7 +179,7 @@
|
|||||||
"DevDetail_Tools_WOL": "WoL唤醒 ",
|
"DevDetail_Tools_WOL": "WoL唤醒 ",
|
||||||
"DevDetail_Tools_WOL_noti": "局域网唤醒",
|
"DevDetail_Tools_WOL_noti": "局域网唤醒",
|
||||||
"DevDetail_Tools_WOL_noti_text": "将唤醒命令被发送到广播地址。如果目标不在 NetAlertX 的子网/VLAN 中,目标设备将不会响应。",
|
"DevDetail_Tools_WOL_noti_text": "将唤醒命令被发送到广播地址。如果目标不在 NetAlertX 的子网/VLAN 中,目标设备将不会响应。",
|
||||||
"DevDetail_Type_hover": "设备的类型。您选择任意预定义的网络设备(例如:AP、防火墙、路由器、交换机...),它们将作为可能的父网络节点显示在网络树配置中。",
|
"DevDetail_Type_hover": "设备的类型。您选择任意预定义的网络设备(例如:AP、防火墙、路由器、交换机…),它们将作为可能的父网络节点显示在网络树配置中。",
|
||||||
"DevDetail_Vendor_hover": "自动检测制造商。但你可以自定义.",
|
"DevDetail_Vendor_hover": "自动检测制造商。但你可以自定义.",
|
||||||
"DevDetail_WOL_Title": "<i class=\"fa fa-power-off\"></i> 局域网唤醒",
|
"DevDetail_WOL_Title": "<i class=\"fa fa-power-off\"></i> 局域网唤醒",
|
||||||
"DevDetail_button_AddIcon": "添加图标",
|
"DevDetail_button_AddIcon": "添加图标",
|
||||||
@@ -196,7 +196,7 @@
|
|||||||
"DevDetail_button_Save": "保存",
|
"DevDetail_button_Save": "保存",
|
||||||
"DeviceEdit_ValidMacIp": "请输入有效的<b>Mac</b>和<b>IP</b>地址。",
|
"DeviceEdit_ValidMacIp": "请输入有效的<b>Mac</b>和<b>IP</b>地址。",
|
||||||
"Device_MultiEdit": "编辑",
|
"Device_MultiEdit": "编辑",
|
||||||
"Device_MultiEdit_Backup": "小心,输入错误的值将破坏您的设置。请先备份您的数据库或设备配置(<a href=\"php/server/devices.php?action=ExportCSV\">点击下载<i class=\"fa-solid fa-download fa-bounce\"></i></a>)。在<a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\"_blank\">备份文档</a>中了解如何从此文件恢复设备。",
|
"Device_MultiEdit_Backup": "小心,输入错误的值将破坏您的设置。请先备份您的数据库或设备配置(<a href=\"php/server/devices.php?action=ExportCSV\">点击下载<i class=\"fa-solid fa-download fa-bounce\"></i></a>)。在<a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/BACKUPS.md#scenario-2-corrupted-database\" target=\"_blank\">备份文档</a>中了解如何从此文件恢复设备。要应用更改,请在每个需要更新的字段点击<b>保存<i class='fa-solid fa-save'></i></b>图标。",
|
||||||
"Device_MultiEdit_Fields": "编辑:",
|
"Device_MultiEdit_Fields": "编辑:",
|
||||||
"Device_MultiEdit_MassActions": "谨慎操作:",
|
"Device_MultiEdit_MassActions": "谨慎操作:",
|
||||||
"Device_MultiEdit_Tooltip": "小心。 单击此按钮会将左侧的值应用到上面选择的所有设备。",
|
"Device_MultiEdit_Tooltip": "小心。 单击此按钮会将左侧的值应用到上面选择的所有设备。",
|
||||||
@@ -230,7 +230,7 @@
|
|||||||
"Device_TableHead_NetworkSite": "网络站点",
|
"Device_TableHead_NetworkSite": "网络站点",
|
||||||
"Device_TableHead_Owner": "所有者",
|
"Device_TableHead_Owner": "所有者",
|
||||||
"Device_TableHead_ParentRelType": "关系类型",
|
"Device_TableHead_ParentRelType": "关系类型",
|
||||||
"Device_TableHead_Parent_MAC": "父节点",
|
"Device_TableHead_Parent_MAC": "父网络节点",
|
||||||
"Device_TableHead_Port": "端口",
|
"Device_TableHead_Port": "端口",
|
||||||
"Device_TableHead_PresentLastScan": "检测",
|
"Device_TableHead_PresentLastScan": "检测",
|
||||||
"Device_TableHead_ReqNicsOnline": "需要网卡在线",
|
"Device_TableHead_ReqNicsOnline": "需要网卡在线",
|
||||||
@@ -256,7 +256,7 @@
|
|||||||
"ENCRYPTION_KEY_name": "密钥",
|
"ENCRYPTION_KEY_name": "密钥",
|
||||||
"Email_display_name": "Email",
|
"Email_display_name": "Email",
|
||||||
"Email_icon": "<i class=\"fa fa-at\"></i>",
|
"Email_icon": "<i class=\"fa fa-at\"></i>",
|
||||||
"Events_Loading": "加载中...",
|
"Events_Loading": "加载中…",
|
||||||
"Events_Periodselect_All": "全部信息",
|
"Events_Periodselect_All": "全部信息",
|
||||||
"Events_Periodselect_LastMonth": "上个月",
|
"Events_Periodselect_LastMonth": "上个月",
|
||||||
"Events_Periodselect_LastWeek": "上星期",
|
"Events_Periodselect_LastWeek": "上星期",
|
||||||
@@ -301,6 +301,7 @@
|
|||||||
"Gen_Cancel": "取消",
|
"Gen_Cancel": "取消",
|
||||||
"Gen_Change": "修改",
|
"Gen_Change": "修改",
|
||||||
"Gen_Copy": "运行",
|
"Gen_Copy": "运行",
|
||||||
|
"Gen_CopyToClipboard": "",
|
||||||
"Gen_DataUpdatedUITakesTime": "好的 - 如果扫描正在运行,UI 可能需要一段时间才能更新。",
|
"Gen_DataUpdatedUITakesTime": "好的 - 如果扫描正在运行,UI 可能需要一段时间才能更新。",
|
||||||
"Gen_Delete": "删除",
|
"Gen_Delete": "删除",
|
||||||
"Gen_DeleteAll": "全部删除",
|
"Gen_DeleteAll": "全部删除",
|
||||||
@@ -308,7 +309,9 @@
|
|||||||
"Gen_Error": "错误",
|
"Gen_Error": "错误",
|
||||||
"Gen_Filter": "筛选",
|
"Gen_Filter": "筛选",
|
||||||
"Gen_Generate": "生成",
|
"Gen_Generate": "生成",
|
||||||
|
"Gen_InvalidMac": "",
|
||||||
"Gen_LockedDB": "错误 - DB 可能被锁定 - 检查 F12 开发工具 -> 控制台或稍后重试。",
|
"Gen_LockedDB": "错误 - DB 可能被锁定 - 检查 F12 开发工具 -> 控制台或稍后重试。",
|
||||||
|
"Gen_NetworkMask": "",
|
||||||
"Gen_Offline": "离线",
|
"Gen_Offline": "离线",
|
||||||
"Gen_Okay": "Ok",
|
"Gen_Okay": "Ok",
|
||||||
"Gen_Online": "在线",
|
"Gen_Online": "在线",
|
||||||
@@ -323,33 +326,34 @@
|
|||||||
"Gen_Saved": "已保存",
|
"Gen_Saved": "已保存",
|
||||||
"Gen_Search": "搜索",
|
"Gen_Search": "搜索",
|
||||||
"Gen_Select": "选择",
|
"Gen_Select": "选择",
|
||||||
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\">",
|
"Gen_SelectIcon": "<i class=\"fa-solid fa-chevron-down fa-fade\"></i>",
|
||||||
"Gen_SelectToPreview": "选择预览",
|
"Gen_SelectToPreview": "选择预览",
|
||||||
"Gen_Selected_Devices": "选定的设备:",
|
"Gen_Selected_Devices": "选定的设备:",
|
||||||
|
"Gen_Subnet": "",
|
||||||
"Gen_Switch": "交换",
|
"Gen_Switch": "交换",
|
||||||
"Gen_Upd": "已成功更新",
|
"Gen_Upd": "已成功更新",
|
||||||
"Gen_Upd_Fail": "更新失败",
|
"Gen_Upd_Fail": "更新失败",
|
||||||
"Gen_Update": "更新",
|
"Gen_Update": "更新",
|
||||||
"Gen_Update_Value": "更新值",
|
"Gen_Update_Value": "更新值",
|
||||||
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \">",
|
"Gen_ValidIcon": "<i class=\"fa-solid fa-chevron-right \"></i>",
|
||||||
"Gen_Warning": "警告",
|
"Gen_Warning": "警告",
|
||||||
"Gen_Work_In_Progress": "工作正在进行中,欢迎在 https://github.com/jokob-sk/NetAlertX/issues 上反馈",
|
"Gen_Work_In_Progress": "工作正在进行中,欢迎在 https://github.com/jokob-sk/NetAlertX/issues 上反馈",
|
||||||
"Gen_create_new_device": "新设备",
|
"Gen_create_new_device": "新设备",
|
||||||
"Gen_create_new_device_info": "通常使用<a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">plugins</a>来发现设备。但是,在某些情况下,您可能需要手动添加设备。要探索特定场景,请查看<a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/REMOTE_NETWORKS.md\">。",
|
"Gen_create_new_device_info": "通常使用<a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">plugins</a>来发现设备。但是,在某些情况下,您可能需要手动添加设备。要探索特定场景,请查看<a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/REMOTE_NETWORKS.md\">远程网络文档</a>。",
|
||||||
"General_display_name": "通用",
|
"General_display_name": "通用",
|
||||||
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
"General_icon": "<i class=\"fa fa-gears\"></i>",
|
||||||
"HRS_TO_KEEP_NEWDEV_description": "这是一项维护设置。如果启用(<code>0</code> 为禁用),则标记为<b>新设备</b>的设备(如果其<b>首次会话</b>时间早于此设置中指定的小时数)将被删除。如果您想在 <code>X</code> 小时后自动删除<b>新设备</b>,请使用此设置。",
|
"HRS_TO_KEEP_NEWDEV_description": "这是一项维护设置<b>删除设备</b>。如果启用该设置(<code>0</code> 为禁用),则标记为<b>新设备</b>的设备(如果其<b>首次会话</b>时间早于此设置中指定的小时数)将被删除。如果您想在 <code>X</code> 小时后自动删除<b>新设备</b>,请使用此设置。",
|
||||||
"HRS_TO_KEEP_NEWDEV_name": "保留新设备",
|
"HRS_TO_KEEP_NEWDEV_name": "小时后删除新设备",
|
||||||
"HRS_TO_KEEP_OFFDEV_description": "这是维护设置<b>删除设备</b>。如果启用了这个设置(<code>0</code>是禁用),任何<b>上次链接</b>时间比设置里存的指定时间长的<b>下线</b>设备都会被删除。要是您想<code>X</code>小时以候自动处理<b>下线设备</b>,请用这个设置。",
|
"HRS_TO_KEEP_OFFDEV_description": "这是维护设置<b>删除设备</b>。如果启用了这个设置(<code>0</code>是禁用),任何<b>上次链接</b>时间比设置里存的指定时间长的<b>离线</b>设备都会被删除。要是您想<code>X</code>小时以候自动处理<b>下线设备</b>,请用这个设置。",
|
||||||
"HRS_TO_KEEP_OFFDEV_name": "保留离线设备",
|
"HRS_TO_KEEP_OFFDEV_name": "保留离线设备",
|
||||||
"LOADED_PLUGINS_description": "加载哪些插件。添加插件可能会降低应用程序的速度。在<a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">插件文档</a>中详细了解需要启用哪些插件、插件类型或扫描选项。卸载插件将丢失您的设置。只有<code>已禁用</code>的插件才能卸载。",
|
"LOADED_PLUGINS_description": "加载哪些插件。添加插件可能会降低应用程序的速度。在<a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/docs/PLUGINS.md\">插件文档</a>中详细了解需要启用哪些插件、插件类型或扫描选项。卸载插件将丢失您的设置。只有<code>已禁用</code>的插件才能卸载。",
|
||||||
"LOADED_PLUGINS_name": "已加载插件",
|
"LOADED_PLUGINS_name": "已加载插件",
|
||||||
"LOG_LEVEL_description": "此设置将启用更详细的日志记录。对于调试写入数据库的事件很有用。",
|
"LOG_LEVEL_description": "此设置将启用更详细的日志记录。对于调试写入数据库的事件很有用。",
|
||||||
"LOG_LEVEL_name": "打印附加日志",
|
"LOG_LEVEL_name": "打印附加日志",
|
||||||
"Loading": "加载中...",
|
"Loading": "加载中…",
|
||||||
"Login_Box": "输入密码",
|
"Login_Box": "输入密码",
|
||||||
"Login_Default_PWD": "默认密码“123456”仍然有效。",
|
"Login_Default_PWD": "默认密码“123456”仍然有效。",
|
||||||
"Login_Info": "设置密码使用设置密码插件。如果您无法登录,请查看<a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">。",
|
"Login_Info": "设置密码使用设置密码插件。如果您无法登录,请查看<a target=\"_blank\" href=\"https://github.com/jokob-sk/NetAlertX/tree/main/front/plugins/set_password\">SETPWD文档</a>。",
|
||||||
"Login_Psw-box": "密码",
|
"Login_Psw-box": "密码",
|
||||||
"Login_Psw_alert": "密码警报!",
|
"Login_Psw_alert": "密码警报!",
|
||||||
"Login_Psw_folder": "在配置文件夹中。",
|
"Login_Psw_folder": "在配置文件夹中。",
|
||||||
@@ -376,21 +380,21 @@
|
|||||||
"Maintenance_Tool_DownloadConfig_text": "下载<code>app.conf</code> 里存的设置的完整备份。",
|
"Maintenance_Tool_DownloadConfig_text": "下载<code>app.conf</code> 里存的设置的完整备份。",
|
||||||
"Maintenance_Tool_DownloadWorkflows": "工作流程导出",
|
"Maintenance_Tool_DownloadWorkflows": "工作流程导出",
|
||||||
"Maintenance_Tool_DownloadWorkflows_text": "下载<code>workflows.json</code> 里存的工作流程的完整备份。",
|
"Maintenance_Tool_DownloadWorkflows_text": "下载<code>workflows.json</code> 里存的工作流程的完整备份。",
|
||||||
"Maintenance_Tool_ExportCSV": "CSV 导出",
|
"Maintenance_Tool_ExportCSV": "设备导出(csv)",
|
||||||
"Maintenance_Tool_ExportCSV_noti": "CSV 导出",
|
"Maintenance_Tool_ExportCSV_noti": "设备导出(csv)",
|
||||||
"Maintenance_Tool_ExportCSV_noti_text": "您确定要生成 CSV 文件吗?",
|
"Maintenance_Tool_ExportCSV_noti_text": "您确定要生成 CSV 文件吗?",
|
||||||
"Maintenance_Tool_ExportCSV_text": "生成一个 CSV(逗号分隔值)文件,其中包含设备列表,包括网络节点和连接设备之间的网络关系。您也可以通过访问此 URL <code>your NetAlertX url/php/server/devices.php?action=ExportCSV</code> 或启用 <a href=\"settings.php#CSVBCKP_header\">CSV Backup</a> 插件来触发此功能。",
|
"Maintenance_Tool_ExportCSV_text": "生成一个 CSV(逗号分隔值)文件,其中包含设备列表,包括网络节点和连接设备之间的网络关系。您也可以通过访问此 URL <code>your NetAlertX url/php/server/devices.php?action=ExportCSV</code> 或启用 <a href=\"settings.php#CSVBCKP_header\">CSV Backup</a> 插件来触发此功能。",
|
||||||
"Maintenance_Tool_ImportCSV": "CSV 导入",
|
"Maintenance_Tool_ImportCSV": "设备导入(csv)",
|
||||||
"Maintenance_Tool_ImportCSV_noti": "CSV 导入",
|
"Maintenance_Tool_ImportCSV_noti": "设备导入(csv)",
|
||||||
"Maintenance_Tool_ImportCSV_noti_text": "您确定要导入 CSV 文件吗?这将完全<b>覆盖</b>数据库中的设备。",
|
"Maintenance_Tool_ImportCSV_noti_text": "您确定要导入 CSV 文件吗?这将完全<b>覆盖</b>数据库中的设备。",
|
||||||
"Maintenance_Tool_ImportCSV_text": "在使用此功能之前,请先备份。导入一个 CSV(逗号分隔值)文件,其中包含设备列表,包括网络节点和连接设备之间的网络关系。为此,请将名为 <b>devices.csv</b> 的 CSV 文件放入您的 <b>/config</b> 文件夹中。",
|
"Maintenance_Tool_ImportCSV_text": "在使用此功能之前,请先备份。导入一个 CSV(逗号分隔值)文件,其中包含设备列表,包括网络节点和连接设备之间的网络关系。为此,请将名为 <b>devices.csv</b> 的 CSV 文件放入您的 <b>/config</b> 文件夹中。",
|
||||||
"Maintenance_Tool_ImportConfig_noti": "设置导入(app.conf)",
|
"Maintenance_Tool_ImportConfig_noti": "设置导入(app.conf)",
|
||||||
"Maintenance_Tool_ImportPastedCSV": "CSV 导入(粘贴)",
|
"Maintenance_Tool_ImportPastedCSV": "设备导入(csv 粘贴)",
|
||||||
"Maintenance_Tool_ImportPastedCSV_noti_text": "您确定要导入粘贴的 CSV 吗?这将完全<b>覆盖</b>数据库中的设备。",
|
"Maintenance_Tool_ImportPastedCSV_noti_text": "您确定要导入粘贴的 CSV 吗?这将完全<b>覆盖</b>数据库中的设备。",
|
||||||
"Maintenance_Tool_ImportPastedCSV_text": "使用此功能前,请先备份。导入一个包含设备列表(包括网络节点和所连接设备之间的网络关系)的 CSV(逗号分隔值)文件。",
|
"Maintenance_Tool_ImportPastedCSV_text": "使用此功能前,请先备份。导入一个包含设备列表(包括网络节点和所连接设备之间的网络关系)的 CSV(逗号分隔值)文件。",
|
||||||
"Maintenance_Tool_ImportPastedConfig": "设置导入(粘贴)",
|
"Maintenance_Tool_ImportPastedConfig": "设置导入(粘贴)",
|
||||||
"Maintenance_Tool_ImportPastedConfig_noti_text": "您确认要导入粘贴的设置吗?这会完全<b>覆盖</b><code>app.conf</code>的内容。",
|
"Maintenance_Tool_ImportPastedConfig_noti_text": "您确认要导入粘贴的设置吗?这会完全<b>覆盖</b><code>app.conf</code>的内容。",
|
||||||
"Maintenance_Tool_ImportPastedConfig_text": "导入包含所有应用程序设置的<code>app.config</code>文件。建议先通过<b>设置导出</b>功能下载当前的<code>app.conf</code>文件。",
|
"Maintenance_Tool_ImportPastedConfig_text": "导入包含所有应用程序设置的<code>app.conf</code>文件。建议先通过<b>设置导出</b>功能下载当前的<code>app.conf</code>文件。",
|
||||||
"Maintenance_Tool_arpscansw": "切换 arp 扫描(开/关)",
|
"Maintenance_Tool_arpscansw": "切换 arp 扫描(开/关)",
|
||||||
"Maintenance_Tool_arpscansw_noti": "打开或关闭 arp 扫描",
|
"Maintenance_Tool_arpscansw_noti": "打开或关闭 arp 扫描",
|
||||||
"Maintenance_Tool_arpscansw_noti_text": "当扫描关闭时,它会保持关闭状态,直到再次激活为止。",
|
"Maintenance_Tool_arpscansw_noti_text": "当扫描关闭时,它会保持关闭状态,直到再次激活为止。",
|
||||||
@@ -432,7 +436,7 @@
|
|||||||
"Maintenance_Tool_del_unknowndev_text": "使用此功能前,请先备份。删除操作不可撤销。所有名为 (未知) 的设备都将从数据库中删除。",
|
"Maintenance_Tool_del_unknowndev_text": "使用此功能前,请先备份。删除操作不可撤销。所有名为 (未知) 的设备都将从数据库中删除。",
|
||||||
"Maintenance_Tool_displayed_columns_text": "更改<a href=\"devices.php\"><b><i class=\"fa fa-laptop\"></i>设备</b></a>页面中列的可见性和顺序。",
|
"Maintenance_Tool_displayed_columns_text": "更改<a href=\"devices.php\"><b><i class=\"fa fa-laptop\"></i>设备</b></a>页面中列的可见性和顺序。",
|
||||||
"Maintenance_Tool_drag_me": "拖动我来对列进行重新排序。",
|
"Maintenance_Tool_drag_me": "拖动我来对列进行重新排序。",
|
||||||
"Maintenance_Tool_order_columns_text": "",
|
"Maintenance_Tool_order_columns_text": "Maintenance_Tool_order_columns_text",
|
||||||
"Maintenance_Tool_purgebackup": "清除备份",
|
"Maintenance_Tool_purgebackup": "清除备份",
|
||||||
"Maintenance_Tool_purgebackup_noti": "清除备份",
|
"Maintenance_Tool_purgebackup_noti": "清除备份",
|
||||||
"Maintenance_Tool_purgebackup_noti_text": "您确定要删除除最后 3 个备份之外的所有备份吗?",
|
"Maintenance_Tool_purgebackup_noti_text": "您确定要删除除最后 3 个备份之外的所有备份吗?",
|
||||||
@@ -451,7 +455,7 @@
|
|||||||
"Maintenance_Tools_Tab_UISettings": "UI 设置",
|
"Maintenance_Tools_Tab_UISettings": "UI 设置",
|
||||||
"Maintenance_arp_status": "扫描状态",
|
"Maintenance_arp_status": "扫描状态",
|
||||||
"Maintenance_arp_status_off": "当前已禁用",
|
"Maintenance_arp_status_off": "当前已禁用",
|
||||||
"Maintenance_arp_status_on": "当前正在运行的扫描",
|
"Maintenance_arp_status_on": "正在运行扫描",
|
||||||
"Maintenance_built_on": "建立于",
|
"Maintenance_built_on": "建立于",
|
||||||
"Maintenance_current_version": "您已了解最新情况。查看<a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">我正在处理的内容</a>。",
|
"Maintenance_current_version": "您已了解最新情况。查看<a href=\"https://github.com/jokob-sk/NetAlertX/issues/138\" target=\"_blank\">我正在处理的内容</a>。",
|
||||||
"Maintenance_database_backup": "数据库备份",
|
"Maintenance_database_backup": "数据库备份",
|
||||||
@@ -471,10 +475,10 @@
|
|||||||
"Maintenance_themeselector_lable": "选择皮肤",
|
"Maintenance_themeselector_lable": "选择皮肤",
|
||||||
"Maintenance_themeselector_text": "该变化发生在服务器端,因此会影响所有正在使用的设备。",
|
"Maintenance_themeselector_text": "该变化发生在服务器端,因此会影响所有正在使用的设备。",
|
||||||
"Maintenance_version": "应用更新",
|
"Maintenance_version": "应用更新",
|
||||||
"NETWORK_DEVICE_TYPES_description": "哪些设备类型允许在网络视图中用作网络设备。设备类型必须与设备详细信息中特定设备上的 <code>Type</code> 设置完全匹配。请勿删除现有类型,仅添加新类型。",
|
"NETWORK_DEVICE_TYPES_description": "哪些设备类型允许在网络视图中用作网络设备。设备类型必须与设备详细信息中特定设备上的 <code>Type</code> 设置完全匹配。您可以使用<code>+</code>按钮在设备上添加Type。请勿删除现有类型,仅添加新类型。",
|
||||||
"NETWORK_DEVICE_TYPES_name": "网络设备类型",
|
"NETWORK_DEVICE_TYPES_name": "网络设备类型",
|
||||||
"Navigation_About": "关于",
|
"Navigation_About": "关于",
|
||||||
"Navigation_AppEvents": "",
|
"Navigation_AppEvents": "应用事件",
|
||||||
"Navigation_Devices": "设备",
|
"Navigation_Devices": "设备",
|
||||||
"Navigation_Donations": "捐款",
|
"Navigation_Donations": "捐款",
|
||||||
"Navigation_Events": "事件",
|
"Navigation_Events": "事件",
|
||||||
@@ -491,9 +495,10 @@
|
|||||||
"Navigation_Workflows": "工作流程",
|
"Navigation_Workflows": "工作流程",
|
||||||
"Network_Assign": "连接上述 <i class=\"fa fa-server\"></i> 网络节点",
|
"Network_Assign": "连接上述 <i class=\"fa fa-server\"></i> 网络节点",
|
||||||
"Network_Cant_Assign": "无法将根 Internet 节点指定为子节点。",
|
"Network_Cant_Assign": "无法将根 Internet 节点指定为子节点。",
|
||||||
"Network_Cant_Assign_No_Node_Selected": "",
|
"Network_Cant_Assign_No_Node_Selected": "无法分配,未选择父节点。",
|
||||||
"Network_Configuration_Error": "配置错误",
|
"Network_Configuration_Error": "配置错误",
|
||||||
"Network_Connected": "联网设备",
|
"Network_Connected": "联网设备",
|
||||||
|
"Network_Devices": "",
|
||||||
"Network_ManageAdd": "添加设备",
|
"Network_ManageAdd": "添加设备",
|
||||||
"Network_ManageAdd_Name": "设备名称",
|
"Network_ManageAdd_Name": "设备名称",
|
||||||
"Network_ManageAdd_Name_text": "名称不包含特殊字符",
|
"Network_ManageAdd_Name_text": "名称不包含特殊字符",
|
||||||
@@ -528,8 +533,8 @@
|
|||||||
"Network_Root": "根节点",
|
"Network_Root": "根节点",
|
||||||
"Network_Root_Not_Configured": "在<a href=\"deviceDetails.php?mac=Internet\">Internet 根设备</a>的<b>类型</b>字段中选择一个网络设备类型,例如<b>网关</b>,以开始配置此屏幕。<br/><br/>更多文档可在<a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank\">如何设置您的网络页面</a>指南中找到",
|
"Network_Root_Not_Configured": "在<a href=\"deviceDetails.php?mac=Internet\">Internet 根设备</a>的<b>类型</b>字段中选择一个网络设备类型,例如<b>网关</b>,以开始配置此屏幕。<br/><br/>更多文档可在<a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/NETWORK_TREE.md\" target=\"_blank\">如何设置您的网络页面</a>指南中找到",
|
||||||
"Network_Root_Unconfigurable": "无法配置根",
|
"Network_Root_Unconfigurable": "无法配置根",
|
||||||
"Network_ShowArchived": "",
|
"Network_ShowArchived": "显示已归档",
|
||||||
"Network_ShowOffline": "",
|
"Network_ShowOffline": "显示离线",
|
||||||
"Network_Table_Hostname": "主机名",
|
"Network_Table_Hostname": "主机名",
|
||||||
"Network_Table_IP": "IP",
|
"Network_Table_IP": "IP",
|
||||||
"Network_Table_State": "状态",
|
"Network_Table_State": "状态",
|
||||||
@@ -546,25 +551,25 @@
|
|||||||
"Plugins_DeleteAll": "全部删除(忽略过滤器)",
|
"Plugins_DeleteAll": "全部删除(忽略过滤器)",
|
||||||
"Plugins_Filters_Mac": "Mac 过滤器",
|
"Plugins_Filters_Mac": "Mac 过滤器",
|
||||||
"Plugins_History": "事件历史",
|
"Plugins_History": "事件历史",
|
||||||
"Plugins_Obj_DeleteListed": "",
|
"Plugins_Obj_DeleteListed": "删除已列出对象",
|
||||||
"Plugins_Objects": "插件对象",
|
"Plugins_Objects": "插件对象",
|
||||||
"Plugins_Out_of": "",
|
"Plugins_Out_of": "从",
|
||||||
"Plugins_Unprocessed_Events": "未处理的事件",
|
"Plugins_Unprocessed_Events": "未处理的事件",
|
||||||
"Plugins_no_control": "未找到可呈现该值的表单控件。",
|
"Plugins_no_control": "未找到可呈现该值的表单控件。",
|
||||||
"Presence_CalHead_day": "天",
|
"Presence_CalHead_day": "天",
|
||||||
"Presence_CalHead_lang": "",
|
"Presence_CalHead_lang": "en-us",
|
||||||
"Presence_CalHead_month": "月",
|
"Presence_CalHead_month": "月",
|
||||||
"Presence_CalHead_quarter": "季",
|
"Presence_CalHead_quarter": "季",
|
||||||
"Presence_CalHead_week": "星期",
|
"Presence_CalHead_week": "星期",
|
||||||
"Presence_CalHead_year": "年",
|
"Presence_CalHead_year": "年",
|
||||||
"Presence_CallHead_Devices": "设备",
|
"Presence_CallHead_Devices": "设备",
|
||||||
"Presence_Key_OnlineNow": "",
|
"Presence_Key_OnlineNow": "当前在线",
|
||||||
"Presence_Key_OnlineNow_desc": "",
|
"Presence_Key_OnlineNow_desc": "该设备在上次扫描中被检测为在线。",
|
||||||
"Presence_Key_OnlinePast": "",
|
"Presence_Key_OnlinePast": "之前在线",
|
||||||
"Presence_Key_OnlinePastMiss": "",
|
"Presence_Key_OnlinePastMiss": "之前在线(不匹配)",
|
||||||
"Presence_Key_OnlinePastMiss_desc": "",
|
"Presence_Key_OnlinePastMiss_desc": "设备曾在线,但目前离线。初始会话可能缺失或存在数据冲突",
|
||||||
"Presence_Key_OnlinePast_desc": "",
|
"Presence_Key_OnlinePast_desc": "设备曾在线,但目前离线。",
|
||||||
"Presence_Loading": "加载中...",
|
"Presence_Loading": "加载中…",
|
||||||
"Presence_Shortcut_AllDevices": "我的设备",
|
"Presence_Shortcut_AllDevices": "我的设备",
|
||||||
"Presence_Shortcut_Archived": "已归档",
|
"Presence_Shortcut_Archived": "已归档",
|
||||||
"Presence_Shortcut_Connected": "已连接",
|
"Presence_Shortcut_Connected": "已连接",
|
||||||
@@ -573,26 +578,27 @@
|
|||||||
"Presence_Shortcut_Favorites": "收藏夹",
|
"Presence_Shortcut_Favorites": "收藏夹",
|
||||||
"Presence_Shortcut_NewDevices": "新设备",
|
"Presence_Shortcut_NewDevices": "新设备",
|
||||||
"Presence_Title": "按设备显示状态",
|
"Presence_Title": "按设备显示状态",
|
||||||
"REFRESH_FQDN_description": "",
|
"REFRESH_FQDN_description": "重新扫描所有设备并刷新其完全合格域名(FQDN)。当设置禁用时,将仅扫描未识别设备以提高性能。此时FQDN仅在初始设备发现时更新。",
|
||||||
"REFRESH_FQDN_name": "",
|
"REFRESH_FQDN_name": "更新FQDN",
|
||||||
"REPORT_DASHBOARD_URL_description": "此 URL 用作生成 HTML 报告(例如电子邮件)中链接的基础。输入以 <code>http://</code> 开头的完整 URL,包括端口号(无尾部斜杠 <code>/</code>)。",
|
"REPORT_DASHBOARD_URL_description": "此 URL 用作生成 HTML 报告(例如电子邮件)中链接的基础。输入以 <code>http://</code> 开头的完整 URL,包括端口号(无尾部斜杠 <code>/</code>)。",
|
||||||
"REPORT_DASHBOARD_URL_name": "NetAlertX 网址",
|
"REPORT_DASHBOARD_URL_name": "NetAlertX 网址",
|
||||||
"REPORT_ERROR": "您正在浏览的页面暂时不可用,请稍后重试",
|
"REPORT_ERROR": "您正在浏览的页面暂时不可用,请稍后重试",
|
||||||
"REPORT_MAIL_description": "如果启用,则会发送一封电子邮件,其中包含您已订阅的更改列表。还请填写以下与 SMTP 设置相关的所有剩余设置。如果遇到问题,请将 <code>LOG_LEVEL</code> 设置为 <code>debug</code> 并检查<a href=\"/maintenance.php#tab_Logging\">错误日志</a>。",
|
"REPORT_MAIL_description": "如果启用,则会发送一封电子邮件,其中包含您已订阅的更改列表。还请填写以下与 SMTP 设置相关的所有剩余设置。如果遇到问题,请将 <code>LOG_LEVEL</code> 设置为 <code>debug</code> 并检查<a href=\"/maintenance.php#tab_Logging\">错误日志</a>。",
|
||||||
"REPORT_MAIL_name": "启用email",
|
"REPORT_MAIL_name": "启用email",
|
||||||
"REPORT_TITLE": "报告",
|
"REPORT_TITLE": "报告",
|
||||||
"RandomMAC_hover": "自动检测 - 表示设备是否随机化其 MAC 地址。",
|
"RandomMAC_hover": "自动检测 - 表示设备是否随机化其 MAC 地址。您可通过 UI_NOT_RANDOM_MAC 设置排除特定MAC地址。点击了解更多。",
|
||||||
"Reports_Sent_Log": "已发送报告日志",
|
"Reports_Sent_Log": "已发送报告日志",
|
||||||
"SCAN_SUBNETS_description": "大多数网络扫描器(ARP-SCAN、NMAP、NSLOOKUP、DIG)依赖于扫描特定的网络接口和子网。查看<a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">子网文档</a>以获取有关此设置的帮助,尤其是 VLAN、支持哪些 VLAN,或者如何确定网络掩码和接口。<br/> <br/> 网络扫描器的替代方法是启用一些其他不依赖于 NetAlert<sup>X</sup> 访问网络的设备扫描器/导入器(UNIFI、dhcp.leases、PiHole 等)。<br/> <br/> 注意:扫描时间本身取决于要检查的 IP 地址数量,因此请使用适当的网络掩码和接口仔细设置。",
|
"SCAN_SUBNETS_description": "大多数网络扫描器(ARP-SCAN、NMAP、NSLOOKUP、DIG)依赖于扫描特定的网络接口和子网。查看<a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/SUBNETS.md\" target=\"_blank\">子网文档</a>以获取有关此设置的帮助,尤其是 VLAN、支持哪些 VLAN,或者如何确定网络掩码和接口。<br/> <br/> 网络扫描器的替代方法是启用一些其他不依赖于 NetAlert<sup>X</sup> 访问网络的设备扫描器/导入器(UNIFI、dhcp.leases、PiHole 等)。<br/> <br/> 注意:扫描时间本身取决于要检查的 IP 地址数量,因此请使用适当的网络掩码和接口仔细设置。",
|
||||||
"SCAN_SUBNETS_name": "",
|
"SCAN_SUBNETS_name": "待扫描网络",
|
||||||
"SYSTEM_TITLE": "系统信息",
|
"SYSTEM_TITLE": "系统信息",
|
||||||
"Setting_Override": "覆盖值",
|
"Setting_Override": "覆盖值",
|
||||||
"Setting_Override_Description": "启用此选项将用上面指定的值覆盖应用程序提供的默认值。",
|
"Setting_Override_Description": "启用此选项将用上面指定的值覆盖应用程序提供的默认值。",
|
||||||
"Settings_Metadata_Toggle": "显示/隐藏给定设置的元数据。",
|
"Settings_Metadata_Toggle": "显示/隐藏给定设置的元数据。",
|
||||||
"Settings_Show_Description": "",
|
"Settings_Show_Description": "显示设置描述。",
|
||||||
"Settings_device_Scanners_desync": "⚠ 设备扫描计划不同步。",
|
"Settings_device_Scanners_desync": "⚠ 设备扫描计划不同步。",
|
||||||
"Settings_device_Scanners_desync_popup": "设备扫描 (<code>*_RUN_SCHD</code>) 的时间表并不相同。这将导致设备在线/离线通知不一致。除非有意为之,否则请对所有启用的 <b>🔍设备扫描</b> 使用相同的时间表。",
|
"Settings_device_Scanners_desync_popup": "设备扫描 (<code>*_RUN_SCHD</code>) 的时间表并不相同。这将导致设备在线/离线通知不一致。除非有意为之,否则请对所有启用的 <b>🔍设备扫描</b> 使用相同的时间表。",
|
||||||
"Speedtest_Results": "Speedtest 结果",
|
"Speedtest_Results": "Speedtest 结果",
|
||||||
|
"Systeminfo_AvailableIps": "",
|
||||||
"Systeminfo_CPU": "CPU",
|
"Systeminfo_CPU": "CPU",
|
||||||
"Systeminfo_CPU_Cores": "CPU 核心:",
|
"Systeminfo_CPU_Cores": "CPU 核心:",
|
||||||
"Systeminfo_CPU_Name": "CPU 名称:",
|
"Systeminfo_CPU_Name": "CPU 名称:",
|
||||||
@@ -676,81 +682,81 @@
|
|||||||
"UI_ICONS_name": "预定义图标",
|
"UI_ICONS_name": "预定义图标",
|
||||||
"UI_LANG_description": "选择首选的 UI 语言。在 <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a> 在线门户中帮助翻译或建议语言。",
|
"UI_LANG_description": "选择首选的 UI 语言。在 <a href=\"https://hosted.weblate.org/projects/pialert/core/\" target=\"_blank\">Weblate</a> 在线门户中帮助翻译或建议语言。",
|
||||||
"UI_LANG_name": "用户界面语言",
|
"UI_LANG_name": "用户界面语言",
|
||||||
"UI_MY_DEVICES_description": "设备状态应显示在默认的<b>我的设备</b>视图中。(<code>CTRL + 单击</code>选择/取消选择)",
|
"UI_MY_DEVICES_description": "设备状态应显示在默认的<b>我的设备</b>视图中。",
|
||||||
"UI_MY_DEVICES_name": "在“我的设备”视图中显示",
|
"UI_MY_DEVICES_name": "在“我的设备”视图中显示",
|
||||||
"UI_NOT_RANDOM_MAC_description": "不应标记为随机设备的 Mac 前缀。例如,输入 <code>52</code> 可排除以 <code>52:xx:xx:xx:xx:xx</code> 开头的设备,以免将其标记为具有随机 MAC 地址的设备。",
|
"UI_NOT_RANDOM_MAC_description": "不应标记为随机设备的 Mac 前缀。例如,输入 <code>52</code> 可排除以 <code>52:xx:xx:xx:xx:xx</code> 开头的设备,以免将其标记为具有随机 MAC 地址的设备。",
|
||||||
"UI_NOT_RANDOM_MAC_name": "不要标记为随机",
|
"UI_NOT_RANDOM_MAC_name": "不要标记为随机",
|
||||||
"UI_PRESENCE_description": "选择应在<a href=\"/devices.php\" target=\"_blank\">设备</a>页面中的<b>设备存在</b>图表中显示的状态。(<code>CTRL + 单击</code>以选择/取消选择)",
|
"UI_PRESENCE_description": "选择应在<a href=\"/devices.php\" target=\"_blank\">设备</a>页面中的<b>设备存在</b>图表中显示的状态。",
|
||||||
"UI_PRESENCE_name": "在存在图表中显示",
|
"UI_PRESENCE_name": "在存在图表中显示",
|
||||||
"UI_REFRESH_description": "输入界面重新加载的秒数。设置为 <code>0</code> 可禁用。",
|
"UI_REFRESH_description": "输入界面重新加载的秒数。设置为 <code>0</code> 可禁用。",
|
||||||
"UI_REFRESH_name": "自动刷新界面",
|
"UI_REFRESH_name": "自动刷新界面",
|
||||||
"VERSION_description": "",
|
"VERSION_description": "用于检查应用是否升级的版本号或时间戳辅助值。",
|
||||||
"VERSION_name": "",
|
"VERSION_name": "本号或时间戳",
|
||||||
"WF_Action_Add": "",
|
"WF_Action_Add": "添加动作",
|
||||||
"WF_Action_field": "",
|
"WF_Action_field": "字段",
|
||||||
"WF_Action_type": "",
|
"WF_Action_type": "类型",
|
||||||
"WF_Action_value": "",
|
"WF_Action_value": "值",
|
||||||
"WF_Actions": "",
|
"WF_Actions": "动作",
|
||||||
"WF_Add": "",
|
"WF_Add": "添加工作流",
|
||||||
"WF_Add_Condition": "",
|
"WF_Add_Condition": "添加条件",
|
||||||
"WF_Add_Group": "",
|
"WF_Add_Group": "添加组",
|
||||||
"WF_Condition_field": "",
|
"WF_Condition_field": "字段",
|
||||||
"WF_Condition_operator": "",
|
"WF_Condition_operator": "运算符",
|
||||||
"WF_Condition_value": "",
|
"WF_Condition_value": "值",
|
||||||
"WF_Conditions": "",
|
"WF_Conditions": "条件",
|
||||||
"WF_Conditions_logic_rules": "",
|
"WF_Conditions_logic_rules": "逻辑规则",
|
||||||
"WF_Duplicate": "",
|
"WF_Duplicate": "复制工作流",
|
||||||
"WF_Enabled": "",
|
"WF_Enabled": "工作流已启用",
|
||||||
"WF_Export": "",
|
"WF_Export": "导出工作流",
|
||||||
"WF_Export_Copy": "",
|
"WF_Export_Copy": "复制下方工作流,在需要的地方导入使用。",
|
||||||
"WF_Import": "",
|
"WF_Import": "导入工作流",
|
||||||
"WF_Import_Copy": "",
|
"WF_Import_Copy": "在此处粘贴你刚才复制的工作流。",
|
||||||
"WF_Name": "",
|
"WF_Name": "工作流名称",
|
||||||
"WF_Remove": "",
|
"WF_Remove": "删除工作流",
|
||||||
"WF_Remove_Copy": "",
|
"WF_Remove_Copy": "您想删除这个工作流吗?",
|
||||||
"WF_Save": "",
|
"WF_Save": "保存工作流",
|
||||||
"WF_Trigger": "",
|
"WF_Trigger": "触发器",
|
||||||
"WF_Trigger_event_type": "",
|
"WF_Trigger_event_type": "事件类型",
|
||||||
"WF_Trigger_type": "",
|
"WF_Trigger_type": "触发器类型",
|
||||||
"add_icon_event_tooltip": "",
|
"add_icon_event_tooltip": "添加新图标",
|
||||||
"add_option_event_tooltip": "",
|
"add_option_event_tooltip": "添加新值",
|
||||||
"copy_icons_event_tooltip": "",
|
"copy_icons_event_tooltip": "覆盖所有同类设备的图标",
|
||||||
"devices_old": "刷新中...",
|
"devices_old": "刷新中…",
|
||||||
"general_event_description": "您触发的事件可能需要一段时间才能完成后台进程。一旦以下执行队列清空,执行就会结束(如果遇到问题,请检查<a href='/maintenance.php#tab_Logging'>错误日志</a>)。<br/> <br/> 执行队列:",
|
"general_event_description": "您触发的事件可能需要一段时间才能完成后台进程。一旦以下执行队列清空,执行就会结束(如果遇到问题,请检查<a href='/maintenance.php#tab_Logging'>错误日志</a>)。<br/> <br/> 执行队列:",
|
||||||
"general_event_title": "执行自组织网络事件",
|
"general_event_title": "执行自组织网络事件",
|
||||||
"go_to_device_event_tooltip": "",
|
"go_to_device_event_tooltip": "前往设备页面",
|
||||||
"go_to_node_event_tooltip": "",
|
"go_to_node_event_tooltip": "前往该节点的网络配置页",
|
||||||
"new_version_available": "",
|
"new_version_available": "新版本已发布。",
|
||||||
"report_guid": "通知guid:",
|
"report_guid": "通知guid:",
|
||||||
"report_guid_missing": "未找到链接的通知。最近发送的通知与可用通知之间存在短暂延迟。几秒钟后刷新页面并缓存。所选通知也可能已在维护期间被删除,如 <code>DBCLNP_NOTIFI_HIST</code> 设置中所述。<br/> <br/>系统将改为显示最新通知。缺失的通知具有以下 GUID:",
|
"report_guid_missing": "未找到链接的通知。最近发送的通知与可用通知之间存在短暂延迟。几秒钟后刷新页面并缓存。所选通知也可能已在维护期间被删除,如 <code>DBCLNP_NOTIFI_HIST</code> 设置中所述。<br/> <br/>系统将改为显示最新通知。缺失的通知具有以下 GUID:",
|
||||||
"report_select_format": "选择格式:",
|
"report_select_format": "选择格式:",
|
||||||
"report_time": "通知时间:",
|
"report_time": "通知时间:",
|
||||||
"run_event_tooltip": "在运行之前,请先启用设置并保存更改。",
|
"run_event_tooltip": "在运行之前,请先启用设置并保存更改。",
|
||||||
"select_icon_event_tooltip": "",
|
"select_icon_event_tooltip": "选择图标",
|
||||||
"settings_core_icon": "",
|
"settings_core_icon": "fa-solid fa-gem",
|
||||||
"settings_core_label": "核",
|
"settings_core_label": "核",
|
||||||
"settings_device_scanners": "设备扫描器用于发现写入当前扫描数据库表的设备。",
|
"settings_device_scanners": "设备扫描器用于发现写入当前扫描数据库表的设备。",
|
||||||
"settings_device_scanners_icon": "",
|
"settings_device_scanners_icon": "fa-solid fa-magnifying-glass-plus",
|
||||||
"settings_device_scanners_info": "使用 <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a> 设置加载更多设备扫描仪",
|
"settings_device_scanners_info": "使用 <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a> 设置加载更多设备扫描仪",
|
||||||
"settings_device_scanners_label": "设备扫描仪",
|
"settings_device_scanners_label": "设备扫描仪",
|
||||||
"settings_enabled": "已启用的设置",
|
"settings_enabled": "已启用的设置",
|
||||||
"settings_enabled_icon": "",
|
"settings_enabled_icon": "fa-solid fa-toggle-on",
|
||||||
"settings_expand_all": "展开全部",
|
"settings_expand_all": "展开全部",
|
||||||
"settings_imported": "上次设置是从 app.conf 文件导入的",
|
"settings_imported": "上次设置是从 app.conf 文件导入的",
|
||||||
"settings_imported_label": "已导入设置",
|
"settings_imported_label": "已导入设置",
|
||||||
"settings_missing": "并非所有设置都已加载!数据库或应用程序启动顺序负载过高。单击顶部的 🔄 重新加载按钮。",
|
"settings_missing": "并非所有设置都已加载!数据库或应用程序启动顺序负载过高。单击顶部的 🔄 重新加载按钮。",
|
||||||
"settings_missing_block": "错误:设置未正确加载。点击顶部的重新加载按钮🔄,或者查看浏览器日志了解详细信息(F12)。",
|
"settings_missing_block": "错误:设置未正确加载。点击顶部的重新加载按钮🔄,或者查看浏览器日志了解详细信息(F12)。",
|
||||||
"settings_old": "导入设置并重新初始化...",
|
"settings_old": "导入设置并重新初始化…",
|
||||||
"settings_other_scanners": "其他当前已启用的非设备扫描仪插件。",
|
"settings_other_scanners": "其他当前已启用的非设备扫描仪插件。",
|
||||||
"settings_other_scanners_icon": "",
|
"settings_other_scanners_icon": "fa-solid fa-recycle",
|
||||||
"settings_other_scanners_label": "其他扫描仪",
|
"settings_other_scanners_label": "其他扫描仪",
|
||||||
"settings_publishers": "启用通知网关 - 发布者,将根据您的设置发送通知。",
|
"settings_publishers": "启用通知网关 - 发布者,将根据您的设置发送通知。",
|
||||||
"settings_publishers_icon": "",
|
"settings_publishers_icon": "fa-solid fa-paper-plane",
|
||||||
"settings_publishers_info": "使用 <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a> 设置加载更多发布商",
|
"settings_publishers_info": "使用 <a href=\"/settings.php#LOADED_PLUGINS\">LOADED_PLUGINS</a> 设置加载更多发布商",
|
||||||
"settings_publishers_label": "出版商",
|
"settings_publishers_label": "出版商",
|
||||||
"settings_readonly": "",
|
"settings_readonly": "无法读或写<code>app.conf</code>。请尝试重启容器并阅读<a href=\"https://github.com/jokob-sk/NetAlertX/blob/main/docs/FILE_PERMISSIONS.md\" target=\"_blank\">文件权限文档</a>",
|
||||||
"settings_saved": "<br/>设置已保存。<br/> 正在加载...<br/><i class=\"ion ion-ios-loop-strong fa-spin fa-2x fa-fw\"></i> <br/>",
|
"settings_saved": "<br/>设置已保存。<br/> 正在加载…<br/><i class=\"ion ion-ios-loop-strong fa-spin fa-2x fa-fw\"></i> <br/>",
|
||||||
"settings_system_icon": "",
|
"settings_system_icon": "fa-solid fa-gear",
|
||||||
"settings_system_label": "系统",
|
"settings_system_label": "系统",
|
||||||
"settings_update_item_warning": "更新下面的值。请注意遵循先前的格式。<b>未执行验证。</b>",
|
"settings_update_item_warning": "更新下面的值。请注意遵循先前的格式。<b>未执行验证。</b>",
|
||||||
"test_event_tooltip": "在测试设置之前,请先保存更改。"
|
"test_event_tooltip": "在测试设置之前,请先保存更改。"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
require 'php/templates/notification.php';
|
require 'php/templates/modals.php';
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// check if authenticated
|
// check if authenticated
|
||||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
|||||||
@@ -117,6 +117,29 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Modal form input -->
|
||||||
|
<div class="modal fade" id="modal-form" data-myparam-triggered-by="" 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-form-title" class="modal-title"> Modal Title </h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="modal-form-message" class="modal-body"> Modal message </div>
|
||||||
|
|
||||||
|
<div id="modal-form-plc"></div>
|
||||||
|
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button id="modal-form-cancel" type="button" class="btn btn-outline pull-left" style="min-width: 80px;" data-dismiss="modal"> Cancel </button>
|
||||||
|
<button id="modal-form-OK" type="button" class="btn btn-outline btn-modal-submit" style="min-width: 80px;" onclick="modalDefaultForm()"> OK </button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<!-- Modal field input -->
|
<!-- Modal field input -->
|
||||||
<div class="modal modal-warning fade" id="modal-field-input" data-myparam-triggered-by="" style="display: none;">
|
<div class="modal modal-warning fade" id="modal-field-input" data-myparam-triggered-by="" style="display: none;">
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
require 'php/templates/header.php';
|
require 'php/templates/header.php';
|
||||||
require 'php/templates/notification.php';
|
require 'php/templates/modals.php';
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<!-- Page ------------------------------------------------------------------ -->
|
<!-- Page ------------------------------------------------------------------ -->
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ def main():
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
def check_config():
|
def check_config():
|
||||||
if get_setting_value('APPRISE_URL') == '' or get_setting_value('APPRISE_HOST') == '':
|
if get_setting_value('APPRISE_HOST') == '' or (get_setting_value('APPRISE_URL') == '' and get_setting_value('APPRISE_TAG') == ''):
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
@@ -106,8 +106,11 @@ def send(html, text):
|
|||||||
|
|
||||||
# Define Apprise compatible payload (https://github.com/caronc/apprise-api#stateless-solution)
|
# Define Apprise compatible payload (https://github.com/caronc/apprise-api#stateless-solution)
|
||||||
|
|
||||||
|
target_key = "tag" if get_setting_value('APPRISE_TARGETTYPE') == 'tag' else "urls"
|
||||||
|
target_value = get_setting_value('APPRISE_TAG') if target_key == 'tag' else get_setting_value('APPRISE_URL')
|
||||||
|
|
||||||
_json_payload = {
|
_json_payload = {
|
||||||
"urls": get_setting_value('APPRISE_URL'),
|
target_key: target_value,
|
||||||
"title": "NetAlertX Notifications",
|
"title": "NetAlertX Notifications",
|
||||||
"format": get_setting_value('APPRISE_PAYLOAD'),
|
"format": get_setting_value('APPRISE_PAYLOAD'),
|
||||||
"body": payloadData
|
"body": payloadData
|
||||||
|
|||||||
@@ -422,6 +422,38 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"function": "TARGETTYPE",
|
||||||
|
"type": {
|
||||||
|
"dataType": "string",
|
||||||
|
"elements": [
|
||||||
|
{ "elementType": "select", "elementOptions": [], "transformers": [] }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": "url",
|
||||||
|
"options": ["url", "tag"],
|
||||||
|
"localized": ["name", "description"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Target type"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "Tipo de alvo"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Select the target type to send to Apprise. If <code>url</code> is selected, the value of the <code>APPRISE_URL</code> setting will be used. If <code>tag</code> is selected, the <code>APPRISE_TAG</code> setting must be specified and will be used instead."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "Seleccione el tipo de alvo enviada a Apprise."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"function": "URL",
|
"function": "URL",
|
||||||
"type": {
|
"type": {
|
||||||
@@ -454,6 +486,38 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"function": "TAG",
|
||||||
|
"type": {
|
||||||
|
"dataType": "string",
|
||||||
|
"elements": [
|
||||||
|
{ "elementType": "input", "elementOptions": [], "transformers": [] }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": ["name", "description"],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Apprise notification tag"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "Tag de notificación de Apprise"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Apprise notification target tag."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language_code": "es_es",
|
||||||
|
"string": "Informar de la tag de destino de la notificación."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"function": "PAYLOAD",
|
"function": "PAYLOAD",
|
||||||
"type": {
|
"type": {
|
||||||
|
|||||||
26
front/plugins/unifi_api_import/README.md
Executable file
26
front/plugins/unifi_api_import/README.md
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
## Overview
|
||||||
|
|
||||||
|
Unifi import plugin using the Site Manager API.
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> The Site Manager API doesn't seems to have feature parity with the old API yet, so certain limitations apply.
|
||||||
|
|
||||||
|
### Quick setup guide
|
||||||
|
|
||||||
|
Navigate to your UniFi Site Manager _⚙️ Settings -> Control Plane -> Integrations_.
|
||||||
|
|
||||||
|
- `api_key` : You can generate your API key under the _Your API Keys_ section.
|
||||||
|
- `base_url` : You can find your base url in the _API Request Format_ section, e.g. `https://192.168.100.1/proxy/network/integration/`
|
||||||
|
- `version` : You can find your version as part of the url in the _API Request Format_ section, e.g. `v1`
|
||||||
|
- `skip_ssl` : To skip SSL with you don't have an SSL certificate
|
||||||
|
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
- Head to **Settings** > **Plugin name** to adjust the default values.
|
||||||
|
|
||||||
|
### Notes
|
||||||
|
|
||||||
|
- Version: 1.0.0
|
||||||
|
- Author: `jokob-sk`
|
||||||
|
- Release Date: `Aug 2025`
|
||||||
743
front/plugins/unifi_api_import/config.json
Executable file
743
front/plugins/unifi_api_import/config.json
Executable file
@@ -0,0 +1,743 @@
|
|||||||
|
{
|
||||||
|
"code_name": "unifi_api_import",
|
||||||
|
"unique_prefix": "UNIFIAPI",
|
||||||
|
"plugin_type": "device_scanner",
|
||||||
|
"execution_order": "Layer_0",
|
||||||
|
"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": "UniFi import (API)"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "This plugin is used to import devices from an UNIFI controller via the Site Manager API."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"icon": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "<i class=\"fa-solid fa-shield-halved\"></i>"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"params": [],
|
||||||
|
"settings": [
|
||||||
|
{
|
||||||
|
"function": "RUN",
|
||||||
|
"events": [
|
||||||
|
"run"
|
||||||
|
],
|
||||||
|
"type": {
|
||||||
|
"dataType": "string",
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"elementType": "select",
|
||||||
|
"elementOptions": [],
|
||||||
|
"transformers": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": "disabled",
|
||||||
|
"options": [
|
||||||
|
"disabled",
|
||||||
|
"once",
|
||||||
|
"schedule"
|
||||||
|
],
|
||||||
|
"localized": [
|
||||||
|
"name",
|
||||||
|
"description"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "When to run"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "When the plugin should run. Good options are <code>schedule</code>, <code>once</code>."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "RUN_SCHD",
|
||||||
|
"type": {
|
||||||
|
"dataType": "string",
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"elementType": "span",
|
||||||
|
"elementOptions": [
|
||||||
|
{
|
||||||
|
"cssClasses": "input-group-addon validityCheck"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"getStringKey": "Gen_ValidIcon"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformers": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"elementType": "input",
|
||||||
|
"elementOptions": [
|
||||||
|
{
|
||||||
|
"onChange": "validateRegex(this)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"base64Regex": "Xig/OlwqfCg/OlswLTldfFsxLTVdWzAtOV18WzAtOV0rLVswLTldK3xcKi9bMC05XSspKVxzKyg/OlwqfCg/OlswLTldfDFbMC05XXwyWzAtM118WzAtOV0rLVswLTldK3xcKi9bMC05XSspKVxzKyg/OlwqfCg/OlsxLTldfFsxMl1bMC05XXwzWzAxXXxbMC05XSstWzAtOV0rfFwqL1swLTldKykpXHMrKD86XCp8KD86WzEtOV18MVswLTJdfFswLTldKy1bMC05XSt8XCovWzAtOV0rKSlccysoPzpcKnwoPzpbMC02XXxbMC02XS1bMC02XXxcKi9bMC05XSspKSQ="
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformers": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": "*/5 * * * *",
|
||||||
|
"options": [],
|
||||||
|
"localized": [
|
||||||
|
"name",
|
||||||
|
"description"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Schedule"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Only enabled if you select <code>schedule</code> in the <a href=\"#UNIFIAPI_RUN\"><code>UNIFIAPI_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>0 4 * * *</code> will run the scan after 4 am in the <a onclick=\"toggleAllSettings()\" href=\"#TIMEZONE\"><code>TIMEZONE</code> you set above</a>. Will be run NEXT time the time passes."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "CMD",
|
||||||
|
"type": {
|
||||||
|
"dataType": "string",
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"elementType": "input",
|
||||||
|
"elementOptions": [
|
||||||
|
{
|
||||||
|
"readonly": "true"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformers": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": "python3 /app/front/plugins/unifi_api_import/unifi_api_import.py",
|
||||||
|
"options": [],
|
||||||
|
"localized": [
|
||||||
|
"name",
|
||||||
|
"description"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Command"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Command to run. This can not be changed"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "RUN_TIMEOUT",
|
||||||
|
"type": {
|
||||||
|
"dataType": "integer",
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"elementType": "input",
|
||||||
|
"elementOptions": [
|
||||||
|
{
|
||||||
|
"type": "number"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformers": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": 10,
|
||||||
|
"options": [],
|
||||||
|
"localized": [
|
||||||
|
"name",
|
||||||
|
"description"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Run timeout"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"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."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "sites",
|
||||||
|
"type": {
|
||||||
|
"dataType": "array",
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"elementType": "button",
|
||||||
|
"elementOptions": [
|
||||||
|
{
|
||||||
|
"sourceSuffixes": [
|
||||||
|
"_in"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"separator": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cssClasses": "col-xs-12"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"onClick": "addViaPopupForm(this)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"getStringKey": "Gen_Add"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"popupForm": [
|
||||||
|
{
|
||||||
|
"function": "name",
|
||||||
|
"type": {
|
||||||
|
"dataType": "string",
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"elementType": "input",
|
||||||
|
"elementOptions": [
|
||||||
|
{
|
||||||
|
"placeholder": "Enter value"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"suffix": "_in"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cssClasses": "col-sm-10"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"prefillValue": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformers": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": "default",
|
||||||
|
"options": [],
|
||||||
|
"localized": [
|
||||||
|
"name",
|
||||||
|
"description"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Site name"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "The name of your site. Use a descriptive name."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "base_url",
|
||||||
|
"type": {
|
||||||
|
"dataType": "string",
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"elementType": "input",
|
||||||
|
"elementOptions": [
|
||||||
|
{
|
||||||
|
"placeholder": "https://host_ip/proxy/network/integration/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"suffix": "_in"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cssClasses": "col-sm-10"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"prefillValue": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformers": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": "default",
|
||||||
|
"options": [],
|
||||||
|
"localized": [
|
||||||
|
"name",
|
||||||
|
"description"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Base URL"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "You can find your base url in the UniFi Site Manager in <i>Settings -> Control Plane -> Integrations</i> in the <i>API Request Format</i> section, (e.g. <code>https://host_ip/proxy/network/integration/</code>)."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "version",
|
||||||
|
"type": {
|
||||||
|
"dataType": "string",
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"elementType": "input",
|
||||||
|
"elementOptions": [
|
||||||
|
{
|
||||||
|
"placeholder": "v1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"suffix": "_in"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cssClasses": "col-sm-10"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"prefillValue": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformers": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": "default",
|
||||||
|
"options": [],
|
||||||
|
"localized": [
|
||||||
|
"name",
|
||||||
|
"description"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "API version"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "The version of the API (e.g.: <code>v1</code>)."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "api_key",
|
||||||
|
"type": {
|
||||||
|
"dataType": "string",
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"elementType": "input",
|
||||||
|
"elementOptions": [
|
||||||
|
{
|
||||||
|
"placeholder": "Enter value"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"suffix": "_in"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cssClasses": "col-sm-10"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"prefillValue": "null"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformers": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": "default",
|
||||||
|
"options": [],
|
||||||
|
"localized": [
|
||||||
|
"name",
|
||||||
|
"description"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "API key"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "You can get an API key in your UniFi Site Manager in <i>Settings -> Control Plane -> Integrations</i>."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"function": "hide.site.verify_ssl",
|
||||||
|
"type": {
|
||||||
|
"dataType": "boolean",
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"elementType": "input",
|
||||||
|
"elementOptions": [
|
||||||
|
{
|
||||||
|
"type": "checkbox"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformers": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": 1,
|
||||||
|
"options": [],
|
||||||
|
"localized": [
|
||||||
|
"name",
|
||||||
|
"description"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Verify SSL"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Disable if you do not have an SSL certificate set up."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformers": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformers": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"elementType": "select",
|
||||||
|
"elementHasInputValue": 1,
|
||||||
|
"elementOptions": [
|
||||||
|
{
|
||||||
|
"multiple": "true"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"readonly": "true"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"editable": "true"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformers": [
|
||||||
|
"name|base64"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"elementType": "button",
|
||||||
|
"elementOptions": [
|
||||||
|
{
|
||||||
|
"sourceSuffixes": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"separator": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cssClasses": "col-xs-6"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"onClick": "removeFromList(this)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"getStringKey": "Gen_Remove_Last"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformers": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"elementType": "button",
|
||||||
|
"elementOptions": [
|
||||||
|
{
|
||||||
|
"sourceSuffixes": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"separator": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cssClasses": "col-xs-6"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"onClick": "removeAllOptions(this)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"getStringKey": "Gen_Remove_All"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformers": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default_value": [],
|
||||||
|
"options": [],
|
||||||
|
"localized": [
|
||||||
|
"name",
|
||||||
|
"description"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Sites"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "UniFi sites"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"database_column_definitions": [
|
||||||
|
{
|
||||||
|
"column": "Index",
|
||||||
|
"css_classes": "col-sm-2",
|
||||||
|
"show": true,
|
||||||
|
"type": "none",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": [
|
||||||
|
"name"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Index"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "Object_PrimaryID",
|
||||||
|
"mapped_to_column": "cur_MAC",
|
||||||
|
"css_classes": "col-sm-3",
|
||||||
|
"show": true,
|
||||||
|
"type": "device_name_mac",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": [
|
||||||
|
"name"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "MAC (name)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "Watched_Value3",
|
||||||
|
"mapped_to_column": "cur_Type",
|
||||||
|
"css_classes": "col-sm-2",
|
||||||
|
"show": true,
|
||||||
|
"type": "label",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": [
|
||||||
|
"name"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Device Type"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "Watched_Value4",
|
||||||
|
"css_classes": "col-sm-2",
|
||||||
|
"show": false,
|
||||||
|
"type": "label",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": [
|
||||||
|
"name"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "N/A"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "Dummy",
|
||||||
|
"mapped_to_column": "cur_ScanMethod",
|
||||||
|
"mapped_to_column_data": {
|
||||||
|
"value": "Example Plugin"
|
||||||
|
},
|
||||||
|
"css_classes": "col-sm-2",
|
||||||
|
"show": false,
|
||||||
|
"type": "label",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": [
|
||||||
|
"name"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Scan method"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "DateTimeCreated",
|
||||||
|
"css_classes": "col-sm-2",
|
||||||
|
"show": true,
|
||||||
|
"type": "label",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": [
|
||||||
|
"name"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Created"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"column": "DateTimeChanged",
|
||||||
|
"css_classes": "col-sm-2",
|
||||||
|
"show": true,
|
||||||
|
"type": "label",
|
||||||
|
"default_value": "",
|
||||||
|
"options": [],
|
||||||
|
"localized": [
|
||||||
|
"name"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"language_code": "en_us",
|
||||||
|
"string": "Changed"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
124
front/plugins/unifi_api_import/unifi_api_import.py
Executable file
124
front/plugins/unifi_api_import/unifi_api_import.py
Executable file
@@ -0,0 +1,124 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import os
|
||||||
|
import pathlib
|
||||||
|
import sys
|
||||||
|
import json
|
||||||
|
import sqlite3
|
||||||
|
from pytz import timezone
|
||||||
|
|
||||||
|
# Define the installation path and extend the system path for plugin imports
|
||||||
|
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 plugin_utils import get_plugins_configs
|
||||||
|
from logger import mylog, Logger
|
||||||
|
from const import pluginsPath, fullDbPath, logPath
|
||||||
|
from helper import timeNowTZ, get_setting_value
|
||||||
|
|
||||||
|
from messaging.in_app import write_notification
|
||||||
|
import conf
|
||||||
|
|
||||||
|
# Make sure the TIMEZONE for logging is correct
|
||||||
|
conf.tz = timezone(get_setting_value('TIMEZONE'))
|
||||||
|
|
||||||
|
# Make sure log level is initialized correctly
|
||||||
|
Logger(get_setting_value('LOG_LEVEL'))
|
||||||
|
|
||||||
|
pluginName = '<unique_prefix>'
|
||||||
|
|
||||||
|
# Define the current path and log file paths
|
||||||
|
LOG_PATH = logPath + '/plugins'
|
||||||
|
LOG_FILE = os.path.join(LOG_PATH, f'script.{pluginName}.log')
|
||||||
|
RESULT_FILE = os.path.join(LOG_PATH, f'last_result.{pluginName}.log')
|
||||||
|
|
||||||
|
# Initialize the Plugin obj output file
|
||||||
|
plugin_objects = Plugin_Objects(RESULT_FILE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
mylog('verbose', [f'[{pluginName}] In script'])
|
||||||
|
|
||||||
|
# Retrieve configuration settings
|
||||||
|
some_setting = get_setting_value('SYNC_plugins')
|
||||||
|
|
||||||
|
mylog('verbose', [f'[{pluginName}] some_setting value {some_setting}'])
|
||||||
|
|
||||||
|
# retrieve data
|
||||||
|
device_data = get_device_data(some_setting)
|
||||||
|
|
||||||
|
# Process the data into native application tables
|
||||||
|
if len(device_data) > 0:
|
||||||
|
|
||||||
|
# insert devices into the lats_result.log
|
||||||
|
# make sure the below mapping is mapped in config.json, for example:
|
||||||
|
#"database_column_definitions": [
|
||||||
|
# {
|
||||||
|
# "column": "Object_PrimaryID", <--------- the value I save into primaryId
|
||||||
|
# "mapped_to_column": "cur_MAC", <--------- gets inserted into the CurrentScan DB table column cur_MAC
|
||||||
|
#
|
||||||
|
for device in device_data:
|
||||||
|
plugin_objects.add_object(
|
||||||
|
primaryId = device['mac_address'],
|
||||||
|
secondaryId = device['ip_address'],
|
||||||
|
watched1 = device['hostname'],
|
||||||
|
watched2 = device['vendor'],
|
||||||
|
watched3 = device['device_type'],
|
||||||
|
watched4 = device['last_seen'],
|
||||||
|
extra = '',
|
||||||
|
foreignKey = device['mac_address']
|
||||||
|
# helpVal1 = "Something1", # Optional Helper values to be passed for mapping into the app
|
||||||
|
# helpVal2 = "Something1", # If you need to use even only 1, add the remaining ones too
|
||||||
|
# helpVal3 = "Something1", # and set them to 'null'. Check the the docs for details:
|
||||||
|
# helpVal4 = "Something1", # https://github.com/jokob-sk/NetAlertX/blob/main/docs/PLUGINS_DEV.md
|
||||||
|
)
|
||||||
|
|
||||||
|
mylog('verbose', [f'[{pluginName}] New entries: "{len(device_data)}"'])
|
||||||
|
|
||||||
|
# log result
|
||||||
|
plugin_objects.write_result_file()
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
|
# retrieve data
|
||||||
|
def get_device_data(some_setting):
|
||||||
|
|
||||||
|
device_data = []
|
||||||
|
|
||||||
|
# do some processing, call exteranl APIs, and return a device_data list
|
||||||
|
# ...
|
||||||
|
#
|
||||||
|
# Sample data for testing purposes, you can adjust the processing in main() as needed
|
||||||
|
# ... before adding it to the plugin_objects.add_object(...)
|
||||||
|
device_data = [
|
||||||
|
{
|
||||||
|
'device_id': 'device1',
|
||||||
|
'mac_address': '00:11:22:33:44:55',
|
||||||
|
'ip_address': '192.168.1.2',
|
||||||
|
'hostname': 'iPhone 12',
|
||||||
|
'vendor': 'Apple Inc.',
|
||||||
|
'device_type': 'Smartphone',
|
||||||
|
'last_seen': '2024-06-27 10:00:00',
|
||||||
|
'port': '1',
|
||||||
|
'network_id': 'network1'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'device_id': 'device2',
|
||||||
|
'mac_address': '00:11:22:33:44:66',
|
||||||
|
'ip_address': '192.168.1.3',
|
||||||
|
'hostname': 'Moto G82',
|
||||||
|
'vendor': 'Motorola Inc.',
|
||||||
|
'device_type': 'Laptop',
|
||||||
|
'last_seen': '2024-06-27 10:05:00',
|
||||||
|
'port': '',
|
||||||
|
'network_id': 'network1'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
# Return the data to be detected by the main application
|
||||||
|
return device_data
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
@@ -261,36 +261,36 @@ pluginUnprocessedEvents = []
|
|||||||
pluginObjects = []
|
pluginObjects = []
|
||||||
pluginHistory = []
|
pluginHistory = []
|
||||||
|
|
||||||
function getData(){
|
async function getData() {
|
||||||
|
try {
|
||||||
|
showSpinner();
|
||||||
|
console.log("Plugins getData called");
|
||||||
|
|
||||||
console.log("Plugins getData called");
|
const [plugins, events, objects, history] = await Promise.all([
|
||||||
|
fetchJson('plugins.json'),
|
||||||
|
fetchJson('table_plugins_events.json'),
|
||||||
|
fetchJson('table_plugins_objects.json'),
|
||||||
|
fetchJson('table_plugins_history.json')
|
||||||
|
]);
|
||||||
|
|
||||||
// Show the loading spinner while generating
|
pluginDefinitions = plugins.data;
|
||||||
showSpinner();
|
pluginUnprocessedEvents = events.data;
|
||||||
|
pluginObjects = objects.data;
|
||||||
|
pluginHistory = history.data;
|
||||||
|
|
||||||
$.get('php/server/query_json.php?file=plugins.json', function(res) {
|
generateTabs();
|
||||||
|
} catch (err) {
|
||||||
pluginDefinitions = res["data"];
|
console.error("Failed to load data", err);
|
||||||
|
}
|
||||||
$.get('php/server/query_json.php?file=table_plugins_events.json', function(res) {
|
|
||||||
|
|
||||||
pluginUnprocessedEvents = res["data"];
|
|
||||||
|
|
||||||
$.get('php/server/query_json.php?file=table_plugins_objects.json', function(res) {
|
|
||||||
|
|
||||||
pluginObjects = res["data"];
|
|
||||||
|
|
||||||
$.get('php/server/query_json.php?file=table_plugins_history.json', function(res) {
|
|
||||||
|
|
||||||
pluginHistory = res["data"];
|
|
||||||
|
|
||||||
generateTabs()
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function fetchJson(filename) {
|
||||||
|
const response = await fetch(`php/server/query_json.php?file=${filename}`);
|
||||||
|
if (!response.ok) throw new Error(`Failed to load ${filename}`);
|
||||||
|
return await response.json();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function generateTabs() {
|
function generateTabs() {
|
||||||
|
|
||||||
// Reset the tabs by clearing previous headers and content
|
// Reset the tabs by clearing previous headers and content
|
||||||
|
|||||||
@@ -16,6 +16,10 @@
|
|||||||
require 'php/templates/header.php';
|
require 'php/templates/header.php';
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
showSpinner();
|
||||||
|
</script>
|
||||||
|
|
||||||
<!-- Page ------------------------------------------------------------------ -->
|
<!-- Page ------------------------------------------------------------------ -->
|
||||||
<div class="content-wrapper">
|
<div class="content-wrapper">
|
||||||
|
|
||||||
@@ -67,7 +71,7 @@
|
|||||||
<div class="inner"> <h3 id="devicesNew"> -- </h3>
|
<div class="inner"> <h3 id="devicesNew"> -- </h3>
|
||||||
<p class="infobox_label"><?= lang('Presence_Shortcut_NewDevices');?></p>
|
<p class="infobox_label"><?= lang('Presence_Shortcut_NewDevices');?></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="icon"> <i class="ion ion-plus-round text-yellow-40"></i> </div>
|
<div class="icon"> <i class="fa-solid fa-circle-plus text-yellow-40"></i> </div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
require 'php/templates/header.php';
|
require 'php/templates/header.php';
|
||||||
require 'php/templates/notification.php';
|
require 'php/templates/modals.php';
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
showSpinner();
|
||||||
|
</script>
|
||||||
|
|
||||||
<!-- Page ------------------------------------------------------------------ -->
|
<!-- Page ------------------------------------------------------------------ -->
|
||||||
<div class="content-wrapper">
|
<div class="content-wrapper">
|
||||||
|
|
||||||
@@ -119,6 +123,9 @@
|
|||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
console.error('Error:', error);
|
console.error('Error:', error);
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
hideSpinner(); // always called, even if error occurred
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,12 @@ $settingsJSON_DB = json_encode($settings, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX
|
|||||||
|
|
||||||
<div id="settingsPage" class="content-wrapper">
|
<div id="settingsPage" class="content-wrapper">
|
||||||
|
|
||||||
|
<a style="cursor:pointer">
|
||||||
|
<span>
|
||||||
|
<i id='toggleSettings' onclick="toggleAllSettings()" class="settings-expand-icon fa fa-angle-double-down"></i>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
|
||||||
<!-- Content header--------------------------------------------------------- -->
|
<!-- Content header--------------------------------------------------------- -->
|
||||||
|
|
||||||
<section class="content-header">
|
<section class="content-header">
|
||||||
@@ -597,7 +603,8 @@ $settingsJSON_DB = json_encode($settings, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX
|
|||||||
customParams,
|
customParams,
|
||||||
customId,
|
customId,
|
||||||
columns,
|
columns,
|
||||||
base64Regex
|
base64Regex,
|
||||||
|
elementOptionsBase64
|
||||||
} = handleElementOptions('none', elementOptions, transformers, val = "");
|
} = handleElementOptions('none', elementOptions, transformers, val = "");
|
||||||
|
|
||||||
let value;
|
let value;
|
||||||
|
|||||||
@@ -13,587 +13,128 @@
|
|||||||
|
|
||||||
require 'php/templates/header.php';
|
require 'php/templates/header.php';
|
||||||
?>
|
?>
|
||||||
<?php require 'php/templates/notification.php'; ?>
|
<?php require 'php/templates/modals.php'; ?>
|
||||||
<!-- ----------------------------------------------------------------------- -->
|
<!-- ----------------------------------------------------------------------- -->
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
// show spinning icon
|
||||||
|
showSpinner()
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
<!-- Page ------------------------------------------------------------------ -->
|
<!-- Page ------------------------------------------------------------------ -->
|
||||||
<div class="content-wrapper">
|
<div class="content-wrapper">
|
||||||
|
|
||||||
<!-- Main content ---------------------------------------------------------- -->
|
<!-- Main content ---------------------------------------------------------- -->
|
||||||
<section class="content">
|
<section class="content">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12 col-sm-12 col-xs-12">
|
||||||
|
<!-- <div class="box-transparent"> -->
|
||||||
|
<div id="navSysInfo" class="nav-tabs-custom">
|
||||||
|
<ul class="nav nav-tabs" style="font-size:16px;">
|
||||||
|
<li>
|
||||||
|
<a id="tabServer" href="#panServer" data-toggle="tab">
|
||||||
|
<i class="fa fa-info-circle"></i>
|
||||||
|
<span class="dev-detail-tab-name">
|
||||||
|
<?= lang('Systeminfo_System');?>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a id="tabNetwork" href="#panNetwork" data-toggle="tab">
|
||||||
|
<i class="fa fa-sitemap fa-rotate-270"></i>
|
||||||
|
<span class="dev-detail-tab-name">
|
||||||
|
<?= lang('Systeminfo_Network');?>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a id="tabStorage" href="#panStorage" data-toggle="tab">
|
||||||
|
<i class="fa fa-hdd"></i>
|
||||||
|
<span class="dev-detail-tab-name">
|
||||||
|
<?= lang('Systeminfo_Storage');?>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<?php
|
<div class="tab-content spinnerTarget" style="min-height: 430px;">
|
||||||
//General stats
|
<div class="tab-pane fade" data-php-file="systeminfoServer.php" id="panServer">
|
||||||
// Date & Time
|
<!-- PLACEHOLDER -->
|
||||||
$date = new DateTime();
|
</div>
|
||||||
$formatted_date = $date->format('l, F j, Y H:i:s'); // Get date
|
<div class="tab-pane fade" data-php-file="systeminfoNetwork.php" id="panNetwork">
|
||||||
$formatted_date2 = $date->format('d/m/Y H:i:s'); // Get date2
|
<!-- PLACEHOLDER -->
|
||||||
$formatted_date3 = $date->format('Y/m/d H:i:s'); // Get date3
|
</div>
|
||||||
//System stats
|
<div class="tab-pane fade table-responsive" data-php-file="systeminfoStorage.php" id="panStorage">
|
||||||
// OS-Version
|
<!-- PLACEHOLDER -->
|
||||||
$os_version = '';
|
</div>
|
||||||
// Raspbian
|
|
||||||
if ($os_version == '') {$os_version = exec('cat /etc/os-release | grep PRETTY_NAME');}
|
|
||||||
// Dietpi
|
|
||||||
if ($os_version == '') {$os_version = exec('uname -o');}
|
|
||||||
//$os_version_arr = explode("\n", trim($os_version));
|
|
||||||
$stat['os_version'] = str_replace('"', '', str_replace('PRETTY_NAME=', '', $os_version));
|
|
||||||
$stat['uptime'] = str_replace('up ', '', shell_exec("uptime -p")); // Get system uptime
|
|
||||||
$system_namekernel = shell_exec("uname"); // Get system name kernel
|
|
||||||
$system_namesystem = shell_exec("uname -o"); // Get name system
|
|
||||||
$system_full = shell_exec("uname -a"); // Get system full
|
|
||||||
$system_architecture = shell_exec("uname -m"); // Get system Architecture
|
|
||||||
$load_average = sys_getloadavg(); // Get load average
|
|
||||||
$system_process_count = shell_exec("ps -e --no-headers | wc -l"); // Count processes
|
|
||||||
//Motherboard stats
|
|
||||||
$motherboard_name = shell_exec('cat /sys/class/dmi/id/board_name'); // Get the Motherboard name
|
|
||||||
$motherboard_manufactured = shell_exec('cat /sys/class/dmi/id/board_vendor'); // Get the Motherboard manufactured
|
|
||||||
$motherboard_revision = shell_exec('cat /sys/class/dmi/id/board_version'); // Get the Motherboard revision
|
|
||||||
$motherboard_bios = shell_exec('cat /sys/class/dmi/id/bios_version'); // Get the Motherboard BIOS
|
|
||||||
$motherboard_biosdate = shell_exec('cat /sys/class/dmi/id/bios_date'); // Get the Motherboard BIOS date
|
|
||||||
$motherboard_biosvendor = shell_exec('cat /sys/class/dmi/id/bios_vendor'); // Get the Motherboard BIOS vendor
|
|
||||||
//CPU stats
|
|
||||||
$prevVal = shell_exec("cat /proc/cpuinfo | grep processor");
|
|
||||||
$prevArr = explode("\n", trim($prevVal));
|
|
||||||
$stat['cpu'] = sizeof($prevArr);
|
|
||||||
$cpu_result = shell_exec("cat /proc/cpuinfo | grep Model");
|
|
||||||
$stat['cpu_model'] = strstr($cpu_result, "\n", true);
|
|
||||||
$stat['cpu_model'] = str_replace(":", "", trim(str_replace("Model", "", $stat['cpu_model'])));
|
|
||||||
if ($stat['cpu_model'] == '') {
|
|
||||||
$cpu_result = shell_exec("cat /proc/cpuinfo | grep model\ name");
|
|
||||||
$stat['cpu_model'] = strstr($cpu_result, "\n", true);
|
|
||||||
$stat['cpu_model'] = str_replace(":", "", trim(str_replace("model name", "", $stat['cpu_model'])));
|
|
||||||
}
|
|
||||||
if (file_exists('/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq')) {
|
|
||||||
// RaspbianOS
|
|
||||||
$stat['cpu_frequ'] = exec('cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq') / 1000;
|
|
||||||
} elseif (is_numeric(str_replace(',', '.', exec('lscpu | grep "MHz" | awk \'{print $3}\'')))) {
|
|
||||||
// Ubuntu Server, DietPi event. others
|
|
||||||
$stat['cpu_frequ'] = round(exec('lscpu | grep "MHz" | awk \'{print $3}\''), 0);
|
|
||||||
} elseif (is_numeric(str_replace(',', '.', exec('lscpu | grep "max MHz" | awk \'{print $4}\'')))) {
|
|
||||||
// RaspbianOS and event. others
|
|
||||||
$stat['cpu_frequ'] = round(str_replace(',', '.', exec('lscpu | grep "max MHz" | awk \'{print $4}\'')), 0);
|
|
||||||
} else {
|
|
||||||
// Fallback
|
|
||||||
$stat['cpu_frequ'] = "unknown";
|
|
||||||
}
|
|
||||||
$cpu_temp = shell_exec('cat /sys/class/hwmon/hwmon0/temp1_input'); // Get the CPU temperature
|
|
||||||
$cpu_temp = floatval($cpu_temp) / 1000; // Convert the temperature to degrees Celsius
|
|
||||||
$cpu_vendor = exec('cat /proc/cpuinfo | grep "vendor_id" | cut -d ":" -f 2' ); // Get the CPU vendor
|
|
||||||
//Memory stats
|
|
||||||
$total_memorykb = shell_exec("cat /proc/meminfo | grep MemTotal | awk '{print $2}'");
|
|
||||||
$total_memorykb = trim($total_memorykb);
|
|
||||||
$total_memorykb = number_format($total_memorykb, 0, '.', '.');
|
|
||||||
$total_memorymb = shell_exec("cat /proc/meminfo | grep MemTotal | awk '{print $2/1024}'");
|
|
||||||
$total_memorymb = trim($total_memorymb);
|
|
||||||
$total_memorymb = number_format($total_memorymb, 0, '.', '.');
|
|
||||||
$mem_used = round(memory_get_usage() / 1048576 * 100, 2);
|
|
||||||
$memory_usage_percent = round(($mem_used / $total_memorymb), 2);
|
|
||||||
//HDD stats
|
|
||||||
$hdd_result = shell_exec(" df -P | awk '{print $1}'");
|
|
||||||
$hdd_devices = explode("\n", trim($hdd_result));
|
|
||||||
$hdd_result = shell_exec(" df -P | awk '{print $2}'");
|
|
||||||
$hdd_devices_total = explode("\n", trim($hdd_result));
|
|
||||||
$hdd_result = shell_exec(" df -P | awk '{print $3}'");
|
|
||||||
$hdd_devices_used = explode("\n", trim($hdd_result));
|
|
||||||
$hdd_result = shell_exec(" df -P | awk '{print $4}'");
|
|
||||||
$hdd_devices_free = explode("\n", trim($hdd_result));
|
|
||||||
$hdd_result = shell_exec(" df -P | awk '{print $5}'");
|
|
||||||
$hdd_devices_percent = explode("\n", trim($hdd_result));
|
|
||||||
$hdd_result = shell_exec(" df -P | awk '{print $6}'");
|
|
||||||
$hdd_devices_mount = explode("\n", trim($hdd_result));
|
|
||||||
//Network stats
|
|
||||||
// Check Server name
|
|
||||||
if (!empty(gethostname())) { $network_NAME = gethostname(); } else { $network_NAME = lang('Systeminfo_Network_Server_Name_String'); }
|
|
||||||
// Check HTTPS
|
|
||||||
if (isset($_SERVER['HTTPS'])) { $network_HTTPS = 'Yes (HTTPS)'; } else { $network_HTTPS = lang('Systeminfo_Network_Secure_Connection_String'); }
|
|
||||||
// Check Query String
|
|
||||||
if (empty($_SERVER['QUERY_STRING'])) { $network_QueryString = lang('Systeminfo_Network_Server_Query_String'); } else { $network_QueryString = $_SERVER['QUERY_STRING']; }
|
|
||||||
// Check HTTP referer
|
|
||||||
if (empty($_SERVER['HTTP_REFERER'])) { $network_referer = lang('Systeminfo_Network_HTTP_Referer_String'); } else { $network_referer = $_SERVER['HTTP_REFERER']; }
|
|
||||||
//Network Hardware stat
|
|
||||||
$network_result = shell_exec("cat /proc/net/dev | tail -n +3 | awk '{print $1}'");
|
|
||||||
$net_interfaces = explode("\n", trim($network_result));
|
|
||||||
$network_result = shell_exec("cat /proc/net/dev | tail -n +3 | awk '{print $2}'");
|
|
||||||
$net_interfaces_rx = explode("\n", trim($network_result));
|
|
||||||
$network_result = shell_exec("cat /proc/net/dev | tail -n +3 | awk '{print $10}'");
|
|
||||||
$net_interfaces_tx = explode("\n", trim($network_result));
|
|
||||||
//USB devices
|
|
||||||
$usb_result = shell_exec("lsusb");
|
|
||||||
$usb_devices_mount = explode("\n", trim($usb_result));
|
|
||||||
|
|
||||||
// General ----------------------------------------------------------
|
|
||||||
echo '<div class="box box-solid">
|
|
||||||
<div class="box-header">
|
|
||||||
<h3 class="box-title sysinfo_headline"><i class="fa fa-info-circle"></i> ' . lang('Systeminfo_General') . '</h3>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<!-- /.tab-content -->
|
||||||
<div class="row">
|
</div>
|
||||||
<div class="col-sm-3 sysinfo_general_a">' . lang('Systeminfo_General_Full_Date') . '</div>
|
<!-- /.nav-tabs-custom -->
|
||||||
<div class="col-sm-9 sysinfo_general_b">' . $formatted_date . '</div>
|
<!-- </div> -->
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_general_a">' . lang('Systeminfo_General_Date') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_general_b">' . $formatted_date2 . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_general_a">' . lang('Systeminfo_General_Date2') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_general_b">' . $formatted_date3 . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_general_a">' . lang('Systeminfo_General_TimeZone') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_general_b">' . $timeZone . '</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>';
|
|
||||||
|
|
||||||
// Network Hardware ----------------------------------------------------------
|
|
||||||
echo '<div class="box box-solid">
|
|
||||||
<div class="box-header">
|
|
||||||
<h3 class="box-title sysinfo_headline"><i class="fa fa-sitemap fa-rotate-270"></i> ' . lang('Systeminfo_Network_Hardware') . '</h3>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="box-body">
|
<!-- /.col -->
|
||||||
<table id="networkTable" class="table table-bordered table-hover">
|
</div>
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>' . lang('Systeminfo_Network_Hardware_Interface_Name') . '</th>
|
|
||||||
<th>' . lang('Systeminfo_Network_Hardware_Interface_Mask') . '</th>
|
|
||||||
<th>' . lang('Systeminfo_Network_Hardware_Interface_RX') . '</th>
|
|
||||||
<th>' . lang('Systeminfo_Network_Hardware_Interface_TX') . '</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>';
|
|
||||||
|
|
||||||
for ($x = 0; $x < sizeof($net_interfaces); $x++) {
|
</section>
|
||||||
$interface_name = str_replace(':', '', $net_interfaces[$x]);
|
|
||||||
$interface_ip_temp = exec('ip addr show ' . $interface_name . ' | grep "inet "');
|
|
||||||
$interface_ip_arr = explode(' ', trim($interface_ip_temp));
|
|
||||||
|
|
||||||
if (!isset($interface_ip_arr[1])) {
|
|
||||||
$interface_ip_arr[1] = '--';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($net_interfaces_rx[$x] == 0) {
|
|
||||||
$temp_rx = 0;
|
|
||||||
} else {
|
|
||||||
$temp_rx = number_format(round(($net_interfaces_rx[$x] / 1024 / 1024), 2), 2, ',', '.');
|
|
||||||
}
|
|
||||||
if ($net_interfaces_tx[$x] == 0) {
|
|
||||||
$temp_tx = 0;
|
|
||||||
} else {
|
|
||||||
$temp_tx = number_format(round(($net_interfaces_tx[$x] / 1024 / 1024), 2), 2, ',', '.');
|
|
||||||
}
|
|
||||||
echo '<tr>';
|
|
||||||
echo '<td>' . $interface_name . '</td>';
|
|
||||||
echo '<td>' . $interface_ip_arr[1] . '</td>';
|
|
||||||
echo '<td>' . $temp_rx . ' MB</td>';
|
|
||||||
echo '<td>' . $temp_tx . ' MB</td>';
|
|
||||||
echo '</tr>';
|
|
||||||
}
|
|
||||||
|
|
||||||
echo ' </tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>';
|
|
||||||
|
|
||||||
// Client ----------------------------------------------------------
|
|
||||||
echo '<div class="box box-solid">
|
|
||||||
<div class="box-header">
|
|
||||||
<h3 class="box-title sysinfo_headline"><i class="fa fa-globe"></i> ' . lang('Systeminfo_This_Client') . '</h3>
|
|
||||||
</div>
|
|
||||||
<div class="box-body">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_client_a">' . lang('Systeminfo_Client_User_Agent') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_client_b">' . $_SERVER['HTTP_USER_AGENT'] . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_client_a">' . lang('Systeminfo_Client_Resolution') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_client_b" id="resolution"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>';
|
|
||||||
|
|
||||||
echo '<script>
|
|
||||||
var ratio = window.devicePixelRatio || 1;
|
|
||||||
var w = window.innerWidth;
|
|
||||||
var h = window.innerHeight;
|
|
||||||
var rw = window.innerWidth * ratio;
|
|
||||||
var rh = window.innerHeight * ratio;
|
|
||||||
|
|
||||||
var resolutionDiv = document.getElementById("resolution");
|
|
||||||
resolutionDiv.innerHTML = "Width: " + w + "px / Height: " + h + "px<br> " + "Width: " + rw + "px / Height: " + rh + "px (native)";
|
|
||||||
</script>';
|
|
||||||
|
|
||||||
// System ----------------------------------------------------------
|
|
||||||
echo '<div class="box box-solid">
|
|
||||||
<div class="box-header">
|
|
||||||
<h3 class="box-title sysinfo_headline"><i class="fa fa-computer"></i> ' . lang('Systeminfo_System') . '</h3>
|
|
||||||
</div>
|
|
||||||
<div class="box-body">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_system_a">' . lang('Systeminfo_System_Uptime') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_system_b">' . $stat['uptime'] . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_system_a">' . lang('Systeminfo_System_Kernel') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_system_b">' . $system_namekernel . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_system_a">' . lang('Systeminfo_System_System') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_system_b">' . $system_namesystem . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_system_a">' . lang('Systeminfo_System_OSVersion') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_system_b">' . $stat['os_version'] . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_system_a">' . lang('Systeminfo_System_Uname') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_system_b">' . $system_full . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_system_a">' . lang('Systeminfo_System_Architecture') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_system_b">' . $system_architecture . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_system_a">' . lang('Systeminfo_System_AVG') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_system_b">'. $load_average[0] .' '. $load_average[1] .' '. $load_average[2] .'</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_system_a">' . lang('Systeminfo_System_Running_Processes') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_system_b">' . $system_process_count . '</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>';
|
|
||||||
|
|
||||||
// Motherboard ----------------------------------------------------------
|
|
||||||
echo '<div class="box box-solid">
|
|
||||||
<div class="box-header">
|
|
||||||
<h3 class="box-title sysinfo_headline"><i class="fa fa-laptop-code"></i> ' . lang('Systeminfo_Motherboard') . '</h3>
|
|
||||||
</div>
|
|
||||||
<div class="box-body">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_motherboard_a">' . lang('Systeminfo_Motherboard_Name') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_motherboard_b">' . $motherboard_name . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_motherboard_a">' . lang('Systeminfo_Motherboard_Manufactured') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_motherboard_b">' . $motherboard_manufactured . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_motherboard_a">' . lang('Systeminfo_Motherboard_Revision') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_motherboard_b">' . $motherboard_revision. '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_motherboard_a">' . lang('Systeminfo_Motherboard_BIOS') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_motherboard_b">' . $motherboard_bios . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_motherboard_a">' . lang('Systeminfo_Motherboard_BIOS_Date') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_motherboard_b">' . $motherboard_biosdate . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_motherboard_a">' . lang('Systeminfo_Motherboard_BIOS_Vendor') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_motherboard_b">' . $motherboard_biosvendor . '</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>';
|
|
||||||
|
|
||||||
// CPU ----------------------------------------------------------
|
|
||||||
echo '<div class="box box-solid">
|
|
||||||
<div class="box-header">
|
|
||||||
<h3 class="box-title sysinfo_headline"><i class="fa fa-microchip"></i> ' . lang('Systeminfo_CPU') . '</h3>
|
|
||||||
</div>
|
|
||||||
<div class="box-body">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_cpu_a">' . lang('Systeminfo_CPU_Vendor') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_cpu_b">' . $cpu_vendor . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_cpu_a">' . lang('Systeminfo_CPU_Name') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_cpu_b">' . $stat['cpu_model'] . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_cpu_a">' . lang('Systeminfo_CPU_Cores') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_cpu_b">' . $stat['cpu'] . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_cpu_a">' . lang('Systeminfo_CPU_Speed') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_cpu_b">' . $stat['cpu_frequ'] . ' MHz</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_cpu_a">' . lang('Systeminfo_CPU_Temp') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_cpu_b">'. $cpu_temp .' °C</div>
|
|
||||||
</div>';
|
|
||||||
// Get the number of CPU cores
|
|
||||||
$num_cpus = $stat['cpu'];
|
|
||||||
$num_cpus = $num_cpus +2;
|
|
||||||
|
|
||||||
// Iterate over the CPU cores
|
|
||||||
for ($i = 2,$a = 0; $i < $num_cpus; $i++,$a++) {
|
|
||||||
|
|
||||||
// Get the CPU temperature
|
|
||||||
$cpu_tempxx = shell_exec('cat /sys/class/hwmon/hwmon0/temp' . $i . '_input');
|
|
||||||
|
|
||||||
// Convert the temperature to degrees Celsius
|
|
||||||
$cpu_tempxx = floatval($cpu_tempxx) / 1000;
|
|
||||||
|
|
||||||
// Print the CPU temperature
|
|
||||||
echo '<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_cpu_a">CPU Temp ' . $a . ':</div>
|
|
||||||
<div class="col-sm-9 sysinfo_cpu_b">' . $cpu_tempxx . ' °C</div>
|
|
||||||
</div>';
|
|
||||||
}
|
|
||||||
echo '
|
|
||||||
</div>
|
|
||||||
</div>';
|
|
||||||
|
|
||||||
// Memory ----------------------------------------------------------
|
|
||||||
echo '<div class="box box-solid">
|
|
||||||
<div class="box-header">
|
|
||||||
<h3 class="box-title sysinfo_headline"><i class="fa fa-memory"></i> ' . lang('Systeminfo_Memory') . '</h3>
|
|
||||||
</div>
|
|
||||||
<div class="box-body">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_memory_a">' . lang('Systeminfo_Memory_Usage_Percent') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_memory_b">' . $memory_usage_percent . ' %</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_memory_a">' . lang('Systeminfo_Memory_Usage') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_memory_b">' . $mem_used . ' MB / ' . $total_memorymb . ' MB</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_memory_a">' . lang('Systeminfo_Memory_Total_Memory') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_memory_b">' . $total_memorymb . ' MB (' . $total_memorykb . ' KB)</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>';
|
|
||||||
|
|
||||||
// Storage ----------------------------------------------------------
|
|
||||||
echo '<div class="box box-solid">
|
|
||||||
<div class="box-header">
|
|
||||||
<h3 class="box-title sysinfo_headline"><i class="fa fa-hdd"></i> ' . lang('Systeminfo_Storage') . '</h3>
|
|
||||||
</div>
|
|
||||||
<div class="box-body">';
|
|
||||||
|
|
||||||
$storage_lsblk = shell_exec("lsblk -io NAME,SIZE,TYPE,MOUNTPOINT,MODEL --list | tail -n +2 | awk '{print $1\"#\"$2\"#\"$3\"#\"$4\"#\"$5}'");
|
|
||||||
$storage_lsblk_line = explode("\n", $storage_lsblk);
|
|
||||||
$storage_lsblk_line = array_filter($storage_lsblk_line);
|
|
||||||
|
|
||||||
for ($x = 0; $x < sizeof($storage_lsblk_line); $x++) {
|
|
||||||
$temp = array();
|
|
||||||
$temp = explode("#", $storage_lsblk_line[$x]);
|
|
||||||
$storage_lsblk_line[$x] = $temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
for ($x = 0; $x < sizeof($storage_lsblk_line); $x++) {
|
|
||||||
echo '<div class="row">';
|
|
||||||
if (preg_match('~[0-9]+~', $storage_lsblk_line[$x][0])) {
|
|
||||||
echo '<div class="col-sm-4 sysinfo_storage_a">"' . lang('Systeminfo_Storage_Mount') . ' ' . $storage_lsblk_line[$x][3] . '"</div>';
|
|
||||||
} else {
|
|
||||||
echo '<div class="col-sm-4 sysinfo_storage_a">"' . str_replace('_', ' ', $storage_lsblk_line[$x][3]) . '"</div>';
|
|
||||||
}
|
|
||||||
echo '<div class="col-sm-3 sysinfo_storage_b">' . lang('Systeminfo_Storage_Device') . ' /dev/' . $storage_lsblk_line[$x][0] . '</div>';
|
|
||||||
echo '<div class="col-sm-2 sysinfo_storage_b">' . lang('Systeminfo_Storage_Size') . ' ' . $storage_lsblk_line[$x][1] . '</div>';
|
|
||||||
echo '<div class="col-sm-2 sysinfo_storage_b">' . lang('Systeminfo_Storage_Type') . ' ' . $storage_lsblk_line[$x][2] . '</div>';
|
|
||||||
echo '</div>';
|
|
||||||
}
|
|
||||||
echo ' </div>
|
|
||||||
</div>';
|
|
||||||
|
|
||||||
// Storage usage ----------------------------------------------------------
|
|
||||||
echo '<div class="box box-solid">
|
|
||||||
<div class="box-header">
|
|
||||||
<h3 class="box-title sysinfo_headline"><i class="fa fa-hdd"></i> ' . lang('Systeminfo_Storage_Usage') . '</h3>
|
|
||||||
</div>
|
|
||||||
<div class="box-body">';
|
|
||||||
for ($x = 0; $x < sizeof($hdd_devices); $x++) {
|
|
||||||
if (stristr($hdd_devices[$x], '/dev/')) {
|
|
||||||
if (!stristr($hdd_devices[$x], '/loop')) {
|
|
||||||
if ($hdd_devices_total[$x] == 0 || $hdd_devices_total[$x] == '') {$temp_total = 0;} else { $temp_total = number_format(round(($hdd_devices_total[$x] / 1024 / 1024), 2), 2, ',', '.'); $temp_total = trim($temp_total);}
|
|
||||||
if ($hdd_devices_used[$x] == 0 || $hdd_devices_used[$x] == '') {$temp_used = 0;} else { $temp_used = number_format(round(($hdd_devices_used[$x] / 1024 / 1024), 2), 2, ',', '.'); $temp_used = trim($temp_total);}
|
|
||||||
if ($hdd_devices_free[$x] == 0 || $hdd_devices_free[$x] == '') {$temp_free = 0;} else { $temp_free = number_format(round(($hdd_devices_free[$x] / 1024 / 1024), 2), 2, ',', '.'); $temp_free = trim($temp_total);}
|
|
||||||
echo '<div class="row">';
|
|
||||||
echo '<div class="col-sm-4 sysinfo_storage_usage_a">"' . lang('Systeminfo_Storage_Usage_Mount') . ' ' . $hdd_devices_mount[$x] . '"</div>';
|
|
||||||
echo '<div class="col-sm-2 sysinfo_storage_usage_b">' . lang('Systeminfo_Storage_Usage_Total') . ' ' . $temp_total . ' GB</div>';
|
|
||||||
echo '<div class="col-sm-3 sysinfo_storage_usage_b">' . lang('Systeminfo_Storage_Usage_Used') . ' ' . $temp_used . ' GB (' . $hdd_devices_percent[$x]. ')</div>';
|
|
||||||
echo '<div class="col-sm-2 sysinfo_storage_usage_b">' . lang('Systeminfo_Storage_Usage_Free') . ' ' . $temp_free . ' GB</div>';
|
|
||||||
echo '</div>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#echo '<br>' . $lang['SysInfo_storage_note'];
|
|
||||||
echo ' </div>
|
|
||||||
</div>';
|
|
||||||
|
|
||||||
// Network ----------------------------------------------------------
|
|
||||||
echo '<div class="box box-solid">
|
|
||||||
<div class="box-header">
|
|
||||||
<h3 class="box-title sysinfo_headline"><i class="fas fa-ethernet"></i> ' . lang('Systeminfo_Network') . '</h3>
|
|
||||||
</div>
|
|
||||||
<div class="box-body">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_IP') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_network_b">' . shell_exec("curl https://ifconfig.co") . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_IP_Connection') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['REMOTE_ADDR'] . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_IP_Server') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['SERVER_ADDR'] . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Server_Name') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_network_b">' . $network_NAME . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Connection_Port') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['REMOTE_PORT'] . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Secure_Connection') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_network_b">' . $network_HTTPS . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Server_Version') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['SERVER_SOFTWARE'] . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_gerneral_a">' . lang('Systeminfo_Network_Request_URI') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_gerneral_b">' . $_SERVER['REQUEST_URI'] . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Server_Query') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_network_b">' . $network_QueryString . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_HTTP_Host') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['HTTP_HOST'] . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_HTTP_Referer') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_network_b">' . $network_referer . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_MIME') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['HTTP_ACCEPT'] . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Accept_Language') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['HTTP_ACCEPT_LANGUAGE'] . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Accept_Encoding') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['HTTP_ACCEPT_ENCODING'] . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Request_Method') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['REQUEST_METHOD'] . '</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Request_Time') . '</div>
|
|
||||||
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['REQUEST_TIME'] . '</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>';
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Services ----------------------------------------------------------
|
|
||||||
echo '<div class="box box-solid">
|
|
||||||
<div class="box-header">
|
|
||||||
<h3 class="box-title sysinfo_headline"><i class="fa fa-database"></i> ' . lang('Systeminfo_Services') . '</h3>
|
|
||||||
</div>
|
|
||||||
<div class="box-body">';
|
|
||||||
echo '<div style="height: 300px; overflow: scroll;">';
|
|
||||||
exec('systemctl --type=service --state=running', $running_services);
|
|
||||||
echo '<table class="table table-bordered table-hover table-striped dataTable no-footer" style="margin-bottom: 10px;">';
|
|
||||||
echo '<thead>
|
|
||||||
<tr role="row">
|
|
||||||
<th style="padding: 8px;">' . lang('Systeminfo_Services_Name') . '</th>
|
|
||||||
<th style="padding: 8px;">' . lang('Systeminfo_Services_Description') . '</th>
|
|
||||||
</tr>
|
|
||||||
</thead>';
|
|
||||||
$table_color = 'odd';
|
|
||||||
for ($x = 0; $x < sizeof($running_services); $x++) {
|
|
||||||
if (stristr($running_services[$x], '.service')) {
|
|
||||||
$temp_services_arr = array_values(array_filter(explode(' ', trim($running_services[$x]))));
|
|
||||||
$servives_name = $temp_services_arr[0];
|
|
||||||
unset($temp_services_arr[0], $temp_services_arr[1], $temp_services_arr[2], $temp_services_arr[3]);
|
|
||||||
$servives_description = implode(" ", $temp_services_arr);
|
|
||||||
if ($table_color == 'odd') {$table_color = 'even';} else { $table_color = 'odd';}
|
|
||||||
|
|
||||||
echo '<tr class="' . $table_color . '"><td style="padding: 3px; padding-left: 10px;">' . substr($servives_name, 0, -8) . '</td><td style="padding: 3px; padding-left: 10px;">' . $servives_description . '</td></tr>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
echo '</table>';
|
|
||||||
echo '</div>';
|
|
||||||
echo ' </div>
|
|
||||||
</div>';
|
|
||||||
|
|
||||||
// USB ----------------------------------------------------------
|
|
||||||
echo '<div class="box box-solid">
|
|
||||||
<div class="box-header">
|
|
||||||
<h3 class="box-title sysinfo_headline"><i class="fab fa-usb"></i> ' . lang('Systeminfo_USB_Devices') . '</h3>
|
|
||||||
</div>
|
|
||||||
<div class="box-body">';
|
|
||||||
echo ' <table class="table table-bordered table-hover table-striped dataTable no-footer" style="margin-bottom: 10px;">';
|
|
||||||
|
|
||||||
$table_color = 'odd';
|
|
||||||
sort($usb_devices_mount);
|
|
||||||
for ($x = 0; $x < sizeof($usb_devices_mount); $x++) {
|
|
||||||
$cut_pos = strpos($usb_devices_mount[$x], ':');
|
|
||||||
$usb_bus = substr($usb_devices_mount[$x], 0, $cut_pos);
|
|
||||||
$usb_dev = substr($usb_devices_mount[$x], $cut_pos + 1);
|
|
||||||
|
|
||||||
if ($table_color == 'odd') {$table_color = 'even';} else { $table_color = 'odd';}
|
|
||||||
echo '<tr class="' . $table_color . '"><td style="padding: 3px; padding-left: 10px; width: 150px;"><b>' . str_replace('Device', 'Dev.', $usb_bus) . '</b></td><td style="padding: 3px; padding-left: 10px;">' . $usb_dev . '</td></tr>';
|
|
||||||
}
|
|
||||||
echo ' </table>';
|
|
||||||
echo ' </div>
|
|
||||||
</div>';
|
|
||||||
|
|
||||||
// ----------------------------------------------------------
|
|
||||||
|
|
||||||
echo '<br>';
|
|
||||||
|
|
||||||
?>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<!-- /.content -->
|
<!-- /.content -->
|
||||||
<?php
|
|
||||||
require 'php/templates/footer.php';
|
|
||||||
?>
|
|
||||||
</div>
|
</div>
|
||||||
<!-- /.content-wrapper -->
|
<!-- /.content-wrapper -->
|
||||||
|
|
||||||
|
<?php
|
||||||
|
require 'php/templates/footer.php';
|
||||||
|
?>
|
||||||
|
|
||||||
<!-- ----------------------------------------------------------------------- -->
|
<!-- ----------------------------------------------------------------------- -->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- DataTable initialization -->
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
// show spinning icon
|
function loadTabContent(target) {
|
||||||
showSpinner()
|
const $tab = $(target);
|
||||||
|
const phpFile = $tab.data('php-file');
|
||||||
|
|
||||||
setTimeout(() => {
|
if (phpFile && !$tab.data('loaded')) {
|
||||||
|
showSpinner();
|
||||||
|
$tab.load(phpFile, function () {
|
||||||
|
$tab.data('loaded', true);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$('#networkTable').DataTable({
|
function initializeTabs() {
|
||||||
"searching": true,
|
const key = "activeSysinfoTab";
|
||||||
"order": [[0, "desc"]]
|
let selectedTab = "tabServer"; // fallback default
|
||||||
});
|
|
||||||
|
|
||||||
// hide spinning icon
|
const cached = getCache(key);
|
||||||
hideSpinner()
|
if (!emptyArr.includes(cached)) {
|
||||||
|
selectedTab = cached;
|
||||||
|
}
|
||||||
|
|
||||||
}, 500);
|
// Activate the correct tab
|
||||||
|
const $tabLink = $('.nav-tabs a[id="' + selectedTab + '"]');
|
||||||
|
$tabLink.tab('show');
|
||||||
|
|
||||||
|
// Get the pane's ID from the tab's href attribute
|
||||||
|
const targetSelector = $tabLink.attr("href");
|
||||||
|
loadTabContent(targetSelector);
|
||||||
|
|
||||||
|
// On tab change
|
||||||
|
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
|
||||||
|
const newTabId = $(e.target).attr('id');
|
||||||
|
setCache(key, newTabId);
|
||||||
|
|
||||||
|
const newTarget = $(e.target).attr("href");
|
||||||
|
loadTabContent(newTarget);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
window.onload = function async() {
|
||||||
|
initializeTabs();
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
316
front/systeminfoNetwork.php
Executable file
316
front/systeminfoNetwork.php
Executable file
@@ -0,0 +1,316 @@
|
|||||||
|
<?php
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/server/db.php';
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/language/lang.php';
|
||||||
|
?>
|
||||||
|
|
||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
function getExternalIp() {
|
||||||
|
$ch = curl_init('https://api64.ipify.org?format=json');
|
||||||
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
|
||||||
|
$response = curl_exec($ch);
|
||||||
|
if (curl_errno($ch)) {
|
||||||
|
curl_close($ch);
|
||||||
|
return 'ERROR: ' . curl_error($ch);
|
||||||
|
}
|
||||||
|
curl_close($ch);
|
||||||
|
|
||||||
|
$data = json_decode($response, true);
|
||||||
|
if (isset($data['ip'])) {
|
||||||
|
return htmlspecialchars($data['ip']);
|
||||||
|
}
|
||||||
|
return 'ERROR: Invalid response';
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------
|
||||||
|
// Network
|
||||||
|
// ----------------------------------------------------------
|
||||||
|
|
||||||
|
//Network stats
|
||||||
|
// Server IP
|
||||||
|
|
||||||
|
$externalIp = getExternalIp();
|
||||||
|
|
||||||
|
// Check Server name
|
||||||
|
if (!empty(gethostname())) { $network_NAME = gethostname(); } else { $network_NAME = lang('Systeminfo_Network_Server_Name_String'); }
|
||||||
|
// Check HTTPS
|
||||||
|
if (isset($_SERVER['HTTPS'])) { $network_HTTPS = 'Yes (HTTPS)'; } else { $network_HTTPS = lang('Systeminfo_Network_Secure_Connection_String'); }
|
||||||
|
// Check Query String
|
||||||
|
if (empty($_SERVER['QUERY_STRING'])) { $network_QueryString = lang('Systeminfo_Network_Server_Query_String'); } else { $network_QueryString = $_SERVER['QUERY_STRING']; }
|
||||||
|
// Check HTTP referer
|
||||||
|
if (empty($_SERVER['HTTP_REFERER'])) { $network_referer = lang('Systeminfo_Network_HTTP_Referer_String'); } else { $network_referer = $_SERVER['HTTP_REFERER']; }
|
||||||
|
//Network Hardware stat
|
||||||
|
$network_result = shell_exec("cat /proc/net/dev | tail -n +3 | awk '{print $1}'");
|
||||||
|
$net_interfaces = explode("\n", trim($network_result));
|
||||||
|
$network_result = shell_exec("cat /proc/net/dev | tail -n +3 | awk '{print $2}'");
|
||||||
|
$net_interfaces_rx = explode("\n", trim($network_result));
|
||||||
|
$network_result = shell_exec("cat /proc/net/dev | tail -n +3 | awk '{print $10}'");
|
||||||
|
$net_interfaces_tx = explode("\n", trim($network_result));
|
||||||
|
|
||||||
|
|
||||||
|
// Network Hardware ----------------------------------------------------------
|
||||||
|
echo '<div class="box box-solid">
|
||||||
|
<div class="box-header">
|
||||||
|
<h3 class="box-title sysinfo_headline"><i class="fa fa-sitemap fa-rotate-270"></i> ' . lang('Systeminfo_Network_Hardware') . '</h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">
|
||||||
|
<table id="networkTable" class="table table-bordered table-hover">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>' . lang('Systeminfo_Network_Hardware_Interface_Name') . '</th>
|
||||||
|
<th>' . lang('Systeminfo_Network_Hardware_Interface_Mask') . '</th>
|
||||||
|
<th>' . lang('Systeminfo_Network_Hardware_Interface_RX') . '</th>
|
||||||
|
<th>' . lang('Systeminfo_Network_Hardware_Interface_TX') . '</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>';
|
||||||
|
|
||||||
|
for ($x = 0; $x < sizeof($net_interfaces); $x++) {
|
||||||
|
$interface_name = str_replace(':', '', $net_interfaces[$x]);
|
||||||
|
$interface_ip_temp = exec('ip addr show ' . $interface_name . ' | grep "inet "');
|
||||||
|
$interface_ip_arr = explode(' ', trim($interface_ip_temp));
|
||||||
|
|
||||||
|
if (!isset($interface_ip_arr[1])) {
|
||||||
|
$interface_ip_arr[1] = '--';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($net_interfaces_rx[$x] == 0) {
|
||||||
|
$temp_rx = 0;
|
||||||
|
} else {
|
||||||
|
$temp_rx = number_format(round(($net_interfaces_rx[$x] / 1024 / 1024), 2), 2, ',', '.');
|
||||||
|
}
|
||||||
|
if ($net_interfaces_tx[$x] == 0) {
|
||||||
|
$temp_tx = 0;
|
||||||
|
} else {
|
||||||
|
$temp_tx = number_format(round(($net_interfaces_tx[$x] / 1024 / 1024), 2), 2, ',', '.');
|
||||||
|
}
|
||||||
|
echo '<tr>';
|
||||||
|
echo '<td>' . $interface_name . '</td>';
|
||||||
|
echo '<td>' . $interface_ip_arr[1] . '</td>';
|
||||||
|
echo '<td>' . $temp_rx . ' MB</td>';
|
||||||
|
echo '<td>' . $temp_tx . ' MB</td>';
|
||||||
|
echo '</tr>';
|
||||||
|
}
|
||||||
|
|
||||||
|
echo ' </tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>';
|
||||||
|
|
||||||
|
// Available IPs ----------------------------------------------------------
|
||||||
|
echo '<div class="box box-solid">
|
||||||
|
<div class="box-header">
|
||||||
|
<h3 class="box-title availableips_headline"><i class="fa fa-list"></i> ' . lang('Systeminfo_AvailableIps') . '</h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">
|
||||||
|
<table id="availableIpsTable" class="display table table-bordered table-hover dataTable no-footer" style="width:100%"></table>
|
||||||
|
</div>
|
||||||
|
</div>';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Network ----------------------------------------------------------
|
||||||
|
echo '<div class="box box-solid">
|
||||||
|
<div class="box-header">
|
||||||
|
<h3 class="box-title sysinfo_headline"><i class="fas fa-ethernet"></i> ' . lang('Systeminfo_Network') . '</h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_IP') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_network_b" id="external-ip">' .$externalIp. '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_IP_Connection') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['REMOTE_ADDR'] . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_IP_Server') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['SERVER_ADDR'] . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Server_Name') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_network_b">' . $network_NAME . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Connection_Port') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['REMOTE_PORT'] . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Secure_Connection') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_network_b">' . $network_HTTPS . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Server_Version') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['SERVER_SOFTWARE'] . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_gerneral_a">' . lang('Systeminfo_Network_Request_URI') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_gerneral_b">' . $_SERVER['REQUEST_URI'] . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Server_Query') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_network_b">' . $network_QueryString . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_HTTP_Host') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['HTTP_HOST'] . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_HTTP_Referer') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_network_b">' . $network_referer . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_MIME') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['HTTP_ACCEPT'] . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Accept_Language') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['HTTP_ACCEPT_LANGUAGE'] . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Accept_Encoding') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['HTTP_ACCEPT_ENCODING'] . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Request_Method') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['REQUEST_METHOD'] . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_network_a">' . lang('Systeminfo_Network_Request_Time') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_network_b">' . $_SERVER['REQUEST_TIME'] . '</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>';
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
// --------------------------------------------------------
|
||||||
|
// Available free IPS functionality
|
||||||
|
function inferNetworkRange(usedIps) {
|
||||||
|
if (!usedIps || usedIps.length === 0) return [];
|
||||||
|
|
||||||
|
const subnetMap = {};
|
||||||
|
|
||||||
|
// Group IPs by /24 subnet
|
||||||
|
for (const ip of usedIps) {
|
||||||
|
const parts = ip.split('.');
|
||||||
|
if (parts.length !== 4) continue;
|
||||||
|
const subnet = `${parts[0]}.${parts[1]}.${parts[2]}`;
|
||||||
|
if (!subnetMap[subnet]) subnetMap[subnet] = [];
|
||||||
|
subnetMap[subnet].push(ip);
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = [];
|
||||||
|
|
||||||
|
for (const [subnet, ips] of Object.entries(subnetMap)) {
|
||||||
|
if (ips.length > 5) {
|
||||||
|
for (let i = 2; i < 255; i++) {
|
||||||
|
const ip = `${subnet}.${i}`;
|
||||||
|
result.push({ subnet, ip });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function fetchUsedIps(callback) {
|
||||||
|
$.ajax({
|
||||||
|
url: 'php/server/query_graphql.php',
|
||||||
|
type: 'POST',
|
||||||
|
contentType: 'application/json',
|
||||||
|
data: JSON.stringify({
|
||||||
|
query: `
|
||||||
|
query devices($options: PageQueryOptionsInput) {
|
||||||
|
devices(options: $options) {
|
||||||
|
devices {
|
||||||
|
devLastIP
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
variables: {
|
||||||
|
options: {
|
||||||
|
status: "all_devices"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
success: function(response) {
|
||||||
|
|
||||||
|
console.log(response);
|
||||||
|
|
||||||
|
const usedIps = (response?.devices?.devices || [])
|
||||||
|
.map(d => d.devLastIP)
|
||||||
|
.filter(ip => ip && ip.includes('.'));
|
||||||
|
callback(usedIps);
|
||||||
|
},
|
||||||
|
error: function(err) {
|
||||||
|
console.error("Error fetching IPs:", err);
|
||||||
|
callback([]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderAvailableIpsTable(allIps, usedIps) {
|
||||||
|
const availableIps = allIps.filter(row => !usedIps.includes(row.ip));
|
||||||
|
|
||||||
|
console.log(availableIps);
|
||||||
|
|
||||||
|
$('#availableIpsTable').DataTable({
|
||||||
|
destroy: true,
|
||||||
|
data: availableIps,
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
title: getString("Gen_Subnet"),
|
||||||
|
data: "subnet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: getString("Systeminfo_AvailableIps"),
|
||||||
|
data: "ip",
|
||||||
|
render: function (data, type, row, meta) {
|
||||||
|
return `
|
||||||
|
<span>${data}</span>
|
||||||
|
<button class="copy-btn btn btn-sm btn-info ml-2 alignRight" data-text="${data}" title="${getString("Gen_CopyToClipboard")}" onclick="copyToClipboard(this)">
|
||||||
|
<i class="fa-solid fa-copy"></i>
|
||||||
|
</button>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
pageLength: 10
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// INIT
|
||||||
|
$(document).ready(function() {
|
||||||
|
|
||||||
|
// available IPs
|
||||||
|
fetchUsedIps(usedIps => {
|
||||||
|
const allIps = inferNetworkRange(usedIps);
|
||||||
|
renderAvailableIpsTable(allIps, usedIps);
|
||||||
|
});
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
// Available IPs datatable
|
||||||
|
$('#networkTable').DataTable({
|
||||||
|
searching: true,
|
||||||
|
order: [[0, "desc"]],
|
||||||
|
initComplete: function(settings, json) {
|
||||||
|
hideSpinner(); // Called after the DataTable is fully initialized
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, 200);
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
327
front/systeminfoServer.php
Executable file
327
front/systeminfoServer.php
Executable file
@@ -0,0 +1,327 @@
|
|||||||
|
<?php
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/server/db.php';
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/language/lang.php';
|
||||||
|
?>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// ----------------------------------------------------------
|
||||||
|
// Server
|
||||||
|
// ----------------------------------------------------------
|
||||||
|
|
||||||
|
//General stats
|
||||||
|
// Date & Time
|
||||||
|
$date = new DateTime();
|
||||||
|
$formatted_date = $date->format('l, F j, Y H:i:s'); // Get date
|
||||||
|
$formatted_date2 = $date->format('d/m/Y H:i:s'); // Get date2
|
||||||
|
$formatted_date3 = $date->format('Y/m/d H:i:s'); // Get date3
|
||||||
|
//System stats
|
||||||
|
// OS-Version
|
||||||
|
$os_version = '';
|
||||||
|
// Raspbian
|
||||||
|
if ($os_version == '') {$os_version = exec('cat /etc/os-release | grep PRETTY_NAME');}
|
||||||
|
// Dietpi
|
||||||
|
if ($os_version == '') {$os_version = exec('uname -o');}
|
||||||
|
//$os_version_arr = explode("\n", trim($os_version));
|
||||||
|
$stat['os_version'] = str_replace('"', '', str_replace('PRETTY_NAME=', '', $os_version));
|
||||||
|
$stat['uptime'] = str_replace('up ', '', shell_exec("uptime -p")); // Get system uptime
|
||||||
|
$system_namekernel = shell_exec("uname"); // Get system name kernel
|
||||||
|
$system_namesystem = shell_exec("uname -o"); // Get name system
|
||||||
|
$system_full = shell_exec("uname -a"); // Get system full
|
||||||
|
$system_architecture = shell_exec("uname -m"); // Get system Architecture
|
||||||
|
$load_average = sys_getloadavg(); // Get load average
|
||||||
|
$system_process_count = shell_exec("ps -e --no-headers | wc -l"); // Count processes
|
||||||
|
//Motherboard stats
|
||||||
|
$motherboard_name = shell_exec('cat /sys/class/dmi/id/board_name'); // Get the Motherboard name
|
||||||
|
$motherboard_manufactured = shell_exec('cat /sys/class/dmi/id/board_vendor'); // Get the Motherboard manufactured
|
||||||
|
$motherboard_revision = shell_exec('cat /sys/class/dmi/id/board_version'); // Get the Motherboard revision
|
||||||
|
$motherboard_bios = shell_exec('cat /sys/class/dmi/id/bios_version'); // Get the Motherboard BIOS
|
||||||
|
$motherboard_biosdate = shell_exec('cat /sys/class/dmi/id/bios_date'); // Get the Motherboard BIOS date
|
||||||
|
$motherboard_biosvendor = shell_exec('cat /sys/class/dmi/id/bios_vendor'); // Get the Motherboard BIOS vendor
|
||||||
|
//CPU stats
|
||||||
|
$prevVal = shell_exec("cat /proc/cpuinfo | grep processor");
|
||||||
|
$prevArr = explode("\n", trim($prevVal));
|
||||||
|
$stat['cpu'] = sizeof($prevArr);
|
||||||
|
$cpu_result = shell_exec("cat /proc/cpuinfo | grep Model");
|
||||||
|
$stat['cpu_model'] = strstr($cpu_result, "\n", true);
|
||||||
|
$stat['cpu_model'] = str_replace(":", "", trim(str_replace("Model", "", $stat['cpu_model'])));
|
||||||
|
if ($stat['cpu_model'] == '') {
|
||||||
|
$cpu_result = shell_exec("cat /proc/cpuinfo | grep model\ name");
|
||||||
|
$stat['cpu_model'] = strstr($cpu_result, "\n", true);
|
||||||
|
$stat['cpu_model'] = str_replace(":", "", trim(str_replace("model name", "", $stat['cpu_model'])));
|
||||||
|
}
|
||||||
|
if (file_exists('/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq')) {
|
||||||
|
// RaspbianOS
|
||||||
|
$stat['cpu_frequ'] = exec('cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq') / 1000;
|
||||||
|
} elseif (is_numeric(str_replace(',', '.', exec('lscpu | grep "MHz" | awk \'{print $3}\'')))) {
|
||||||
|
// Ubuntu Server, DietPi event. others
|
||||||
|
$stat['cpu_frequ'] = round(exec('lscpu | grep "MHz" | awk \'{print $3}\''), 0);
|
||||||
|
} elseif (is_numeric(str_replace(',', '.', exec('lscpu | grep "max MHz" | awk \'{print $4}\'')))) {
|
||||||
|
// RaspbianOS and event. others
|
||||||
|
$stat['cpu_frequ'] = round(str_replace(',', '.', exec('lscpu | grep "max MHz" | awk \'{print $4}\'')), 0);
|
||||||
|
} else {
|
||||||
|
// Fallback
|
||||||
|
$stat['cpu_frequ'] = "unknown";
|
||||||
|
}
|
||||||
|
$cpu_temp = shell_exec('cat /sys/class/hwmon/hwmon0/temp1_input'); // Get the CPU temperature
|
||||||
|
$cpu_temp = floatval($cpu_temp) / 1000; // Convert the temperature to degrees Celsius
|
||||||
|
$cpu_vendor = exec('cat /proc/cpuinfo | grep "vendor_id" | cut -d ":" -f 2' ); // Get the CPU vendor
|
||||||
|
//Memory stats
|
||||||
|
$total_memorykb = shell_exec("cat /proc/meminfo | grep MemTotal | awk '{print $2}'");
|
||||||
|
$total_memorykb = trim($total_memorykb);
|
||||||
|
$total_memorykb = number_format($total_memorykb, 0, '.', '.');
|
||||||
|
$total_memorymb = shell_exec("cat /proc/meminfo | grep MemTotal | awk '{print $2/1024}'");
|
||||||
|
$total_memorymb = trim($total_memorymb);
|
||||||
|
$total_memorymb = number_format($total_memorymb, 0, '.', '.');
|
||||||
|
$mem_used = round(memory_get_usage() / 1048576 * 100, 2);
|
||||||
|
$memory_usage_percent = round(($mem_used / $total_memorymb), 2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// General ----------------------------------------------------------
|
||||||
|
echo '<div class="box box-solid">
|
||||||
|
<div class="box-header">
|
||||||
|
<h3 class="box-title sysinfo_headline"><i class="fa fa-info-circle"></i> ' . lang('Systeminfo_General') . '</h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_general_a">' . lang('Systeminfo_General_Full_Date') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_general_b">' . $formatted_date . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_general_a">' . lang('Systeminfo_General_Date') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_general_b">' . $formatted_date2 . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_general_a">' . lang('Systeminfo_General_Date2') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_general_b">' . $formatted_date3 . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_general_a">' . lang('Systeminfo_General_TimeZone') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_general_b">' . $timeZone . '</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>';
|
||||||
|
|
||||||
|
|
||||||
|
// Client ----------------------------------------------------------
|
||||||
|
echo '<div class="box box-solid">
|
||||||
|
<div class="box-header">
|
||||||
|
<h3 class="box-title sysinfo_headline"><i class="fa fa-globe"></i> ' . lang('Systeminfo_This_Client') . '</h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_client_a">' . lang('Systeminfo_Client_User_Agent') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_client_b">' . $_SERVER['HTTP_USER_AGENT'] . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_client_a">' . lang('Systeminfo_Client_Resolution') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_client_b" id="resolution"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>';
|
||||||
|
|
||||||
|
echo '<script>
|
||||||
|
var ratio = window.devicePixelRatio || 1;
|
||||||
|
var w = window.innerWidth;
|
||||||
|
var h = window.innerHeight;
|
||||||
|
var rw = window.innerWidth * ratio;
|
||||||
|
var rh = window.innerHeight * ratio;
|
||||||
|
|
||||||
|
var resolutionDiv = document.getElementById("resolution");
|
||||||
|
resolutionDiv.innerHTML = "Width: " + w + "px / Height: " + h + "px<br> " + "Width: " + rw + "px / Height: " + rh + "px (native)";
|
||||||
|
</script>';
|
||||||
|
|
||||||
|
// System ----------------------------------------------------------
|
||||||
|
echo '<div class="box box-solid">
|
||||||
|
<div class="box-header">
|
||||||
|
<h3 class="box-title sysinfo_headline"><i class="fa fa-computer"></i> ' . lang('Systeminfo_System') . '</h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_system_a">' . lang('Systeminfo_System_Uptime') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_system_b">' . $stat['uptime'] . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_system_a">' . lang('Systeminfo_System_Kernel') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_system_b">' . $system_namekernel . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_system_a">' . lang('Systeminfo_System_System') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_system_b">' . $system_namesystem . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_system_a">' . lang('Systeminfo_System_OSVersion') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_system_b">' . $stat['os_version'] . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_system_a">' . lang('Systeminfo_System_Uname') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_system_b">' . $system_full . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_system_a">' . lang('Systeminfo_System_Architecture') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_system_b">' . $system_architecture . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_system_a">' . lang('Systeminfo_System_AVG') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_system_b">'. $load_average[0] .' '. $load_average[1] .' '. $load_average[2] .'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_system_a">' . lang('Systeminfo_System_Running_Processes') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_system_b">' . $system_process_count . '</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>';
|
||||||
|
|
||||||
|
// Motherboard ----------------------------------------------------------
|
||||||
|
echo '<div class="box box-solid">
|
||||||
|
<div class="box-header">
|
||||||
|
<h3 class="box-title sysinfo_headline"><i class="fa fa-laptop-code"></i> ' . lang('Systeminfo_Motherboard') . '</h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_motherboard_a">' . lang('Systeminfo_Motherboard_Name') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_motherboard_b">' . $motherboard_name . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_motherboard_a">' . lang('Systeminfo_Motherboard_Manufactured') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_motherboard_b">' . $motherboard_manufactured . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_motherboard_a">' . lang('Systeminfo_Motherboard_Revision') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_motherboard_b">' . $motherboard_revision. '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_motherboard_a">' . lang('Systeminfo_Motherboard_BIOS') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_motherboard_b">' . $motherboard_bios . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_motherboard_a">' . lang('Systeminfo_Motherboard_BIOS_Date') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_motherboard_b">' . $motherboard_biosdate . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_motherboard_a">' . lang('Systeminfo_Motherboard_BIOS_Vendor') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_motherboard_b">' . $motherboard_biosvendor . '</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>';
|
||||||
|
|
||||||
|
// CPU ----------------------------------------------------------
|
||||||
|
echo '<div class="box box-solid">
|
||||||
|
<div class="box-header">
|
||||||
|
<h3 class="box-title sysinfo_headline"><i class="fa fa-microchip"></i> ' . lang('Systeminfo_CPU') . '</h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_cpu_a">' . lang('Systeminfo_CPU_Vendor') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_cpu_b">' . $cpu_vendor . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_cpu_a">' . lang('Systeminfo_CPU_Name') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_cpu_b">' . $stat['cpu_model'] . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_cpu_a">' . lang('Systeminfo_CPU_Cores') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_cpu_b">' . $stat['cpu'] . '</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_cpu_a">' . lang('Systeminfo_CPU_Speed') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_cpu_b">' . $stat['cpu_frequ'] . ' MHz</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_cpu_a">' . lang('Systeminfo_CPU_Temp') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_cpu_b">'. $cpu_temp .' °C</div>
|
||||||
|
</div>';
|
||||||
|
// Get the number of CPU cores
|
||||||
|
$num_cpus = $stat['cpu'];
|
||||||
|
$num_cpus = $num_cpus +2;
|
||||||
|
|
||||||
|
// Iterate over the CPU cores
|
||||||
|
for ($i = 2,$a = 0; $i < $num_cpus; $i++,$a++) {
|
||||||
|
|
||||||
|
// Get the CPU temperature
|
||||||
|
$cpu_tempxx = shell_exec('cat /sys/class/hwmon/hwmon0/temp' . $i . '_input');
|
||||||
|
|
||||||
|
// Convert the temperature to degrees Celsius
|
||||||
|
$cpu_tempxx = floatval($cpu_tempxx) / 1000;
|
||||||
|
|
||||||
|
// Print the CPU temperature
|
||||||
|
echo '<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_cpu_a">CPU Temp ' . $a . ':</div>
|
||||||
|
<div class="col-sm-9 sysinfo_cpu_b">' . $cpu_tempxx . ' °C</div>
|
||||||
|
</div>';
|
||||||
|
}
|
||||||
|
echo '
|
||||||
|
</div>
|
||||||
|
</div>';
|
||||||
|
|
||||||
|
// Memory ----------------------------------------------------------
|
||||||
|
echo '<div class="box box-solid">
|
||||||
|
<div class="box-header">
|
||||||
|
<h3 class="box-title sysinfo_headline"><i class="fa fa-memory"></i> ' . lang('Systeminfo_Memory') . '</h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_memory_a">' . lang('Systeminfo_Memory_Usage_Percent') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_memory_b">' . $memory_usage_percent . ' %</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_memory_a">' . lang('Systeminfo_Memory_Usage') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_memory_b">' . $mem_used . ' MB / ' . $total_memorymb . ' MB</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-3 sysinfo_memory_a">' . lang('Systeminfo_Memory_Total_Memory') . '</div>
|
||||||
|
<div class="col-sm-9 sysinfo_memory_b">' . $total_memorymb . ' MB (' . $total_memorykb . ' KB)</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Services ----------------------------------------------------------
|
||||||
|
echo '<div class="box box-solid">
|
||||||
|
<div class="box-header">
|
||||||
|
<h3 class="box-title sysinfo_headline"><i class="fa fa-database"></i> ' . lang('Systeminfo_Services') . '</h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">';
|
||||||
|
echo '<div style="height: 300px; overflow: scroll;">';
|
||||||
|
exec('systemctl --type=service --state=running', $running_services);
|
||||||
|
echo '<table class="table table-bordered table-hover table-striped dataTable no-footer" style="margin-bottom: 10px;">';
|
||||||
|
echo '<thead>
|
||||||
|
<tr role="row">
|
||||||
|
<th style="padding: 8px;">' . lang('Systeminfo_Services_Name') . '</th>
|
||||||
|
<th style="padding: 8px;">' . lang('Systeminfo_Services_Description') . '</th>
|
||||||
|
</tr>
|
||||||
|
</thead>';
|
||||||
|
$table_color = 'odd';
|
||||||
|
for ($x = 0; $x < sizeof($running_services); $x++) {
|
||||||
|
if (stristr($running_services[$x], '.service')) {
|
||||||
|
$temp_services_arr = array_values(array_filter(explode(' ', trim($running_services[$x]))));
|
||||||
|
$servives_name = $temp_services_arr[0];
|
||||||
|
unset($temp_services_arr[0], $temp_services_arr[1], $temp_services_arr[2], $temp_services_arr[3]);
|
||||||
|
$servives_description = implode(" ", $temp_services_arr);
|
||||||
|
|
||||||
|
if ($table_color == 'odd')
|
||||||
|
{
|
||||||
|
$table_color = 'even';
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$table_color = 'odd';
|
||||||
|
}
|
||||||
|
echo '<tr class="' . $table_color . '"><td style="padding: 3px; padding-left: 10px;">' . substr($servives_name, 0, -8) . '</td><td style="padding: 3px; padding-left: 10px;">' . $servives_description . '</td></tr>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
echo '</table>';
|
||||||
|
echo '</div>';
|
||||||
|
echo ' </div>
|
||||||
|
</div>';
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
hideSpinner();
|
||||||
|
</script>
|
||||||
124
front/systeminfoStorage.php
Executable file
124
front/systeminfoStorage.php
Executable file
@@ -0,0 +1,124 @@
|
|||||||
|
<?php
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// check if authenticated
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/server/db.php';
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/language/lang.php';
|
||||||
|
?>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// ----------------------------------------------------------
|
||||||
|
// Storage
|
||||||
|
// ----------------------------------------------------------
|
||||||
|
|
||||||
|
//HDD stats
|
||||||
|
$hdd_result = shell_exec(" df -P | awk '{print $1}'");
|
||||||
|
$hdd_devices = explode("\n", trim($hdd_result));
|
||||||
|
$hdd_result = shell_exec(" df -P | awk '{print $2}'");
|
||||||
|
$hdd_devices_total = explode("\n", trim($hdd_result));
|
||||||
|
$hdd_result = shell_exec(" df -P | awk '{print $3}'");
|
||||||
|
$hdd_devices_used = explode("\n", trim($hdd_result));
|
||||||
|
$hdd_result = shell_exec(" df -P | awk '{print $4}'");
|
||||||
|
$hdd_devices_free = explode("\n", trim($hdd_result));
|
||||||
|
$hdd_result = shell_exec(" df -P | awk '{print $5}'");
|
||||||
|
$hdd_devices_percent = explode("\n", trim($hdd_result));
|
||||||
|
$hdd_result = shell_exec(" df -P | awk '{print $6}'");
|
||||||
|
$hdd_devices_mount = explode("\n", trim($hdd_result));
|
||||||
|
|
||||||
|
// Storage ----------------------------------------------------------
|
||||||
|
echo '<div class="box box-solid">
|
||||||
|
<div class="box-header">
|
||||||
|
<h3 class="box-title sysinfo_headline"><i class="fa fa-hdd"></i> ' . lang('Systeminfo_Storage') . '</h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">';
|
||||||
|
|
||||||
|
$storage_lsblk = shell_exec("lsblk -io NAME,SIZE,TYPE,MOUNTPOINT,MODEL --list | tail -n +2 | awk '{print $1\"#\"$2\"#\"$3\"#\"$4\"#\"$5}'");
|
||||||
|
$storage_lsblk_line = explode("\n", $storage_lsblk);
|
||||||
|
$storage_lsblk_line = array_filter($storage_lsblk_line);
|
||||||
|
|
||||||
|
for ($x = 0; $x < sizeof($storage_lsblk_line); $x++) {
|
||||||
|
$temp = array();
|
||||||
|
$temp = explode("#", $storage_lsblk_line[$x]);
|
||||||
|
$storage_lsblk_line[$x] = $temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ($x = 0; $x < sizeof($storage_lsblk_line); $x++) {
|
||||||
|
echo '<div class="row">';
|
||||||
|
if (preg_match('~[0-9]+~', $storage_lsblk_line[$x][0])) {
|
||||||
|
echo '<div class="col-sm-4 sysinfo_storage_a">"' . lang('Systeminfo_Storage_Mount') . ' ' . $storage_lsblk_line[$x][3] . '"</div>';
|
||||||
|
} else {
|
||||||
|
echo '<div class="col-sm-4 sysinfo_storage_a">"' . str_replace('_', ' ', $storage_lsblk_line[$x][3]) . '"</div>';
|
||||||
|
}
|
||||||
|
echo '<div class="col-sm-3 sysinfo_storage_b">' . lang('Systeminfo_Storage_Device') . ' /dev/' . $storage_lsblk_line[$x][0] . '</div>';
|
||||||
|
echo '<div class="col-sm-2 sysinfo_storage_b">' . lang('Systeminfo_Storage_Size') . ' ' . $storage_lsblk_line[$x][1] . '</div>';
|
||||||
|
echo '<div class="col-sm-2 sysinfo_storage_b">' . lang('Systeminfo_Storage_Type') . ' ' . $storage_lsblk_line[$x][2] . '</div>';
|
||||||
|
echo '</div>';
|
||||||
|
}
|
||||||
|
echo ' </div>
|
||||||
|
</div>';
|
||||||
|
|
||||||
|
// Storage usage ----------------------------------------------------------
|
||||||
|
echo '<div class="box box-solid">
|
||||||
|
<div class="box-header">
|
||||||
|
<h3 class="box-title sysinfo_headline"><i class="fa fa-hdd"></i> ' . lang('Systeminfo_Storage_Usage') . '</h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">';
|
||||||
|
for ($x = 0; $x < sizeof($hdd_devices); $x++) {
|
||||||
|
if (stristr($hdd_devices[$x], '/dev/')) {
|
||||||
|
if (!stristr($hdd_devices[$x], '/loop')) {
|
||||||
|
if ($hdd_devices_total[$x] == 0 || $hdd_devices_total[$x] == '') {$temp_total = 0;} else { $temp_total = number_format(round(($hdd_devices_total[$x] / 1024 / 1024), 2), 2, ',', '.'); $temp_total = trim($temp_total);}
|
||||||
|
if ($hdd_devices_used[$x] == 0 || $hdd_devices_used[$x] == '') {$temp_used = 0;} else { $temp_used = number_format(round(($hdd_devices_used[$x] / 1024 / 1024), 2), 2, ',', '.'); $temp_used = trim($temp_total);}
|
||||||
|
if ($hdd_devices_free[$x] == 0 || $hdd_devices_free[$x] == '') {$temp_free = 0;} else { $temp_free = number_format(round(($hdd_devices_free[$x] / 1024 / 1024), 2), 2, ',', '.'); $temp_free = trim($temp_total);}
|
||||||
|
echo '<div class="row">';
|
||||||
|
echo '<div class="col-sm-4 sysinfo_storage_usage_a">"' . lang('Systeminfo_Storage_Usage_Mount') . ' ' . $hdd_devices_mount[$x] . '"</div>';
|
||||||
|
echo '<div class="col-sm-2 sysinfo_storage_usage_b">' . lang('Systeminfo_Storage_Usage_Total') . ' ' . $temp_total . ' GB</div>';
|
||||||
|
echo '<div class="col-sm-3 sysinfo_storage_usage_b">' . lang('Systeminfo_Storage_Usage_Used') . ' ' . $temp_used . ' GB (' . $hdd_devices_percent[$x]. ')</div>';
|
||||||
|
echo '<div class="col-sm-2 sysinfo_storage_usage_b">' . lang('Systeminfo_Storage_Usage_Free') . ' ' . $temp_free . ' GB</div>';
|
||||||
|
echo '</div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#echo '<br>' . $lang['SysInfo_storage_note'];
|
||||||
|
echo ' </div>
|
||||||
|
</div>';
|
||||||
|
|
||||||
|
// ----------------------------------------------------------
|
||||||
|
// USB devices
|
||||||
|
// ----------------------------------------------------------
|
||||||
|
|
||||||
|
$usb_result = shell_exec("lsusb");
|
||||||
|
$usb_devices_mount = explode("\n", trim($usb_result));
|
||||||
|
|
||||||
|
echo '<div class="box box-solid">
|
||||||
|
<div class="box-header">
|
||||||
|
<h3 class="box-title sysinfo_headline"><i class="fab fa-usb"></i> ' . lang('Systeminfo_USB_Devices') . '</h3>
|
||||||
|
</div>
|
||||||
|
<div class="box-body">';
|
||||||
|
echo ' <table class="table table-bordered table-hover table-striped dataTable no-footer" style="margin-bottom: 10px;">';
|
||||||
|
|
||||||
|
$table_color = 'odd';
|
||||||
|
sort($usb_devices_mount);
|
||||||
|
for ($x = 0; $x < sizeof($usb_devices_mount); $x++) {
|
||||||
|
$cut_pos = strpos($usb_devices_mount[$x], ':');
|
||||||
|
$usb_bus = substr($usb_devices_mount[$x], 0, $cut_pos);
|
||||||
|
$usb_dev = substr($usb_devices_mount[$x], $cut_pos + 1);
|
||||||
|
|
||||||
|
if ($table_color == 'odd') {$table_color = 'even';} else { $table_color = 'odd';}
|
||||||
|
echo '<tr class="' . $table_color . '"><td style="padding: 3px; padding-left: 10px; width: 150px;"><b>' . str_replace('Device', 'Dev.', $usb_bus) . '</b></td><td style="padding: 3px; padding-left: 10px;">' . $usb_dev . '</td></tr>';
|
||||||
|
}
|
||||||
|
echo ' </table>';
|
||||||
|
echo ' </div>
|
||||||
|
</div>';
|
||||||
|
|
||||||
|
// ----------------------------------------------------------
|
||||||
|
|
||||||
|
echo '<br>';
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
hideSpinner();
|
||||||
|
</script>
|
||||||
@@ -9,6 +9,9 @@ require 'php/templates/header.php';
|
|||||||
|
|
||||||
<!-- ----------------------------------------------------------------------- -->
|
<!-- ----------------------------------------------------------------------- -->
|
||||||
|
|
||||||
|
<script>
|
||||||
|
showSpinner();
|
||||||
|
</script>
|
||||||
|
|
||||||
<div id="notifications" class="content-wrapper">
|
<div id="notifications" class="content-wrapper">
|
||||||
<section class="content">
|
<section class="content">
|
||||||
@@ -160,7 +163,10 @@ require 'php/templates/header.php';
|
|||||||
|
|
||||||
],
|
],
|
||||||
"order": [[0, "desc"]]
|
"order": [[0, "desc"]]
|
||||||
});
|
,
|
||||||
|
initComplete: function(settings, json) {
|
||||||
|
hideSpinner(); // Called after the DataTable is fully initialized
|
||||||
|
}});
|
||||||
|
|
||||||
fetchData(function(data) {
|
fetchData(function(data) {
|
||||||
table.clear().rows.add(data).draw();
|
table.clear().rows.add(data).draw();
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
require 'php/templates/header.php';
|
require 'php/templates/header.php';
|
||||||
require 'php/templates/notification.php';
|
require 'php/templates/modals.php';
|
||||||
?>
|
?>
|
||||||
<!-- ----------------------------------------------------------------------- -->
|
<!-- ----------------------------------------------------------------------- -->
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,10 @@
|
|||||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/security.php';
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
showSpinner();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
<section class="content workflows col-sm-12 col-xs-12">
|
<section class="content workflows col-sm-12 col-xs-12">
|
||||||
<div id="workflowContainerWrap" class="bg-grey-dark color-palette col-sm-12 col-xs-12 box-default box-info ">
|
<div id="workflowContainerWrap" class="bg-grey-dark color-palette col-sm-12 col-xs-12 box-default box-info ">
|
||||||
@@ -83,8 +87,6 @@ let emptyWorkflow = {
|
|||||||
// Retrieve and process the data
|
// Retrieve and process the data
|
||||||
function getData() {
|
function getData() {
|
||||||
|
|
||||||
showSpinner();
|
|
||||||
|
|
||||||
getSetting()
|
getSetting()
|
||||||
|
|
||||||
$.get('php/server/query_json.php?file=workflows.json')
|
$.get('php/server/query_json.php?file=workflows.json')
|
||||||
|
|||||||
@@ -30,5 +30,5 @@ source myenv/bin/activate
|
|||||||
update-alternatives --install /usr/bin/python python /usr/bin/python3 10
|
update-alternatives --install /usr/bin/python python /usr/bin/python3 10
|
||||||
|
|
||||||
# install packages thru pip3
|
# install packages thru pip3
|
||||||
pip3 install openwrt-luci-rpc asusrouter asyncio aiohttp graphene flask tplink-omada-client wakeonlan pycryptodome requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython librouteros yattag git+https://github.com/foreign-sub/aiofreepybox.git
|
pip3 install openwrt-luci-rpc asusrouter asyncio aiohttp graphene flask flask-cors unifi-sm-api tplink-omada-client wakeonlan pycryptodome requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli chardet python-nmap dnspython librouteros yattag git+https://github.com/foreign-sub/aiofreepybox.git
|
||||||
|
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ nav:
|
|||||||
- Debugging Tips: DEBUG_TIPS.md
|
- Debugging Tips: DEBUG_TIPS.md
|
||||||
- Debugging GraphQL: DEBUG_GRAPHQL.md
|
- Debugging GraphQL: DEBUG_GRAPHQL.md
|
||||||
- Debugging Invalid JSON: DEBUG_INVALID_JSON.md
|
- Debugging Invalid JSON: DEBUG_INVALID_JSON.md
|
||||||
|
- Debugging PHP: DEBUG_PHP.md
|
||||||
- Debugging Plugins: DEBUG_PLUGINS.md
|
- Debugging Plugins: DEBUG_PLUGINS.md
|
||||||
- Debugging Web UI Port: WEB_UI_PORT_DEBUG.md
|
- Debugging Web UI Port: WEB_UI_PORT_DEBUG.md
|
||||||
- Debugging Workflows: WORKFLOWS_DEBUGGING.md
|
- Debugging Workflows: WORKFLOWS_DEBUGGING.md
|
||||||
@@ -75,6 +76,7 @@ nav:
|
|||||||
- Database: DATABASE.md
|
- Database: DATABASE.md
|
||||||
- Settings: SETTINGS_SYSTEM.md
|
- Settings: SETTINGS_SYSTEM.md
|
||||||
- Versions: VERSIONS.md
|
- Versions: VERSIONS.md
|
||||||
|
- Icon and Type guessing: DEVICE_HEURISTICS.md
|
||||||
- Integrations:
|
- Integrations:
|
||||||
- Webhook Secret: WEBHOOK_SECRET.md
|
- Webhook Secret: WEBHOOK_SECRET.md
|
||||||
- API: API.md
|
- API: API.md
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ from models.user_events_queue_instance import UserEventsQueueInstance
|
|||||||
from messaging.in_app import write_notification
|
from messaging.in_app import write_notification
|
||||||
|
|
||||||
# Import the start_server function
|
# Import the start_server function
|
||||||
from graphql_server.graphql_server_start import start_server
|
from api_server.api_server_start import start_server
|
||||||
|
|
||||||
apiEndpoints = []
|
apiEndpoints = []
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import threading
|
import threading
|
||||||
from flask import Flask, request, jsonify
|
from flask import Flask, request, jsonify, Response
|
||||||
|
from flask_cors import CORS
|
||||||
from .graphql_schema import devicesSchema
|
from .graphql_schema import devicesSchema
|
||||||
|
from .prometheus_metrics import getMetricStats
|
||||||
from graphene import Schema
|
from graphene import Schema
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
@@ -15,9 +17,11 @@ from messaging.in_app import write_notification
|
|||||||
|
|
||||||
# Flask application
|
# Flask application
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
CORS(app, resources={r"/metrics": {"origins": "*"}}, supports_credentials=True, allow_headers=["Authorization"])
|
||||||
|
|
||||||
# Retrieve API token and port
|
# --------------------------
|
||||||
graphql_port_value = get_setting_value("GRAPHQL_PORT")
|
# GraphQL Endpoints
|
||||||
|
# --------------------------
|
||||||
|
|
||||||
# Endpoint used when accessed via browser
|
# Endpoint used when accessed via browser
|
||||||
@app.route("/graphql", methods=["GET"])
|
@app.route("/graphql", methods=["GET"])
|
||||||
@@ -29,10 +33,7 @@ def graphql_debug():
|
|||||||
@app.route("/graphql", methods=["POST"])
|
@app.route("/graphql", methods=["POST"])
|
||||||
def graphql_endpoint():
|
def graphql_endpoint():
|
||||||
# Check for API token in headers
|
# Check for API token in headers
|
||||||
incoming_header_token = request.headers.get("Authorization")
|
if not is_authorized():
|
||||||
api_token_value = get_setting_value("API_TOKEN")
|
|
||||||
|
|
||||||
if incoming_header_token != f"Bearer {api_token_value}":
|
|
||||||
msg = '[graphql_server] Unauthorized access attempt - make sure your GRAPHQL_PORT and API_TOKEN settings are correct.'
|
msg = '[graphql_server] Unauthorized access attempt - make sure your GRAPHQL_PORT and API_TOKEN settings are correct.'
|
||||||
mylog('verbose', [msg])
|
mylog('verbose', [msg])
|
||||||
return jsonify({"error": msg}), 401
|
return jsonify({"error": msg}), 401
|
||||||
@@ -47,6 +48,32 @@ def graphql_endpoint():
|
|||||||
# Return the result as JSON
|
# Return the result as JSON
|
||||||
return jsonify(result.data)
|
return jsonify(result.data)
|
||||||
|
|
||||||
|
# --------------------------
|
||||||
|
# Prometheus /metrics Endpoint
|
||||||
|
# --------------------------
|
||||||
|
|
||||||
|
@app.route("/metrics")
|
||||||
|
def metrics():
|
||||||
|
|
||||||
|
# Check for API token in headers
|
||||||
|
if not is_authorized():
|
||||||
|
msg = '[metrics] Unauthorized access attempt - make sure your GRAPHQL_PORT and API_TOKEN settings are correct.'
|
||||||
|
mylog('verbose', [msg])
|
||||||
|
return jsonify({"error": msg}), 401
|
||||||
|
|
||||||
|
|
||||||
|
# Return Prometheus metrics as plain text
|
||||||
|
return Response(getMetricStats(), mimetype="text/plain")
|
||||||
|
|
||||||
|
|
||||||
|
# --------------------------
|
||||||
|
# Background Server Start
|
||||||
|
# --------------------------
|
||||||
|
def is_authorized():
|
||||||
|
token = request.headers.get("Authorization")
|
||||||
|
return token == f"Bearer {get_setting_value('API_TOKEN')}"
|
||||||
|
|
||||||
|
|
||||||
def start_server(graphql_port, app_state):
|
def start_server(graphql_port, app_state):
|
||||||
"""Start the GraphQL server in a background thread."""
|
"""Start the GraphQL server in a background thread."""
|
||||||
|
|
||||||
@@ -135,14 +135,17 @@ class Query(ObjectType):
|
|||||||
status = options.status
|
status = options.status
|
||||||
mylog('verbose', f'[graphql_schema] Applying status filter: {status}')
|
mylog('verbose', f'[graphql_schema] Applying status filter: {status}')
|
||||||
|
|
||||||
|
# Include devices matching criteria in UI_MY_DEVICES
|
||||||
|
allowed_statuses = get_setting_value("UI_MY_DEVICES")
|
||||||
|
hidden_relationships = get_setting_value("UI_hide_rel_types")
|
||||||
|
network_dev_types = get_setting_value("NETWORK_DEVICE_TYPES")
|
||||||
|
|
||||||
|
mylog('verbose', f'[graphql_schema] allowed_statuses: {allowed_statuses}')
|
||||||
|
mylog('verbose', f'[graphql_schema] hidden_relationships: {hidden_relationships}')
|
||||||
|
mylog('verbose', f'[graphql_schema] network_dev_types: {network_dev_types}')
|
||||||
|
|
||||||
# Filtering based on the "status"
|
# Filtering based on the "status"
|
||||||
if status == "my_devices":
|
if status == "my_devices":
|
||||||
# Include devices matching criteria in UI_MY_DEVICES
|
|
||||||
allowed_statuses = get_setting_value("UI_MY_DEVICES")
|
|
||||||
hidden_relationships = get_setting_value("UI_hide_rel_types") # 🆕
|
|
||||||
|
|
||||||
mylog('verbose', f'[graphql_schema] allowed_statuses: {allowed_statuses}')
|
|
||||||
mylog('verbose', f'[graphql_schema] hidden_relationships: {hidden_relationships}')
|
|
||||||
|
|
||||||
devices_data = [
|
devices_data = [
|
||||||
device for device in devices_data
|
device for device in devices_data
|
||||||
@@ -174,7 +177,9 @@ class Query(ObjectType):
|
|||||||
devices_data = [device for device in devices_data if device["devIsArchived"] == 1]
|
devices_data = [device for device in devices_data if device["devIsArchived"] == 1]
|
||||||
elif status == "offline":
|
elif status == "offline":
|
||||||
devices_data = [device for device in devices_data if device["devPresentLastScan"] == 0]
|
devices_data = [device for device in devices_data if device["devPresentLastScan"] == 0]
|
||||||
elif status == "all_nodes":
|
elif status == "network_devices":
|
||||||
|
devices_data = [device for device in devices_data if device["devType"] in network_dev_types]
|
||||||
|
elif status == "all_devices":
|
||||||
devices_data = devices_data # keep all
|
devices_data = devices_data # keep all
|
||||||
|
|
||||||
# additional filters
|
# additional filters
|
||||||
@@ -192,7 +197,7 @@ class Query(ObjectType):
|
|||||||
searchable_fields = [
|
searchable_fields = [
|
||||||
"devName", "devMac", "devOwner", "devType", "devVendor", "devLastIP",
|
"devName", "devMac", "devOwner", "devType", "devVendor", "devLastIP",
|
||||||
"devGroup", "devComments", "devLocation", "devStatus", "devSSID",
|
"devGroup", "devComments", "devLocation", "devStatus", "devSSID",
|
||||||
"devSite", "devSourcePlugin", "devSyncHubNode", "devFQDN", "devParentRelType"
|
"devSite", "devSourcePlugin", "devSyncHubNode", "devFQDN", "devParentRelType", "devParentMAC"
|
||||||
]
|
]
|
||||||
|
|
||||||
search_term = options.search.lower()
|
search_term = options.search.lower()
|
||||||
76
server/api_server/prometheus_metrics.py
Executable file
76
server/api_server/prometheus_metrics.py
Executable file
@@ -0,0 +1,76 @@
|
|||||||
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Register NetAlertX directories
|
||||||
|
INSTALL_PATH = "/app"
|
||||||
|
sys.path.extend([f"{INSTALL_PATH}/server"])
|
||||||
|
|
||||||
|
from logger import mylog
|
||||||
|
from const import apiPath
|
||||||
|
from helper import is_random_mac, get_number_of_children, format_ip_long, get_setting_value
|
||||||
|
|
||||||
|
def escape_label_value(val):
|
||||||
|
"""
|
||||||
|
Escape special characters for Prometheus labels.
|
||||||
|
"""
|
||||||
|
return str(val).replace('\\', '\\\\').replace('\n', '\\n').replace('"', '\\"')
|
||||||
|
|
||||||
|
# Define a base URL with the user's home directory
|
||||||
|
folder = apiPath
|
||||||
|
|
||||||
|
def getMetricStats():
|
||||||
|
output = []
|
||||||
|
|
||||||
|
# 1. Dashboard totals
|
||||||
|
try:
|
||||||
|
with open(folder + 'table_devices_tiles.json', 'r') as f:
|
||||||
|
tiles_data = json.load(f)["data"]
|
||||||
|
|
||||||
|
if isinstance(tiles_data, list) and tiles_data:
|
||||||
|
totals = tiles_data[0]
|
||||||
|
output.append(f'netalertx_connected_devices {totals.get("connected", 0)}')
|
||||||
|
output.append(f'netalertx_offline_devices {totals.get("offline", 0)}')
|
||||||
|
output.append(f'netalertx_down_devices {totals.get("down", 0)}')
|
||||||
|
output.append(f'netalertx_new_devices {totals.get("new", 0)}')
|
||||||
|
output.append(f'netalertx_archived_devices {totals.get("archived", 0)}')
|
||||||
|
output.append(f'netalertx_favorite_devices {totals.get("favorites", 0)}')
|
||||||
|
output.append(f'netalertx_my_devices {totals.get("my_devices", 0)}')
|
||||||
|
else:
|
||||||
|
output.append("# Unexpected format in table_devices_tiles.json")
|
||||||
|
except (FileNotFoundError, json.JSONDecodeError) as e:
|
||||||
|
mylog('none', f'[metrics] Error loading tiles data: {e}')
|
||||||
|
output.append(f"# Error loading tiles data: {e}")
|
||||||
|
except Exception as e:
|
||||||
|
output.append(f"# General error loading dashboard totals: {e}")
|
||||||
|
|
||||||
|
# 2. Device-level metrics
|
||||||
|
try:
|
||||||
|
with open(folder + 'table_devices.json', 'r') as f:
|
||||||
|
data = json.load(f)
|
||||||
|
|
||||||
|
devices = data.get("data", [])
|
||||||
|
|
||||||
|
for row in devices:
|
||||||
|
name = escape_label_value(row.get("devName", "unknown"))
|
||||||
|
mac = escape_label_value(row.get("devMac", "unknown"))
|
||||||
|
ip = escape_label_value(row.get("devLastIP", "unknown"))
|
||||||
|
vendor = escape_label_value(row.get("devVendor", "unknown"))
|
||||||
|
first_conn = escape_label_value(row.get("devFirstConnection", "unknown"))
|
||||||
|
last_conn = escape_label_value(row.get("devLastConnection", "unknown"))
|
||||||
|
dev_type = escape_label_value(row.get("devType", "unknown"))
|
||||||
|
raw_status = row.get("devStatus", "Unknown")
|
||||||
|
dev_status = raw_status.replace("-", "").capitalize()
|
||||||
|
|
||||||
|
output.append(
|
||||||
|
f'netalertx_device_status{{device="{name}", mac="{mac}", ip="{ip}", vendor="{vendor}", '
|
||||||
|
f'first_connection="{first_conn}", last_connection="{last_conn}", dev_type="{dev_type}", '
|
||||||
|
f'device_status="{dev_status}"}} 1'
|
||||||
|
)
|
||||||
|
|
||||||
|
except (FileNotFoundError, json.JSONDecodeError) as e:
|
||||||
|
mylog('none', f'[metrics] Error loading devices data: {e}')
|
||||||
|
output.append(f"# Error loading devices data: {e}")
|
||||||
|
except Exception as e:
|
||||||
|
output.append(f"# General error processing device metrics: {e}")
|
||||||
|
|
||||||
|
return "\n".join(output) + "\n"
|
||||||
@@ -667,7 +667,10 @@ def checkNewVersion():
|
|||||||
buildTimestamp = int(f.read().strip())
|
buildTimestamp = int(f.read().strip())
|
||||||
|
|
||||||
try:
|
try:
|
||||||
response = requests.get("https://api.github.com/repos/jokob-sk/NetAlertX/releases")
|
response = requests.get(
|
||||||
|
"https://api.github.com/repos/jokob-sk/NetAlertX/releases",
|
||||||
|
timeout=5
|
||||||
|
)
|
||||||
response.raise_for_status() # Raise an exception for HTTP errors
|
response.raise_for_status() # Raise an exception for HTTP errors
|
||||||
text = response.text
|
text = response.text
|
||||||
except requests.exceptions.RequestException as e:
|
except requests.exceptions.RequestException as e:
|
||||||
|
|||||||
@@ -157,13 +157,13 @@ def importConfigs (db, all_plugins):
|
|||||||
# ----------------------------------------
|
# ----------------------------------------
|
||||||
# ccd(key, default, config_dir, name, inputtype, options, group, events=[], desc = "", regex = "", setJsonMetadata = {}, overrideTemplate = {})
|
# ccd(key, default, config_dir, name, inputtype, options, group, events=[], desc = "", regex = "", setJsonMetadata = {}, overrideTemplate = {})
|
||||||
|
|
||||||
conf.LOADED_PLUGINS = ccd('LOADED_PLUGINS', [] , c_d, 'Loaded plugins', '{"dataType":"array", "elements": [{"elementType" : "select", "elementOptions" : [{"multiple":"true", "ordeable": "true"}] ,"transformers": []}]}', '[]', 'General')
|
conf.LOADED_PLUGINS = ccd('LOADED_PLUGINS', [] , c_d, 'Loaded plugins', '{"dataType":"array","elements":[{"elementType":"select","elementOptions":[{"multiple":"true","ordeable":"true"}],"transformers":[]},{"elementType":"button","elementOptions":[{"sourceSuffixes":[]},{"separator":""},{"cssClasses":"col-xs-12"},{"onClick":"selectChange(this)"},{"getStringKey":"Gen_Change"}],"transformers":[]}]}', '[]', 'General')
|
||||||
conf.DISCOVER_PLUGINS = ccd('DISCOVER_PLUGINS', True , c_d, 'Discover plugins', """{"dataType": "boolean","elements": [{"elementType": "input","elementOptions": [{ "type": "checkbox" }],"transformers": []}]}""", '[]', 'General')
|
conf.DISCOVER_PLUGINS = ccd('DISCOVER_PLUGINS', True , c_d, 'Discover plugins', """{"dataType": "boolean","elements": [{"elementType": "input","elementOptions": [{ "type": "checkbox" }],"transformers": []}]}""", '[]', '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', '''{"dataType": "array","elements": [{"elementType": "input","elementOptions": [{"placeholder": "192.168.1.0/24 --interface=eth1"},{"suffix": "_in"},{"cssClasses": "col-sm-10"},{"prefillValue": "null"}],"transformers": []},{"elementType": "button","elementOptions": [{"sourceSuffixes": ["_in"]},{"separator": ""},{"cssClasses": "col-xs-12"},{"onClick": "addList(this, false)"},{"getStringKey": "Gen_Add"}],"transformers": []},{"elementType": "select","elementHasInputValue": 1,"elementOptions": [{"multiple": "true"},{"readonly": "true"},{"editable": "true"}],"transformers": []},{"elementType": "button","elementOptions": [{"sourceSuffixes": []},{"separator": ""},{"cssClasses": "col-xs-6"},{"onClick": "removeAllOptions(this)"},{"getStringKey": "Gen_Remove_All"}],"transformers": []},{"elementType": "button","elementOptions": [{"sourceSuffixes": []},{"separator": ""},{"cssClasses": "col-xs-6"},{"onClick": "removeFromList(this)"},{"getStringKey": "Gen_Remove_Last"}],"transformers": []}]}''', '[]', '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', '''{"dataType": "array","elements": [{"elementType": "input","elementOptions": [{"placeholder": "192.168.1.0/24 --interface=eth1"},{"suffix": "_in"},{"cssClasses": "col-sm-10"},{"prefillValue": "null"}],"transformers": []},{"elementType": "button","elementOptions": [{"sourceSuffixes": ["_in"]},{"separator": ""},{"cssClasses": "col-xs-12"},{"onClick": "addList(this, false)"},{"getStringKey": "Gen_Add"}],"transformers": []},{"elementType": "select","elementHasInputValue": 1,"elementOptions": [{"multiple": "true"},{"readonly": "true"},{"editable": "true"}],"transformers": []},{"elementType": "button","elementOptions": [{"sourceSuffixes": []},{"separator": ""},{"cssClasses": "col-xs-6"},{"onClick": "removeAllOptions(this)"},{"getStringKey": "Gen_Remove_All"}],"transformers": []},{"elementType": "button","elementOptions": [{"sourceSuffixes": []},{"separator": ""},{"cssClasses": "col-xs-6"},{"onClick": "removeFromList(this)"},{"getStringKey": "Gen_Remove_Last"}],"transformers": []}]}''', '[]', 'General')
|
||||||
conf.LOG_LEVEL = ccd('LOG_LEVEL', 'verbose' , c_d, 'Log verboseness', '{"dataType":"string", "elements": [{"elementType" : "select", "elementOptions" : [] ,"transformers": []}]}', "['none', 'minimal', 'verbose', 'debug', 'trace']", 'General')
|
conf.LOG_LEVEL = ccd('LOG_LEVEL', 'verbose' , c_d, 'Log verboseness', '{"dataType":"string", "elements": [{"elementType" : "select", "elementOptions" : [] ,"transformers": []}]}', "['none', 'minimal', 'verbose', 'debug', 'trace']", 'General')
|
||||||
conf.TIMEZONE = ccd('TIMEZONE', default_tz , c_d, 'Time zone', '{"dataType":"string", "elements": [{"elementType" : "input", "elementOptions" : [] ,"transformers": []}]}', '[]', 'General')
|
conf.TIMEZONE = ccd('TIMEZONE', default_tz , c_d, 'Time zone', '{"dataType":"string", "elements": [{"elementType" : "input", "elementOptions" : [] ,"transformers": []}]}', '[]', 'General')
|
||||||
conf.PLUGINS_KEEP_HIST = ccd('PLUGINS_KEEP_HIST', 250 , c_d, 'Keep history entries', '{"dataType":"integer", "elements": [{"elementType" : "input", "elementOptions" : [{"type": "number"}] ,"transformers": []}]}', '[]', 'General')
|
conf.PLUGINS_KEEP_HIST = ccd('PLUGINS_KEEP_HIST', 250 , c_d, 'Keep history entries', '{"dataType":"integer", "elements": [{"elementType" : "input", "elementOptions" : [{"type": "number"}] ,"transformers": []}]}', '[]', 'General')
|
||||||
conf.REPORT_DASHBOARD_URL = ccd('REPORT_DASHBOARD_URL', 'http://127.0.0.1/' , c_d, 'NetAlertX URL', '{"dataType":"string", "elements": [{"elementType" : "input", "elementOptions" : [] ,"transformers": []}]}', '[]', 'General')
|
conf.REPORT_DASHBOARD_URL = ccd('REPORT_DASHBOARD_URL', 'update_REPORT_DASHBOARD_URL_setting' , c_d, 'NetAlertX URL', '{"dataType":"string", "elements": [{"elementType" : "input", "elementOptions" : [] ,"transformers": []}]}', '[]', 'General')
|
||||||
conf.DAYS_TO_KEEP_EVENTS = ccd('DAYS_TO_KEEP_EVENTS', 90 , c_d, 'Delete events days', '{"dataType":"integer", "elements": [{"elementType" : "input", "elementOptions" : [{"type": "number"}] ,"transformers": []}]}', '[]', 'General')
|
conf.DAYS_TO_KEEP_EVENTS = ccd('DAYS_TO_KEEP_EVENTS', 90 , c_d, 'Delete events days', '{"dataType":"integer", "elements": [{"elementType" : "input", "elementOptions" : [{"type": "number"}] ,"transformers": []}]}', '[]', 'General')
|
||||||
conf.HRS_TO_KEEP_NEWDEV = ccd('HRS_TO_KEEP_NEWDEV', 0 , c_d, 'Keep new devices for', '{"dataType":"integer", "elements": [{"elementType" : "input", "elementOptions" : [{"type": "number"}] ,"transformers": []}]}', "[]", 'General')
|
conf.HRS_TO_KEEP_NEWDEV = ccd('HRS_TO_KEEP_NEWDEV', 0 , c_d, 'Keep new devices for', '{"dataType":"integer", "elements": [{"elementType" : "input", "elementOptions" : [{"type": "number"}] ,"transformers": []}]}', "[]", 'General')
|
||||||
conf.HRS_TO_KEEP_OFFDEV = ccd('HRS_TO_KEEP_OFFDEV', 0 , c_d, 'Keep offline devices for', '{"dataType":"integer", "elements": [{"elementType" : "input", "elementOptions" : [{"type": "number"}] ,"transformers": []}]}', "[]", 'General')
|
conf.HRS_TO_KEEP_OFFDEV = ccd('HRS_TO_KEEP_OFFDEV', 0 , c_d, 'Keep offline devices for', '{"dataType":"integer", "elements": [{"elementType" : "input", "elementOptions" : [{"type": "number"}] ,"transformers": []}]}', "[]", 'General')
|
||||||
@@ -171,7 +171,7 @@ def importConfigs (db, all_plugins):
|
|||||||
conf.REFRESH_FQDN = ccd('REFRESH_FQDN', False , c_d, 'Refresh FQDN', """{"dataType": "boolean","elements": [{"elementType": "input","elementOptions": [{ "type": "checkbox" }],"transformers": []}]}""", '[]', 'General')
|
conf.REFRESH_FQDN = ccd('REFRESH_FQDN', False , c_d, 'Refresh FQDN', """{"dataType": "boolean","elements": [{"elementType": "input","elementOptions": [{ "type": "checkbox" }],"transformers": []}]}""", '[]', 'General')
|
||||||
conf.API_CUSTOM_SQL = ccd('API_CUSTOM_SQL', 'SELECT * FROM Devices WHERE devPresentLastScan = 0' , c_d, 'Custom endpoint', '{"dataType":"string", "elements": [{"elementType" : "input", "elementOptions" : [] ,"transformers": []}]}', '[]', 'General')
|
conf.API_CUSTOM_SQL = ccd('API_CUSTOM_SQL', 'SELECT * FROM Devices WHERE devPresentLastScan = 0' , c_d, 'Custom endpoint', '{"dataType":"string", "elements": [{"elementType" : "input", "elementOptions" : [] ,"transformers": []}]}', '[]', 'General')
|
||||||
conf.VERSION = ccd('VERSION', '' , c_d, 'Version', '{"dataType":"string", "elements": [{"elementType" : "input", "elementOptions" : [{ "readonly": "true" }] ,"transformers": []}]}', '', 'General')
|
conf.VERSION = ccd('VERSION', '' , c_d, 'Version', '{"dataType":"string", "elements": [{"elementType" : "input", "elementOptions" : [{ "readonly": "true" }] ,"transformers": []}]}', '', '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', '{"dataType":"array","elements":[{"elementType":"input","elementOptions":[{"placeholder":"Enter value"},{"suffix":"_in"},{"cssClasses":"col-sm-10"},{"prefillValue":"null"}],"transformers":[]},{"elementType":"button","elementOptions":[{"sourceSuffixes":["_in"]},{"separator":""},{"cssClasses":"col-xs-12"},{"onClick":"addList(this,false)"},{"getStringKey":"Gen_Add"}],"transformers":[]},{"elementType":"select", "elementHasInputValue":1,"elementOptions":[{"multiple":"true"},{"readonly":"true"},{"editable":"true"}],"transformers":[]},{"elementType":"button","elementOptions":[{"sourceSuffixes":[]},{"separator":""},{"cssClasses":"col-xs-6"},{"onClick":"removeAllOptions(this)"},{"getStringKey":"Gen_Remove_All"}],"transformers":[]},{"elementType":"button","elementOptions":[{"sourceSuffixes":[]},{"separator":""},{"cssClasses":"col-xs-6"},{"onClick":"removeFromList(this)"},{"getStringKey":"Gen_Remove_Last"}],"transformers":[]}]}', '[]', 'General')
|
conf.NETWORK_DEVICE_TYPES = ccd('NETWORK_DEVICE_TYPES', ['AP', 'Access Point', 'Gateway', 'Firewall', 'Hypervisor', 'Powerline', 'Switch', 'WLAN', 'PLC', 'Router','USB LAN Adapter', 'USB WIFI Adapter', 'Internet'] , c_d, 'Network device types', '{"dataType":"array","elements":[{"elementType":"input","elementOptions":[{"placeholder":"Enter value"},{"suffix":"_in"},{"cssClasses":"col-sm-10"},{"prefillValue":"null"}],"transformers":[]},{"elementType":"button","elementOptions":[{"sourceSuffixes":["_in"]},{"separator":""},{"cssClasses":"col-xs-12"},{"onClick":"addList(this,false)"},{"getStringKey":"Gen_Add"}],"transformers":[]},{"elementType":"select", "elementHasInputValue":1,"elementOptions":[{"multiple":"true"},{"readonly":"true"},{"editable":"true"}],"transformers":[]},{"elementType":"button","elementOptions":[{"sourceSuffixes":[]},{"separator":""},{"cssClasses":"col-xs-6"},{"onClick":"removeAllOptions(this)"},{"getStringKey":"Gen_Remove_All"}],"transformers":[]},{"elementType":"button","elementOptions":[{"sourceSuffixes":[]},{"separator":""},{"cssClasses":"col-xs-6"},{"onClick":"removeFromList(this)"},{"getStringKey":"Gen_Remove_Last"}],"transformers":[]}]}', '[]', 'General')
|
||||||
conf.GRAPHQL_PORT = ccd('GRAPHQL_PORT', 20212 , c_d, 'GraphQL port', '{"dataType":"integer", "elements": [{"elementType" : "input", "elementOptions" : [{"type": "number"}] ,"transformers": []}]}', '[]', 'General')
|
conf.GRAPHQL_PORT = ccd('GRAPHQL_PORT', 20212 , c_d, 'GraphQL port', '{"dataType":"integer", "elements": [{"elementType" : "input", "elementOptions" : [{"type": "number"}] ,"transformers": []}]}', '[]', 'General')
|
||||||
conf.API_TOKEN = ccd('API_TOKEN', 't_' + generate_random_string(20) , c_d, 'API token', '{"dataType": "string","elements": [{"elementType": "input","elementHasInputValue": 1,"elementOptions": [{ "cssClasses": "col-xs-12" }],"transformers": []},{"elementType": "button","elementOptions": [{ "getStringKey": "Gen_Generate" },{ "customParams": "API_TOKEN" },{ "onClick": "generateApiToken(this, 20)" },{ "cssClasses": "col-xs-12" }],"transformers": []}]}', '[]', 'General')
|
conf.API_TOKEN = ccd('API_TOKEN', 't_' + generate_random_string(20) , c_d, 'API token', '{"dataType": "string","elements": [{"elementType": "input","elementHasInputValue": 1,"elementOptions": [{ "cssClasses": "col-xs-12" }],"transformers": []},{"elementType": "button","elementOptions": [{ "getStringKey": "Gen_Generate" },{ "customParams": "API_TOKEN" },{ "onClick": "generateApiToken(this, 20)" },{ "cssClasses": "col-xs-12" }],"transformers": []}]}', '[]', 'General')
|
||||||
|
|
||||||
@@ -275,6 +275,15 @@ def importConfigs (db, all_plugins):
|
|||||||
# Save the user defined value into the object
|
# Save the user defined value into the object
|
||||||
set["value"] = v
|
set["value"] = v
|
||||||
|
|
||||||
|
# Now check for popupForm inside elements → elementOptions
|
||||||
|
elements = set.get("type", {}).get("elements", [])
|
||||||
|
for element in elements:
|
||||||
|
for option in element.get("elementOptions", []):
|
||||||
|
if "popupForm" in option:
|
||||||
|
for popup_entry in option["popupForm"]:
|
||||||
|
popup_pref = key + "_popupform_" + popup_entry.get("function", "")
|
||||||
|
stringSqlParams = collect_lang_strings(popup_entry, popup_pref, stringSqlParams)
|
||||||
|
|
||||||
# Collect settings related language strings
|
# Collect settings related language strings
|
||||||
# Creates an entry with key, for example ARPSCAN_CMD_name
|
# Creates an entry with key, for example ARPSCAN_CMD_name
|
||||||
stringSqlParams = collect_lang_strings(set, pref + "_" + set["function"], stringSqlParams)
|
stringSqlParams = collect_lang_strings(set, pref + "_" + set["function"], stringSqlParams)
|
||||||
|
|||||||
@@ -447,8 +447,8 @@ def create_new_devices (db):
|
|||||||
cur_MAC, cur_Name, cur_Vendor, cur_ScanMethod, cur_IP, cur_SyncHubNodeName, cur_NetworkNodeMAC, cur_PORT, cur_NetworkSite, cur_SSID, cur_Type = row
|
cur_MAC, cur_Name, cur_Vendor, cur_ScanMethod, cur_IP, cur_SyncHubNodeName, cur_NetworkNodeMAC, cur_PORT, cur_NetworkSite, cur_SSID, cur_Type = row
|
||||||
|
|
||||||
# Handle NoneType
|
# Handle NoneType
|
||||||
cur_Name = cur_Name.strip() if cur_Name else '(unknown)'
|
cur_Name = str(cur_Name).strip() if cur_Name else '(unknown)'
|
||||||
cur_Type = cur_Type.strip() if cur_Type else get_setting_value("NEWDEV_devType")
|
cur_Type = str(cur_Type).strip() if cur_Type else get_setting_value("NEWDEV_devType")
|
||||||
cur_NetworkNodeMAC = cur_NetworkNodeMAC.strip() if cur_NetworkNodeMAC else ''
|
cur_NetworkNodeMAC = cur_NetworkNodeMAC.strip() if cur_NetworkNodeMAC else ''
|
||||||
cur_NetworkNodeMAC = cur_NetworkNodeMAC if cur_NetworkNodeMAC and cur_MAC != "Internet" else (get_setting_value("NEWDEV_devParentMAC") if cur_MAC != "Internet" else "null")
|
cur_NetworkNodeMAC = cur_NetworkNodeMAC if cur_NetworkNodeMAC and cur_MAC != "Internet" else (get_setting_value("NEWDEV_devParentMAC") if cur_MAC != "Internet" else "null")
|
||||||
cur_SyncHubNodeName = cur_SyncHubNodeName if cur_SyncHubNodeName and cur_SyncHubNodeName != "null" else (get_setting_value("SYNC_node_name"))
|
cur_SyncHubNodeName = cur_SyncHubNodeName if cur_SyncHubNodeName and cur_SyncHubNodeName != "null" else (get_setting_value("SYNC_node_name"))
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
import sys
|
import sys
|
||||||
import re
|
import re
|
||||||
|
import json
|
||||||
|
import base64
|
||||||
|
from pathlib import Path
|
||||||
from typing import Optional, List, Tuple, Dict
|
from typing import Optional, List, Tuple, Dict
|
||||||
|
|
||||||
# Register NetAlertX directories
|
# Register NetAlertX directories
|
||||||
@@ -11,57 +14,167 @@ from const import *
|
|||||||
from logger import mylog
|
from logger import mylog
|
||||||
from helper import timeNowTZ, get_setting_value
|
from helper import timeNowTZ, get_setting_value
|
||||||
|
|
||||||
|
# Load MAC/device-type/icon rules from external file
|
||||||
|
MAC_TYPE_ICON_PATH = Path(f"{INSTALL_PATH}/back/device_heuristics_rules.json")
|
||||||
|
try:
|
||||||
|
with open(MAC_TYPE_ICON_PATH, "r", encoding="utf-8") as f:
|
||||||
|
MAC_TYPE_ICON_RULES = json.load(f)
|
||||||
|
# Precompute base64-encoded icon_html once for each rule
|
||||||
|
for rule in MAC_TYPE_ICON_RULES:
|
||||||
|
icon_html = rule.get("icon_html", "")
|
||||||
|
if icon_html:
|
||||||
|
# encode icon_html to base64 string
|
||||||
|
b64_bytes = base64.b64encode(icon_html.encode("utf-8"))
|
||||||
|
rule["icon_base64"] = b64_bytes.decode("utf-8")
|
||||||
|
else:
|
||||||
|
rule["icon_base64"] = ""
|
||||||
|
except Exception as e:
|
||||||
|
MAC_TYPE_ICON_RULES = []
|
||||||
|
mylog('none', f"[guess_device_attributes] Failed to load device_heuristics_rules.json: {e}")
|
||||||
|
|
||||||
|
# -----------------------------------------
|
||||||
|
# Match device type and base64-encoded icon using MAC prefix and vendor patterns.
|
||||||
|
def match_mac_and_vendor(
|
||||||
|
mac_clean: str,
|
||||||
|
vendor: str,
|
||||||
|
default_type: str,
|
||||||
|
default_icon: str
|
||||||
|
) -> Tuple[str, str]:
|
||||||
|
"""
|
||||||
|
Match device type and base64-encoded icon using MAC prefix and vendor patterns.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
mac_clean: Cleaned MAC address (uppercase, no colons).
|
||||||
|
vendor: Normalized vendor name (lowercase).
|
||||||
|
default_type: Fallback device type.
|
||||||
|
default_icon: Fallback base64 icon.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Tuple containing (device_type, base64_icon)
|
||||||
|
"""
|
||||||
|
for rule in MAC_TYPE_ICON_RULES:
|
||||||
|
dev_type = rule.get("dev_type")
|
||||||
|
base64_icon = rule.get("icon_base64", "")
|
||||||
|
patterns = rule.get("matching_pattern", [])
|
||||||
|
|
||||||
|
for pattern in patterns:
|
||||||
|
mac_prefix = pattern.get("mac_prefix", "").upper()
|
||||||
|
vendor_pattern = pattern.get("vendor", "").lower()
|
||||||
|
|
||||||
|
if mac_clean.startswith(mac_prefix):
|
||||||
|
if not vendor_pattern or vendor_pattern in vendor:
|
||||||
|
|
||||||
|
mylog('debug', f"[guess_device_attributes] Matched via MAC+Vendor")
|
||||||
|
|
||||||
|
type_ = dev_type
|
||||||
|
icon = base64_icon or default_icon
|
||||||
|
return type_, icon
|
||||||
|
|
||||||
|
return default_type, default_icon
|
||||||
|
|
||||||
|
# ---------------------------------------------------
|
||||||
|
# Match device type and base64-encoded icon using vendor patterns.
|
||||||
|
def match_vendor(
|
||||||
|
vendor: str,
|
||||||
|
default_type: str,
|
||||||
|
default_icon: str
|
||||||
|
) -> Tuple[str, str]:
|
||||||
|
|
||||||
|
vendor_lc = vendor.lower()
|
||||||
|
|
||||||
|
for rule in MAC_TYPE_ICON_RULES:
|
||||||
|
dev_type = rule.get("dev_type")
|
||||||
|
base64_icon = rule.get("icon_base64", "")
|
||||||
|
patterns = rule.get("matching_pattern", [])
|
||||||
|
|
||||||
|
for pattern in patterns:
|
||||||
|
# Only apply fallback when no MAC prefix is specified
|
||||||
|
mac_prefix = pattern.get("mac_prefix", "")
|
||||||
|
vendor_pattern = pattern.get("vendor", "").lower()
|
||||||
|
|
||||||
|
if vendor_pattern and vendor_pattern in vendor_lc:
|
||||||
|
|
||||||
|
mylog('debug', f"[guess_device_attributes] Matched via Vendor")
|
||||||
|
|
||||||
|
icon = base64_icon or default_icon
|
||||||
|
|
||||||
|
return dev_type, icon
|
||||||
|
|
||||||
|
return default_type, default_icon
|
||||||
|
|
||||||
|
# ---------------------------------------------------
|
||||||
|
# Match device type and base64-encoded icon using name patterns.
|
||||||
|
def match_name(
|
||||||
|
name: str,
|
||||||
|
default_type: str,
|
||||||
|
default_icon: str
|
||||||
|
) -> Tuple[str, str]:
|
||||||
|
"""
|
||||||
|
Match device type and base64-encoded icon using name patterns from global MAC_TYPE_ICON_RULES.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: Normalized device name (lowercase).
|
||||||
|
default_type: Fallback device type.
|
||||||
|
default_icon: Fallback base64 icon.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Tuple containing (device_type, base64_icon)
|
||||||
|
"""
|
||||||
|
name_lower = name.lower() if name else ""
|
||||||
|
|
||||||
|
for rule in MAC_TYPE_ICON_RULES:
|
||||||
|
dev_type = rule.get("dev_type")
|
||||||
|
base64_icon = rule.get("icon_base64", "")
|
||||||
|
name_patterns = rule.get("name_pattern", [])
|
||||||
|
|
||||||
|
for pattern in name_patterns:
|
||||||
|
# Use regex search to allow pattern substrings
|
||||||
|
if re.search(pattern, name_lower, re.IGNORECASE):
|
||||||
|
|
||||||
|
mylog('debug', f"[guess_device_attributes] Matched via Name")
|
||||||
|
|
||||||
|
type_ = dev_type
|
||||||
|
icon = base64_icon or default_icon
|
||||||
|
return type_, icon
|
||||||
|
|
||||||
|
return default_type, default_icon
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
# Base64 encoded HTML strings for FontAwesome icons, now with an extended icons dictionary for broader device coverage
|
#
|
||||||
ICONS = {
|
def match_ip(
|
||||||
"globe": "PGkgY2xhc3M9ImZhcyBmYS1nbG9iZSI+PC9pPg==", # Internet or global network
|
ip: str,
|
||||||
"phone": "PGkgY2xhc3M9ImZhcyBmYS1tb2JpbGUtYWx0Ij48L2k+", # Smartphone
|
default_type: str,
|
||||||
"laptop": "PGkgY2xhc3M9ImZhIGZhLWxhcHRvcCI+PC9pPg==", # Laptop
|
default_icon: str
|
||||||
"printer": "PGkgY2xhc3M9ImZhIGZhLXByaW50ZXIiPjwvaT4=", # Printer
|
) -> Tuple[str, str]:
|
||||||
"router": "PGkgY2xhc3M9ImZhcyBmYS1yYW5kb20iPjwvaT4=", # Router or network switch
|
"""
|
||||||
"tv": "PGkgY2xhc3M9ImZhIGZhLXR2Ij48L2k+", # Television
|
Match device type and base64-encoded icon using IP regex patterns from global JSON.
|
||||||
"desktop": "PGkgY2xhc3M9ImZhIGZhLWRlc2t0b3AiPjwvaT4=", # Desktop PC
|
|
||||||
"tablet": "PGkgY2xhc3M9ImZhIGZhLXRhYmxldCI+PC9pPg==", # Tablet
|
|
||||||
"watch": "PGkgY2xhc3M9ImZhcyBmYS1jbG9jayI+PC9pPg==", # Fallback to clock since smartwatch is nonfree in FontAwesome
|
|
||||||
"camera": "PGkgY2xhc3M9ImZhIGZhLWNhbWVyYSI+PC9pPg==", # Camera or webcam
|
|
||||||
"home": "PGkgY2xhc3M9ImZhIGZhLWhvbWUiPjwvaT4=", # Smart home device
|
|
||||||
"apple": "PGkgY2xhc3M9ImZhYiBmYS1hcHBsZSI+PC9pPg==", # Apple device
|
|
||||||
"ethernet": "PGkgY2xhc3M9ImZhcyBmYS1uZXR3b3JrLXdpcmVkIj48L2k+", # Free alternative for ethernet icon in FontAwesome
|
|
||||||
"google": "PGkgY2xhc3M9ImZhYiBmYS1nb29nbGUiPjwvaT4=", # Google device
|
|
||||||
"raspberry": "PGkgY2xhc3M9ImZhYiBmYS1yYXNwYmVycnktcGkiPjwvaT4=", # Raspberry Pi
|
|
||||||
"microchip": "PGkgY2xhc3M9ImZhcyBmYS1taWNyb2NoaXAiPjwvaT4=", # IoT or embedded device
|
|
||||||
"server": "PGkgY2xhc3M9ImZhcyBmYS1zZXJ2ZXIiPjwvaT4=", # Server
|
|
||||||
"gamepad": "PGkgY2xhc3M9ImZhcyBmYS1nYW1lcGFkIj48L2k+", # Gaming console
|
|
||||||
"lightbulb": "PGkgY2xhc3M9ImZhcyBmYS1saWdodGJ1bGIiPjwvaT4=", # Smart light
|
|
||||||
"speaker": "PGkgY2xhc3M9ImZhcyBmYS12b2x1bWUtdXAiPjwvaT4=", # Free speaker alt icon for smart speakers in FontAwesome
|
|
||||||
"lock": "PGkgY2xhc3M9ImZhcyBmYS1sb2NrIj48L2k+", # Security device
|
|
||||||
}
|
|
||||||
|
|
||||||
# Extended device types for comprehensive classification
|
Args:
|
||||||
DEVICE_TYPES = {
|
ip: Device IP address as string.
|
||||||
"Internet": "Internet Gateway",
|
default_type: Fallback device type.
|
||||||
"Phone": "Smartphone",
|
default_icon: Fallback base64 icon.
|
||||||
"Laptop": "Laptop",
|
|
||||||
"Printer": "Printer",
|
|
||||||
"Router": "Router",
|
|
||||||
"TV": "Television",
|
|
||||||
"Desktop": "Desktop PC",
|
|
||||||
"Tablet": "Tablet",
|
|
||||||
"Smartwatch": "Smartwatch",
|
|
||||||
"Camera": "Camera",
|
|
||||||
"SmartHome": "Smart Home Device",
|
|
||||||
"Server": "Server",
|
|
||||||
"GamingConsole": "Gaming Console",
|
|
||||||
"IoT": "IoT Device",
|
|
||||||
"NetworkSwitch": "Network Switch",
|
|
||||||
"AccessPoint": "Access Point",
|
|
||||||
"SmartLight": "Smart Light",
|
|
||||||
"SmartSpeaker": "Smart Speaker",
|
|
||||||
"SecurityDevice": "Security Device",
|
|
||||||
"Unknown": "Unknown Device",
|
|
||||||
}
|
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Tuple containing (device_type, base64_icon)
|
||||||
|
"""
|
||||||
|
if not ip:
|
||||||
|
return default_type, default_icon
|
||||||
|
|
||||||
|
for rule in MAC_TYPE_ICON_RULES:
|
||||||
|
ip_patterns = rule.get("ip_pattern", [])
|
||||||
|
dev_type = rule.get("dev_type")
|
||||||
|
base64_icon = rule.get("icon_base64", "")
|
||||||
|
|
||||||
|
for pattern in ip_patterns:
|
||||||
|
if re.match(pattern, ip):
|
||||||
|
|
||||||
|
mylog('debug', f"[guess_device_attributes] Matched via IP")
|
||||||
|
|
||||||
|
type_ = dev_type
|
||||||
|
icon = base64_icon or default_icon
|
||||||
|
return type_, icon
|
||||||
|
|
||||||
|
return default_type, default_icon
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
# Guess device attributes such as type of device and associated device icon
|
# Guess device attributes such as type of device and associated device icon
|
||||||
@@ -72,197 +185,46 @@ def guess_device_attributes(
|
|||||||
name: Optional[str],
|
name: Optional[str],
|
||||||
default_icon: str,
|
default_icon: str,
|
||||||
default_type: str
|
default_type: str
|
||||||
) -> Tuple[str, str]:
|
) -> Tuple[str, str]:
|
||||||
"""
|
|
||||||
Guess the appropriate FontAwesome icon and device type based on device attributes.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
vendor: Device vendor name.
|
|
||||||
mac: Device MAC address.
|
|
||||||
ip: Device IP address.
|
|
||||||
name: Device name.
|
|
||||||
default_icon: Default icon to return if no match is found.
|
|
||||||
default_type: Default type to return if no match is found.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Tuple[str, str]: A tuple containing the guessed icon (Base64-encoded HTML string)
|
|
||||||
and the guessed device type (string).
|
|
||||||
"""
|
|
||||||
mylog('debug', f"[guess_device_attributes] Guessing attributes for (vendor|mac|ip|name): ('{vendor}'|'{mac}'|'{ip}'|'{name}')")
|
mylog('debug', f"[guess_device_attributes] Guessing attributes for (vendor|mac|ip|name): ('{vendor}'|'{mac}'|'{ip}'|'{name}')")
|
||||||
# Normalize inputs
|
|
||||||
|
# --- Normalize inputs ---
|
||||||
vendor = str(vendor).lower().strip() if vendor else "unknown"
|
vendor = str(vendor).lower().strip() if vendor else "unknown"
|
||||||
mac = str(mac).upper().strip() if mac else "00:00:00:00:00:00"
|
mac = str(mac).upper().strip() if mac else "00:00:00:00:00:00"
|
||||||
ip = str(ip).strip() if ip else "169.254.0.0" # APIPA address for unknown IPs per RFC 3927
|
ip = str(ip).strip() if ip else "169.254.0.0"
|
||||||
name = str(name).lower().strip() if name else "(unknown)"
|
name = str(name).lower().strip() if name else "(unknown)"
|
||||||
|
mac_clean = mac.replace(':', '').replace('-', '').upper()
|
||||||
|
|
||||||
# --- Icon Guessing Logic ---
|
# # Internet shortcut
|
||||||
if mac == "INTERNET":
|
# if mac == "INTERNET":
|
||||||
icon = ICONS.get("globe", default_icon)
|
# return ICONS.get("globe", default_icon), DEVICE_TYPES.get("Internet", default_type)
|
||||||
else:
|
|
||||||
# Vendor-based icon guessing
|
|
||||||
icon_vendor_patterns = {
|
|
||||||
"apple": "apple",
|
|
||||||
"samsung|motorola|xiaomi|huawei": "phone",
|
|
||||||
"dell|lenovo|asus|acer": "laptop",
|
|
||||||
"hp|epson|canon|brother": "printer",
|
|
||||||
"cisco|ubiquiti|netgear|tp-link|d-link|mikrotik": "router",
|
|
||||||
"lg|samsung electronics|sony|vizio": "tv",
|
|
||||||
"raspberry pi": "raspberry",
|
|
||||||
"google": "google",
|
|
||||||
"espressif|particle": "microchip",
|
|
||||||
"intel|amd": "desktop",
|
|
||||||
"amazon": "speaker",
|
|
||||||
"philips hue|lifx": "lightbulb",
|
|
||||||
"aruba|meraki": "ethernet",
|
|
||||||
"qnap|synology": "server",
|
|
||||||
"nintendo|sony interactive|microsoft": "gamepad",
|
|
||||||
"ring|blink|arlo": "camera",
|
|
||||||
"nest": "home",
|
|
||||||
}
|
|
||||||
for pattern, icon_key in icon_vendor_patterns.items():
|
|
||||||
if re.search(pattern, vendor, re.IGNORECASE):
|
|
||||||
icon = ICONS.get(icon_key, default_icon)
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
# MAC-based icon guessing
|
|
||||||
mac_clean = mac.replace(':', '').replace('-', '').upper()
|
|
||||||
icon_mac_patterns = {
|
|
||||||
"001A79|B0BE83|BC926B": "apple",
|
|
||||||
"001B63|BC4C4C": "tablet",
|
|
||||||
"74ACB9|002468": "ethernet",
|
|
||||||
"B827EB": "raspberry",
|
|
||||||
"001422|001874": "desktop",
|
|
||||||
"001CBF|002186": "server",
|
|
||||||
}
|
|
||||||
for pattern_str, icon_key in icon_mac_patterns.items():
|
|
||||||
patterns = [p.replace(':', '').replace('-', '').upper() for p in pattern_str.split('|')]
|
|
||||||
if any(mac_clean.startswith(p) for p in patterns):
|
|
||||||
icon = ICONS.get(icon_key, default_icon)
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
# Name-based icon guessing
|
|
||||||
icon_name_patterns = {
|
|
||||||
"iphone|ipad|macbook|imac": "apple",
|
|
||||||
"pixel|galaxy|redmi": "phone",
|
|
||||||
"laptop|notebook": "laptop",
|
|
||||||
"printer|print": "printer",
|
|
||||||
"router|gateway|ap|access[ -]?point": "router",
|
|
||||||
"tv|television|smarttv": "tv",
|
|
||||||
"desktop|pc|computer": "desktop",
|
|
||||||
"tablet|pad": "tablet",
|
|
||||||
"watch|wear": "watch",
|
|
||||||
"camera|cam|webcam": "camera",
|
|
||||||
"echo|alexa|dot": "speaker",
|
|
||||||
"hue|lifx|bulb": "lightbulb",
|
|
||||||
"server|nas": "server",
|
|
||||||
"playstation|xbox|switch": "gamepad",
|
|
||||||
"raspberry|pi": "raspberry",
|
|
||||||
"google|chromecast|nest": "google",
|
|
||||||
"doorbell|lock|security": "lock",
|
|
||||||
}
|
|
||||||
for pattern, icon_key in icon_name_patterns.items():
|
|
||||||
if re.search(pattern, name, re.IGNORECASE):
|
|
||||||
icon = ICONS.get(icon_key, default_icon)
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
# IP-based icon guessing
|
|
||||||
icon_ip_patterns = {
|
|
||||||
r"^192\.168\.[0-1]\.1$": "router",
|
|
||||||
r"^10\.0\.0\.1$": "router",
|
|
||||||
r"^192\.168\.[0-1]\.[2-9]$": "desktop",
|
|
||||||
r"^192\.168\.[0-1]\.1\d{2}$": "phone",
|
|
||||||
}
|
|
||||||
for pattern, icon_key in icon_ip_patterns.items():
|
|
||||||
if re.match(pattern, ip):
|
|
||||||
icon = ICONS.get(icon_key, default_icon)
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
icon = default_icon
|
|
||||||
|
|
||||||
# --- Type Guessing Logic ---
|
type_ = None
|
||||||
if mac == "INTERNET":
|
icon = None
|
||||||
type_ = DEVICE_TYPES.get("Internet", default_type)
|
|
||||||
else:
|
|
||||||
# Vendor-based type guessing
|
|
||||||
type_vendor_patterns = {
|
|
||||||
"apple|samsung|motorola|xiaomi|huawei": "Phone",
|
|
||||||
"dell|lenovo|asus|acer|hp": "Laptop",
|
|
||||||
"epson|canon|brother": "Printer",
|
|
||||||
"cisco|ubiquiti|netgear|tp-link|d-link|mikrotik|aruba|meraki": "Router",
|
|
||||||
"lg|samsung electronics|sony|vizio": "TV",
|
|
||||||
"raspberry pi": "IoT",
|
|
||||||
"google|nest": "SmartHome",
|
|
||||||
"espressif|particle": "IoT",
|
|
||||||
"intel|amd": "Desktop",
|
|
||||||
"amazon": "SmartSpeaker",
|
|
||||||
"philips hue|lifx": "SmartLight",
|
|
||||||
"qnap|synology": "Server",
|
|
||||||
"nintendo|sony interactive|microsoft": "GamingConsole",
|
|
||||||
"ring|blink|arlo": "Camera",
|
|
||||||
}
|
|
||||||
for pattern, type_key in type_vendor_patterns.items():
|
|
||||||
if re.search(pattern, vendor, re.IGNORECASE):
|
|
||||||
type_ = DEVICE_TYPES.get(type_key, default_type)
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
# MAC-based type guessing
|
|
||||||
mac_clean = mac.replace(':', '').replace('-', '').upper()
|
|
||||||
type_mac_patterns = {
|
|
||||||
"00:1A:79|B0:BE:83|BC:92:6B": "Phone",
|
|
||||||
"00:1B:63|BC:4C:4C": "Tablet",
|
|
||||||
"74:AC:B9|00:24:68": "AccessPoint",
|
|
||||||
"B8:27:EB": "IoT",
|
|
||||||
"00:14:22|00:18:74": "Desktop",
|
|
||||||
"00:1C:BF|00:21:86": "Server",
|
|
||||||
}
|
|
||||||
for pattern_str, type_key in type_mac_patterns.items():
|
|
||||||
patterns = [p.replace(':', '').replace('-', '').upper() for p in pattern_str.split('|')]
|
|
||||||
if any(mac_clean.startswith(p) for p in patterns):
|
|
||||||
type_ = DEVICE_TYPES.get(type_key, default_type)
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
# Name-based type guessing
|
|
||||||
type_name_patterns = {
|
|
||||||
"iphone|ipad": "Phone",
|
|
||||||
"macbook|imac": "Laptop",
|
|
||||||
"pixel|galaxy|redmi": "Phone",
|
|
||||||
"laptop|notebook": "Laptop",
|
|
||||||
"printer|print": "Printer",
|
|
||||||
"router|gateway|ap|access[ -]?point": "Router",
|
|
||||||
"tv|television|smarttv": "TV",
|
|
||||||
"desktop|pc|computer": "Desktop",
|
|
||||||
"tablet|pad": "Tablet",
|
|
||||||
"watch|wear": "Smartwatch",
|
|
||||||
"camera|cam|webcam": "Camera",
|
|
||||||
"echo|alexa|dot": "SmartSpeaker",
|
|
||||||
"hue|lifx|bulb": "SmartLight",
|
|
||||||
"server|nas": "Server",
|
|
||||||
"playstation|xbox|switch": "GamingConsole",
|
|
||||||
"raspberry|pi": "IoT",
|
|
||||||
"google|chromecast|nest": "SmartHome",
|
|
||||||
"doorbell|lock|security": "SecurityDevice",
|
|
||||||
}
|
|
||||||
for pattern, type_key in type_name_patterns.items():
|
|
||||||
if re.search(pattern, name, re.IGNORECASE):
|
|
||||||
type_ = DEVICE_TYPES.get(type_key, default_type)
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
# IP-based type guessing
|
|
||||||
type_ip_patterns = {
|
|
||||||
r"^192\.168\.[0-1]\.1$": "Router",
|
|
||||||
r"^10\.0\.0\.1$": "Router",
|
|
||||||
r"^192\.168\.[0-1]\.[2-9]$": "Desktop",
|
|
||||||
r"^192\.168\.[0-1]\.1\d{2}$": "Phone",
|
|
||||||
}
|
|
||||||
for pattern, type_key in type_ip_patterns.items():
|
|
||||||
if re.match(pattern, ip):
|
|
||||||
type_ = DEVICE_TYPES.get(type_key, default_type)
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
type_ = default_type
|
|
||||||
|
|
||||||
|
# --- Strict MAC + vendor rule matching from external file ---
|
||||||
|
type_, icon = match_mac_and_vendor(mac_clean, vendor, default_type, default_icon)
|
||||||
|
|
||||||
|
# --- Loose Vendor-based fallback ---
|
||||||
|
if not type_ or type_ == default_type:
|
||||||
|
type_, icon = match_vendor(vendor, default_type, default_icon)
|
||||||
|
|
||||||
|
# --- Loose Name-based fallback ---
|
||||||
|
if not type_ or type_ == default_type:
|
||||||
|
type_, icon = match_name(name, default_type, default_icon)
|
||||||
|
|
||||||
|
# --- Loose IP-based fallback ---
|
||||||
|
if (not type_ or type_ == default_type) or (not icon or icon == default_icon):
|
||||||
|
type_, icon = match_ip(ip, default_type, default_icon)
|
||||||
|
|
||||||
|
# Final fallbacks
|
||||||
|
type_ = type_ or default_type
|
||||||
|
icon = icon or default_icon
|
||||||
|
|
||||||
|
mylog('debug', f"[guess_device_attributes] Guessed attributes (icon|type_): ('{icon}'|'{type_}')")
|
||||||
return icon, type_
|
return icon, type_
|
||||||
|
|
||||||
|
|
||||||
# Deprecated functions with redirects (To be removed once all calls for these have been adjusted to use the updated function)
|
# Deprecated functions with redirects (To be removed once all calls for these have been adjusted to use the updated function)
|
||||||
def guess_icon(
|
def guess_icon(
|
||||||
vendor: Optional[str],
|
vendor: Optional[str],
|
||||||
@@ -308,7 +270,7 @@ def guess_type(
|
|||||||
default: Default type to return if no match is found.
|
default: Default type to return if no match is found.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
str: Device type from DEVICE_TYPES dictionary.
|
str: Device type.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
_, type_ = guess_device_attributes(vendor, mac, ip, name, "unknown_icon", default)
|
_, type_ = guess_device_attributes(vendor, mac, ip, name, "unknown_icon", default)
|
||||||
|
|||||||
Reference in New Issue
Block a user