403Webshell
Server IP : 112.74.42.100  /  Your IP : 216.73.216.142
Web Server : nginx/1.20.2
System : Linux iZwz96lx4pjqiy84w4hni7Z 5.10.134-17.3.al8.x86_64 #1 SMP Thu Oct 31 14:29:57 CST 2024 x86_64
User : www ( 1000)
PHP Version : 8.0.26
Disable Function : passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /usr/local/sysak/.sysak_components/tools/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /usr/local/sysak/.sysak_components/tools/memgraph
#!/usr/bin/env python3
import os
import sys
import json
import  getopt
from ctypes import c_int
from ctypes import c_size_t
from ctypes import c_ulong
from ctypes import c_ubyte
from ctypes import c_void_p
from ctypes import c_longlong
from ctypes import get_errno
from ctypes import CDLL
from ctypes import POINTER
from ctypes import cast
from mmap import MAP_SHARED
from mmap import PROT_READ
from mmap import PAGESIZE
import memtop

jsonFormat = None

if os.geteuid() != 0:
    print("This program must be run as root. Aborting.")
    sys.exit(1)

try:
    from ctypes import c_ssize_t
    c_off_t = c_ssize_t
except ImportError:
    is_64bits = sys.maxsize > 2 ** 32
    c_off_t = c_longlong if is_64bits else c_int

MAP_FAILED = c_ulong(-1).value
libc = CDLL(None)

_mmap = libc.mmap
_mmap.restype = c_void_p
_mmap.argtypes = c_void_p, c_size_t, c_int, c_int, c_off_t

_munmap = libc.munmap
_munmap.restype = c_void_p
_munmap.argtypes = c_void_p, c_size_t

_mincore = libc.mincore
_mincore.restypes = c_int
_mincore.argtypes = c_void_p, c_size_t, POINTER(c_ubyte)

def isV1():
    if os.path.exists("/sys/fs/cgroup/cgroup.controllers"):
        return False
    else:
        return True 

def memRoot():
    if isV1():
        return "/sys/fs/cgroup/memory"
    else:
        return "/sys/fs/cgroup"

def getcache(filename):
    if os.path.isfile(filename) and os.access(filename, os.R_OK):
        f = open(filename)
        size = os.fstat(f.fileno()).st_size
        if size == 0:
            f.close()
            return 0
        addr = _mmap(0, size, PROT_READ, MAP_SHARED, f.fileno(), 0)
        if addr == MAP_FAILED:
            f.close()
            return 0

        nr_pages = int((size + PAGESIZE - 1) / PAGESIZE)
        vec = (c_ubyte * nr_pages)()
        ret = _mincore(addr, size, cast(vec, POINTER(c_ubyte)))
        if ret != 0:
            _munmap(addr, size)
            f.close()
            return 0
        cached = list(vec).count(1)
        _munmap(addr, size)
        f.close()
        return cached
    else:
        return 0

def getCachePid(meminfo,filename):
    res = []
    filepid = meminfo["filepid"]
    taskInfo = meminfo["taskInfo"]
    if not filename in filepid:
        return res
    for pid in filepid[filename]:
        if not pid in taskInfo:
            continue
        name = taskInfo[pid]["Name"]
        res.append(name + "_" + pid +" ")
    return res

def getFileCache(meminfo):
    total_cache = 0
    filecache = {}
    for tmpfile in meminfo["filepid"].keys():
        cache = getcache(tmpfile)
        total_cache += cache
        if cache > 0:
            filecache[tmpfile] = cache
    meminfo["filecache"] = sorted(filecache.items(), key = lambda kv:(kv[1], kv[0]),reverse=True)
    meminfo["fileCacheMem"] = total_cache*4
    #print("total CacheMem {}".format(meminfo["fileCacheMem"]))
    #print(meminfo["filecache"])
    global jsonFormat
    if jsonFormat != None:
        return meminfo
    num = 0
    for key,value in meminfo["filecache"]:
        filename = key
        filename += " cached:%sK"%(value*4)
        filename += " task: "
        filename += "".join(getCachePid(meminfo, key))
        num += 1
        print(filename)
        if num > 10:
            break
    return meminfo

