#!/usr/bin/python3 import psutil import smtplib import os import argparse from datetime import datetime from pathlib import Path from email.mime.text import MIMEText from email.header import Header from email.mime.multipart import MIMEMultipart # 定义公共的部分 path = Path(__file__) report_dir = path.parent.parent / "report" # 初始化目录 if not report_dir.exists(): # shutil.rmtree(data_dir) report_dir.mkdir() #报告文件 week=str(datetime.now().isocalendar()[1]) file_name = "ComputerInfos-week-" + week + ".txt" file_path = report_dir/file_name #发邮件 def send_mail(): #发件人 sender = 'mh@unamail.com' # 接收邮件,可以发给多人 receivers = ['mh@unamail.com'] # 邮件主体 msg = MIMEMultipart() #正文 message = "第{0}周,{1}运行信息检测已完成,详情请查看附件!".format(week,get_IP()) msg.attach(MIMEText(message, 'plain', _charset="utf-8")) # 发送者 msg['From'] = Header(sender, 'utf-8') # 接收者 msg['To'] = Header(receivers[0], 'utf-8') # 主题 subject = '【长期任务】第{0}周{1}系统运行信息'.format(week,get_IP()) msg['Subject'] = Header(subject, 'utf-8') #附件信息 att = MIMEText(open(str(file_path), 'rb').read(), 'base64', 'utf-8') att["Content-Type"] = 'application/octet-stream' att["Content-Disposition"] = 'attachment; filename="{}"'.format(file_name) msg.attach(att) try: smtpObj = smtplib.SMTP('10.10.110.102') smtpObj.sendmail(sender, receivers, msg.as_string()) print ("邮件发送成功") except smtplib.SMTPException: print ("Error: 无法发送邮件") #写入文件 def save_txt(datas): with open(str(file_path),'a+',encoding='utf-8',newline='') as file_txt: [file_txt.write(str(item)+'\n') for item in datas] # 获取本机磁盘使用率和剩余空间G信息 def get_disk_info(): # 循环磁盘分区 content = [] for disk in psutil.disk_partitions(): # 读写方式 光盘 or 有效磁盘类型 if 'cdrom' in disk.opts or disk.fstype == '': continue disk_name_arr = disk.device.split(':') disk_name = disk_name_arr[0] disk_info = psutil.disk_usage(disk.device) # 磁盘剩余空间,单位G free_disk_size = disk_info.free//1024//1024//1024 # 磁盘总空间,单位G total_disk_size = disk_info.total//1024//1024//1024 # 当前磁盘使用率、剩余空间G和磁盘总空间信息 info = " %s盘使用率:%s%%, 剩余空间:%iG, 总大小:%sG" % (disk_name, str(disk_info.percent),free_disk_size,total_disk_size) # print(info) # 拼接多个磁盘的信息 content.append(info) print(content) save_txt(content) # 获取某个目录的大小 dir_content=[] def get_dir_size(path): list1 = [] fileList = os.listdir(path) # 获取path目录下所有文件 for filename in fileList: pathTmp = os.path.join(path,filename) # 获取path与filename组合后的路径 if os.path.isdir(pathTmp): # 判断是否为目录 print("---------------") dir_content.append(" ---------------") get_dir_size(pathTmp) # 是目录就继续递归查找 elif os.path.isfile(pathTmp): # 判断是否为文件 filesize = os.path.getsize(pathTmp) # 如果是文件,则获取相应文件的大小 str_tex = ' %s文件的大小为:%d字节' % (pathTmp,filesize) print(str_tex) dir_content.append(str_tex) list1.append(filesize) # 将文件的大小添加到列表 str_dir_tex = ' %s 目录的大小为: %.4f MB' % (path, (sum(list1)/1024/1024)) print(str_dir_tex) dir_content.append(str_dir_tex) # cpu信息 def get_cpu_info(): cpu_percent = psutil.cpu_percent(interval=1) cpu_info = ["","CPU使用率:%i%%" % cpu_percent,""] print(cpu_info) # return cpu_info save_txt(cpu_info) # 内存信息 def get_memory_info(): virtual_memory = psutil.virtual_memory() used_memory = virtual_memory.used/1024/1024/1024 free_memory = virtual_memory.free/1024/1024/1024 memory_percent = virtual_memory.percent memory_info = ["内存使用:%0.2fG,使用率%0.1f%%,剩余内存:%0.2fG" % (used_memory, memory_percent, free_memory),""] print(memory_info) # return memory_info save_txt(memory_info) def get_IP(): """获取ipv4地址""" dic = psutil.net_if_addrs() ipv4_list = [] for adapter in dic: snicList = dic[adapter] for snic in snicList: # if snic.family.name in {'AF_LINK', 'AF_PACKET'}: # mac = snic.address if snic.family.name == 'AF_INET': ipv4 = snic.address if ipv4 != '127.0.0.1': ipv4_list.append(ipv4) # elif snic.family.name == 'AF_INET6': # ipv6 = snic.address print(ipv4_list) return(ipv4_list[0]) def main(): commoninfo = [] if not file_path.exists(): t1 = "本周是第{0}周".format(week) commoninfo.append(t1) commoninfo.append("") commoninfo.append("--------------------START--------------------------") commoninfo.append("检测时间: {0}".format(datetime.now())) commoninfo.append("检测IP: {0}".format(get_IP())) save_txt(commoninfo) save_txt(["","磁盘使用情况:",""]) get_disk_info() get_cpu_info() get_memory_info() path = "D:\\agent\\ubackup\\uagent\\logs" get_dir_size(path) save_txt(["{0}目录大小:".format(path)]) save_txt(dir_content) save_txt(['----------------------END----------------------------']) if __name__ == '__main__': main() #默认不发邮件,通过参数控制 parser = argparse.ArgumentParser(description='send email') parser.add_argument("--send-mail", type=bool, default=False) args = parser.parse_args() if args.send_mail: send_mail()