def get_socket(module_name, nb_try=5): """ Return a socket connected to the module named *module_name*. The socket is transformed by the makefile function and has to be use as a file object. """ for i in xrange(nb_try): try: sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sock.connect(path.socket_file(module_name)) except socket.error as e: logger.exception(e) logger.error('Cannot connect to `%s` module. (%d / %d)', module_name, i + 1, nb_try) time.sleep(0.5) else: return sock.makefile('rw') logger.error('Cannot connect to `%s` module.', module_name) return kill()
def __call__(self, *args, **kwargs): obj = super(BaseMeta, self).__call__(*args, **kwargs) cls = type(obj) # Handle module name if not hasattr(obj, 'module_name'): if not hasattr(cls, 'module_name'): setattr(obj, 'module_name', cls.__name__) else: setattr(obj, 'module_name', cls.module_name) if obj.module_name in type(self).ls_name: raise NameError('Module with same name already exist') type(self).ls_name.add(obj.module_name) # Handle module socket (server side) setattr(obj, 'module_socket', path.socket_file(obj.module_name)) try: os.remove(obj.module_socket) except OSError: pass endpoint = ServerEndpoint(reactor, obj.module_socket) endpoint.listen(connection.Factory(obj)) # Handle module fields from khome.fields import Base as Field ls_fields = [] for f_cls in cls.__dict__.keys(): f_cls = getattr(cls, f_cls) if isinstance(f_cls, type) and issubclass(f_cls, Field): field = f_cls() setattr(obj, field.field_name, prop_field(field)) setattr(field, 'module', obj) ls_fields += [field] setattr(obj, 'module_fields', ls_fields) # Logger setattr(obj, 'logger', logging.getLogger(obj.module_name)) #setup_logger(obj.logger) _lauched_modules.append(obj) return obj
def connect(module_name, nb_try=5): """ Return a socket connected to the module named *module_name*. Try this *nb_try* times. If it's unsuccessful, raise a RuntimeError. The socket is transformed by the makefile function and has to be use as a file object. """ for i in xrange(nb_try): try: sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sock.connect(path.socket_file(module_name)) except socket.error as e: logging.exception(e) logging.error('Cannot connect to `%s` module. (%d / %d)', module_name, i + 1, nb_try) time.sleep(0.5) else: return sock.makefile('rw') raise RuntimeError('Cannot connect to `%s` module.' % module_name)
def is_ready(module_name): """ Return if the module *module_name* is ready. This is detected by watching the socket file of the module. """ return os.path.exists(path.socket_file(module_name))
def __init__(self): name = type(self).__name__ fields = type(self).__fields__ for f in fields: f.module = self Abstract.__init__(self, name, path.socket_file(name), fields)