# Módulos estándar
import os
import sys
-import locale
-import ConfigParser
# Módulos externos
import sqlobject
# Módulos locales
+import sercom
from sercom.dbo import *
def ayuda():
d[key] = val
return d
-if len(sys.argv) < 3:
- print >>sys.stderr, 'Faltan argumentos!'
- print >>sys.stderr, ayuda()
- sys.exit(1)
-
-# Seteo locale
-locale.setlocale(locale.LC_ALL, '')
+# Inicializo
+conf, conn, log = sercom.init('dbq')
-# 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')
+if len(sys.argv) < 3:
+ log.error('Faltan argumentos!')
+ log.error(ayuda())
sys.exit(1)
-# Conexión a la DB
-conn = sqlobject.connectionForURI(conf.get('dbo', 'database'))
-
# Argumentos interesantes
obj = sys.argv[1]
try:
o = eval(obj)(**args2dict(args, conn))
print 'Agregado:', o
else:
- print >>sys.stderr, 'Comando incorrecto (%s)!' % cmd
- print >>sys.stderr, ayuda()
+ log.error('Comando incorrecto (%s)!', cmd)
+ log.error(ayuda())
sys.exit(2)
except ValueError:
- print >>sys.stderr, 'Argumento inválido!'
- print >>sys.stderr, ayuda()
+ log.error('Argumento inválido!')
+ log.error(ayuda())
sys.exit(3)
except Exception, msg:
- print >>sys.stderr, 'ERROR:', msg
+ log.exception(msg)
sys.exit(100)
# 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
--- /dev/null
+# -*- encoding: iso-8859-1 -*-
+# vim: set et sw=4 sts=4 :
+
+# Módulos estándar
+import os
+import sys
+import locale
+import logging
+import logging.config
+import ConfigParser
+# Módulos externos
+import sqlobject
+
+def get_logger(tipo):
+ 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(tipo)
+ return log
+
+def init(tipo):
+ # 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)
+ # Seteo umask para que el grupo pueda leer
+ os.umask(00027)
+ # Conexión a la DB
+ conn = sqlobject.connectionForURI(conf.get('dbo', 'database'))
+ # Cargo config del logger
+ log = get_logger(tipo)
+ if not log:
+ print >>sys.stderr, 'No se pudo cargar archivo de configuración de log.'
+ sys.exit(1)
+ # Devuelvo cosas interesantes
+ return (conf, conn, log)
+