Exemplo n.º 1
0
def gen_config():
    for item in os.listdir(env.get('dir_config')):
        _path = runtime.path.join(env.get('dir_config'), item)
        if os.path.isfile(_path):
            os.remove(_path)
        else:
            shutil.rmtree(_path)
    for bundle_desc in runtime.path.all_bundles_desc():
        ENV_DICT = env.all_dict()
        with open(bundle_desc, 'r') as fp:
            _bundle_desc = yaml.load(fp.read())
            _bundle = store.find(Bundle, Bundle.name == _bundle_desc['name']).one()
            # _bundle = bundle.get(_bundle_desc['name'])
            ENV_DICT.update(_bundle.env())
            for _conf in _bundle_desc.get('conf', []):
                src = _conf['src'].format(**ENV_DICT)
                dst = _conf['dst'].format(**ENV_DICT)
                dst_dir = os.path.dirname(dst)
                if not os.path.exists(dst_dir):
                    os.makedirs(dst_dir)
                content = None
                with open(src, 'r') as fp:
                    try:
                        content = template.Template(fp.read()).generate(**ENV_DICT)
                    except Exception, e:
                        print e
                        print traceback.format_exc()
                with open(dst, 'w') as fp:
                    fp.write(content)
                    # print dst
                    logger.info('genrate config file %s' % dst)
Exemplo n.º 2
0
def do_repair(options=dict()):
    load_bundles()
    # virtaul env
    shutil.copy(runtime.path.resources_path('activate'), runtime.path.join(env.get('dir_bin'), 'activate'))
    for _bundle in store.find(Bundle):
        runtime.path.process_bundle_dirs(_bundle)
    gen_config()
Exemplo n.º 3
0
def all_services_exe():
    ENV_DICT = env.all_dict()
    items = {}
    for _service in store.find(Service):
        ENV_DICT["DIR_BUNDLE"] = runtime.path.join(env.get("dir_bundles"), _service.name)
        _exe = _service.start.split()[0]
        _exe = _exe.format(**ENV_DICT)
        items[_service.name] = _exe
    return items
Exemplo n.º 4
0
 def env(self, additional=False):
     _env = {"DIR_BUNDLE": runtime.path.join(env.get("dir_bundles"), self.name)}
     for k, v in os.environ.items():
         if k.startswith(env.PREFIX):
             k = k.replace(env.PREFIX, "")
             _env[k] = v
     for _dir in _env.values():
         if not os.path.exists(_dir):
             os.makedirs(_dir)
     _env.update(self.directories_env())
     _env.update(self.options_env())
     return _env
Exemplo n.º 5
0
    def _start(self, **kwargs):
        if self.name in list_running_services():
            runtime.eerror("service `%s' is already running." % self.name)
            return

        if not self.enable:
            runtime.eerror("service `%s' is disabled." % self.name)
            return

        ENV_DICT = env.all_dict()
        ENV_DICT["DIR_BUNDLE"] = runtime.path.join(env.get("dir_bundles"), self.name)
        ENV_DICT["DIR_BUNDLE_CONFIG"] = runtime.path.join(env.get("dir_config"), self.name)
        for _dir in self.directories:
            if _dir.dir is None and _dir.name not in runtime.path.DEFAULT_DIRS.keys():
                raise Exception("Invalid default dir: `%s'" % _dir.name)

            if _dir.dir is None:
                _dir_name = "dir_%s" % _dir.name
                _dst = runtime.path.join(env.get(_dir_name), _dir.bundle)
            else:
                _dst = _dir.dir.format(**ENV_DICT)
            _dir_name = "DIR_BUNDLE_%s" % _dir.name.upper()
            ENV_DICT[_dir_name] = _dst
            if not os.path.exists(_dst):
                os.makedirs(_dst)
        for name, _dir in ENV_DICT.items():
            if name.startswith("DIR_BUNDLE") and not os.path.exists(_dir):
                os.makedirs(_dir)
        cmd = self.start.format(**ENV_DICT)
        _env = self.env
        for key, value in _env.items():
            _env[key] = value.format(**ENV_DICT)
        runtime.einfo(cmd)
        logger.debug(cmd)
        runtime.einfo("start service `%s'." % self.name)
        kwargs = {"env": _env}
        logger.debug(kwargs)
        p = subprocess.Popen(cmd.split(), **kwargs)
        runtime.einfo(p.pid)
