<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">On 01/24/2014 09:37 AM, Aline Manera
      wrote:<br>
    </div>
    <blockquote cite="mid:52E1C3DF.5050309@linux.vnet.ibm.com"
      type="cite">On 01/22/2014 03:48 AM, Mark Wu wrote:
      <br>
      <blockquote type="cite">This patch reorganizes kimchi's paths
        generation code to make the user
        <br>
        of path vars can work with both kimchi root app and plugin app.
        <br>
        <br>
        Signed-off-by: Mark Wu <a class="moz-txt-link-rfc2396E" href="mailto:wudxw@linux.vnet.ibm.com">&lt;wudxw@linux.vnet.ibm.com&gt;</a>
        <br>
        ---
        <br>
        &nbsp; src/kimchi/cachebust.py |&nbsp;&nbsp; 4 +-
        <br>
        &nbsp; src/kimchi/config.py.in | 164
        ++++++++++++++++++++----------------------------
        <br>
        &nbsp; src/kimchi/root.py&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 6 +-
        <br>
        &nbsp; src/kimchi/server.py&nbsp;&nbsp;&nbsp; |&nbsp; 10 +--
        <br>
        &nbsp; src/kimchi/template.py&nbsp; |&nbsp; 14 +++--
        <br>
        &nbsp; src/kimchi/utils.py&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 6 +-
        <br>
        &nbsp; src/kimchid.in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 7 ++-
        <br>
        &nbsp; tests/test_plugin.py&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; 4 +-
        <br>
        &nbsp; 8 files changed, 100 insertions(+), 115 deletions(-)
        <br>
        <br>
        diff --git a/src/kimchi/cachebust.py b/src/kimchi/cachebust.py
        <br>
        index 9a71f4f..7844695 100644
        <br>
        --- a/src/kimchi/cachebust.py
        <br>
        +++ b/src/kimchi/cachebust.py
        <br>
        @@ -23,11 +23,11 @@
        <br>
        &nbsp; import os
        <br>
        <br>
        <br>
        -from kimchi.config import get_prefix
        <br>
        +from kimchi.config import paths
        <br>
        <br>
        <br>
        &nbsp; def href(url):
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # for error.html, url is absolute path
        <br>
        -&nbsp;&nbsp;&nbsp; f = os.path.join(get_prefix(), 'ui', url.lstrip("/"))
        <br>
        +&nbsp;&nbsp;&nbsp; f = os.path.join(paths.ui_dir, url.lstrip("/"))
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mtime = os.path.getmtime(f)
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "%s?cacheBust=%s" % (url, mtime)
        <br>
        diff --git a/src/kimchi/config.py.in b/src/kimchi/config.py.in
        <br>
        index 22fe614..53c8e42 100644
        <br>
        --- a/src/kimchi/config.py.in
        <br>
        +++ b/src/kimchi/config.py.in
        <br>
        @@ -28,7 +28,6 @@ import platform
        <br>
        <br>
        <br>
        &nbsp; from ConfigParser import SafeConfigParser
        <br>
        -from glob import iglob
        <br>
        <br>
        <br>
        &nbsp; from kimchi.xmlutils import xpath_get_text
        <br>
        @@ -37,86 +36,24 @@ from kimchi.xmlutils import xpath_get_text
        <br>
        &nbsp; DEFAULT_LOG_LEVEL = "debug"
        <br>
        <br>
        <br>
        -def get_prefix():
        <br>
        -&nbsp;&nbsp;&nbsp; if __file__[0] == '/':
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base = os.path.dirname(__file__)
        <br>
        -&nbsp;&nbsp;&nbsp; else:
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base = os.path.dirname('./%s' % __file__)
        <br>
        -
        <br>
        -&nbsp;&nbsp;&nbsp; if os.access('%s/../../src/kimchi/config.py' % base,
        os.F_OK):
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return '%s/../..' % base
        <br>
        -&nbsp;&nbsp;&nbsp; else:
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return '@pkgdatadir@'
        <br>
        -
        <br>
        -
        <br>
        -def without_installation():
        <br>
        -&nbsp;&nbsp;&nbsp; return get_prefix() != '@pkgdatadir@'
        <br>
        -
        <br>
        -
        <br>
        -def get_config_dir():
        <br>
        -&nbsp;&nbsp;&nbsp; prefix = get_prefix()
        <br>
        -
        <br>
        -&nbsp;&nbsp;&nbsp; if prefix == '@pkgdatadir@':
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return '@sysconfdir@/kimchi'
        <br>
        -&nbsp;&nbsp;&nbsp; else:
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return os.path.join(prefix, 'src')
        <br>
        -
        <br>
        -
        <br>
        -def _get_kimchi_src_dir():
        <br>
        -&nbsp;&nbsp;&nbsp; prefix = get_prefix()
        <br>
        -&nbsp;&nbsp;&nbsp; return ('@kimchidir@' if prefix == '@pkgdatadir@'
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else os.path.join(prefix, 'src/kimchi'))
        <br>
        -
        <br>
        -
        <br>
        -def get_api_schema_file():
        <br>
        -&nbsp;&nbsp;&nbsp; return os.path.join(_get_kimchi_src_dir(), 'API.json')
        <br>
        -
        <br>
        -
        <br>
        -def get_default_log_dir():
        <br>
        -&nbsp;&nbsp;&nbsp; prefix = get_prefix()
        <br>
        -
        <br>
        -&nbsp;&nbsp;&nbsp; if prefix == '@pkgdatadir@':
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "@localstatedir@/log/kimchi"
        <br>
        -
        <br>
        -&nbsp;&nbsp;&nbsp; return os.path.join(prefix, 'log')
        <br>
        -
        <br>
        -
        <br>
        -def get_state_path():
        <br>
        -&nbsp;&nbsp;&nbsp; prefix = get_prefix()
        <br>
        -
        <br>
        -&nbsp;&nbsp;&nbsp; if prefix == '@pkgdatadir@':
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "@localstatedir@/lib/kimchi"
        <br>
        -
        <br>
        -&nbsp;&nbsp;&nbsp; return os.path.join(prefix, 'data')
        <br>
        -
        <br>
        -
        <br>
        &nbsp; def get_session_path():
        <br>
        -&nbsp;&nbsp;&nbsp; return os.path.join(get_state_path(), 'sessions')
        <br>
        +&nbsp;&nbsp;&nbsp; return os.path.join(paths.state_dir, 'sessions')
        <br>
        <br>
        <br>
        &nbsp; def get_object_store():
        <br>
        -&nbsp;&nbsp;&nbsp; return os.path.join(get_prefix(), 'data', 'objectstore')
        <br>
        +&nbsp;&nbsp;&nbsp; return os.path.join(paths.state_dir, 'objectstore')
        <br>
        <br>
        <br>
        &nbsp; def get_distros_store():
        <br>
        -&nbsp;&nbsp;&nbsp; return os.path.join(get_config_dir(), 'distros.d')
        <br>
        -
        <br>
        -
        <br>
        -def get_template_path(resource):
        <br>
        -&nbsp;&nbsp;&nbsp; return '%s/ui/pages/%s.tmpl' % (get_prefix(), resource)
        <br>
        +&nbsp;&nbsp;&nbsp; return os.path.join(paths.conf_dir, 'distros.d')
        <br>
        <br>
        <br>
        &nbsp; def get_screenshot_path():
        <br>
        -&nbsp;&nbsp;&nbsp; return "%s/data/screenshots" % get_prefix()
        <br>
        -
        <br>
        +&nbsp;&nbsp;&nbsp; return os.path.join(paths.state_dir, 'screenshots')
        <br>
        <br>
        -def get_mo_path():
        <br>
        -&nbsp;&nbsp;&nbsp; return '%s/mo' % get_prefix()
        <br>
        <br>
        -
        <br>
        -def get_support_language():
        <br>
        -&nbsp;&nbsp;&nbsp; mopath = "%s/*" % get_mo_path()
        <br>
        -&nbsp;&nbsp;&nbsp; return [path.rsplit('/', 1)[1] for path in iglob(mopath)]
        <br>
        +def get_debugreports_path():
        <br>
        +&nbsp;&nbsp;&nbsp; return os.path.join(paths.state_dir, 'debugreports')
        <br>
        <br>
        <br>
        &nbsp; def find_qemu_binary():
        <br>
        @@ -137,37 +74,74 @@ def find_qemu_binary():
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return location
        <br>
        <br>
        <br>
        -def get_debugreports_path():
        <br>
        -&nbsp;&nbsp;&nbsp; return os.path.join(get_prefix(), 'data', 'debugreports')
        <br>
        +class Paths(object):
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp; def __init__(self):
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.prefix = self.get_prefix()
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.installed = (self.prefix == '@pkgdatadir@')
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.installed:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.state_dir = '@localstatedir@/lib/kimchi'
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.log_dir = '@localstatedir@/log/kimchi'
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.conf_dir = '@sysconfdir@/kimchi'
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.src_dir = '@kimchidir@'
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.plugins_dir = '@kimchidir@'
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.state_dir = self.add_prefix('data')
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.log_dir = self.add_prefix('log')
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.conf_dir = self.add_prefix('src')
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.src_dir = self.add_prefix('src/kimchi')
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.plugins_dir = self.add_prefix('plugins')
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.ui_dir = self.add_prefix('ui')
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.mo_dir = self.add_prefix('mo')
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp; def get_prefix(self):
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if __file__[0] == '/':
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base = os.path.dirname(__file__)
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base = os.path.dirname('./%s' % __file__)
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if os.access('%s/../../src/kimchi/config.py' % base,
        os.F_OK):
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return os.path.abspath('%s/../..' % base)
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return '@pkgdatadir@'
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp; def add_prefix(self, subdir):
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return os.path.join(self.prefix, subdir)
        <br>
        +
        <br>
        +&nbsp;&nbsp;&nbsp; def get_template_path(self, resource):
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return os.path.join(self.ui_dir, 'pages/%s.tmpl' %
        resource)
        <br>
        +
        <br>
        +
        <br>
      </blockquote>
      <br>
      <blockquote type="cite">+paths = Paths()
        <br>
        +
        <br>
      </blockquote>
      <br>
      Move it to the constants section
      <br>
    </blockquote>
    We have to put it after the definition of class Paths.&nbsp; If you
    insist on it,&nbsp; we will have to move the class Path to a new module.&nbsp;
    But it's still not clean to have paths related definition in two
    files.<br>
    <blockquote cite="mid:52E1C3DF.5050309@linux.vnet.ibm.com"
      type="cite">
      <br>
      <blockquote type="cite">
        <br>
        +class PluginPaths(Paths):
        <br>
        <br>
        -def get_plugins_dir():
        <br>
        -&nbsp;&nbsp;&nbsp; prefix = get_prefix()
        <br>
        -&nbsp;&nbsp;&nbsp; if prefix == '@pkgdatadir@':
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prefix = '@kimchidir@'
        <br>
        -&nbsp;&nbsp;&nbsp; return os.path.join(prefix, 'plugins')
        <br>
        +&nbsp;&nbsp;&nbsp; def __init__(self, name):
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(PluginPaths, self).__init__()
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.plugin_dir = os.path.join('plugins', name)
        <br>
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.installed:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.conf_dir = '@sysconfdir@/kimchi/plugins.d'
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.src_dir = os.path.join('@kimchidir@',
        self.plugin_dir)
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.conf_dir = self.add_prefix(self.plugin_dir)
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.src_dir = self.add_prefix(self.plugin_dir)
        <br>
        <br>
        -def get_plugin_config(name):
        <br>
        -&nbsp;&nbsp;&nbsp; prefix = get_prefix()
        <br>
        -&nbsp;&nbsp;&nbsp; if prefix == '@pkgdatadir@':
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base_dir = '@sysconfdir@/kimchi/plugins.d/'
        <br>
        -&nbsp;&nbsp;&nbsp; else:
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base_dir = os.path.join(prefix, 'plugins')
        <br>
        -&nbsp;&nbsp;&nbsp; return os.path.join(base_dir, '%s/%s.conf' % (name, name))
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.ui_dir =
        self.add_prefix(os.path.join(self.plugin_dir, 'ui'))
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.mo_dir =
        self.add_prefix(os.path.join(self.plugin_dir, 'mo'))
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.conf_file = os.path.join(self.conf_dir, '%s.conf'
        % name)
        <br>
        <br>
        <br>
        -def _get_plugin_ui_dir(name):
        <br>
        -&nbsp;&nbsp;&nbsp; prefix = get_prefix()
        <br>
        -&nbsp;&nbsp;&nbsp; if prefix == '@pkgdatadir@':
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base_dir = '@pkgdatadir@/plugins/'
        <br>
        -&nbsp;&nbsp;&nbsp; else:
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base_dir = os.path.join(prefix, 'plugins')
        <br>
        -&nbsp;&nbsp;&nbsp; return os.path.join(base_dir, '%s/ui' % name)
        <br>
      </blockquote>
      <br>
      <blockquote type="cite">+_plugin_paths = {}
        <br>
      </blockquote>
      <br>
      Why is it needed?
      <br>
    </blockquote>
    It was kind of cache to avoid
    <meta http-equiv="content-type" content="text/html;
      charset=ISO-8859-1">
    <h1 class="keyword" style="margin: 0px; padding: 0px 20px 0px 0px;
      float: left; line-height: 1.25em; font-size: 30px; color: rgb(0,
      153, 68); font-family: Verdana, Geneva, sans-serif; word-wrap:
      break-word; font-style: normal; font-variant: normal;
      letter-spacing: normal; orphans: auto; text-align: start;
      text-indent: 0px; text-transform: none; white-space: normal;
      widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;
      background-color: rgb(255, 255, 255);"><br>
    </h1>
    instantiation many times. but it just have a few, so remove it in
    v2.<br class="Apple-interchange-newline">
    <br>
    <blockquote cite="mid:52E1C3DF.5050309@linux.vnet.ibm.com"
      type="cite">
      <br>
      <blockquote type="cite">
        <br>
        <br>
        -def get_plugin_tab_xml(name):
        <br>
        -&nbsp;&nbsp;&nbsp; return os.path.join(_get_plugin_ui_dir(name),
        'config/tab-ext.xml')
        <br>
        +def plugin_paths(plugin_name):
        <br>
        +&nbsp;&nbsp;&nbsp; if plugin_name not in _plugin_paths:
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _plugin_paths[plugin_name] = PluginPaths(plugin_name)
        <br>
        +&nbsp;&nbsp;&nbsp; return _plugin_paths[plugin_name]
        <br>
        <br>
        <br>
        &nbsp; def _get_config():
        <br>
        @@ -180,12 +154,12 @@ def _get_config():
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.set("server", "ssl_key", "")
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.set("server", "environment", "development")
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.add_section("logging")
        <br>
        -&nbsp;&nbsp;&nbsp; config.set("logging", "log_dir", get_default_log_dir())
        <br>
        +&nbsp;&nbsp;&nbsp; config.set("logging", "log_dir", paths.log_dir)
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.set("logging", "log_level", DEFAULT_LOG_LEVEL)
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.add_section("display")
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.set("display", "display_proxy_port", "64667")
        <br>
        <br>
        -&nbsp;&nbsp;&nbsp; config_file = os.path.join(get_config_dir(), 'kimchi.conf')
        <br>
        +&nbsp;&nbsp;&nbsp; config_file = os.path.join(paths.conf_dir, 'kimchi.conf')
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if os.path.exists(config_file):
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.read(config_file)
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return config
        <br>
        @@ -195,4 +169,4 @@ config = _get_config()
        <br>
        <br>
        <br>
        &nbsp; if __name__ == '__main__':
        <br>
        -&nbsp;&nbsp;&nbsp; print get_prefix()
        <br>
        +&nbsp;&nbsp;&nbsp; print paths.prefix
        <br>
        diff --git a/src/kimchi/root.py b/src/kimchi/root.py
        <br>
        index 3cc6321..ae9fd0e 100644
        <br>
        --- a/src/kimchi/root.py
        <br>
        +++ b/src/kimchi/root.py
        <br>
        @@ -23,11 +23,12 @@
        <br>
        <br>
        &nbsp; import cherrypy
        <br>
        &nbsp; import json
        <br>
        +import os
        <br>
        <br>
        <br>
        &nbsp; from kimchi import auth
        <br>
        &nbsp; from kimchi import template
        <br>
        -from kimchi.config import get_api_schema_file
        <br>
        +from kimchi.config import paths
        <br>
        &nbsp; from kimchi.control.base import Resource
        <br>
        &nbsp; from kimchi.control.config import Config
        <br>
        &nbsp; from kimchi.control.debugreports import DebugReports
        <br>
        @@ -67,7 +68,8 @@ class Root(Resource):
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.host = Host(model)
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.debugreports = DebugReports(model)
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.plugins = Plugins(model)
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.api_schema =
        json.load(open(get_api_schema_file()))
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.api_schema =
        json.load(open(os.path.join(paths.src_dir,
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        'API.json')))
        <br>
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def error_production_handler(self, status, message,
        traceback, version):
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data = {'code': status, 'reason': message}
        <br>
        diff --git a/src/kimchi/server.py b/src/kimchi/server.py
        <br>
        index b820263..58b082b 100644
        <br>
        --- a/src/kimchi/server.py
        <br>
        +++ b/src/kimchi/server.py
        <br>
        @@ -33,6 +33,7 @@ from kimchi import config
        <br>
        &nbsp; from kimchi import model
        <br>
        &nbsp; from kimchi import mockmodel
        <br>
        &nbsp; from kimchi import vnc
        <br>
        +from kimchi.config import paths, plugin_paths
        <br>
        &nbsp; from kimchi.root import Root
        <br>
        &nbsp; from kimchi.utils import get_enabled_plugins, import_class
        <br>
        <br>
        @@ -63,8 +64,8 @@ class Server(object):
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CACHEEXPIRES = 31536000
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; configObj = {
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '/': {'tools.trailing_slash.on': False,
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'tools.staticdir.root': config.get_prefix(),
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'tools.staticfile.root': config.get_prefix(),
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'tools.staticdir.root': paths.prefix,
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'tools.staticfile.root': paths.prefix,
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'request.methods_with_bodies': ('POST', 'PUT'),
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'tools.nocache.on': True,
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'tools.sessions.on': True,
        <br>
        @@ -211,7 +212,8 @@ class Server(object):
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; plugin_config['/ui/config/tab-ext.xml'] = {
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'tools.staticfile.on': True,
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'tools.staticfile.filename':
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.get_plugin_tab_xml(plugin_name),
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        os.path.join(plugin_paths(plugin_name).ui_dir,
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'config/tab-ext.xml'),
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'tools.nocache.on': True}
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except KeyError:
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue
        <br>
        @@ -233,7 +235,7 @@ class Server(object):
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cert = options.ssl_cert
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key = options.ssl_key
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not cert or not key:
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config_dir = config.get_config_dir()
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config_dir = paths.conf_dir
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cert = '%s/kimchi-cert.pem' % config_dir
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key = '%s/kimchi-key.pem' % config_dir
        <br>
        <br>
        diff --git a/src/kimchi/template.py b/src/kimchi/template.py
        <br>
        index 1f19c4a..1740997 100644
        <br>
        --- a/src/kimchi/template.py
        <br>
        +++ b/src/kimchi/template.py
        <br>
        @@ -28,9 +28,10 @@ import os
        <br>
        <br>
        <br>
        &nbsp; from Cheetah.Template import Template
        <br>
        +from glob import iglob
        <br>
        <br>
        <br>
        -from kimchi import config
        <br>
        +from kimchi.config import paths
        <br>
        <br>
        <br>
        &nbsp; def get_lang():
        <br>
        @@ -54,8 +55,13 @@ def get_lang():
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return langs
        <br>
        <br>
        <br>
        +def get_support_languages():
        <br>
        +&nbsp;&nbsp;&nbsp; mopath = "%s/*" % paths.mo_dir
        <br>
        +&nbsp;&nbsp;&nbsp; return [path.rsplit('/', 1)[1] for path in iglob(mopath)]
        <br>
        +
        <br>
        +
        <br>
        &nbsp; def validate_language(langs):
        <br>
        -&nbsp;&nbsp;&nbsp; supportLangs = config.get_support_language()
        <br>
        +&nbsp;&nbsp;&nbsp; supportLangs = get_support_languages()
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for lang in langs:
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if lang in supportLangs:
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return lang
        <br>
        @@ -88,12 +94,12 @@ def render(resource, data):
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; separators=(',', ':'),
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; encoding='iso-8859-1')
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif can_accept_html():
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filename = config.get_template_path(resource)
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filename = paths.get_template_path(resource)
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; params = {'data': data}
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lang = validate_language(get_lang())
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gettext_conf = {'domain': 'kimchi',
        <br>
        -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'localedir': config.get_mo_path(),
        <br>
        +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'localedir': paths.mo_dir,
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'lang': [lang]}
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; params['lang'] = gettext_conf
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Template(file=filename,
        searchList=params).respond()
        <br>
        diff --git a/src/kimchi/utils.py b/src/kimchi/utils.py
        <br>
        index 5d6e8ea..7077b3b 100644
        <br>
        --- a/src/kimchi/utils.py
        <br>
        +++ b/src/kimchi/utils.py
        <br>
        @@ -28,10 +28,10 @@ import urllib2
        <br>
        <br>
        <br>
        &nbsp; from cherrypy.lib.reprconf import Parser
        <br>
        +from kimchi.config import paths, plugin_paths
        <br>
        &nbsp; from kimchi.exception import TimeoutExpired
        <br>
        <br>
        <br>
        -from kimchi import config
        <br>
        &nbsp; from threading import Timer
        <br>
        <br>
        <br>
        @@ -48,7 +48,7 @@ def is_digit(value):
        <br>
        <br>
        <br>
        &nbsp; def _load_plugin_conf(name):
        <br>
        -&nbsp;&nbsp;&nbsp; plugin_conf = config.get_plugin_config(name)
        <br>
        +&nbsp;&nbsp;&nbsp; plugin_conf = plugin_paths(name).conf_file
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not os.path.exists(plugin_conf):
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cherrypy.log.error_log.error("Plugin configuration
        file %s"
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " doesn't exist." %
        plugin_conf)
        <br>
        @@ -62,7 +62,7 @@ def _load_plugin_conf(name):
        <br>
        <br>
        <br>
        &nbsp; def get_enabled_plugins():
        <br>
        -&nbsp;&nbsp;&nbsp; plugin_dir = config.get_plugins_dir()
        <br>
        +&nbsp;&nbsp;&nbsp; plugin_dir = paths.plugins_dir
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dir_contents = os.listdir(plugin_dir)
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except OSError:
        <br>
        diff --git a/src/kimchid.in b/src/kimchid.in
        <br>
        index 548fa52..eebc017 100644
        <br>
        --- a/src/kimchid.in
        <br>
        +++ b/src/kimchid.in
        <br>
        @@ -30,12 +30,13 @@ sys.path.insert(1, '@pythondir@')
        <br>
        <br>
        &nbsp; import kimchi.server
        <br>
        &nbsp; import kimchi.config
        <br>
        -if kimchi.config.without_installation():
        <br>
        -&nbsp;&nbsp;&nbsp; sys.path.append(kimchi.config.get_prefix())
        <br>
        <br>
        -from kimchi.config import config
        <br>
        +from kimchi.config import config, paths
        <br>
        &nbsp; from optparse import OptionParser
        <br>
        <br>
        +if not paths.installed:
        <br>
        +&nbsp;&nbsp;&nbsp; sys.path.append(paths.prefix)
        <br>
        +
        <br>
        &nbsp; ACCESS_LOG = "kimchi-access.log"
        <br>
        &nbsp; ERROR_LOG = "kimchi-error.log"
        <br>
        <br>
        diff --git a/tests/test_plugin.py b/tests/test_plugin.py
        <br>
        index 42c87a9..e5c9053 100644
        <br>
        --- a/tests/test_plugin.py
        <br>
        +++ b/tests/test_plugin.py
        <br>
        @@ -32,7 +32,7 @@ from functools import partial
        <br>
        &nbsp; import kimchi.mockmodel
        <br>
        &nbsp; import kimchi.server
        <br>
        &nbsp; import utils
        <br>
        -from kimchi import config
        <br>
        +from kimchi.config import paths
        <br>
        <br>
        <br>
        &nbsp; test_server = None
        <br>
        @@ -48,7 +48,7 @@ def setUpModule():
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; host = '127.0.0.1'
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; port = utils.get_free_port('http')
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ssl_port = None
        <br>
        -&nbsp;&nbsp;&nbsp; sys.path.append(config.get_prefix())
        <br>
        +&nbsp;&nbsp;&nbsp; sys.path.append(paths.prefix)
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test_server = utils.run_server(host, port, ssl_port,
        test_mode=True,
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; model=model)
        <br>
        <br>
      </blockquote>
      <br>
    </blockquote>
    <br>
  </body>
</html>