AzureMonitorAgent/ama_tst/modules/high_cpu_mem/check_logrot.py (72 lines of code) (raw):
import errno
import os
import re
from error_codes import *
from errors import error_info
LR_CONFIG_PATH = "/etc/logrotate.d/azuremonitoragent"
def hr2bytes(hr_size):
if (hr_size.isdigit()):
return int(hr_size)
hr_digits = hr_size[:-1]
hr_units = hr_size[-1]
if (hr_digits.isdigit()):
# kilobytes
if (hr_units == 'k'):
return int(hr_digits) * 1000
# megabytes
elif (hr_units == 'M'):
return int(hr_digits) * 1000000
# gigabytes
elif (hr_units == 'G'):
return int(hr_digits) * 1000000000
# wrong formatting
return None
def check_size_config(logrotate_configs):
for k in list(logrotate_configs.keys()):
# grab size limit if exists
size_config = next((x for x in logrotate_configs[k] if x.startswith('size ')), None)
if (size_config == None):
continue
size_limit = hr2bytes(size_config.split()[1])
if (size_limit == None):
error_info.append((k, LR_CONFIG_PATH))
return ERR_LOGROTATE_SIZE
# get current size of file
try:
size_curr = os.path.getsize(k)
if (size_curr > size_limit):
error_info.append((k, size_curr, size_limit, LR_CONFIG_PATH))
return WARN_LOGROTATE
# couldn't get current size of file
except os.error as e:
if (e.errno == errno.EACCES):
error_info.append((k,))
return ERR_SUDO_PERMS
elif (e.errno == errno.ENOENT):
if ('missingok' in logrotate_configs[k]):
continue
else:
error_info.append(('log file', k))
return ERR_FILE_MISSING
else:
error_info.append((k, e.strerror))
return ERR_FILE_ACCESS
return NO_ERROR
def check_log_rotation():
# check logrotate config file exists
if (not os.path.isfile(LR_CONFIG_PATH)):
error_info.append(('logrotate config file', LR_CONFIG_PATH))
return ERR_FILE_MISSING
# go through logrotate config file
logrotate_configs = dict()
with open(LR_CONFIG_PATH, 'r') as f:
lr_lines = f.readlines()
in_file = None
for lr_line in lr_lines:
lr_line = lr_line.rstrip('\n')
# start of log rotation config
lr_start = re.match("^/(\S+)", lr_line)
if (lr_start != None):
in_file = lr_start.group()
logrotate_configs[in_file] = set()
continue
# log rotation config info
elif (in_file != None):
logrotate_configs[in_file].add(lr_line.lstrip())
continue
# end of log rotation config
elif (lr_line == '}'):
in_file = None
continue
# check size rotation working
checked_size_config = check_size_config(logrotate_configs)
if (checked_size_config != NO_ERROR):
return checked_size_config
return NO_ERROR