Exemple #1
0
 def _assert_module_exists(self, parser, module_name):
     try:
         file, module_path, desc = find_module_recursive(module_name)
     except ImportError:
         args = repr(module_name), sys.path
         msg  = 'service %s not found. sys.path is %s' % args
         parser.error(msg)
Exemple #2
0
    def __init__(self,
                 parent,
                 name,
                 module,
                 cfg_dir,
                 main_cfg,
                 queue_name = None):
        self.parent     = parent
        self.name       = name
        self.cfg_dir    = cfg_dir
        self.main_cfg   = main_cfg
        self.queue_name = queue_name
        self.parent.service_added(self)

        try:
            fp, filename, description = find_module_recursive(module)
        except ImportError:
            raise Exception('invalid module name: %s' % module)
        filename = os.path.join(filename, 'service.py')
        with open(filename) as file:
            content = file.read()
        code                       = compile(content, filename, 'exec')
        self.vars                  = {}
        self.vars['__builtin__']   = __builtin__
        self.vars['__file__']      = filename
        self.vars['__module__']    = module
        self.vars['__service__']   = self
        self.vars['__exscriptd__'] = parent
        self.vars['__main_cfg__']  = self.main_cfg

        # Load the module using evil path manipulation, but oh well...
        # can't think of a sane way to do this.
        sys.path.insert(0, os.path.dirname(filename))
        result = eval(code, self.vars)
        sys.path.pop(0)

        self.check_func = self.vars.get('check')
        self.enter_func = self.vars.get('enter')

        if not self.enter_func:
            msg = filename + ': required function enter() not found.'
            raise Exception(msg)
Exemple #3
0
    def __init__(self,
                 parent,
                 name,
                 module,
                 cfg_dir,
                 main_cfg,
                 queue_name=None):
        self.parent = parent
        self.name = name
        self.cfg_dir = cfg_dir
        self.main_cfg = main_cfg
        self.queue_name = queue_name
        self.parent.service_added(self)

        try:
            fp, filename, description = find_module_recursive(module)
        except ImportError:
            raise Exception('invalid module name: %s' % module)
        filename = os.path.join(filename, 'service.py')
        with open(filename) as file:
            content = file.read()
        code = compile(content, filename, 'exec')
        self.vars = {}
        self.vars['__builtin__'] = __builtin__
        self.vars['__file__'] = filename
        self.vars['__module__'] = module
        self.vars['__service__'] = self
        self.vars['__exscriptd__'] = parent
        self.vars['__main_cfg__'] = self.main_cfg

        # Load the module using evil path manipulation, but oh well...
        # can't think of a sane way to do this.
        sys.path.insert(0, os.path.dirname(filename))
        result = eval(code, self.vars)
        sys.path.pop(0)

        self.check_func = self.vars.get('check')
        self.enter_func = self.vars.get('enter')

        if not self.enter_func:
            msg = filename + ': required function enter() not found.'
            raise Exception(msg)
Exemple #4
0
    def add_service(self,
                    service_name,
                    module_name=None,
                    daemon_name=None,
                    queue_name=None):
        pathname = self._get_service_file_from_name(service_name)
        changed = False

        if not pathname:
            if not module_name:
                raise Exception('module name is required')

            # Find the installation path of the module.
            file, module_path, desc = find_module_recursive(module_name)

            # Create a directory for the new service, if it does not
            # already exist.
            service_dir = os.path.join(self.service_dir, service_name)
            if not os.path.isdir(service_dir):
                os.makedirs(service_dir)

            # Copy the default config file.
            cfg_file = os.path.join(module_path, 'config.xml.tmpl')
            pathname = os.path.join(service_dir, 'config.xml')
            if not os.path.isfile(pathname):
                shutil.copy(cfg_file, pathname)
            changed = True

        # Create an XML segment for the service.
        doc = etree.parse(pathname)
        xml = doc.getroot()
        service_ele = xml.find('service[@name="%s"]' % service_name)
        if service_ele is None:
            changed = True
            service_ele = etree.SubElement(xml, 'service', name=service_name)

        # By default, use the first daemon defined in the main config file.
        if daemon_name is None:
            daemon_name = self.cfgtree.find('daemon').get('name')
        if self._add_or_update_elem(service_ele, 'daemon', daemon_name):
            changed = True

        # Add an XML statement pointing to the module.
        if module_name is not None:
            if self._add_or_update_elem(service_ele, 'module', module_name):
                changed = True

        # By default, use the first queue defined in the main config file.
        if queue_name is None:
            queue_name = self.cfgtree.find('queue').get('name')
        if not self.has_queue(queue_name):
            raise Exception('no such queue: ' + queue_name)
        if self._add_or_update_elem(service_ele, 'queue', queue_name):
            changed = True

        if not changed:
            return False

        # Write the resulting XML.
        self._write_xml(xml, pathname)
        return True
Exemple #5
0
 def __init__(self, module):
     file, path, description = find_module_recursive(module)
     try:
         self.module = load_module(module, file, path, description)
     finally:
         file.close()
Exemple #6
0
    def add_service(self,
                    service_name,
                    module_name = None,
                    daemon_name = None,
                    queue_name  = None):
        pathname = self._get_service_file_from_name(service_name)
        changed  = False

        if not pathname:
            if not module_name:
                raise Exception('module name is required')

            # Find the installation path of the module.
            file, module_path, desc = find_module_recursive(module_name)

            # Create a directory for the new service, if it does not
            # already exist.
            service_dir = os.path.join(self.service_dir, service_name)
            if not os.path.isdir(service_dir):
                os.makedirs(service_dir)

            # Copy the default config file.
            cfg_file = os.path.join(module_path, 'config.xml.tmpl')
            pathname = os.path.join(service_dir, 'config.xml')
            if not os.path.isfile(pathname):
                shutil.copy(cfg_file, pathname)
            changed = True

        # Create an XML segment for the service.
        doc         = etree.parse(pathname)
        xml         = doc.getroot()
        service_ele = xml.find('service[@name="%s"]' % service_name)
        if service_ele is None:
            changed = True
            service_ele = etree.SubElement(xml, 'service', name = service_name)

        # By default, use the first daemon defined in the main config file.
        if daemon_name is None:
            daemon_name = self.cfgtree.find('daemon').get('name')
        if self._add_or_update_elem(service_ele, 'daemon', daemon_name):
            changed = True

        # Add an XML statement pointing to the module.
        if module_name is not None:
            if self._add_or_update_elem(service_ele, 'module', module_name):
                changed = True

        # By default, use the first queue defined in the main config file.
        if queue_name is None:
            queue_name = self.cfgtree.find('queue').get('name')
        if not self.has_queue(queue_name):
            raise Exception('no such queue: ' + queue_name)
        if self._add_or_update_elem(service_ele, 'queue', queue_name):
            changed = True

        if not changed:
            return False

        # Write the resulting XML.
        self._write_xml(xml, pathname)
        return True