HEX
Server: LiteSpeed
System: Linux rocket-da1.hostsila.org 4.18.0-553.84.1.lve.el8.x86_64 #1 SMP Tue Nov 25 18:33:03 UTC 2025 x86_64
User: pvowtcbu (1561)
PHP: 8.1.33
Disabled: exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Upload Files
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()