import os
import datetime
import re
import itertools
import linecache
agent_file = "/APP_PROD/Dev_App/jar/properties/agent_purging.properties"
bookmark_properties_file = "/App/jar/KPI/bookmark_log.properties"
##Caching the VMList so that even if subsequent calls, it returns the cached VM list without needing to read the file again.
vm_list_cache = None
def get_VMList():
global vm_list_cache
if vm_list_cache is None:
try:
with open(agent_file, 'rt' ,encoding='latin-1') as file:
for line in file:
if 'VMList' in line:
vm_list = re.findall(r'\d+', line)
vm_list_cache = list(map(int, vm_list))
break
except FileNotFoundError:
print(f"{agent_file} not found")
except Exception as e:
print(f"An error occurred while reading the file: {str(e)}")
vm_list_cache = []
return vm_list_cache
def get_vm_details():
VMList = get_VMList()
All_VM_Details = []
for vm in VMList:
vm_id = vm
try:
vm_ip = None
syslog_file_location = None
with open(agent_file, 'rt', encoding='latin-1') as file:
for line in file:
if str(vm_id) + ".privatip" in line:
vm_ip = re.findall(r'[0-9]+(?:\.[0-9]+){3}', line)
vm_ip = vm_ip[0] if vm_ip else None
elif line.startswith(str(vm) + ".vmmetricskpi.log.filename"):
syslog_file_location = line.split("=")[1].strip()
if vm_ip and syslog_file_location:
break
VM_Details = {'vm_id': vm_id, 'vm_ip': vm_ip, 'syslog_file_location': syslog_file_location}
All_VM_Details.append(VM_Details)
except FileNotFoundError:
print(f"{agent_file} not found")
except Exception as e:
print(f"An error occurred while reading the file: {str(e)}")
return All_VM_Details
def get_retention_period(vm):b
with open(agent_file, encoding='latin-1') as file:
for line in file:
if line.startswith(str(vm) + ".vmmetricskpi.syslog_retention_period_in_days"):
return int(line.split("=")[1].strip())
return 0
def get_bookmark_index(vm_ip):
with open(bookmark_properties_file, encoding='latin-1') as file:
for line in file:
if line.startswith(str(vm_ip) + "_bookmark_log"):
return int(line.split("=")[1].strip())
return 0
def get_timestamp_from_line(line):
# Extract the timestamp from the line
timestamp = line.split()[0]
return timestamp
import datetime
def purge_logs():
vm_details = get_vm_details()
for vm in vm_details:
vm_id = vm['vm_id']
vm_ip = vm['vm_ip']
syslog_file = vm['syslog_file_location']
retention_period = get_retention_period(vm_id)
bookmark_index = get_bookmark_index(vm_ip)
print("VM:", vm_id)
print("Syslog File Location:", syslog_file)
print("Retention Period:", retention_period)
print("Bookmark Index:", bookmark_index)
print("Purging Logs...")
try:
bookmark_line = linecache.getline(syslog_file, int(bookmark_index))
print("Bookmark Line:", bookmark_line)
except Exception as e:
print("Exception while reading line from file:", e)
return None
if not bookmark_line:
print("Bookmark line not found.")
continue
bookmark_timestamp = get_timestamp_from_line(bookmark_line)
# Calculate the purging date (retention_period days before the bookmark timestamp)
bookmark_date = datetime.datetime.strptime(bookmark_timestamp, "%Y-%m-%dT%H:%M:%S+00:00")
purging_date = bookmark_date - datetime.timedelta(days=retention_period)
# Perform the log purging
lines_to_keep = []
lines_purged = 0 # Counter for purged lines
with open(syslog_file, "r") as file:
for line in file:
timestamp = get_timestamp_from_line(line)
line_date = datetime.datetime.strptime(timestamp, "%Y-%m-%dT%H:%M:%S+00:00")
if line_date > purging_date:
lines_to_keep.append(line)
else:
lines_purged += 1
# Write the lines to keep back to the syslog file
with open(syslog_file, "w") as file:
file.writelines(lines_to_keep)
print("Purging Completed")
print(f"Lines Purged: {lines_purged}")
print("Printing First Two Lines:")
with open(syslog_file, "r") as file:
print(file.readline())
print(file.readline())
print()
purge_logs()