diff --git a/docs/HOME_ASSISTANT.md b/docs/HOME_ASSISTANT.md
index 15316e52..abca1ddc 100755
--- a/docs/HOME_ASSISTANT.md
+++ b/docs/HOME_ASSISTANT.md
@@ -1,4 +1,4 @@
-# Overview
+# Home Assistant integration overview
NetAlertX comes with MQTT support, allowing you to show all detected devices as devices in Home Assistant. It also supplies a collection of stats, such as number of online devices.
diff --git a/front/php/templates/language/cs_cz.json b/front/php/templates/language/cs_cz.json
old mode 100644
new mode 100755
diff --git a/front/plugins/__template/rename_me.py b/front/plugins/__template/rename_me.py
index 279a5fab..49f2a760 100755
--- a/front/plugins/__template/rename_me.py
+++ b/front/plugins/__template/rename_me.py
@@ -16,7 +16,8 @@ from plugin_utils import get_plugins_configs
from logger import mylog, Logger
from const import pluginsPath, fullDbPath, logPath
from helper import timeNowTZ, get_setting_value
-from notification import write_notification
+
+from messaging.in_app import write_notification
import conf
# Make sure the TIMEZONE for logging is correct
diff --git a/front/plugins/__test/test.py b/front/plugins/__test/test.py
index 297a7767..e87bdfb4 100755
--- a/front/plugins/__test/test.py
+++ b/front/plugins/__test/test.py
@@ -24,7 +24,7 @@ from plugin_utils import getPluginObject
from plugin_helper import Plugin_Objects
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value, bytes_to_string, sanitize_string, cleanDeviceName
-from notification import Notification_obj
+from models.notification_instance import NotificationInstance
from database import DB, get_device_stats
pluginName = 'TESTONLY'
diff --git a/front/plugins/_publisher_apprise/apprise.py b/front/plugins/_publisher_apprise/apprise.py
index 4e8a5f85..e80a4c9a 100755
--- a/front/plugins/_publisher_apprise/apprise.py
+++ b/front/plugins/_publisher_apprise/apprise.py
@@ -17,7 +17,7 @@ from const import confFileName, logPath
from plugin_helper import Plugin_Objects
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value
-from notification import Notification_obj
+from models.notification_instance import NotificationInstance
from database import DB
from pytz import timezone
@@ -50,8 +50,8 @@ def main():
# Initialize the Plugin obj output file
plugin_objects = Plugin_Objects(RESULT_FILE)
- # Create a Notification_obj instance
- notifications = Notification_obj(db)
+ # Create a NotificationInstance instance
+ notifications = NotificationInstance(db)
# Retrieve new notifications
new_notifications = notifications.getNew()
diff --git a/front/plugins/_publisher_email/email_smtp.py b/front/plugins/_publisher_email/email_smtp.py
index acd6b61d..807bccb6 100755
--- a/front/plugins/_publisher_email/email_smtp.py
+++ b/front/plugins/_publisher_email/email_smtp.py
@@ -26,7 +26,7 @@ from const import confFileName, logPath
from plugin_helper import Plugin_Objects
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value, hide_email
-from notification import Notification_obj
+from models.notification_instance import NotificationInstance
from database import DB
from pytz import timezone
@@ -59,8 +59,8 @@ def main():
# Initialize the Plugin obj output file
plugin_objects = Plugin_Objects(RESULT_FILE)
- # Create a Notification_obj instance
- notifications = Notification_obj(db)
+ # Create a NotificationInstance instance
+ notifications = NotificationInstance(db)
# Retrieve new notifications
new_notifications = notifications.getNew()
diff --git a/front/plugins/_publisher_mqtt/mqtt.py b/front/plugins/_publisher_mqtt/mqtt.py
index 67c05d75..c21671e3 100755
--- a/front/plugins/_publisher_mqtt/mqtt.py
+++ b/front/plugins/_publisher_mqtt/mqtt.py
@@ -28,7 +28,7 @@ from plugin_utils import getPluginObject
from plugin_helper import Plugin_Objects
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value, bytes_to_string, sanitize_string, normalize_string
-from notification import Notification_obj
+from models.notification_instance import NotificationInstance
from database import DB, get_device_stats
from pytz import timezone
diff --git a/front/plugins/_publisher_ntfy/ntfy.py b/front/plugins/_publisher_ntfy/ntfy.py
index 82611953..2965de7e 100755
--- a/front/plugins/_publisher_ntfy/ntfy.py
+++ b/front/plugins/_publisher_ntfy/ntfy.py
@@ -20,7 +20,7 @@ from const import confFileName, logPath
from plugin_helper import Plugin_Objects, handleEmpty
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value
-from notification import Notification_obj
+from models.notification_instance import NotificationInstance
from database import DB
from pytz import timezone
@@ -53,8 +53,8 @@ def main():
# Initialize the Plugin obj output file
plugin_objects = Plugin_Objects(RESULT_FILE)
- # Create a Notification_obj instance
- notifications = Notification_obj(db)
+ # Create a NotificationInstance instance
+ notifications = NotificationInstance(db)
# Retrieve new notifications
new_notifications = notifications.getNew()
diff --git a/front/plugins/_publisher_pushover/pushover.py b/front/plugins/_publisher_pushover/pushover.py
index 66888a4b..65357c91 100755
--- a/front/plugins/_publisher_pushover/pushover.py
+++ b/front/plugins/_publisher_pushover/pushover.py
@@ -12,7 +12,7 @@ sys.path.extend([f"{INSTALL_PATH}/front/plugins", f"{INSTALL_PATH}/server"])
from plugin_helper import Plugin_Objects, handleEmpty # noqa: E402
from logger import mylog, Logger # noqa: E402
from helper import timeNowTZ, get_setting_value, hide_string # noqa: E402
-from notification import Notification_obj # noqa: E402
+from models.notification_instance import NotificationInstance # noqa: E402
from database import DB # noqa: E402
import conf
from const import confFileName, logPath
@@ -49,8 +49,8 @@ def main():
# Initialize the Plugin obj output file
plugin_objects = Plugin_Objects(RESULT_FILE)
- # Create a Notification_obj instance
- notifications = Notification_obj(db)
+ # Create a NotificationInstance instance
+ notifications = NotificationInstance(db)
# Retrieve new notifications
new_notifications = notifications.getNew()
diff --git a/front/plugins/_publisher_pushsafer/pushsafer.py b/front/plugins/_publisher_pushsafer/pushsafer.py
index ecbe7f4c..4a857e58 100755
--- a/front/plugins/_publisher_pushsafer/pushsafer.py
+++ b/front/plugins/_publisher_pushsafer/pushsafer.py
@@ -20,7 +20,7 @@ from const import confFileName, logPath
from plugin_helper import Plugin_Objects, handleEmpty
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value, hide_string
-from notification import Notification_obj
+from models.notification_instance import NotificationInstance
from database import DB
from pytz import timezone
@@ -53,8 +53,8 @@ def main():
# Initialize the Plugin obj output file
plugin_objects = Plugin_Objects(RESULT_FILE)
- # Create a Notification_obj instance
- notifications = Notification_obj(db)
+ # Create a NotificationInstance instance
+ notifications = NotificationInstance(db)
# Retrieve new notifications
new_notifications = notifications.getNew()
diff --git a/front/plugins/_publisher_telegram/tg.py b/front/plugins/_publisher_telegram/tg.py
index 557fa90c..a74842eb 100755
--- a/front/plugins/_publisher_telegram/tg.py
+++ b/front/plugins/_publisher_telegram/tg.py
@@ -17,7 +17,7 @@ from const import confFileName, logPath
from plugin_helper import Plugin_Objects
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value
-from notification import Notification_obj
+from models.notification_instance import NotificationInstance
from database import DB
from pytz import timezone
@@ -51,8 +51,8 @@ def main():
# Initialize the Plugin obj output file
plugin_objects = Plugin_Objects(RESULT_FILE)
- # Create a Notification_obj instance
- notifications = Notification_obj(db)
+ # Create a NotificationInstance instance
+ notifications = NotificationInstance(db)
# Retrieve new notifications
new_notifications = notifications.getNew()
diff --git a/front/plugins/_publisher_webhook/webhook.py b/front/plugins/_publisher_webhook/webhook.py
index 995500c3..ec8a2407 100755
--- a/front/plugins/_publisher_webhook/webhook.py
+++ b/front/plugins/_publisher_webhook/webhook.py
@@ -23,7 +23,7 @@ from const import logPath, confFileName
from plugin_helper import Plugin_Objects, handleEmpty
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value, hide_string, write_file
-from notification import Notification_obj
+from models.notification_instance import NotificationInstance
from database import DB
from pytz import timezone
@@ -56,8 +56,8 @@ def main():
# Initialize the Plugin obj output file
plugin_objects = Plugin_Objects(RESULT_FILE)
- # Create a Notification_obj instance
- notifications = Notification_obj(db)
+ # Create a NotificationInstance instance
+ notifications = NotificationInstance(db)
# Retrieve new notifications
new_notifications = notifications.getNew()
diff --git a/front/plugins/avahi_scan/avahi_scan.py b/front/plugins/avahi_scan/avahi_scan.py
index 00ea205a..3502f09f 100755
--- a/front/plugins/avahi_scan/avahi_scan.py
+++ b/front/plugins/avahi_scan/avahi_scan.py
@@ -16,7 +16,7 @@ from plugin_utils import get_plugins_configs
from logger import mylog, Logger
from const import pluginsPath, fullDbPath, logPath
from helper import timeNowTZ, get_setting_value
-from notification import write_notification
+from messaging.in_app import write_notification
from database import DB
from models.device_instance import DeviceInstance
import conf
diff --git a/front/plugins/freebox/freebox.py b/front/plugins/freebox/freebox.py
index 1ef49597..86e115bb 100755
--- a/front/plugins/freebox/freebox.py
+++ b/front/plugins/freebox/freebox.py
@@ -25,7 +25,7 @@ from plugin_utils import get_plugins_configs
from logger import mylog, Logger
from const import pluginsPath, fullDbPath, logPath
from helper import timeNowTZ, get_setting_value
-from notification import write_notification
+from messaging.in_app import write_notification
import conf
# Make sure the TIMEZONE for logging is correct
diff --git a/front/plugins/ipneigh/ipneigh.py b/front/plugins/ipneigh/ipneigh.py
index d0085339..dd0a7978 100755
--- a/front/plugins/ipneigh/ipneigh.py
+++ b/front/plugins/ipneigh/ipneigh.py
@@ -19,7 +19,7 @@ from plugin_utils import get_plugins_configs
from logger import mylog, Logger
from const import pluginsPath, fullDbPath, logPath
from helper import timeNowTZ, get_setting_value
-from notification import write_notification
+from messaging.in_app import write_notification
import conf
# Make sure the TIMEZONE for logging is correct
diff --git a/front/plugins/maintenance/config.json b/front/plugins/maintenance/config.json
index 37aaf413..dd31d02d 100755
--- a/front/plugins/maintenance/config.json
+++ b/front/plugins/maintenance/config.json
@@ -243,6 +243,34 @@
"string": "How many last app.log lines to keep. If LOG_LEVEL is set to debug the app generates about 10000 lines per hour, so when debugging an issue the recommended setting should cover the bug occurence timeframe. For example for a bug with a 3 day periodical appearence the value 1000000 should be sufficient. Setting this value to 1000000 generates approximatelly a 50MB app.log file. Set to 0 to disable log purging."
}
]
+ },
+ {
+ "function": "NOTI_LENGTH",
+ "type": {
+ "dataType": "integer",
+ "elements": [
+ {
+ "elementType": "input",
+ "elementOptions": [{ "type": "number" }],
+ "transformers": []
+ }
+ ]
+ },
+ "default_value": 0,
+ "options": [],
+ "localized": ["name", "description"],
+ "name": [
+ {
+ "language_code": "en_us",
+ "string": "Notifications history"
+ }
+ ],
+ "description": [
+ {
+ "language_code": "en_us",
+ "string": "How many latest in-app Notification entries to keep. Set to 0 to disable."
+ }
+ ]
}
],
diff --git a/front/plugins/maintenance/maintenance.py b/front/plugins/maintenance/maintenance.py
index e082cd41..2e28c6a5 100755
--- a/front/plugins/maintenance/maintenance.py
+++ b/front/plugins/maintenance/maintenance.py
@@ -19,6 +19,7 @@ from plugin_helper import Plugin_Object, Plugin_Objects, decodeBase64
from logger import mylog, Logger, append_line_to_file
from helper import timeNowTZ, get_setting_value
from const import logPath, applicationPath
+from messaging.in_app import remove_old
import conf
from pytz import timezone
@@ -41,6 +42,7 @@ def main():
mylog('verbose', [f'[{pluginName}] In script'])
MAINT_LOG_LENGTH = int(get_setting_value('MAINT_LOG_LENGTH'))
+ MAINT_NOTI_LENGTH = int(get_setting_value('MAINT_NOTI_LENGTH'))
# Check if set
if MAINT_LOG_LENGTH != 0:
@@ -63,7 +65,10 @@ def main():
mylog('verbose', [f'[{pluginName}] Cleanup finished'])
-
+ # Check if set
+ if MAINT_NOTI_LENGTH != 0:
+ mylog('verbose', [f'[{pluginName}] Cleaning in-app notification history'])
+ remove_old(MAINT_NOTI_LENGTH)
return 0
diff --git a/front/plugins/nbtscan_scan/nbtscan.py b/front/plugins/nbtscan_scan/nbtscan.py
index 760fe9f9..60261a46 100755
--- a/front/plugins/nbtscan_scan/nbtscan.py
+++ b/front/plugins/nbtscan_scan/nbtscan.py
@@ -16,7 +16,7 @@ from plugin_utils import get_plugins_configs
from logger import mylog, Logger
from const import pluginsPath, fullDbPath, logPath
from helper import timeNowTZ, get_setting_value
-from notification import write_notification
+from messaging.in_app import write_notification
from database import DB
from models.device_instance import DeviceInstance
import conf
diff --git a/front/plugins/omada_sdn_imp/omada_sdn.py b/front/plugins/omada_sdn_imp/omada_sdn.py
index 5e3006e6..1b714f32 100755
--- a/front/plugins/omada_sdn_imp/omada_sdn.py
+++ b/front/plugins/omada_sdn_imp/omada_sdn.py
@@ -45,7 +45,7 @@ from plugin_utils import get_plugins_configs
from logger import mylog, Logger
from const import pluginsPath, fullDbPath, logPath
from helper import timeNowTZ, get_setting_value
-from notification import write_notification
+from messaging.in_app import write_notification
from pytz import timezone
import conf
diff --git a/front/plugins/sync/sync.py b/front/plugins/sync/sync.py
index f258c777..61a1459e 100755
--- a/front/plugins/sync/sync.py
+++ b/front/plugins/sync/sync.py
@@ -20,7 +20,7 @@ from logger import mylog, Logger
from const import pluginsPath, fullDbPath, logPath
from helper import timeNowTZ, get_setting_value
from crypto_utils import encrypt_data
-from notification import write_notification
+from messaging.in_app import write_notification
import conf
from pytz import timezone
diff --git a/front/plugins/wake_on_lan/wake_on_lan.py b/front/plugins/wake_on_lan/wake_on_lan.py
index 2877fc8e..775d2346 100755
--- a/front/plugins/wake_on_lan/wake_on_lan.py
+++ b/front/plugins/wake_on_lan/wake_on_lan.py
@@ -17,7 +17,7 @@ from plugin_utils import get_plugins_configs
from logger import mylog, Logger
from const import pluginsPath, fullDbPath, logPath
from helper import timeNowTZ, get_setting_value
-from notification import write_notification
+from messaging.in_app import write_notification
from database import DB
from models.device_instance import DeviceInstance
import conf
diff --git a/server/__main__.py b/server/__main__.py
index b199e7ad..653e155b 100755
--- a/server/__main__.py
+++ b/server/__main__.py
@@ -31,8 +31,8 @@ from api import update_api
from scan.session_events import process_scan
from initialise import importConfigs
from database import DB
-from reporting import get_notifications
-from notification import Notification_obj
+from messaging.reporting import get_notifications
+from models.notification_instance import NotificationInstance
from plugin import plugin_manager
from scan.device_handling import update_devices_names
from workflows.manager import WorkflowManager
@@ -172,7 +172,7 @@ def main ():
final_json = get_notifications(db)
# Write the notifications into the DB
- notification = Notification_obj(db)
+ notification = NotificationInstance(db)
notificationObj = notification.create(final_json, "")
# run all enabled publisher gateways
diff --git a/server/api.py b/server/api.py
index fdb61683..58d667c7 100755
--- a/server/api.py
+++ b/server/api.py
@@ -9,8 +9,8 @@ from const import (apiPath, sql_appevents, sql_devices_all, sql_events_pending_a
from logger import mylog
from helper import write_file, get_setting_value, timeNowTZ
from app_state import updateState
-from user_events_queue import UserEventsQueue
-from notification import write_notification
+from models.user_events_queue_instance import UserEventsQueueInstance
+from messaging.in_app import write_notification
# Import the start_server function
from graphql_server.graphql_server_start import start_server
@@ -147,7 +147,7 @@ class api_endpoint_class:
# Update user event execution log
# mylog('verbose', [f'[API] api_endpoint_class: is_ad_hoc_user_event {self.is_ad_hoc_user_event}'])
if self.is_ad_hoc_user_event:
- execution_log = UserEventsQueue()
+ execution_log = UserEventsQueueInstance()
execution_log.finalize_event("update_api")
self.is_ad_hoc_user_event = False
diff --git a/server/graphql_server/graphql_server_start.py b/server/graphql_server/graphql_server_start.py
index 89d125f8..9d4be614 100755
--- a/server/graphql_server/graphql_server_start.py
+++ b/server/graphql_server/graphql_server_start.py
@@ -11,7 +11,7 @@ sys.path.extend([f"{INSTALL_PATH}/server"])
from logger import mylog
from helper import get_setting_value, timeNowTZ
from app_state import updateState
-from notification import write_notification
+from messaging.in_app import write_notification
# Flask application
app = Flask(__name__)
diff --git a/server/initialise.py b/server/initialise.py
index 86991ef9..fe8569d4 100755
--- a/server/initialise.py
+++ b/server/initialise.py
@@ -19,7 +19,7 @@ from api import update_api
from scheduler import schedule_class
from plugin import plugin_manager, print_plugin_info
from plugin_utils import get_plugins_configs, get_set_value_for_init
-from notification import write_notification
+from messaging.in_app import write_notification
from crypto_utils import get_random_bytes
#===============================================================================
diff --git a/server/messaging/in_app.py b/server/messaging/in_app.py
new file mode 100755
index 00000000..4ad99871
--- /dev/null
+++ b/server/messaging/in_app.py
@@ -0,0 +1,105 @@
+import datetime
+import os
+import sys
+import _io
+import json
+import uuid
+import socket
+import subprocess
+import requests
+from yattag import indent
+from json2table import convert
+
+# Register NetAlertX directories
+INSTALL_PATH="/app"
+sys.path.extend([f"{INSTALL_PATH}/server"])
+
+# Register NetAlertX modules
+
+import conf
+from const import applicationPath, logPath, apiPath, confFileName, reportTemplatesPath
+from logger import logResult, mylog
+from helper import generate_mac_links, removeDuplicateNewLines, timeNowTZ, get_file_content, write_file, get_setting_value, get_timezone_offset
+
+NOTIFICATION_API_FILE = apiPath + 'user_notifications.json'
+
+# Show Frontend User Notification
+def write_notification(content, level, timestamp):
+
+ # Generate GUID
+ guid = str(uuid.uuid4())
+
+ # Prepare notification dictionary
+ notification = {
+ 'timestamp': str(timestamp),
+ 'guid': guid,
+ 'read': 0,
+ 'level': level,
+ 'content': content
+ }
+
+ # If file exists, load existing data, otherwise initialize as empty list
+ if os.path.exists(NOTIFICATION_API_FILE):
+ with open(NOTIFICATION_API_FILE, 'r') as file:
+ # Check if the file object is of type _io.TextIOWrapper
+ if isinstance(file, _io.TextIOWrapper):
+ file_contents = file.read() # Read file contents
+ if file_contents == '':
+ file_contents = '[]' # If file is empty, initialize as empty list
+
+ # mylog('debug', ['[Notification] User Notifications file: ', file_contents])
+ notifications = json.loads(file_contents) # Parse JSON data
+ else:
+ mylog('none', '[Notification] File is not of type _io.TextIOWrapper')
+ notifications = []
+ else:
+ notifications = []
+
+ # Append new notification
+ notifications.append(notification)
+
+ # Write updated data back to file
+ with open(NOTIFICATION_API_FILE, 'w') as file:
+ json.dump(notifications, file, indent=4)
+
+# Trim notifications
+def remove_old(keepNumberOfEntries):
+
+ # Check if file exists
+ if not os.path.exists(NOTIFICATION_API_FILE):
+ mylog('info', '[Notification] No notifications file to clean.')
+ return
+
+ # Load existing notifications
+ try:
+ with open(NOTIFICATION_API_FILE, 'r') as file:
+ file_contents = file.read().strip()
+ if file_contents == '':
+ notifications = []
+ else:
+ notifications = json.loads(file_contents)
+ except Exception as e:
+ mylog('none', f'[Notification] Error reading notifications file: {e}')
+ return
+
+ if not isinstance(notifications, list):
+ mylog('none', '[Notification] Invalid format: not a list')
+ return
+
+ # Sort by timestamp descending
+ try:
+ notifications.sort(key=lambda x: x['timestamp'], reverse=True)
+ except KeyError:
+ mylog('none', '[Notification] Missing timestamp in one or more entries')
+ return
+
+ # Trim to the latest entries
+ trimmed = notifications[:keepNumberOfEntries]
+
+ # Write back the trimmed list
+ try:
+ with open(NOTIFICATION_API_FILE, 'w') as file:
+ json.dump(trimmed, file, indent=4)
+ mylog('verbose', f'[Notification] Trimmed notifications to latest {keepNumberOfEntries}')
+ except Exception as e:
+ mylog('none', f'Error writing trimmed notifications file: {e}')
diff --git a/server/reporting.py b/server/messaging/reporting.py
similarity index 98%
rename from server/reporting.py
rename to server/messaging/reporting.py
index 6ab1e7dd..6f3f9b39 100755
--- a/server/reporting.py
+++ b/server/messaging/reporting.py
@@ -12,6 +12,11 @@
import datetime
import json
+import sys
+
+# Register NetAlertX directories
+INSTALL_PATH="/app"
+sys.path.extend([f"{INSTALL_PATH}/server"])
import conf
from const import applicationPath, logPath, apiPath, confFileName
diff --git a/server/notification.py b/server/models/notification_instance.py
similarity index 89%
rename from server/notification.py
rename to server/models/notification_instance.py
index c641f708..1bb82744 100755
--- a/server/notification.py
+++ b/server/models/notification_instance.py
@@ -2,6 +2,7 @@ import datetime
import os
import _io
import json
+import sys
import uuid
import socket
import subprocess
@@ -9,16 +10,22 @@ import requests
from yattag import indent
from json2table import convert
+# Register NetAlertX directories
+INSTALL_PATH="/app"
+sys.path.extend([f"{INSTALL_PATH}/server"])
+
# Register NetAlertX modules
import conf
from const import applicationPath, logPath, apiPath, confFileName, reportTemplatesPath
from logger import logResult, mylog
from helper import generate_mac_links, removeDuplicateNewLines, timeNowTZ, get_file_content, write_file, get_setting_value, get_timezone_offset
+from messaging.in_app import write_notification
+
#-------------------------------------------------------------------------------
# Notification object handling
#-------------------------------------------------------------------------------
-class Notification_obj:
+class NotificationInstance:
def __init__(self, db):
self.db = db
@@ -290,45 +297,7 @@ class Notification_obj:
# Reporting
#-------------------------------------------------------------------------------
-# Handle Frontend User Notifications
-def write_notification(content, level, timestamp):
- NOTIFICATION_API_FILE = apiPath + 'user_notifications.json'
- # Generate GUID
- guid = str(uuid.uuid4())
-
- # Prepare notification dictionary
- notification = {
- 'timestamp': str(timestamp),
- 'guid': guid,
- 'read': 0,
- 'level': level,
- 'content': content
- }
-
- # If file exists, load existing data, otherwise initialize as empty list
- if os.path.exists(NOTIFICATION_API_FILE):
- with open(NOTIFICATION_API_FILE, 'r') as file:
- # Check if the file object is of type _io.TextIOWrapper
- if isinstance(file, _io.TextIOWrapper):
- file_contents = file.read() # Read file contents
- if file_contents == '':
- file_contents = '[]' # If file is empty, initialize as empty list
-
- # mylog('debug', ['[Notification] User Notifications file: ', file_contents])
- notifications = json.loads(file_contents) # Parse JSON data
- else:
- mylog('error', 'File is not of type _io.TextIOWrapper')
- notifications = []
- else:
- notifications = []
-
- # Append new notification
- notifications.append(notification)
-
- # Write updated data back to file
- with open(NOTIFICATION_API_FILE, 'w') as file:
- json.dump(notifications, file, indent=4)
#-------------------------------------------------------------------------------
def construct_notifications(JSON, section):
diff --git a/server/user_events_queue.py b/server/models/user_events_queue_instance.py
similarity index 87%
rename from server/user_events_queue.py
rename to server/models/user_events_queue_instance.py
index 11cb4dc1..9d03eef4 100755
--- a/server/user_events_queue.py
+++ b/server/models/user_events_queue_instance.py
@@ -1,10 +1,15 @@
import os
+import sys
+
+# Register NetAlertX directories
+INSTALL_PATH="/app"
+sys.path.extend([f"{INSTALL_PATH}/server"])
# Register NetAlertX modules
from const import pluginsPath, logPath, applicationPath, reportTemplatesPath
from logger import mylog
-class UserEventsQueue:
+class UserEventsQueueInstance:
"""
Handles the execution queue log file, allowing reading, writing,
and removing processed events.
@@ -30,7 +35,7 @@ class UserEventsQueue:
Returns an empty list if the file doesn't exist.
"""
if not os.path.exists(self.log_file):
- mylog('none', ['[UserEventsQueue] Log file not found: ', self.log_file])
+ mylog('none', ['[UserEventsQueueInstance] Log file not found: ', self.log_file])
return [] # No log file, return empty list
with open(self.log_file, "r") as file:
return file.readlines()
@@ -72,7 +77,7 @@ class UserEventsQueue:
self.write_log(updated_lines)
- mylog('minimal', ['[UserEventsQueue] Processed event: ', event])
+ mylog('minimal', ['[UserEventsQueueInstance] Processed event: ', event])
return removed
diff --git a/server/plugin.py b/server/plugin.py
index d31d3f63..a480a7ff 100755
--- a/server/plugin.py
+++ b/server/plugin.py
@@ -16,11 +16,11 @@ from helper import timeNowTZ, get_file_content, write_file, get_setting, get_set
from app_state import updateState
from api import update_api
from plugin_utils import logEventStatusCounts, get_plugin_string, get_plugin_setting_obj, print_plugin_info, list_to_csv, combine_plugin_objects, resolve_wildcards_arr, handle_empty, custom_plugin_decoder, decode_and_rename_files
-from notification import Notification_obj, write_notification
-from user_events_queue import UserEventsQueue
+from models.notification_instance import NotificationInstance
+from messaging.in_app import write_notification
+from models.user_events_queue_instance import UserEventsQueueInstance
from crypto_utils import generate_deterministic_guid
-
#-------------------------------------------------------------------------------
class plugin_manager:
def __init__(self, db, all_plugins):
@@ -79,7 +79,7 @@ class plugin_manager:
"""
Process user events from the execution queue log file and notify the user about executed events.
"""
- execution_log = UserEventsQueue()
+ execution_log = UserEventsQueueInstance()
# Track whether to show notification for executed events
executed_events = []
@@ -151,7 +151,7 @@ class plugin_manager:
sample_json = json.loads(get_file_content(reportTemplatesPath + 'webhook_json_sample.json'))[0]["body"]["attachments"][0]["text"]
# Create fake notification
- notification = Notification_obj(self.db)
+ notification = NotificationInstance(self.db)
notificationObj = notification.create(sample_json, "")
# Run test
@@ -562,7 +562,7 @@ def execute_plugin(db, all_plugins, plugin ):
endpoints = ["plugins_events","plugins_objects", "plugins_history", "appevents"]
# check if we need to update devices api endpoint as well to prevent long user waits on Loading...
- userUpdatedDevices = UserEventsQueue().has_update_devices
+ userUpdatedDevices = UserEventsQueueInstance().has_update_devices
if userUpdatedDevices:
endpoints += ["devices"]
diff --git a/server/scan/session_events.py b/server/scan/session_events.py
index 6c357e4c..cb3811c5 100755
--- a/server/scan/session_events.py
+++ b/server/scan/session_events.py
@@ -8,7 +8,7 @@ import conf
from scan.device_handling import create_new_devices, print_scan_stats, save_scanned_devices, update_devices_data_from_scan, exclude_ignored_devices
from helper import timeNowTZ
from logger import mylog
-from reporting import skip_repeated_notifications
+from messaging.reporting import skip_repeated_notifications
#===============================================================================