File: //opt/node_parser/dcpumon-wrapper.py
#!/usr/bin/python3
import os
import glob
import json
import datetime, time
from operator import itemgetter
def get_all_users():
users=[]
lines = os.popen('cat /etc/passwd |cut -d: -f1').readlines()
for line in lines:
users.append(line.strip())
return users
def takeCPU(elem):
return elem[1]
def get_data():
file_list = glob.glob('/opt/node_parser/dcpumon/toplog.*')
ttt=[]
users=[]
all_users = get_all_users()
i = 0
for file in file_list:
data = os.popen('cat ' + file + ' |awk \'{ if($2 !="root") {printf "%s==%s==%s==", $2, $9, $10; for(i=12; i<=NF; ++i) {printf "%s ", $i}; print "=="}}\'')
txt_data = data.readlines()
for line in txt_data:
x = line.split('==')
if x[0] in all_users:
arr=[]
users.append(x[0])
arr.append(x[0])
arr.append(x[1])
arr.append(x[2])
arr.append(x[3].strip())
ttt.append(arr)
i = i+1
xxx = sorted(ttt, key=lambda x: float(x[1]), reverse=True)
return xxx
def sort_data():
d = get_data()
data_f = {}
for user in get_all_users():
count = {}
count[user] = {}
count[user]['cpu'], count[user]['mem'] = 0, 0
sum = {}
sum[user] = {}
sum[user]['cpu'], sum[user]['mem'] = 0, 0
sum_full = {}
sum_full[user] = {}
sum_full[user]['cpu'], sum_full[user]['mem'] = 0, 0
cpu_max_proc = {}
cpu_max_proc[user] = {}
cpu_max_proc[user]['name'], cpu_max_proc[user]['cpu'], = {}, {}
cpu_max_proc[user]['name'][0],cpu_max_proc[user]['name'][1],cpu_max_proc[user]['name'][2] = "","",""
cpu_max_proc[user]['cpu'][0],cpu_max_proc[user]['cpu'][1],cpu_max_proc[user]['cpu'][2] = 0, 0, 0
for j in d:
if j[0] == user and count[user]['cpu'] <= 3:
cpu_max_proc[user]['name'][count[user]['cpu']] = j[3]
cpu_max_proc[user]['cpu'][count[user]['cpu']] = float(j[1])
if j[0] == user and float(j[1]) > 0:
sum[user]['cpu'] = sum[user]['cpu'] + float(j[1])
count[user]['cpu'] +=1
if j[0] == user and float(j[2]) > 0:
sum[user]['mem'] = sum[user]['mem'] + float(j[2])
count[user]['mem'] +=1
if count[user]['cpu'] != 0:
sum_full[user]['cpu'] = sum[user]['cpu'] / count[user]['cpu']
if count[user]['mem'] != 0:
sum_full[user]['mem'] = sum[user]['mem'] / count[user]['mem']
data_f[user] = {}
data_f[user]['cpu_avg'] = sum_full[user]['cpu']
data_f[user]['mem_avg'] = sum_full[user]['mem']
data_f[user]['cpu_max_proc'] = {}
data_f[user]['cpu_max_proc']['cpu'] = {}
data_f[user]['cpu_max_proc']['name'] = {}
data_f[user]['cpu_max_proc']['cpu'][0] = cpu_max_proc[user]['cpu'][0]
data_f[user]['cpu_max_proc']['cpu'][1] = cpu_max_proc[user]['cpu'][1]
data_f[user]['cpu_max_proc']['cpu'][2] = cpu_max_proc[user]['cpu'][2]
data_f[user]['cpu_max_proc']['name'][0] = cpu_max_proc[user]['name'][0]
data_f[user]['cpu_max_proc']['name'][1] = cpu_max_proc[user]['name'][1]
data_f[user]['cpu_max_proc']['name'][2] = cpu_max_proc[user]['name'][2]
return data_f
def save_f(data,f_name):
f = open(f_name, "w")
f.write(json.dumps(data))
f.close()
def save_simple_f(data,f_name):
f = open(f_name, "w")
f.write(data)
f.close()
def read_f(f_name):
f = open(f_name, "r")
return json.loads(f.read())
def prepare_folders():
dir1 = '/opt/node_parser/dcpumon/' + str(datetime.date.today().year)
dir2 = '/opt/node_parser/dcpumon/' + str(datetime.date.today().year) + '/' + str(datetime.date.today().strftime("%b"))
if not os.path.exists(dir1):
os.mkdir(dir1)
if not os.path.exists(dir2):
os.mkdir(dir2)
def init(current_data,file1):
data_to_file = '0\n%s\n' % (time.time())
data_compared = {}
for user, value in current_data.items():
data_compared[user] = {}
data_compared[user]['cpu_avg'] = current_data[user]['cpu_avg']
data_compared[user]['mem_avg'] = current_data[user]['mem_avg']
data_compared[user]['cpu_max_proc'] = {}
data_compared[user]['cpu_max_proc']['cpu'] = {}
data_compared[user]['cpu_max_proc']['name'] = {}
data_compared[user]['cpu_max_proc']['cpu'][0] = current_data[user]['cpu_max_proc']['cpu'][0]
data_compared[user]['cpu_max_proc']['cpu'][1] = current_data[user]['cpu_max_proc']['cpu'][1]
data_compared[user]['cpu_max_proc']['cpu'][2] = current_data[user]['cpu_max_proc']['cpu'][2]
data_compared[user]['cpu_max_proc']['name'][0] = current_data[user]['cpu_max_proc']['name'][0]
data_compared[user]['cpu_max_proc']['name'][1] = current_data[user]['cpu_max_proc']['name'][1]
data_compared[user]['cpu_max_proc']['name'][2] = current_data[user]['cpu_max_proc']['name'][2]
data_to_file += '%s=%f=%f=0=%.1f=%s=%.1f=%s=%.1f=%s%s' % (user, data_compared[user]['cpu_avg'], data_compared[user]['mem_avg'], +
data_compared[user]['cpu_max_proc']['cpu'][0],data_compared[user]['cpu_max_proc']['name'][0], +
data_compared[user]['cpu_max_proc']['cpu'][1],data_compared[user]['cpu_max_proc']['name'][1], +
data_compared[user]['cpu_max_proc']['cpu'][2],data_compared[user]['cpu_max_proc']['name'][2],'\n')
save_f(data_compared,file1 + '.json')
save_simple_f(data_to_file.strip(),file1)
def compare(current_data,file1):
json_data = read_f(file1 + '.json')
data_compared = {}
data_to_file = '0\n%s\n' % (time.time())
for user, value in current_data.items():
data_compared[user] = {}
data_compared[user]['cpu_avg'] = (current_data[user]['cpu_avg'] + json_data[user]['cpu_avg']) / 2
data_compared[user]['mem_avg'] = (current_data[user]['mem_avg'] + json_data[user]['mem_avg']) / 2
data_compared[user]['cpu_max_proc'] = {}
data_compared[user]['cpu_max_proc']['cpu'] = {}
data_compared[user]['cpu_max_proc']['name'] = {}
if current_data[user]['cpu_max_proc']['cpu'][0] > json_data[user]['cpu_max_proc']['cpu']['0']:
data_compared[user]['cpu_max_proc']['cpu'][0] = current_data[user]['cpu_max_proc']['cpu'][0]
data_compared[user]['cpu_max_proc']['name'][0] = current_data[user]['cpu_max_proc']['name'][0]
else:
data_compared[user]['cpu_max_proc']['cpu'][0] = json_data[user]['cpu_max_proc']['cpu']['0']
data_compared[user]['cpu_max_proc']['name'][0] = json_data[user]['cpu_max_proc']['name']['0']
if current_data[user]['cpu_max_proc']['cpu'][1] > json_data[user]['cpu_max_proc']['cpu']['1']:
data_compared[user]['cpu_max_proc']['cpu'][1] = current_data[user]['cpu_max_proc']['cpu'][1]
data_compared[user]['cpu_max_proc']['name'][1] = current_data[user]['cpu_max_proc']['name'][1]
else:
data_compared[user]['cpu_max_proc']['cpu'][1] = json_data[user]['cpu_max_proc']['cpu']['1']
data_compared[user]['cpu_max_proc']['name'][1] = json_data[user]['cpu_max_proc']['name']['1']
if current_data[user]['cpu_max_proc']['cpu'][2] > json_data[user]['cpu_max_proc']['cpu']['2']:
data_compared[user]['cpu_max_proc']['cpu'][2] = current_data[user]['cpu_max_proc']['cpu'][2]
data_compared[user]['cpu_max_proc']['name'][2] = current_data[user]['cpu_max_proc']['name'][2]
else:
data_compared[user]['cpu_max_proc']['cpu'][2] = json_data[user]['cpu_max_proc']['cpu']['2']
data_compared[user]['cpu_max_proc']['name'][2] = json_data[user]['cpu_max_proc']['name']['2']
data_to_file += '%s=%f=%f=0=%.1f=%s=%.1f=%s=%.1f=%s%s' % (user, data_compared[user]['cpu_avg'], data_compared[user]['mem_avg'], +
data_compared[user]['cpu_max_proc']['cpu'][0],data_compared[user]['cpu_max_proc']['name'][0], +
data_compared[user]['cpu_max_proc']['cpu'][1],data_compared[user]['cpu_max_proc']['name'][1], +
data_compared[user]['cpu_max_proc']['cpu'][2],data_compared[user]['cpu_max_proc']['name'][2],'\n')
save_f(data_compared,file1 + '.json')
save_simple_f(data_to_file.strip(),file1)
def main():
prepare_folders()
current_data = sort_data()
file1 = '/opt/node_parser/dcpumon/' + str(datetime.date.today().year) + '/' + str(datetime.date.today().strftime("%b")) + '/' + str(datetime.date.today().strftime("%d"))
if os.path.exists(file1 + '.json' ):
compare(current_data,file1)
else:
init(current_data,file1)
if __name__ == "__main__":
main()