mirror of
https://github.com/jokob-sk/NetAlertX.git
synced 2025-12-07 09:36:05 -08:00
/data and /tmp standarization
This commit is contained in:
@@ -1,31 +1,27 @@
|
||||
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
|
||||
import time
|
||||
|
||||
from flask import jsonify
|
||||
|
||||
# Register NetAlertX directories
|
||||
INSTALL_PATH="/app"
|
||||
INSTALL_PATH = os.getenv("NETALERTX_APP", "/app")
|
||||
sys.path.extend([f"{INSTALL_PATH}/server"])
|
||||
|
||||
# Register NetAlertX modules
|
||||
from const import apiPath
|
||||
from logger import mylog
|
||||
from helper import (
|
||||
timeNowTZ,
|
||||
)
|
||||
|
||||
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"
|
||||
|
||||
NOTIFICATION_API_FILE = apiPath + 'user_notifications.json'
|
||||
|
||||
# Show Frontend User Notification
|
||||
def write_notification(content, level='alert', timestamp=None):
|
||||
def write_notification(content, level="alert", timestamp=None):
|
||||
"""
|
||||
Create and append a new user notification entry to the notifications file.
|
||||
|
||||
@@ -39,33 +35,33 @@ def write_notification(content, level='alert', timestamp=None):
|
||||
None
|
||||
"""
|
||||
if timestamp is None:
|
||||
timestamp = timeNowTZ()
|
||||
timestamp = timeNowTZ()
|
||||
|
||||
# Generate GUID
|
||||
guid = str(uuid.uuid4())
|
||||
|
||||
# Prepare notification dictionary
|
||||
notification = {
|
||||
'timestamp': str(timestamp),
|
||||
'guid': guid,
|
||||
'read': 0,
|
||||
'level': level,
|
||||
'content': content
|
||||
"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:
|
||||
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
|
||||
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')
|
||||
mylog("none", "[Notification] File is not of type _io.TextIOWrapper")
|
||||
notifications = []
|
||||
else:
|
||||
notifications = []
|
||||
@@ -74,9 +70,10 @@ def write_notification(content, level='alert', timestamp=None):
|
||||
notifications.append(notification)
|
||||
|
||||
# Write updated data back to file
|
||||
with open(NOTIFICATION_API_FILE, 'w') as file:
|
||||
with open(NOTIFICATION_API_FILE, "w") as file:
|
||||
json.dump(notifications, file, indent=4)
|
||||
|
||||
|
||||
# Trim notifications
|
||||
def remove_old(keepNumberOfEntries):
|
||||
"""
|
||||
@@ -90,30 +87,30 @@ def remove_old(keepNumberOfEntries):
|
||||
"""
|
||||
# Check if file exists
|
||||
if not os.path.exists(NOTIFICATION_API_FILE):
|
||||
mylog('info', '[Notification] No notifications file to clean.')
|
||||
mylog("info", "[Notification] No notifications file to clean.")
|
||||
return
|
||||
|
||||
# Load existing notifications
|
||||
try:
|
||||
with open(NOTIFICATION_API_FILE, 'r') as file:
|
||||
with open(NOTIFICATION_API_FILE, "r") as file:
|
||||
file_contents = file.read().strip()
|
||||
if file_contents == '':
|
||||
if file_contents == "":
|
||||
notifications = []
|
||||
else:
|
||||
notifications = json.loads(file_contents)
|
||||
except Exception as e:
|
||||
mylog('none', f'[Notification] Error reading notifications file: {e}')
|
||||
mylog("none", f"[Notification] Error reading notifications file: {e}")
|
||||
return
|
||||
|
||||
if not isinstance(notifications, list):
|
||||
mylog('none', '[Notification] Invalid format: not a list')
|
||||
mylog("none", "[Notification] Invalid format: not a list")
|
||||
return
|
||||
|
||||
# Sort by timestamp descending
|
||||
try:
|
||||
notifications.sort(key=lambda x: x['timestamp'], reverse=True)
|
||||
notifications.sort(key=lambda x: x["timestamp"], reverse=True)
|
||||
except KeyError:
|
||||
mylog('none', '[Notification] Missing timestamp in one or more entries')
|
||||
mylog("none", "[Notification] Missing timestamp in one or more entries")
|
||||
return
|
||||
|
||||
# Trim to the latest entries
|
||||
@@ -121,11 +118,14 @@ def remove_old(keepNumberOfEntries):
|
||||
|
||||
# Write back the trimmed list
|
||||
try:
|
||||
with open(NOTIFICATION_API_FILE, 'w') as file:
|
||||
with open(NOTIFICATION_API_FILE, "w") as file:
|
||||
json.dump(trimmed, file, indent=4)
|
||||
mylog('verbose', f'[Notification] Trimmed notifications to latest {keepNumberOfEntries}')
|
||||
mylog(
|
||||
"verbose",
|
||||
f"[Notification] Trimmed notifications to latest {keepNumberOfEntries}",
|
||||
)
|
||||
except Exception as e:
|
||||
mylog('none', f'Error writing trimmed notifications file: {e}')
|
||||
mylog("none", f"Error writing trimmed notifications file: {e}")
|
||||
|
||||
|
||||
def mark_all_notifications_read():
|
||||
@@ -162,6 +162,7 @@ def mark_all_notifications_read():
|
||||
mylog("debug", "[Notification] All notifications marked as read.")
|
||||
return {"success": True}
|
||||
|
||||
|
||||
def delete_notifications():
|
||||
"""
|
||||
Delete all notifications from the JSON file.
|
||||
@@ -194,7 +195,7 @@ def get_unread_notifications():
|
||||
|
||||
def mark_notification_as_read(guid=None, max_attempts=3):
|
||||
"""
|
||||
Mark a notification as read based on GUID.
|
||||
Mark a notification as read based on GUID.
|
||||
If guid is None, mark all notifications as read.
|
||||
|
||||
Args:
|
||||
@@ -208,7 +209,9 @@ def mark_notification_as_read(guid=None, max_attempts=3):
|
||||
|
||||
while attempts < max_attempts:
|
||||
try:
|
||||
if os.path.exists(NOTIFICATION_API_FILE) and os.access(NOTIFICATION_API_FILE, os.R_OK | os.W_OK):
|
||||
if os.path.exists(NOTIFICATION_API_FILE) and os.access(
|
||||
NOTIFICATION_API_FILE, os.R_OK | os.W_OK
|
||||
):
|
||||
with open(NOTIFICATION_API_FILE, "r") as f:
|
||||
notifications = json.load(f)
|
||||
|
||||
@@ -222,7 +225,7 @@ def mark_notification_as_read(guid=None, max_attempts=3):
|
||||
|
||||
return {"success": True}
|
||||
except Exception as e:
|
||||
mylog("none", f"[Notification] Attempt {attempts+1} failed: {e}")
|
||||
mylog("none", f"[Notification] Attempt {attempts + 1} failed: {e}")
|
||||
|
||||
attempts += 1
|
||||
time.sleep(0.5) # Sleep 0.5 seconds before retrying
|
||||
@@ -231,6 +234,7 @@ def mark_notification_as_read(guid=None, max_attempts=3):
|
||||
mylog("none", f"[Notification] {error_msg}")
|
||||
return {"success": False, "error": error_msg}
|
||||
|
||||
|
||||
def delete_notification(guid):
|
||||
"""
|
||||
Delete a notification from the notifications file based on its GUID.
|
||||
@@ -263,4 +267,3 @@ def delete_notification(guid):
|
||||
except Exception as e:
|
||||
mylog("none", f"[Notification] Failed to delete notification {guid}: {e}")
|
||||
return {"success": False, "error": str(e)}
|
||||
|
||||
|
||||
@@ -1,50 +1,50 @@
|
||||
#---------------------------------------------------------------------------------#
|
||||
# ---------------------------------------------------------------------------------#
|
||||
# NetAlertX #
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector #
|
||||
# Open Source Network Guard / WIFI & LAN intrusion detector #
|
||||
# #
|
||||
# reporting.py - NetAlertX Back module. Template to email reporting in HTML format #
|
||||
#---------------------------------------------------------------------------------#
|
||||
# ---------------------------------------------------------------------------------#
|
||||
# Puche 2021 pi.alert.application@gmail.com GNU GPLv3 #
|
||||
# jokob-sk 2022 jokob.sk@gmail.com GNU GPLv3 #
|
||||
# leiweibau 2022 https://github.com/leiweibau GNU GPLv3 #
|
||||
# cvc90 2023 https://github.com/cvc90 GNU GPLv3 #
|
||||
#---------------------------------------------------------------------------------#
|
||||
# ---------------------------------------------------------------------------------#
|
||||
|
||||
import datetime
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Register NetAlertX directories
|
||||
INSTALL_PATH="/app"
|
||||
INSTALL_PATH = os.getenv("NETALERTX_APP", "/app")
|
||||
sys.path.extend([f"{INSTALL_PATH}/server"])
|
||||
|
||||
import conf
|
||||
from const import applicationPath, logPath, apiPath, confFileName
|
||||
from helper import timeNowTZ, get_file_content, write_file, get_timezone_offset, get_setting_value
|
||||
from logger import logResult, mylog
|
||||
from helper import (
|
||||
get_timezone_offset,
|
||||
get_setting_value,
|
||||
)
|
||||
from logger import mylog
|
||||
from db.sql_safe_builder import create_safe_condition_builder
|
||||
|
||||
#===============================================================================
|
||||
# ===============================================================================
|
||||
# REPORTING
|
||||
#===============================================================================
|
||||
# ===============================================================================
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
def get_notifications (db):
|
||||
# -------------------------------------------------------------------------------
|
||||
def get_notifications(db):
|
||||
sql = db.sql # TO-DO
|
||||
|
||||
sql = db.sql #TO-DO
|
||||
|
||||
# Reporting section
|
||||
mylog('verbose', ['[Notification] Check if something to report'])
|
||||
mylog("verbose", ["[Notification] Check if something to report"])
|
||||
|
||||
# prepare variables for JSON construction
|
||||
# prepare variables for JSON construction
|
||||
json_new_devices = []
|
||||
json_new_devices_meta = {}
|
||||
json_down_devices = []
|
||||
json_down_devices_meta = {}
|
||||
json_down_reconnected = []
|
||||
json_down_reconnected_meta = {}
|
||||
json_events = []
|
||||
json_events = []
|
||||
json_events_meta = {}
|
||||
json_plugins = []
|
||||
json_plugins_meta = {}
|
||||
@@ -52,37 +52,42 @@ def get_notifications (db):
|
||||
# Disable reporting on events for devices where reporting is disabled based on the MAC address
|
||||
|
||||
# Disable notifications (except down/down reconnected) on devices where devAlertEvents is disabled
|
||||
sql.execute ("""UPDATE Events SET eve_PendingAlertEmail = 0
|
||||
sql.execute("""UPDATE Events SET eve_PendingAlertEmail = 0
|
||||
WHERE eve_PendingAlertEmail = 1 AND eve_EventType not in ('Device Down', 'Down Reconnected', 'New Device' ) AND eve_MAC IN
|
||||
(
|
||||
SELECT devMac FROM Devices WHERE devAlertEvents = 0
|
||||
)""")
|
||||
|
||||
# Disable down/down reconnected notifications on devices where devAlertDown is disabled
|
||||
sql.execute ("""UPDATE Events SET eve_PendingAlertEmail = 0
|
||||
sql.execute("""UPDATE Events SET eve_PendingAlertEmail = 0
|
||||
WHERE eve_PendingAlertEmail = 1 AND eve_EventType in ('Device Down', 'Down Reconnected') AND eve_MAC IN
|
||||
(
|
||||
SELECT devMac FROM Devices WHERE devAlertDown = 0
|
||||
)""")
|
||||
|
||||
sections = get_setting_value('NTFPRCS_INCLUDED_SECTIONS')
|
||||
|
||||
mylog('verbose', ['[Notification] Included sections: ', sections ])
|
||||
sections = get_setting_value("NTFPRCS_INCLUDED_SECTIONS")
|
||||
|
||||
if 'new_devices' in sections:
|
||||
mylog("verbose", ["[Notification] Included sections: ", sections])
|
||||
|
||||
if "new_devices" in sections:
|
||||
# Compose New Devices Section (no empty lines in SQL queries!)
|
||||
# Use SafeConditionBuilder to prevent SQL injection vulnerabilities
|
||||
condition_builder = create_safe_condition_builder()
|
||||
new_dev_condition_setting = get_setting_value('NTFPRCS_new_dev_condition')
|
||||
|
||||
new_dev_condition_setting = get_setting_value("NTFPRCS_new_dev_condition")
|
||||
|
||||
try:
|
||||
safe_condition, parameters = condition_builder.get_safe_condition_legacy(new_dev_condition_setting)
|
||||
safe_condition, parameters = condition_builder.get_safe_condition_legacy(
|
||||
new_dev_condition_setting
|
||||
)
|
||||
sqlQuery = """SELECT eve_MAC as MAC, eve_DateTime as Datetime, devLastIP as IP, eve_EventType as "Event Type", devName as "Device name", devComments as Comments FROM Events_Devices
|
||||
WHERE eve_PendingAlertEmail = 1
|
||||
AND eve_EventType = 'New Device' {}
|
||||
ORDER BY eve_DateTime""".format(safe_condition)
|
||||
except Exception as e:
|
||||
mylog('verbose', ['[Notification] Error building safe condition for new devices: ', e])
|
||||
mylog(
|
||||
"verbose",
|
||||
["[Notification] Error building safe condition for new devices: ", e],
|
||||
)
|
||||
# Fall back to safe default (no additional conditions)
|
||||
sqlQuery = """SELECT eve_MAC as MAC, eve_DateTime as Datetime, devLastIP as IP, eve_EventType as "Event Type", devName as "Device name", devComments as Comments FROM Events_Devices
|
||||
WHERE eve_PendingAlertEmail = 1
|
||||
@@ -90,23 +95,23 @@ def get_notifications (db):
|
||||
ORDER BY eve_DateTime"""
|
||||
parameters = {}
|
||||
|
||||
mylog('debug', ['[Notification] new_devices SQL query: ', sqlQuery ])
|
||||
mylog('debug', ['[Notification] new_devices parameters: ', parameters ])
|
||||
mylog("debug", ["[Notification] new_devices SQL query: ", sqlQuery])
|
||||
mylog("debug", ["[Notification] new_devices parameters: ", parameters])
|
||||
|
||||
# Get the events as JSON using parameterized query
|
||||
json_obj = db.get_table_as_json(sqlQuery, parameters)
|
||||
|
||||
json_new_devices_meta = {
|
||||
"title": "🆕 New devices",
|
||||
"columnNames": json_obj.columnNames
|
||||
"columnNames": json_obj.columnNames,
|
||||
}
|
||||
|
||||
json_new_devices = json_obj.json["data"]
|
||||
json_new_devices = json_obj.json["data"]
|
||||
|
||||
if 'down_devices' in sections:
|
||||
# Compose Devices Down Section
|
||||
if "down_devices" in sections:
|
||||
# Compose Devices Down Section
|
||||
# - select only Down Alerts with pending email of devices that didn't reconnect within the specified time window
|
||||
minutes = int(get_setting_value('NTFPRCS_alert_down_time') or 0)
|
||||
minutes = int(get_setting_value("NTFPRCS_alert_down_time") or 0)
|
||||
tz_offset = get_timezone_offset()
|
||||
sqlQuery = f"""
|
||||
SELECT devName, eve_MAC, devVendor, eve_IP, eve_DateTime, eve_EventType
|
||||
@@ -123,54 +128,68 @@ def get_notifications (db):
|
||||
)
|
||||
ORDER BY down_events.eve_DateTime;
|
||||
"""
|
||||
|
||||
# Get the events as JSON
|
||||
|
||||
# Get the events as JSON
|
||||
json_obj = db.get_table_as_json(sqlQuery)
|
||||
|
||||
json_down_devices_meta = {
|
||||
json_down_devices_meta = {
|
||||
"title": "🔴 Down devices",
|
||||
"columnNames": json_obj.columnNames
|
||||
"columnNames": json_obj.columnNames,
|
||||
}
|
||||
json_down_devices = json_obj.json["data"]
|
||||
json_down_devices = json_obj.json["data"]
|
||||
|
||||
mylog('debug', ['[Notification] json_down_devices: ', json.dumps(json_down_devices) ])
|
||||
|
||||
if 'down_reconnected' in sections:
|
||||
# Compose Reconnected Down Section
|
||||
# - select only Devices, that were previously down and now are Connected
|
||||
sqlQuery = f"""
|
||||
mylog(
|
||||
"debug",
|
||||
["[Notification] json_down_devices: ", json.dumps(json_down_devices)],
|
||||
)
|
||||
|
||||
if "down_reconnected" in sections:
|
||||
# Compose Reconnected Down Section
|
||||
# - select only Devices, that were previously down and now are Connected
|
||||
sqlQuery = """
|
||||
SELECT devName, eve_MAC, devVendor, eve_IP, eve_DateTime, eve_EventType
|
||||
FROM Events_Devices AS reconnected_devices
|
||||
WHERE reconnected_devices.eve_EventType = 'Down Reconnected'
|
||||
AND reconnected_devices.eve_PendingAlertEmail = 1
|
||||
ORDER BY reconnected_devices.eve_DateTime;
|
||||
"""
|
||||
|
||||
# Get the events as JSON
|
||||
|
||||
# Get the events as JSON
|
||||
json_obj = db.get_table_as_json(sqlQuery)
|
||||
|
||||
json_down_reconnected_meta = {
|
||||
"title": "🔁 Reconnected down devices",
|
||||
"columnNames": json_obj.columnNames
|
||||
"columnNames": json_obj.columnNames,
|
||||
}
|
||||
json_down_reconnected = json_obj.json["data"]
|
||||
json_down_reconnected = json_obj.json["data"]
|
||||
|
||||
mylog('debug', ['[Notification] json_down_reconnected: ', json.dumps(json_down_reconnected) ])
|
||||
mylog(
|
||||
"debug",
|
||||
[
|
||||
"[Notification] json_down_reconnected: ",
|
||||
json.dumps(json_down_reconnected),
|
||||
],
|
||||
)
|
||||
|
||||
if 'events' in sections:
|
||||
if "events" in sections:
|
||||
# Compose Events Section (no empty lines in SQL queries!)
|
||||
# Use SafeConditionBuilder to prevent SQL injection vulnerabilities
|
||||
condition_builder = create_safe_condition_builder()
|
||||
event_condition_setting = get_setting_value('NTFPRCS_event_condition')
|
||||
|
||||
event_condition_setting = get_setting_value("NTFPRCS_event_condition")
|
||||
|
||||
try:
|
||||
safe_condition, parameters = condition_builder.get_safe_condition_legacy(event_condition_setting)
|
||||
safe_condition, parameters = condition_builder.get_safe_condition_legacy(
|
||||
event_condition_setting
|
||||
)
|
||||
sqlQuery = """SELECT eve_MAC as MAC, eve_DateTime as Datetime, devLastIP as IP, eve_EventType as "Event Type", devName as "Device name", devComments as Comments FROM Events_Devices
|
||||
WHERE eve_PendingAlertEmail = 1
|
||||
AND eve_EventType IN ('Connected', 'Down Reconnected', 'Disconnected','IP Changed') {}
|
||||
ORDER BY eve_DateTime""".format(safe_condition)
|
||||
except Exception as e:
|
||||
mylog('verbose', ['[Notification] Error building safe condition for events: ', e])
|
||||
mylog(
|
||||
"verbose",
|
||||
["[Notification] Error building safe condition for events: ", e],
|
||||
)
|
||||
# Fall back to safe default (no additional conditions)
|
||||
sqlQuery = """SELECT eve_MAC as MAC, eve_DateTime as Datetime, devLastIP as IP, eve_EventType as "Event Type", devName as "Device name", devComments as Comments FROM Events_Devices
|
||||
WHERE eve_PendingAlertEmail = 1
|
||||
@@ -178,51 +197,43 @@ def get_notifications (db):
|
||||
ORDER BY eve_DateTime"""
|
||||
parameters = {}
|
||||
|
||||
mylog('debug', ['[Notification] events SQL query: ', sqlQuery ])
|
||||
mylog('debug', ['[Notification] events parameters: ', parameters ])
|
||||
|
||||
mylog("debug", ["[Notification] events SQL query: ", sqlQuery])
|
||||
mylog("debug", ["[Notification] events parameters: ", parameters])
|
||||
|
||||
# Get the events as JSON using parameterized query
|
||||
json_obj = db.get_table_as_json(sqlQuery, parameters)
|
||||
|
||||
json_events_meta = {
|
||||
"title": "⚡ Events",
|
||||
"columnNames": json_obj.columnNames
|
||||
}
|
||||
json_events = json_obj.json["data"]
|
||||
json_events_meta = {"title": "⚡ Events", "columnNames": json_obj.columnNames}
|
||||
json_events = json_obj.json["data"]
|
||||
|
||||
if 'plugins' in sections:
|
||||
if "plugins" in sections:
|
||||
# Compose Plugins Section
|
||||
sqlQuery = """SELECT Plugin, Object_PrimaryId, Object_SecondaryId, DateTimeChanged, Watched_Value1, Watched_Value2, Watched_Value3, Watched_Value4, Status from Plugins_Events"""
|
||||
|
||||
# Get the events as JSON
|
||||
sqlQuery = """SELECT Plugin, Object_PrimaryId, Object_SecondaryId, DateTimeChanged, Watched_Value1, Watched_Value2, Watched_Value3, Watched_Value4, Status from Plugins_Events"""
|
||||
|
||||
# Get the events as JSON
|
||||
json_obj = db.get_table_as_json(sqlQuery)
|
||||
|
||||
json_plugins_meta = {
|
||||
"title": "🔌 Plugins",
|
||||
"columnNames": json_obj.columnNames
|
||||
}
|
||||
json_plugins = json_obj.json["data"]
|
||||
json_plugins_meta = {"title": "🔌 Plugins", "columnNames": json_obj.columnNames}
|
||||
json_plugins = json_obj.json["data"]
|
||||
|
||||
|
||||
final_json = {
|
||||
"new_devices": json_new_devices,
|
||||
"new_devices_meta": json_new_devices_meta,
|
||||
"down_devices": json_down_devices,
|
||||
"down_devices_meta": json_down_devices_meta,
|
||||
"down_reconnected": json_down_reconnected,
|
||||
"down_reconnected_meta": json_down_reconnected_meta,
|
||||
"events": json_events,
|
||||
"events_meta": json_events_meta,
|
||||
"plugins": json_plugins,
|
||||
"plugins_meta": json_plugins_meta,
|
||||
}
|
||||
final_json = {
|
||||
"new_devices": json_new_devices,
|
||||
"new_devices_meta": json_new_devices_meta,
|
||||
"down_devices": json_down_devices,
|
||||
"down_devices_meta": json_down_devices_meta,
|
||||
"down_reconnected": json_down_reconnected,
|
||||
"down_reconnected_meta": json_down_reconnected_meta,
|
||||
"events": json_events,
|
||||
"events_meta": json_events_meta,
|
||||
"plugins": json_plugins,
|
||||
"plugins_meta": json_plugins_meta,
|
||||
}
|
||||
|
||||
return final_json
|
||||
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
def skip_repeated_notifications (db):
|
||||
# -------------------------------------------------------------------------------
|
||||
def skip_repeated_notifications(db):
|
||||
"""
|
||||
Skips sending alerts for devices recently notified.
|
||||
|
||||
@@ -235,9 +246,9 @@ def skip_repeated_notifications (db):
|
||||
|
||||
# Skip repeated notifications
|
||||
# due strfime : Overflow --> use "strftime / 60"
|
||||
mylog('verbose','[Skip Repeated Notifications] Skip Repeated')
|
||||
|
||||
db.sql.execute ("""UPDATE Events SET eve_PendingAlertEmail = 0
|
||||
mylog("verbose", "[Skip Repeated Notifications] Skip Repeated")
|
||||
|
||||
db.sql.execute("""UPDATE Events SET eve_PendingAlertEmail = 0
|
||||
WHERE eve_PendingAlertEmail = 1 AND eve_MAC IN
|
||||
(
|
||||
SELECT devMac FROM Devices
|
||||
@@ -247,12 +258,6 @@ def skip_repeated_notifications (db):
|
||||
devSkipRepeated * 60) >
|
||||
(strftime('%s','now','localtime')/60 )
|
||||
)
|
||||
""" )
|
||||
|
||||
""")
|
||||
|
||||
db.commitDB()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user