Skip to content
Snippets Groups Projects
Commit d958a2af authored by Marco Malavolti's avatar Marco Malavolti
Browse files

Enriched API and fixed eccs2 selenium

parent 0171f5bd
No related branches found
No related tags found
No related merge requests found
# HOWTO Install and Configure ECCS-2 # HOWTO Install and Configure ECCS-2
* `sudo apt install mysql-server python3-pip` * `sudo apt install python3-pip chromium chromium-l10n git`
* `pip3 install mysql-connector certifi selenium urllib3` * `pip3 install certifi selenium urllib3 flask flask-jsonpify flask-restful`
* `cd /opt ; git clone https://github.com/malavolti/eccs2.git`
* `cd /opt/eccs2 ; ./eccs2.py`
# Create and configure the ECCS-2 database # Create and configure the ECCS-2 database (not used now)
* `sudo mysql` * `sudo mysql`
* `CREATE DATABASE eccs2db;` * `CREATE DATABASE eccs2db;`
* `CREATE USER 'eccs2user'@'localhost' IDENTIFIED BY '<password>';` * `CREATE USER 'eccs2user'@'localhost' IDENTIFIED BY '<password>';`
...@@ -11,3 +13,20 @@ ...@@ -11,3 +13,20 @@
* `SHOW GRANTS FOR 'eccs2user'@'localhost';` * `SHOW GRANTS FOR 'eccs2user'@'localhost';`
* `FLUSH PRIVILEGES;` * `FLUSH PRIVILEGES;`
# API
* `/eccs/test` (Trivial Test)
* `/eccs/checks` (Should return the results of the last checks)
* `/eccs/checks?<parameter>=<value>`:
* `date=2020-02-20` (select date)
* `idp=Any%20words%20do%20you%20like%20url%20encoded`
* `status=`
* 'OK'
* 'TIMEOUT'
* 'No-eduGAIN-Metadata'
* 'Form-Invalid'
* 'Excluded'
# API Development Server
* `cd /opt/eccs2 ; ./api.py`
...@@ -2,11 +2,12 @@ ...@@ -2,11 +2,12 @@
from flask import Flask, request from flask import Flask, request
from flask_restful import Resource, Api from flask_restful import Resource, Api
from json import dumps from json import dumps, loads
from flask import jsonify from flask import jsonify
from pathlib import PurePath from pathlib import PurePath
import logging import logging
from logging.handlers import RotatingFileHandler from logging.handlers import RotatingFileHandler
import re
app = Flask(__name__) app = Flask(__name__)
api = Api(app) api = Api(app)
...@@ -43,56 +44,81 @@ class Test(Resource): ...@@ -43,56 +44,81 @@ class Test(Resource):
app.logger.info("Test Superato!") app.logger.info("Test Superato!")
return {'test':'It Works!'} return {'test':'It Works!'}
class AllChecks(Resource): class Checks(Resource):
def get(self): def get(self):
app.logger.info("Richiesta 'AllChecks'") app.logger.info("Richiesta 'Checks'")
file_path = "logs/eccs2checks_2020-02-19.log" file_path = "logs/eccs2checks_2020-02-19.log"
fo = open(file_path, "r")
result = []
date = PurePath(file_path).parts[-1].split('_')[1].split('.')[0] date = PurePath(file_path).parts[-1].split('_')[1].split('.')[0]
lines = fo.readlines() pretty = 0
status = None
idp = None
if 'date' in request.args:
app.logger.info("Parametro 'date' inserito")
file_path = "logs/eccs2checks_"+request.args['date']+".log"
date = request.args['date']
if 'pretty' in request.args:
app.logger.info("Parametro 'pretty' inserito")
pretty = request.args['pretty']
if 'status' in request.args:
app.logger.info("Parametro 'status' inserito")
status = request.args['status']
if 'idp' in request.args:
app.logger.info("Parametro 'idp' inserito")
idp = request.args['idp']
app.logger.info(idp)
for line in lines:
check = line.split(";")
idp = check[0]
sp = check[1]
check_result = check[2]
result.append( { 'sp' : sp,
'idp' : idp,
'check_result' : check_result.rstrip("\n\r"),
'date': date
} )
return jsonify(result)
class ChecksByStatus(Resource):
def get(self,status):
file_path = "logs/eccs2checks_2020-02-19.log"
fo = open(file_path, "r") fo = open(file_path, "r")
result = [] result = []
date = PurePath(file_path).parts[-1].split('_')[1].split('.')[0]
lines = fo.readlines() lines = fo.readlines()
for line in lines: for line in lines:
check_status = line.split(';')[2].rstrip("\n\r") check = line.split(";")
if (status == check_status):
check = line.split(";") check_idp = check[0]
idp = check[0] check_sp = check[1]
sp = check[1] check_status = check[2].rstrip("\n\r")
check_result = check[2]
result.append( { 'sp' : sp, if (idp and status):
'idp' : idp, if (idp == check_idp and status == check_status):
'check_result' : check_result.rstrip("\n\r"), result.append( { 'sp' : check_sp,
'idp' : check_idp,
'status' : check_status,
'date': date
} )
elif (idp):
#app.logger.info(re.search(".*."+idp+".*.", check_idp, re.IGNORECASE))
#app.logger.info(check_idp))
if (re.search(".*."+idp+".*.", check_idp, re.IGNORECASE)):
result.append( { 'sp' : check_sp,
'idp' : check_idp,
'status' : check_status,
'date': date
} )
elif (status):
if (status == check_status):
result.append( { 'sp' : check_sp,
'idp' : check_idp,
'status' : check_status,
'date': date
} )
else:
result.append( { 'sp' : check_sp,
'idp' : check_idp,
'status' : check_status,
'date': date 'date': date
} ) } )
return jsonify(result) if (pretty):
pp_json = dumps(result, indent=4, sort_keys=True)
return jsonify(pp_json)
else:
return jsonify(result)
api.add_resource(Test, '/eccs/test') # Route_1 api.add_resource(Test, '/eccs/test') # Route_1
api.add_resource(AllChecks, '/eccs/checks/all') # Route_2 api.add_resource(Checks, '/eccs/checks') # Route_2
api.add_resource(ChecksByStatus, '/eccs/checks/<status>') # Route_3
if __name__ == '__main__': if __name__ == '__main__':
......
...@@ -43,15 +43,17 @@ def getIdPs(): ...@@ -43,15 +43,17 @@ def getIdPs():
idp_list = [] idp_list = []
for idp in idp_dict: for idp in idp_dict:
idp_list.append(idp['entityID']) idp_list.append(idp['displayname'].split(';')[1].split('==')[0])
return idp_list return idp_list
def checkIdP(driver,sp,idp,logger): def checkIdP(sp,idp,logger):
import re import re
# Apro la URL contenente il Discovery Service, inserisco l'idp e vado alla pagina di login driver = setup()
# Open SP, select the IDP from the EDS and press 'Enter' to reach the IdP login page to check
try: try:
driver.get(sp) driver.get(sp)
driver.find_element_by_id("idpSelectInput").send_keys(idp + Keys.ENTER) driver.find_element_by_id("idpSelectInput").send_keys(idp + Keys.ENTER)
...@@ -63,6 +65,7 @@ def checkIdP(driver,sp,idp,logger): ...@@ -63,6 +65,7 @@ def checkIdP(driver,sp,idp,logger):
pass pass
except TimeoutException as e: except TimeoutException as e:
logger.info("%s;%s;TIMEOUT" % (idp,sp)) logger.info("%s;%s;TIMEOUT" % (idp,sp))
driver.close()
return "TIMEOUT" return "TIMEOUT"
pattern_metadata = "Unable.to.locate(\sissuer.in|).metadata(\sfor|)|no.metadata.found|profile.is.not.configured.for.relying.party|Cannot.locate.entity|fail.to.load.unknown.provider|does.not.recognise.the.service|unable.to.load.provider|Nous.n'avons.pas.pu.(charg|charger).le.fournisseur.de service|Metadata.not.found|application.you.have.accessed.is.not.registered.for.use.with.this.service|Message.did.not.meet.security.requirements" pattern_metadata = "Unable.to.locate(\sissuer.in|).metadata(\sfor|)|no.metadata.found|profile.is.not.configured.for.relying.party|Cannot.locate.entity|fail.to.load.unknown.provider|does.not.recognise.the.service|unable.to.load.provider|Nous.n'avons.pas.pu.(charg|charger).le.fournisseur.de service|Metadata.not.found|application.you.have.accessed.is.not.registered.for.use.with.this.service|Message.did.not.meet.security.requirements"
...@@ -76,29 +79,34 @@ def checkIdP(driver,sp,idp,logger): ...@@ -76,29 +79,34 @@ def checkIdP(driver,sp,idp,logger):
if(metadata_not_found): if(metadata_not_found):
logger.info("%s;%s;No-eduGAIN-Metadata" % (idp,sp)) logger.info("%s;%s;No-eduGAIN-Metadata" % (idp,sp))
driver.close()
return "No-eduGAIN-Metadata" return "No-eduGAIN-Metadata"
elif not username_found and not password_found: elif not username_found and not password_found:
logger.info("%s;%s;Invalid-Form" % (idp,sp)) logger.info("%s;%s;Invalid-Form" % (idp,sp))
driver.close()
return "Invalid Form" return "Invalid Form"
else: else:
logger.info("%s;%s;OK" % (idp,sp)) logger.info("%s;%s;OK" % (idp,sp))
driver.close()
return "OK" return "OK"
# Setup Chromium Webdriver
def setup(): def setup():
chrome_options = webdriver.ChromeOptions() chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless') chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--no-sandbox')
driver = webdriver.Chrome('chromedriver', chrome_options=chrome_options, service_args=['--verbose', '--log-path=./selenium_chromedriver.log']) # driver = webdriver.Chrome('chromedriver', chrome_options=chrome_options, service_args=['--verbose', '--log-path=./selenium_chromedriver.log'])
driver = webdriver.Chrome('chromedriver', chrome_options=chrome_options)
# Configuro i timeout # Configure timeouts
driver.set_page_load_timeout(45) driver.set_page_load_timeout(45)
driver.set_script_timeout(45) driver.set_script_timeout(45)
return driver return driver
# Use logger to produce files consumed by ECCS-2 # Use logger to produce files consumed by ECCS-2 API
def getLogger(filename,log_level="DEBUG",path="./"): def getLogger(filename,log_level="DEBUG",path="./"):
logger = logging.getLogger(filename) logger = logging.getLogger(filename)
...@@ -126,35 +134,37 @@ def getLogger(filename,log_level="DEBUG",path="./"): ...@@ -126,35 +134,37 @@ def getLogger(filename,log_level="DEBUG",path="./"):
return logger return logger
# MAIN
if __name__=="__main__": if __name__=="__main__":
eccs2log = getLogger("logs/eccs2_"+date.today().isoformat()+".log","INFO") eccs2log = getLogger("logs/eccs2_"+date.today().isoformat()+".log","INFO")
eccs2checksLog = getLogger("logs/eccs2checks_"+date.today().isoformat()+".log","INFO") eccs2checksLog = getLogger("logs/eccs2checks_"+date.today().isoformat()+".log","INFO")
driver = setup()
sps = ["https://sp24-test.garr.it/secure", "https://attribute-viewer.aai.switch.ch/eds/"] sps = ["https://sp24-test.garr.it/secure", "https://attribute-viewer.aai.switch.ch/eds/"]
listIdPs = [ # listIdPsTest = [
'https://garr-idp-prod.irccs.garr.it', # 'University of Utah',
'https://idp.hec.gov.pk/idp/shibboleth', # 'Nanjing Agriculture University',
'https://login.itsak.gr/idp/shibboleth', # 'Fujian Normal University',
'https://idp.eastdurham.ac.uk/openathens', # 'SUIBE',
'https://idp-lib.nwafu.edu.cn/idp/shibboleth', # 'Zuyd Hogeschool',
] # 'Sur University College',
# 'https://idp.hec.gov.pk/idp/shibboleth',
#listIdPs = getIdPs() # 'https://login.itsak.gr/idp/shibboleth',
# 'https://idp.eastdurham.ac.uk/openathens',
# 'https://idp-lib.nwafu.edu.cn/idp/shibboleth',
# ]
listIdPs = getIdPs()
for idp in listIdPs: for idp in listIdPs:
result = [] result = []
for sp in sps: for sp in sps:
result.append(checkIdP(driver,sp,idp,eccs2checksLog)) result.append(checkIdP(sp,idp,eccs2checksLog))
# se tutti e 2 i check sono andati bene, allora l'IdP è OK, altrimenti no. # If all checks are 'OK', than the IdP consuming correctly eduGAIN Metadata.
if (result[0] == result[1] == "OK"): if (result[0] == result[1] == "OK"):
eccs2log.info("IdP '%s' results into: OK" % (idp)) eccs2log.info("IdP '%s' results into: OK" % (idp))
else: else:
eccs2log.info("IdP '%s' results into: NOT OK" % (idp)) eccs2log.info("IdP '%s' results into: NOT OK" % (idp))
driver.close()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment