之前已经将两个目标文件的内容转成列表了,接下来将对列表中的数据进行处理,将有效信息存储到数据库。
一、创建数据表。
# 容器状态表
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})
数据筛选过程。
数据库中有效数据部分。
输出结果。