def recv_mail(self): if not self.downloader: slog.warning("downloader not login") return False self.downloader.select() # Select inbox or default namespace (retcode, messages) = self.downloader.search(None, '(UNSEEN)') if retcode != 'OK': slog.warning("read mail from server failed") return False if not os.path.exists("./downmail"): os.mkdir("./downmail") for num in messages[0].split(): slog.info('Processing: {0}'.format(num)) typ, data = self.downloader.fetch(num.decode('utf-8'), '(RFC822)') # 标记已读 sr = self.downloader.store(num, '+FLAGS', '\Seen') # 标记删除 #sr = downloader.store(num, '+FLAGS', '\\Deleted') email_message = email.message_from_string( data[0][1].decode('utf-8')) # mail to string fp = StringIO() g = generator.Generator(fp, mangle_from_=True, maxheaderlen=60) g.flatten(email_message) email_text = fp.getvalue() # mail_string to json_string pmail = mailparser.parse_from_string(email_text) email_json = pmail.mail_json # mail to json obj email_data = json.loads(email_json) # 处理邮件 self.handle_mail(email_data) subject = email_data.get('subject') body = email_data.get('body') slog.info("get mail: subject[{0}] body.size[{1}]".format( subject, len(body))) filename = './downmail/{0}.eml'.format(subject) with open(filename, 'w') as fout: gr = generator.Generator(fout) gr.flatten(email_message) #fout.write(email_text) fout.close() filename_j = './downmail/{0}.json'.format(subject) with open(filename_j, 'w') as fjout: fjout.write( json.dumps(email_data, indent=4, ensure_ascii=False)) fjout.close() slog.info("save {0} ok,\n".format(filename)) return True
def packet_drop_api(self): end = int(time.time() * 1000) begin = end - 10 * 60 * 1000 # latest 10 min url = 'http://{0}/api/web/packet_drop/?begin={1}&end={2}'.format(self.host, begin, end) my_headers = { 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Encoding': 'gzip, deflate, br', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Host': self.host, 'Referer': self.url_prefix + '/index.html', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', } ''' {"error":"OK","results":[[1579441355398,1.8],[1579441415398,3.6],[1579441475398,0.0]],"status":0} ''' results = None try: res = self.ss.get(url, headers = my_headers) if res.status_code == 200: results = res.json().get('results') except Exception as e: slog.warning("catch exception:{0}".format(e)) slog.debug("get result:{0}".format(json.dumps(results))) return results
def node_info_api(self): url = 'http://{0}/api/web/node_info/?status=offline'.format(self.host) my_headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Accept-Encoding': 'gzip, deflate, br', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Host': self.host, 'Referer': self.url_prefix + '/index.html', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36', } ''' {"error":"OK","results":{"node_info":[],"node_size":0},"status":0} ''' results = None try: res = self.ss.get(url, headers = my_headers) if res.status_code == 200: results = res.json().get('results') except Exception as e: slog.warning("catch exception:{0}".format(e)) slog.debug("get result:{0}".format(json.dumps(results))) return results
def __del__(self): slog.info('TOPARGUS uninit') try: """ Destroy the web browser """ self.driver.close() self.driver.quit() except Exception as e: slog.warning("quit Exception: ", e) finally: return
def run_page(topargus, mbot): slog.debug("run_page alive") subject = 'TOPARGUS 常规定时监控' contents = [ 'TOPARGUS_host: {0}'.format(topargus.default_index()), 'TOPARGUS_name: {0}'.format(topargus.get_topargus_name()), 'TOPARGUS_info: {0}'.format(topargus.get_topargus_net_info()), ] ret = topargus.home() ret = list(ret) if len(ret) == 2 and ret[1] != None: if ret[1].endswith('png'): # picture pic = mbot.make_pic_inline(ret[1]) contents.append("[首页]") contents.append(pic) contents.append("\n\n\n") ret = topargus.alarm() ret = list(ret) if len(ret) == 2 and ret[1] != None: if ret[1].endswith('png'): # picture pic = mbot.make_pic_inline(ret[1]) contents.append("[告警页面]") contents.append(pic) contents.append("\n\n\n") ret = topargus.packet() ret = list(ret) if len(ret) == 2 and ret[1] != None: if ret[1].endswith('png'): # picture pic = mbot.make_pic_inline(ret[1]) contents.append("[收包情况]") contents.append(pic) contents.append("\n\n\n") ret = topargus.network() ret = list(ret) if len(ret) == 2 and ret[1] != None: if ret[1].endswith('png'): # picture pic = mbot.make_pic_inline(ret[1]) contents.append("[P2P网络]") contents.append(pic) contents.append("\n\n\n") contents.append("MAIL END") ret = mbot.send_mail(CONFIG.get('target_email_adr'), subject, contents) if ret: slog.info('send alarm_api mail to {0} ok'.format( json.dumps(CONFIG.get('target_email_adr')))) return True else: slog.warning('send alarm_api mail to {0} error'.format( json.dumps(CONFIG.get('target_email_adr')))) return False
def login(self, send=True, recv=False, trytimes=4): if recv == True: if not self.downloader_login(trytimes): slog.warning("mail downloader login fialed") return False if send == True: if not self.sender_login(trytimes): slog.warning("mail sender login failed") return False slog.info("mail send:{0} recv:{1} login success".format(send, recv)) return True
def downloader_login(self, trytimes=3): for i in range(0, trytimes): try: downloader = imaplib.IMAP4_SSL(self.imap_host) downloader.login(self.username, self.password) slog.info('downloader login {0} success'.format( self.imap_host)) self.downloader = downloader return True except Exception as e: slog.warning('downloader login {0} failed:{1}'.format( self.imap_host, e)) return False
def send_mail_without_trycatch(self, email_adr, subject, contents): ''' contents = [ 'This is the body, and here is just text http://somedomain/image.png', 'You can find an audio file attached.', './chuxianyoulikai_yuxi.mp3', yagmail.inline('./cat1.jpg')] ''' if not self.sender: slog.warning("mail_sender not logining") return False self.sender.send(email_adr, subject, contents) slog.info("send email to {0} finished".format(json.dumps(email_adr))) return True
def recv_mail_weibo(self, subject_pattern, from_email_pattern): if not self.downloader: slog.warning("downloader not login") if not self.login(): return self.downloader.select() # Select inbox or default namespace (retcode, messages) = self.downloader.search(None, '(UNSEEN)') if retcode != 'OK': slog.warning("read mail from server failed") return False for num in messages[0].split(): slog.info('Processing: {0}'.format(num)) typ, data = self.downloader.fetch(num.decode('utf-8'), '(RFC822)') email_message = email.message_from_string( data[0][1].decode('utf-8')) # mail to string fp = StringIO() g = generator.Generator(fp, mangle_from_=True, maxheaderlen=60) g.flatten(email_message) email_text = fp.getvalue() # mail_string to json_string pmail = mailparser.parse_from_string(email_text) email_json = pmail.mail_json # mail to json obj email_data = json.loads(email_json) subject = email_data.get('subject') if subject.find(subject_pattern) == -1: continue from_email = email_data.get('from')[0] # list if from_email_pattern not in from_email: continue # 标记已读 sr = self.downloader.store(num, '+FLAGS', '\Seen') # 标记删除 #sr = downloader.store(num, '+FLAGS', '\\Deleted') # find target email body = email_data.get('body') slog.info("read email: subject:{0} body size:{1}".format( subject, len(body))) vcode = body.split('\n')[0] return vcode return ''
def load_url(self, url, wait = 0): slog.info("访问 url:{0}".format(url)) try: self.driver.get(url) except Exception as e: slog.warning("url:{0} cannot be reached:{1}".format(url,e)) return False, None if not os.path.exists('./temp'): os.mkdir('./temp') page = './temp/{0}.png'.format(self.randomString(10)) if wait != 0: self.wait_for_ajax_data(wait) self.driver.save_screenshot(page) return True, page
def sender_login(self, trytimes=3): for i in range(0, trytimes): try: if self.smtp_port == 587: yag = yagmail.SMTP(user=self.username, password=self.password, host=self.smtp_host, port=self.smtp_port, smtp_starttls=True, smtp_ssl=False) self.sender = yag else: yag = yagmail.SMTP(user=self.username, password=self.password, host=self.smtp_host, port=self.smtp_port) self.sender = yag slog.info("sender login success to {0}".format(self.smtp_host)) return True except Exception as e: slog.warning("sender login failed:{0}".format(e)) return False
def main(): mbot = MailBot() if not mbot.login(recv=False, trytimes=10): slog.warning("login mail failed") return #vcode = mbot.get_weibo_vcode("weibo_vcode", "*****@*****.**") #slog.info("get weibo vcode:{0}".format(vcode)) # test send email_adr = ['*****@*****.**', '*****@*****.**'] subject = 'test from python' contents = [ 'This is the body, and here is just text http://somedomain/image.png', 'You can find an audio file attached.', mbot.make_pic_inline('./sample.png'), '\n\n\n', 'mail end' ] ret = mbot.send_mail(email_adr, subject, contents) #ret = mbot.send_mail_without_trycatch(email_adr, subject, contents) if ret: slog.info("send mail ok") else: slog.warning("send mail fail")
def run_api(topargus, mbot): ''' def alarm_api(self): def node_info_api(self): def packet_drop_api(self): ''' slog.debug("run_api alive") subject = 'TOPARGUS 高优先级告警事件!' contents = [ 'TOPARGUS_host: {0}'.format(topargus.default_index()), 'TOPARGUS_name: {0}'.format(topargus.get_topargus_name()), 'TOPARGUS_info: {0}'.format(topargus.get_topargus_net_info()), ] results = topargus.alarm_api() if results: #if results.get('system_alarm_info') and len(results.get('system_alarm_info')) > 0: if True: slog.warning('get alarm high level info') ret = topargus.alarm(high=True) # (True, filename) ret = list(ret) if len(ret) == 2 and ret[1] != None: if ret[1].endswith('png'): # picture pic = mbot.make_pic_inline(ret[1]) contents.append("[节点离线]") contents.append(pic) contents.append("\n\n\n") results = topargus.node_info_api() if results: #if results.get('node_info') and len(results.get('node_info')) > 0: if True: slog.warning('get offline node_info') contents.append("[离线节点列表]") contents.append(json.dumps(results.get('node_info'))) contents.append("\n\n\n") # results = topargus.packet_drop_api() contents.append("MAIL END") ret = mbot.send_mail(CONFIG.get('target_email_adr'), subject, contents) if ret: slog.info('send alarm_api mail to {0} ok'.format( json.dumps(CONFIG.get('target_email_adr')))) return True else: slog.warning('send alarm_api mail to {0} error'.format( json.dumps(CONFIG.get('target_email_adr')))) return False
def run_page(topargus, mbot): slog.debug("run_page alive") subject = 'TOPARGUS 常规定时监控' contents = [ 'TOPARGUS_host: {0}'.format(topargus.default_index()), 'TOPARGUS_name: {0}'.format(topargus.get_topargus_name()), 'TOPARGUS_info: {0}'.format(topargus.get_topargus_net_info()), ] ret = topargus.home() ret = list(ret) if len(ret) == 2 and ret[1] != None: if ret[1].endswith('png'): # picture pic = mbot.make_pic_inline(ret[1]) contents.append("[首页]") contents.append(pic) contents.append("\n\n\n") # add for dingtalk robot mainnet_html_dir = '/usr/local/smaug/nginx/webapp/mainnet/home.png' from shutil import copyfile copyfile(ret[1], mainnet_html_dir) mainnet_url = 'http://142.93.126.168/mainnet/home.png' markdown_text = '''## 全网丢包率情况\n ![](http://142.93.126.168/mainnet/home.png)\n 详情查看: [http://smaug:[email protected]/index.html](http://smaug:[email protected]/index.html)''' send_info_dingding(markdown_text, None): ret = topargus.alarm() ret = list(ret) if len(ret) == 2 and ret[1] != None: if ret[1].endswith('png'): # picture pic = mbot.make_pic_inline(ret[1]) contents.append("[告警页面]") contents.append(pic) contents.append("\n\n\n") ret = topargus.packet() ret = list(ret) if len(ret) == 2 and ret[1] != None: if ret[1].endswith('png'): # picture pic = mbot.make_pic_inline(ret[1]) contents.append("[收包情况]") contents.append(pic) contents.append("\n\n\n") ret = topargus.network() ret = list(ret) if len(ret) == 2 and ret[1] != None: if ret[1].endswith('png'): # picture pic = mbot.make_pic_inline(ret[1]) contents.append("[P2P网络]") contents.append(pic) contents.append("\n\n\n") contents.append("MAIL END") ret = mbot.send_mail(CONFIG.get('target_email_adr'), subject, contents) if ret: slog.info('send alarm_api mail to {0} ok'.format(json.dumps(CONFIG.get('target_email_adr')))) return True else: slog.warning('send alarm_api mail to {0} error'.format(json.dumps(CONFIG.get('target_email_adr')))) return False
def new_func(*args, **kwargs): try: return func(*args, **kwargs) except Exception as e: slog.warning("Got error! {0}".format(repr(e))) return 'EEE'