# Módulos estándar
import os
-import sys
import pwd
import time
import signal
-import locale
import shutil
import datetime
-import logging
-import logging.config
import subprocess
-import ConfigParser
-# Módulos externos
-import sqlobject
# Módulos locales
+import sercom
from sercom.dbo import *
-class secure:
+class secure_process:
def __init__(self, chroot, uid, gid, cpu):
self.chroot = chroot
self.uid = uid
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)
+ x2 = lambda val: (val, val) # Devuelve una tupla con val 2 veces
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_NOFILE, x2(100))
resource.setrlimit(resource.RLIMIT_NPROC, x2(0))
-def logger():
- log = None
- for log_conf in ('log.ini', os.path.expanduser('~/.sercom/log.ini'), '/etc/sercom/log.ini'):
- if (os.access(log_conf, os.R_OK)):
- logging.config.fileConfig(log_conf)
- log = logging.getLogger('test')
- return log
-
def sigchld(signum, frame):
"""Signal handler para SIGCHILD."""
#global hijo_muerto
continuar = False
log.debug('Señal %d recibida', signum)
+# Conecto señales
+signal.signal(signal.SIGCHLD, sigchld)
+signal.signal(signal.SIGTERM, sigterm)
+signal.signal(signal.SIGINT, sigterm)
-# Seteo locale
-locale.setlocale(locale.LC_ALL, '')
-
-# Obtengo configuración
-conf = ConfigParser.SafeConfigParser()
-if not conf.read(('/etc/sercom/sercom.ini', os.path.expanduser('~/.sercom/sercom.ini'), 'sercom.ini')):
- sys.stderr.write('No se pudo obtener configuración!\n')
- sys.exit(1)
+# Inicializo
+conf, conn, log = sercom.init('test')
+log.info('Iniciado')
# Obtengo id de usuario con el cual ejecutar las pruebas
(uid, gid) = pwd.getpwnam(conf.get('general', 'user'))[2:4]
# Cambio UID efectivo
os.seteuid(uid)
-# Seteo umask para que el grupo pueda leer
-os.umask(00027)
-
-# Conecto señales
-signal.signal(signal.SIGCHLD, sigchld)
-signal.signal(signal.SIGTERM, sigterm)
-signal.signal(signal.SIGINT, sigterm)
-
-# Conexión a la DB
-conn = sqlobject.connectionForURI(conf.get('dbo', 'database'))
-
-# Cargo config del logger
-log = logger()
-if not log:
- print >>sys.stderr, 'No se pudo cargar archivo de configuración de log.'
- sys.exit(1)
-log.info('Iniciado')
-
# Algunas variables de configuración útiles
data_dir = conf.get('general', 'data_dir')
intervalo = float(conf.get('general', 'intervalo'))
# 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))
+ preexec_fn=secure_process(chroot_dir, uid, gid, tiempo_cpu))
except Exception, e: # FIXME poner en el manejo de exceptiones estandar
try:
print e, e.child_traceback