Пример #1
0
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
Пример #2
0
 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)
Пример #3
0
 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)
Пример #4
0
 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
Пример #5
0
    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
Пример #6
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
Пример #7
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
Пример #8
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
Пример #9
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
Пример #10
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
Пример #11
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
Пример #12
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 ''
Пример #13
0
    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
Пример #14
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
Пример #15
0
    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
Пример #16
0
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
Пример #17
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
Пример #18
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")
Пример #19
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
Пример #20
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
Пример #21
0
 def home(self):
     slog.info("加载首页")
     url = '{0}/index.html'.format(self.url_prefix)
     return self.load_url(url = url, wait = 10)