#! /usr/bin/env python3 import requests import re from lxml import html from datetime import datetime, timedelta import argparse import sys #### functions ################################# ## working with script arguments def create_arg_parser(): parser = argparse.ArgumentParser() parser.add_argument('--days', nargs=1, type=int) parser.add_argument('--cookies', nargs=1, required=True, type=str) parser.add_argument('--metricks', nargs=1, required=True, type=str) return parser # download html page def html_fetch(url, cookies): r = requests.get(url, cookies=cookies) # if cookies session is expired abort the script if re.findall(r'.*\.auth0\.com/login', r.url): sys.exit("expired/wrong cookies") parsed_body = html.fromstring(r.text) return parsed_body # find required columns and grab their values def html_parse(list_data): elements_data = {} result = [] html_page = list_data table_columns = html_page.xpath("//td/@class") table_columns = list(dict.fromkeys(table_columns)) table_columns = [x for x in table_columns if re.findall(r'col-.*', x)] if len(table_columns) > 0: for i in table_columns: L = html_page.xpath(f"//td[@class='{i}']/text()") elements_data[i] = [x.split() for x in L] # remove spaces in list rows_count = len(elements_data[table_columns[0]]) for i in range(rows_count): tmp = {} for j in elements_data: tmp[j] = elements_data[j][i] result.append(tmp) return result else: return "" ################################################ #### variables ################################# root_url = "https://admin.delphiplatform.io" prefixes = { 'etl_uow': 'etl_unit_of_work' } filters = { 'cs': { 'on-hold': 'flt1_4=ON_HOLD', 'failed': 'flt0_4=FAILED', 'report_date': 'flt1_7' }, 'etl_uow': { 'completeness_status': 'flt0_3=FAILED', 'report_date': 'flt1_9' } } # UoWs or the elements that we can ignore in result data excluded_elements = { "content_status": { "unit_of_work_code": ("appreciationengine",) } } ################################################ ####################################################################################################################### ################################################### MAIN ############################################################## ####################################################################################################################### def main(): def get_result(url, cookies): data = html_fetch(url, cookies) return html_parse(data) def print_message(data): message = '\n-----------------\n'.join(map(str, data)) print(message) cookies = {} days = 0 argList = create_arg_parser().parse_args() cookies['session'] = argList.cookies[0] if argList.days: days = argList.days[0] start_date = (datetime.now() - timedelta(days=days)).strftime("%Y-%m-%d") if argList.metricks[0] == 'cs_on-hold': if days > 0: url = f"{root_url}/?{filters['cs']['on-hold']}&{filters['cs']['report_date']}={start_date}" else: url = f"{root_url}/?{filters['cs']['on-hold']}" result_data = get_result(url, cookies) print_message(result_data) if argList.metricks[0] == 'cs_failed': if days > 0: url = f"{root_url}/?{filters['cs']['failed']}&{filters['cs']['report_date']}={start_date}" else: url = f"{root_url}/?{filters['cs']['failed']}" result_data = get_result(url, cookies) # remove ignored UoWs from result # result_data = [x for x in result_data if x['col-unit_of_work.unit_of_work_code'][0].split('-')[0] not in excluded_elements['content_status']['unit_of_work_code']] print_message(result_data) if argList.metricks[0] == 'etl_uow_failed': if days > 0: url = f"{root_url}/{prefixes['etl_uow']}?{filters['etl_uow']['completeness_status']}&{filters['etl_uow']['report_date']}={start_date}" else: url = f"{root_url}/{prefixes['etl_uow']}?{filters['etl_uow']['completeness_status']}" result_data = get_result(url, cookies) print_message(result_data) ############## RUN ########################### if __name__ == '__main__': main()