]> git.llucax.com Git - software/sercom-old.git/commitdiff
Manda mails notificando si compila bien.
authorLeandro Lucarella <llucax@gmail.com>
Sun, 27 Feb 2005 23:38:24 +0000 (23:38 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Sun, 27 Feb 2005 23:38:24 +0000 (23:38 +0000)
doc/examples/sercom.ini
src/sc_fetch
src/sc_test
test/clean.sh
test/data/ejercicios/1/Makefile
test/sercom.ini

index 7d190ee3c6bfac32c8c99a163f6cf23f75a0f0a7..781b1b1182dee7feef70a3c59b1dd84b4e2e604f 100644 (file)
@@ -27,6 +27,10 @@ from = TALLER DE PROGRAMACION I <7542@fi.uba.ar>
 ; Mailbox local en donde hacer backup de los mails entregados
 ; (si está vacío no se hace backup)
 mbox_bak = /var/lib/sercom/entregas.mbox
+; Prefijo a agregarle al subject de los mails enviados.
+prefijo = 75.42
+; Servidor SMTP por el cual enviar los mails.
+smtp = localhost
 
 ; pop
 ;server = pop.example.com
index 3455028ed238077d8aefbf7ab92858e149f9abe4..528b1dbb553ce8919a96dbfd33480e0b12705c00 100755 (executable)
@@ -158,7 +158,7 @@ imap_close($mbox);
 
 function enviar_respuesta($tipo, $to, $mensaje = '', $intento = null) {
     global $mconf;
-    $subject = '[' . strtoupper($NAME) . '] Entrega ';
+    $subject = $mconf['prefijo'] . 'Entrega ';
     if ($tipo == R_OK) $estado = 'ACEPTADA';
     else               $estado = 'RECHAZADA';
     $subject .= $estado;
@@ -169,6 +169,7 @@ function enviar_respuesta($tipo, $to, $mensaje = '', $intento = null) {
     $headers = <<<EOT
 From: {$mconf['from']}
 Reply-To: {$mconf['admin']}
+Return-Path: {$mconf['admin']}
 X-Mailer: $NAME $VERSION
 X-Priority: 5
 EOT;
index a1a4a06e8a223f4b59df5692ceff3253b0914d70..2e4be200312e48e41f49a5e65c85316bbcee8fa8 100755 (executable)
@@ -11,6 +11,7 @@ import glob
 import shutil
 import datetime
 import subprocess
+import email.MIMEMultipart
 # Módulos locales
 import sercom
 import sercom.sqlo
@@ -56,30 +57,41 @@ def sigterm(signum, frame):
 def chroot_dir(intento):
     return os.path.join(intento.path, 'chroot')
 
-def compilar(intento):
+def compilar(intento, mail):
     global log
     # Busco makefile
     makefile = os.path.join(intento.entrega.ejercicio.path, 'Makefile')
     # Compilo
     log.debug('Ejecutando: make -f %s', makefile)
     intento.inicioCompila = datetime.datetime.now()
-    make = subprocess.Popen(('make', '-f', makefile), stdout=subprocess.PIPE,
-        stderr=subprocess.PIPE, cwd=intento.path)
+    make = subprocess.Popen(('make', '-f', makefile), stderr=subprocess.PIPE,
+        cwd=intento.path)
     make.wait()
     intento.finCompila = datetime.datetime.now()
     log.debug('Fin del comando: make -f %s', makefile)
     # Verifico compilación
-    if make.returncode:
-        log.debug('Error al compilar, código de retorno: %d, salida estándar: '
-            '%s, salida de error: %s)', make.returncode, make.stdout.read(),
-            make.stderr.read())
-        intento.compila = False
-        #TODO enviar_respuesta(R_ERR, $mail, "ERROR AL COMPILAR!\n\n$err\n\nCódigo de retorno: $ret\n", $intento);
-        return False
-    log.debug('Compilado OK')
-    intento.compila = True
-    #TODO mail acumulativo
-    return True
+    stderr = make.stderr.read()
+    intento.compila = not make.returncode
+    msg = 'Compilación: '
+    if intento.compila and not stderr:
+        msg += 'BIEN'
+    elif intento.compila:
+        msg += 'CON ADVERTENCIAS'
+    else:
+        msg += 'ERROR (código de retorno: %d)' % make.returncode
+    mail.body += msg
+    if stderr:
+        msg += '''Salida:
+------------------------------------------------------------------------
+%s
+------------------------------------------------------------------------
+
+''' % stderr
+        mail.body += "\n(se adjunta salida, archivo 'make.stderr')\n"
+        mail.attachText(stderr, 'make.stderr')
+    mail.body += '\n\n'
+    intento.observaciones = msg + '\n\n'
+    log.debug(msg)
 
 def preparar(intento):
     # Creo chroot - TODO copiarlo de algún lado donde ande el valgrind?
@@ -91,7 +103,7 @@ def limpiar(intento):
     # Borro chroot entero
     shutil.rmtree(chroot_dir(intento))
 
-def probar(intento, caso_de_prueba):
+def probar(intento, caso_de_prueba, mail):
     # Cosas útiles
     global log, conn, conf, uid, gid
     # Para manejo de SIGCHLD
@@ -250,6 +262,48 @@ def params2seq(params):
         seq.append(buff)
     return seq
 
+class MailIntento(email.MIMEMultipart.MIMEMultipart, object):
+    def __init__(self, intento):
+        global conf
+        from email.MIMEMultipart import MIMEMultipart
+        from email.MIMEMessage import MIMEMessage
+        from email.MIMEText import MIMEText
+        MIMEMultipart.__init__(self)
+        self.subject = '[%s] Resultado del intento %d del ejercicio %d.%d' % \
+            (conf.get('mail', 'prefijo'), intento.numero,
+                intento.entrega.nroEjercicio, intento.entrega.entrega)
+        self['From'] = conf.get('mail', 'from')
+        self['To'] = intento.mailRespuesta
+        self['Reply-To'] = conf.get('mail', 'admin')
+        self['Return-Path'] = conf.get('mail', 'admin')
+        self['X-Mailer'] = 'sercom 0.3'
+        self['X-Priority'] = '5'
+        self.epilogue = 'Para ver correctamente este e-mail su cliente debe ' \
+            'soportar MIME.\n\n'
+        self.prologue = '' # Garantiza que termine en \n el mensaje
+        self.attach(MIMEMessage(MIMEText('', 'plain', 'iso-8859-1')))
+        self.resultado = None
+    def __set_body(self, body):
+        self.get_payload(0).get_payload(0).set_payload(body)
+    def __get_body(self):
+        return self.get_payload(0).get_payload(0).get_payload()
+    body = property(__get_body, __set_body, doc='Cuerpo del mensaje.')
+    def attachText(self, text, nombre=None):
+        from email.MIMEText import MIMEText
+        attach = MIMEText(text, 'plain', 'iso-8859-1')
+        if nombre:
+            attach.add_header('Content-Disposition', 'attachment', filename=nombre)
+        self.attach(attach)
+    def send(self, resultado=None):
+        import smtplib
+        global conf
+        smtp = smtplib.SMTP(conf.get('mail', 'smtp'))
+        if resultado:
+            self.subject += ': ' + resultado
+        self['Subject'] = self.subject
+        smtp.sendmail(self['From'], self['To'], self.as_string())
+        smtp.close()
+
 # Manejadores de señales
 signal.signal(signal.SIGTERM, sigterm)
 signal.signal(signal.SIGINT, sigterm)
@@ -282,9 +336,11 @@ while continuar:
         time.sleep(intervalo)
         continue
     log.info('Nuevo intento a probar (%s)', intento)
+    mail = MailIntento(intento)
     # Compila
-    if not compilar(intento):
-        #TODO mandar mail
+    compilar(intento, mail)
+    if not intento.compila:
+        mail.send('NO COMPILA')
         continue
     # Ejecución de casos de prueba
     intento.inicioPruebas = datetime.datetime.now()
@@ -293,17 +349,17 @@ while continuar:
         # Preparo chroot
         preparar(intento)
         # Pruebo y agrego prueba a la lista
-        pruebas.append(probar(intento, caso_de_prueba))
+        prueba = probar(intento, caso_de_prueba, mail)
+        mail.body += 'Prueba %s: %s (%s)\n' % (prueba.casoDePrueba.nombre, prueba.pasada, prueba.observaciones)
+        pruebas.append(prueba)
         # Limpio chroot
         limpiar(intento)
+    #TODO Si es publica, veo si se hizo ok o no y voy creando mail
     intento.finPruebas = datetime.datetime.now()
+    mail.send('NO SEP')
     # Limpio directorio
     log.debug('Borrando ejecutable y código objeto (*.o)')
     os.remove(os.path.join(intento.path, 'tp'))
     [os.remove(obj) for obj in glob.glob(os.path.join(intento.path, '*.o'))]
-    #TODO Armar mail de respuesta al alumno
-    for prueba in pruebas:
-        #TODO Si es publica, veo si se hizo ok o no y voy creando mail
-        pass
-    time.sleep(intervalo)
+    # time.sleep(intervalo) #XXX Puede servir para enlentecer el server
 
index 297f86250ed1eb40ba6451d214c4ad3c189cb6d1..f9d5f23c8d025fb2e9e159c1a552c4d5ed5a85d5 100755 (executable)
@@ -1,5 +1,5 @@
 #!/bin/sh
-../src/sc_dbq Intento set 1 compila=None \
+../src/sc_dbq Intento set 1 compila=None observaciones=None \
        && ../src/sc_dbq Prueba rm 1 \
        && ../src/sc_dbq Prueba rm 2 \
        && ../src/sc_dbq Prueba rm 3
index 89fc2f34043ec0868a398535458b1a75c1a0bacc..83928651328f49088104548b38cfd912139c27e5 100644 (file)
@@ -28,7 +28,7 @@ extension = c
 ###########################
 
 # Opciones para el compilador C.
-CFLAGS = -Wall -ggdb -ansi -pedantic -DDEBUG
+CFLAGS = -Wall -ggdb -ansi -DDEBUG -pedantic
 
 # Opciones para el compilador C++.
 CXXFLAGS = $(CFLAGS) -fno-inline
index 84574b9ef47fd41ac992f4330c63053a97da79dc..e4bef9c52b2fda575b914f2c108afdfb92e5f3de 100644 (file)
@@ -29,7 +29,10 @@ from     = TALLER DE PROGRAMACION I <7542@fi.uba.ar>
 ; Mailbox local en donde hacer backup de los mails entregados
 ; (si está vacío no se hace backup).
 mbox_bak = mbox
-
+; Prefijo a agregarle al subject de los mails enviados.
+prefijo = 75.42
+; Servidor SMTP por el cual enviar los mails.
+smtp = burns
 
 ; fiuba (imap)
 server   = mail.fi.uba.ar