BE: version added to app_state
Some checks failed
docker / docker_dev (push) Has been cancelled

Signed-off-by: jokob-sk <jokob.sk@gmail.com>
This commit is contained in:
jokob-sk
2025-11-06 22:08:19 +11:00
parent 58de31d0ea
commit cbe5a4a732
3 changed files with 43 additions and 32 deletions

View File

@@ -39,7 +39,8 @@ class app_state_class:
showSpinner=None, showSpinner=None,
graphQLServerStarted=0, graphQLServerStarted=0,
processScan=False, processScan=False,
pluginsStates=None): pluginsStates=None,
appVersion=None):
""" """
Initialize the application state, optionally overwriting previous values. Initialize the application state, optionally overwriting previous values.
@@ -54,6 +55,7 @@ class app_state_class:
graphQLServerStarted (int, optional): Initial GraphQL server timestamp. graphQLServerStarted (int, optional): Initial GraphQL server timestamp.
processScan (bool, optional): Initial processScan flag. processScan (bool, optional): Initial processScan flag.
pluginsStates (dict, optional): Initial plugin states to merge with previous state. pluginsStates (dict, optional): Initial plugin states to merge with previous state.
appVersion (str, optional): Application version.
""" """
# json file containing the state to communicate with the frontend # json file containing the state to communicate with the frontend
stateFile = apiPath + 'app_state.json' stateFile = apiPath + 'app_state.json'
@@ -80,6 +82,7 @@ class app_state_class:
self.graphQLServerStarted = previousState.get("graphQLServerStarted", 0) self.graphQLServerStarted = previousState.get("graphQLServerStarted", 0)
self.currentState = previousState.get("currentState", "Init") self.currentState = previousState.get("currentState", "Init")
self.pluginsStates = previousState.get("pluginsStates", {}) self.pluginsStates = previousState.get("pluginsStates", {})
self.appVersion = previousState.get("appVersion", "")
else: # init first time values else: # init first time values
self.settingsSaved = 0 self.settingsSaved = 0
self.settingsImported = 0 self.settingsImported = 0
@@ -90,6 +93,7 @@ class app_state_class:
self.graphQLServerStarted = 0 self.graphQLServerStarted = 0
self.currentState = "Init" self.currentState = "Init"
self.pluginsStates = {} self.pluginsStates = {}
self.appVersion = ""
# Overwrite with provided parameters if supplied # Overwrite with provided parameters if supplied
if settingsSaved is not None: if settingsSaved is not None:
@@ -118,7 +122,8 @@ class app_state_class:
# Optionally ignore or add new plugin entries # Optionally ignore or add new plugin entries
# To ignore new plugins, comment out the next line # To ignore new plugins, comment out the next line
self.pluginsStates[plugin] = state self.pluginsStates[plugin] = state
if appVersion is not None:
self.appVersion = appVersion
# check for new version every hour and if currently not running new version # check for new version every hour and if currently not running new version
if self.isNewVersion is False and self.isNewVersionChecked + 3600 < int(timeNow().timestamp()): if self.isNewVersion is False and self.isNewVersionChecked + 3600 < int(timeNow().timestamp()):
self.isNewVersion = checkNewVersion() self.isNewVersion = checkNewVersion()
@@ -154,7 +159,8 @@ def updateState(newState = None,
showSpinner = None, showSpinner = None,
graphQLServerStarted = None, graphQLServerStarted = None,
processScan = None, processScan = None,
pluginsStates=None): pluginsStates=None,
appVersion=None):
""" """
Convenience method to create or update the app state. Convenience method to create or update the app state.
@@ -166,6 +172,7 @@ def updateState(newState = None,
graphQLServerStarted (int, optional): Timestamp of GraphQL server start. graphQLServerStarted (int, optional): Timestamp of GraphQL server start.
processScan (bool, optional): Flag indicating if a scan is active. processScan (bool, optional): Flag indicating if a scan is active.
pluginsStates (dict, optional): Plugin state updates. pluginsStates (dict, optional): Plugin state updates.
appVersion (str, optional): Application version.
Returns: Returns:
app_state_class: Updated state object. app_state_class: Updated state object.
@@ -176,7 +183,8 @@ def updateState(newState = None,
showSpinner, showSpinner,
graphQLServerStarted, graphQLServerStarted,
processScan, processScan,
pluginsStates) pluginsStates,
appVersion)
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------

View File

