From 1e693abfc49ce78397b8c808a362878fc5872a17 Mon Sep 17 00:00:00 2001 From: Jokob-sk Date: Sun, 8 Oct 2023 22:00:24 +1100 Subject: [PATCH] =?UTF-8?q?Notification=20rework=20-=20SMTP=20v0.2=20-=20W?= =?UTF-8?q?IP=F0=9F=91=B7=E2=80=8D=E2=99=82=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- front/php/templates/language/en_us.json | 26 +- front/plugins/_publisher_email/config.json | 1087 +++++++++++------- front/plugins/_publisher_email/ignore_plugin | 1 - pialert/__main__.py | 2 +- pialert/initialise.py | 72 +- pialert/publishers/email.py | 100 -- pialert/reporting.py | 2 - 7 files changed, 740 insertions(+), 550 deletions(-) delete mode 100755 front/plugins/_publisher_email/ignore_plugin delete mode 100755 pialert/publishers/email.py diff --git a/front/php/templates/language/en_us.json b/front/php/templates/language/en_us.json index 27620372..f1639a30 100755 --- a/front/php/templates/language/en_us.json +++ b/front/php/templates/language/en_us.json @@ -504,25 +504,13 @@ "Email_icon" : "", "REPORT_MAIL_name" : "Enable email", "REPORT_MAIL_description" : "If enabled an email is sent out with a list of changes you nove subscribed to. Please also fill out all remaining settings related to the SMTP setup below. If facing issues, set LOG_LEVEL to debug and check the error log.", - "SMTP_SERVER_name" : "SMTP server URL", - "SMTP_SERVER_description" : "The SMTP server host URL. For example smtp-relay.sendinblue.com. To use Gmail as an SMTP server follow this guide", - "SMTP_PORT_name" : "SMTP server PORT", - "SMTP_PORT_description" : "Port number used for the SMTP connection. Set to 0 if you do not want to use a port when connecting to the SMTP server.", - "SMTP_SKIP_LOGIN_name" : "Skip authentication", - "SMTP_SKIP_LOGIN_description" : "Do not use authentication when connecting to the SMTP server.", - "SMTP_USER_name" : "SMTP user", - "SMTP_USER_description" : "The user name used to login into the SMTP server (sometimes a full email address).", - "SMTP_PASS_name" : "SMTP password", - "SMTP_PASS_description" : "The SMTP server password. ", - "SMTP_SKIP_TLS_name" : "Do not use TLS", - "SMTP_SKIP_TLS_description" : "Disable TLS when connecting to your SMTP server.", - "SMTP_FORCE_SSL_name" : "Force SSL", - "SMTP_FORCE_SSL_description" : "Force SSL when connecting to your SMTP server.", - "SYSTEM_TITLE" : "System Information", - "REPORT_TO_name" : "Send email to", - "REPORT_TO_description" : "Email address to which the notification will be send to.", - "REPORT_FROM_name" : "Email subject", - "REPORT_FROM_description" : "Notification email subject line. Some SMTP servers need this to be an email.", + "SYSTEM_TITLE" : "System Information", + + "REPORT_TO_name" : "deprecated", + "REPORT_TO_description" : "deprecated", + "REPORT_FROM_name" : "deprecated", + "REPORT_FROM_description" : "deprecated", + "Webhooks_display_name" : "Webhooks", "Webhooks_icon" : "", "REPORT_WEBHOOK_name" : "Enable Webhooks", diff --git a/front/plugins/_publisher_email/config.json b/front/plugins/_publisher_email/config.json index d073f963..b1e62b03 100755 --- a/front/plugins/_publisher_email/config.json +++ b/front/plugins/_publisher_email/config.json @@ -1,424 +1,683 @@ { - "code_name": "_publisher_apprise", + "code_name": "_publisher_email", "unique_prefix": "SMTP", - "enabled": true, - "data_source": "script", + "enabled": true, + "data_source": "script", "show_ui": true, - "localized": ["display_name", "description", "icon"], - "display_name" : [ - { - "language_code": "en_us", - "string" : "Apprise publisher" - }, - { - "language_code": "es_es", - "string" : "Habilitar Apprise" - } + "localized": [ + "display_name", + "description", + "icon" ], - "icon":[{ + "display_name": [ + { "language_code": "en_us", - "string" : "" - }], + "string": "Email publisher (SMTP)" + }, + { + "language_code": "es_es", + "string": "Habilitar email (SMTP)" + } + ], + "icon": [ + { + "language_code": "en_us", + "string": "" + } + ], "description": [ - { + { "language_code": "en_us", - "string" : "A plugin to publish a notification via the Apprise gateway." - } + "string": "A plugin to publish a notification via Email (SMTP) gateway." + } ], - "params" : [], - "database_column_definitions": - [ - { - "column": "Index", - "css_classes": "col-sm-2", - "show": false, - "type": "label", - "default_value":"", - "options": [], - "localized": ["name"], - "name":[{ - "language_code": "en_us", - "string" : "N/A" - }, - { - "language_code": "es_es", - "string" : "N/A" - }] - }, - { - "column": "Plugin", - "css_classes": "col-sm-2", - "show": false, - "type": "label", - "default_value":"", - "options": [], - "localized": ["name"], - "name":[{ - "language_code": "en_us", - "string" : "N/A" - }, - { - "language_code": "es_es", - "string" : "N/A" - }] - }, - { - "column": "Object_PrimaryID", - "css_classes": "col-sm-2", - "show": false, - "type": "url", - "default_value":"", - "options": [], - "localized": ["name"], - "name":[{ - "language_code": "en_us", - "string" : "N/A" - }] - }, - { - "column": "Object_SecondaryID", - "css_classes": "col-sm-2", - "show": false, - "type": "label", - "default_value":"", - "options": [], - "localized": ["name"], - "name":[{ - "language_code": "en_us", - "string" : "N/A" - }, - { - "language_code": "es_es", - "string" : "N/A" - }] - }, - { - "column": "DateTimeCreated", - "css_classes": "col-sm-2", - "show": true, - "type": "label", - "default_value":"", - "options": [], - "localized": ["name"], - "name":[{ - "language_code": "en_us", - "string" : "Sent when" - }] - }, - { - "column": "DateTimeChanged", - "css_classes": "col-sm-2", - "show": false, - "type": "label", - "default_value":"", - "options": [], - "localized": ["name"], - "name":[{ - "language_code": "en_us", - "string" : "Changed" - }, - { - "language_code": "es_es", - "string" : "Cambiado" - }] - }, - { - "column": "Watched_Value1", - "css_classes": "col-sm-2", - "show": true, - "type": "label", - "default_value":"", - "options": [], - "localized": ["name"], - "name":[{ - "language_code": "en_us", - "string" : "Notification GUID" - }] - }, - { - "column": "Watched_Value2", - "css_classes": "col-sm-8", - "show": true, - "type": "textarea_readonly", - "default_value":"", - "options": [], - "localized": ["name"], - "name":[{ - "language_code": "en_us", - "string" : "Result" - }] - }, - { - "column": "Watched_Value3", - "css_classes": "col-sm-2", - "show": false, - "type": "label", - "default_value":"", - "options": [], - "localized": ["name"], - "name":[{ - "language_code": "en_us", - "string" : "N/A" - }, - { - "language_code": "es_es", - "string" : "N/A" - }] - }, - { - "column": "Watched_Value4", - "css_classes": "col-sm-2", - "show": false, - "type": "label", - "default_value":"", - "options": [], - "localized": ["name"], - "name":[{ - "language_code": "en_us", - "string" : "N/A" - }, - { - "language_code": "es_es", - "string" : "N/A" - }] - }, - { - "column": "UserData", - "css_classes": "col-sm-2", - "show": false, - "type": "textbox_save", - "default_value":"", - "options": [], - "localized": ["name"], - "name":[{ - "language_code": "en_us", - "string" : "Comments" - }, - { - "language_code": "es_es", - "string" : "Comentarios" - }] - }, - { - "column": "Status", - "css_classes": "col-sm-1", - "show": false, - "type": "replace", - "default_value":"", - "options": [ - { - "equals": "watched-not-changed", - "replacement": "
" - }, - { - "equals": "watched-changed", - "replacement": "
" - }, - { - "equals": "new", - "replacement": "
" - }, - { - "equals": "missing-in-last-scan", - "replacement": "
" - } - ], - "localized": ["name"], - "name":[{ - "language_code": "en_us", - "string" : "Status" - }, - { - "language_code": "es_es", - "string" : "Estado" - }] - }, - { - "column": "Extra", - "css_classes": "col-sm-3", - "show": false, - "type": "label", - "default_value":"", - "options": [], - "localized": ["name"], - "name":[{ - "language_code": "en_us", - "string" : "Extra" - }, - { - "language_code": "es_es", - "string" : "Extra" - }] - } + "params": [], + "database_column_definitions": [ + { + "column": "Index", + "css_classes": "col-sm-2", + "show": false, + "type": "label", + "default_value": "", + "options": [], + "localized": [ + "name" + ], + "name": [ + { + "language_code": "en_us", + "string": "N/A" + }, + { + "language_code": "es_es", + "string": "N/A" + } + ] + }, + { + "column": "Plugin", + "css_classes": "col-sm-2", + "show": false, + "type": "label", + "default_value": "", + "options": [], + "localized": [ + "name" + ], + "name": [ + { + "language_code": "en_us", + "string": "N/A" + }, + { + "language_code": "es_es", + "string": "N/A" + } + ] + }, + { + "column": "Object_PrimaryID", + "css_classes": "col-sm-2", + "show": false, + "type": "url", + "default_value": "", + "options": [], + "localized": [ + "name" + ], + "name": [ + { + "language_code": "en_us", + "string": "N/A" + } + ] + }, + { + "column": "Object_SecondaryID", + "css_classes": "col-sm-2", + "show": false, + "type": "label", + "default_value": "", + "options": [], + "localized": [ + "name" + ], + "name": [ + { + "language_code": "en_us", + "string": "N/A" + }, + { + "language_code": "es_es", + "string": "N/A" + } + ] + }, + { + "column": "DateTimeCreated", + "css_classes": "col-sm-2", + "show": true, + "type": "label", + "default_value": "", + "options": [], + "localized": [ + "name" + ], + "name": [ + { + "language_code": "en_us", + "string": "Sent when" + } + ] + }, + { + "column": "DateTimeChanged", + "css_classes": "col-sm-2", + "show": false, + "type": "label", + "default_value": "", + "options": [], + "localized": [ + "name" + ], + "name": [ + { + "language_code": "en_us", + "string": "Changed" + }, + { + "language_code": "es_es", + "string": "Cambiado" + } + ] + }, + { + "column": "Watched_Value1", + "css_classes": "col-sm-2", + "show": true, + "type": "label", + "default_value": "", + "options": [], + "localized": [ + "name" + ], + "name": [ + { + "language_code": "en_us", + "string": "Notification GUID" + } + ] + }, + { + "column": "Watched_Value2", + "css_classes": "col-sm-8", + "show": true, + "type": "textarea_readonly", + "default_value": "", + "options": [], + "localized": [ + "name" + ], + "name": [ + { + "language_code": "en_us", + "string": "Result" + } + ] + }, + { + "column": "Watched_Value3", + "css_classes": "col-sm-2", + "show": false, + "type": "label", + "default_value": "", + "options": [], + "localized": [ + "name" + ], + "name": [ + { + "language_code": "en_us", + "string": "N/A" + }, + { + "language_code": "es_es", + "string": "N/A" + } + ] + }, + { + "column": "Watched_Value4", + "css_classes": "col-sm-2", + "show": false, + "type": "label", + "default_value": "", + "options": [], + "localized": [ + "name" + ], + "name": [ + { + "language_code": "en_us", + "string": "N/A" + }, + { + "language_code": "es_es", + "string": "N/A" + } + ] + }, + { + "column": "UserData", + "css_classes": "col-sm-2", + "show": false, + "type": "textbox_save", + "default_value": "", + "options": [], + "localized": [ + "name" + ], + "name": [ + { + "language_code": "en_us", + "string": "Comments" + }, + { + "language_code": "es_es", + "string": "Comentarios" + } + ] + }, + { + "column": "Status", + "css_classes": "col-sm-1", + "show": false, + "type": "replace", + "default_value": "", + "options": [ + { + "equals": "watched-not-changed", + "replacement": "
" + }, + { + "equals": "watched-changed", + "replacement": "
" + }, + { + "equals": "new", + "replacement": "
" + }, + { + "equals": "missing-in-last-scan", + "replacement": "
" + } + ], + "localized": [ + "name" + ], + "name": [ + { + "language_code": "en_us", + "string": "Status" + }, + { + "language_code": "es_es", + "string": "Estado" + } + ] + }, + { + "column": "Extra", + "css_classes": "col-sm-3", + "show": false, + "type": "label", + "default_value": "", + "options": [], + "localized": [ + "name" + ], + "name": [ + { + "language_code": "en_us", + "string": "Extra" + }, + { + "language_code": "es_es", + "string": "Extra" + } + ] + } ], - "settings":[ - { - "function": "RUN", - "events": ["test"], - "type": "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 Apprise." - }, - { - "language_code": "es_es", - "string" : "Habilitar el envío de notificaciones a través de Apprise." - } - ] - }, - { - "function": "CMD", - "type": "readonly", - "default_value":"python3 /home/pi/pialert/front/plugins/_publisher_email/email.py", - "options": [], - "localized": ["name", "description"], - "name" : [{ - "language_code": "en_us", - "string" : "Command" - }, - { - "language_code": "es_es", - "string" : "Comando" - }], - "description": [{ - "language_code": "en_us", - "string" : "Command to run" - }, - { - "language_code": "es_es", - "string" : "Comando a ejecutar" - }] - }, - { - "function": "RUN_TIMEOUT", - "type": "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ón" - }, - { - "language_code": "de_de", - "string" : "Wartezeit" - }], - "description": [{ - "language_code": "en_us", - "string" : "Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted." - }, - { - "language_code": "es_es", - "string" : "Tiempo máximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela." - }] - }, - { - "function": "HOST", - "type": "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 http:// or https://. (do not forget to include /notify at the end)" - }, - { - "language_code": "es_es", - "string" : "URL del host de Apprise que comienza con http:// o https://. (no olvide incluir /notify al final)" - }] - }, - { - "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ón de Apprise" - }], - "description": [{ - "language_code": "en_us", - "string" : "Apprise notification target URL. For example for Telegram it would be tgram://{bot_token}/{chat_id}." - }, - { - "language_code": "es_es", - "string" : "Informar de la URL de destino de la notificación. Por ejemplo, para Telegram sería tgram://{bot_token}/{chat_id}." - }] - }, - { - "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 html works well with emails, text with chat apps, such as Telegram." - }, - { - "language_code": "es_es", - "string" : "Seleccione el tipo de carga útil enviada a Apprise. Por ejemplo, html funciona bien con correos electrónicos, text con aplicaciones de chat, como Telegram." - }] - }, - { - "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ño máximo de carga útil" - }], - "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 (text was truncated) message is appended." - }, - { - "language_code": "es_es", - "string" : "El tamaño máximo de la carga útil de información como número de caracteres en la cadena pasada. Si supera el límite, se truncará y se agregará un mensaje (text was truncated)." - }] - } + "settings": [ + { + "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á habilitado, se envía un correo electrónico con una lista de cambios a los que se ha suscrito. Complete también todas las configuraciones restantes relacionadas con la configuración de SMTP a continuación" + } + ] + }, + { + "function": "CMD", + "type": "readonly", + "default_value": "python3 /home/pi/pialert/front/plugins/_publisher_email/email.py", + "options": [], + "localized": [ + "name", + "description" + ], + "name": [ + { + "language_code": "en_us", + "string": "Command" + }, + { + "language_code": "es_es", + "string": "Comando" + } + ], + "description": [ + { + "language_code": "en_us", + "string": "Command to run" + }, + { + "language_code": "es_es", + "string": "Comando a ejecutar" + } + ] + }, + { + "function": "RUN_TIMEOUT", + "type": "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ón" + }, + { + "language_code": "de_de", + "string": "Wartezeit" + } + ], + "description": [ + { + "language_code": "en_us", + "string": "Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted." + }, + { + "language_code": "es_es", + "string": "Tiempo máximo en segundos para esperar a que finalice el script. Si se supera este tiempo, el script se cancela." + } + ] + }, + { + "function": "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 smtp-relay.sendinblue.com. To use Gmail as an SMTP server follow this guide" + }, + { + "language_code": "es_es", + "string": "La URL del host del servidor SMTP. Por ejemplo, smtp-relay.sendinblue.com. Para utilizar Gmail como servidor SMTP siga esta guía" + } + ] + }, + { + "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 0 if you do not want to use a port when connecting to the SMTP server." + }, + { + "language_code": "es_es", + "string": "Número de puerto utilizado para la conexión SMTP. Establézcalo en 0 si no desea utilizar un puerto al conectarse al servidor SMTP." + } + ] + }, + { + "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ón" + } + ], + "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ón cuando se conecte al servidor SMTP." + } + ] + }, + { + "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ón en el servidor SMTP (a veces, una dirección de correo electrónico completa)." + } + ] + }, + { + "function": "PASS", + "type": "password", + "default_value": "", + "options": [], + "localized": [ + "name", + "description" + ], + "name": [ + { + "language_code": "en_us", + "string": "SMTP password" + }, + { + "language_code": "es_es", + "string": "Contraseña de SMTP" + } + ], + "description": [ + { + "language_code": "en_us", + "string": "The SMTP server password." + }, + { + "language_code": "es_es", + "string": "La contraseña del servidor SMTP." + } + ] + }, + { + "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." + } + ] + }, + { + "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" + } + ] + }, + { + "function": "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ón de correo electrónico a la que se enviará la notificación." + } + ] + }, + { + "function": "REPORT_FROM", + "type": "text", + "default_value": "Pi.Alert ", + "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ónico de notificación." + } + ] + } ] -} + } \ No newline at end of file diff --git a/front/plugins/_publisher_email/ignore_plugin b/front/plugins/_publisher_email/ignore_plugin deleted file mode 100755 index 77ffa1c1..00000000 --- a/front/plugins/_publisher_email/ignore_plugin +++ /dev/null @@ -1 +0,0 @@ -This plugin will not be loaded \ No newline at end of file diff --git a/pialert/__main__.py b/pialert/__main__.py index 6eedc75e..f801cc31 100755 --- a/pialert/__main__.py +++ b/pialert/__main__.py @@ -24,7 +24,7 @@ import multiprocessing import conf from const import * from logger import mylog -from helper import filePermissions, timeNowTZ, updateState, get_setting_value, noti_obj +from helper import filePermissions, timeNowTZ, updateState, get_setting_value, noti_obj from api import update_api from networkscan import process_scan from initialise import importConfigs diff --git a/pialert/initialise.py b/pialert/initialise.py index 68690d26..83d24be7 100755 --- a/pialert/initialise.py +++ b/pialert/initialise.py @@ -6,6 +6,9 @@ from cron_converter import Cron from pathlib import Path import datetime import json +import shutil +import re + import conf from const import fullConfPath @@ -62,6 +65,9 @@ def importConfigs (db): # Only import file if the file was modifed since last import. # this avoids time zone issues as we just compare the previous timestamp to the current time stamp + # rename settings that have changed names due to code cleanup and migration to plugins + renameSettings(config_file) + fileModifiedTime = os.path.getmtime(config_file) mylog('debug', ['[Import Config] checking config file ']) @@ -114,18 +120,6 @@ def importConfigs (db): # Notification gateways # ---------------------------------------- - # Email - conf.REPORT_MAIL = ccd('REPORT_MAIL', False , c_d, 'Enable email', 'boolean', '', 'Email', ['test']) - conf.SMTP_SERVER = ccd('SMTP_SERVER', '' , c_d,'SMTP server URL', 'text', '', 'Email') - conf.SMTP_PORT = ccd('SMTP_PORT', 587 , c_d, 'SMTP port', 'integer', '', 'Email') - conf.REPORT_TO = ccd('REPORT_TO', 'user@gmail.com' , c_d, 'Email to', 'text', '', 'Email') - conf.REPORT_FROM = ccd('REPORT_FROM', 'Pi.Alert ' , c_d, 'Email Subject', 'text', '', 'Email') - conf.SMTP_SKIP_LOGIN = ccd('SMTP_SKIP_LOGIN', False , c_d, 'SMTP skip login', 'boolean', '', 'Email') - conf.SMTP_USER = ccd('SMTP_USER', '' , c_d, 'SMTP user', 'text', '', 'Email') - conf.SMTP_PASS = ccd('SMTP_PASS', '' , c_d, 'SMTP password', 'password', '', 'Email') - conf.SMTP_SKIP_TLS = ccd('SMTP_SKIP_TLS', False , c_d, 'SMTP skip TLS', 'boolean', '', 'Email') - conf.SMTP_FORCE_SSL = ccd('SMTP_FORCE_SSL', False , c_d, 'Force SSL', 'boolean', '', 'Email') - # Webhooks conf.REPORT_WEBHOOK = ccd('REPORT_WEBHOOK', False , c_d, 'Enable Webhooks', 'boolean', '', 'Webhooks', ['test']) conf.WEBHOOK_URL = ccd('WEBHOOK_URL', '' , c_d, 'Target URL', 'text', '', 'Webhooks') @@ -283,4 +277,56 @@ def read_config_file(filename): code = compile(filename.read_text(), filename.name, "exec") confDict = {} # config dictionary exec(code, {"__builtins__": {}}, confDict) - return confDict \ No newline at end of file + return confDict + + +#------------------------------------------------------------------------------- +replacements = { + r'\bREPORT_TO\b': 'SMTP_REPORT_TO', + r'\bREPORT_FROM\b': 'SMTP_REPORT_FROM' +} + +def renameSettings(config_file): + # Check if the file contains any of the old setting code names + contains_old_settings = False + + # Open the original config_file for reading + with open(str(config_file), 'r') as original_file: # Convert config_file to a string + for line in original_file: + # Use regular expressions with word boundaries to check for the old setting code names + if any(re.search(key, line) for key in replacements.keys()): + contains_old_settings = True + break # Exit the loop if any old setting is found + + # If the file contains old settings, proceed with renaming and backup + if contains_old_settings: + # Create a backup file with the suffix "_old_setting_names" and timestamp + timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S") + backup_file = f"{config_file}_old_setting_names_{timestamp}.bak" + + mylog('debug', f'[Config] Old setting names will be replaced and a backup ({backup_file}) of the config created.') + + shutil.copy(str(config_file), backup_file) # Convert config_file to a string + + # Open the original config_file for reading and create a temporary file for writing + with open(str(config_file), 'r') as original_file, open(str(config_file) + "_temp", 'w') as temp_file: # Convert config_file to a string + for line in original_file: + # Use regular expressions with word boundaries for replacements + for key, value in replacements.items(): + line = re.sub(key, value, line) + + # Write the modified line to the temporary file + temp_file.write(line) + + # Close both files + original_file.close() + temp_file.close() + + # Replace the original config_file with the temporary file + shutil.move(str(config_file) + "_temp", str(config_file)) # Convert config_file to a string + else: + mylog('debug', '[Config] No old setting names found in the file. No changes made.') + + + + \ No newline at end of file diff --git a/pialert/publishers/email.py b/pialert/publishers/email.py deleted file mode 100755 index acf37834..00000000 --- a/pialert/publishers/email.py +++ /dev/null @@ -1,100 +0,0 @@ -""" Pi.Alert module to send notification emails """ - -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText -import smtplib - - -import conf -import socket -from helper import hide_email, noti_obj -from logger import mylog, print_log - -#------------------------------------------------------------------------------- -def check_config (): - if conf.SMTP_SERVER == '' or conf.REPORT_FROM == '' or conf.REPORT_TO == '': - mylog('none', ['[Email Check Config] Error: Email service not set up correctly. Check your pialert.conf SMTP_*, REPORT_FROM and REPORT_TO variables.']) - return False - else: - return True - -#------------------------------------------------------------------------------- -def send (msg: noti_obj): - - pText = msg.text - pHTML = msg.html - - mylog('debug', '[Send Email] REPORT_TO: ' + hide_email(str(conf.REPORT_TO)) + ' SMTP_USER: ' + hide_email(str(conf.SMTP_USER))) - - # Compose email - msg = MIMEMultipart('alternative') - msg['Subject'] = 'Pi.Alert Report' - msg['From'] = conf.REPORT_FROM - msg['To'] = conf.REPORT_TO - msg.attach (MIMEText (pText, 'plain')) - msg.attach (MIMEText (pHTML, 'html')) - - failedAt = '' - - failedAt = print_log ('SMTP try') - - try: - # Send mail - failedAt = print_log('Trying to open connection to ' + str(conf.SMTP_SERVER) + ':' + str(conf.SMTP_PORT)) - - # Set a timeout for the SMTP connection (in seconds) - smtp_timeout = 30 - - if conf.SMTP_FORCE_SSL: - failedAt = print_log('SMTP_FORCE_SSL == True so using .SMTP_SSL()') - if conf.SMTP_PORT == 0: - failedAt = print_log('SMTP_PORT == 0 so sending .SMTP_SSL(SMTP_SERVER)') - smtp_connection = smtplib.SMTP_SSL(conf.SMTP_SERVER) - else: - failedAt = print_log('SMTP_PORT == 0 so sending .SMTP_SSL(SMTP_SERVER, SMTP_PORT)') - smtp_connection = smtplib.SMTP_SSL(conf.SMTP_SERVER, conf.SMTP_PORT, timeout=smtp_timeout) - - else: - failedAt = print_log('SMTP_FORCE_SSL == False so using .SMTP()') - if conf.SMTP_PORT == 0: - failedAt = print_log('SMTP_PORT == 0 so sending .SMTP(SMTP_SERVER)') - smtp_connection = smtplib.SMTP (conf.SMTP_SERVER) - else: - failedAt = print_log('SMTP_PORT == 0 so sending .SMTP(SMTP_SERVER, SMTP_PORT)') - smtp_connection = smtplib.SMTP (conf.SMTP_SERVER, conf.SMTP_PORT) - - failedAt = print_log('Setting SMTP debug level') - - # Log level set to debug of the communication between SMTP server and client - if conf.LOG_LEVEL == 'debug': - smtp_connection.set_debuglevel(1) - - failedAt = print_log( 'Sending .ehlo()') - smtp_connection.ehlo() - - if not conf.SMTP_SKIP_TLS: - failedAt = print_log('SMTP_SKIP_TLS == False so sending .starttls()') - smtp_connection.starttls() - failedAt = print_log('SMTP_SKIP_TLS == False so sending .ehlo()') - smtp_connection.ehlo() - if not conf.SMTP_SKIP_LOGIN: - failedAt = print_log('SMTP_SKIP_LOGIN == False so sending .login()') - smtp_connection.login (conf.SMTP_USER, conf.SMTP_PASS) - - failedAt = print_log('Sending .sendmail()') - smtp_connection.sendmail (conf.REPORT_FROM, conf.REPORT_TO, msg.as_string()) - smtp_connection.quit() - except smtplib.SMTPAuthenticationError as e: - mylog('none', [' ERROR: Failed at - ', failedAt]) - mylog('none', [' ERROR: Couldn\'t connect to the SMTP server (SMTPAuthenticationError), skipping Email (enable LOG_LEVEL=debug for more logging)']) - mylog('none', [' ERROR: ', str(e)]) - except smtplib.SMTPServerDisconnected as e: - mylog('none', [' ERROR: Failed at - ', failedAt]) - mylog('none', [' ERROR: Couldn\'t connect to the SMTP server (SMTPServerDisconnected), skipping Email (enable LOG_LEVEL=debug for more logging)']) - mylog('none', [' ERROR: ', str(e)]) - except socket.gaierror as e: - mylog('none', [' ERROR: Failed at - ', failedAt]) - mylog('none', [' ERROR: Could not resolve hostname (socket.gaierror), skipping Email (enable LOG_LEVEL=debug for more logging)']) - mylog('none', [' ERROR: ', str(e)]) - - mylog('debug', '[Send Email] Last executed - ' + str(failedAt)) \ No newline at end of file diff --git a/pialert/reporting.py b/pialert/reporting.py index 8912d579..4dc99941 100755 --- a/pialert/reporting.py +++ b/pialert/reporting.py @@ -24,8 +24,6 @@ from const import pialertPath, logPath, apiPath from helper import noti_obj, generate_mac_links, removeDuplicateNewLines, timeNowTZ, hide_email, updateState, get_file_content, write_file from logger import logResult, mylog, print_log -from publishers.email import (check_config as email_check_config, - send as send_email ) from publishers.ntfy import (check_config as ntfy_check_config, send as send_ntfy ) from publishers.webhook import (check_config as webhook_check_config,