Adds data persistence loop and shared method to handle all persistence operations

This commit is contained in:
Jacob Morris
2026-01-10 17:05:42 -07:00
committed by Kelly
parent 213f121807
commit 68c065825b
5 changed files with 51 additions and 10 deletions

View File

@@ -490,4 +490,10 @@ autoBanThreshold = 5
# Throttle value for API requests no ban_hammer # Throttle value for API requests no ban_hammer
apiThrottleValue = 20 apiThrottleValue = 20
# Timeframe for offenses (in seconds) # Timeframe for offenses (in seconds)
autoBanTimeframe = 3600 autoBanTimeframe = 3600
[dataPersistence]
# Enable or disable the data persistence loop service
enabled = True
# Interval in seconds for the persistence loop (how often to save data)
interval = 300

View File

@@ -2272,8 +2272,11 @@ async def main():
# Create core tasks # Create core tasks
tasks.append(asyncio.create_task(start_rx(), name="mesh_rx")) tasks.append(asyncio.create_task(start_rx(), name="mesh_rx"))
tasks.append(asyncio.create_task(watchdog(), name="watchdog")) tasks.append(asyncio.create_task(watchdog(), name="watchdog"))
# Add optional tasks # Add optional tasks
if my_settings.dataPersistence_enabled:
tasks.append(asyncio.create_task(dataPersistenceLoop(), name="data_persistence"))
if my_settings.file_monitor_enabled: if my_settings.file_monitor_enabled:
tasks.append(asyncio.create_task(handleFileWatcher(), name="file_monitor")) tasks.append(asyncio.create_task(handleFileWatcher(), name="file_monitor"))

View File

@@ -507,6 +507,10 @@ try:
autoBanThreshold = config['messagingSettings'].getint('autoBanThreshold', 5) # default 5 offenses autoBanThreshold = config['messagingSettings'].getint('autoBanThreshold', 5) # default 5 offenses
autoBanTimeframe = config['messagingSettings'].getint('autoBanTimeframe', 3600) # default 1 hour in seconds autoBanTimeframe = config['messagingSettings'].getint('autoBanTimeframe', 3600) # default 1 hour in seconds
apiThrottleValue = config['messagingSettings'].getint('apiThrottleValue', 20) # default 20 requests apiThrottleValue = config['messagingSettings'].getint('apiThrottleValue', 20) # default 20 requests
# data persistence settings
dataPersistence_enabled = config.getboolean('dataPersistence', 'enabled', fallback=True) # default True
dataPersistence_interval = config.getint('dataPersistence', 'interval', fallback=300) # default 300 seconds (5 minutes)
except Exception as e: except Exception as e:
print(f"System: Error reading config file: {e}") print(f"System: Error reading config file: {e}")
print("System: Check the config.ini against config.template file for missing sections or values.") print("System: Check the config.ini against config.template file for missing sections or values.")

View File

@@ -2425,8 +2425,36 @@ async def watchdog():
load_bbsdm() load_bbsdm()
load_bbsdb() load_bbsdb()
def saveAllData():
try:
# Save BBS data if enabled
if bbs_enabled:
save_bbsdb()
save_bbsdm()
logger.debug("Persistence: BBS data saved")
# Save leaderboard data if enabled
if logMetaStats:
saveLeaderboard()
logger.debug("Persistence: Leaderboard data saved")
# Save ban list
save_bbsBanList()
logger.debug("Persistence: Ban list saved")
logger.info("Persistence: Save completed")
except Exception as e:
logger.error(f"Persistence: Save error: {e}")
async def dataPersistenceLoop():
"""Data persistence service loop for periodic data saving"""
logger.debug("Persistence: Loop started")
while True:
await asyncio.sleep(dataPersistence_interval)
saveAllData()
def exit_handler(): def exit_handler():
# Close the interface and save the BBS messages # Close the interface and save all data
logger.debug(f"System: Closing Autoresponder") logger.debug(f"System: Closing Autoresponder")
try: try:
logger.debug(f"System: Closing Interface1") logger.debug(f"System: Closing Interface1")
@@ -2438,12 +2466,9 @@ def exit_handler():
globals()[f'interface{i}'].close() globals()[f'interface{i}'].close()
except Exception as e: except Exception as e:
logger.error(f"System: closing: {e}") logger.error(f"System: closing: {e}")
if bbs_enabled:
save_bbsdb() saveAllData()
save_bbsdm()
logger.debug(f"System: BBS Messages Saved")
if logMetaStats:
saveLeaderboard()
logger.debug(f"System: Exiting") logger.debug(f"System: Exiting")
asyncLoop.stop() asyncLoop.stop()
asyncLoop.close() asyncLoop.close()

View File

@@ -671,8 +671,11 @@ async def main():
# Create core tasks # Create core tasks
tasks.append(asyncio.create_task(start_rx(), name="mesh_rx")) tasks.append(asyncio.create_task(start_rx(), name="mesh_rx"))
tasks.append(asyncio.create_task(watchdog(), name="watchdog")) tasks.append(asyncio.create_task(watchdog(), name="watchdog"))
# Add optional tasks # Add optional tasks
if my_settings.dataPersistence_enabled:
tasks.append(asyncio.create_task(dataPersistenceLoop(), name="data_persistence"))
if my_settings.file_monitor_enabled: if my_settings.file_monitor_enabled:
tasks.append(asyncio.create_task(handleFileWatcher(), name="file_monitor")) tasks.append(asyncio.create_task(handleFileWatcher(), name="file_monitor"))