From: Leandro Lucarella Date: Mon, 21 Feb 2005 23:54:47 +0000 (+0000) Subject: Modularización. X-Git-Tag: svn_import~94 X-Git-Url: https://git.llucax.com/software/sercom-old.git/commitdiff_plain/a0d107bea4cae7a10895679d75a16f209b220b64?ds=inline Modularización. --- diff --git a/src/sc_dbq b/src/sc_dbq index 34b0e7b..5d016de 100755 --- a/src/sc_dbq +++ b/src/sc_dbq @@ -5,11 +5,10 @@ # 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(): @@ -24,23 +23,14 @@ def args2dict(l, conn): 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: @@ -99,14 +89,14 @@ 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) diff --git a/src/sc_test b/src/sc_test index c06f4e9..a7fe807 100755 --- a/src/sc_test +++ b/src/sc_test @@ -4,36 +4,29 @@ # 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)) @@ -44,14 +37,6 @@ class secure: 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 @@ -64,15 +49,14 @@ def sigterm(signum, frame): 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] @@ -80,24 +64,6 @@ if not conf.read(('/etc/sercom/sercom.ini', os.path.expanduser('~/.sercom/sercom # 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')) @@ -174,7 +140,7 @@ while continuar: # 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 diff --git a/src/sercom/__init__.py b/src/sercom/__init__.py index e69de29..e71f633 100644 --- a/src/sercom/__init__.py +++ b/src/sercom/__init__.py @@ -0,0 +1 @@ +from util import init diff --git a/src/sercom/util.py b/src/sercom/util.py new file mode 100644 index 0000000..9736d6f --- /dev/null +++ b/src/sercom/util.py @@ -0,0 +1,41 @@ +# -*- 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) +