File size: 4,185 Bytes
08c964e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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()