def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        pass
    try:
        import unicodedata
        unicodedata.numeric(s)
        return True
    except (TypeError, ValueError):
        pass
    return False

def hugepagesz_supported(hugepagesz):
    if int(hugepagesz) != 2 and int(hugepagesz) != 1024:
        return False
    if os.path.exists("/sys/kernel/mm/hugepages/hugepages-" + str(hugepagesz * 1024) + "kB"):
            return True
    return False


def get_dmesg_reserved_mem(meminfo):
    cmd = "dmesg | grep -w 'Memory:' | grep -w 'reserved' "
    ret = os.popen(cmd).read().strip()
    if len(ret) < 20:
        return 0
    ret = ret.strip().split("reserved")[0]
    ret = ret.strip().split()
    if len(ret) < 5:
        return 0
    res = ret[-1].strip()[:-1]
    return int(res)

def get_total_mem(meminfo):
    cmd = "cat /proc/iomem | grep 'System RAM' "
    ret = os.popen(cmd).read().split("\n")
    total = 0
    for line in ret:
        line = line.strip()
        if len(line) < 10:
            continue
        addr = line.split(":")[0].strip()
        start = addr.split("-")[0].strip()
        end = addr.split("-")[1].strip()
        size = int(end,16) - int(start,16)
        total += size
    meminfo['MemTotalIoMem'] = total/1024

def get_reserved_mem(meminfo):
    res = get_dmesg_reserved_mem(meminfo)
    if res != 0:
        meminfo['res'] = res
        return res

    cmd = "cat /proc/iomem | grep -wE 'Reserved|Crash kernel|Kernel code|Kernel data|Kernel bss'"
    ret = os.popen(cmd).read().split("\n")
    total = 0 
    for line in ret:
        line = line.strip()
        if len(line) < 10: 
            continue
        addr = line.split(":")[0].strip()
        start = addr.split("-")[0].strip()
        end = addr.split("-")[1].strip()
        size = int(end,16) - int(start,16)
        total += size
    meminfo['res'] = total/1024

def get_page_used(meminfo):
    get_reserved_mem(meminfo)
    #get_total_mem(meminfo)
    user = meminfo["Active(anon)"] + meminfo["Inactive(anon)"]
    user += meminfo["Active(file)"] + meminfo["Inactive(file)"]
    user += meminfo["Mlocked"]
    if "2048" in meminfo:
        user += meminfo["2048"]
    if "1048576" in meminfo:
        user += meminfo["1048576"]
    kernelOther = meminfo["Slab"] + meminfo["KernelStack"] + meminfo["PageTables"]
    kernelOther += meminfo["VmallocUsed"]
    pageUsed = meminfo["MemTotal"] - meminfo["MemFree"] - user - kernelOther
    if pageUsed < 1:
        pageUsed = 1024
    meminfo["allocPage"] = pageUsed
    meminfo["kernelUsed"] = pageUsed + kernelOther + meminfo["res"]
    meminfo["userUsed"] = user
    return meminfo

def get_hugepage_used(meminfo, hugesize):
    hugepath = "/sys/kernel/mm/hugepages/hugepages-"
    hugepath += hugesize+"kB/nr_hugepages"
    fd = open(hugepath, 'r')
    res = int(fd.read().strip())
    res = res * int(hugesize)
    meminfo[hugesize] = res
    return meminfo

def get_VmallocUsed(meminfo):
    if meminfo["VmallocUsed"] != 0:
        return meminfo
    fd = open("/proc/vmallocinfo", 'r')
    ret = fd.read().split('\n')
    fd.close()
    pages = 0
    for line in ret:
        if line.find("vmalloc") == -1:
            continue
        if line.find("pages=") == -1:
            continue
        res = line.strip().split("pages=")
        res = int(res[1].strip().split()[0])
        pages += res
    meminfo["VmallocUsed"] = pages*4

def memgraph_get_meminfo(meminfo):
    fd = open("/proc/meminfo",'r')
    ret = fd.read().split('\n')
    meminfo["rawdata"] = ret
    for i in ret:
        line = i.strip().split()
        if len(line) < 3:
            continue
        name = line[0].strip()[:-1]
        size = int(line[1].strip())
        meminfo[name] = size
    if hugepagesz_supported(2):
        get_hugepage_used(meminfo, "2048")
    if hugepagesz_supported(1024):
        get_hugepage_used(meminfo, "1048576")
    get_VmallocUsed(meminfo)
    get_page_used(meminfo)
    fd.close()
    return meminfo

def dump2json(res,filename):
    jsonStr = json.dumps(res)
    if not os.path.exists(os.path.dirname(filename)):
        os.popen("mkdir -p "+os.path.dirname(filename)).read()
    with open(filename, 'w') as jsonFile:
        jsonFile.write(jsonStr)

def memgraph_free(meminfo):
    cmd = "free -k"
    used = 0
    ret = os.popen(cmd).read().strip().split("\n")
    for line in ret:
        if line.find("Mem:") == -1:
            continue
        used = int(line.strip().split()[2])
    return used

def format_unit(value):
    value = int(value)
    if value > 5 * 1024 * 1024:
        return '%s KB (%s GB)' % (value, round(value/(1024*1024),2))
    elif value > 10 * 1024:
        return '%s KB (%s MB)' % (value, round(value/(1024),2))
    else:
        return '%s KB' % value

def memgraph_graph(meminfo):
    res = {}
    res["total"] = meminfo["MemTotal"] + meminfo['res']
    res["free"] = meminfo["MemFree"]
    res["userUsed"] = meminfo["userUsed"]
    res["kernelUsed"] = meminfo["kernelUsed"]
    res["available"] = meminfo["MemAvailable"]
    res["used"] = memgraph_free(meminfo) + meminfo['Shmem']
    user = {}
    user["anon"] = meminfo["Active(anon)"] + meminfo["Inactive(anon)"]
    user["filecache"] = meminfo["Cached"] - meminfo["Shmem"]
    user["buffers"] = meminfo["Buffers"]
    user["mlock"] = meminfo["Mlocked"]
    if "2048" in meminfo:
        user["huge2M"] = meminfo["2048"]
    if "1048576" in meminfo:
        user["huge1G"] = meminfo["1048576"]
    user["shmem"] = meminfo["Shmem"]
    res["user"] = user
    kernel = {}
    kernel["reserved"] = meminfo["res"]
    kernel["SReclaimable"] = meminfo["SReclaimable"]
    kernel["SUnreclaim"] = meminfo["SUnreclaim"]
    kernel["KernelStack"] = meminfo["KernelStack"]
    kernel["PageTables"] = meminfo["PageTables"]
    kernel["VmallocUsed"] = meminfo["VmallocUsed"]
    kernel["allocPage"] = meminfo["allocPage"]
    res["kernel"] = kernel

    format_res = {}
    for i in res:
        if type(res[i]) == dict:
            format_res[i] = {}
            for j in res[i]:
                format_res[i][j] = format_unit(res[i][j])
        else:
            format_res[i] = format_unit(res[i])

    meminfo["graph"] = res
    global jsonFormat
    if jsonFormat != None:
        return meminfo
    memgraph_check_event(meminfo)
    res_str = "\nmemgraph result:\ntotal memory: %s\tused: %s\tfree: %s\tavailable: %s\n" % (format_res['total'],format_res['used'],format_res['free'],format_res['available'])

    res_str += "\nuser: total used: %s\n" % format_res['userUsed']
    for item in format_res['user']:
        if not format_res['user'][item].startswith('0'):
            res_str = "%s\tuser-%s: %s\n" % ( res_str, item, format_res['user'][item]) 

    res_str += "\nkernel: total used: %s\n" % format_res['kernelUsed']
    for item in format_res['kernel']:
        if not format_res['kernel'][item].startswith('0'):
            res_str = "%s\tkernel-%s: %s\n" % ( res_str, item, format_res['kernel'][item]) 

    for item in meminfo['event']:
        if item == "util":
            continue
        if meminfo['event'][item] == True:
            if item == 'memcg':
                res_str = '%sNotice! : memcg leak\n' % res_str
            elif item == 'leak':
                res_str = '%sNotice! : %s memory leak\n' % (res_str, meminfo['memleak']['type'])
            elif item == 'memfrag':
                res_str = '%sNotice! : memory fragment\n' % res_str
    print(res)
    print(res_str)
    return res