Exemplo n.º 6
0
    def directories_env(self):
        _env = {}
        ENV_DICT = env.all_dict()
        for _dir in self.directories:
            if _dir.dir is None and _dir.name not in runtime.path.DEFAULT_DIRS.keys():
                raise Exception("Invalid default dir: `%s'" % _dir.name)

            if _dir.dir is None:
                _dir_name = "dir_%s" % _dir.name
                _dst = runtime.path.join(env.get(_dir_name), _dir.bundle)
            else:
                _dst = _dir.dir.format(**ENV_DICT)
            _dir_name = "DIR_BUNDLE_%s" % _dir.name
            _env[_dir_name.upper()] = _dst
        return _env
Exemplo n.º 7
0
def list_running_services():
    exe2services = dict([(v, k) for k, v in all_services_exe().items()])
    ENV_DICT = env.all_dict()
    rs = []
    _services = []
    for _service in store.find(Service):
        ENV_DICT["DIR_BUNDLE"] = runtime.path.join(env.get("dir_bundles"), _service.name)
        _exe = _service.start.split()[0]
        _exe = _exe.format(**ENV_DICT)
        _services.append(_exe)
    for _p in psutil.process_iter():
        try:
            _exe = _p.exe
            if _exe in _services:
                name = exe2services[_exe]
                if name in rs:
                    continue
                rs.append(name)
        except (psutil.AccessDenied, SystemError, IndexError):
            pass
        except Exception, e:
            runtime.eerror(e)
            traceback.print_exc()
Exemplo n.º 8
0
    def _stop(self, **kwargs):
        if self.name not in list_running_services():
            runtime.eerror("service `%s' is not running." % self.name)
            return

        ENV_DICT = env.all_dict()
        ENV_DICT["DIR_BUNDLE"] = runtime.path.join(env.get("dir_bundles"), self.name)
        _real_exe = self.start.split()[0].format(**ENV_DICT)

        # for normal services
        for _p in psutil.process_iter():
            try:
                # logger.debug('%d %s' % (_p.pid, _p.exe))
                if _p.exe == _real_exe:
                    runtime.einfo(_p.pid)
                    logger.debug("kill %d [%s]" % (_p.pid, self.name))
                    _p.terminate()
                    _p.wait()
                    logger.info(_p.status)
            except (psutil.error.NoSuchProcess, psutil.AccessDenied, IndexError):
                pass
            except Exception, e:
                runtime.eerror(e)
                logger.error(traceback.format_exc())
Exemplo n.º 9
0
#!/usr/bin/env python
# coding=utf-8

import logging
from eventlet.green import os
from storm.locals import create_database, Store

import runtime.path
from runtime import env

_database = None
_store = None
logger = logging.getLogger(__name__)

db_uri = os.path.abspath(runtime.path.join(env.get('dir_data'), 'core.db'))
logger.debug("database path: `%s'" % db_uri)

def get_store():
    global _database, _store
    if not _database:
        _database = create_database('sqlite:///%s' % db_uri)
    if not _store:
        _store = Store(_database)

    return _store

def init():
    import sqlite3
    logger.debug('create tables.')
    with open(runtime.path.resources_path('schema.sql')) as fp:
        conn = sqlite3.connect(db_uri)
