diff --git a/api.py b/api.py index 04405ce850d58e5ff0aeb4194c653df6f1e0776e..733add2dca30cf137063e322b59a25044622159a 100755 --- a/api.py +++ b/api.py @@ -1,15 +1,13 @@ #!/usr/bin/env python3.8 +import json import logging import re from eccs2properties import DAY,ECCS2LOGSDIR,ECCS2OUTPUTDIR from flask import Flask, request, jsonify from flask_restful import Resource, Api -from json import dumps, loads -from logging.handlers import RotatingFileHandler -from pathlib import PurePath -from utils import getLogger, getDriver +from utils import getLogger app = Flask(__name__) api = Api(app) @@ -21,92 +19,6 @@ class Test(Resource): app.logger.info("Test Passed!") return {'test':'It Works!'} - -class Checks(Resource): - def get(self): - app.logger.info("Request 'Checks'") - - file_path = "%s/eccs2checks_%s.log" % (ECCS2OUTPUTDIR,DAY) - date = PurePath(file_path).parts[-1].split('_')[1].split('.')[0] - pretty = 0 - status = None - idp = None - - if 'date' in request.args: - app.logger.info("'date' parameter inserted") - date = request.args['date'] - file_path = "%s/eccs2checks_%s.log" % (ECCS2OUTPUTDIR,date) - if 'pretty' in request.args: - app.logger.info("'pretty' parameter inserted") - pretty = request.args['pretty'] - if 'status' in request.args: - app.logger.info("'status' parameter inserted") - status = request.args['status'] - if 'idp' in request.args: - app.logger.info("'idp' parameter inserted") - idp = request.args['idp'] - app.logger.info(idp) - - fo = open(file_path,"r",encoding="utf-8") - result = [] - lines = fo.readlines() - - for line in lines: - check = line.split(";") - - check_idp = check[0] - check_sp = check[1] - status_code = check[2] - check_time = check[3] - check_status = check[4].rstrip("\n\r") - - if (idp and status): - app.logger.info("Search for 'idp':'%s' and 'status':'%s'." % (idp,status)) - if (idp == check_idp and status == check_status): - result.append( { 'sp' : check_sp, - 'idp' : check_idp, - 'check_time': check_time, - 'status_code': status_code, - 'status' : check_status, - 'date': date - } ) - elif (idp): - app.logger.info("Search for 'idp':'%s'" % idp) - if (re.search(".*."+idp+".*.", check_idp, re.IGNORECASE)): - result.append( { 'sp' : check_sp, - 'idp' : check_idp, - 'check_time': check_time, - 'status_code': status_code, - 'status' : check_status, - 'date': date - } ) - elif (status): - app.logger.info("Search for 'status':'%s'." % status) - if (status == check_status): - result.append( { 'sp' : check_sp, - 'idp' : check_idp, - 'check_time': check_time, - 'status_code': status_code, - 'status' : check_status, - 'date': date - } ) - else: - app.logger.info("All checks.") - result.append( { 'sp' : check_sp, - 'idp' : check_idp, - 'check_time': check_time, - 'status_code': status_code, - 'status' : check_status, - 'date': date - } ) - - if (pretty): - pp_json = dumps(result, indent=4, sort_keys=True) - return jsonify(pp_json) - else: - return jsonify(result) - - # Build Email Addresses Link for ECCS2 Web Gui def buildEmailAddress(listContacts): listCtcs = listContacts.split(",") @@ -122,7 +34,7 @@ class EccsResults(Resource): app.logger.info("Request 'EccsResults'") file_path = "%s/eccs2_%s.log" % (ECCS2OUTPUTDIR,DAY) - date = PurePath(file_path).parts[-1].split('_')[1].split('.')[0] + date = DAY pretty = 0 status = None idp = None @@ -147,162 +59,38 @@ class EccsResults(Resource): lines = fo.readlines() for line in lines: - # Line: - # IdP-DisplayName; check[0] - # IdP-entityID; check[1] - # IdP-RegAuth; check[2] - # IdP-tech-ctc-1,IdP-tech-ctc-2; check[3] - # IdP-supp-ctc-1,IdP-supp-ctc-2; check[4] - # ECCS Status; check[5] - # SP-wayfless-url-1; check[6] - # SP-check-time-1; check[7] - # SP-status-code-1; check[8] - # SP-status-1; check[9] - # SP-wayfless-url-2; check[10] - # SP-check-time-2; check[11] - # SP-status-code-2 check[12] - # SP-status-2 check[13] - check = line.split(";") + # Remove Carriage Return chars + line.rstrip("\n\r") - idp_displayname = check[0] - idp_entity_id = check[1] - idp_reg_auth = check[2] - idp_tech_ctcs = check[3] - idp_supp_ctcs = check[4] - idp_eccs_status = check[5] - sp1_wayfless_url = check[6] - sp1_check_time = check[7] - sp1_status_code = check[8] - sp1_check_status = check[9] - sp2_wayfless_url = check[10] - sp2_check_time = check[11] - sp2_status_code = check[12] - sp2_check_status = check[13].rstrip("\n\r") + # Loads json into aux + aux = json.loads(line) + + aux['date'] = date + aux['contacts']['technical'] = buildEmailAddress(aux['contacts']['technical']) + aux['contacts']['support'] = buildEmailAddress(aux['contacts']['support']) if (idp and status): app.logger.info("eccsresults: check for 'idp':'%s' with 'status':'%s'" % (idp, status)) - if (idp == idp_entity_id and status == idp_eccs_status): - result.append( - { - 'displayName' : idp_displayname, - 'entityID' : idp_entity_id, - 'registrationAuthority' : idp_reg_auth, - 'contacts' : { - 'technical' : buildEmailAddress(idp_tech_ctcs), - 'support' : buildEmailAddress(idp_supp_ctcs), - }, - 'date' : date, - 'sp1' : { - 'wayfless_url' : sp1_wayfless_url, - 'checkTime' : sp1_check_time, - 'statusCode' : sp1_status_code, - 'status' : sp1_check_status - }, - 'sp2' : { - 'wayflessUrl' : sp2_wayfless_url, - 'checkTime' : sp2_check_time, - 'statusCode' : sp2_status_code, - 'status' : sp2_check_status - }, - 'status' : idp_eccs_status - } ) + if (idp == aux['entityID'] and status == aux['status']): + result.append( aux ) elif (idp): - #app.logger.info(re.search(".*."+idp+".*.", idp_entity_id, re.IGNORECASE)) - #app.logger.info(idp_entity_id)) app.logger.info("eccsresults: results for IdP:'%s'." % idp) - if (re.search(".*."+idp+".*.", idp_entity_id, re.IGNORECASE)): - result.append( - { - 'displayName' : idp_displayname, - 'entityID' : idp_entity_id, - 'registrationAuthority' : idp_reg_auth, - 'contacts' : { - 'technical' : buildEmailAddress(idp_tech_ctcs), - 'support' : buildEmailAddress(idp_supp_ctcs), - }, - 'date' : date, - 'sp1' : { - 'wayflessUrl' : sp1_wayfless_url, - 'checkTime' : sp1_check_time, - 'statusCode' : sp1_status_code, - 'status' : sp1_check_status - }, - 'sp2' : { - 'wayflessUrl' : sp2_wayfless_url, - 'checkTime' : sp2_check_time, - 'statusCode' : sp2_status_code, - 'status' : sp2_check_status - }, - 'status' : idp_eccs_status - } ) + if (re.search(".*."+idp+".*.", aux['entityID'], re.IGNORECASE)): + result.append( aux ) elif (status): - app.logger.info("eccsresults: Search for 'status':'%s'." % status) - if (status == idp_eccs_status): - result.append( - { - 'displayName' : idp_displayname, - 'entityID' : idp_entity_id, - 'registrationAuthority' : idp_reg_auth, - 'contacts' : { - 'technical' : buildEmailAddress(idp_tech_ctcs), - 'support' : buildEmailAddress(idp_supp_ctcs), - }, - 'date' : date, - 'sp1' : { - 'wayflessUrl' : sp1_wayfless_url, - 'checkTime' : sp1_check_time, - 'statusCode' : sp1_status_code, - 'status' : sp1_check_status - }, - 'sp2' : { - 'wayflessUrl' : sp2_wayfless_url, - 'checkTime' : sp2_check_time, - 'statusCode' : sp2_status_code, - 'status' : sp2_check_status - }, - 'status' : idp_eccs_status - } ) + if (status == aux['status']): + result.append( aux ) else: - result.append( - { - 'displayName' : idp_displayname, - 'entityID' : idp_entity_id, - 'registrationAuthority' : idp_reg_auth, - 'contacts' : { - 'technical' : buildEmailAddress(idp_tech_ctcs), - 'support' : buildEmailAddress(idp_supp_ctcs), - }, - 'date' : date, - 'sp1' : { - 'wayflessUrl' : sp1_wayfless_url, - 'checkTime' : sp1_check_time, - 'statusCode' : sp1_status_code, - 'status' : sp1_check_status - }, - 'sp2' : { - 'wayflessUrl' : sp2_wayfless_url, - 'checkTime' : sp2_check_time, - 'statusCode' : sp2_status_code, - 'status' : sp2_check_status - }, - 'status' : idp_eccs_status - } ) + result.append(aux) if (pretty): - pp_json = dumps(result, indent=4, sort_keys=True) + pp_json = json.dumps(result, indent=4, sort_keys=True) return jsonify(pp_json) else: return jsonify(result) -# Run check for a specific IDP -# <idpdisc:DiscoveryResponse Location>?entityID=<IDP_ENITIYID>&target=<DESTINATION_RESOURCE_URL> (tutto url encoded) -#class RunCheck(Resource): -# def get(self): - api.add_resource(Test, '/eccs/test') # Route_1 -api.add_resource(Checks, '/eccs/checks') # Route_2 -api.add_resource(EccsResults, '/eccs/eccsresults') # Route_3 -#api.add_resource(RunCheck, '/eccs/runcheck') # Route_4 +api.add_resource(EccsResults, '/eccs/eccsresults') # Route_2 if __name__ == '__main__': diff --git a/eccs2.py b/eccs2.py index ca974b897700282e88eaa3cf6d0c1e921ee094fc..ad79537f348073f17188a6f96a4599447203cf7d 100755 --- a/eccs2.py +++ b/eccs2.py @@ -6,7 +6,7 @@ import json import re import requests -from eccs2properties import DAY, ECCS2HTMLDIR, ECCS2OUTPUTDIR, ECCS2RESULTSLOG, ECCS2CHECKSLOG, FEDS_BLACKLIST, IDPS_BLACKLIST, ECCS2SPS, ECCS2SELENIUMDEBUG +from eccs2properties import DAY, ECCS2HTMLDIR, ECCS2OUTPUTDIR, ECCS2RESULTSLOG, FEDS_BLACKLIST, IDPS_BLACKLIST, ECCS2SPS, ECCS2SELENIUMDEBUG from pathlib import Path from selenium.common.exceptions import TimeoutException from urllib3.util import parse_url @@ -181,7 +181,7 @@ def storeECCS2result(idp,check_results,idp_status,test): if (test is not True): # IdP-DisplayName;IdP-entityID;IdP-RegAuth;IdP-tech-ctc-1,IdP-tech-ctc-2;IdP-supp-ctc-1,IdP-supp-ctc-2;IdP-ECCS-Status;SP-wayfless-url-1;SP-check-time-1;SP-status-code-1;SP-result-1;SP-wayfless-url-2;SP-check-time-2;SP-status-code-2;SP-result-2 with open("%s/%s" % (ECCS2OUTPUTDIR,ECCS2RESULTSLOG), 'a') as f: - f.write("%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s\n" % ( + f.write('{"displayName":"%s","entityID":"%s","registrationAuthority":"%s","contacts":{"technical":"%s","support":"%s"},"status":"%s","sp1":{"wayflessUrl":"%s","checkTime":"%s","statusCode":"%s","status":"%s"},"sp2":{"wayflessUrl":"%s","checkTime":"%s","statusCode":"%s","status":"%s"}}\n' % ( getDisplayName(idp['displayname']), # IdP-DisplayName idp['entityID'], # IdP-entityID idp['registrationAuthority'], # IdP-RegAuth @@ -198,7 +198,7 @@ def storeECCS2result(idp,check_results,idp_status,test): check_results[1][4])) # SP-result-2 else: print("\nECCS2:") - print("%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s\n" % ( + print('{"displayName":"%s","entityID":"%s","registrationAuthority":"%s","contacts":{"technical":"%s","support":"%s"},"status":"%s","sp1":{"wayflessUrl":"%s","checkTime":"%s","statusCode":"%s","status":"%s"},"sp2":{"wayflessUrl":"%s","checkTime":"%s","statusCode":"%s","status":"%s"}}\n' % ( getDisplayName(idp['displayname']), # IdP-DisplayName idp['entityID'], # IdP-entityID idp['registrationAuthority'], # IdP-RegAuth @@ -224,21 +224,14 @@ def check(idp,sps,test): check_results.append(result) if len(check_results) == 2: - if (test is not True): - with open("%s/%s" % (ECCS2OUTPUTDIR,ECCS2CHECKSLOG), 'a') as f: - for elem in check_results: - f.write(";".join(elem)) - f.write("\n") - else: - print("\nECCS2CHECKS:") - for elem in check_results: - print(";".join(elem)) + check_result_sp1 = check_results[0][4] + check_result_sp2 = check_results[1][4] # If all checks are 'OK', than the IdP consuming correctly eduGAIN Metadata. - if (check_results[0][4] == check_results[1][4] == "OK"): + if (check_result_sp1 == check_result_sp2 == "OK"): storeECCS2result(idp,check_results,'OK',test) - elif (check_results[0][4] == check_results[1][4] == "DISABLED"): + elif (check_result_sp1 == check_result_sp2 == "DISABLED"): storeECCS2result(idp,check_results,'DISABLED',test) else: diff --git a/eccs2properties.py b/eccs2properties.py index c4c9c9446b890148764bf3b11aeb86c4d9a25557..33312c2237cbd0f9c78c53de19fb8f9afd47d316 100644 --- a/eccs2properties.py +++ b/eccs2properties.py @@ -16,7 +16,6 @@ ECCS2LISTFEDSFILE = "%s/list_fed.json" % ECCS2INPUTDIR # Output ECCS2OUTPUTDIR = "%s/output" % ECCS2DIR ECCS2RESULTSLOG = "eccs2_%s.log" % DAY -ECCS2CHECKSLOG = "eccs2checks_%s.log" % DAY ECCS2HTMLDIR = "%s/html" % ECCS2DIR # Selenium