def kmemleak_check(meminfo, memType):
    kmem = meminfo[memType]/1024
    total = meminfo["MemTotal"]/1024
    ''' 6G '''
    if kmem > 1024*6:
        return True
    elif (kmem*100 > total*10) and (kmem > 1024*1.5):
        return True
    return False

def get_proc_file(meminfo,pid):
    filename = "/proc/" + pid + "/fd"
    filepid = meminfo["filepid"]
    try:
        for fd in os.listdir(filename):
            fdpath = filename + "/" + fd
            if not os.path.exists(fdpath):
                continue
            tmp = os.readlink(fdpath).strip()
            if len(tmp) < 2:
                continue
            if tmp[0] != '/':
                continue
            if tmp[0:5] == "/dev/":
                continue
            if tmp[0:6] == "/proc/":
                continue
            if tmp[0:5] == "/sys/":
                continue
            if not tmp in filepid:
                filepid[tmp] = []
            filepid[tmp].append(pid)
        meminfo["filepid"] = filepid
    except Exception:
        pass
    return meminfo

def scan_proc(meminfo):
    root = "/proc/"
    taskInfo = {}
    taskMem = {}
    taskAnon = {}
    try:
        for pid in os.listdir(root):
            if not os.path.exists(root + pid):
                continue
            if not is_number(pid):
                continue
            filename= root + pid + "/status"
            get_proc_file(meminfo, pid)
            try:
                fd = open(filename, 'r')
                res = fd.read().strip()
                if res.find("RssAnon") == -1:
                    continue
                res = res.split('\n')
                fd.close()
                task = {}
                for line in res:
                    values = line.strip().split()
                    if len(values) < 2:
                        continue
                    key = values[0][:-1]
                    # get memory usage
                    value = values[1]
                    task[key] = value
                tmp = {}
                tmp["Name"] = task["Name"]
                tmp["Pid"] = task["Pid"]
                tmp["RssAnon"] = int(task["RssAnon"])
                tmp["RssFile"] = int(task["RssFile"])
                tmp["RssShmem"] = int(task["RssShmem"])
                taskInfo[pid] = tmp
                taskMem[pid] = int(task["VmRSS"])
                taskAnon[pid] = int(task["RssAnon"])
            except Exception:
                import traceback
                traceback.print_exc()
                pass
    except Exception :
        import traceback
        traceback.print_exc()
        pass
    #print(taskInfo)
    meminfo["taskInfo"] = taskInfo
    taskMem = sorted(taskMem.items(), key = lambda kv:(kv[1], kv[0]),reverse=True)
    taskAnon = sorted(taskAnon.items(), key = lambda kv:(kv[1], kv[0]),reverse=True)
    meminfo["taskMem"] = taskMem
    meminfo["taskAnon"] = taskAnon
    num = 0
    return meminfo

def read_cgroup_stat(filename):
    stat = {}
    filename += "/memory.stat"
    if not os.path.exists(filename):
        return stat
    fd = open(filename)
    ret = fd.read().strip().split("\n")
    for line in ret:
        line = line.strip().split()
        if len(line) < 2:
            continue
        stat[line[0]] = int(line[1])/1024
    return stat

def read_cgroup_proc(filename):
    task = {}
    filename += "/cgroup.procs"
    if not os.path.exists(filename):
        return task

    fd = open(filename)
    ret = fd.read().strip().split('\n')
    fd.close()
    if len(ret) == 0:
        return task
    for pid in ret:
        if not len(pid):
            continue
        pidpath = "/proc/" + pid +"/comm"
        try:
            fd = open(pidpath)
            ret = fd.read().strip()
            task[pid] = ret
            fd.close()
        except Exception:
            pass
    return task

def read_cgroup_usage(filename):
    if isV1():
        filename += "/memory.usage_in_bytes"
    else:
        filename += "/memory.current"
    if not os.path.exists(filename):
        return 0
    fd = open(filename)
    ret = int(fd.read().strip())
    fd.close()
    return ret/1024

def scan_cgroup(meminfo, filepath, find_depth):
    find_depth -= 1
    ignore_path=['.', '..']
    filename = ''
    depth = meminfo["cgroupOrigDepth"] - find_depth -1
    if not meminfo["cgroupTop"][depth]:
        meminfo["cgroupTop"][depth] = {}
    for file_ in os.listdir(filepath):
        filename = os.path.join(filepath, file_)
        if os.path.isdir(filename):
            usage = read_cgroup_usage(filename)
            #print("cgroup {} = {}K depth ={} task = {}".format(filename,usage, depth + 1, read_cgroup_proc(filename)))
            meminfo["cgroupTop"][depth][filename] = usage
            if depth + 1 > meminfo["cgroupDepth"]:
                meminfo["cgroupDepth"] = depth + 1
        if os.path.isfile(filename):
            continue
        elif find_depth <= 0:
            continue
        elif file_ in ignore_path:
            continue
        else:
            scan_cgroup(meminfo, filename, find_depth)

def memgraph_memory_thread(meminfo, name):
    global jsonFormat
    if len(meminfo[name]) == 0:
        scan_proc(meminfo)
    taskMem = meminfo[name]
    taskInfo = meminfo["taskInfo"]
    if jsonFormat != None:
        return meminfo
    num = 0
    for key,value in taskMem:
        task = taskInfo[key]
        num += 1
        if num > 10:
            break
        print("{}-{} Mem : {}K(RssFile : {}K RssAnon : {}K Shmem : {}K)".format(task["Name"], key, value, task["RssFile"], task["RssAnon"], task["RssShmem"]))

def memgraph_cache_list(meminfo):
    if len(meminfo["filepid"]) == 0:
        scan_proc(meminfo)
    getFileCache(meminfo)

def check_top_uslab(res):
    cmd = "slabtop -o -s c"
    ret = os.popen(cmd).read().strip()
    touchslab = False
    for line in ret.splitlines():
        if line.find("CACHE SIZE") >= 0:
            touchslab = True
            continue
        if not touchslab:
            continue
        slabname = line.split()[-1]
        cache_size = line.split()[-2]
        if os.path.exists("/sys/kernel/slab/%s/reclaim_account" % slabname):
            with open("/sys/kernel/slab/%s/reclaim_account" % slabname) as fin:
                reclaim_account = fin.read().strip()
            if reclaim_account == '0':
                break
    res['type'] = "%s %s(%s)" % (res['type'], slabname, cache_size)
    res['us_type'] = slabname

def memgraph_kmemleak_check(meminfo):
    global jsonFormat
    res = {}
    res["leak"] = "No"
    res["type"] = "No"
    res["usage"] = 0
    if kmemleak_check(meminfo, "SUnreclaim") == True:
        res["leak"] = "Yes"
        res["type"] = "SUnreclaim"
        check_top_uslab(res)
        res["usage"] = meminfo["SUnreclaim"]
    elif kmemleak_check(meminfo, "allocPage") == True:
        res["leak"] = "Yes"
        res["type"] = "AllocPage"
        res["usage"] = meminfo["allocPage"]
    elif kmemleak_check(meminfo, "VmallocUsed") == True:
        res["leak"] = "Yes"
        res["type"] = "Vmalloc"
        res["usage"] = meminfo["VmallocUsed"]
    meminfo["memleak"] = res
    if jsonFormat != None:
        return meminfo
    #print(res)

