import datetime import logging import sys import time import psutil from ..monitor.models import Server, Monitor, SysFiles from ..op_drf.response import SuccessResponse from ..system.models import ConfigSettings from ..utils.decorators import BaseCeleryApp logger = logging.getLogger(__name__) from platform import platform def getIP(): """获取ipv4地址""" dic = psutil.net_if_addrs() ipv4_list = [] for adapter in dic: snicList = dic[adapter] for snic in snicList: if snic.family.name == 'AF_INET': ipv4 = snic.address if ipv4 != '127.0.0.1': ipv4_list.append(ipv4) if len(ipv4_list) >= 1: return ipv4_list[0] else: return None @BaseCeleryApp(name='apps.vadmin.monitor.tasks.get_monitor_info') def get_monitor_info(): """ 定时获取系统监控信息 :return: """ # 获取服务器 ip = getIP() if not ip: logger.error("无法获取到IP") return server_obj, create = Server.objects.get_or_create(ip=ip) if create: server_obj.name = ip terse = ('terse' in sys.argv or '--terse' in sys.argv) aliased = (not 'nonaliased' in sys.argv and not '--nonaliased' in sys.argv) server_obj.os = platform(aliased, terse) server_obj.save() # 获取CPU和内存信息 mem = psutil.virtual_memory() monitor_obj = Monitor() monitor_obj.cpu_num = psutil.cpu_count() monitor_obj.cpu_sys = float(psutil.cpu_percent(0.1)) monitor_obj.mem_num = int(mem.total / 1024) monitor_obj.mem_sys = int(mem.used / 1024) monitor_obj.seconds = time.strftime("%d天 %H 小时 %M 分 %S 秒", time.gmtime(int(time.time()) - int(psutil.boot_time()))) monitor_obj.server = server_obj monitor_obj.save() # 保存磁盘信息 for ele in psutil.disk_partitions(): disk = psutil.disk_usage('/') sys_files_obj = SysFiles() sys_files_obj.dir_name = ele.mountpoint sys_files_obj.sys_type_name = ele.opts sys_files_obj.type_name = ele.fstype sys_files_obj.total = disk.total sys_files_obj.disk_sys = disk.used sys_files_obj.monitor = monitor_obj sys_files_obj.save() return SuccessResponse(msg="") @BaseCeleryApp(name='apps.vadmin.monitor.tasks.clean_surplus_monitor_info') def clean_surplus_monitor_info(): """ 定时清理多余 系统监控信息 :return: """ config_settings_obj = ConfigSettings.objects.filter(configKey='sys.monitor.info.save_days').first() Monitor.objects.filter( update_datetime__lt=datetime.timedelta(days=int(config_settings_obj.configValue or 30))).delete() logger.info(f"成功清空{config_settings_obj.configValue}天前数据")