From 0bde21232b2a06f72c04b68185fd81f0c951498f Mon Sep 17 00:00:00 2001 From: "jaume.moral" Date: Wed, 17 Jul 2019 12:43:05 +0200 Subject: [PATCH 1/4] Canvis per donar suport a la nova API REST --- requirements.txt | 2 ++ settings_sample.py | 1 + soa/identitat.py | 56 +++++++++++++++++++++++++++++----------------- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/requirements.txt b/requirements.txt index d54e18b..9b71458 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,5 @@ mock>=1.3.0 suds discover freezegun +requests + diff --git a/settings_sample.py b/settings_sample.py index e9a9d81..115c549 100644 --- a/settings_sample.py +++ b/settings_sample.py @@ -15,6 +15,7 @@ "password_soa": "xxx", "username_gn6": "xxx", "password_gn6": "xxx", + "identitat_digital_apikey": "xxx", # Instància de GN6 on voleu crear els tiquets "domini": "999", diff --git a/soa/identitat.py b/soa/identitat.py index d9fc9b8..40c3f99 100755 --- a/soa/identitat.py +++ b/soa/identitat.py @@ -1,14 +1,23 @@ import settings import re -from soa.service import SOAService +import requests -class GestioIdentitat(SOAService): +class GestioIdentitat: def __init__(self): - self.url = "https://bus-soa.upc.edu/GestioIdentitat/Personesv6?wsdl" + self.url="https://identitatdigital.upc.edu/gcontrol/rest" + self.token=self.get_token() self.identitat_local = GestioIdentitatLocal() - SOAService.__init__(self) + + def get_token(self): + try: + resposta = requests.post(self.url+"/acls/processos", + data={'idProces':settings.get("identitat_digital_apikey")}) + token = resposta.json()['tokenAcl'] + return token + except: + return None def canonicalitzar_mail(self, mail): if mail is None: @@ -36,30 +45,35 @@ def obtenir_uid_remot(self, mail): # si la part esquerra del mail correspon a un usuari UPC real if "@upc.edu" in mail: cn = mail.split("@")[0] - dades_persona = self.client.service.obtenirDadesPersona( - commonName=cn) - if dades_persona.ok: - return cn + try: + cn = mail.split("@")[0] + persona=requests.get( + self.url+"/externs/persones/"+cn+"/cn", + headers={'TOKEN':self.token}).json() + return persona['commonName'] + except: + None # Si no hi ha correspondencia directa amb un usuari UPC # busquem a partir del mail qui pot ser - resultat = self.client.service.llistaPersones(email=mail) - if len(resultat.llistaPersones.persona) == 1: + cns = requests.get(self.url+"/externs/identitats/cn?email=" + mail, + headers={'TOKEN':self.token}).json() + if len(cns) == 1: # Quan tenim un resultat, es aquest - return resultat.llistaPersones.persona[0].cn + return cns[0] else: # Si tenim mes d'un, busquem el que te el mail que busquem # com a preferent o be retornem el primer - for persona in resultat.llistaPersones.persona: - dades_persona = self.client.service.obtenirDadesPersona( - commonName=persona.cn) - emailPreferent = getattr( - dades_persona, - 'emailPreferent', - None) - if (self.canonicalitzar_mail(emailPreferent) == mail): - return persona.cn - + for cn in cns: + try: + persona=requests.get( + self.url+"/externs/persones/"+cn+"/cn", + headers={'TOKEN':self.token}).json() + email_preferent=persona['emailPreferent'] + if (self.canonicalitzar_mail(email_preferent) == mail): + return persona['commonName'] + except: + None return None except Exception: return None From fcda5776273d94b9c05e5f6ae9877ca79104a8e4 Mon Sep 17 00:00:00 2001 From: Angel Aguilera Date: Fri, 19 Jul 2019 10:53:42 +0200 Subject: [PATCH 2/4] Canvis per resoldre warnings pycodestyle --- soa/identitat.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/soa/identitat.py b/soa/identitat.py index 40c3f99..687afda 100755 --- a/soa/identitat.py +++ b/soa/identitat.py @@ -6,17 +6,17 @@ class GestioIdentitat: def __init__(self): - self.url="https://identitatdigital.upc.edu/gcontrol/rest" - self.token=self.get_token() + self.url = "https://identitatdigital.upc.edu/gcontrol/rest" + self.token = self.get_token() self.identitat_local = GestioIdentitatLocal() def get_token(self): try: resposta = requests.post(self.url+"/acls/processos", - data={'idProces':settings.get("identitat_digital_apikey")}) + data={'idProces': settings.get("identitat_digital_apikey")}) token = resposta.json()['tokenAcl'] return token - except: + except Exception: return None def canonicalitzar_mail(self, mail): @@ -47,17 +47,17 @@ def obtenir_uid_remot(self, mail): cn = mail.split("@")[0] try: cn = mail.split("@")[0] - persona=requests.get( + persona = requests.get( self.url+"/externs/persones/"+cn+"/cn", - headers={'TOKEN':self.token}).json() + headers={'TOKEN': self.token}).json() return persona['commonName'] - except: + except Exception: None # Si no hi ha correspondencia directa amb un usuari UPC # busquem a partir del mail qui pot ser cns = requests.get(self.url+"/externs/identitats/cn?email=" + mail, - headers={'TOKEN':self.token}).json() + headers={'TOKEN': self.token}).json() if len(cns) == 1: # Quan tenim un resultat, es aquest return cns[0] @@ -66,13 +66,13 @@ def obtenir_uid_remot(self, mail): # com a preferent o be retornem el primer for cn in cns: try: - persona=requests.get( + persona = requests.get( self.url+"/externs/persones/"+cn+"/cn", - headers={'TOKEN':self.token}).json() - email_preferent=persona['emailPreferent'] + headers={'TOKEN': self.token}).json() + email_preferent = persona['emailPreferent'] if (self.canonicalitzar_mail(email_preferent) == mail): return persona['commonName'] - except: + except Exception: None return None except Exception: From 6f28faf3f8e6e7445210f1af670ae81c88dd85ad Mon Sep 17 00:00:00 2001 From: Angel Aguilera Date: Fri, 19 Jul 2019 11:03:04 +0200 Subject: [PATCH 3/4] Reindenta argument per resoldre warning de pycodestyle --- soa/identitat.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/soa/identitat.py b/soa/identitat.py index 687afda..08045c3 100755 --- a/soa/identitat.py +++ b/soa/identitat.py @@ -12,7 +12,8 @@ def __init__(self): def get_token(self): try: - resposta = requests.post(self.url+"/acls/processos", + resposta = requests.post( + self.url+"/acls/processos", data={'idProces': settings.get("identitat_digital_apikey")}) token = resposta.json()['tokenAcl'] return token From 54b13d4c77fcecdac526e044503cbec3d23bc388 Mon Sep 17 00:00:00 2001 From: "jordi.guillem.fragoso" Date: Wed, 20 Nov 2019 12:09:12 +0100 Subject: [PATCH 4/4] =?UTF-8?q?Dockeritzaci=C3=B3.=20Afegeix=20els=20fitxe?= =?UTF-8?q?rs=20dockerfile,=20.fetchmail=20i=20entrypoint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .fetchmailrc | 9 +++++++++ README.md | 28 ++++++++++++++++++++++++++++ dockerfile | 20 ++++++++++++++++++++ entrypoint.sh | 10 ++++++++++ 4 files changed, 67 insertions(+) create mode 100644 .fetchmailrc create mode 100644 dockerfile create mode 100644 entrypoint.sh diff --git a/.fetchmailrc b/.fetchmailrc new file mode 100644 index 0000000..0bc1320 --- /dev/null +++ b/.fetchmailrc @@ -0,0 +1,9 @@ +set logfile "/tmp/fetchmail.log" +poll imap.upc.edu protocol imap: + +username "suport.unitat" +password "contrasenya" +folder "mailtoticket" +mda "/bin/sh -c 'cat | /usr/local/bin/python /mailtoticket/mailtoticket.py'" +ssl +nokeep diff --git a/README.md b/README.md index f56ef82..36ad21f 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,34 @@ El comportament del programa és executar una sèrie de filtres sobre el correu * **Nou Extern** * Crea tiquets per adreces desconegudes amb un usuari predeterminat per configuració. * És una extensió del filtre **Nou**. + + + +Dockerització del MailToTicket +------------------------------ +Dockerfile per la generació d'una imatge amb els components necessaris per el funcionament del Mailtoticket. +S'ha intentat que el contenidor resultant no demani cap configuració post "run" +Les proves de funcionament s'han fet amb la branca amb suport a l'APP rest d'identitat. No s'han provat altres versions. +Un cop aquesta branca es passi a master, s'haurà de modificar l'entrada del dockerfile corresponent. + +L'imatge resultatnt inclou: + python packages + fetchmail + cron + +Procediments del dockerfile +--------------------------- +1- Copiar a la mateixa carpeta del dockerfile els fitxers: + settings_default.py - El fitxer de configuració del mailtoticket. Ha de tenir aquest nom + entrypoint.sh - Conté la configuració del crontab + .fetchmailrc - Configuració del fetchmail per a "descarregar" els mails de la carpeta mailtoticket del correu de suport + +2- Modificar aquests arxius per afegir la informació necessària per la instància + +3- En la mateixa carpeta del dockerfile, executar: + + docker build . -t mailtoticket + Llicència --------- diff --git a/dockerfile b/dockerfile new file mode 100644 index 0000000..01a33f0 --- /dev/null +++ b/dockerfile @@ -0,0 +1,20 @@ +FROM python:2.7 +RUN git clone --single-branch --branch feature_api_rest_identitat https://github.com/UPC/mailtoticket.git + +WORKDIR /mailtoticket + +COPY settings_default.py . +COPY entrypoint.sh . +COPY .fetchmailrc /root/ + +RUN apt-get update +RUN apt-get upgrade -y +RUN apt-get install -y fetchmail +RUN apt-get install -y cron +RUN pip install --no-cache-dir -r requirements.txt + +RUN chmod 755 entrypoint.sh +RUN chmod 600 /root/.fetchmailrc + + +ENTRYPOINT /mailtoticket/entrypoint.sh \ No newline at end of file diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..aa53f07 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,10 @@ +#!/bin/bash +echo "Mailtoticket has been started" + +# Setup a cron schedule +echo "MAILTO=mailtoticket@unitat.upc.edu +*/5 * * * * /usr/bin/fetchmail --silent +# This extra line makes it a valid cron" > scheduler.txt + +crontab scheduler.txt +cron -f \ No newline at end of file