def memgraph_memory_cgroup(meminfo, depth):
    meminfo["cgroupOrigDepth"] = depth
    scan_cgroup(meminfo, memRoot(), depth)
    depth = meminfo["cgroupDepth"] -1
    cg={}
    i = 0
    for i in range(0, depth):
        if  len(meminfo["cgroupTop"][i]) == 0:
            continue
        for key, value in meminfo["cgroupTop"][i].items():
            find = 0
            for key2, value2 in meminfo["cgroupTop"][i+1].items():
                if key2.find(key) != -1 and value2 > value*0.6:
                    find = 1
                    break
            if find == 0:
                cg[key] = value
    for key,value in meminfo["cgroupTop"][depth].items():
        cg[key] = value
    meminfo["cgroupTop"] = sorted(cg.items(), key = lambda kv:(kv[1], kv[0]),reverse=True)
    num = 0
    cg = {}
    for key, value in meminfo["cgroupTop"]:
        tmp = {}
        tmp2 = {}
        tmp["total_size"] = value
        tmp["cache"] = 0
        tmp["rss"] = 0
        tmp2 = read_cgroup_stat(key)
        cache_name = "total_cache"
        rss_name = "total_rss"
        if not isV1():
            cache_name = "file"
            rss_name = "anon"
        if len(tmp2) != 0:
            tmp["cache"] = tmp2[cache_name]
            tmp["rss"] = tmp2[rss_name]
        cg[key] = tmp
        num += 1
        if num >= 5:
            break
    meminfo["cgroupInfo"] = cg
    global jsonFormat
    if jsonFormat != None:
        return
    for key,value in meminfo["cgroupTop"]:
        if key in cg:
            print("{} : {}".format(key,cg[key]))

def memgrapth_output_json(meminfo, filepath):
    global jsonFormat
    if jsonFormat == None:
        return meminfo
    res = {}
    res["memGraph"] = meminfo["graph"]
    res["event"] = meminfo["event"]
    res["memleak"] = meminfo["memleak"]
    summary= ''
    if meminfo["event"]["leak"] == True:
       summary += " %s memory leak usage:%s"%(meminfo["memleak"]["type"], meminfo["memleak"]["usage"])
    if meminfo["event"]["memcg"] == True:
        summary += "  memory cgroup leak"
    if len(summary) == 0:
        summary = "success"
    res["summary"] = summary
    taskMem = meminfo["taskMem"]
    taskInfo = meminfo["taskInfo"]
    tmp_mem = []

    if len(taskMem) != 0:
        for key,value in taskMem:
            tmp_task = {}
            tmp_task["comm"] = taskInfo[key]["Name"]
            tmp_task["pid"] = key
            tmp_task["total_mem"] = value
            tmp_task["RssFile"] = taskInfo[key]["RssFile"]
            tmp_task["RssAnon"] = taskInfo[key]["RssAnon"]
            tmp_task["RssShmem"] = taskInfo[key]["RssShmem"]
            tmp_mem.append(tmp_task)
            if len(tmp_mem) >= 10:
                break
    res["memTop"] = tmp_mem
    cg_list = []
    if len(meminfo["cgroupTop"]) != 0:
        for key, value in meminfo["cgroupTop"]:
            tmp_cg = {}
            if key in meminfo["cgroupInfo"]:
                tmp_cg["cgroup"] = key
                tmp_cg.update(meminfo["cgroupInfo"][key])
                cg_list.append(tmp_cg)
    res["cgroupTop"] = cg_list

    cache_list = []
    if len(meminfo["filecache"]) != 0:
        for key,value in meminfo["filecache"]:
            tmp_cache = {}
            tmp_cache["file"] = key
            tmp_cache["cached"] = value *4
            tmp_cache["task"] = getCachePid(meminfo, key)
            cache_list.append(tmp_cache)
            if len(cache_list) == 5:
                break
        closeCache = meminfo["Active(file)"] + meminfo["Inactive(file)"] - meminfo["fileCacheMem"]
        tmp_cache = {}
        tmp_cache["cached"] = closeCache
        tmp_cache["file"] = "total cached of close file"
        tmp_cache["task"] = []
        cache_list.append(tmp_cache)
    res["filecacheTop"] = cache_list

    dump2json(res, filepath)

