diff --git a/logs/mesh_network_analyzer.py b/logs/mesh_network_analyzer.py
index d8bcf8d..5029ee4 100644
--- a/logs/mesh_network_analyzer.py
+++ b/logs/mesh_network_analyzer.py
@@ -9,10 +9,35 @@ import subprocess
# global variables
LOG_PATH = '/opt/meshing-around/logs'
W3_PATH = '/var/www/html'
+multiLogReader = False
def parse_log_file(file_path):
- with open(file_path, 'r') as file:
- lines = file.readlines()
+ lines = []
+ # check if the file exists
+ if not os.path.exists(file_path):
+ # set file_path to the cwd of the script
+ file_path = os.path.dirname(os.path.realpath(__file__))
+
+ # see if many logs are present
+ if multiLogReader:
+ log_files = [f for f in os.listdir(file_path) if f.endswith('.log')]
+ if log_files:
+ log_files.sort()
+
+ for logFile in log_files:
+ if logFile.startswith('messages'):
+ with open(os.path.join(file_path, logFile), 'r') as file:
+ lines = file.readlines()
+ if len(lines) > 1:
+ file_path = os.path.join(file_path, logFile)
+ break
+ else:
+ print(f"No log file(s) found")
+ return
+ else:
+ # read the file for the day
+ with open(file_path, 'r') as file:
+ lines = file.readlines()
log_data = {
'command_counts': Counter(),
@@ -425,20 +450,24 @@ def generate_main_html(log_data, system_info):
from string import Template
template = Template(html_template)
- return template.safe_substitute(
- date=datetime.now().strftime('%Y_%m_%d'),
- command_data=json.dumps(log_data['command_counts']),
- message_data=json.dumps(log_data['message_types']),
- activity_data=json.dumps(log_data['hourly_activity']),
- bbs_messages=log_data['bbs_messages'],
- total_messages=log_data['total_messages'],
- gps_coordinates=json.dumps(log_data['gps_coordinates']),
- unique_users='\n'.join(f'
{user}' for user in log_data['unique_users']),
- warnings='\n'.join(f'{warning}' for warning in log_data['warnings']),
- errors='\n'.join(f'{error}' for error in log_data['errors']),
- command_timestamps='\n'.join(f'{timestamp}: {cmd}' for timestamp, cmd in reversed(log_data['command_timestamps'][-50:])),
- message_timestamps='\n'.join(f'{timestamp}: {msg_type}' for timestamp, msg_type in reversed(log_data['message_timestamps'][-50:]))
- )
+
+ try:
+ return template.safe_substitute(
+ date=datetime.now().strftime('%Y_%m_%d'),
+ command_data=json.dumps(log_data['command_counts']),
+ message_data=json.dumps(log_data['message_types']),
+ activity_data=json.dumps(log_data['hourly_activity']),
+ bbs_messages=log_data['bbs_messages'],
+ total_messages=log_data['total_messages'],
+ gps_coordinates=json.dumps(log_data['gps_coordinates']),
+ unique_users='\n'.join(f'{user}' for user in log_data['unique_users']),
+ warnings='\n'.join(f'{warning}' for warning in log_data['warnings']),
+ errors='\n'.join(f'{error}' for error in log_data['errors']),
+ command_timestamps='\n'.join(f'{timestamp}: {cmd}' for timestamp, cmd in reversed(log_data['command_timestamps'][-50:])),
+ message_timestamps='\n'.join(f'{timestamp}: {msg_type}' for timestamp, msg_type in reversed(log_data['message_timestamps'][-50:]))
+ )
+ except Exception as e:
+ print(f"An error occurred while generating the main HTML: {str(e)}")
def generate_network_map_html(log_data):
html_template = """
@@ -482,7 +511,11 @@ def generate_network_map_html(log_data):
from string import Template
template = Template(html_template)
- return template.safe_substitute(gps_coordinates=json.dumps(log_data['gps_coordinates']))
+ try:
+ if log_data is not None:
+ return template.safe_substitute(gps_coordinates=json.dumps(log_data['gps_coordinates']))
+ except Exception as e:
+ print(f"An error occurred while generating the network map HTML: {str(e)}")
def generate_hosts_html(system_info):
html_template = """
@@ -516,12 +549,15 @@ def generate_hosts_html(system_info):
from string import Template
template = Template(html_template)
- return template.safe_substitute(system_info)
+ try:
+ return template.safe_substitute(system_info)
+ except Exception as e:
+ print(f"An error occurred while generating the hosts HTML: {str(e)}")
def main():
log_dir = LOG_PATH
today = datetime.now().strftime('%Y_%m_%d')
- log_file = f'meshbot{today}.log'
+ log_file = f'messages{today}.log'
log_path = os.path.join(log_dir, log_file)
log_data = parse_log_file(log_path)
@@ -535,6 +571,11 @@ def main():
index_path = os.path.join(output_dir, 'index.html')
try:
+ if not os.path.exists(index_path):
+ # switch to local directory
+ output_dir = os.path.dirname(os.path.realpath(__file__))
+ index_path = os.path.join(output_dir, 'index.html')
+
# Create backup of existing index.html if it exists
if os.path.exists(index_path):
backup_path = os.path.join(output_dir, f'index_backup_{today}.html')
@@ -542,18 +583,19 @@ def main():
print(f"Existing index.html backed up to {backup_path}")
# Write main HTML to index.html
- with open(index_path, 'w') as f:
- f.write(main_html)
- print(f"Main dashboard written to {index_path}")
+ if main_html is not None:
+ with open(index_path, 'w') as f:
+ f.write(main_html)
+ print(f"Main dashboard written to {index_path}")
- # Write other HTML files
- with open(os.path.join(output_dir, f'network_map_{today}.html'), 'w') as f:
- f.write(network_map_html)
-
- with open(os.path.join(output_dir, f'hosts_{today}.html'), 'w') as f:
- f.write(hosts_html)
+ # Write other HTML files
+ with open(os.path.join(output_dir, f'network_map_{today}.html'), 'w') as f:
+ f.write(network_map_html)
+
+ with open(os.path.join(output_dir, f'hosts_{today}.html'), 'w') as f:
+ f.write(hosts_html)
- print(f"HTML reports generated for {today} in {output_dir}")
+ print(f"HTML reports generated for {today} in {output_dir}")
except PermissionError:
print("Error: Permission denied. Please run the script with appropriate permissions (e.g., using sudo).")