def main(): mbot = MailBot() if not mbot.login(recv = False, trytimes = 10): slog.error("mail login failed") return False slog.info('mail login ok') print('mail login ok') mydriver = init_driver() if not mydriver: slog.warn('chrome driver load error') return False topargus_host = CONFIG.get('topargus_host') for item in topargus_host: run_topargus_spider(item, mydriver, mbot) print("TOPARGUS 系统监控中...") slog.info("TOPARGUS 系统监控中...") while True: time.sleep(1) return True
def packet(self, dest_node_id=None): slog.info("加载收包情况页面") url = '{0}/packet.html'.format(self.url_prefix) if dest_node_id: url = '{0}/packet.html?dest_node_id={1}'.format( self.url_prefix, dest_node_id) return self.load_url(url=url, wait=30)
def network(self, network_id=None): slog.info("加载P2P网络情况页面") url = '{0}/network.html'.format(self.url_prefix) if network_id: url = '{0}/network.html?network_id={1}'.format( self.url_prefix, network_id) return self.load_url(url=url, wait=30)
def handle_mail(self, email_data): subject = email_data.get('subject') body = email_data.get('body') from_email = email_data.get('from')[0] slog.info("recv email from {0} subject is :{1}".format( from_email[1], subject)) # do something handle email return
def __init__(self, username, password, host, name, net_info, mydriver=None): slog.info('TOPARGUS init') self.username = username self.password = password self.host = host self.url_prefix = 'http://{0}:{1}@{2}'.format(self.username, self.password, self.host) self.name = name self.net_info = net_info # start mailbot ,try to login self.mailbot = MailBot().login(10) self.ss = requests.Session() self.ss.auth = (username, password) self.ss.mount('http://', HTTPAdapter(max_retries=3)) self.ss.mount('https://', HTTPAdapter(max_retries=3)) if mydriver == None: #_____________________启动参数___________________________ options = webdriver.ChromeOptions() options.add_argument('headless') options.add_argument('disable-gpu') #options.add_argument("window-size=1220,1080") options.add_argument("window-size=1440,1280") options.add_argument("start-maximized") options.add_argument("no-sandbox") #_____________________代理参数___________________________ desired_capabilities = options.to_capabilities() desired_capabilities['acceptSslCerts'] = True desired_capabilities['acceptInsecureCerts'] = True desired_capabilities['proxy'] = { "httpProxy": None, "ftpProxy": None, "sslProxy": None, "noProxy": None, "proxyType": "MANUAL", "class": "org.openqa.selenium.Proxy", "autodetect": False, } #_____________________启动浏览器___________________________ self.driver = webdriver.Chrome( options=options, #executable_path=CHROME_DRIVER_PATH, desired_capabilities=desired_capabilities) self.driver.set_page_load_timeout(30) #self.driver.manage().window().maximize() else: self.driver = mydriver return
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 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 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 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 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 system(self, cpu = False, send_bandwidth = False, recv_bandwidth = False): slog.info("加载系统情况页面") if cpu == True: url = '{0}/system.html?field=cpu'.format(self.url_prefix) self.load_url(url = url) if send_bandwidth == True: url = '{0}/system.html?field=send_bandwidth'.format(self.url_prefix) self.load_url(url = url) if recv_bandwidth== True: url = '{0}/system.html?field=recv_bandwidth'.format(self.url_prefix) self.load_url(url = url) return True,None
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 alarm(self, low = False, middle = False, high = True, all_alarm = False): slog.info("加载告警事件页面") if all_alarm == True: url = '{0}/alarm.html'.format(self.url_prefix) return self.load_url(url = url, wait = 10) if high == True: url = '{0}/alarm.html?priority=2'.format(self.url_prefix) return self.load_url(url = url, wait = 10) if middle == True: url = '{0}/alarm.html?priority=1'.format(self.url_prefix) return self.load_url(url = url, wait = 10) if low == True: url = '{0}/alarm.html?priority=0'.format(self.url_prefix) return self.load_url(url = url, wait = 10) return False, None
def run_topargus_spider(topargus_info, driver, mbot): status = topargus_info.get('status') name = topargus_info.get('name') host = topargus_info.get('host') net_info = topargus_info.get('net_info') if status != 'true': slog.warn("topargus host:{0} name:{1} status false".format(host, name)) return slog.info("spider run for topargus host:{0} name:{1}".format(host, name)) username = topargus_info.get('username') password = topargus_info.get('password') topargus = TOPARGUS(username=username, password=password, host=host, name=name, net_info=net_info, mydriver=driver) api_th = threading.Thread(target=th_api, args=( topargus, mbot, )) api_th.start() slog.info('api thread start') page_th = threading.Thread(target=th_page, args=( topargus, mbot, )) page_th.start() slog.info('page thread start') return True
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 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 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 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 home(self): slog.info("加载首页") url = '{0}/index.html'.format(self.url_prefix) return self.load_url(url = url, wait = 10)