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))
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)
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. =====')