BYPASS SHELL BY ./RAZORGANZ
Server: nginx/1.20.1
System: Linux iZdzfnv9mwfppeZ 5.10.134-19.2.al8.x86_64 #1 SMP Wed Oct 29 22:47:09 CST 2025 x86_64
User: apache (48)
PHP: 8.2.30
Disabled: NONE
Upload Files
File: //usr/local/sysak/.sysak_components/tools/podinfo.py
# -*- coding: utf-8 -*-

import os
import sys
import json
from ctypes import CDLL, c_int, c_char_p

work_path = os.getenv("SYSAK_WORK_PATH","")

podinfo_lib = None

def set_podinfo_lib():
    global podinfo_lib
    podinfo_lib = CDLL(work_path + "/tools/libpodinfo.so")
    podinfo_lib.CGetPodInfobyIDorNameorUid.argtypes = [c_char_p]
    podinfo_lib.CGetPodInfobyIDorNameorUid.restype = c_char_p
    podinfo_lib.CGetContainersOfPod.argtypes = [c_char_p]
    podinfo_lib.CGetContainersOfPod.restype = c_char_p
    podinfo_lib.CGetContainerInfos.restype = c_char_p
    podinfo_lib.SetLogLevel.argtypes = [c_int]
    podinfo_lib.SetLogLevel.restype = None
    return podinfo_lib

def get_all_container():
    podinfo_lib.SetLogLevel(0)
    result = podinfo_lib.CGetContainerInfos()
    podinfo_lib.SetLogLevel(4)
    
    if not result:
        return {}

    result_str = result.decode('utf-8')
    cons = json.loads(result_str)
    
    return cons

def get_containers_of_pod(pod_name):
    """获取Pod中的容器信息

    Args:
        pod_name (str): Pod的名称/ID/UID

    Returns:
        [
            {
                "Id"              string
                "PodName"         string
                "PodId"           string
                "Pid"             int
                "Namespace"       string
                "PodCgroup"       string
                "ContainerCgroup" string
                "ContainerName"   string
                "Image"           string
                "PodIp"           string
            }
        ]
    """
    podinfo_lib.SetLogLevel(0)
    
    pod_name = pod_name.encode("utf-8")
    res = podinfo_lib.CGetContainersOfPod(pod_name)
    if not res:
        print("Failed to get containers info of pod %s" % pod_name)
        sys.exit(1)
    res = res.decode("utf-8")
    infos =  json.loads(res)
    
    podinfo_lib.SetLogLevel(4)
    return infos

def get_pod_info(pod_name):
    """获取Pod的信息

    Args:
        pod_name (str): Pod的名称/ID/UID

    Returns:
        {
            "Id": "Pod ID",
            "Uid": "Pod UID",
            "Name": "Pod Name",
            "Namespace": "Pod Namespace",
            "CgroupParent": "Pod CgroupPath"
        }
    """
    podinfo_lib.SetLogLevel(0)
    
    pod_name = pod_name.encode("utf-8")
    res = podinfo_lib.CGetPodInfobyIDorNameorUid(pod_name)
    if not res:
        print("Failed to get pod info of %s" % pod_name)
        sys.exit(1)
    
    res = res.decode("utf-8")
    info = json.loads(res)
    
    podinfo_lib.SetLogLevel(4)
    return info

def get_con_by_cgroup(cg_path):
    result = podinfo_lib.CGetContainerInfos()
    
    if not result:
        return {}

    result_str = result.decode('utf-8')
    cons = json.loads(result_str)
    
    for con in cons:
        if cg_path.startswith(con.get('ContainerCgroup')):
            return con

    return {}

def get_pod_by_cgroup(cg_path):
    result = podinfo_lib.CListPods()
    if not result:
        return {}

    result = result.decode('utf-8')
    pods = json.loads(result)
    
    for pod in pods:
        if cg_path.startswith(pod.get('CgroupParent')):
            return pod
    
    return {}

def get_root_path():
    """读取环境变量 ROOT_DIR
    1. 如果环境变量存在则使用环境变量;
    2. 如果环境变量不存在默认为 /
    """
    root_dir = os.getenv("ROOT_DIR")
    if root_dir is None:
        root_dir = "/"
    return root_dir

def get_real_path(path):
    if path.startswith("/"):
        path = path[1:]
    return os.path.join(get_root_path(), path)


def is_cgroup_v1():
    """Is cgroup v1 or v2

    Returns:
        _type_: _description_
    """
    if os.path.exists(get_real_path("/sys/fs/cgroup/cgroup.controllers")):
        return False
    else:
        return True


def memory_cgroup_root():
    """Get memory root path

    Returns:
        _type_: _description_
    """
    if is_cgroup_v1():
        return get_real_path("/sys/fs/cgroup/memory")
    else:
        return get_real_path("/sys/fs/cgroup")