Esempio n. 1
0
def main():
    root_dir = Path(__file__).resolve().parents[1]
    cfg = config()
    log = Logger(root_dir)
    info = AppInfo(cfg['api_url'])
    level = 'info'
    log.logging(level, '=== {} Started ==='.format(root_dir.name))

    # APIからアプリ情報取得
    log.logging(level, 'Start to fetch AppInfo from [{}]'.format(cfg['api_url']))
    app_info = info.fetch_app_info()
    if isinstance(app_info, dict):
        # アプリ情報取得できたら現在のバージョン取得
        ver_current = app_info['current_version']
        log.logging(level, 'Result to fetch current version: {}'.format(ver_current))

        # サイトからバージョン取得
        log.logging(level, 'Start to fetch latest version from [{}]'.format(app_info['url']))
        latest = info.fetch_latest_version(app_info)
        ver_latest = latest['version']
        level = 'info' if latest['download_link'] is not None else 'error'
        log.logging(level, 'Result to fetch latest version: {}'.format(ver_latest))

        is_updated = False
        try:
            is_updated = StrictVersion(ver_current) < StrictVersion(ver_latest)
        except ValueError:
            pass

        # メール送信
        level = 'info'
        log.logging(level, 'Start to send mail')
        mail_parts = {
            'app_name': app_info['name'],
            'ver_current': ver_current,
            'ver_latest': ver_latest,
            'download_link': latest['download_link'],
            'is_updated': is_updated
        }
        mail_content = create_mail_content(**mail_parts)
        mailer = Mail(cfg['mail_info'])
        msg = mailer.create_message(mail_content)
        mail_result = mailer.send_mail(msg)
        level = 'info' if mail_result['result'] else 'error'
        log.logging(level, 'Result to send mail: {}'.format(mail_result['msg']))
    else:
        level = 'error'
        log.logging(level, 'FAILED to fetch AppInfo from [{}]'.format(cfg['api_url']))
        log.logging(level, 'Error: {}'.format(app_info))

    level = 'info'
    log.logging(level, '=== {} Stop ==='.format(root_dir.name))
Esempio n. 2
0
def send_smart():
    hostname = socket.gethostname()
    mail_info = consts.MAIL_INFO.copy()
    html_contents = Html(
        usage=disk_usage(),
        disks=disk_info(),
        smart=smart_info(),
        columns=consts.SMART_TABLE_COLUMN,
        template_path=consts.TEMPLATE_PATH
    )
    subject = '{} {} from {}'.format(consts.NAS_NAME, consts.MAIL_SUBJECT, hostname)
    body = html_contents.build_html()
    mail_dict = {
        'subject': subject,
        'body': body
    }
    mailer = Mail(mail_info)
    msg = mailer.create_message(mail_dict)
    mailer.send_mail(msg)
