MQTT rework v0.4, install scripts rework, Traefik docs 📦

This commit is contained in:
Jokob-sk
2023-10-15 16:37:32 +11:00
parent 31e1116483
commit 897112e466
22 changed files with 50461 additions and 204 deletions

View File

@@ -1,4 +1,4 @@
FROM debian:bullseye-slim
FROM debian:bookworm-slim
# default UID and GID
ENV USER=pi USER_ID=1000 USER_GID=1000 PORT=20211
@@ -7,15 +7,9 @@ ENV USER=pi USER_ID=1000 USER_GID=1000 PORT=20211
# Todo, figure out why using a workdir instead of full paths don't work
# Todo, do we still need all these packages? I can already see sudo which isn't needed
RUN apt-get update \
&& apt-get install --no-install-recommends tini snmp ca-certificates curl libwww-perl arp-scan perl apt-utils cron sudo nginx-light php php-cgi php-fpm php-sqlite3 php-curl sqlite3 dnsutils net-tools python3 iproute2 nmap python3-pip zip systemctl usbutils traceroute -y \
&& pip3 install requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli \
&& update-alternatives --install /usr/bin/python python /usr/bin/python3 10 \
&& apt-get clean autoclean \
&& apt-get autoremove \
&& rm -rf /var/lib/apt/lists/* \
&& rm -rf /var/www/html \
&& ln -s /home/pi/pialert/front /var/www/html
RUN apt-get update
RUN apt-get install sudo -y
# create pi user and group
# add root and www-data to pi group so they can r/w files and db
@@ -31,24 +25,8 @@ RUN groupadd --gid "${USER_GID}" "${USER}" && \
COPY --chmod=775 --chown=${USER_ID}:${USER_GID} . /home/pi/pialert/
# Pi.Alert
RUN rm /etc/nginx/sites-available/default \
&& ln -s /home/pi/pialert/install/default /etc/nginx/sites-available/default \
&& sed -ie 's/listen 80/listen '${PORT}'/g' /etc/nginx/sites-available/default \
# run the hardware vendors update
&& /home/pi/pialert/back/update_vendors.sh \
# Create a backup of the pialert.conf to be used if the user didn't supply a configuration file
&& cp /home/pi/pialert/config/pialert.conf /home/pi/pialert/back/pialert.conf_bak \
# Create a backup of the pialert.db to be used if the user didn't supply a database
&& cp /home/pi/pialert/db/pialert.db /home/pi/pialert/back/pialert.db_bak \
# Create a buildtimestamp.txt to later check if a new version was released
&& date +%s > /home/pi/pialert/front/buildtimestamp.txt
ENTRYPOINT ["tini", "--"]
# ENTRYPOINT ["tini", "--"]
CMD ["/home/pi/pialert/dockerfiles/start.sh"]
## command to build docker: DOCKER_BUILDKIT=1 docker build . --iidfile dockerID

501
back/pialert.conf_bak Executable file
View File

@@ -0,0 +1,501 @@
#-----------------AUTOGENERATED FILE-----------------#
# #
# Generated: 2023-10-15_07-24-10 #
# #
# Config file for the LAN intruder detection app: #
# https://github.com/jokob-sk/Pi.Alert #
# #
#-----------------AUTOGENERATED FILE-----------------#
# General
#---------------------------
LOG_LEVEL='debug'
LOG_LEVEL__metadata="{}"
TIMEZONE='Europe/Berlin'
TIMEZONE__metadata="{}"
PLUGINS_KEEP_HIST=250
PLUGINS_KEEP_HIST__metadata="{}"
PIALERT_WEB_PROTECTION=False
PIALERT_WEB_PROTECTION__metadata="{}"
PIALERT_WEB_PASSWORD='8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92'
PIALERT_WEB_PASSWORD__metadata="{}"
INCLUDED_SECTIONS=['new_devices','down_devices','events']
INCLUDED_SECTIONS__metadata="{}"
REPORT_DASHBOARD_URL='http://pi.alert'
REPORT_DASHBOARD_URL__metadata="{}"
DIG_GET_IP_ARG='-4 myip.opendns.com @resolver1.opendns.com'
DIG_GET_IP_ARG__metadata="{}"
UI_LANG='English'
UI_LANG__metadata="{}"
UI_PRESENCE=['online']
UI_PRESENCE__metadata="{}"
DAYS_TO_KEEP_EVENTS=90
DAYS_TO_KEEP_EVENTS__metadata="{}"
HRS_TO_KEEP_NEWDEV=0
HRS_TO_KEEP_NEWDEV__metadata="{}"
API_CUSTOM_SQL='SELECT * FROM Devices WHERE dev_PresentLastScan = 0'
API_CUSTOM_SQL__metadata="{}"
NETWORK_DEVICE_TYPES=['AP','Gateway','Firewall','Hypervisor','Powerline','Switch','WLAN','PLC','Router','USB LAN Adapter','USB WIFI Adapter','Internet']
NETWORK_DEVICE_TYPES__metadata="{}"
# ARPSCAN
#---------------------------
SCAN_SUBNETS=['192.168.1.0/24 --interface=eth1','192.168.1.0/24 --interface=eth0']
SCAN_SUBNETS__metadata="{}"
ARPSCAN_RUN='schedule'
ARPSCAN_RUN__metadata="{\"function\": \"RUN\", \"type\": \"text.select\", \"default_value\": \"schedule\", \"options\": [\"disabled\", \"once\", \"schedule\", \"always_after_scan\", \"on_new_device\"], \"localized\": [\"name\", \"description\"], \"events\": [\"run\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cuando ejecutar\"}, {\"language_code\": \"de_de\", \"string\": \"Wann ausf\\u00fchren\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Specify when your Network-discovery scan will run. Typical setting would be <code>schedule</code> and then you specify a cron-like schedule in the <a href=\\\"#ARPSCAN_RUN_SCHD\\\"><code>ARPSCAN_RUN_SCHD</code>setting</a> \"}, {\"language_code\": \"es_es\", \"string\": \"Especifique cu\\u00e1ndo se ejecutar\\u00e1 su an\\u00e1lisis de descubrimiento de red. La configuraci\\u00f3n t\\u00edpica ser\\u00eda <code>schedule</code> y luego se especifica una programaci\\u00f3n similar a cron en la configuraci\\u00f3n <a href=\\\"#ARPSCAN_RUN_SCHD\\\"><code>ARPSCAN_RUN_SCHD</code></a> \"}, {\"language_code\": \"de_de\", \"string\": \"Ausw\\u00e4hlen wann der Netzwerkscan laufen soll. Typischerweise wird <code>schedule</code> ausgew\\u00e4hlt und ein cron-Intervall in der <a href=\\\"#ARPSCAN_RUN_SCHD\\\"><code>ARPSCAN_RUN_SCHD</code>Einstellung</a> gesetzt.\"}]}"
ARPSCAN_CMD='python3 /home/pi/pialert/front/plugins/arp_scan/script.py userSubnets={subnets}'
ARPSCAN_CMD__metadata="{\"function\": \"CMD\", \"type\": \"readonly\", \"default_value\": \"python3 /home/pi/pialert/front/plugins/arp_scan/script.py userSubnets={subnets}\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run. This should not be changed\"}, {\"language_code\": \"es_es\", \"string\": \"Comando para ejecutar. Esto no debe ser cambiado\"}, {\"language_code\": \"de_de\", \"string\": \"Auszuf\\u00fchrender Befehl. Dieser sollte nicht ge\\u00e4ndert werden\"}]}"
ARPSCAN_RUN_TIMEOUT=300
ARPSCAN_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": \"integer\", \"default_value\": 300, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo l\\u00edmite de ejecuci\\u00f3n\"}, {\"language_code\": \"de_de\", \"string\": \"Zeitlimit\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo en segundos para esperar a que finalice el script. Si se supera este tiempo, se cancela el script.\"}, {\"language_code\": \"de_de\", \"string\": \"Maximale Zeit in Sekunden, die auf den Abschluss des Skripts gewartet werden soll. Bei \\u00dcberschreitung dieser Zeit wird das Skript abgebrochen.\"}]}"
ARPSCAN_RUN_SCHD='*/5 * * * *'
ARPSCAN_RUN_SCHD__metadata="{\"function\": \"RUN_SCHD\", \"type\": \"text\", \"default_value\": \"*/5 * * * *\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"es_es\", \"string\": \"Schedule\"}, {\"language_code\": \"de_de\", \"string\": \"Zeitplan\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Only enabled if you select <code>schedule</code> in the <a href=\\\"#ARPSCAN_RUN\\\"><code>ARPSCAN_RUN</code> setting</a>. Make sure you enter the schedule in the correct cron-like format (e.g. validate at <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). For example entering <code>*/3 * * * *</code> will run the scan every 3 minutes. Will be run NEXT time the time passes. <br/> It's recommended to use the same schedule interval for all plugins responsible for discovering new devices.\"}, {\"language_code\": \"es_es\", \"string\": \"Solo est\\u00e1 habilitado si selecciona <code>schedule</code> en la configuraci\\u00f3n <a href=\\\"#ARPSCAN_RUN\\\"><code>ARPSCAN_RUN</code></a>. Aseg\\u00farese de ingresar la programaci\\u00f3n en el formato similar a cron correcto (por ejemplo, valide en <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). Por ejemplo, ingresar <code>*/3 * * * *</code> ejecutar\\u00e1 el escaneo cada 3 minutos. Se ejecutar\\u00e1 la PR\\u00d3XIMA vez que pase el tiempo. <br/> Se recomienda utilizar el mismo intervalo de programaci\\u00f3n para todos los complementos que analizan su red.\"}, {\"language_code\": \"de_de\", \"string\": \"Nur aktiv, wenn <code>schedule</code> in der <a href=\\\"#ARPSCAN_RUN\\\"><code>ARPSCAN_RUN</code> Einstellung</a> ausgew\\u00e4hlt wurde. Sichergehen, dass das Intervall in einem korrekten cron-\\u00e4hnlichen Format angegeben wurde (z.B. auf <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a> testen). <code>*/3 * * * *</code> w\\u00fcrde den Scan alle 3 Minuten starten. Wird erst beim N\\u00c4CHSTEN Intervall ausgef\\u00fchrt. <br/>Es wird empfohlen, das Intervall aller Plugins, welche nach neuen Ger\\u00e4ten suchen, auf den gleichen Wert zu setzen.\"}]}"
ARPSCAN_WATCH=['Watched_Value1','Watched_Value2']
ARPSCAN_WATCH__metadata="{\"function\": \"WATCH\", \"type\": \"text.multiselect\", \"default_value\": [\"Watched_Value1\", \"Watched_Value2\"], \"options\": [\"Watched_Value1\", \"Watched_Value2\", \"Watched_Value3\", \"Watched_Value4\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Watched\"}, {\"language_code\": \"es_es\", \"string\": \"Watched\"}, {\"language_code\": \"de_de\", \"string\": \"\\u00dcberwacht\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification if selected values change. Use <code>CTRL + Click</code> to select/deselect. <ul> <li><code>Watched_Value1</code> is IP</li><li><code>Watched_Value2</code> is Vendor</li><li><code>Watched_Value3</code> is Interface </li><li><code>Watched_Value4</code> is N/A </li></ul>\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00eda una notificaci\\u00f3n si los valores seleccionados cambian. Utilice <code>CTRL + clic</code> para seleccionar/deseleccionar. <ul> <li><code>Valor_observado1</code> es IP</li><li><code>Valor_observado2</code> es Proveedor</li><li><code>Valor_observado3</code> es Interfaz </li><li><code>Valor_observado4</code> es N/A </li></ul>\"}, {\"language_code\": \"de_de\", \"string\": \"Sende eine Benachrichtigung, wenn ein ausgw\\u00e4hlter Wert sich \\u00e4ndert. <code>STRG + klicken</code> zum aus-/abw\\u00e4hlen. <ul> <li><code>Watched_Value1</code> ist die IP</li><li><code>Watched_Value2</code> ist der Hersteller</li><li><code>Watched_Value3</code> ist das Interface </li><li><code>Watched_Value4</code> ist nicht in Verwendung </li></ul>\"}]}"
ARPSCAN_REPORT_ON=['new']
ARPSCAN_REPORT_ON__metadata="{\"function\": \"REPORT_ON\", \"type\": \"text.multiselect\", \"default_value\": [\"new\"], \"options\": [\"new\", \"watched-changed\", \"watched-not-changed\", \"missing-in-last-scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Report on\"}, {\"language_code\": \"es_es\", \"string\": \"Informar sobre\"}, {\"language_code\": \"de_de\", \"string\": \"Benachrichtige wenn\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"When should notification be sent out.\"}, {\"language_code\": \"es_es\", \"string\": \"Cu\\u00e1ndo debe enviarse una notificaci\\u00f3n.\"}, {\"language_code\": \"de_de\", \"string\": \"Wann Benachrichtigungen gesendet werden sollen.\"}]}"
# Webhooks
#---------------------------
REPORT_WEBHOOK=False
REPORT_WEBHOOK__metadata="{}"
WEBHOOK_URL='http://n8n.local:5555/webhook-test/aaaaaaaa-aaaa-aaaa-aaaaa-aaaaaaaaaaaa'
WEBHOOK_URL__metadata="{}"
WEBHOOK_PAYLOAD='json'
WEBHOOK_PAYLOAD__metadata="{}"
WEBHOOK_REQUEST_METHOD='GET'
WEBHOOK_REQUEST_METHOD__metadata="{}"
WEBHOOK_SIZE=1024
WEBHOOK_SIZE__metadata="{}"
WEBHOOK_SECRET=''
WEBHOOK_SECRET__metadata="{}"
# NTFY
#---------------------------
REPORT_NTFY=False
REPORT_NTFY__metadata="{}"
NTFY_HOST='https://ntfy.sh'
NTFY_HOST__metadata="{}"
NTFY_TOPIC='replace_my_secure_topicname_91h889f28'
NTFY_TOPIC__metadata="{}"
NTFY_USER='user'
NTFY_USER__metadata="{}"
NTFY_PASSWORD='passw0rd'
NTFY_PASSWORD__metadata="{}"
# PUSHSAFER
#---------------------------
REPORT_PUSHSAFER=False
REPORT_PUSHSAFER__metadata="{}"
PUSHSAFER_TOKEN='ApiKey'
PUSHSAFER_TOKEN__metadata="{}"
# NMAP
#---------------------------
NMAP_RUN='disabled'
NMAP_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"run\"], \"type\": \"text.select\", \"default_value\": \"disabled\", \"options\": [\"disabled\", \"once\", \"schedule\", \"always_after_scan\", \"on_new_device\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cuando ejecutar\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Enable a regular Nmap scan on your network on all devices. The scheduling settings can be found below. If you select <code>once</code> Nmap is run only once on start for the time specified in <a href=\\\"#NMAP_TIMEOUT\\\"><code>NMAP_TIMEOUT</code> setting</a>.\"}, {\"language_code\": \"es_es\", \"string\": \"Habilite un escaneo regular de Nmap en su red en todos los dispositivos. Los ajustes de programaci\\u00f3n se pueden encontrar a continuaci\\u00f3n. Si selecciona <code>una vez</code>, Nmap se ejecuta solo una vez al inicio durante el tiempo especificado en la configuraci\\u00f3n de <a href=\\\"#NMAP_TIMEOUT\\\"><code>NMAP_TIMEOUT</code></a>\"}]}"
NMAP_CMD='python3 /home/pi/pialert/front/plugins/nmap_scan/script.py ips={ips} macs={macs} timeout={timeout} args={args}'
NMAP_CMD__metadata="{\"function\": \"CMD\", \"type\": \"text\", \"default_value\": \"python3 /home/pi/pialert/front/plugins/nmap_scan/script.py ips={ips} macs={macs} timeout={timeout} args={args}\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"SQL to run\"}, {\"language_code\": \"es_es\", \"string\": \"Consulta SQL\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"This calls the script responsible for executing the NMAP scan.\"}, {\"language_code\": \"es_es\", \"string\": \"Esto llama al script responsable de ejecutar el escaneo NMAP.\"}]}"
NMAP_ARGS='-p -10000'
NMAP_ARGS__metadata="{\"function\": \"ARGS\", \"type\": \"text\", \"default_value\": \"-p -10000\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Arguments\"}, {\"language_code\": \"es_es\", \"string\": \"Argumentos\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Arguments used to run the Nmap scan. Be careful to specify <a href=\\\"https://linux.die.net/man/1/nmap\\\" target=\\\"_blank\\\">the arguments</a> correctly. For example <code>-p -10000</code> scans ports from 1 to 10000.\"}, {\"language_code\": \"es_es\", \"string\": \"Argumentos utilizados para ejecutar el an\\u00e1lisis de Nmap. Tenga cuidado de especificar <a href=\\\"https://linux.die.net/man/1/nmap\\\" target=\\\"_blank\\\">los argumentos</a> correctamente. Por ejemplo, <code>-p -10000</code> escanea los puertos del 1 al 10000.\"}]}"
NMAP_RUN_SCHD='0 2 * * *'
NMAP_RUN_SCHD__metadata="{\"function\": \"RUN_SCHD\", \"type\": \"text\", \"default_value\": \"0 2 * * *\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"es_es\", \"string\": \"Schedule\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Only enabled if you select <code>schedule</code> in the <a href=\\\"#NMAP_RUN\\\"><code>NMAP_RUN</code> setting</a>. Make sure you enter the schedule in the correct cron-like format.\"}, {\"language_code\": \"es_es\", \"string\": \"Solo est\\u00e1 habilitado si selecciona <code>programar</code> en la configuraci\\u00f3n de <a href=\\\"#NMAP_RUN\\\"><code>NMAP_RUN</code></a>. Aseg\\u00farese de ingresar el cronograma en el formato tipo cron correcto.\"}]}"
NMAP_RUN_TIMEOUT=30
NMAP_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": \"integer\", \"default_value\": 30, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo l\\u00edmite de ejecuci\\u00f3n\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Max run time per device in seconds.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo de ejecuci\\u00f3n por dispositivo en segundos.\"}]}"
NMAP_WATCH=['Watched_Value1']
NMAP_WATCH__metadata="{\"function\": \"WATCH\", \"type\": \"text.multiselect\", \"default_value\": [\"Watched_Value1\"], \"options\": [\"Watched_Value1\", \"Watched_Value2\", \"Watched_Value3\", \"Watched_Value4\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Watched\"}, {\"language_code\": \"es_es\", \"string\": \"Visto\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification if selected values change. Use <code>CTRL + Click</code> to select/deselect. <ul> <li><code>Watched_Value1</code> is service type (e.g.: http, ssh)</li><li><code>Watched_Value2</code> is Status (open or closed)</li><li><code>Watched_Value3</code> unused </li><li><code>Watched_Value4</code> unused </li></ul>\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00ede una notificaci\\u00f3n si los valores seleccionados cambian. Utilice <code>CTRL + clic</code> para seleccionar/deseleccionar. <ul> <li><code>Watched_Value1</code> es el tipo de servicio (p. ej., http, ssh)</li><li><code>Watched_Value2</code> es el estado (abierto o cerrado)</li> <li><code>Watched_Value3</code> no utilizado </li><li><code>Watched_Value4</code> no utilizado </li></ul>\"}]}"
NMAP_REPORT_ON=['new','watched-changed']
NMAP_REPORT_ON__metadata="{\"function\": \"REPORT_ON\", \"type\": \"text.multiselect\", \"default_value\": [\"new\", \"watched-changed\"], \"options\": [\"new\", \"watched-changed\", \"watched-not-changed\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Report on\"}, {\"language_code\": \"es_es\", \"string\": \"Informar sobre\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification only on these statuses. <code>new</code> means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered. <code>watched-changed</code> means that selected <code>Watched_ValueN</code> columns changed.\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00ede una notificaci\\u00f3n solo en estos estados. <code>new</code> significa que se descubri\\u00f3 un nuevo objeto \\u00fanico (combinaci\\u00f3n \\u00fanica de PrimaryId y SecondaryId). <code>watched-changed</code> significa que seleccion\\u00f3 <code>Watched_ValueN Las columnas </code> cambiaron.\"}]}"
# DBCLNP
#---------------------------
DBCLNP_RUN='schedule'
DBCLNP_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"run\"], \"type\": \"text.select\", \"default_value\": \"schedule\", \"options\": [\"disabled\", \"once\", \"schedule\", \"always_after_scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cu\\u00e1ndo ejecutar\"}, {\"language_code\": \"de_de\", \"string\": \"Wann laufen\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"When the cleanup should be performed. An hourly or daily <code>SCHEDULE</code> is a good option.\"}]}"
DBCLNP_CMD='python3 /home/pi/pialert/front/plugins/db_cleanup/script.py pluginskeephistory={pluginskeephistory} hourstokeepnewdevice={hourstokeepnewdevice} daystokeepevents={daystokeepevents} pholuskeepdays={pholuskeepdays}'
DBCLNP_CMD__metadata="{\"function\": \"CMD\", \"type\": \"readonly\", \"default_value\": \"python3 /home/pi/pialert/front/plugins/db_cleanup/script.py pluginskeephistory={pluginskeephistory} hourstokeepnewdevice={hourstokeepnewdevice} daystokeepevents={daystokeepevents} pholuskeepdays={pholuskeepdays}\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run. This can not be changed\"}, {\"language_code\": \"es_es\", \"string\": \"Comando a ejecutar. Esto no se puede cambiar\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl zum Ausf\\u00fchren. Dies kann nicht ge\\u00e4ndert werden\"}]}"
DBCLNP_RUN_SCHD='*/30 * * * *'
DBCLNP_RUN_SCHD__metadata="{\"function\": \"RUN_SCHD\", \"type\": \"text\", \"default_value\": \"*/30 * * * *\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"es_es\", \"string\": \"Schedule\"}, {\"language_code\": \"de_de\", \"string\": \"Schedule\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Only enabled if you select <code>schedule</code> in the <a href=\\\"#DBCLNP_RUN\\\"><code>DBCLNP_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.\"}, {\"language_code\": \"es_es\", \"string\": \"Solo est\\u00e1 habilitado si selecciona <code>schedule</code> en la configuraci\\u00f3n <a href=\\\"#DBCLNP_RUN\\\"><code>DBCLNP_RUN</code></a>. Aseg\\u00farese de ingresar la programaci\\u00f3n en el formato similar a cron correcto (por ejemplo, valide en <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutar\\u00e1 el escaneo despu\\u00e9s de las 4 a.m. en el <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\"><code>TIMEZONE</ c\\u00f3digo> que configur\\u00f3 arriba</a>. Se ejecutar\\u00e1 la PR\\u00d3XIMA vez que pase el tiempo.\"}, {\"language_code\": \"de_de\", \"string\": \"Nur aktiviert, wenn Sie <code>schedule</code> in der <a href=\\\"#DBCLNP_RUN\\\"><code>DBCLNP_RUN</code>-Einstellung</a> ausw\\u00e4hlen. Stellen Sie sicher, dass Sie den Zeitplan im richtigen Cron-\\u00e4hnlichen Format eingeben (z. B. validieren unter <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). Wenn Sie beispielsweise <code>0 4 * * *</code> eingeben, wird der Scan nach 4 Uhr morgens in der <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\"><code>TIMEZONE</ ausgef\\u00fchrt. Code> den Sie oben festgelegt haben</a>. Wird das N\\u00c4CHSTE Mal ausgef\\u00fchrt, wenn die Zeit vergeht.\"}]}"
DBCLNP_RUN_TIMEOUT=30
DBCLNP_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": \"integer\", \"default_value\": 30, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo l\\u00edmite de ejecuci\\u00f3n\"}, {\"language_code\": \"de_de\", \"string\": \"Zeit\\u00fcberschreitung\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela.\"}, {\"language_code\": \"de_de\", \"string\": \"Maximale Zeit in Sekunden, die auf den Abschluss des Skripts gewartet werden soll. Bei \\u00dcberschreitung dieser Zeit wird das Skript abgebrochen.\"}]}"
# CSVBCKP
#---------------------------
CSVBCKP_RUN='schedule'
CSVBCKP_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"run\"], \"type\": \"text.select\", \"default_value\": \"schedule\", \"options\": [\"disabled\", \"once\", \"schedule\", \"always_after_scan\", \"on_new_device\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cu\\u00e1ndo ejecutar\"}, {\"language_code\": \"de_de\", \"string\": \"Wann laufen\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"When the backup should be created. A daily or weekly <code>SCHEDULE</code> is a good option.\"}, {\"language_code\": \"es_es\", \"string\": \"Cu\\u00e1ndo se debe crear la copia de seguridad. Un <code>SCHEDULE</code> diario o semanal es una buena opci\\u00f3n.\"}, {\"language_code\": \"de_de\", \"string\": \"Wann das Backup erstellt werden soll. Ein t\\u00e4glicher oder w\\u00f6chentlicher <code>SCHEDULE</code> ist eine gute Option.\"}]}"
CSVBCKP_CMD='python3 /home/pi/pialert/front/plugins/csv_backup/script.py overwrite={overwrite} location={location}'
CSVBCKP_CMD__metadata="{\"function\": \"CMD\", \"type\": \"readonly\", \"default_value\": \"python3 /home/pi/pialert/front/plugins/csv_backup/script.py overwrite={overwrite} location={location}\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run. This can not be changed\"}, {\"language_code\": \"es_es\", \"string\": \"Comando a ejecutar. Esto no se puede cambiar\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl zum Ausf\\u00fchren. Dies kann nicht ge\\u00e4ndert werden\"}]}"
CSVBCKP_RUN_SCHD='0 2 * * 3'
CSVBCKP_RUN_SCHD__metadata="{\"function\": \"RUN_SCHD\", \"type\": \"text\", \"default_value\": \"0 2 * * 3\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"es_es\", \"string\": \"Schedule\"}, {\"language_code\": \"de_de\", \"string\": \"Schedule\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Only enabled if you select <code>schedule</code> in the <a href=\\\"#CSVBCKP_RUN\\\"><code>CSVBCKP_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.\"}, {\"language_code\": \"es_es\", \"string\": \"Solo est\\u00e1 habilitado si selecciona <code>schedule</code> en la configuraci\\u00f3n <a href=\\\"#CSVBCKP_RUN\\\"><code>CSVBCKP_RUN</code></a>. Aseg\\u00farese de ingresar la programaci\\u00f3n en el formato similar a cron correcto (por ejemplo, valide en <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutar\\u00e1 el escaneo despu\\u00e9s de las 4 a.m. en el <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\"><code>TIMEZONE</ c\\u00f3digo> que configur\\u00f3 arriba</a>. Se ejecutar\\u00e1 la PR\\u00d3XIMA vez que pase el tiempo.\"}, {\"language_code\": \"de_de\", \"string\": \"Nur aktiviert, wenn Sie <code>schedule</code> in der <a href=\\\"#CSVBCKP_RUN\\\"><code>CSVBCKP_RUN</code>-Einstellung</a> ausw\\u00e4hlen. Stellen Sie sicher, dass Sie den Zeitplan im richtigen Cron-\\u00e4hnlichen Format eingeben (z. B. validieren unter <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). Wenn Sie beispielsweise <code>0 4 * * *</code> eingeben, wird der Scan nach 4 Uhr morgens in der <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\"><code>TIMEZONE</ ausgef\\u00fchrt. Code> den Sie oben festgelegt haben</a>. Wird das N\\u00c4CHSTE Mal ausgef\\u00fchrt, wenn die Zeit vergeht.\"}]}"
CSVBCKP_RUN_TIMEOUT=30
CSVBCKP_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": \"integer\", \"default_value\": 30, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo l\\u00edmite de ejecuci\\u00f3n\"}, {\"language_code\": \"de_de\", \"string\": \"Zeit\\u00fcberschreitung\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela.\"}, {\"language_code\": \"de_de\", \"string\": \"Maximale Zeit in Sekunden, die auf den Abschluss des Skripts gewartet werden soll. Bei \\u00dcberschreitung dieser Zeit wird das Skript abgebrochen.\"}]}"
CSVBCKP_overwrite=False
CSVBCKP_overwrite__metadata="{\"function\": \"overwrite\", \"type\": \"boolean\", \"default_value\": false, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Overwrite file\"}, {\"language_code\": \"es_es\", \"string\": \"Sobrescribir archivo\"}, {\"language_code\": \"de_de\", \"string\": \"Datei \\u00fcberschreiben\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"If the <code>devices.csv</code> file should be always overwritten. If disabled, the date and time is added to the name.\"}, {\"language_code\": \"es_es\", \"string\": \"Si el archivo <code>devices.csv</code> siempre debe sobrescribirse. Si est\\u00e1 deshabilitado, la fecha y la hora se agregan al nombre.\"}, {\"language_code\": \"de_de\", \"string\": \"Wenn die Datei <code>devices.csv</code> immer \\u00fcberschrieben werden soll. Wenn deaktiviert, werden dem Namen Datum und Uhrzeit hinzugef\\u00fcgt.\"}]}"
CSVBCKP_location='/home/pi/pialert/config'
CSVBCKP_location__metadata="{\"function\": \"location\", \"type\": \"text\", \"default_value\": \"/home/pi/pialert/config\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"File location\"}, {\"language_code\": \"es_es\", \"string\": \"Ubicaci\\u00f3n del archivo\"}, {\"language_code\": \"de_de\", \"string\": \"Speicherort\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Where the <code>devices.csv</code> file should be saved. For example <code>/home/pi/pialert/config</code>.\"}, {\"language_code\": \"es_es\", \"string\": \"Donde se debe guardar el archivo <code>devices.csv</code>. Por ejemplo <code>/home/pi/pialert/config</code>.\"}, {\"language_code\": \"de_de\", \"string\": \"Wo die Datei <code>devices.csv</code> gespeichert werden soll. Zum Beispiel <code>/home/pi/pialert/config</code>.\"}]}"
# VNDRPDT
#---------------------------
VNDRPDT_RUN='disabled'
VNDRPDT_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"run\"], \"type\": \"text.select\", \"default_value\": \"schedule\", \"options\": [\"disabled\", \"once\", \"schedule\", \"always_after_scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cu\\u00e1ndo ejecutar\"}, {\"language_code\": \"de_de\", \"string\": \"Wann ausf\\u00fchren\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"When the plugin should run. An overnight weekly <code>SCHEDULE</code> is recommended.\"}, {\"language_code\": \"de_de\", \"string\": \"Wann das Plugin ausgef\\u00fchrt werden soll. Eine w\\u00f6chentliche <code>SCHEDULE</code> in der Nacht wird empfohlen.\"}]}"
VNDRPDT_CMD='python3 /home/pi/pialert/front/plugins/vendor_update/script.py'
VNDRPDT_CMD__metadata="{\"function\": \"CMD\", \"type\": \"readonly\", \"default_value\": \"python3 /home/pi/pialert/front/plugins/vendor_update/script.py\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run. This can not be changed\"}, {\"language_code\": \"es_es\", \"string\": \"Comando a ejecutar. Esto no se puede cambiar\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl zum Ausf\\u00fchren. Dies kann nicht ge\\u00e4ndert werden\"}]}"
VNDRPDT_RUN_SCHD='0 4 * * 3'
VNDRPDT_RUN_SCHD__metadata="{\"function\": \"RUN_SCHD\", \"type\": \"text\", \"default_value\": \"0 4 * * 3\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"es_es\", \"string\": \"Schedule\"}, {\"language_code\": \"de_de\", \"string\": \"Zeitplan\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Only enabled if you select <code>schedule</code> in the <a href=\\\"#VNDRPDT_RUN\\\"><code>VNDRPDT_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.\"}, {\"language_code\": \"es_es\", \"string\": \"Solo est\\u00e1 habilitado si selecciona <code>schedule</code> en la configuraci\\u00f3n <a href=\\\"#VNDRPDT_RUN\\\"><code>VNDRPDT_RUN</code></a>. Aseg\\u00farese de ingresar la programaci\\u00f3n en el formato similar a cron correcto (por ejemplo, valide en <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutar\\u00e1 el escaneo despu\\u00e9s de las 4 a.m. en el <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\"><code>TIMEZONE</ c\\u00f3digo> que configur\\u00f3 arriba</a>. Se ejecutar\\u00e1 la PR\\u00d3XIMA vez que pase el tiempo.\"}, {\"language_code\": \"de_de\", \"string\": \"Nur aktiv, wenn <code>schedule</code> in der <a href=\\\"#VNDRPDT_RUN\\\"><code>VNDRPDT_RUN</code> Einstellung</a> ausgew\\u00e4hlt wurde. Sichergehen, dass das Intervall in einem korrekten cron-\\u00e4hnlichen Format angegeben wurde (z.B. auf <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a> testen). <code>0 4 * * *</code> w\\u00fcrde den Scan t\\u00e4glich um 4 Uhr in der <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\">oben ausgew\\u00e4hlten <code>TIMEZONE</code></a> starten. Wird erst beim N\\u00c4CHSTEN Intervall ausgef\\u00fchrt. <br/>Es wird empfohlen, das Intervall aller Plugins, welche nach neuen Ger\\u00e4ten suchen, auf den gleichen Wert zu setzen.\"}]}"
VNDRPDT_RUN_TIMEOUT=600
VNDRPDT_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": \"integer\", \"default_value\": 600, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo l\\u00edmite de ejecuci\\u00f3n\"}, {\"language_code\": \"de_de\", \"string\": \"Zeit\\u00fcberschreitung\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela.\"}, {\"language_code\": \"de_de\", \"string\": \"Maximale Zeit in Sekunden, die auf den Abschluss des Skripts gewartet werden soll. Bei \\u00dcberschreitung dieser Zeit wird das Skript abgebrochen.\"}]}"
VNDRPDT_WATCH=['Watched_Value1']
VNDRPDT_WATCH__metadata="{\"function\": \"WATCH\", \"type\": \"text.multiselect\", \"default_value\": [\"Watched_Value1\"], \"options\": [\"Watched_Value1\", \"Watched_Value2\", \"Watched_Value3\", \"Watched_Value4\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Watched\"}, {\"language_code\": \"es_es\", \"string\": \"Visto\"}, {\"language_code\": \"de_de\", \"string\": \"\\u00dcberwacht\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification if selected values change. Use <code>CTRL + Click</code> to select/deselect. <ul> <li><code>Watched_Value1</code> is vendor name</li><li><code>Watched_Value2</code> is device name</li><li><code>Watched_Value3</code> unused </li><li><code>Watched_Value4</code> unused </li></ul>\"}, {\"language_code\": \"de_de\", \"string\": \"Sende eine Benachrichtigung, wenn ein ausgw\\u00e4hlter Wert sich \\u00e4ndert. <code>STRG + klicken</code> zum aus-/abw\\u00e4hlen. <ul> <li><code>Watched_Value1</code> ist der Herstellername</li><li><code>Watched_Value2</code> ist der Ger\\u00e4tename</li><li><code>Watched_Value3</code> ist nicht in Verwendung </li><li><code>Watched_Value4</code> ist nicht in Verwendung </li></ul>\"}]}"
VNDRPDT_REPORT_ON=['new','watched-changed']
VNDRPDT_REPORT_ON__metadata="{\"function\": \"REPORT_ON\", \"type\": \"text.multiselect\", \"default_value\": [\"new\", \"watched-changed\"], \"options\": [\"new\", \"watched-changed\", \"watched-not-changed\", \"missing-in-last-scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Report on\"}, {\"language_code\": \"es_es\", \"string\": \"Informar sobre\"}, {\"language_code\": \"de_de\", \"string\": \"Benachrichtige wenn\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification only on these statuses. <code>new</code> means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered. <code>watched-changed</code> means that selected <code>Watched_ValueN</code> columns changed.\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00ede una notificaci\\u00f3n solo en estos estados. <code>new</code> significa que se descubri\\u00f3 un nuevo objeto \\u00fanico (combinaci\\u00f3n \\u00fanica de PrimaryId y SecondaryId). <code>watched-changed</code> significa que seleccion\\u00f3 <code>Watched_ValueN Las columnas </code> cambiaron.\"}, {\"language_code\": \"de_de\", \"string\": \"Benachrichtige nur bei diesen Status. <code>new</code> bedeutet ein neues eindeutiges (einzigartige Kombination aus PrimaryId und SecondaryId) Objekt wurde erkennt. <code>watched-changed</code> bedeutet eine ausgew\\u00e4hlte <code>Watched_ValueN</code>-Spalte hat sich ge\\u00e4ndert.\"}]}"
# DDNS
#---------------------------
DDNS_RUN='disabled'
DDNS_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"run\"], \"type\": \"text.select\", \"default_value\": \"disabled\", \"options\": [\"disabled\", \"once\", \"schedule\", \"always_after_scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cu\\u00e1ndo ejecutar\"}, {\"language_code\": \"de_de\", \"string\": \"Wann ausf\\u00fchren\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"When the plugin should run. An hourly or daily <code>SCHEDULE</code> is a good option.\"}, {\"language_code\": \"de_de\", \"string\": \"Wann das Plugin ausgef\\u00fchrt werden soll. Eine st\\u00fcndliche oder t\\u00e4gliche <code>SCHEDULE</code> wird empfohlen.\"}]}"
DDNS_CMD='python3 /home/pi/pialert/front/plugins/ddns_update/script.py prev_ip={prev_ip} DDNS_UPDATE_URL={DDNS_UPDATE_URL} DDNS_USER={DDNS_USER} DDNS_PASSWORD={DDNS_PASSWORD} DDNS_DOMAIN={DDNS_DOMAIN} '
DDNS_CMD__metadata="{\"function\": \"CMD\", \"type\": \"readonly\", \"default_value\": \"python3 /home/pi/pialert/front/plugins/ddns_update/script.py prev_ip={prev_ip} DDNS_UPDATE_URL={DDNS_UPDATE_URL} DDNS_USER={DDNS_USER} DDNS_PASSWORD={DDNS_PASSWORD} DDNS_DOMAIN={DDNS_DOMAIN} \", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run. This can not be changed\"}, {\"language_code\": \"es_es\", \"string\": \"Comando a ejecutar. Esto no se puede cambiar\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl zum Ausf\\u00fchren. Dies kann nicht ge\\u00e4ndert werden\"}]}"
DDNS_RUN_SCHD='*/5 * * * *'
DDNS_RUN_SCHD__metadata="{\"function\": \"RUN_SCHD\", \"type\": \"text\", \"default_value\": \"*/5 * * * *\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"es_es\", \"string\": \"Schedule\"}, {\"language_code\": \"de_de\", \"string\": \"Zeitplan\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Only enabled if you select <code>schedule</code> in the <a href=\\\"#DDNS_RUN\\\"><code>DDNS_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.\"}, {\"language_code\": \"es_es\", \"string\": \"Solo est\\u00e1 habilitado si selecciona <code>schedule</code> en la configuraci\\u00f3n <a href=\\\"#DDNS_RUN\\\"><code>DDNS_RUN</code></a>. Aseg\\u00farese de ingresar la programaci\\u00f3n en el formato similar a cron correcto (por ejemplo, valide en <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutar\\u00e1 el escaneo despu\\u00e9s de las 4 a.m. en el <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\"><code>TIMEZONE</ c\\u00f3digo> que configur\\u00f3 arriba</a>. Se ejecutar\\u00e1 la PR\\u00d3XIMA vez que pase el tiempo.\"}, {\"language_code\": \"de_de\", \"string\": \"Nur aktiv, wenn <code>schedule</code> in der <a href=\\\"#DDNS_RUN\\\"><code>DDNS_RUN</code> Einstellung</a> ausgew\\u00e4hlt wurde. Sichergehen, dass das Intervall in einem korrekten cron-\\u00e4hnlichen Format angegeben wurde (z.B. auf <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a> testen). <code>0 4 * * *</code> w\\u00fcrde den Scan t\\u00e4glich um 4 Uhr in der <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\">oben ausgew\\u00e4hlten <code>TIMEZONE</code></a> starten. Wird erst beim N\\u00c4CHSTEN Intervall ausgef\\u00fchrt.\"}]}"
DDNS_RUN_TIMEOUT=30
DDNS_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": \"integer\", \"default_value\": 30, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo l\\u00edmite de ejecuci\\u00f3n\"}, {\"language_code\": \"de_de\", \"string\": \"Zeitlimit\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela.\"}, {\"language_code\": \"de_de\", \"string\": \"Maximale Zeit in Sekunden, die auf den Abschluss des Skripts gewartet werden soll. Bei \\u00dcberschreitung dieser Zeit wird das Skript abgebrochen.\"}]}"
DDNS_DOMAIN='your_domain.freeddns.org'
DDNS_DOMAIN__metadata="{\"function\": \"DOMAIN\", \"type\": \"text\", \"default_value\": \"your_domain.freeddns.org\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"DynDNS domain URL\"}, {\"language_code\": \"es_es\", \"string\": \"URL del dominio DynDNS\"}, {\"language_code\": \"de_de\", \"string\": \"DynDNS Domain URL\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"DynDNS host URL (do not include http:// or https://).\"}, {\"language_code\": \"es_es\", \"string\": \"URL del host DynDNS (no incluya http:// o https://).\"}, {\"language_code\": \"de_de\", \"string\": \"DynDNS Host URL (do not include http:// or https://).\"}]}"
DDNS_USER='dynu_user'
DDNS_USER__metadata="{\"function\": \"USER\", \"type\": \"text\", \"default_value\": \"dynu_user\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"DynDNS user\"}, {\"language_code\": \"es_es\", \"string\": \"Usuario de DynDNS\"}, {\"language_code\": \"de_de\", \"string\": \"DynDNS Benutzer\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The username used to login to the DynDNS service (sometimes a full email address).\"}, {\"language_code\": \"es_es\", \"string\": \"El nombre de usuario utilizado para iniciar sesi\\u00f3n en el servicio DynDNS (a veces, una direcci\\u00f3n de correo electr\\u00f3nico completa).\"}, {\"language_code\": \"de_de\", \"string\": \"Benutzername, welcher zum Login beim DynDNS-Service verwendet wird (manchmal die E-Mail-Adresse).\"}]}"
DDNS_PASSWORD='A0000000B0000000C0000000D0000000'
DDNS_PASSWORD__metadata="{\"function\": \"PASSWORD\", \"type\": \"password\", \"default_value\": \"A0000000B0000000C0000000D0000000\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"DynDNS password\"}, {\"language_code\": \"es_es\", \"string\": \"Contrase\\u00f1a de DynDNS\"}, {\"language_code\": \"de_de\", \"string\": \"DynDNS Passwort\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The DynDNS service access password\"}, {\"language_code\": \"es_es\", \"string\": \"La contrase\\u00f1a de acceso al servicio DynDNS.\"}, {\"language_code\": \"de_de\", \"string\": \"Passwort, welches zum Login beim DynDNS-Service verwendet wird.\"}]}"
DDNS_UPDATE_URL='https://api.dynu.com/nic/update?'
DDNS_UPDATE_URL__metadata="{\"function\": \"UPDATE_URL\", \"type\": \"text\", \"default_value\": \"https://api.dynu.com/nic/update?\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"DynDNS update URL\"}, {\"language_code\": \"es_es\", \"string\": \"URL de actualizaci\\u00f3n de DynDNS\"}, {\"language_code\": \"de_de\", \"string\": \"DynDNS Aktualisierungs-URL\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Update URL starting with <code>http://</code> or <code>https://</code>.\"}, {\"language_code\": \"es_es\", \"string\": \"Actualice la URL que comienza con <code>http://</code> o <code>https://</code>.\"}, {\"language_code\": \"de_de\", \"string\": \"Aktualisierungs-URL beginnend mit <code>http://</code> oder <code>https://</code>.\"}]}"
DDNS_WATCH=['Watched_Value1']
DDNS_WATCH__metadata="{\"function\": \"WATCH\", \"type\": \"text.multiselect\", \"default_value\": [\"Watched_Value1\"], \"options\": [\"Watched_Value1\", \"Watched_Value2\", \"Watched_Value3\", \"Watched_Value4\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Watched\"}, {\"language_code\": \"es_es\", \"string\": \"Visto\"}, {\"language_code\": \"de_de\", \"string\": \"\\u00dcberwacht\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification if selected values change. Use <code>CTRL + Click</code> to select/deselect. <ul> <li><code>Watched_Value1</code> is Previous IP (not recommended)</li><li><code>Watched_Value2</code> unused</li><li><code>Watched_Value3</code> unused </li><li><code>Watched_Value4</code> unused </li></ul>\"}, {\"language_code\": \"de_de\", \"string\": \"Sende eine Benachrichtigung, wenn ein ausgw\\u00e4hlter Wert sich \\u00e4ndert. <code>STRG + klicken</code> zum aus-/abw\\u00e4hlen. <ul> <li><code>Watched_Value1</code> ist die Vorige IP (nicht empfohlen)</li><li><code>Watched_Value2</code> ist nicht in Verwendung</li><li><code>Watched_Value3</code> ist nicht in Verwendung </li><li><code>Watched_Value4</code> ist nicht in Verwendung </li></ul>\"}]}"
DDNS_REPORT_ON=['new','watched-changed']
DDNS_REPORT_ON__metadata="{\"function\": \"REPORT_ON\", \"type\": \"text.multiselect\", \"default_value\": [\"new\", \"watched-changed\"], \"options\": [\"new\", \"watched-changed\", \"watched-not-changed\", \"missing-in-last-scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Report on\"}, {\"language_code\": \"es_es\", \"string\": \"Informar sobre\"}, {\"language_code\": \"de_de\", \"string\": \"Benachrichtige wenn\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification only on these statuses. <code>new</code> means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered. <code>watched-changed</code> means that selected <code>Watched_ValueN</code> columns changed.\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00ede una notificaci\\u00f3n solo en estos estados. <code>new</code> significa que se descubri\\u00f3 un nuevo objeto \\u00fanico (una combinaci\\u00f3n \\u00fanica de PrimaryId y SecondaryId). <code>watched-changed</code> significa que las columnas <code>Watched_ValueN</code> seleccionadas cambiaron.\"}, {\"language_code\": \"de_de\", \"string\": \"Benachrichtige nur bei diesen Status. <code>new</code> bedeutet ein neues eindeutiges (einzigartige Kombination aus PrimaryId und SecondaryId) Objekt wurde erkennt. <code>watched-changed</code> bedeutet eine ausgew\\u00e4hlte <code>Watched_ValueN</code>-Spalte hat sich ge\\u00e4ndert.\"}]}"
# SNMPDSC
#---------------------------
SNMPDSC_RUN='disabled'
SNMPDSC_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"run\"], \"type\": \"text.select\", \"default_value\": \"disabled\", \"options\": [\"disabled\", \"once\", \"schedule\", \"always_after_scan\", \"on_new_device\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cu\\u00e1ndo ejecutar\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Enable import of devices from a SNMP enabled device. If you select <code>schedule</code> the scheduling settings from below are applied. If you select <code>once</code> the scan is run only once on start of the application (container) or after you update your settings.\"}, {\"language_code\": \"es_es\", \"string\": \"Habilite la importaci\\u00f3n de dispositivos desde un dispositivo habilitado para SNMP. Si selecciona <code>schedule</code>, se aplican las configuraciones de programaci\\u00f3n de abajo. Si selecciona <code>once</code>, el an\\u00e1lisis se ejecuta solo una vez al inicio de la aplicaci\\u00f3n (contenedor) o despu\\u00e9s de actualizar su configuraci\\u00f3n.\"}]}"
SNMPDSC_CMD='python3 /home/pi/pialert/front/plugins/snmp_discovery/script.py routers={s-quote}{routers}{s-quote}'
SNMPDSC_CMD__metadata="{\"function\": \"CMD\", \"type\": \"text\", \"default_value\": \"python3 /home/pi/pialert/front/plugins/snmp_discovery/script.py routers={s-quote}{routers}{s-quote}\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run. Not recommended to change.\"}, {\"language_code\": \"es_es\", \"string\": \"Comando para ejecutar. No se recomienda cambiar.\"}]}"
SNMPDSC_routers=['snmpwalk -v 2c -c public -OXsq 192.168.1.1 .1.3.6.1.2.1.3.1.1.2']
SNMPDSC_routers__metadata="{\"function\": \"routers\", \"type\": \"list\", \"default_value\": [\"snmpwalk -v 2c -c public -OXsq 192.168.1.1 .1.3.6.1.2.1.3.1.1.2\"], \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Routers\"}, {\"language_code\": \"es_es\", \"string\": \"Routers\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"A list of <code>snmpwalk</code> commands to execute against IP addresses of roputers/switches with SNMP turned on. <br/> <br/> Example with the router on the IP <code>192.168.1.1</code>: <br/> <code>snmpwalk -v 2c -c public -OXsq 192.168.1.1 .1.3.6.1.2.1.3.1.1.2</code> <br/><br/> Only IPv4 supported. Authentication is not supported. More info on the plugin <a href='https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins/snmp_discovery' target='_blank'>here</a>.\"}, {\"language_code\": \"es_es\", \"string\": \"Una lista de comandos <code>snmpwalk</code> para ejecutar en direcciones IP de computadoras/conmutadores con SNMP activado. <br/> <br/> Ejemplo con el enrutador en la IP <code>192.168.1.1</code>: <br/> <code>snmpwalk -v 2c -c public -OXsq 192.168.1.1 .1.3.6.1. 2.1.3.1.1.2</code> <br/><br/> Solo se admite IPv4. No se admite la autenticaci\\u00f3n. M\\u00e1s informaci\\u00f3n sobre el complemento <a href='https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins/snmp_discovery' target='_blank'>aqu\\u00ed</a>.\"}]}"
SNMPDSC_RUN_SCHD='0 2 * * *'
SNMPDSC_RUN_SCHD__metadata="{\"function\": \"RUN_SCHD\", \"type\": \"text\", \"default_value\": \"0 2 * * *\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"es_es\", \"string\": \"Schedule\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Only enabled if you select <code>schedule</code> in the <a href=\\\"#SNMPDSC_RUN\\\"><code>SNMPDSC_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. <br/> It's recommended to use the same schedule interval for all plugins responsible for discovering new devices. \"}, {\"language_code\": \"es_es\", \"string\": \"Solo est\\u00e1 habilitado si selecciona <code>schedule</code> en la configuraci\\u00f3n <a href=\\\"#SNMPDSC_RUN\\\"><code>SNMPDSC_RUN</code></a>. Aseg\\u00farese de ingresar la programaci\\u00f3n en el formato similar a cron correcto (por ejemplo, valide en <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutar\\u00e1 el escaneo despu\\u00e9s de las 4 a.m. en el <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\"><code>TIMEZONE</ c\\u00f3digo> que configur\\u00f3 arriba</a>. Se ejecutar\\u00e1 la PR\\u00d3XIMA vez que pase el tiempo.\"}]}"
SNMPDSC_RUN_TIMEOUT=5
SNMPDSC_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": \"integer\", \"default_value\": 5, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo de espera de ejecuci\\u00f3n\"}, {\"language_code\": \"de_de\", \"string\": \"Wartezeit\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo en segundos para esperar a que finalice el script. Si se excede este tiempo, el script se cancela..\"}]}"
SNMPDSC_WATCH=['Watched_Value1']
SNMPDSC_WATCH__metadata="{\"function\": \"WATCH\", \"type\": \"text.multiselect\", \"default_value\": [\"Watched_Value1\"], \"options\": [\"Watched_Value1\", \"Watched_Value2\", \"Watched_Value3\", \"Watched_Value4\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Watched\"}, {\"language_code\": \"es_es\", \"string\": \"Visto\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification if selected values change. Use <code>CTRL + Click</code> to select/deselect. <ul> <li><code>Watched_Value1</code> is Hostname (not discoverable) </li><li><code>Watched_Value2</code> is Router IP </li><li><code>Watched_Value3</code> is not used </li><li><code>Watched_Value4</code> is not used </li></ul>\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00ede una notificaci\\u00f3n si los valores seleccionados cambian. Utilice <code>CTRL + clic</code> para seleccionar/deseleccionar. <ul> <li><code>Watched_Value1</code> es el nombre de host (no detectable) </li><li><code>Watched_Value2</code> es la IP del enrutador </li><li><code>Watched_Value3< /code> no se utiliza </li><li><code>Watched_Value4</code> no se utiliza </li></ul>\"}]}"
SNMPDSC_REPORT_ON=['new','watched-changed']
SNMPDSC_REPORT_ON__metadata="{\"function\": \"REPORT_ON\", \"type\": \"text.multiselect\", \"default_value\": [\"new\", \"watched-changed\"], \"options\": [\"new\", \"watched-changed\", \"watched-not-changed\", \"missing-in-last-scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Report on\"}, {\"language_code\": \"es_es\", \"string\": \"Informar sobre\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification only on these statuses. <code>new</code> means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered. <code>watched-changed</code> means that selected <code>Watched_ValueN</code> columns changed.\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00ede una notificaci\\u00f3n solo en estos estados. <code>new</code> significa que se descubri\\u00f3 un nuevo objeto \\u00fanico (una combinaci\\u00f3n \\u00fanica de PrimaryId y SecondaryId). <code>watched-changed</code> significa que las columnas <code>Watched_ValueN</code> seleccionadas cambiaron.\"}]}"
# MQTT
#---------------------------
MQTT_RUN='on_notification'
MQTT_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"test\"], \"type\": \"text.select\", \"default_value\": \"disabled\", \"options\": [\"disabled\", \"on_notification\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cuando ejecuta\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Enable sending notifications via <a target=\\\"_blank\\\" href=\\\"https://www.home-assistant.io/integrations/mqtt/\\\">MQTT</a> to your Home Assistance instance.\"}, {\"language_code\": \"es_es\", \"string\": \"Habilitar el env\\u00edo de notificaciones a trav\\u00e9s de <a target=\\\"_blank\\\" href=\\\"https://www.home-assistant.io/integrations/mqtt/\\\">MQTT</a> a su Home Assistance.\"}]}"
MQTT_CMD='python3 /home/pi/pialert/front/plugins/_publisher_mqtt/mqtt.py'
MQTT_CMD__metadata="{\"function\": \"CMD\", \"type\": \"readonly\", \"default_value\": \"python3 /home/pi/pialert/front/plugins/_publisher_mqtt/mqtt.py\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run\"}, {\"language_code\": \"es_es\", \"string\": \"Comando a ejecutar\"}]}"
MQTT_RUN_TIMEOUT=600
MQTT_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": \"integer\", \"default_value\": 600, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo de espera de ejecuci\\u00f3n\"}, {\"language_code\": \"de_de\", \"string\": \"Wartezeit\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela.\"}]}"
MQTT_BROKER='192.168.1.9'
MQTT_BROKER__metadata="{\"function\": \"BROKER\", \"type\": \"text\", \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"MQTT broker URL\"}, {\"language_code\": \"es_es\", \"string\": \"URL del broker MQTT\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"MQTT host URL (do not include <code>http://</code> or <code>https://</code>).\"}, {\"language_code\": \"es_es\", \"string\": \"URL del host MQTT (no incluya <code>http://</code> o <code>https://</code>).\"}]}"
MQTT_PORT=1883
MQTT_PORT__metadata="{\"function\": \"PORT\", \"type\": \"integer\", \"default_value\": 1883, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"MQTT broker port\"}, {\"language_code\": \"es_es\", \"string\": \"Puerto del broker MQTT\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Port number where the broker is listening. Usually <code>1883</code>.\"}, {\"language_code\": \"es_es\", \"string\": \"Puerto donde escucha el broker MQTT. Normalmente <code>1883</code>.\"}]}"
MQTT_USER='mqtt'
MQTT_USER__metadata="{\"function\": \"USER\", \"type\": \"text\", \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"MQTT user\"}, {\"language_code\": \"es_es\", \"string\": \"Usuario de MQTT\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"User name used to login into your MQTT broker instance.\"}, {\"language_code\": \"es_es\", \"string\": \"Nombre de usuario utilizado para iniciar sesi\\u00f3n en su instancia de agente de MQTT.\"}]}"
MQTT_PASSWORD='VR7^Bh@bh8BzAyd6Qri*&S'
MQTT_PASSWORD__metadata="{\"function\": \"PASSWORD\", \"type\": \"password\", \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"MQTT password\"}, {\"language_code\": \"es_es\", \"string\": \"Contrase\\u00f1a de MQTT\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Password used to login into your MQTT broker instance.\"}, {\"language_code\": \"es_es\", \"string\": \"Contrase\\u00f1a utilizada para iniciar sesi\\u00f3n en su instancia de agente de MQTT.\"}]}"
MQTT_QOS=0
MQTT_QOS__metadata="{\"function\": \"QOS\", \"type\": \"integer.select\", \"default_value\": 0, \"options\": [0, 1, 2], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"MQTT Quality of Service\"}, {\"language_code\": \"es_es\", \"string\": \"Calidad de servicio MQTT\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Quality of service setting for MQTT message sending. <code>0</code> - Low quality to <code>2</code> - High quality. The higher the quality the longer the delay.\"}, {\"language_code\": \"es_es\", \"string\": \"Configuraci\\u00f3n de calidad de servicio para el env\\u00edo de mensajes MQTT. <code>0</code>: baja calidad a <code>2</code>: alta calidad. Cuanto mayor sea la calidad, mayor ser\\u00e1 el retraso.\"}]}"
MQTT_DELAY_SEC=2
MQTT_DELAY_SEC__metadata="{\"function\": \"DELAY_SEC\", \"type\": \"integer\", \"default_value\": 2, \"options\": [2, 3, 4, 5], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"MQTT delay per device\"}, {\"language_code\": \"es_es\", \"string\": \"Retraso de MQTT por dispositivo\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"A little hack - delay adding to the queue in case the process is restarted and previous publish processes aborted (it takes ~<code>2</code>s to update a sensor config on the broker). Tested with <code>2</code>-<code>3</code> seconds of delay. This delay is only applied when devices are created (during the first notification loop). It doesn not affect subsequent scans or notifications.\"}, {\"language_code\": \"es_es\", \"string\": \"Un peque\\u00f1o truco: retrase la adici\\u00f3n a la cola en caso de que el proceso se reinicie y los procesos de publicaci\\u00f3n anteriores se anulen (se necesitan ~<code>2</code>s para actualizar la configuraci\\u00f3n de un sensor en el intermediario). Probado con <code>2</code>-<code>3</code> segundos de retraso. Este retraso solo se aplica cuando se crean dispositivos (durante el primer bucle de notificaci\\u00f3n). No afecta los escaneos o notificaciones posteriores.\"}]}"
# PIHOLE
#---------------------------
PIHOLE_RUN='disabled'
PIHOLE_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"run\"], \"type\": \"text.select\", \"default_value\": \"disabled\", \"options\": [\"disabled\", \"once\", \"schedule\", \"always_after_scan\", \"on_new_device\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cuando ejecutar\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Specify when your PiHole device import from the PiHole databse will run. The typical setting would be <code>schedule</code> and then you specify a cron-like schedule in the <a href=\\\"#PIHOLE_RUN_SCHD\\\"><code>PIHOLE_RUN_SCHD</code>setting</a>. If enabled, you must map the pihole db into your container to the <code>:/etc/pihole/pihole-FTL.db</code> mount path as specified in the <code>DB_PATH</code> setting.\"}, {\"language_code\": \"es_es\", \"string\": \"Especifique cu\\u00e1ndo se ejecutar\\u00e1 la importaci\\u00f3n de su dispositivo PiHole desde la base de datos de PiHole. La configuraci\\u00f3n t\\u00edpica ser\\u00eda <code>schedule</code> y luego especifica una programaci\\u00f3n similar a cron en la configuraci\\u00f3n <a href=\\\"#PIHOLE_RUN_SCHD\\\"><code>PIHOLE_RUN_SCHD</code></a>. Si est\\u00e1 habilitado, debe asignar la base de datos pihole en su contenedor a la ruta de montaje <code>:/etc/pihole/pihole-FTL.db</code> como se especifica en la configuraci\\u00f3n <code>DB_PATH</code>.\"}]}"
PIHOLE_CMD='SELECT n.hwaddr AS Object_PrimaryID, {s-quote}null{s-quote} AS Object_SecondaryID, datetime() AS DateTime, na.ip AS Watched_Value1, n.lastQuery AS Watched_Value2, na.name AS Watched_Value3, n.macVendor AS Watched_Value4, {s-quote}null{s-quote} AS Extra, n.hwaddr AS ForeignKey FROM EXTERNAL_PIHOLE.Network AS n LEFT JOIN EXTERNAL_PIHOLE.Network_Addresses AS na ON na.network_id = n.id WHERE n.hwaddr NOT LIKE {s-quote}ip-%{s-quote} AND n.hwaddr <> {s-quote}00:00:00:00:00:00{s-quote};'
PIHOLE_CMD__metadata="{\"function\": \"CMD\", \"type\": \"text\", \"default_value\": \"SELECT n.hwaddr AS Object_PrimaryID, {s-quote}null{s-quote} AS Object_SecondaryID, datetime() AS DateTime, na.ip AS Watched_Value1, n.lastQuery AS Watched_Value2, na.name AS Watched_Value3, n.macVendor AS Watched_Value4, {s-quote}null{s-quote} AS Extra, n.hwaddr AS ForeignKey FROM EXTERNAL_PIHOLE.Network AS n LEFT JOIN EXTERNAL_PIHOLE.Network_Addresses AS na ON na.network_id = n.id WHERE n.hwaddr NOT LIKE {s-quote}ip-%{s-quote} AND n.hwaddr <> {s-quote}00:00:00:00:00:00{s-quote} AND na.ip <> null;\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"SQL to run\"}, {\"language_code\": \"es_es\", \"string\": \"Consulta SQL\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"This SQL query is used to populate the coresponding UI tables under the Plugins section. This particular one selects data from a mapped PiHole SQLite database and maps it to the corresponding Plugin columns.\"}, {\"language_code\": \"es_es\", \"string\": \"Esta consulta SQL se usa para completar las tablas de IU correspondientes en la secci\\u00f3n Complementos. Este en particular selecciona datos de una base de datos PiHole SQLite asignada y los asigna a las columnas correspondientes del complemento.\"}]}"
PIHOLE_DB_PATH='/etc/pihole/pihole-FTL.db'
PIHOLE_DB_PATH__metadata="{\"function\": \"DB_PATH\", \"type\": \"readonly\", \"default_value\": \"/etc/pihole/pihole-FTL.db\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"DB Path\"}, {\"language_code\": \"es_es\", \"string\": \"Ruta de la base de datos\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Required setting for the <code>sqlite-db-query</code> plugin type. Is used to mount an external SQLite database and execute the SQL query stored in the <code>CMD</code> setting.\"}, {\"language_code\": \"es_es\", \"string\": \"Configuraci\\u00f3n requerida para el tipo de complemento <code>sqlite-db-query</code>. Se utiliza para montar una base de datos SQLite externa y ejecutar la consulta SQL almacenada en la configuraci\\u00f3n <code>CMD</code>.\"}]}"
PIHOLE_RUN_SCHD='*/30 * * * *'
PIHOLE_RUN_SCHD__metadata="{\"function\": \"RUN_SCHD\", \"type\": \"text\", \"default_value\": \"*/30 * * * *\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"es_es\", \"string\": \"Programar\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Only enabled if you select <code>schedule</code> in the <a href=\\\"#ARPSCAN_RUN\\\"><code>ARPSCAN_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>*/30 * * * *</code> will run the scan every 30 minutes. Will be run NEXT time the time passes. <br/> It's recommended to use the same schedule interval for all plugins responsible for discovering new devices.\"}, {\"language_code\": \"es_es\", \"string\": \"Solo est\\u00e1 habilitado si selecciona <code>schedule</code> en la configuraci\\u00f3n <a href=\\\"#ARPSCAN_RUN\\\"><code>ARPSCAN_RUN</code></a>. Aseg\\u00farese de ingresar la programaci\\u00f3n en el formato similar a cron correcto (por ejemplo, valide en <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). Por ejemplo, ingresar <code>*/30 * * * *</code> ejecutar\\u00e1 el escaneo cada 30 minutos. Se ejecutar\\u00e1 la PR\\u00d3XIMA vez que pase el tiempo. <br/> Se recomienda utilizar el mismo intervalo de programaci\\u00f3n para todos los complementos que analizan su red.\"}]}"
PIHOLE_WATCH=['Watched_Value1','Watched_Value2']
PIHOLE_WATCH__metadata="{\"function\": \"WATCH\", \"type\": \"text.multiselect\", \"default_value\": [\"Watched_Value1\", \"Watched_Value2\"], \"options\": [\"Watched_Value1\", \"Watched_Value2\", \"Watched_Value3\", \"Watched_Value4\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Watched\"}, {\"language_code\": \"es_es\", \"string\": \"Visto\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification if selected values change. Use <code>CTRL + Click</code> to select/deselect. <ul> <li><code>Watched_Value1</code> is IP</li><li><code>Watched_Value2</code> is Last Query</li><li><code>Watched_Value3</code> is Name </li><li><code>Watched_Value4</code> is N/A </li></ul>\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00ede una notificaci\\u00f3n si los valores seleccionados cambian. Utilice <code>CTRL + clic</code> para seleccionar/deseleccionar. <ul> <li><code>Watched_Value1</code> es IP</li><li><code>Watched_Value2</code> es Proveedor</li><li><code>Watched_Value3</code> is es Interfaz</li><li><code>Watched_Value4</code> es N/A</li></ul>\"}]}"
PIHOLE_REPORT_ON=['new']
PIHOLE_REPORT_ON__metadata="{\"function\": \"REPORT_ON\", \"type\": \"text.multiselect\", \"default_value\": [\"new\"], \"options\": [\"new\", \"watched-changed\", \"watched-not-changed\", \"missing-in-last-scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Report on\"}, {\"language_code\": \"es_es\", \"string\": \"Informar sobre\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"When should notification be sent out.\"}, {\"language_code\": \"es_es\", \"string\": \"\\u00bfCu\\u00e1ndo se debe enviar la notificaci\\u00f3n?.\"}]}"
# PHOLUS
#---------------------------
PHOLUS_RUN='disabled'
PHOLUS_RUN__metadata="{\"function\": \"RUN\", \"type\": \"text.select\", \"default_value\": \"on_new_device\", \"options\": [\"disabled\", \"once\", \"schedule\", \"always_after_scan\", \"on_new_device\"], \"localized\": [\"name\", \"description\"], \"events\": [\"run\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cuando ejecutar\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"<a href=\\\"https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins/pholus_scan/pholus\\\" target=\\\"_blank\\\" >Pholus</a> is a sniffing tool to discover additional information about the devices on the network, including the device name. If enabled this will execute the scan before every network scan cycle until there are no <code>(unknown)</code> or <code>(name not found)</code> devices. Please be aware it can spam the network with unnecessary traffic. Depends on the <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#SCAN_SUBNETS\\\"><code>SCAN_SUBNETS</code> setting</a>. For a scheduled or one-off scan, check the <a href=\\\"#PHOLUS_RUN\\\"><code>PHOLUS_RUN</code> setting</a>.Specify when your Name-discovery scan will run. Typical setting would be <code>on_new_device</code> or <code>schedule</code> and then you specify a cron-like schedule in the <a href=\\\"#PHOLUS_RUN_SCHD\\\"><code>PHOLUS_RUN_SCHD</code>setting</a>.\"}, {\"language_code\": \"es_es\", \"string\": \"<a href=\\\"https://github.com/jokob-sk/Pi.Alert/tree/main/front/plugins/pholus_scan/pholus\\\" target=\\\"_blank\\\" >Pholus</a> es una herramienta de rastreo para descubrir informaci\\u00f3n adicional sobre los dispositivos en la red, incluido el nombre del dispositivo. Si est\\u00e1 habilitado, ejecutar\\u00e1 el escaneo antes de cada ciclo de escaneo de red hasta que no haya dispositivos <code>(unknown)</code> o <code>(name not found)</code>. Tenga en cuenta que puede enviar spam a la red con tr\\u00e1fico innecesario. Depende de la configuraci\\u00f3n de <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#SCAN_SUBNETS\\\"><code>SCAN_SUBNETS</code></a>. Para un an\\u00e1lisis programado o \\u00fanico, verifique la configuraci\\u00f3n de <a href=\\\"#PHOLUS_RUN\\\"><code>PHOLUS_RUN</code></a>.\"}]}"
PHOLUS_CMD='python3 /home/pi/pialert/front/plugins/pholus_scan/script.py userSubnets={subnets} timeoutSec={timeout}'
PHOLUS_CMD__metadata="{\"function\": \"CMD\", \"type\": \"readonly\", \"default_value\": \"python3 /home/pi/pialert/front/plugins/pholus_scan/script.py userSubnets={subnets} timeoutSec={timeout}\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run. This should not be changed\"}, {\"language_code\": \"es_es\", \"string\": \"Comando para ejecutar. Esto no debe ser cambiado\"}]}"
PHOLUS_RUN_TIMEOUT=300
PHOLUS_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": \"integer\", \"default_value\": 300, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo l\\u00edmite de ejecuci\\u00f3n\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Network scan time in seconds. Pholus scan will always run this long. The longer it runs the more device names might be resolved. Will be divided by the number of subnets.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo de escaneo de red en segundos. El escaneo de Pholus siempre durar\\u00e1 este tiempo. Cuanto m\\u00e1s tiempo se ejecute, m\\u00e1s nombres de dispositivos se podr\\u00e1n resolver. Se dividir\\u00e1 por el n\\u00famero de subredes.\"}]}"
PHOLUS_RUN_SCHD='30 3 * * *'
PHOLUS_RUN_SCHD__metadata="{\"function\": \"RUN_SCHD\", \"type\": \"text\", \"default_value\": \"30 3 * * *\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"es_es\", \"string\": \"Schedule\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Only enabled if you select <code>schedule</code> in the <a href=\\\"#PHOLUS_RUN\\\"><code>PHOLUS_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>30 3 * * *</code> will run the scan at 3:30 am. Will be run NEXT time the time passes. <br/>\"}, {\"language_code\": \"es_es\", \"string\": \"Solo est\\u00e1 habilitado si selecciona <code>schedule</code> en la configuraci\\u00f3n <a href=\\\"#PHOLUS_RUN\\\"><code>PHOLUS_RUN</code></a>. Aseg\\u00farese de ingresar la programaci\\u00f3n en el formato cron correcto (por ejemplo, validar en <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). Por ejemplo, al ingresar <code>30 3 * * *</code> se ejecutar\\u00e1 el escaneo a las 3:30 am. Se ejecutar\\u00e1 la PR\\u00d3XIMA vez que pase el tiempo. <br/>\"}]}"
PHOLUS_DAYS_DATA=30
PHOLUS_DAYS_DATA__metadata="{\"function\": \"DAYS_DATA\", \"type\": \"integer\", \"default_value\": 30, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"es_es\", \"string\": \"Retenci\\u00f3n de datos\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"How many days of Pholus scan entries should be kept (globally, not device specific!) Enter <code>0</code> to disable.\"}, {\"language_code\": \"es_es\", \"string\": \"Cu\\u00e1ntos d\\u00edas de entradas de escaneo de Pholus deben conservarse (globalmente, \\u00a1no espec\\u00edfico del dispositivo!). El archivo <a href=\\\"/maintenance.php#tab_Logging\\\">pialert_pholus.log</a> no se modifica. Introduzca <code>0</code> para desactivar.\"}]}"
PHOLUS_WATCH=['Watched_Value1','Watched_Value2']
PHOLUS_WATCH__metadata="{\"function\": \"WATCH\", \"type\": \"text.multiselect\", \"default_value\": [\"Watched_Value1\", \"Watched_Value2\"], \"options\": [\"Watched_Value1\", \"Watched_Value2\", \"Watched_Value3\", \"Watched_Value4\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Watched\"}, {\"language_code\": \"es_es\", \"string\": \"Watched\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification if selected values change. Use <code>CTRL + Click</code> to select/deselect. <ul> <li><code>Watched_Value1</code> is Info</li><li><code>Watched_Value2</code> is Record type</li><li><code>Watched_Value3</code> is Info </li><li><code>Watched_Value4</code> is N/A </li></ul>\"}, {\"language_code\": \"es_es\", \"string\": \"Enviar una notificaci\\u00f3n si los valores seleccionados cambian. Utilice <code>CTRL + Clic</code> para seleccionar/deseleccionar. <ul> <li><code>Watched_Value1</code> es Informaci\\u00f3n</li><li><code>Watched_Value2</code> es Tipo de registro</li><li><code>Watched_Value3</code> es La informaci\\u00f3n </li><li><code>Watched_Value4</code> es N/A </li></ul>\"}]}"
PHOLUS_REPORT_ON=['new']
PHOLUS_REPORT_ON__metadata="{\"function\": \"REPORT_ON\", \"type\": \"text.multiselect\", \"default_value\": [\"new\"], \"options\": [\"new\", \"watched-changed\", \"watched-not-changed\", \"missing-in-last-scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Report on\"}, {\"language_code\": \"es_es\", \"string\": \"Informar sobre\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"When should notification be sent out.\"}, {\"language_code\": \"es_es\", \"string\": \"Cu\\u00e1ndo debe enviarse una notificaci\\u00f3n.\"}]}"
# UNDIS
#---------------------------
UNDIS_RUN='disabled'
UNDIS_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"run\"], \"type\": \"text.select\", \"default_value\": \"disabled\", \"options\": [\"disabled\", \"once\", \"always_after_scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cu\\u00e1ndo ejecuta\"}, {\"language_code\": \"de_de\", \"string\": \"Wann ausf\\u00fchren\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"When enabled, ONCE is the preferred option. It runs at startup and after every save of the config here.<br> Changes will only show in the devices <b> after the next scan!</b>\"}, {\"language_code\": \"es_es\", \"string\": \"Cuando est\\u00e1 habilitado, ONCE es la opci\\u00f3n preferida. Se ejecuta al inicio y despu\\u00e9s de cada guardado de la configuraci\\u00f3n aqu\\u00ed.<br> \\u00a1Los cambios solo se mostrar\\u00e1n en los dispositivos <b> despu\\u00e9s del pr\\u00f3ximo escaneo!</b>\"}, {\"language_code\": \"de_de\", \"string\": \"Wenn dieses Plugin aktiviert ist, ist <code>once</code> die bevorzugte Methode. Das Plugin wird dann bei jedem Start und nach jedem Speichern der Einstellungen ausgef\\u00fchrt.</br>\\u00c4nderungen scheinen in den Ger\\u00e4ten erst <b>nach dem n\\u00e4chsten Scan</b> auf!\"}]}"
UNDIS_CMD='python3 /home/pi/pialert/front/plugins/undiscoverables/script.py devices={devices}'
UNDIS_CMD__metadata="{\"function\": \"CMD\", \"type\": \"text\", \"default_value\": \"python3 /home/pi/pialert/front/plugins/undiscoverables/script.py devices={devices}\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run. This can not be changed\"}, {\"language_code\": \"es_es\", \"string\": \"Comando a ejecutar. Esto no se puede cambiar\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl zum Ausf\\u00fchren. Dies kann nicht ge\\u00e4ndert werden\"}]}"
UNDIS_RUN_TIMEOUT=10
UNDIS_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": \"integer\", \"default_value\": 10, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo l\\u00edmite de ejecuci\\u00f3n\"}, {\"language_code\": \"de_de\", \"string\": \"Zeitlimit\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela.\"}, {\"language_code\": \"de_de\", \"string\": \"Maximale Zeit in Sekunden, die auf den Abschluss des Skripts gewartet werden soll. Bei \\u00dcberschreitung dieser Zeit wird das Skript abgebrochen.\"}]}"
UNDIS_WATCH='[]'
UNDIS_WATCH__metadata="{\"function\": \"WATCH\", \"type\": \"readonly\", \"default_value\": [], \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Watched\"}, {\"language_code\": \"es_es\", \"string\": \"Visto\"}, {\"language_code\": \"de_de\", \"string\": \"\\u00dcberwacht\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Undiscoverable Devices can not change their status, no watch is enabled.\"}, {\"language_code\": \"es_es\", \"string\": \"Los dispositivos no detectables no pueden cambiar su estado, ning\\u00fan reloj est\\u00e1 habilitado.\"}, {\"language_code\": \"de_de\", \"string\": \"Status von nicht erkennbaren Ger\\u00e4ten k\\u00f6nnen sich nicht \\u00e4ndern, keine \\u00dcberwachung aktiviert.\"}]}"
UNDIS_REPORT_ON='[]'
UNDIS_REPORT_ON__metadata="{\"function\": \"REPORT_ON\", \"type\": \"readonly\", \"default_value\": [], \"options\": [\"new\", \"watched-changed\", \"watched-not-changed\", \"missing-in-last-scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Report on\"}, {\"language_code\": \"es_es\", \"string\": \"Informar sobre\"}, {\"language_code\": \"de_de\", \"string\": \"Benachrichtige wenn\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"No notifications will be sent.\"}, {\"language_code\": \"es_es\", \"string\": \"No se enviar\\u00e1n notificaciones.\"}, {\"language_code\": \"de_de\", \"string\": \"Keine Benachrichtigungen werden versendet.\"}]}"
UNDIS_devices_to_import=['dummy_router']
UNDIS_devices_to_import__metadata="{\"function\": \"devices_to_import\", \"type\": \"list\", \"default_value\": [\"dummy_router\"], \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"UnDiscoverable Devices\"}, {\"language_code\": \"es_es\", \"string\": \"Dispositivo no detectable\"}, {\"language_code\": \"de_de\", \"string\": \"Nicht erkennbare Ger\\u00e4te\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Devices to be added to the devices list.\"}, {\"language_code\": \"es_es\", \"string\": \"Dispositivos que se a\\u00f1adir\\u00e1n a la lista de dispositivos.\"}, {\"language_code\": \"de_de\", \"string\": \"Ger\\u00e4te, welche der Ger\\u00e4teliste hinzugef\\u00fcgt werden.\"}]}"
# WEBMON
#---------------------------
WEBMON_RUN='disabled'
WEBMON_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"run\"], \"type\": \"text.select\", \"default_value\": \"disabled\", \"options\": [\"disabled\", \"once\", \"schedule\", \"always_after_scan\", \"on_new_device\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cuando ejecuta\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Enable a regular scan of your services. If you select <code>schedule</code> the scheduling settings from below are applied. If you select <code>once</code> the scan is run only once on start of the application (container) for the time specified in <a href=\\\"#WEBMON_RUN_TIMEOUT\\\"><code>WEBMON_RUN_TIMEOUT</code> setting</a>.\"}, {\"language_code\": \"es_es\", \"string\": \"Habilite un escaneo regular de sus servicios. Si selecciona <code>schedule</code>, se aplican las configuraciones de programaci\\u00f3n de abajo. Si selecciona <code>once</code>, el escaneo se ejecuta solo una vez al iniciar la aplicaci\\u00f3n (contenedor) durante el tiempo especificado en <a href=\\\"#WEBMON_RUN_TIMEOUT\\\"><code>WEBMON_RUN_TIMEOUT</code> configuraci\\u00f3n</a>.\"}]}"
WEBMON_CMD='python3 /home/pi/pialert/front/plugins/website_monitor/script.py urls={urls}'
WEBMON_CMD__metadata="{\"function\": \"CMD\", \"type\": \"text\", \"default_value\": \"python3 /home/pi/pialert/front/plugins/website_monitor/script.py urls={urls}\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run\"}, {\"language_code\": \"es_es\", \"string\": \"Comando a ejecutar\"}]}"
WEBMON_RUN_SCHD='0 2 * * *'
WEBMON_RUN_SCHD__metadata="{\"function\": \"RUN_SCHD\", \"type\": \"text\", \"default_value\": \"0 2 * * *\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"es_es\", \"string\": \"Schedule\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Only enabled if you select <code>schedule</code> in the <a href=\\\"#WEBMON_RUN\\\"><code>WEBMON_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.\"}, {\"language_code\": \"es_es\", \"string\": \"Solo habilitado si selecciona <code>schedule</code> en la configuraci\\u00f3n <a href=\\\"#WEBMON_RUN\\\"><code>WEBMON_RUN</code></a>. Aseg\\u00farese de ingresar el schedule en el formato similar a cron correcto (por ejemplo, valide en <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). Por ejemplo, ingrese <code >0 4 * * *</code> ejecutar\\u00e1 el escaneo despu\\u00e9s de las 4 am en el <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\"><code>TIMEZONE</code> que configur\\u00f3 arriba </a>. Se ejecutar\\u00e1 la PR\\u00d3XIMA vez que pase el tiempo.\"}]}"
WEBMON_API_SQL='SELECT * FROM plugin_website_monitor'
WEBMON_API_SQL__metadata="{\"function\": \"API_SQL\", \"type\": \"text\", \"default_value\": \"SELECT * FROM plugin_website_monitor\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"API endpoint (not implemented)\"}, {\"language_code\": \"es_es\", \"string\": \"Punto de conexi\\u00f3n de la API (no implementado)\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"You can specify a custom SQL query which will generate a JSON file and then expose it via the <a href=\\\"/api/plugin_website_monitor.json\\\" target=\\\"_blank\\\"><code>plugin_website_monitor.json</code> file endpoint</a>.\"}, {\"language_code\": \"es_es\", \"string\": \"Puede especificar una consulta SQL personalizada que generar\\u00e1 un archivo JSON y luego lo expondr\\u00e1 a trav\\u00e9s de <a href=\\\"/api/plugin_website_monitor.json\\\" target=\\\"_blank\\\"><code>plugin_website_monitor.json</code> punto final del archivo</a>.\"}]}"
WEBMON_RUN_TIMEOUT=5
WEBMON_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": \"integer\", \"default_value\": 5, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo de espera de ejecuci\\u00f3n\"}, {\"language_code\": \"de_de\", \"string\": \"Wartezeit\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela.\"}]}"
WEBMON_WATCH=['Watched_Value1']
WEBMON_WATCH__metadata="{\"function\": \"WATCH\", \"type\": \"text.multiselect\", \"default_value\": [\"Watched_Value1\"], \"options\": [\"Watched_Value1\", \"Watched_Value2\", \"Watched_Value3\", \"Watched_Value4\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Watched\"}, {\"language_code\": \"es_es\", \"string\": \"Visto\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification if selected values change. Use <code>CTRL + Click</code> to select/deselect. <ul> <li><code>Watched_Value1</code> is response status code (e.g.: 200, 404)</li><li><code>Watched_Value2</code> is Latency (not recommended)</li><li><code>Watched_Value3</code> unused </li><li><code>Watched_Value4</code> unused </li></ul>\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00ede una notificaci\\u00f3n si los valores seleccionados cambian. Use <code>CTRL + Click</code> para seleccionar/deseleccionar. <ul> <li><code>Watched_Value1</code> es un c\\u00f3digo de estado de respuesta (por ejemplo: 200, 404) </li><li><code>Valor_observado2</code> es Latencia (no recomendado)</li><li><code>Valor_observado3</code> no utilizado </li><li><code>Valor_observado4 </ code> sin usar </li></ul>\"}]}"
WEBMON_REPORT_ON=['new','watched-changed']
WEBMON_REPORT_ON__metadata="{\"function\": \"REPORT_ON\", \"type\": \"text.multiselect\", \"default_value\": [\"new\", \"watched-changed\"], \"options\": [\"new\", \"watched-changed\", \"watched-not-changed\", \"missing-in-last-scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Report on\"}, {\"language_code\": \"es_es\", \"string\": \"Informar sobre\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification only on these statuses. <code>new</code> means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered. <code>watched-changed</code> means that selected <code>Watched_ValueN</code> columns changed.\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00ede una notificaci\\u00f3n solo en estos estados. <code>new</code> significa que se descubri\\u00f3 un nuevo objeto \\u00fanico (combinaci\\u00f3n \\u00fanica de PrimaryId y SecondaryId). <code>watched-changed</code> significa que seleccion\\u00f3 <code>Watched_ValueN Las columnas </code> cambiaron.\"}]}"
WEBMON_urls_to_check=['https://google.com','https://duck.com']
WEBMON_urls_to_check__metadata="{\"function\": \"urls_to_check\", \"type\": \"list\", \"default_value\": [\"https://google.com\", \"https://duck.com\"], \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Arguments\"}, {\"language_code\": \"es_es\", \"string\": \"Argumentos\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Services to watch. Enter full URL, e.g. <code>https://google.com</code>. The values from this setting will be used to replace the <code>{urls}</code> wildcard in the <code>WEBMON_CMD</code> setting.\"}, {\"language_code\": \"es_es\", \"string\": \"Servicios para ver. Ingrese la URL completa, por ejemplo, <code>https://google.com</code>. Los valores de esta configuraci\\u00f3n se usar\\u00e1n para reemplazar el comod\\u00edn <code>{urls}</code> en la configuraci\\u00f3n < code>WEBMON_CMD</code>.\"}]}"
WEBMON_SQL_internet_ip='SELECT dev_LastIP FROM Devices WHERE dev_MAC = {s-quote}Internet{s-quote}'
WEBMON_SQL_internet_ip__metadata="{\"function\": \"SQL_internet_ip\", \"type\": \"readonly\", \"default_value\": \"SELECT dev_LastIP FROM Devices WHERE dev_MAC = 'Internet'\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Helper variable\"}, {\"language_code\": \"es_es\", \"string\": \"Variable de ayuda\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Unused setting - for demonstration only. Getting the IP address of the Router / Internet.\"}, {\"language_code\": \"es_es\", \"string\": \"Configuraci\\u00f3n no utilizada: solo para demostraci\\u00f3n. Obtener la direcci\\u00f3n IP del enrutador / Internet.\"}]}"
# DHCPLSS
#---------------------------
DHCPLSS_RUN='schedule'
DHCPLSS_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"run\"], \"type\": \"text.select\", \"default_value\": \"disabled\", \"options\": [\"disabled\", \"once\", \"schedule\", \"always_after_scan\", \"on_new_device\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cu\\u00e1ndo ejecutar\"}, {\"language_code\": \"de_de\", \"string\": \"Wann ausf\\u00fchren\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Enable import of devices from <code>dhcp.leases</code> files. If you select <code>schedule</code> the scheduling settings from below are applied. If you select <code>once</code> the scan is run only once on start of the application (container) or after you update your settings.\"}, {\"language_code\": \"es_es\", \"string\": \"Habilite la importaci\\u00f3n de dispositivos desde archivos <code>dhcp.leases</code>. Si selecciona <code>schedule</code>, se aplican las configuraciones de programaci\\u00f3n de abajo. Si selecciona <code>once</code>, el an\\u00e1lisis se ejecuta solo una vez al inicio de la aplicaci\\u00f3n (contenedor) o despu\\u00e9s de actualizar su configuraci\\u00f3n.\"}, {\"language_code\": \"de_de\", \"string\": \"Aktiviere den Import aus <code>dhcp.leases</code>-Dateien. Wenn <code>schedule</code> ausgew\\u00e4hlt ist, werden die unten gesetzten Zeitplan-Einstellungen verwendet. Ist <code>once</code> ausgew\\u00e4hlt, so wird bei jedem Start der Applikation (Container) und nach jedem Speichern der Einstellungen der Imnport durchgef\\u00fchrt.\"}]}"
DHCPLSS_CMD='python3 /home/pi/pialert/front/plugins/dhcp_leases/script.py paths={paths}'
DHCPLSS_CMD__metadata="{\"function\": \"CMD\", \"type\": \"text\", \"default_value\": \"python3 /home/pi/pialert/front/plugins/dhcp_leases/script.py paths={paths}\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run\"}, {\"language_code\": \"es_es\", \"string\": \"Comando a ejecutar\"}, {\"language_code\": \"de_de\", \"string\": \"Auszuf\\u00fchrender Befehl\"}]}"
DHCPLSS_paths_to_check=['/mnt/dhcp1.leases','/mnt/dhcp2.leases','/etc/pihole/pihole-FTL.dba']
DHCPLSS_paths_to_check__metadata="{\"function\": \"paths_to_check\", \"type\": \"list\", \"default_value\": [\"/mnt/dhcp1.leases\", \"/mnt/dhcp2.leases\"], \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Files\"}, {\"language_code\": \"es_es\", \"string\": \"Archivos\"}, {\"language_code\": \"de_de\", \"string\": \"Dateien\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Add all dhcp.leases mapped paths to watch. Enter full path within the container, e.g. <code>/mnt/dhcp2.leases</code>. You must map these files accordingly in your <code>docker-compose.yml</code> file. (If you are mapping a PiHole dhcp.leases file the path in the container must contain <code>pihole</code>, e.g.: <code>:/etc/pihole/dhcp.leases</code>)\"}, {\"language_code\": \"es_es\", \"string\": \"Agregue todas las rutas asignadas de dhcp.leases para observar. Ingrese la ruta completa dentro del contenedor, p.e. <code>/mnt/dhcp2.leases</code>. Debe asignar estos archivos en consecuencia en su archivo <code>docker-compose.yml</code>. (Si est\\u00e1 asignando un archivo PiHole dhcp.leases, la ruta en el contenedor debe contener <code>pihole</code>, por ejemplo: <code>:/etc/pihole/dhcp.leases</code>)\"}, {\"language_code\": \"de_de\", \"string\": \"Alle zu \\u00fcberwachenden dhcp.leases-Pfade hinzuf\\u00fcgen. Den absoluten Pfad innerhalb des Containers angeben, z.B. <code>/mnt/dchp2.leases</code>. Diese Dateien m\\u00fcssen korrekt in der <code>docker-compose.yml</code> gemapped werden. Wird eine PiHole dhcp.leases-Datei in den Container gemapped, so muss der Pfad im Container <code>pihole</code> inkludieren, z.B. <code>:/etc/pihole/dhcp.leases</code>\"}]}"
DHCPLSS_RUN_SCHD='*/5 * * * *'
DHCPLSS_RUN_SCHD__metadata="{\"function\": \"RUN_SCHD\", \"type\": \"text\", \"default_value\": \"0 2 * * *\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"es_es\", \"string\": \"Schedule\"}, {\"language_code\": \"de_de\", \"string\": \"Zeitplan\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Only enabled if you select <code>schedule</code> in the <a href=\\\"#DHCPLSS_RUN\\\"><code>DHCPLSS_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. <br/> It's recommended to use the same schedule interval for all plugins responsible for discovering new devices.\"}, {\"language_code\": \"es_es\", \"string\": \"Solo est\\u00e1 habilitado si selecciona <code>schedule</code> en la configuraci\\u00f3n <a href=\\\"#DHCPLSS_RUN\\\"><code>DHCPLSS_RUN</code></a>. Aseg\\u00farese de ingresar la programaci\\u00f3n en el formato similar a cron correcto (por ejemplo, valide en <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutar\\u00e1 el escaneo despu\\u00e9s de las 4 a.m. en el <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\"><code>TIMEZONE</ c\\u00f3digo> que configur\\u00f3 arriba</a>. Se ejecutar\\u00e1 la PR\\u00d3XIMA vez que pase el tiempo.\"}, {\"language_code\": \"de_de\", \"string\": \"Nur aktiv, wenn <code>schedule</code> in der <a href=\\\"#INTRNT_RUN\\\"><code>INTRNT_RUN</code>Einstellung</a> ausgew\\u00e4hlt wurde. Sichergehen, dass das Intervall in einem korrekten cron-\\u00e4hnlichen Format angegeben wurde (z.B. auf <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a> testen). <code>0 4 * * *</code> w\\u00fcrde den Scan t\\u00e4glich um 4 Uhr in der <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\">oben ausgew\\u00e4hlten <code>TIMEZONE</code></a> starten. Wird erst beim N\\u00c4CHSTEN Intervall ausgef\\u00fchrt. <br/>Es wird empfohlen, das Intervall aller Plugins, welche nach neuen Ger\\u00e4ten suchen, auf den gleichen Wert zu setzen.\"}]}"
DHCPLSS_RUN_TIMEOUT=5
DHCPLSS_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": \"integer\", \"default_value\": 5, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo de espera de ejecuci\\u00f3n\"}, {\"language_code\": \"de_de\", \"string\": \"Zeitlimit\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela.\"}, {\"language_code\": \"de_de\", \"string\": \"Maximale Zeit in Sekunden, die auf den Abschluss des Skripts gewartet werden soll. Bei \\u00dcberschreitung dieser Zeit wird das Skript abgebrochen.\"}]}"
DHCPLSS_WATCH=['Watched_Value1','Watched_Value4']
DHCPLSS_WATCH__metadata="{\"function\": \"WATCH\", \"type\": \"text.multiselect\", \"default_value\": [\"Watched_Value1\", \"Watched_Value4\"], \"options\": [\"Watched_Value1\", \"Watched_Value2\", \"Watched_Value3\", \"Watched_Value4\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Watched\"}, {\"language_code\": \"es_es\", \"string\": \"Visto\"}, {\"language_code\": \"de_de\", \"string\": \"\\u00dcberwacht\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification if selected values change. Use <code>CTRL + Click</code> to select/deselect. <ul> <li><code>Watched_Value1</code> is Active </li><li><code>Watched_Value2</code> is Hostname </li><li><code>Watched_Value3</code> is hardware </li><li><code>Watched_Value4</code> is State </li></ul>\"}, {\"language_code\": \"es_es\", \"string\": \"Enviar una notificaci\\u00f3n si los valores seleccionados cambian. Utilice <code>CTRL + clic</code> para seleccionar/deseleccionar. <ul> <li><code>Watched_Value1</code> est\\u00e1 activo </li><li><code>Watched_Value2</code> es el nombre de host </li><li><code>Watched_Value3</code > es hardware </li><li><code>Watched_Value4</code> es Estado </li></ul>\"}, {\"language_code\": \"de_de\", \"string\": \"Sende eine Benachrichtigung, wenn ein ausgw\\u00e4hlter Wert sich \\u00e4ndert. <code>STRG + klicken</code> zum aus-/abw\\u00e4hlen. <ul> <li><code>Watched_Value1</code> ist der Aktivstatus</li><li><code>Watched_Value2</code> ist der Hostname</li><li><code>Watched_Value3</code> ist die Hardware</li><li><code>Watched_Value4</code> ist der Zustand </li></ul>\"}]}"
DHCPLSS_REPORT_ON=['new','watched-changed']
DHCPLSS_REPORT_ON__metadata="{\"function\": \"REPORT_ON\", \"type\": \"text.multiselect\", \"default_value\": [\"new\", \"watched-changed\"], \"options\": [\"new\", \"watched-changed\", \"watched-not-changed\", \"missing-in-last-scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Report on\"}, {\"language_code\": \"es_es\", \"string\": \"Informar sobre\"}, {\"language_code\": \"de_de\", \"string\": \"Benachrichtige wenn\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification only on these statuses. <code>new</code> means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered. <code>watched-changed</code> means that selected <code>Watched_ValueN</code> columns changed.\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00ede una notificaci\\u00f3n solo en estos estados. <code>new</code> significa que se descubri\\u00f3 un nuevo objeto \\u00fanico (una combinaci\\u00f3n \\u00fanica de PrimaryId y SecondaryId). <code>watched-changed</code> significa que las columnas <code>Watched_ValueN</code> seleccionadas cambiaron.\"}, {\"language_code\": \"de_de\", \"string\": \"Benachrichtige nur bei diesen Status. <code>new</code> bedeutet ein neues eindeutiges (einzigartige Kombination aus PrimaryId und SecondaryId) Objekt wurde erkennt. <code>watched-changed</code> bedeutet eine ausgew\\u00e4hlte <code>Watched_ValueN</code>-Spalte hat sich ge\\u00e4ndert.\"}]}"
# DHCPSRVS
#---------------------------
DHCPSRVS_RUN='disabled'
DHCPSRVS_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"run\"], \"type\": \"text.select\", \"default_value\": \"disabled\", \"options\": [\"disabled\", \"once\", \"schedule\", \"always_after_scan\", \"on_new_device\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cuando ejecutar\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Enable a regular scan of rogue DHCP servers. If you select <code>schedule</code> the scheduling settings from below are applied. If you select <code>once</code> the scan is run only once on start of the application (container) or after you update your settings.\"}, {\"language_code\": \"es_es\", \"string\": \"Habilite un escaneo regular de servidores DHCP no autorizados. Si selecciona <code>schedule</code>, se aplican las configuraciones de programaci\\u00f3n de abajo. Si selecciona <code>once</code>, el an\\u00e1lisis se ejecuta solo una vez al inicio de la aplicaci\\u00f3n (contenedor) o despu\\u00e9s de actualizar su configuraci\\u00f3n.\"}]}"
DHCPSRVS_CMD='python3 /home/pi/pialert/front/plugins/dhcp_servers/script.py'
DHCPSRVS_CMD__metadata="{\"function\": \"CMD\", \"type\": \"text\", \"default_value\": \"python3 /home/pi/pialert/front/plugins/dhcp_servers/script.py\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run\"}, {\"language_code\": \"es_es\", \"string\": \"Comando a ejecutar\"}]}"
DHCPSRVS_RUN_SCHD='0 2 * * *'
DHCPSRVS_RUN_SCHD__metadata="{\"function\": \"RUN_SCHD\", \"type\": \"text\", \"default_value\": \"0 2 * * *\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"es_es\", \"string\": \"Programar\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Only enabled if you select <code>schedule</code> in the <a href=\\\"#DHCPSRVS_RUN\\\"><code>DHCPSRVS_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.\"}, {\"language_code\": \"es_es\", \"string\": \"Solo est\\u00e1 habilitado si selecciona <code>schedule</code> en la configuraci\\u00f3n de <a href=\\\"#DHCPSRVS_RUN\\\"><code>DHCPSRVS_RUN</code></a>. Aseg\\u00farese de ingresar la programaci\\u00f3n en el formato similar a cron correcto (por ejemplo, valide en <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutar\\u00e1 el escaneo despu\\u00e9s de las 4 a.m. en el <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\"><code>TIMEZONE</ c\\u00f3digo> que configur\\u00f3 arriba</a>. Se ejecutar\\u00e1 la PR\\u00d3XIMA vez que pase el tiempo.\"}]}"
DHCPSRVS_RUN_TIMEOUT=5
DHCPSRVS_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": \"integer\", \"default_value\": 5, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo de espera de ejecuci\\u00f3n\"}, {\"language_code\": \"de_de\", \"string\": \"Wartezeit\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela.\"}]}"
DHCPSRVS_WATCH=['Watched_Value1']
DHCPSRVS_WATCH__metadata="{\"function\": \"WATCH\", \"type\": \"text.multiselect\", \"default_value\": [\"Watched_Value1\"], \"options\": [\"Watched_Value1\", \"Watched_Value2\", \"Watched_Value3\", \"Watched_Value4\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Watched\"}, {\"language_code\": \"es_es\", \"string\": \"Visto\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification if selected values change. Use <code>CTRL + Click</code> to select/deselect. <ul> <li><code>Watched_Value1</code> is Domain Name Server</li><li><code>Watched_Value2</code> is IP Offered</li><li><code>Watched_Value3</code> is Interface </li><li><code>Watched_Value4</code> is Router </li></ul>\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00ede una notificaci\\u00f3n si los valores seleccionados cambian. Utilice <code>CTRL + clic</code> para seleccionar/deseleccionar. <ul> <li><code>Watched_Value1</code> es servidor de nombres de dominio</li><li><code>Watched_Value2</code> es IP ofrecida</li><li><code>Watched_Value3</code> es Interfaz </li><li><code>Watched_Value4</code> es enrutador </li></ul>\"}]}"
DHCPSRVS_REPORT_ON=['new','watched-changed']
DHCPSRVS_REPORT_ON__metadata="{\"function\": \"REPORT_ON\", \"type\": \"text.multiselect\", \"default_value\": [\"new\", \"watched-changed\"], \"options\": [\"new\", \"watched-changed\", \"watched-not-changed\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Report on\"}, {\"language_code\": \"es_es\", \"string\": \"Informar sobre\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification only on these statuses. <code>new</code> means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered. <code>watched-changed</code> means that selected <code>Watched_ValueN</code> columns changed.\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00ede una notificaci\\u00f3n solo en estos estados. <code>new</code> significa que se descubri\\u00f3 un nuevo objeto \\u00fanico (una combinaci\\u00f3n \\u00fanica de PrimaryId y SecondaryId). <code>watched-changed</code> significa que las columnas <code>Watched_ValueN</code> seleccionadas cambiaron.\"}]}"
# INTRSPD
#---------------------------
INTRSPD_RUN='schedule'
INTRSPD_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"run\"], \"type\": \"text.select\", \"default_value\": \"disabled\", \"options\": [\"disabled\", \"once\", \"schedule\", \"always_after_scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cuando ejecuta\"}, {\"language_code\": \"de_de\", \"string\": \"Wann ausf\\u00fchren\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Enable a regular internet speedtest. If you select <code>schedule</code> the scheduling settings from below are applied. If you select <code>once</code> the scan is run only once on start of the application (container) for the time specified in <a href=\\\"#INTRSPD_RUN_TIMEOUT\\\"><code>INTRSPD_RUN_TIMEOUT</code> setting</a>.\"}, {\"language_code\": \"de_de\", \"string\": \"Aktiviere periodische Internetgeschwindigkeitstests. Wenn <code>schedule</code> ausgew\\u00e4hlt ist, werden die Einstellungen von unten genutzt. Bei <code>once</code> wird der Test nur einmal beim Start der Applikation (Container) f\\u00fcr die unten in der <a href=\\\"#INTRSPD_RUN_TIMEOUT\\\"><code>INTRSPD_RUN_TIMEOUT</code> Einstellung</a> gesetzten Zeit durchgef\\u00fchrt.\"}]}"
INTRSPD_CMD='python3 /home/pi/pialert/front/plugins/internet_speedtest/script.py'
INTRSPD_CMD__metadata="{\"function\": \"CMD\", \"type\": \"readonly\", \"default_value\": \"python3 /home/pi/pialert/front/plugins/internet_speedtest/script.py\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run\"}, {\"language_code\": \"es_es\", \"string\": \"Comando a ejecutar\"}, {\"language_code\": \"de_de\", \"string\": \"Auszuf\\u00fchrender Befehl\"}]}"
INTRSPD_RUN_SCHD='*/30 * * * *'
INTRSPD_RUN_SCHD__metadata="{\"function\": \"RUN_SCHD\", \"type\": \"text\", \"default_value\": \"*/30 * * * *\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"es_es\", \"string\": \"Schedule\"}, {\"language_code\": \"de_de\", \"string\": \"Zeitplan\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Only enabled if you select <code>schedule</code> in the <a href=\\\"#INTRSPD_RUN\\\"><code>INTRSPD_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.\"}, {\"language_code\": \"es_es\", \"string\": \"Solo habilitado si selecciona <code>schedule</code> en la configuraci\\u00f3n <a href=\\\"#INTRSPD_RUN\\\"><code>INTRSPD_RUN</code></a>. Aseg\\u00farese de ingresar el schedule en el formato similar a cron correcto (por ejemplo, valide en <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). Por ejemplo, ingrese <code >0 4 * * *</code> ejecutar\\u00e1 el escaneo despu\\u00e9s de las 4 am en el <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\"><code>TIMEZONE</code> que configur\\u00f3 arriba </a>. Se ejecutar\\u00e1 la PR\\u00d3XIMA vez que pase el tiempo.\"}, {\"language_code\": \"de_de\", \"string\": \"Nur aktiv, wenn <code>schedule</code> in der <a href=\\\"#INTRSPD_RUN\\\"><code>INTRSPD_RUN</code> Einstellung</a> ausgew\\u00e4hlt wurde. Sichergehen, dass das Intervall in einem korrekten cron-\\u00e4hnlichen Format angegeben wurde (z.B. auf <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a> testen). <code>0 4 * * *</code> w\\u00fcrde den Scan t\\u00e4glich um 4 Uhr in der <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\">oben ausgew\\u00e4hlten <code>TIMEZONE</code></a> starten. Wird erst beim N\\u00c4CHSTEN Intervall ausgef\\u00fchrt. <br/>Es wird empfohlen, das Intervall aller Plugins, welche nach neuen Ger\\u00e4ten suchen, auf den gleichen Wert zu setzen.\"}]}"
INTRSPD_RUN_TIMEOUT=60
INTRSPD_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": \"integer\", \"default_value\": 60, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo de espera de ejecuci\\u00f3n\"}, {\"language_code\": \"de_de\", \"string\": \"Zeitlimit\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela.\"}, {\"language_code\": \"de_de\", \"string\": \"Maximale Zeit in Sekunden, die auf den Abschluss des Skripts gewartet werden soll. Bei \\u00dcberschreitung dieser Zeit wird das Skript abgebrochen.\"}]}"
INTRSPD_WATCH=[]
INTRSPD_WATCH__metadata="{\"function\": \"WATCH\", \"type\": \"text.multiselect\", \"default_value\": [], \"options\": [\"Watched_Value1\", \"Watched_Value2\", \"Watched_Value3\", \"Watched_Value4\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Watched\"}, {\"language_code\": \"es_es\", \"string\": \"Visto\"}, {\"language_code\": \"de_de\", \"string\": \"\\u00dcberwacht\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification if selected values change. Use <code>CTRL + Click</code> to select/deselect. <ul> <li><code>Watched_Value1</code> is Download speed (not recommended)</li><li><code>Watched_Value2</code> is Upload speed (not recommended)</li><li><code>Watched_Value3</code> unused </li><li><code>Watched_Value4</code> unused </li></ul>\"}, {\"language_code\": \"de_de\", \"string\": \"Sende eine Benachrichtigung, wenn ein ausgw\\u00e4hlter Wert sich \\u00e4ndert. <code>STRG + klicken</code> zum aus-/abw\\u00e4hlen. <ul> <li><code>Watched_Value1</code> ist die Download-Geschwindigkeit (nicht empfohlen)</li><li><code>Watched_Value2</code> ist die Upload-Geschwindigkeit (nicht empfohlen)</li><li><code>Watched_Value3</code> ist nicht in Verwendung </li><li><code>Watched_Value4</code> ist nicht in Verwendung </li></ul>\"}]}"
INTRSPD_REPORT_ON=[]
INTRSPD_REPORT_ON__metadata="{\"function\": \"REPORT_ON\", \"type\": \"text.multiselect\", \"default_value\": [], \"options\": [\"new\", \"watched-changed\", \"watched-not-changed\", \"missing-in-last-scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Report on\"}, {\"language_code\": \"es_es\", \"string\": \"Informar sobre\"}, {\"language_code\": \"de_de\", \"string\": \"Benachrichtige wenn\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification only on these statuses. <code>new</code> means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered. <code>watched-changed</code> means that selected <code>Watched_ValueN</code> columns changed.\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00ede una notificaci\\u00f3n solo en estos estados. <code>new</code> significa que se descubri\\u00f3 un nuevo objeto \\u00fanico (combinaci\\u00f3n \\u00fanica de PrimaryId y SecondaryId). <code>watched-changed</code> significa que seleccion\\u00f3 <code>Watched_ValueN Las columnas </code> cambiaron.\"}, {\"language_code\": \"de_de\", \"string\": \"Benachrichtige nur bei diesen Status. <code>new</code> bedeutet ein neues eindeutiges (einzigartige Kombination aus PrimaryId und SecondaryId) Objekt wurde erkennt. <code>watched-changed</code> bedeutet eine ausgew\\u00e4hlte <code>Watched_ValueN</code>-Spalte hat sich ge\\u00e4ndert.\"}]}"
# SMTP
#---------------------------
SMTP_RUN='on_notification'
SMTP_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"test\"], \"type\": \"text.select\", \"default_value\": \"disabled\", \"options\": [\"disabled\", \"on_notification\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cuando ejecuta\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Enable sending notifications via the Email (SMTP) gateway.\"}, {\"language_code\": \"es_es\", \"string\": \"Si est\\u00e1 habilitado, se env\\u00eda un correo electr\\u00f3nico con una lista de cambios a los que se ha suscrito. Complete tambi\\u00e9n todas las configuraciones restantes relacionadas con la configuraci\\u00f3n de SMTP a continuaci\\u00f3n\"}]}"
SMTP_CMD='python3 /home/pi/pialert/front/plugins/_publisher_email/email_smtp.py'
SMTP_CMD__metadata="{\"function\": \"CMD\", \"type\": \"readonly\", \"default_value\": \"python3 /home/pi/pialert/front/plugins/_publisher_email/email_smtp.py\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run\"}, {\"language_code\": \"es_es\", \"string\": \"Comando a ejecutar\"}]}"
SMTP_RUN_TIMEOUT=20
SMTP_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": \"integer\", \"default_value\": 20, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo de espera de ejecuci\\u00f3n\"}, {\"language_code\": \"de_de\", \"string\": \"Wartezeit\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela.\"}]}"
SMTP_SERVER='smtp-relay.sendinblue.com'
SMTP_SERVER__metadata="{\"function\": \"SERVER\", \"type\": \"text\", \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"SMTP server URL\"}, {\"language_code\": \"es_es\", \"string\": \"URL del servidor SMTP\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The SMTP server host URL. For example <code>smtp-relay.sendinblue.com</code>. To use Gmail as an SMTP server <a target=\\\"_blank\\\" href=\\\"https://github.com/jokob-sk/Pi.Alert/blob/main/docs/SMTP.md\\\">follow this guide</a>\"}, {\"language_code\": \"es_es\", \"string\": \"La URL del host del servidor SMTP. Por ejemplo, <code>smtp-relay.sendinblue.com</code>. Para utilizar Gmail como servidor SMTP <a target=\\\"_blank\\\" href=\\\"https://github.com/jokob-sk/Pi.Alert/blob/main/docs/SMTP.md\\\">siga esta gu\\u00eda</a >\"}]}"
SMTP_PORT=587
SMTP_PORT__metadata="{\"function\": \"PORT\", \"type\": \"integer\", \"default_value\": 587, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"SMTP server PORT\"}, {\"language_code\": \"es_es\", \"string\": \"Puerto del servidor SMTP\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Port number used for the SMTP connection. Set to <code>0</code> if you do not want to use a port when connecting to the SMTP server.\"}, {\"language_code\": \"es_es\", \"string\": \"N\\u00famero de puerto utilizado para la conexi\\u00f3n SMTP. Establ\\u00e9zcalo en <code>0</code> si no desea utilizar un puerto al conectarse al servidor SMTP.\"}]}"
SMTP_SKIP_LOGIN=False
SMTP_SKIP_LOGIN__metadata="{\"function\": \"SKIP_LOGIN\", \"type\": \"boolean\", \"default_value\": false, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Skip authentication\"}, {\"language_code\": \"es_es\", \"string\": \"Omitir autenticaci\\u00f3n\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Do not use authentication when connecting to the SMTP server.\"}, {\"language_code\": \"es_es\", \"string\": \"No utilice la autenticaci\\u00f3n cuando se conecte al servidor SMTP.\"}]}"
SMTP_USER='r3pli3s@gmail.com'
SMTP_USER__metadata="{\"function\": \"USER\", \"type\": \"text\", \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"SMTP user\"}, {\"language_code\": \"es_es\", \"string\": \"Nombre de usuario SMTP\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The user name used to login into the SMTP server (sometimes a full email address).\"}, {\"language_code\": \"es_es\", \"string\": \"El nombre de usuario utilizado para iniciar sesi\\u00f3n en el servidor SMTP (a veces, una direcci\\u00f3n de correo electr\\u00f3nico completa).\"}]}"
SMTP_PASS='kDSy5aWOCIqrpEFT'
SMTP_PASS__metadata="{\"function\": \"PASS\", \"type\": \"password\", \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"SMTP password\"}, {\"language_code\": \"es_es\", \"string\": \"Contrase\\u00f1a de SMTP\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The SMTP server password.\"}, {\"language_code\": \"es_es\", \"string\": \"La contrase\\u00f1a del servidor SMTP.\"}]}"
SMTP_SKIP_TLS=False
SMTP_SKIP_TLS__metadata="{\"function\": \"SKIP_TLS\", \"type\": \"boolean\", \"default_value\": false, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Do not use TLS\"}, {\"language_code\": \"es_es\", \"string\": \"No usar TLS\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Disable TLS when connecting to your SMTP server.\"}, {\"language_code\": \"es_es\", \"string\": \"Deshabilite TLS cuando se conecte a su servidor SMTP.\"}]}"
SMTP_FORCE_SSL=False
SMTP_FORCE_SSL__metadata="{\"function\": \"FORCE_SSL\", \"type\": \"boolean\", \"default_value\": false, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Force SSL\"}, {\"language_code\": \"es_es\", \"string\": \"Forzar SSL\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Force SSL when connecting to your SMTP server.\"}, {\"language_code\": \"es_es\", \"string\": \"Forzar SSL al conectarse a su servidor SMTP\"}]}"
SMTP_REPORT_TO='jokob.sk@gmail.com'
SMTP_REPORT_TO__metadata="{\"function\": \"SMTP_REPORT_TO\", \"type\": \"text\", \"default_value\": \"user@gmail.com\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Send email to\"}, {\"language_code\": \"es_es\", \"string\": \"Enviar el email a\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Email address to which the notification will be send to.\"}, {\"language_code\": \"es_es\", \"string\": \"Direcci\\u00f3n de correo electr\\u00f3nico a la que se enviar\\u00e1 la notificaci\\u00f3n.\"}]}"
SMTP_REPORT_FROM='Pi.Alert <r3pli3s@gmail.com>'
SMTP_REPORT_FROM__metadata="{\"function\": \"SMTP_REPORT_FROM\", \"type\": \"text\", \"default_value\": \"Pi.Alert <user@gmail.com>\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Email subject\"}, {\"language_code\": \"es_es\", \"string\": \"Asunto del email\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Notification email subject line. Some SMTP servers need this to be an email.\"}, {\"language_code\": \"es_es\", \"string\": \"Asunto del correo electr\\u00f3nico de notificaci\\u00f3n.\"}]}"
# NEWDEV
#---------------------------
NEWDEV_dev_MAC=''
NEWDEV_dev_MAC__metadata="{\"function\": \"dev_MAC\", \"type\": \"readonly\", \"maxLength\": 50, \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Device MAC\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The MAC address of the device. Uneditable - Autodetected.\"}]}"
NEWDEV_dev_Name='(unknown)'
NEWDEV_dev_Name__metadata="{\"function\": \"dev_Name\", \"type\": \"readonly\", \"maxLength\": 50, \"default_value\": \"(unknown)\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Device Name\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The name of the device. Uneditable as internal functionality is dependent on specific new device names.\"}]}"
NEWDEV_dev_Owner__metadata="{\"function\": \"dev_Owner\", \"type\": \"string\", \"maxLength\": 30, \"default_value\": \"House\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Device Owner\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The owner of the device.\"}]}"
NEWDEV_dev_DeviceType__metadata="{\"function\": \"dev_DeviceType\", \"type\": \"string\", \"maxLength\": 30, \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Device Type\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The type of the device.\"}]}"
NEWDEV_dev_Vendor=''
NEWDEV_dev_Vendor__metadata="{\"function\": \"dev_Vendor\", \"type\": \"readonly\", \"maxLength\": 250, \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Device Vendor\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The vendor of the device. Uneditable - Autodetected.\"}]}"
NEWDEV_dev_Favorite=False
NEWDEV_dev_Favorite__metadata="{\"function\": \"dev_Favorite\", \"type\": \"integer.checkbox\", \"default_value\": 0, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Favorite Device\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Indicates whether the device is marked as a favorite.\"}]}"
NEWDEV_dev_Group__metadata="{\"function\": \"dev_Group\", \"type\": \"string\", \"maxLength\": 10, \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Device Group\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The group to which the device belongs.\"}]}"
NEWDEV_dev_Comments__metadata="{\"function\": \"dev_Comments\", \"type\": \"string\", \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Device Comments\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Additional comments or notes about the device.\"}]}"
NEWDEV_dev_FirstConnection=''
NEWDEV_dev_FirstConnection__metadata="{\"function\": \"dev_FirstConnection\", \"type\": \"readonly\", \"format\": \"date-time\", \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"First Connection\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The date and time of the first connection with the device. Uneditable - Autodetected.\"}]}"
NEWDEV_dev_LastConnection=''
NEWDEV_dev_LastConnection__metadata="{\"function\": \"dev_LastConnection\", \"type\": \"readonly\", \"format\": \"date-time\", \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Last Connection\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The date and time of the last connection with the device. Uneditable - Autodetected.\"}]}"
NEWDEV_dev_LastIP=''
NEWDEV_dev_LastIP__metadata="{\"function\": \"dev_LastIP\", \"type\": \"readonly\", \"maxLength\": 50, \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Last IP\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The last known IP address of the device. Uneditable - Autodetected.\"}]}"
NEWDEV_dev_StaticIP=False
NEWDEV_dev_StaticIP__metadata="{\"function\": \"dev_StaticIP\", \"type\": \"integer.checkbox\", \"default_value\": 0, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Static IP\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Indicates whether the device has a static IP address.\"}]}"
NEWDEV_dev_ScanCycle=True
NEWDEV_dev_ScanCycle__metadata="{\"function\": \"dev_ScanCycle\", \"type\": \"integer.checkbox\", \"default_value\": 1, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Scan Cycle\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The default value of the <code>Scan device</code> dropdown. Enable if newly discovered devices should be scanned.\"}]}"
NEWDEV_dev_LogEvents=True
NEWDEV_dev_LogEvents__metadata="{\"function\": \"dev_LogEvents\", \"type\": \"integer.checkbox\", \"default_value\": 1, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Log Events\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Indicates whether events related to the device shouldbe logged.\"}]}"
NEWDEV_dev_AlertEvents=True
NEWDEV_dev_AlertEvents__metadata="{\"function\": \"dev_AlertEvents\", \"type\": \"integer.checkbox\", \"default_value\": 1, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Alert Events\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Indicates whether events related to the device should trigger alerts. The default value of the <code>Alert All Events</code> checkbox.\"}]}"
NEWDEV_dev_AlertDeviceDown=False
NEWDEV_dev_AlertDeviceDown__metadata="{\"function\": \"dev_AlertDeviceDown\", \"type\": \"integer.checkbox\", \"default_value\": 0, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Alert Device Down\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Indicates whether an alert should be triggered when the device goes down. The default value of the <code>Alert Down</code> checkbox.\"}]}"
NEWDEV_dev_SkipRepeated=0
NEWDEV_dev_SkipRepeated__metadata="{\"function\": \"dev_SkipRepeated\", \"type\": \"integer\", \"default_value\": 0, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Skip Repeated\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The default value of the <code>Skip repeated notifications for</code> dropdown. Enter number of <b>hours</b> for which repeated notifications should be ignored for. If you enter <code>0</code> then you get notified on all events.\"}]}"
NEWDEV_dev_LastNotification=''
NEWDEV_dev_LastNotification__metadata="{\"function\": \"dev_LastNotification\", \"type\": \"readonly\", \"format\": \"date-time\", \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Last Notification\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The date and time of the last notification sent for the device. Uneditable - Autodetected.\"}]}"
NEWDEV_dev_PresentLastScan=True
NEWDEV_dev_PresentLastScan__metadata="{\"function\": \"dev_PresentLastScan\", \"type\": \"integer.checkbox\", \"default_value\": 1, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Present Last Scan\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Indicates whether the device should be marked as present after detected in a scan.\"}]}"
NEWDEV_dev_NewDevice=True
NEWDEV_dev_NewDevice__metadata="{\"function\": \"dev_NewDevice\", \"type\": \"integer.checkbox\", \"default_value\": true, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"New Device\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Indicates whether the device is considered a new device. The default value of the <code>New Device</code> checkbox.\"}]}"
NEWDEV_dev_Location__metadata="{\"function\": \"dev_Location\", \"type\": \"string\", \"maxLength\": 250, \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Device Location\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The location of the device.\"}]}"
NEWDEV_dev_Archived=False
NEWDEV_dev_Archived__metadata="{\"function\": \"dev_Archived\", \"type\": \"integer.checkbox\", \"default_value\": 0, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Archived\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Indicates whether the device is archived. The default value of the <code>Archived</code> checkbox.\"}]}"
NEWDEV_dev_Network_Node_MAC_ADDR__metadata="{\"function\": \"dev_Network_Node_MAC_ADDR\", \"type\": \"string\", \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Network Node MAC Address\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The MAC address of the network node.\"}]}"
NEWDEV_dev_Network_Node_port='0'
NEWDEV_dev_Network_Node_port__metadata="{\"function\": \"dev_Network_Node_port\", \"type\": \"readonly\", \"default_value\": 0, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Network Node Port\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The port number of the network node. Uneditable.\"}]}"
NEWDEV_dev_Icon__metadata="{\"function\": \"dev_Icon\", \"type\": \"string\", \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Device Icon\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The icon associated with the device. Check the <a href=\\\"https://github.com/jokob-sk/Pi.Alert/blob/main/docs/ICONS.md\\\" target=\\\"_blank\\\">documentation on icons</a> for more details.\"}]}"
# UNFIMP
#---------------------------
UNFIMP_RUN='disabled'
UNFIMP_RUN__metadata="{\"default_value\": \"disabled\", \"description\": [{\"language_code\": \"en_us\", \"string\": \"Enable import of devices from a UNIFI controller. If you select <code>schedule</code> the scheduling settings from below are applied. If you select <code>once</code> the scan is run only once on start of the application (container) or after you update your settings.\"}, {\"language_code\": \"es_es\", \"string\": \"Habilite la importaci\\u00f3n de dispositivos desde un controlador UNIFI. Si selecciona <code>schedule</code>, se aplican las configuraciones de programaci\\u00f3n de abajo. Si selecciona <code>once</code>, el an\\u00e1lisis se ejecuta solo una vez al iniciar la aplicaci\\u00f3n (contenedor) o despu\\u00e9s de actualizar su configuraci\\u00f3n.\"}, {\"language_code\": \"de_de\", \"string\": \"Aktiviere den Import von einem UNIFI controller. Bei <code>schedule</code> werden die Richtzeiten von weiter unten verwendet. Bei der Auswahl <code>once</code> der Import wird einmalig beim Start der Applikation (container), oder nach einem Update der Einstellungen durchgef\\u00fchrt.\"}], \"function\": \"RUN\", \"events\": [\"run\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cu\\u00e1ndo ejecutar\"}, {\"language_code\": \"de_de\", \"string\": \"Ausf\\u00fchrungszeitpunkt\"}], \"options\": [\"disabled\", \"once\", \"schedule\", \"always_after_scan\", \"on_new_device\"], \"type\": \"text.select\"}"
UNFIMP_CMD='python3 /home/pi/pialert/front/plugins/unifi_import/script.py username={username} password={password} host={host} sites={sites} port={port} verifyssl={verifyssl} version={version} fullimport={fullimport}'
UNFIMP_CMD__metadata="{\"default_value\": \"python3 /home/pi/pialert/front/plugins/unifi_import/script.py username={username} password={password} host={host} sites={sites} port={port} verifyssl={verifyssl} version={version} fullimport={fullimport}\", \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run. Not recommended to change.\"}, {\"language_code\": \"es_es\", \"string\": \"Comando para ejecutar. No se recomienda cambiar.\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl der ausgef\\u00fchrt wird. Anpassung nicht empfohlen\"}], \"function\": \"CMD\", \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl\"}], \"options\": [], \"type\": \"text\"}"
UNFIMP_username=''
UNFIMP_username__metadata="{\"default_value\": \"\", \"description\": [{\"language_code\": \"en_us\", \"string\": \"The username used to login into your UNIFI controller. It is recommended to create a read-only user account.\"}, {\"language_code\": \"es_es\", \"string\": \"El nombre de usuario utilizado para iniciar sesi\\u00f3n en su controlador UNIFI. Se recomienda crear una cuenta de usuario de s\\u00f3lo lectura.\"}], \"function\": \"username\", \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Username\"}, {\"language_code\": \"es_es\", \"string\": \"Nombre de usuario\"}], \"options\": [], \"type\": \"text\"}"
UNFIMP_password=''
UNFIMP_password__metadata="{\"default_value\": \"\", \"description\": [{\"language_code\": \"en_us\", \"string\": \"The password used to login into your UNIFI controller.\"}, {\"language_code\": \"es_es\", \"string\": \"La contrase\\u00f1a utilizada para iniciar sesi\\u00f3n en su controlador UNIFI.\"}], \"function\": \"password\", \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Password\"}, {\"language_code\": \"es_es\", \"string\": \"Contrase\\u00f1a\"}], \"options\": [], \"type\": \"password\"}"
UNFIMP_host='192.168.1.1'
UNFIMP_host__metadata="{\"default_value\": \"192.168.1.1\", \"description\": [{\"language_code\": \"en_us\", \"string\": \"The host (IP) where the UNIFI controller is runnig. Do NOT include the protocol (e.g. <code>https://</code>)\"}, {\"language_code\": \"es_es\", \"string\": \"El host (IP) donde se ejecuta el controlador UNIFI. NO incluya el protocolo (por ejemplo, <code>https://</code>)\"}], \"function\": \"host\", \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Host\"}, {\"language_code\": \"es_es\", \"string\": \"Host\"}], \"options\": [], \"type\": \"text\"}"
UNFIMP_port='8443'
UNFIMP_port__metadata="{\"default_value\": \"8443\", \"description\": [{\"language_code\": \"en_us\", \"string\": \"The port number where the UNIFI controller is runnig. Usually it is <code>8443</code>, for UDM(P) devices its 443.\"}, {\"language_code\": \"es_es\", \"string\": \"El n\\u00famero de puerto donde se ejecuta el controlador UNIFI. Normalmente es <code>8443</code>.\"}], \"function\": \"port\", \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Port number\"}, {\"language_code\": \"es_es\", \"string\": \"N\\u00famero de puerto\"}], \"options\": [], \"type\": \"text\"}"
UNFIMP_verifyssl='false'
UNFIMP_verifyssl__metadata="{\"default_value\": \"false\", \"description\": [{\"language_code\": \"en_us\", \"string\": \"verify SSL certificate validity <code>true|false</code>.\"}, {\"language_code\": \"es_es\", \"string\": \"verificar la validez del certificado SSL <code>true|false</code>.\"}], \"function\": \"verifyssl\", \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"verify SSL\"}, {\"language_code\": \"es_es\", \"string\": \"verificar SSL\"}], \"options\": [\"true\", \"false\"], \"type\": \"text.select\"}"
UNFIMP_version='v4'
UNFIMP_version__metadata="{\"function\": \"version\", \"type\": \"text\", \"default_value\": \"v4\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"API version\"}, {\"language_code\": \"es_es\", \"string\": \"Versi\\u00f3n API\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The base version of the Unify controller API. Supported values as of time of writing are <code>v4|v5|unifiOS|UDMP-unifiOS</code>.\"}, {\"language_code\": \"es_es\", \"string\": \"La versi\\u00f3n base de la API del controlador Unify. Los valores admitidos al momento de escribir este art\\u00edculo son <code>v4|v5|unifiOS|UDMP-unifiOS</code>.\"}]}"
UNFIMP_sites=['default']
UNFIMP_sites__metadata="{\"default_value\": [\"default\"], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The sites you want to connect to. Usually it is only one and the name is <code>default</code>. Check the URL in your UniFi controller UI if unsure.\"}, {\"language_code\": \"es_es\", \"string\": \"Los sitios a los que desea conectarse. Generalmente es solo uno y el nombre es <code>default</code>. Verifique la URL en la interfaz de usuario de su controlador UniFi si no est\\u00e1 seguro.\"}], \"function\": \"sites\", \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"UNIFI sites\"}, {\"language_code\": \"es_es\", \"string\": \"Sitios UNIFI\"}], \"options\": [], \"type\": \"list\"}"
UNFIMP_RUN_SCHD='0 2 * * *'
UNFIMP_RUN_SCHD__metadata="{\"default_value\": \"0 2 * * *\", \"description\": [{\"language_code\": \"en_us\", \"string\": \"Only enabled if you select <code>schedule</code> in the <a href=\\\"#UNFIMP_RUN\\\"><code>UNFIMP_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. <br/> It's recommended to use the same schedule interval for all plugins responsible for discovering new devices. \"}, {\"language_code\": \"es_es\", \"string\": \"Solo est\\u00e1 habilitado si selecciona <code>schedule</code> en la configuraci\\u00f3n <a href=\\\"#UNFIMP_RUN\\\"><code>UNFIMP_RUN</code></a>. Aseg\\u00farese de ingresar la programaci\\u00f3n en el formato similar a cron correcto (por ejemplo, valide en <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutar\\u00e1 el escaneo despu\\u00e9s de las 4 a.m. en el <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\"><code>TIMEZONE</ c\\u00f3digo> que configur\\u00f3 arriba</a>. Se ejecutar\\u00e1 la PR\\u00d3XIMA vez que pase el tiempo.\"}], \"function\": \"RUN_SCHD\", \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"es_es\", \"string\": \"Schedule\"}], \"options\": [], \"type\": \"text\"}"
UNFIMP_RUN_TIMEOUT=5
UNFIMP_RUN_TIMEOUT__metadata="{\"default_value\": 5, \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela.\"}, {\"language_code\": \"de_de\", \"string\": \"Maximale Laufzeit des Scripts. Nach Ablauf der Zeit wird das Script abgebrochen.\"}], \"function\": \"RUN_TIMEOUT\", \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo l\\u00edmite de ejecuci\\u00f3n\"}, {\"language_code\": \"de_de\", \"string\": \"Wartezeit\"}], \"options\": [], \"type\": \"integer\"}"
UNFIMP_WATCH=['Watched_Value1','Watched_Value4']
UNFIMP_WATCH__metadata="{\"default_value\": [\"Watched_Value1\", \"Watched_Value4\"], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification if selected values change. Use <code>CTRL + Click</code> to select/deselect. <ul> <li><code>Watched_Value1</code> is Hostname </li><li><code>Watched_Value2</code> is Vendor </li><li><code>Watched_Value3</code> is Type </li><li><code>Watched_Value4</code> is Online </li></ul>\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00ede una notificaci\\u00f3n si los valores seleccionados cambian. Utilice <code>CTRL + clic</code> para seleccionar/deseleccionar. <ul> <li><code>Watched_Value1</code> es el nombre de host </li><li><code>Watched_Value2</code> es el proveedor </li><li><code>Watched_Value3</code> es el tipo </li><li><code>Watched_Value4</code> es Online </li></ul>\"}], \"function\": \"WATCH\", \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Watched\"}, {\"language_code\": \"es_es\", \"string\": \"Visto\"}], \"options\": [\"Watched_Value1\", \"Watched_Value2\", \"Watched_Value3\", \"Watched_Value4\"], \"type\": \"text.multiselect\"}"
UNFIMP_REPORT_ON=['new','watched-changed']
UNFIMP_REPORT_ON__metadata="{\"default_value\": [\"new\", \"watched-changed\"], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification only on these statuses. <code>new</code> means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered. <code>watched-changed</code> means that selected <code>Watched_ValueN</code> columns changed.\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00ede una notificaci\\u00f3n solo en estos estados. <code>new</code> significa que se descubri\\u00f3 un nuevo objeto \\u00fanico (una combinaci\\u00f3n \\u00fanica de PrimaryId y SecondaryId). <code>watched-changed</code> significa que las columnas <code>Watched_ValueN</code> seleccionadas cambiaron.\"}], \"function\": \"REPORT_ON\", \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Report on\"}, {\"language_code\": \"es_es\", \"string\": \"Informar sobre\"}], \"options\": [\"new\", \"watched-changed\", \"watched-not-changed\", \"missing-in-last-scan\"], \"type\": \"text.multiselect\"}"
UNFIMP_fullimport='disabled'
UNFIMP_fullimport__metadata="{\"default_value\": \"disabled\", \"description\": [{\"language_code\": \"en_us\", \"string\": \"Enable a full import of all known devices by the controller instead of only the online ones. During the scan, all found devices appear online. If you select <code>once</code> the full import is only performed once and the status is set to <code>done</code> afterwards.\"}, {\"language_code\": \"es_es\", \"string\": \"Translation Needed - Enable a full import of all known devices by the controller instead of only the online ones. During the scan, all found devices appear online. If you select <code>once</code> the full import is only performed once and the status is set to <code>done</code> afterwards.\"}, {\"language_code\": \"de_de\", \"string\": \"F\\u00fchre einen kompletten Import aller dem Controller bekannten Ger\\u00e4ten durch. W\\u00e4hrend des Scans werden alle gefundenen Ger\\u00e4te einmalig als Online angezeigt. Bei der Auswahl von <code>once</code> wird der Scan einmalig durchgef\\u00fchrt und der Status anschliessend auf <code>done</code> gesetzt\"}], \"function\": \"fullimport\", \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Perform full import\"}, {\"language_code\": \"es_es\", \"string\": \"[ES] Perform full import\"}, {\"language_code\": \"de_de\", \"string\": \"Vollst\\u00e4ndigen Import durchf\\u00fchren\"}], \"options\": [\"disabled\", \"once\", \"always\"], \"type\": \"text.select\"}"
# SETPWD
#---------------------------
SETPWD_RUN='disabled'
SETPWD_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"run\"], \"type\": \"text.select\", \"default_value\": \"disabled\", \"options\": [\"disabled\", \"before_config_save\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cu\\u00e1ndo ejecuta\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Set to <code>before_config_save</code> and specify password to reset your pasword in <code>SETPWD_password</code>. You can set to <code>disabled</code> once the password is changed.\"}, {\"language_code\": \"es_es\", \"string\": \"Configure en <code>before_config_save</code> y especifique la contrase\\u00f1a para restablecer su contrase\\u00f1a en <code>SETPWD_password</code>. Puede establecer <code>deshabilitado</code> una vez que se cambia la contrase\\u00f1a.\"}]}"
SETPWD_CMD='/home/pi/pialert/back/pialert-cli set_password {password}'
SETPWD_CMD__metadata="{\"function\": \"CMD\", \"type\": \"text\", \"default_value\": \"/home/pi/pialert/back/pialert-cli set_password {password}\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run\"}, {\"language_code\": \"es_es\", \"string\": \"Comando a ejecutar\"}]}"
SETPWD_password='123456'
SETPWD_password__metadata="{\"function\": \"password\", \"type\": \"password\", \"maxLength\": 50, \"default_value\": \"123456\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Password\"}, {\"language_code\": \"es_es\", \"string\": \"Contrase\\u00f1a\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"The default password is <code>123456</code>. To change the password run <code>/home/pi/pialert/back/pialert-cli set_password {password}</code> in the container\"}, {\"language_code\": \"es_es\", \"string\": \"La contrase\\u00f1a predeterminada es <code>123456</code>. Para cambiar la contrase\\u00f1a, ejecute <code>/home/pi/pialert/back/pialert-cli set_password {password}</code> en el contenedor\"}]}"
# APPRISE
#---------------------------
APPRISE_RUN='on_notification'
APPRISE_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"test\"], \"type\": \"text.select\", \"default_value\": \"disabled\", \"options\": [\"disabled\", \"on_notification\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cuando ejecuta\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Enable sending notifications via <a target=\\\"_blank\\\" href=\\\"https://hub.docker.com/r/caronc/apprise\\\">Apprise</a>.\"}, {\"language_code\": \"es_es\", \"string\": \"Habilitar el env\\u00edo de notificaciones a trav\\u00e9s de <a target=\\\"_blank\\\" href=\\\"https://hub.docker.com/r/caronc/apprise\\\">Apprise</a>.\"}]}"
APPRISE_CMD='python3 /home/pi/pialert/front/plugins/_publisher_apprise/apprise.py'
APPRISE_CMD__metadata="{\"function\": \"CMD\", \"type\": \"readonly\", \"default_value\": \"python3 /home/pi/pialert/front/plugins/_publisher_apprise/apprise.py\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run\"}, {\"language_code\": \"es_es\", \"string\": \"Comando a ejecutar\"}]}"
APPRISE_RUN_TIMEOUT=10
APPRISE_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": \"integer\", \"default_value\": 10, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo de espera de ejecuci\\u00f3n\"}, {\"language_code\": \"de_de\", \"string\": \"Wartezeit\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela.\"}]}"
APPRISE_HOST='http://192.168.1.82:7058/notify'
APPRISE_HOST__metadata="{\"function\": \"HOST\", \"type\": \"text\", \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Apprise host URL\"}, {\"language_code\": \"es_es\", \"string\": \"URL del host de Apprise\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Apprise host URL starting with <code>http://</code> or <code>https://</code>. (do not forget to include <code>/notify</code> at the end)\"}, {\"language_code\": \"es_es\", \"string\": \"URL del host de Apprise que comienza con <code>http://</code> o <code>https://</code>. (no olvide incluir <code>/notify</code> al final)\"}]}"
APPRISE_URL='tgram://5878694092:AAHBs7nH9BnUMaQUQoWMd1fCyMlZRVmRdDs/-829946333'
APPRISE_URL__metadata="{\"function\": \"URL\", \"type\": \"text\", \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Apprise notification URL\"}, {\"language_code\": \"es_es\", \"string\": \"URL de notificaci\\u00f3n de Apprise\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Apprise notification target URL. For example for Telegram it would be <code>tgram://{bot_token}/{chat_id}</code>.\"}, {\"language_code\": \"es_es\", \"string\": \"Informar de la URL de destino de la notificaci\\u00f3n. Por ejemplo, para Telegram ser\\u00eda <code>tgram://{bot_token}/{chat_id}</code>.\"}]}"
APPRISE_PAYLOAD='text'
APPRISE_PAYLOAD__metadata="{\"function\": \"PAYLOAD\", \"type\": \"text.select\", \"default_value\": \"html\", \"options\": [\"html\", \"text\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Payload type\"}, {\"language_code\": \"es_es\", \"string\": \"Tipo de carga\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Select the payoad type sent to Apprise. For example <code>html</code> works well with emails, <code>text</code> with chat apps, such as Telegram.\"}, {\"language_code\": \"es_es\", \"string\": \"Seleccione el tipo de carga \\u00fatil enviada a Apprise. Por ejemplo, <code>html</code> funciona bien con correos electr\\u00f3nicos, <code>text</code> con aplicaciones de chat, como Telegram.\"}]}"
APPRISE_SIZE=1024
APPRISE_SIZE__metadata="{\"function\": \"SIZE\", \"type\": \"integer\", \"default_value\": 1024, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Max payload size\"}, {\"language_code\": \"es_es\", \"string\": \"Tama\\u00f1o m\\u00e1ximo de carga \\u00fatil\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"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.\"}, {\"language_code\": \"es_es\", \"string\": \"El tama\\u00f1o m\\u00e1ximo de la carga \\u00fatil de informaci\\u00f3n como n\\u00famero de caracteres en la cadena pasada. Si supera el l\\u00edmite, se truncar\\u00e1 y se agregar\\u00e1 un mensaje <code>(text was truncated)</code>.\"}]}"
# INTRNT
#---------------------------
INTRNT_RUN='disabled'
INTRNT_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"run\"], \"type\": \"text.select\", \"default_value\": \"schedule\", \"options\": [\"disabled\", \"once\", \"schedule\", \"always_after_scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}, {\"language_code\": \"es_es\", \"string\": \"Cu\\u00e1ndo ejecutar\"}, {\"language_code\": \"de_de\", \"string\": \"Wann ausf\\u00fchren\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"When the plugin should run. An hourly or daily <code>SCHEDULE</code> is a good option.\"}, {\"language_code\": \"de_de\", \"string\": \"Wann das Plugin ausgef\\u00fchrt werden soll. Eine st\\u00fcndliche oder t\\u00e4gliche <code>SCHEDULE</code> wird empfohlen.\"}]}"
INTRNT_CMD='python3 /home/pi/pialert/front/plugins/internet_ip/script.py prev_ip={prev_ip} DIG_GET_IP_ARG={DIG_GET_IP_ARG}'
INTRNT_CMD__metadata="{\"function\": \"CMD\", \"type\": \"readonly\", \"default_value\": \"python3 /home/pi/pialert/front/plugins/internet_ip/script.py prev_ip={prev_ip} DIG_GET_IP_ARG={DIG_GET_IP_ARG}\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}, {\"language_code\": \"es_es\", \"string\": \"Comando\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run. This can not be changed\"}, {\"language_code\": \"es_es\", \"string\": \"Comando a ejecutar. Esto no se puede cambiar\"}, {\"language_code\": \"de_de\", \"string\": \"Befehl zum Ausf\\u00fchren. Dies kann nicht ge\\u00e4ndert werden\"}]}"
INTRNT_RUN_SCHD='*/5 * * * *'
INTRNT_RUN_SCHD__metadata="{\"function\": \"RUN_SCHD\", \"type\": \"text\", \"default_value\": \"*/5 * * * *\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"es_es\", \"string\": \"Schedule\"}, {\"language_code\": \"de_de\", \"string\": \"Zeitplan\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Only enabled if you select <code>schedule</code> in the <a href=\\\"#INTRNT_RUN\\\"><code>INTRNT_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. It's recommended to use the same schedule interval for all plugins responsible for discovering new devices.\"}, {\"language_code\": \"es_es\", \"string\": \"Solo est\\u00e1 habilitado si selecciona <code>schedule</code> en la configuraci\\u00f3n <a href=\\\"#INTRNT_RUN\\\"><code>INTRNT_RUN</code></a>. Aseg\\u00farese de ingresar la programaci\\u00f3n en el formato similar a cron correcto (por ejemplo, valide en <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). Por ejemplo, ingresar <code>0 4 * * *</code> ejecutar\\u00e1 el escaneo despu\\u00e9s de las 4 a.m. en el <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\"><code>TIMEZONE</ c\\u00f3digo> que configur\\u00f3 arriba</a>. Se ejecutar\\u00e1 la PR\\u00d3XIMA vez que pase el tiempo.\"}, {\"language_code\": \"de_de\", \"string\": \"Nur aktiv, wenn <code>schedule</code> in der <a href=\\\"#INTRNT_RUN\\\"><code>INTRNT_RUN</code>Einstellung</a> ausgew\\u00e4hlt wurde. Sichergehen, dass das Intervall in einem korrekten cron-\\u00e4hnlichen Format angegeben wurde (z.B. auf <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a> testen). <code>0 4 * * *</code> w\\u00fcrde den Scan t\\u00e4glich um 4 Uhr in der <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\">oben ausgew\\u00e4hlten <code>TIMEZONE</code></a> starten. Wird erst beim N\\u00c4CHSTEN Intervall ausgef\\u00fchrt. <br/>Es wird empfohlen, das Intervall aller Plugins, welche nach neuen Ger\\u00e4ten suchen, auf den gleichen Wert zu setzen.\"}]}"
INTRNT_RUN_TIMEOUT=30
INTRNT_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": \"integer\", \"default_value\": 30, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo l\\u00edmite de ejecuci\\u00f3n\"}, {\"language_code\": \"de_de\", \"string\": \"Zeitlimit\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"es_es\", \"string\": \"Tiempo m\\u00e1ximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela.\"}, {\"language_code\": \"de_de\", \"string\": \"Maximale Zeit in Sekunden, die auf den Abschluss des Skripts gewartet werden soll. Bei \\u00dcberschreitung dieser Zeit wird das Skript abgebrochen.\"}]}"
INTRNT_WATCH=['Watched_Value1']
INTRNT_WATCH__metadata="{\"function\": \"WATCH\", \"type\": \"text.multiselect\", \"default_value\": [\"Watched_Value1\"], \"options\": [\"Watched_Value1\", \"Watched_Value2\", \"Watched_Value3\", \"Watched_Value4\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Watched\"}, {\"language_code\": \"es_es\", \"string\": \"Visto\"}, {\"language_code\": \"de_de\", \"string\": \"\\u00dcberwacht\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification if selected values change. Use <code>CTRL + Click</code> to select/deselect. <ul> <li><code>Watched_Value1</code> is Previous IP (not recommended)</li><li><code>Watched_Value2</code> unused</li><li><code>Watched_Value3</code> unused </li><li><code>Watched_Value4</code> unused </li></ul>\"}, {\"language_code\": \"de_de\", \"string\": \"Sende eine Benachrichtigung, wenn ein ausgw\\u00e4hlter Wert sich \\u00e4ndert. <code>STRG + klicken</code> zum aus-/abw\\u00e4hlen. <ul> <li><code>Watched_Value1</code> ist die Vorige IP (nicht empfohlen)</li><li><code>Watched_Value2</code> ist nicht in Verwendung</li><li><code>Watched_Value3</code> ist nicht in Verwendung </li><li><code>Watched_Value4</code> ist nicht in Verwendung </li></ul>\"}]}"
INTRNT_REPORT_ON=['new','watched-changed']
INTRNT_REPORT_ON__metadata="{\"function\": \"REPORT_ON\", \"type\": \"text.multiselect\", \"default_value\": [\"new\", \"watched-changed\"], \"options\": [\"new\", \"watched-changed\", \"watched-not-changed\", \"missing-in-last-scan\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Report on\"}, {\"language_code\": \"es_es\", \"string\": \"Informar sobre\"}, {\"language_code\": \"de_de\", \"string\": \"Benachrichtige wenn\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Send a notification only on these statuses. <code>new</code> means a new unique (unique combination of PrimaryId and SecondaryId) object was discovered. <code>watched-changed</code> means that selected <code>Watched_ValueN</code> columns changed.\"}, {\"language_code\": \"es_es\", \"string\": \"Env\\u00ede una notificaci\\u00f3n solo en estos estados. <code>new</code> significa que se descubri\\u00f3 un nuevo objeto \\u00fanico (una combinaci\\u00f3n \\u00fanica de PrimaryId y SecondaryId). <code>watched-changed</code> significa que las columnas <code>Watched_ValueN</code> seleccionadas cambiaron.\"}, {\"language_code\": \"de_de\", \"string\": \"Benachrichtige nur bei diesen Status. <code>new</code> bedeutet ein neues eindeutiges (einzigartige Kombination aus PrimaryId und SecondaryId) Objekt wurde erkennt. <code>watched-changed</code> bedeutet eine ausgew\\u00e4hlte <code>Watched_ValueN</code>-Spalte hat sich ge\\u00e4ndert.\"}]}"
#-------------------IMPORTANT INFO-------------------#
# This file is ingested by a python script, so if #
# modified it needs to use python syntax #
#-------------------IMPORTANT INFO-------------------#

BIN
back/pialert.db_bak Executable file

Binary file not shown.

View File

@@ -14,7 +14,9 @@
# /usr/share/ieee-data
# /var/lib/ieee-data
# ----------------------------------------------------------------------
echo "---------------------------------------------------------"
echo "[INSTALL] Run update_vendors.sh"
echo "---------------------------------------------------------"
# ----------------------------------------------------------------------
echo Updating... /usr/share/ieee-data/
@@ -51,6 +53,9 @@ sudo cp *.txt 2_backup
sudo get-iab -v
sudo get-oui -v
# make files readable
sudo chmod +r /usr/share/arp-scan/ieee-oui.txt
# Update from ieee website
# sudo get-iab -v -u http://standards-oui.ieee.org/iab/iab.txt
# sudo get-oui -v -u http://standards-oui.ieee.org/oui/oui.txt

View File

@@ -24,12 +24,10 @@ services:
- ${APP_DATA_LOCATION}/pialert/dhcp_samples/pihole_dhcp_full.leases:/etc/pihole/dhcp.leases
- ${APP_DATA_LOCATION}/pihole/etc-pihole/pihole-FTL.db:/etc/pihole/pihole-FTL.dba
- ${DEV_LOCATION}/pialert:/home/pi/pialert/pialert
- ${DEV_LOCATION}/back/report_template.html:/home/pi/pialert/back/report_template.html
- ${DEV_LOCATION}/back/report_template_new_version.html:/home/pi/pialert/back/report_template_new_version.html
- ${DEV_LOCATION}/back/report_template.txt:/home/pi/pialert/back/report_template.txt
- ${DEV_LOCATION}/dockerfiles:/home/pi/pialert/dockerfiles
- ${APP_DATA_LOCATION}/pialert/php.ini:/etc/php/7.4/fpm/php.ini
# - ${DEV_LOCATION}/front/api:/home/pi/pialert/front/api
- ${APP_DATA_LOCATION}/pialert/php.ini:/etc/php/8.2/fpm/php.ini
- ${DEV_LOCATION}/back:/home/pi/pialert/back
- ${DEV_LOCATION}/install:/home/pi/pialert/install
- ${DEV_LOCATION}/front/css:/home/pi/pialert/front/css
- ${DEV_LOCATION}/front/lib/AdminLTE:/home/pi/pialert/front/lib/AdminLTE
- ${DEV_LOCATION}/front/js:/home/pi/pialert/front/js

View File

@@ -1,33 +1,115 @@
#!/bin/sh
/home/pi/pialert/dockerfiles/user-mapping.sh
#!/bin/bash
echo "---------------------------------------------------------"
echo "[INSTALL] Run start.sh"
echo "---------------------------------------------------------"
INSTALL_DIR=/home/pi # Specify the installation directory here
# # if custom variables not set we do not need to do anything
# if [ -n "${TZ}" ]; then
# FILECONF=/home/pi/pialert/config/pialert.conf
# FILECONF=$INSTALL_DIR/pialert/config/pialert.conf
# if [ -f "$FILECONF" ]; then
# sed -ie "s|Europe/Berlin|${TZ}|g" /home/pi/pialert/config/pialert.conf
# sed -ie "s|Europe/Berlin|${TZ}|g" $INSTALL_DIR/pialert/config/pialert.conf
# else
# sed -ie "s|Europe/Berlin|${TZ}|g" /home/pi/pialert/back/pialert.conf_bak
# sed -ie "s|Europe/Berlin|${TZ}|g" $INSTALL_DIR/pialert/back/pialert.conf_bak
# fi
# fi
# Check if script is run as root
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root. Please use 'sudo'."
exit 1
fi
# Run setup scripts
echo "[INSTALL] Run setup scripts"
"$INSTALL_DIR/pialert/dockerfiles/user-mapping.sh"
"$INSTALL_DIR/pialert/install/install_dependencies.sh"
"$INSTALL_DIR/pialert/install/install_python.sh"
# Chaneg port number if set
if [ -n "${PORT}" ]; then
sed -ie 's/listen 20211/listen '${PORT}'/g' /etc/nginx/sites-available/default
fi
# I hope this will fix DB permission issues going forward
FILEDB=/home/pi/pialert/db/pialert.db
if [ -f "$FILEDB" ]; then
chown -R www-data:www-data /home/pi/pialert/db/pialert.db
echo "[INSTALL] Setup NGINX"
# Remove /html folder if exists
sudo rm -R /var/www/html
# create symbolic link to the pialert install directory
ln -s $INSTALL_DIR/pialert/front /var/www/html
# remove dfault NGINX site
sudo rm /etc/nginx/sites-available/default
# create symbolic link to NGINX configuaration coming with PiAlert
sudo ln -s "$INSTALL_DIR/pialert/install/default" /etc/nginx/sites-available/default
# use user-supplied port
sudo sed -i 's/listen 80/listen '"$PORT"'/g' /etc/nginx/sites-available/default
# Run the hardware vendors update at least once
echo "[INSTALL] Run the hardware vendors update"
# Define the path to ieee-oui.txt and ieee-iab.txt
oui_file="/usr/share/arp-scan/ieee-oui.txt"
# Check if ieee-oui.txt or ieee-iab.txt exist
if [ -f "$oui_file" ]; then
echo "The file ieee-oui.txt exists. Skipping update_vendors.sh..."
else
echo "The file ieee-oui.txt does not exist. Running update_vendors..."
# Run the update_vendors.sh script
if [ -f "$INSTALL_DIR/pialert/back/update_vendors.sh" ]; then
"$INSTALL_DIR/pialert/back/update_vendors.sh"
else
echo "update_vendors.sh script not found in $INSTALL_DIR."
fi
fi
chmod -R a+rw /home/pi/pialert/front/log
chmod -R a+rw /home/pi/pialert/config
# Fixing file permissions
echo "[INSTALL] Fixing file permissions"
/etc/init.d/php7.4-fpm start
chmod -R a+rwx $INSTALL_DIR
chmod -R a+rwx /var/www/html
chmod -R a+rw $INSTALL_DIR/pialert/front/log
chmod -R a+rw $INSTALL_DIR/pialert/config
FILEDB=$INSTALL_DIR/pialert/db/pialert.db
if [ -f "$FILEDB" ]; then
chown -R www-data:www-data $INSTALL_DIR/pialert/db/pialert.db
fi
echo "[INSTALL] Create pialert.db and pialert.conf backups"
# Create a backup of pialert.conf
cp "$INSTALL_DIR/pialert/config/pialert.conf" "$INSTALL_DIR/pialert/back/pialert.conf_bak"
# Create a backup of pialert.db
cp "$INSTALL_DIR/pialert/db/pialert.db" "$INSTALL_DIR/pialert/back/pialert.db_bak"
# Create buildtimestamp.txt
date +%s > "$INSTALL_DIR/pialert/front/buildtimestamp.txt"
# start PHP
/etc/init.d/php8.2-fpm start
/etc/init.d/nginx start
# cron -f
#python /home/pi/pialert/back/pialert.py
# echo "[DEBUG] DATA MONKEY VERSION ..."
python /home/pi/pialert/pialert/
# Start Nginx and your application to start at boot (if needed)
systemctl start nginx
systemctl enable nginx
# systemctl enable pi-alert
sudo systemctl restart nginx
# Activate the virtual python environment
source myenv/bin/activate
# Start the PiAlert python script
python $INSTALL_DIR/pialert/pialert/

View File

@@ -346,5 +346,134 @@ location ^~ /pialert/ {
```
## Traefik
> Submitted by [Isegrimm](https://github.com/Isegrimm) 🙏 (based on this [discussion](https://github.com/jokob-sk/Pi.Alert/discussions/449#discussioncomment-7281442))
Asuming the user already has a working Traefik setup, this is what's needed to make Pi.Alert work at a URL like www.domain.com/pialert/.
Note: Everything in these configs assumes '**www.domain.com**' as your domainname and '**section31**' as an arbitrary name for your certificate setup. You will have to substitute these with your own.
Also, I use the prefix '**pialert**'. If you want to use another prefix, change it in these files: dynamic.toml and default.
Content of my yaml-file (this is the generic Traefik config, which defines which ports to listen on, redirect http to https and sets up the certificate process).
It also contains Authelia, which I use for authentication.
This part contains nothing specific to Pi.Alert.
```yaml
version: '3.8'
services:
traefik:
image: traefik
container_name: traefik
command:
- "--api=true"
- "--api.insecure=true"
- "--api.dashboard=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
- "--entrypoints.web.http.redirections.entryPoint.scheme=https"
- "--entrypoints.websecure.address=:443"
- "--providers.file.filename=/traefik-config/dynamic.toml"
- "--providers.file.watch=true"
- "--log.level=ERROR"
- "--certificatesresolvers.section31.acme.email=postmaster@domain.com"
- "--certificatesresolvers.section31.acme.storage=/traefik-config/acme.json"
- "--certificatesresolvers.section31.acme.httpchallenge=true"
- "--certificatesresolvers.section31.acme.httpchallenge.entrypoint=web"
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- /appl/docker/traefik/config:/traefik-config
depends_on:
- authelia
restart: unless-stopped
authelia:
container_name: authelia
image: authelia/authelia:latest
ports:
- "9091:9091"
volumes:
- /appl/docker/authelia:/config
restart: u
nless-stopped
```
Snippet of the dynamic.toml file (referenced in the yml-file above) that defines the config for Pi.Alert:
The following are self-defined keywords, everything else is traefik keywords:
- pialert-router
- pialert-service
- auth
- pialert-stripprefix
```toml
[http.routers]
[http.routers.pialert-router]
entryPoints = ["websecure"]
rule = "Host(`www.domain.com`) && PathPrefix(`/pialert`)"
service = "pialert-service"
middlewares = "auth,pialert-stripprefix"
[http.routers.pialert-router.tls]
certResolver = "section31"
[[http.routers.pialert-router.tls.domains]]
main = "www.domain.com"
[http.services]
[http.services.pialert-service]
[[http.services.pialert-service.loadBalancer.servers]]
url = "http://internal-ip-address:20211/"
[http.middlewares]
[http.middlewares.auth.forwardAuth]
address = "http://authelia:9091/api/verify?rd=https://www.domain.com/authelia/"
trustForwardHeader = true
authResponseHeaders = ["Remote-User", "Remote-Groups", "Remote-Name", "Remote-Email"]
[http.middlewares.pialert-stripprefix.stripprefix]
prefixes = "/pialert"
forceSlash = false
```
To make Pi.Alert work with this setup I modified the default file at `/etc/nginx/sites-available/default` in the docker container by copying it to my local filesystem, adding the changes as specified by [cvc90](https://github.com/cvc90) and mounting the new file into the docker container, overwriting the original one. By mapping the file instead of changing the file in-place, the changes persist if an updated dockerimage is pulled. This is also a downside when the default file is updated, so I only use this as a temporary solution, until the dockerimage is updated with this change.
Default-file:
```
server {
listen 80 default_server;
root /var/www/html;
index index.php;
#rewrite /pialert/(.*) / permanent;
add_header X-Forwarded-Prefix "/pialert" always;
proxy_set_header X-Forwarded-Prefix "/pialert";
location ~* \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_connect_timeout 75;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
}
}
```
Mapping the updated file (on the local filesystem at `/appl/docker/pialert/default`) into the docker container:
```bash
docker run -d --rm --network=host \
--name=pi.alert \
-v /appl/docker/pialert/config:/home/pi/pialert/config \
-v /appl/docker/pialert/db:/home/pi/pialert/db \
-v /appl/docker/pialert/default:/etc/nginx/sites-available/default \
-e TZ=Europe/Amsterdam \
-e PORT=20211 \
jokobsk/pi.alert:latest
```

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

View File

@@ -66,14 +66,14 @@
{
"column": "Object_PrimaryID",
"css_classes": "col-sm-2",
"show": false,
"show": true,
"type": "url",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "N/A"
"string" : "MQTT Device ID"
}]
},
{
@@ -86,7 +86,7 @@
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Sensor ID"
"string" : "Sensor Name"
}]
},
{
@@ -134,7 +134,7 @@
},
{
"column": "Watched_Value2",
"css_classes": "col-sm-8",
"css_classes": "col-sm-2",
"show": true,
"type": "label",
"default_value":"",
@@ -155,20 +155,20 @@
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Sensor name"
"string" : "Hash"
}]
},
{
"column": "Watched_Value4",
"css_classes": "col-sm-2",
"show": true,
"show": false,
"type": "label",
"default_value":"",
"options": [],
"localized": ["name"],
"name":[{
"language_code": "en_us",
"string" : "Hash"
"string" : "N/A"
}
]
},

View File

@@ -10,6 +10,7 @@ from datetime import datetime
import time
import re
from paho.mqtt import client as mqtt_client
import hashlib
# Replace these paths with the actual paths to your Pi.Alert directories
@@ -18,8 +19,8 @@ sys.path.extend(["/home/pi/pialert/front/plugins", "/home/pi/pialert/pialert"])
# PiAlert modules
import conf
from const import apiPath
from plugin_helper import getPluginObject
from plugin_utils import Plugin_Objects
from plugin_utils import getPluginObject
from plugin_helper import Plugin_Objects
from logger import mylog, append_line_to_file
from helper import timeNowTZ, noti_obj, get_setting_value, bytes_to_string, sanitize_string
from notification import Notification_obj
@@ -32,6 +33,8 @@ RESULT_FILE = os.path.join(CUR_PATH, 'last_result.log')
# Initialize the Plugin obj output file
plugin_objects = Plugin_Objects(RESULT_FILE)
# Create an MD5 hash object
md5_hash = hashlib.md5()
pluginName = 'MQTT'
@@ -81,19 +84,31 @@ class sensor_config:
self.sensorType = sensorType
self.sensorName = sensorName
self.icon = icon
self.hash = str(hash(str(deviceId) + str(deviceName)+ str(sensorType)+ str(sensorName)+ str(icon)))
self.isNew = getPluginObject({"Plugin":"MQTT", "Watched_Value4":hash}) is None
# Define your input string
input_string = str(deviceId) + str(deviceName) + str(sensorType) + str(sensorName) + str(icon)
# Hash the input string and convert the hash to a string
# Update the hash object with the bytes of the input string
md5_hash.update(input_string.encode('utf-8'))
# Get the hexadecimal representation of the MD5 hash
md5_hash_hex = md5_hash.hexdigest()
hash_value = str(md5_hash_hex)
self.hash = hash_value
self.isNew = getPluginObject({"Plugin":"MQTT", "Watched_Value4":hash_value}) is None
# Log sensor
global plugin_objects
plugin_objects.add_object(
primaryId = pluginName,
secondaryId = deviceId,
primaryId = deviceId,
secondaryId = sensorName,
watched1 = deviceName,
watched2 = sensorType,
watched3 = sensorName,
watched4 = hash,
watched3 = hash,
watched4 = 'null',
extra = 'null',
foreignKey = deviceId
)

View File

@@ -18,8 +18,12 @@ CUR_PATH = str(pathlib.Path(__file__).parent.resolve())
LOG_FILE = os.path.join(CUR_PATH, 'script.log')
RESULT_FILE = os.path.join(CUR_PATH, 'last_result.log')
pluginName= 'DHCPLSS'
# -------------------------------------------------------------
def main():
mylog('verbose', ['[DHCPLSS] In script'])
mylog('verbose', [f'[{pluginName}] In script'])
last_run_logfile = open(RESULT_FILE, 'a')
last_run_logfile.write("")
@@ -32,42 +36,49 @@ def main():
if values.paths:
for path in values.paths.split('=')[1].split(','):
plugin_objects = get_entries(path, plugin_objects)
mylog('verbose', [f'[DHCPLSS] {len(plugin_objects)} Entries found in "{path}"'])
mylog('verbose', [f'[{pluginName}] {len(plugin_objects)} Entries found in "{path}"'])
plugin_objects.write_result_file()
# -------------------------------------------------------------
def get_entries(path, plugin_objects):
if 'pihole' in path:
with open(path, 'r') as f:
for line in f:
row = line.rstrip().split()
if len(row) == 5:
plugin_objects.add_object(
primaryId = handleEmpty(row[1]),
secondaryId = handleEmpty(row[2]),
watched1 = handleEmpty('True'),
watched2 = handleEmpty(row[3]),
watched3 = handleEmpty(row[4]),
watched4 = handleEmpty('True'),
extra = handleEmpty(path),
foreignKey = handleEmpty(row[1])
)
# Check if the path exists
if os.path.exists(path) == False:
mylog('none', [f'[{pluginName}] Error: "{path}" does not exist.'])
else:
leases = DhcpLeases(path)
leasesList = leases.get()
for lease in leasesList:
plugin_objects.add_object(
primaryId = handleEmpty(lease.ethernet),
secondaryId = handleEmpty(lease.ip),
watched1 = handleEmpty(lease.active),
watched2 = handleEmpty(lease.hostname),
watched3 = handleEmpty(lease.hardware),
watched4 = handleEmpty(lease.binding_state),
extra = handleEmpty(path),
foreignKey = handleEmpty(lease.ethernet)
)
# Handle pihole specific dhcp.leases files
if 'pihole' in path:
with open(path, 'r') as f:
for line in f:
row = line.rstrip().split()
if len(row) == 5:
plugin_objects.add_object(
primaryId = handleEmpty(row[1]),
secondaryId = handleEmpty(row[2]),
watched1 = handleEmpty('True'),
watched2 = handleEmpty(row[3]),
watched3 = handleEmpty(row[4]),
watched4 = handleEmpty('True'),
extra = handleEmpty(path),
foreignKey = handleEmpty(row[1])
)
else:
# Handle generic dhcp.leases files
leases = DhcpLeases(path)
leasesList = leases.get()
for lease in leasesList:
plugin_objects.add_object(
primaryId = handleEmpty(lease.ethernet),
secondaryId = handleEmpty(lease.ip),
watched1 = handleEmpty(lease.active),
watched2 = handleEmpty(lease.hostname),
watched3 = handleEmpty(lease.hardware),
watched4 = handleEmpty(lease.binding_state),
extra = handleEmpty(path),
foreignKey = handleEmpty(lease.ethernet)
)
return plugin_objects
if __name__ == '__main__':

View File

@@ -2,18 +2,17 @@ server {
listen 80 default_server;
root /var/www/html;
index index.php;
rewrite /pialert/(.*) / permanent;
#rewrite /pialert/(.*) / permanent;
add_header X-Forwarded-Prefix "/pialert" always;
proxy_set_header X-Forwarded-Prefix "/pialert";
location ~* \.php$ {
set $php_version "7.4"; # Default PHP version
# Use the selected PHP version
fastcgi_pass unix:/run/php/php$php_version-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_connect_timeout 75;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
}
location ~* \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_connect_timeout 75;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
}
}

49567
install/ieee-oui.txt Executable file

File diff suppressed because it is too large Load Diff

View File

@@ -1,18 +1,21 @@
#!/bin/bash
echo "---------------------------------------------------------"
echo "[INSTALL] Run install.sh"
echo "---------------------------------------------------------"
# Set environment variables
INSTALL_DIR=/home/pi # Specify the installation directory here
# Check if script is run as root
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root. Please use 'sudo'."
exit 1
fi
# Set environment variables
PORT=20211
INSTALL_DIR=/home/pi # Specify the installation directory here
# Update and upgrade system packages
# apt-get update
# apt-get upgrade -y
# Prepare the environment
apt-get update
apt-get install sudo -y
# Install Git
apt-get install -y git
@@ -20,79 +23,6 @@ apt-get install -y git
# Clone the application repository
git clone https://github.com/jokob-sk/Pi.Alert "$INSTALL_DIR/pialert"
# Install dependencies
apt-get install -y \
tini snmp ca-certificates curl libwww-perl arp-scan perl apt-utils cron sudo \
nginx-light php php-cgi php-fpm php-sqlite3 php-curl sqlite3 dnsutils net-tools \
python3 iproute2 nmap python3-pip zip systemctl usbutils traceroute
# ---------------------------------------------------------------
# alternate dependencies
sudo apt-get install -y \
nginx nginx-core mtr mtr-tiny php-fpm php7.4-fpm
sudo apt install php-cli php7.4 php7.4-fpm -y
sudo apt install php7.4-sqlite3 -y
sudo phpenmod -v 7.4 sqlite3
sudo apt install net-tools -y
curl -sSL https://bootstrap.pypa.io/get-pip.py | python3
# ---------------------------------------------------------------
# Install Python packages
pip3 install requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli
# Update alternatives for Python
update-alternatives --install /usr/bin/python python /usr/bin/python3 10
# Configure Nginx
echo "Configure Nginx"
echo "---------------------------------------------------------------"
sudo rm -R /var/www/html
ln -s $INSTALL_DIR/pialert/front /var/www/html
sudo rm /etc/nginx/sites-available/default
sudo ln -s "$INSTALL_DIR/pialert/install/default" /etc/nginx/sites-available/default
sudo sed -i 's/listen 80/listen '"$PORT"'/g' /etc/nginx/sites-available/default
echo "Run the hardware vendors update"
echo "---------------------------------------------------------------"
# Run the hardware vendors update
"$INSTALL_DIR/pialert/back/update_vendors.sh"
# Create a backup of pialert.conf
cp "$INSTALL_DIR/pialert/config/pialert.conf" "$INSTALL_DIR/pialert/back/pialert.conf_bak"
# Create a backup of pialert.db
cp "$INSTALL_DIR/pialert/db/pialert.db" "$INSTALL_DIR/pialert/back/pialert.db_bak"
# Create buildtimestamp.txt
date +%s > "$INSTALL_DIR/pialert/front/buildtimestamp.txt"
chmod -R a+rwx $INSTALL_DIR
chmod -R a+rwx /var/www/html
chmod -R a+rw $INSTALL_DIR/front/log
chmod -R a+rw $INSTALL_DIR/config
/etc/init.d/php7.4-fpm start
# /etc/init.d/php8.2-fpm start
/etc/init.d/nginx start
# Start Nginx and your application to start at boot (if needed)
systemctl start nginx
systemctl enable nginx
systemctl enable pi-alert
sudo systemctl restart nginx
# Provide instructions or additional setup if needed
echo "Installation completed. Please configure any additional settings for your application."
cd $INSTALL_DIR/pialert
# Start PiAlert
"$INSTALL_DIR/pialert/dockerfiles/start.sh"
# Exit the script
exit 0

31
install/install_dependencies.sh Executable file
View File

@@ -0,0 +1,31 @@
#!/bin/bash
echo "---------------------------------------------------------"
echo "[INSTALL] Run install_dependencies.sh"
echo "---------------------------------------------------------"
# Set environment variables
INSTALL_DIR=/home/pi # Specify the installation directory here
# Check if script is run as root
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root. Please use 'sudo'."
exit 1
fi
# Install dependencies
apt-get install -y \
tini snmp ca-certificates curl libwww-perl arp-scan perl apt-utils cron sudo \
nginx-light php php-cgi php-fpm php-sqlite3 php-curl sqlite3 dnsutils net-tools \
python3 iproute2 nmap python3-pip zip systemctl usbutils traceroute
# ---------------------------------------------------------------
# alternate dependencies
# sudo apt-get install mtr-tiny -y
sudo apt-get install nginx nginx-core mtr php-fpm php8.2-fpm -y
sudo apt-get install php-cli php8.2 php8.2-fpm -y
sudo apt-get install php8.2-sqlite3 -y
sudo phpenmod -v 8.2 sqlite3
# sudo apt-get install net-tools -y
# ---------------------------------------------------------------

17
install/install_python.sh Executable file
View File

@@ -0,0 +1,17 @@
#!/bin/bash
# apt-get install python3-requests python3-paho-mqtt python3-scapy -y
echo "---------------------------------------------------------"
echo "[INSTALL] Run install_python.sh"
echo "---------------------------------------------------------"
# setup virtual python environment so we can use pip3 to install packages
apt-get install python3.11-venv -y
python3 -m venv myenv
source myenv/bin/activate
update-alternatives --install /usr/bin/python python /usr/bin/python3 10
# install packages thru pip3
pip3 install requests paho-mqtt scapy cron-converter pytz json2table dhcp-leases pyunifi speedtest-cli

0
pialert/appevent.py Normal file → Executable file
View File

View File

@@ -14,8 +14,8 @@ logPath = pialertPath + '/front/log'
apiPath = pialertPath + '/front/api/'
fullConfPath = pialertPath + confPath
fullDbPath = pialertPath + dbPath
vendorsPath6 = '/usr/share/arp-scan/ieee-oui.txt'
vendorsPath9 = '/usr/share/arp-scan/ieee-iab.txt'
vendorsPath = '/usr/share/arp-scan/ieee-oui.txt'

View File

@@ -5,7 +5,7 @@ import conf
import re
from helper import timeNowTZ, get_setting, get_setting_value,resolve_device_name_dig, resolve_device_name_pholus, check_IP_format
from logger import mylog, print_log
from const import vendorsPath6, vendorsPath9
from const import vendorsPath
#-------------------------------------------------------------------------------
@@ -343,19 +343,13 @@ def query_MAC_vendor (pMAC):
mac_start_string9 = mac[0:9]
try:
with open(vendorsPath6, 'r') as f:
with open(vendorsPath, 'r') as f:
for line in f:
if line.startswith(mac_start_string6):
vendor = line.split(' ', 1)[1].strip()
mylog('debug', [f"[Vendor Check] Found '{vendor}' for '{pMAC}' in {vendorsPath6}"])
mylog('debug', [f"[Vendor Check] Found '{vendor}' for '{pMAC}' in {vendorsPath}"])
return vendor
with open(vendorsPath9, 'r') as f:
for line in f:
if line.startswith(mac_start_string9):
vendor = line.split(' ', 1)[1].strip()
mylog('debug', [f"[Vendor Check] Found '{vendor}' for '{pMAC}' in {vendorsPath9}"])
return vendor
return -1 # MAC address not found in the database
except FileNotFoundError:

0
pialert/notification.py Normal file → Executable file
View File

View File

@@ -3,7 +3,7 @@ import json
import conf
from logger import mylog
from const import pluginsPath, logPath
from const import pluginsPath, logPath, apiPath
from helper import timeNowTZ, updateState, get_file_content, write_file, get_setting, get_setting_value
module_name = 'Plugin utils'