File size: 4,185 Bytes
a757bd3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | #coding: utf-8
#-------------------------------------------------------------------
# 宝塔Linux面板
#-------------------------------------------------------------------
# Copyright (c) 2015-2099 宝塔软件(http://bt.cn) All rights reserved.
#-------------------------------------------------------------------
# Author: zouhw <zhw@bt.cn>
#-------------------------------------------------------------------
#------------------------------
# Docker模型
#------------------------------
import sys
import threading
sys.path.insert(0, "/www/server/panel/class/")
sys.path.insert(1, "/www/server/panel/")
import projectModel.bt_docker.dk_public as dp
import projectModel.bt_docker.dk_container as dc
import projectModel.bt_docker.dk_status as ds
import projectModel.bt_docker.dk_image as di
import public
import time
class main:
__save_date = None
__day_sec = 86400
def __init__(self,save_date):
if not save_date:
self.__save_date = 30
else:
self.__save_date = save_date
def docker_client(self,url):
return dp.docker_client(url)
def get_all_host_stats(self,fun):
"""
获取所有主机信息并获取该主机下的容器状态
:param fun: 需要调用的方法,用于获取并记录容器状态
:return:
"""
hosts = dp.sql('hosts').select()
for i in hosts:
t = threading.Thread(target=fun,args=(i,))
t.setDaemon(True)
t.start()
# 获取所有docker容器的状态信息
def container_status_for_all_hosts(self,host_info):
"""
获取所有服务器的容器数量
:param host_info: 服务器的配置信息,用于获取并记录容器状态
:return:
"""
# while True:
args = public.to_dict_obj({})
args.url = host_info['url']
container_list = dc.main().get_list(args)['msg']
for c in container_list['container_list']:
args.id = c['id']
args.write = 1
args.save_date = self.__save_date
ds.main().stats(args)
# time.sleep(60)
# 获取所有服务器的容器数量
def container_count(self):
# while True:
hosts = dp.sql('hosts').select()
n = 0
for i in hosts:
args = public.to_dict_obj({})
args.url = i['url']
container_list = dc.main().get_list(args)['msg']
n += len(container_list)
pdata = {
"time":int(time.time()),
"container_count": n
}
expired = time.time() - (self.__save_date * self.__day_sec)
dp.sql("container_count").where("time<?",(expired,)).delete()
dp.sql("container_count").insert(pdata)
# time.sleep(60)
def image_for_all_host(self):
# while True:
hosts = dp.sql('hosts').select()
num = 0
size = 0
for i in hosts:
args = public.to_dict_obj({})
args.url = i['url']
res = di.main().image_for_host(args)
if not res['status']:
continue
print(res)
num += res['msg']['num']
size += res['msg']['size']
pdata = {
"time":int(time.time()),
"num": num,
"size": int(size)
}
expired = time.time() - (self.__save_date * self.__day_sec)
dp.sql("image_infos").where("time<?",(expired,)).delete()
dp.sql("image_infos").insert(pdata)
# time.sleep(60)
def monitor():
# 获取所有容器信息
while True:
save_date = dp.docker_conf()['SAVE']
m = main(save_date)
m.get_all_host_stats(m.container_status_for_all_hosts)
# 开始获取容器总数
t = threading.Thread(target=m.container_count)
t.setDaemon(True)
t.start()
# 获取镜像详情
t = threading.Thread(target=m.image_for_all_host)
t.setDaemon(True)
t.start()
time.sleep(60)
# condition=threading.Condition()
# condition.acquire()
# condition.wait()
if __name__ == "__main__":
monitor() |