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
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
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
#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)