From 5278af48c5b5c7284392df868847fa5680062a2e Mon Sep 17 00:00:00 2001 From: jokob-sk Date: Mon, 23 Sep 2024 08:15:35 +1000 Subject: [PATCH] Sync Hub fix + overriddenByEnv --- docs/BACKUPS.md | 2 +- .../AdminLTE/plugins/jQueryUI/jquery-ui.js | 2 +- front/network.php | 2 +- front/settings.php | 4 ++-- server/database.py | 19 ++++++++++--------- server/helper.py | 2 +- server/initialise.py | 17 +++++++++-------- server/plugin.py | 6 ++++-- 8 files changed, 29 insertions(+), 25 deletions(-) diff --git a/docs/BACKUPS.md b/docs/BACKUPS.md index c8cce5cf..67c448bf 100755 --- a/docs/BACKUPS.md +++ b/docs/BACKUPS.md @@ -8,7 +8,7 @@ There are 3 artifacts that can be used to backup the application: | File | Description | Limitations | |-----------------------|-------------------------------|-------------------------------| | `/db/app.db` | Database file(s) | The database file might be in an uncommitted state or corrupted | -| `/config/app.conf` | Configuration file | Can be overriden with the [`APP_CONF_OVERRIDE` env variable](https://github.com/jokob-sk/NetAlertX/tree/main/dockerfiles#docker-environment-variables). | +| `/config/app.conf` | Configuration file | Can be overridden with the [`APP_CONF_OVERRIDE` env variable](https://github.com/jokob-sk/NetAlertX/tree/main/dockerfiles#docker-environment-variables). | | `/config/devices.csv` | CSV file containing device information | Doesn't contain historical data | ## Data and backup storage diff --git a/front/lib/AdminLTE/plugins/jQueryUI/jquery-ui.js b/front/lib/AdminLTE/plugins/jQueryUI/jquery-ui.js index 31ee9cd8..8ca54513 100755 --- a/front/lib/AdminLTE/plugins/jQueryUI/jquery-ui.js +++ b/front/lib/AdminLTE/plugins/jQueryUI/jquery-ui.js @@ -1034,7 +1034,7 @@ var mouse = $.widget("ui.mouse", { return this.mouseDelayMet; }, - // These are placeholder methods, to be overriden by extending plugin + // These are placeholder methods, to be overridden by extending plugin _mouseStart: function(/* event */) {}, _mouseDrag: function(/* event */) {}, _mouseStop: function(/* event */) {}, diff --git a/front/network.php b/front/network.php index 89ffd932..6d7a9b6e 100755 --- a/front/network.php +++ b/front/network.php @@ -783,7 +783,7 @@ setCache(key, target.replaceAll(":","_")+'_id') // _id is added so it doesn't conflict with AdminLTE tab behavior } - // get the tab id from the cookie (already overriden by the target) + // get the tab id from the cookie (already overridden by the target) if(!emptyArr.includes(getCache(key))) { selectedTab = getCache(key); diff --git a/front/settings.php b/front/settings.php index 1b05f826..29199093 100755 --- a/front/settings.php +++ b/front/settings.php @@ -420,7 +420,7 @@ $settingsJSON_DB = json_encode($settings, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX `; // OVERRIDE - // surface settings override functionality if the setting is a template that can be overriden with user defined values + // surface settings override functionality if the setting is a template that can be overridden with user defined values // if the setting is a json of the correct structure, handle like a template setting let overrideHtml = ""; @@ -428,7 +428,7 @@ $settingsJSON_DB = json_encode($settings, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX //pre-check if this is a json object that needs value extraction let overridable = false; // indicates if the setting is overridable - let override = false; // If the setting is set to be overriden by the user or by default + let override = false; // If the setting is set to be overridden by the user or by default let readonly = ""; // helper variable to make text input readonly let disabled = ""; // helper variable to make checkbox input readonly diff --git a/server/database.py b/server/database.py index 2a8d7186..d0ccf7bc 100755 --- a/server/database.py +++ b/server/database.py @@ -213,15 +213,16 @@ class DB(): self.sql.execute(""" DROP TABLE IF EXISTS Settings;""") self.sql.execute(""" CREATE TABLE "Settings" ( - "Code_Name" TEXT, - "Display_Name" TEXT, - "Description" TEXT, - "Type" TEXT, - "Options" TEXT, - "RegEx" TEXT, - "Value" TEXT, - "Group" TEXT, - "Events" TEXT + "Code_Name" TEXT, + "Display_Name" TEXT, + "Description" TEXT, + "Type" TEXT, + "Options" TEXT, + "RegEx" TEXT, + "Group" TEXT, + "Value" TEXT, + "Events" TEXT, + "OverriddenByEnv" INTEGER ); """) diff --git a/server/helper.py b/server/helper.py index f4886008..1d4557d0 100755 --- a/server/helper.py +++ b/server/helper.py @@ -319,7 +319,7 @@ def get_setting_value(key): set_type = 'Error: Not handled' set_value = 'Error: Not handled' - set_value = setting["Value"] # Setting value (Value (upper case) = user overriden default_value) + set_value = setting["Value"] # Setting value (Value (upper case) = user overridden default_value) set_type = setting["Type"] # Setting type # lower case "type" - default json value vs uppper-case "Type" (= from user defined settings) value = setting_value_to_python_type(set_type, set_value) diff --git a/server/initialise.py b/server/initialise.py index f5c06590..fdf8e3ed 100755 --- a/server/initialise.py +++ b/server/initialise.py @@ -30,7 +30,7 @@ from notification import write_notification #------------------------------------------------------------------------------- # managing application settings, ensuring SQL safety for user input, and updating internal configuration lists -def ccd(key, default, config_dir, name, inputtype, options, group, events=None, desc="", regex="", setJsonMetadata=None, overrideTemplate=None, forceDefault=False): +def ccd(key, default, config_dir, name, inputtype, options, group, events=None, desc="", regex="", setJsonMetadata=None, overrideTemplate=None, forceDefault=False, overriddenByEnv=0): if events is None: events = [] if setJsonMetadata is None: @@ -50,8 +50,8 @@ def ccd(key, default, config_dir, name, inputtype, options, group, events=None, result = result.replace('\'', "{s-quote}") # Create the tuples - sql_safe_tuple = (key, name, desc, str(inputtype), options, regex, str(result), group, str(events)) - settings_tuple = (key, name, desc, inputtype, options, regex, result, group, str(events)) + sql_safe_tuple = (key, name, desc, str(inputtype), options, regex, str(result), group, str(events), overriddenByEnv) + settings_tuple = (key, name, desc, inputtype, options, regex, result, group, str(events), overriddenByEnv) # Update or append the tuples in the lists conf.mySettingsSQLsafe = update_or_append(conf.mySettingsSQLsafe, sql_safe_tuple, key) @@ -59,7 +59,7 @@ def ccd(key, default, config_dir, name, inputtype, options, group, events=None, # Save metadata in dummy setting if not a metadata key if '__metadata' not in key: - metadata_tuple = (f'{key}__metadata', "metadata name", "metadata desc", '{"dataType":"json", "elements": [{"elementType" : "textarea", "elementOptions" : [{"readonly": "true"}] ,"transformers": []}]}', '[]', "", json.dumps(setJsonMetadata), group, '[]') + metadata_tuple = (f'{key}__metadata', "metadata name", "metadata desc", '{"dataType":"json", "elements": [{"elementType" : "textarea", "elementOptions" : [{"readonly": "true"}] ,"transformers": []}]}', '[]', "", json.dumps(setJsonMetadata), group, '[]', overriddenByEnv) conf.mySettingsSQLsafe = update_or_append(conf.mySettingsSQLsafe, metadata_tuple, f'{key}__metadata') conf.mySettings = update_or_append(conf.mySettings, metadata_tuple, f'{key}__metadata') @@ -298,7 +298,7 @@ def importConfigs (db, all_plugins): # ----------------- # Plugins END - # TODO check app_conf_override.json + # HANDLE APP_CONF_OVERRIDE via app_conf_override.json # Assuming fullConfFolder is defined elsewhere app_conf_override_path = fullConfFolder + '/app_conf_override.json' @@ -315,12 +315,12 @@ def importConfigs (db, all_plugins): # Log the value being passed # ccd(key, default, config_dir, name, inputtype, options, group, events=None, desc="", regex="", setJsonMetadata=None, overrideTemplate=None, forceDefault=False) mylog('debug', [f"[Config] Setting override {setting_name} with value: {value}"]) - ccd(setting_name, value, c_d, '_KEEP_', '_KEEP_', '_KEEP_', '_KEEP_', None, "_KEEP_", "", None, None, True) + ccd(setting_name, value, c_d, '_KEEP_', '_KEEP_', '_KEEP_', '_KEEP_', None, "_KEEP_", "", None, None, True, 1) else: # Convert to string and log # ccd(key, default, config_dir, name, inputtype, options, group, events=None, desc="", regex="", setJsonMetadata=None, overrideTemplate=None, forceDefault=False) mylog('debug', [f"[Config] Setting override {setting_name} with value: {str(value)}"]) - ccd(setting_name, str(value), c_d, '_KEEP_', '_KEEP_', '_KEEP_', '_KEEP_', None, "_KEEP_", "", None, None, True) + ccd(setting_name, str(value), c_d, '_KEEP_', '_KEEP_', '_KEEP_', '_KEEP_', None, "_KEEP_", "", None, None, True, 1) except json.JSONDecodeError: mylog('none', [f"[Config] [ERROR] Setting override decoding JSON from {app_conf_override_path}"]) @@ -348,8 +348,9 @@ def importConfigs (db, all_plugins): # Insert settings into the DB sql.execute ("DELETE FROM Settings") + # mylog('debug', [f"[Config] conf.mySettingsSQLsafe : '{conf.mySettingsSQLsafe}'"]) sql.executemany ("""INSERT INTO Settings ("Code_Name", "Display_Name", "Description", "Type", "Options", - "RegEx", "Value", "Group", "Events" ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)""", conf.mySettingsSQLsafe) + "RegEx", "Value", "Group", "Events", "OverriddenByEnv" ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", conf.mySettingsSQLsafe) db.commitDB() diff --git a/server/plugin.py b/server/plugin.py index aace1d6a..7c488791 100755 --- a/server/plugin.py +++ b/server/plugin.py @@ -249,6 +249,10 @@ def execute_plugin(db, all_plugins, plugin, pluginsState = plugins_state() ): for line in newLines: columns = line.split("|") # There have to be 9 or 13 columns + if len(columns) not in [9, 13]: + mylog('none', [f'[Plugins] Wrong number of input values, must be 9 or 13, got {len(columns)} from: {line}']) + continue # Skip lines with incorrect number of columns + # Common part of the SQL parameters base_params = [ 0, # "Index" placeholder @@ -284,8 +288,6 @@ def execute_plugin(db, all_plugins, plugin, pluginsState = plugins_state() ): 'null', # "HelpVal3" 'null' # "HelpVal4" ]) - else: - mylog('none', [f'[Plugins] Wrong number of input values, must be 9 or 13, got {len(columns)} from: {line} ']) # Create a tuple containing values to be inserted into the database. # Each value corresponds to a column in the table in the order of the columns.