「django开发」CMDB实验————10、切割状态文件(自用)

文章描述了一个Python项目中如何处理来自两个文件(dockerStatus.txt和allServicesStatus.txt)的Docker容器状态和进程信息,然后将这些信息存储到DockerStatus和AllServicesStatus数据库表中。包括创建数据表、数据读取、清洗、以及数据库操作的过程。
摘要由CSDN通过智能技术生成

        之前已经将两个目标文件的内容转成列表了,接下来将对列表中的数据进行处理,将有效信息存储到数据库。

一、创建数据表。

# 容器状态表
class DockerStatus(models.Model):
    name = models.CharField(max_length=255, verbose_name='容器名称', null=False)
    status = models.CharField(max_length=255, verbose_name='容器状态', null=False)


# 容器内进程信息表
class AllServicesStatus(models.Model):
    did = models.CharField(max_length=255, verbose_name='容器ID', null=True, blank=True)
    name = models.CharField(max_length=255, verbose_name='容器名称', null=True, blank=True)
    user = models.CharField(max_length=255, verbose_name='服务调用用户', null=True, blank=True)
    pid = models.CharField(max_length=255, verbose_name='服务PID', null=True, blank=True)
    ppid = models.CharField(max_length=255, verbose_name='服务PPID', null=True, blank=True)
    cpu = models.CharField(max_length=255, verbose_name='cpu使用率', null=True, blank=True)
    elapsed = models.CharField(max_length=255, verbose_name='容器运行时间', null=True, blank=True)
    tty = models.CharField(max_length=255, verbose_name='TTY', null=True, blank=True)

 在models.py中填写创建表的信息。

python manage.py makemigrations
python manage.py migrate

 执行迁移命令。

数据表生成成功。

二、数据拆分。 

def home(request):
    """
    :param request:
    :return: 首页
    """

    # 获取最新文件内容
    os.system(r"C:\Users\12269\PycharmProjects\CMDB\web\tools\getClientData.py")

    # 获取'web/clientData/dockerStatus.txt'内容,并进行过滤操作。
    dockerStatus = []
    try:
        with open('web/clientData/dockerStatus.txt', 'r') as file:
            # 将文件中内容转化成列表
            for line in file:
                data = ast.literal_eval(line)
                dockerStatus.append(data)
            # 删除每个子列表的第一个元素
            for sublist in dockerStatus:
                del sublist[0]
    except FileNotFoundError:
        print('文件 web/clientData/dockerStatus.txt 不存在!')

    # 将dockerStatus列表中存储的信息传输至数据表
    from web.models import DockerStatus

    # 清空数据表
    DockerStatus.objects.all().delete()
    # 插入数据
    for i in range(0, len(dockerStatus)):
        obj = DockerStatus.objects.create(**{'name': dockerStatus[i][0], 'status': dockerStatus[i][1]})
        obj.save()
    # 从数据库中获取web_dockerstatus表的数据
    rows = searchData.searchContents('web_dockerstatus')
    dockerStatus = {}
    for row in rows:
        dockerStatus[row[1]] = row[2]

    # 获取'web/clientData/allDockerStatus.txt'内容
    servicesStatus = ''
    try:
        with open('web/clientData/allServicesStatus.txt', 'r') as file:
            content = file.readlines()
            servicesStatus = [line.replace('\n', '') for line in content]  # 去除\n
    except FileNotFoundError:
        print('文件 web/clientData/allDockerStatus.txt 不存在!')

    # 筛选allServicesStatus.txt中的有效数据,并存入web_allServicesStatus表中

    from web.models import AllServicesStatus
    # 清空数据表
    AllServicesStatus.objects.all().delete()

    did = ''
    name = ''

    for row in servicesStatus:
        user = ''
        pid = ''
        ppid = ''
        cpu = ''
        elapsed = ''
        tty = ''

        if 'Container ID' in row:
            did = row[-12:]  # 获取容器ID

        if 'Container Name' in row:
            name = row[15:]  # 获取容器名称

        if 'USER' in row:
            continue  # 当遍历到表头行时跳过该行

        if 'has no running processes' in row: # 当容器中不存在进程,则状态字段置空
            obj = AllServicesStatus.objects.create(**{'did': did,
                                                      'name': name,
                                                      'user': user,
                                                      'pid': pid,
                                                      'ppid': ppid,
                                                      'cpu': cpu,
                                                      'elapsed': elapsed,
                                                      'tty': tty})
            obj.save()

        if  'pts' in row or '?' in row:
            tempStatusList = re.split(r"\s+", row.strip())  # 按空格拆分行
            print(tempStatusList)
            user = tempStatusList[1]  # 获取服务用户
            pid = tempStatusList[2]  # 获取服务pid
            ppid = tempStatusList[3]  # 获取服务ppid
            cpu = tempStatusList[4]  # 获取服务cpu使用率
            elapsed = tempStatusList[5]  # 获取服务运行时间
            tty = tempStatusList[6]  # 获取服务tty

            # 填入数据
            obj = AllServicesStatus.objects.create(**{'did': did,
                                                      'name': name,
                                                      'user': user,
                                                      'pid': pid,
                                                      'ppid': ppid,
                                                      'cpu': cpu,
                                                      'elapsed': elapsed,
                                                      'tty': tty})
            obj.save()
        
        # 从数据库获取数据。
        servicesStatus = searchData.searchContents('web_allServicesStatus')

    return render(request, 'home.html', {'dockerStatus': dockerStatus, 'servicesStatus': servicesStatus})

数据筛选过程。

 数据库中有效数据部分。

输出结果。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值