@@ -636,37 +636,42 @@ def collect_lang_strings(json, pref, stringSqlParams):
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
# Get the value from the buildtimestamp.txt and initialize it if missing # Get the value from the buildtimestamp.txt and initialize it if missing
def getBuildTimeStamp(): def getBuildTimeStampAndVersion():
""" """
Retrieves the build timestamp from 'front/buildtimestamp.txt' within the Retrieves the build timestamp and version from files within the
application directory. application directory. Initializes them if missing.
If the file does not exist, it is created and initialized with the value '0'.
Returns: Returns:
int: The integer value of the build timestamp read from the file. tuple: (int buildTimestamp, str version)
Returns 0 if the file is empty or just initialized.
""" """
buildTimestamp = 0 files_defaults = [
build_timestamp_path = os.path.join(applicationPath, 'front/buildtimestamp.txt') ('front/buildtimestamp.txt', '0'),
('.VERSION', 'unknown')
]
# Ensure file exists, initialize if missing results = []
if not os.path.exists(build_timestamp_path):
with open(build_timestamp_path, 'w') as f:
f.write("0")
# Now safely read the timestamp for filename, default in files_defaults:
with open(build_timestamp_path, 'r') as f: path = os.path.join(applicationPath, filename)
buildTimestamp = int(f.read().strip() or 0) if not os.path.exists(path):
with open(path, 'w') as f:
f.write(default)
with open(path, 'r') as f:
content = f.read().strip() or default
# Convert buildtimestamp to int, leave version as string
value = int(content) if filename.endswith('buildtimestamp.txt') else content
results.append(value)
return tuple(results)
return buildTimestamp
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
def checkNewVersion(): def checkNewVersion():
mylog('debug', [f"[Version check] Checking if new version available"]) mylog('debug', [f"[Version check] Checking if new version available"])
buildTimestamp = getBuildTimeStamp() buildTimestamp, _version = getBuildTimeStampAndVersion()
try: try:
response = requests.get( response = requests.get(

View File

@@ -12,7 +12,7 @@ import re
# Register NetAlertX libraries # Register NetAlertX libraries
import conf import conf
from const import fullConfPath, applicationPath, fullConfFolder, default_tz from const import fullConfPath, applicationPath, fullConfFolder, default_tz
from helper import getBuildTimeStamp, fixPermissions, collect_lang_strings, updateSubnets, isJsonObject, setting_value_to_python_type, get_setting_value, generate_random_string from helper import getBuildTimeStampAndVersion, fixPermissions, collect_lang_strings, updateSubnets, isJsonObject, setting_value_to_python_type, get_setting_value, generate_random_string
from utils.datetime_utils import timeNowDB from utils.datetime_utils import timeNowDB
from app_state import updateState from app_state import updateState
from logger import mylog from logger import mylog
@@ -380,21 +380,19 @@ def importConfigs (pm, db, all_plugins):
# Check if app was upgraded # Check if app was upgraded
buildTimestamp = getBuildTimeStamp() buildTimestamp, new_version = getBuildTimeStampAndVersion()
cur_version = conf.VERSION prev_version = conf.VERSION
mylog('debug', [f"[Config] buildTimestamp: '{buildTimestamp}'"]) mylog('debug', [f"[Config] buildTimestamp | prev_version | .VERSION file: '{buildTimestamp}|{prev_version}|{new_version}'"])
mylog('debug', [f"[Config] conf.VERSION : '{cur_version}'"])
if str(cur_version) != str(buildTimestamp): if str(prev_version) != str(new_version):
mylog('none', ['[Config] App upgraded 🚀']) mylog('none', ['[Config] App upgraded 🚀'])
# ccd(key, default, config_dir, name, inputtype, options, group, events=None, desc="", setJsonMetadata=None, overrideTemplate=None, forceDefault=False) # ccd(key, default, config_dir, name, inputtype, options, group, events=None, desc="", setJsonMetadata=None, overrideTemplate=None, forceDefault=False)
ccd('VERSION', buildTimestamp , c_d, '_KEEP_', '_KEEP_', '_KEEP_', '_KEEP_', None, "_KEEP_", None, None, True) ccd('VERSION', new_version , c_d, '_KEEP_', '_KEEP_', '_KEEP_', '_KEEP_', None, "_KEEP_", None, None, True)
write_notification(f'[Upgrade] : App upgraded 🚀 Please clear the cache: <ol> <li>Click OK below</li> <li>Clear the browser cache (shift + browser refresh button)</li> <li> Clear app cache with the <i class="fa-solid fa-rotate"></i> (reload) button in the header</li><li>Go to Settings and click Save</li> </ol> Check out new features and what has changed in the <a href="https://github.com/jokob-sk/NetAlertX/releases" target="_blank">📓 release notes</a>.', 'interrupt', timeNowDB())
write_notification(f'[Upgrade] : App upgraded from {prev_version} to {new_version} 🚀 Please clear the cache: <ol> <li>Click OK below</li> <li>Clear the browser cache (shift + browser refresh button)</li> <li> Clear app cache with the <i class="fa-solid fa-rotate"></i> (reload) button in the header</li><li>Go to Settings and click Save</li> </ol> Check out new features and what has changed in the <a href="https://github.com/jokob-sk/NetAlertX/releases" target="_blank">📓 release notes</a>.', 'interrupt', timeNowDB())
# ----------------- # -----------------
@@ -424,7 +422,7 @@ def importConfigs (pm, db, all_plugins):
# settingsImported = None (timestamp), # settingsImported = None (timestamp),
# showSpinner = False (1/0), # showSpinner = False (1/0),
# graphQLServerStarted = 1 (1/0)) # graphQLServerStarted = 1 (1/0))
updateState("Config imported", conf.lastImportedConfFile, conf.lastImportedConfFile, False, 1) updateState("Config imported", conf.lastImportedConfFile, conf.lastImportedConfFile, False, 1, None, None, new_version)
msg = '[Config] Imported new settings config' msg = '[Config] Imported new settings config'
mylog('minimal', msg) mylog('minimal', msg)