Exemplo n.º 10
0
def _load_bundle(bundle_desc):
    # pprint(bundle_desc)
    print "register bundle `%s'" % bundle_desc['name']
    _bundle = store.find(Bundle, Bundle.name == bundle_desc['name']).one() or Bundle()
    _bundle.name = bundle_desc['name']
    _bundle.description = bundle_desc['description']
    store.add(_bundle)

    if 'options' in bundle_desc:
        for _option_desc in bundle_desc['options']:
            _option = store.find(Option, Option.name == _option_desc['name'], Option.bundle == bundle_desc['name']).one() or Option()
            _option.name = _option_desc['name']
            _option.bundle = bundle_desc['name']
            _option.description = _option_desc.get('description', _option_desc['name'])
            _option.value = unicode(_option_desc['value'])
            store.add(_option)

    if 'service' in bundle_desc:
        _service_desc = bundle_desc['service']
        _service = store.find(Service, Service.name == bundle_desc['name']).one() or Service()
        _service.name = bundle_desc['name']
        _service.bundle = bundle_desc['name']
        _service.description = _service_desc['description']
        _service.start = _service_desc['start']
        _service.stop = _service_desc['stop']
        _service.restart = _service_desc['restart']
        _service.env = _service_desc.get('env', {})
        _service.enable = _service_desc.get('enable', True)
        _service.autostart = _service_desc.get('autostart', True)
        store.add(_service)

    if 'directories' in bundle_desc:
        for _dir_desc in bundle_desc['directories']:
            _dir = store.find(Directory, Directory.name == _dir_desc['name'], Directory.bundle == bundle_desc['name']).one() or Directory()
            _dir.name = _dir_desc['name']
            _dir.bundle = bundle_desc['name']
            _dir.dir = _dir_desc.get('dir', None)
            _dir.permission = _dir_desc.get('permission', u'0755')
            _dir.description = _dir_desc['description']
            store.add(_dir)
    store.commit()

    # copy data
    if 'data' in bundle_desc:
        _env = _bundle.env(True)
        data = bundle_desc['data']
        src = data['src'].format(**_env)
        dst = data['dst'].format(**_env)
        if os.path.exists(dst) and len(os.listdir(dst)) == 0:
            logger.info('remove empty directory %s' % dst)
            shutil.rmtree(dst)
        if not os.path.exists(dst):
            shutil.copytree(src, dst)

    # # bin symlink
    bundle_bin_dir = runtime.path.join(env.get('dir_bundles'), _bundle.name, 'bin')
    if not os.path.exists(env.get('dir_bin')):
        os.makedirs(env.get('dir_bin'))
    if os.path.exists(bundle_bin_dir):
        for item in os.listdir(bundle_bin_dir):
            dst = runtime.path.join(env.get('dir_bin'), item)
            if item in ('.DS_Store'):
                continue
            if os.path.islink(dst) or os.path.isfile(dst):
                os.unlink(dst)
            os.symlink(runtime.path.join(bundle_bin_dir, item), dst)

    # # lib symlink
    bundle_lib_dir = runtime.path.join(env.get('dir_bundles'), _bundle.name, 'lib')
    lib_dir = runtime.path.join(env.get('dir_bundles'), 'lib')
    if not os.path.exists(lib_dir):
        os.makedirs(lib_dir)
    if os.path.exists(bundle_lib_dir):
        for item in os.listdir(bundle_lib_dir):
            src = runtime.path.join(bundle_lib_dir, item)
            dst = runtime.path.join(lib_dir, item)
            if item in ('.DS_Store'):
                continue
            if os.path.islink(dst) or os.path.isfile(dst):
                os.unlink(dst)
            if os.path.isdir(src):
                continue
            os.symlink(src, dst)
Exemplo n.º 11
0
from runtime import env
runtime.path.bootstrap()
import storage
from module import service
from module.schema import Bundle, Option, Service, Directory

formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')

console = logging.StreamHandler()
console.setFormatter(formatter)
console.setLevel(logging.DEBUG)
logger.addHandler(console)
logger.setLevel(logging.DEBUG)

handler = logging.handlers.TimedRotatingFileHandler(
    filename=runtime.path.join(env.get('dir_log'), 'ctl.log'),
    when='midnight', backupCount=7)
handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)

logger.debug(pformat(env.all_dict()))

store = storage.get_store()

def _load_bundle(bundle_desc):
    # pprint(bundle_desc)
    print "register bundle `%s'" % bundle_desc['name']
    _bundle = store.find(Bundle, Bundle.name == bundle_desc['name']).one() or Bundle()
    _bundle.name = bundle_desc['name']
    _bundle.description = bundle_desc['description']