Пример #1
0
    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
Пример #2
0
    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
Пример #3
0
    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
Пример #4
0
 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
Пример #5
0
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
Пример #6
0
    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
Пример #7
0
    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
Пример #8
0
 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
Пример #9
0
    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 ''
Пример #10
0
    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
Пример #11
0
    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
Пример #12
0
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")
Пример #13
0
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
Пример #14
0
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
Пример #15
0
 def new_func(*args, **kwargs):
     try:
         return func(*args, **kwargs)
     except Exception as e:
         slog.warning("Got error! {0}".format(repr(e)))
         return 'EEE'