Esempio n. 3
0
def main():
    now = datetime.datetime.now()
    root_dir = Path(__file__).resolve().parents[1]
    log = Logger(root_dir)
    cfg = config.config(root_dir)
    # computer_name取得
    computer_name = socket.gethostname()
    level = 'info'
    log.logging(level, '===== Kakuninsan Started on {} ====='.format(computer_name))

    # DBインスタンス
    db = TableIp(cfg['db_info'], cfg['table_detail']['table_name'])

    # スピードテスト
    st = SpeedTest()
    log.logging(level, 'Fetch Server list.')
    server_list = st.sponsor()
    log.logging(level, '---Server list---')
    server_ids = []
    for i, item in enumerate(server_list.items()):
        server_ids.append(item[0])
        log.logging(level, 'Server{}: {}'.format(i + 1, item))
    log.logging(level, '-----------------')

    # test_server = {'20976': {'sponsor': 'GLBB Japan', 'server_area': 'Tokyo, Japan', 'distance': '2.12 km'}}
    # server_ids.insert(0, '20976')
    # server_list.update(test_server)

    for server_id in server_ids:
        for i in range(1, int(cfg['speedtest']['retry_count']) + 1):
            level = 'info'
            log.logging(level, 'Start SpeedTest on Server[id: {}, sponsor: {}], count: {}'
                        .format(server_id, server_list[server_id]['sponsor'], i))
            st_result = st.speed_test_result(server_id)

            if 'Error' in st_result.keys():
                level = 'error'
                log.logging(level, 'SpeedTest Failed: {}'.format(st_result['Error']))
                log.logging(level, 'Pause for {} Seconds.'.format(cfg['speedtest']['interval_seconds']))
                time.sleep(int(cfg['speedtest']['interval_seconds']))
                continue
            else:
                level = 'info'
                current_ip = st_result['global_ip_address']
                log.logging(level, 'Current IP Address: {}'.format(current_ip))

                download = graph.bytes_to_megabytes(st_result['download'])
                upload = graph.bytes_to_megabytes(st_result['upload'])
                log.logging(level, 'Download Speed: {} Mbps'.format(download))
                log.logging(level, 'Upload Speed: {} Mbps'.format(upload))

                # Insert
                log.logging(level, 'Start DB insert')
                insert_dict = insert_info(now, computer_name, st_result)
                insert_result = db.insert_record(cfg['db_info'], cfg['table_detail'], insert_dict)
                level = 'error' if 'Error' in insert_result else 'info'
                log.logging(level, 'DB insert {}'.format(insert_result))

                interval_hour = int(cfg['interval_hour']) if cfg['interval_hour'] else 24
                log.logging(level, 'Start fetch last ip')
                records = db.fetch_last_ip(cfg['table_detail']['clm_created_at'], interval_hour)
                level = 'error' if 'Error' in records else 'info'
                # 前回のIPは、今回インサートしたものの一つ前(listの2番目)のレコード
                last_ip = records[1][1]
                log.logging(level, 'Last IP Address: {}'.format(last_ip))
                level = 'info'
                break
        # スピードテストが成功したらループ抜ける
        if level == 'info':
            break

    is_send_time = now.strftime('%H') == cfg['mail_send_time']
    is_post_time = now.strftime('%H') == cfg['line']['post_time']
    # 指定時間になったらメール送信 or LINEで通知。指定時間以外は、webサーバー動いている環境ならindex.htmlに書き出し
    if is_send_time or is_post_time or cfg['web_server']['is_running']:
        level = 'info'
        # グラフ画像
        grph = Graph(records)
        image_file_path = grph.draw_graph()
        # コンテンツ作成
        html = Html(root_dir)

        if is_send_time:
            log.logging(level, 'It is time to send an email')
            is_updated, records = check_ip(records)
            mail_contents = html.build_html(False, records, image_file_path)
            subject = 'IP Address is UPDATED' if is_updated else 'IP Address is NOT updated'
            body_dict = {'subject': subject, 'body': mail_contents}
            # メール送信
            log.logging(level, 'Start to send email')
            mailer = Mail(cfg['mail_info'])
            msg = mailer.create_message(body_dict)
            result = mailer.send_mail(msg)
            level = 'error' if 'Error' in result else 'info'
            log.logging(level, 'Send Mail Result {}'.format(result))
        else:
            log.logging(level, 'It is not time to send an email')

        if cfg['web_server']['is_running']:
            is_updated, records = check_ip(records)
            web_contents = html.build_html(True, records, image_file_path)
            # htmlフォルダなかったら作って、index.htmlに書き出し
            index_dir = Path(cfg['web_server']['document_root'])
            if not index_dir.is_dir():
                index_dir.mkdir()
            index_path = index_dir.joinpath('index.html')
            with open(index_path, 'w', encoding='utf-8') as f:
                f.write(web_contents)

        if is_post_time:
            log.logging(level, 'Start post to LINE.')
            post_result = post_line(cfg['line']['api_url'], cfg['line']['access_token'], image_file_path)
            level = 'error' if 'Error' in post_result else 'info'
            log.logging(level, 'LINE result: {}'.format(post_result))
        else:
            log.logging(level, 'It is not time to post to LINE.')

    level = 'info'
    log.logging(level, '===== Kakuninsan Stopped. =====')