From 727acb5562491fcd2ffb88d31caec867e7dbef49 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Mon, 21 Feb 2005 21:04:15 +0000 Subject: [PATCH] Bugfixes para que funcionen las pruebas. --- src/sc_test | 47 +++++++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/src/sc_test b/src/sc_test index fad2a06..c06f4e9 100755 --- a/src/sc_test +++ b/src/sc_test @@ -27,20 +27,22 @@ class secure: self.gid = gid self.cpu = cpu def __call__(self): + def x2(val): + return (val, val) from os import chroot, setuid, setgid import resource chroot(self.chroot) setgid(self.gid) setuid(self.uid) - resource.setrlimit(resource.RLIMIT_AS, 20*1024*1024) - resource.setrlimit(resource.RLIMIT_CORE, 0) - resource.setrlimit(resource.RLIMIT_CPU, (self.cpu, self.cpu)) - resource.setrlimit(resource.RLIMIT_DATA, 20*1024*1024) - resource.setrlimit(resource.RLIMIT_FSIZE, 20*1024*1024) #XXX Obtener de archivos esperados? - resource.setrlimit(resource.RLIMIT_LOCKS, 100) - resource.setrlimit(resource.RLIMIT_MEMLOCK, 100) - resource.setrlimit(resource.RLIMIT_NOFILE, 100) - resource.setrlimit(resource.RLIMIT_NPROC, 0) + resource.setrlimit(resource.RLIMIT_AS, x2(20*1024*1024)) + resource.setrlimit(resource.RLIMIT_CORE, x2(0)) + resource.setrlimit(resource.RLIMIT_CPU, x2(self.cpu)) + resource.setrlimit(resource.RLIMIT_DATA, x2(20*1024*1024)) + resource.setrlimit(resource.RLIMIT_FSIZE, x2(20*1024*1024)) #XXX Obtener de archivos esperados? + #resource.setrlimit(resource.RLIMIT_LOCKS, x2(100)) XXX NO EXISTE EN python + resource.setrlimit(resource.RLIMIT_MEMLOCK, x2(100)) + resource.setrlimit(resource.RLIMIT_NOFILE, x2(100)) + resource.setrlimit(resource.RLIMIT_NPROC, x2(0)) def logger(): log = None @@ -156,19 +158,28 @@ while continuar: tiempo_cpu = caso_de_prueba.tiempoCpu if tiempo_cpu is None: tiempo_cpu = conf.get('general', 'tiempo_cpu') + tiempo_cpu = int(tiempo_cpu) # Creo prueba nueva - prueba = Prueba(intento.id, caso_de_prueba.id, datetime.datetime.now()) + prueba = Prueba(intento=intento, casoDePrueba=caso_de_prueba, + inicio=datetime.datetime.now(), connection = conn) log.debug('Prueba: %s', prueba) # Abro archivos para fds básicos #XXX sacar nombres de archivos de prueba???? - stdin = file(os.path.join(intento_dir, 'stdin'), 'r') + #stdin = file(os.path.join(intento_dir, 'stdin'), 'r') stdout = file(os.path.join(intento_dir, 'stdout'), 'w') stderr = file(os.path.join(intento_dir, 'stderr'), 'w') # Ejecuto programa - log.debug('Ejecutando /tp %s', prueba.params) + log.debug('Ejecutando /tp %s', caso_de_prueba.parametros) os.seteuid(0) # Dios! (para chroot) - proc = subprocess.Popen('/tp', stdin=stdin, stdout=stdout, stderr=stderr, - preexec_fn=secure(chroot_dir, uid, gid, tiempo_cpu)) + # FIXME caso_de_prueba.parametros + try: + proc = subprocess.Popen('/tp', stdout=stdout, stderr=stderr, #stdin=stdin, + preexec_fn=secure(chroot_dir, uid, gid, tiempo_cpu)) + except Exception, e: # FIXME poner en el manejo de exceptiones estandar + try: + print e, e.child_traceback + except: + print e os.seteuid(uid) # Mortal de nuevo time.sleep(tiempo_cpu) # Si el proceso sigue andando lo tenemos que matar @@ -186,7 +197,7 @@ while continuar: prueba.pasada = False continue proc.wait() # Para que no queden zombies - prueba.fin = datetime.datetime.now() + prueba.fin = str(datetime.datetime.now()) # Salió con una señal? if proc.returncode < 0: sig = -proc.returncode @@ -216,13 +227,13 @@ while continuar: #TODO verificar salidas, hacer diff log.debug('Fin de ejecución de caso de prueba (hijo: %d, ret: %d)', proc.pid, proc.returncode) - log.debug('Prueba OK') prueba.pasada = True + log.debug('Prueba OK: %s', prueba) intento.finPruebas = datetime.datetime.now() #TODO make clean #TODO Armar mail de respuesta al alumno - for prueba in Prueba.selectBy(conn, Prueba.q.intento == intento): + for prueba in Prueba.selectBy(intentoID=intento.id, connection=conn): #TODO Si es publica, veo si se hizo ok o no y voy creando mail pass - time.sleep(conf.get('general', 'intervalo')) + time.sleep(intervalo) -- 2.43.0