def memgraph_check_memcg(meminfo):
    filename = "/proc/cgroups"
    fd = open(filename,'r')
    ret = fd.read().strip().split("\n")
    fd.close()
    num = 0
    for line in ret:
        if line.find("memory") == -1:
            continue
        values = line.strip().split()
        if len(values) != 4:
          break
        num = int(values[2])
        break
    return num > 1500

def memgraph_check_memfrag(meminfo):
    key = "Normal"
    if meminfo["MemTotal"] < 4*1024*1024:
        key = "DMA32"
    filename = "/proc/buddyinfo"
    fd = open(filename, 'r')
    ret = fd.read().strip().split('\n')
    fd.close()
    frag = []
    for line in ret:
        if line.find(key) == -1:
            continue
        values = line.strip().split()
        frag = values[-8:]
        break
    if len(frag) == 0:
        return False
    total = 0
    for num in frag:
        total += int(num)
    return total < 100

def memgraph_check_event(meminfo):
    event = {}
    util = (meminfo["MemTotal"] - meminfo["MemAvailable"])*100/meminfo["MemTotal"]
    event["util"] = round(util,2)
    ret = memgraph_check_memcg(meminfo)
    event["memcg"] = ret
    ret = memgraph_check_memfrag(meminfo)
    event["memfrag"] = ret
    event["leak"] = False
    memgraph_kmemleak_check(meminfo)
    if len(meminfo["memleak"]) != 0:
        res = meminfo["memleak"]
        if res["type"] != "No":
            event["leak"] = True
    meminfo["event"] = event

def memgraph_diagnose(meminfo):
    top_res = {'memtop':{},'meminfo':meminfo,'config':{}}
    memtop.get_memtop(top_res['memtop'])
    memtop.get_config(top_res)
    memtop.output_result(top_res)

def memgraph_handler_cmd(meminfo, argv):
    global jsonFormat
    filepath = "memgraph.json"
    try:
        opts, args = getopt.getopt(argv,"j:hgfaklc:d")
    except getopt.GetoptError:
        print('get opt error')
        sys.exit(2)
    memgraph_check_event(meminfo)
    for opt, arg in opts:
        if opt == '-h':
            print("-g: only show memory usage graph")
            print("-f: show file cache usage detail")
            print("-a: show anon page usage detail")
            print("-k: check kernel memleak")
            print("-l: show memory usage of thread")
            print("-c: show memory usage of cgroup")
            print("-j: output for json file")
            print("-d: show memory usage graph and diagnosis")
            sys.exit()
        elif opt in ("-g"):
            memgraph_graph(meminfo)
        elif opt in ("-j"):
            jsonFormat = True
            filepath = arg
        elif opt in ("-f"):
            memgraph_cache_list(meminfo)
        elif opt in ("-a"):
            memgraph_memory_thread(meminfo, "taskAnon")
        elif opt in ("-k"):
            memgraph_kmemleak_check(meminfo)
        elif opt in ("-l"):
            memgraph_memory_thread(meminfo, "taskMem")
        elif opt in ("-c"):
            depth = int(arg)
            #if depth > 6:
                #depth = 6
            meminfo["cgroupTop"] = [None]*depth
            meminfo["cgroupDepth"] = 0
            memgraph_memory_cgroup(meminfo, depth)
        elif opt in ("-d"):
            memgraph_graph(meminfo)
            memgraph_diagnose(meminfo)
        else:
            print("error args options")
    memgrapth_output_json(meminfo, filepath)

if __name__ == "__main__":
    meminfo = {}
    meminfo["taskAnon"] = {}
    meminfo["taskMem"] = {}
    meminfo["filepid"] = {}
    meminfo["filecache"] = {}
    meminfo["graph"] = {}
    meminfo["memleak"] = {}
    meminfo["taskInfo"] = {}
    meminfo["cgroupTop"] = {}
    meminfo["cgroupInfo"] = {}
    memgraph_get_meminfo(meminfo)
    if len(sys.argv) == 1:
        memgraph_graph(meminfo)
        sys.exit(0)
    memgraph_handler_cmd(meminfo, sys.argv[1:])

Youez - 2016 - github.com/yon3zu
LinuXploit